diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 000000000..4b5889d81
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,20 @@
+module.exports = {
+ "env": {
+ "browser": true,
+ "es2021": true
+ },
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended"
+ ],
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaVersion": "latest",
+ "sourceType": "module"
+ },
+ "plugins": [
+ "@typescript-eslint"
+ ],
+ "rules": {
+ }
+}
diff --git a/.firebaserc b/.firebaserc
index ef6307678..d0f1bd003 100644
--- a/.firebaserc
+++ b/.firebaserc
@@ -1,5 +1,5 @@
{
"projects": {
- "default": "fireship-app"
+ "default": "fireship-dev-17429"
}
-}
\ No newline at end of file
+}
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index cda556e4d..111e3ebba 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,33 +1,31 @@
-# name: Deploy to Firebase Hosting
+name: Deploy to Firebase Hosting
-# on:
-# push:
-# branches:
-# - master
+on:
+ push:
+ branches:
+ - master
-# env:
-# FIREBASE_TOKEN: ${{secrets.FIREBASE_TOKEN}}
-# ALGOLIA_APP_ID: 05VYZFXKNM
-# ALGOLIA_ADMIN_KEY: ${{secrets.ALGOLIA_ADMIN_KEY}}
-# ALGOLIA_INDEX_NAME: content
-# ALGOLIA_INDEX_FILE: public/algolia.json
+env:
+ FIREBASE_TOKEN: ${{secrets.FIREBASE_TOKEN}}
+ ALGOLIA_APP_ID: 05VYZFXKNM
+ ALGOLIA_ADMIN_KEY: ${{secrets.ALGOLIA_ADMIN_KEY}}
+ ALGOLIA_INDEX_NAME: content
+ ALGOLIA_INDEX_FILE: public/algolia.json
-# jobs:
-# build:
-# runs-on: ubuntu-latest
-# steps:
-# - uses: actions/checkout@v2
-# - uses: actions/setup-node@v1
-# with:
-# node-version: 16
-# - uses: peaceiris/actions-hugo@v2
-# with:
-# hugo-version: '0.101.0'
-# extended: true
-# - run: npm ci
-# - run: npm ci
-# working-directory: ./components
-# - run: npm run build
-# - run: npm run algolia
-# - run: npm run deploy
\ No newline at end of file
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 16
+ - uses: peaceiris/actions-hugo@v2
+ with:
+ hugo-version: '0.101.0'
+ extended: true
+ - run: npm ci
+ - run: npm run build
+ - run: npm run algolia
+ - run: npm run deploy
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index ad082a4a4..4fdc551f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,60 +1,33 @@
-# dependencies
-**/node_modules
-/.well_known
-
-/archive
-
-# e2e
-**/e2e/*.js
-**/e2e/*.map
-
-# compiled output
-**/dist
-**/tmp
-**/out-tsc
-.firebase
-public
-
-# cloud functions
-/functions/service-account.json
-/functions/lib
-/functions/etc
-functions/.env
-/functions/.runtimeconfig.json
-/functions/firebase-debug.log
-
-# hugo
-hugo/data/components.json
-hugo/data/webpack_assets.json
-hugo/static/components
-hugo/static/design
-
-# IDEs and editors
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
.idea
-.project
-.classpath
-.c9
-.settings
-.vscode
-*.launch
-*.sublime-workspace
-
-# misc
-.env
-.sass-cache
-NOTES.md
-ROADMAP.md
-secrets.json
-connect.lock
-resources
-archive
-coverage
-typings
-libpeerconnection.log
-npm-debug.log
-yarn-error.log
-testem.log
-
-# system files
.DS_Store
-Thumbs.db
\ No newline at end of file
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+.hugo_build.lock
+static/svelte/
+public
+.firebaserc
+firebase.json
+.firebase
+resources/
+data/svelte.json
+.env
\ No newline at end of file
diff --git a/README.md b/README.md
index a344a4c7c..fd8d6c896 100644
--- a/README.md
+++ b/README.md
@@ -1,82 +1,55 @@
-# [Fireship.io](https://fireship.io/)
-
-Content [designed](https://fireship.io/mission/) to increase developer happiness 😁 and productivity 🚀.
-
-## Project Tour
-
-The monorepo is organized into five sub-projects:
-
-1. `hugo` - Static Site Generator. This is where the content lives.
-2. `design` - Theme & CSS
-3. `components` - Angular Elements Web Components. [Flamethrower](https://github.com/fireship-io/flamethrower) is used for fast page transitions
-4. `functions` - Firebase Cloud Functions Serverless Backend
-5. `cypress` - End-to-End & Integration Specs
-
+## Fireship 2.0
+The [Fireship PRO](https://fireship.io) course platform frontend built with Svelte, Tailwind, Hugo, Firebase, & Flamethrower.
## Contributing
-Edit and fix the site's content in `hugo/content/`. Feel free to submit PRs for small issues. For large issues or features, open an issue first.
-
-### Option 1 - Simple Typo Fixes
-
-For small issues, like a typo or broken link, use Github's inline file editor or web editor (open by pressing . in your fork's code tab) to make the fix and submit a pull request.
-
-### Option 2 - Work on your own Fork
+All static content is managed with Hugo. You can easily fix typos by modifying the markdown directly in GitHub.
-For more complex contributions, like guest posts and new features, you should work on the project on your local system.
+### How to Run it
-First, fork this repo on GitHub.
+First, install [Hugo Extended](https://gohugo.io/getting-started/installing/) ver `0.101.0` or greater.
-```shell
-git clone
+```
+git clone
npm install
-npm run dev
-
-git checkout -b my-fix
-# fix some code...
-
-git commit -m "fix: corrected a typo"
-git push origin my-fix
+npm start
```
-Lastly, open a pull request on GitHub. Once merged, your changes will automatically be deployed to the live site via the CI/CD pipeline.
+Check it on on `http://localhost:6969/`.
-## Running the Site
+## Developing Components
-First, install [Hugo](https://gohugo.io/getting-started/installing/).
+Create a Svelte file in the `app/components` directory. It must have a custom element tag.
-```shell
-git clone
+```svelte
+
-npm install
+
-npm run dev
+
Hi Mom! {greeting}
```
-Visit `localhost:1313` and you should be live. You do not need the web components for general content development, but they can be built with:
+Export the component from `app/main.ts`:
-```shell
-cd components && npm install
-npm run build
+```ts
+export * from './components/hi-mom.svelte';
```
+Now use it in anywhere in your HTML or Markdown.
-## Contribute a Post
-
-Read the [style guide](https://fireship.io/style-guide/) for some tips before contributing.
-
-```shell
-cd hugo
-hugo new -k bundle lessons/angularfire-google-oauth
-hugo new snippets/my-cool-snippet.md
+```html
+
```
-### Add Your Bio
-
-First time? Add your bio and social links to `content/contributors`.
+**Note:** A weird caveat with Svelte web components is that all styles must be encapsulated. You can use Tailwind, BUT only with `@apply` in the component. Global styles will not work.
-## Web Component Development
+## Commands
-Interactive features are built with Angular Elements web components in `components/`.
+- `npm start`: Main dev server. Runs everything you need.
+- `npm run dev`: Runs components in isolation. Serves `app/index.html` as a playground for components.
+- `npm run hugo`: Only runs static site.
+- `npm run build`: Build for production
diff --git a/app/components/global-data.svelte b/app/components/global-data.svelte
new file mode 100644
index 000000000..673f74297
--- /dev/null
+++ b/app/components/global-data.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/app/components/payments/buy-course.svelte b/app/components/payments/buy-course.svelte
new file mode 100644
index 000000000..6918d801e
--- /dev/null
+++ b/app/components/payments/buy-course.svelte
@@ -0,0 +1,48 @@
+
+
+
+
+ {#if $currentCourse?.price}
+
+ {#if loading}{/if}
+ { loading ? 'loading...' : 'buy this course' }
+
+ for ${$currentCourse?.amount}.
+
+ {:else}
+ Course not available for single purchase
+ {/if}
+
+
+
+ {#if url}
+ Open Checkout Page
+ {/if}
+
+
+
\ No newline at end of file
diff --git a/app/components/payments/buy-lifetime.svelte b/app/components/payments/buy-lifetime.svelte
new file mode 100644
index 000000000..bd52bd696
--- /dev/null
+++ b/app/components/payments/buy-lifetime.svelte
@@ -0,0 +1,99 @@
+
+
+
+
+{#if enterprise}
+
\ No newline at end of file
diff --git a/components/src/app/users/user-profile/user-profile.component.ts b/components/src/app/users/user-profile/user-profile.component.ts
deleted file mode 100644
index d34df7f1c..000000000
--- a/components/src/app/users/user-profile/user-profile.component.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Component, Input } from '@angular/core';
-
-@Component({
- templateUrl: './user-profile.component.html'
-})
-export class UserProfileComponent {
-
- @Input() uid;
- @Input() photoURL;
- @Input() displayName;
-
-}
diff --git a/components/src/browserslist b/components/src/browserslist
deleted file mode 100644
index 37371cb04..000000000
--- a/components/src/browserslist
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
-# For additional information regarding the format and rule options, please see:
-# https://github.com/browserslist/browserslist#queries
-#
-# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed
-
-> 0.5%
-last 2 versions
-Firefox ESR
-not dead
-not IE 9-11
\ No newline at end of file
diff --git a/components/src/environments/environment.prod.ts b/components/src/environments/environment.prod.ts
deleted file mode 100644
index 07219a017..000000000
--- a/components/src/environments/environment.prod.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export const environment = {
- production: true,
- firebase: {
- // apiKey: 'AIzaSyAesSTpq6RdhSGqqh3BNcJErodzk1ePzps',
- // authDomain: 'fireship-dev-17429.firebaseapp.com',
- // databaseURL: 'https://fireship-dev-17429.firebaseio.com',
- // projectId: 'fireship-dev-17429',
- // storageBucket: 'fireship-dev-17429.appspot.com',
- // messagingSenderId: '307044372590',
- // appId: '1:307044372590:web:1acc71e3f0c7bfbef2967f',
- // measurementId: 'G-test'
- apiKey: 'AIzaSyBns4UUCKIfb_3xOesTSezA9GbEyuIU7XA',
- authDomain: 'fireship-app.firebaseapp.com',
- databaseURL: 'https://fireship-app.firebaseio.com',
- projectId: 'fireship-app',
- storageBucket: 'fireship-app.appspot.com',
- messagingSenderId: '176605045081',
- appId: '1:176605045081:web:d87a63bd943e3032',
- measurementId: 'G-VTJV5CVC6K'
- },
- // stripe: 'pk_test_m3a5moXVKgThpdfwzKILvnbG'
- stripe: 'pk_live_qSaGVmF1x4X3vIWZmpbgceNU'
-};
diff --git a/components/src/environments/environment.ts b/components/src/environments/environment.ts
deleted file mode 100644
index a344e8db9..000000000
--- a/components/src/environments/environment.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-// This file can be replaced during build by using the `fileReplacements` array.
-// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
-// The list of file replacements can be found in `angular.json`.
-
-export const environment = {
- production: false,
- firebase: {
- apiKey: 'AIzaSyBns4UUCKIfb_3xOesTSezA9GbEyuIU7XA',
- authDomain: 'fireship-app.firebaseapp.com',
- databaseURL: 'https://fireship-app.firebaseio.com',
- projectId: 'fireship-app',
- storageBucket: 'fireship-app.appspot.com',
- messagingSenderId: '176605045081',
- appId: '1:176605045081:web:d87a63bd943e3032',
- measurementId: 'G-VTJV5CVC6K'
- },
- // stripe: 'pk_test_m3a5moXVKgThpdfwzKILvnbG'
- stripe: 'pk_live_qSaGVmF1x4X3vIWZmpbgceNU'
-};
-
-/*
- * For easier debugging in development mode, you can import the following file
- * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
- *
- * This import should be commented out in production mode because it will have a negative impact
- * on performance if an error is thrown.
- */
-// import 'zone.js/dist/zone-error'; // Included with Angular CLI.
diff --git a/components/src/index.html b/components/src/index.html
deleted file mode 100644
index 72b7db90e..000000000
--- a/components/src/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- Components
-
-
-
-
-
-
-
-
-
diff --git a/components/src/karma.conf.js b/components/src/karma.conf.js
deleted file mode 100644
index ee9caa152..000000000
--- a/components/src/karma.conf.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Karma configuration file, see link for more information
-// https://karma-runner.github.io/1.0/config/configuration-file.html
-
-module.exports = function (config) {
- config.set({
- basePath: '',
- frameworks: ['jasmine', '@angular-devkit/build-angular'],
- plugins: [
- require('karma-jasmine'),
- require('karma-chrome-launcher'),
- require('karma-jasmine-html-reporter'),
- require('karma-coverage-istanbul-reporter'),
- require('@angular-devkit/build-angular/plugins/karma')
- ],
- client: {
- clearContext: false // leave Jasmine Spec Runner output visible in browser
- },
- coverageIstanbulReporter: {
- dir: require('path').join(__dirname, '../coverage'),
- reports: ['html', 'lcovonly', 'text-summary'],
- fixWebpackSourcePaths: true
- },
- reporters: ['progress', 'kjhtml'],
- port: 9876,
- colors: true,
- logLevel: config.LOG_INFO,
- autoWatch: true,
- browsers: ['Chrome'],
- singleRun: false
- });
-};
\ No newline at end of file
diff --git a/components/src/main.ts b/components/src/main.ts
deleted file mode 100644
index 1a62bfe32..000000000
--- a/components/src/main.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { enableProdMode } from '@angular/core';
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
-
-import { AppModule } from './app/app.module';
-import { environment } from './environments/environment';
-
-if (environment.production) {
- enableProdMode();
-}
-
-import { initializeApp } from 'firebase/app';
-const app = initializeApp(environment.firebase);
-
-import { initializeAnalytics } from 'firebase/analytics';
-initializeAnalytics(app)
-
-import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-check';
-const appCheck = initializeAppCheck(app, {
- provider: new ReCaptchaV3Provider('6LeswQAeAAAAAJEcDr64c4HiAaHPRYu4mFTqqJdc'),
- isTokenAutoRefreshEnabled: true
-});
-
-// import * as firebase from 'firebase/app';
-// import 'firebase/compat/auth';
-// import 'firebase/compat/firestore';
-// import 'firebase/compat/functions';
-// import 'firebase/compat/performance';
-// import 'firebase/compat/analytics';
-// firebase.initializeApp(environment.firebase);
-// firebase.performance();
-
-
-
-platformBrowserDynamic().bootstrapModule(AppModule, { ngZone: 'noop'})
- .catch(err => console.error(err));
diff --git a/components/src/polyfills.ts b/components/src/polyfills.ts
deleted file mode 100644
index 01fd48f4c..000000000
--- a/components/src/polyfills.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-(window as any).process = {
- env: { DEBUG: undefined },
- };
-
-import '@webcomponents/custom-elements/src/native-shim';
-import '@webcomponents/custom-elements/custom-elements.min';
-
-
-/**
- * This file includes polyfills needed by Angular and is loaded before the app.
- * You can add your own extra polyfills to this file.
- *
- * This file is divided into 2 sections:
- * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
- * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
- * file.
- *
- * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
- * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
- * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
- *
- * Learn more in https://angular.io/guide/browser-support
- */
-
-/***************************************************************************************************
- * BROWSER POLYFILLS
- */
-
-/** IE9, IE10 and IE11 requires all of the following polyfills. **/
-// import 'core-js/es6/symbol';
-// import 'core-js/es6/object';
-// import 'core-js/es6/function';
-// import 'core-js/es6/parse-int';
-// import 'core-js/es6/parse-float';
-// import 'core-js/es6/number';
-// import 'core-js/es6/math';
-// import 'core-js/es6/string';
-// import 'core-js/es6/date';
-// import 'core-js/es6/array';
-// import 'core-js/es6/regexp';
-// import 'core-js/es6/map';
-// import 'core-js/es6/weak-map';
-// import 'core-js/es6/set';
-
-/**
- * If the application will be indexed by Google Search, the following is required.
- * Googlebot uses a renderer based on Chrome 41.
- * https://developers.google.com/search/docs/guides/rendering
- **/
-// import 'core-js/es6/array';
-
-/** IE10 and IE11 requires the following for NgClass support on SVG elements */
-// import 'classlist.js'; // Run `npm install --save classlist.js`.
-
-/** IE10 and IE11 requires the following for the Reflect API. */
-// import 'core-js/es6/reflect';
-
-/**
- * Web Animations `@angular/platform-browser/animations`
- * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
- * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
- **/
-// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
-
-/**
- * By default, zone.js will patch all possible macroTask and DomEvents
- * user can disable parts of macroTask/DomEvents patch by setting following flags
- */
-
- // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
- // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
- // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
-
- /*
- * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
- * with the following flag, it will bypass `zone.js` patch for IE/Edge
- */
-// (window as any).__Zone_enable_cross_context_check = true;
-
-/***************************************************************************************************
- * Zone JS is required by default for Angular itself.
- */
-// import 'zone.js/dist/zone'; // Included with Angular CLI./
-
-
-/***************************************************************************************************
- * APPLICATION IMPORTS
- */
diff --git a/components/src/styles.scss b/components/src/styles.scss
deleted file mode 100644
index 90d4ee007..000000000
--- a/components/src/styles.scss
+++ /dev/null
@@ -1 +0,0 @@
-/* You can add global styles to this file, and also import other style files */
diff --git a/components/src/test.ts b/components/src/test.ts
deleted file mode 100644
index 16317897b..000000000
--- a/components/src/test.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-// This file is required by karma.conf.js and loads recursively all the .spec and framework files
-
-import 'zone.js/dist/zone-testing';
-import { getTestBed } from '@angular/core/testing';
-import {
- BrowserDynamicTestingModule,
- platformBrowserDynamicTesting
-} from '@angular/platform-browser-dynamic/testing';
-
-declare const require: any;
-
-// First, initialize the Angular testing environment.
-getTestBed().initTestEnvironment(
- BrowserDynamicTestingModule,
- platformBrowserDynamicTesting()
-);
-// Then we find all the tests.
-const context = require.context('./', true, /\.spec\.ts$/);
-// And load the modules.
-context.keys().map(context);
diff --git a/components/src/tsconfig.app.json b/components/src/tsconfig.app.json
deleted file mode 100644
index 190fd300b..000000000
--- a/components/src/tsconfig.app.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": "../tsconfig.json",
- "compilerOptions": {
- "outDir": "../out-tsc/app",
- "types": []
- },
- "exclude": [
- "test.ts",
- "**/*.spec.ts"
- ]
-}
diff --git a/components/src/tsconfig.spec.json b/components/src/tsconfig.spec.json
deleted file mode 100644
index de7733630..000000000
--- a/components/src/tsconfig.spec.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "extends": "../tsconfig.json",
- "compilerOptions": {
- "outDir": "../out-tsc/spec",
- "types": [
- "jasmine",
- "node"
- ]
- },
- "files": [
- "test.ts",
- "polyfills.ts"
- ],
- "include": [
- "**/*.spec.ts",
- "**/*.d.ts"
- ]
-}
diff --git a/components/src/tslint.json b/components/src/tslint.json
deleted file mode 100644
index 52e2c1a5a..000000000
--- a/components/src/tslint.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "extends": "../tslint.json",
- "rules": {
- "directive-selector": [
- true,
- "attribute",
- "app",
- "camelCase"
- ],
- "component-selector": [
- true,
- "element",
- "app",
- "kebab-case"
- ]
- }
-}
diff --git a/components/tsconfig.json b/components/tsconfig.json
deleted file mode 100644
index b271fd9f3..000000000
--- a/components/tsconfig.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "compileOnSave": false,
- "compilerOptions": {
- "baseUrl": "./",
- "outDir": "./dist/out-tsc",
- "sourceMap": true,
- "declaration": false,
- "module": "es2015",
- "moduleResolution": "node",
- "emitDecoratorMetadata": true,
- "experimentalDecorators": true,
- "importHelpers": true,
- "target": "es5",
- "typeRoots": [
- "node_modules/@types"
- ],
- "lib": [
- "es2018",
- "dom"
- ]
- }
-}
diff --git a/components/tslint.json b/components/tslint.json
deleted file mode 100644
index 005f954ea..000000000
--- a/components/tslint.json
+++ /dev/null
@@ -1,123 +0,0 @@
-{
- "rulesDirectory": [
- "node_modules/codelyzer"
- ],
- "rules": {
- "arrow-return-shorthand": true,
- "callable-types": true,
- "class-name": true,
- "comment-format": [
- true,
- "check-space"
- ],
- "curly": true,
- "deprecation": {
- "severity": "warn"
- },
- "eofline": true,
- "forin": false,
- "import-blacklist": [
- true,
- "rxjs/Rx"
- ],
- "import-spacing": true,
- "indent": [
- true,
- "spaces"
- ],
- "interface-over-type-literal": true,
- "label-position": true,
- "member-access": false,
- "member-ordering": [
- true,
- {
- "order": [
- "static-field",
- "instance-field",
- "static-method",
- "instance-method"
- ]
- }
- ],
- "no-arg": true,
- "no-bitwise": true,
- "no-console": [
- true,
- "debug",
- "info",
- "time",
- "timeEnd",
- "trace"
- ],
- "no-construct": true,
- "no-debugger": true,
- "no-duplicate-super": true,
- "no-empty": false,
- "no-empty-interface": true,
- "no-eval": true,
- "no-inferrable-types": [
- true,
- "ignore-params"
- ],
- "no-misused-new": true,
- "no-non-null-assertion": true,
- "no-redundant-jsdoc": true,
- "no-shadowed-variable": true,
- "no-string-literal": false,
- "no-string-throw": true,
- "no-switch-case-fall-through": true,
- "no-trailing-whitespace": true,
- "no-unnecessary-initializer": true,
- "no-unused-expression": true,
- "no-var-keyword": true,
- "object-literal-sort-keys": false,
- "one-line": [
- false,
- "check-open-brace",
- "check-catch",
- "check-else",
- "check-whitespace"
- ],
- "prefer-const": true,
- "quotemark": [
- true,
- "single"
- ],
- "radix": true,
- "semicolon": [
- true,
- "always"
- ],
- "triple-equals": [
- true,
- "allow-null-check"
- ],
- "typedef-whitespace": [
- true,
- {
- "call-signature": "nospace",
- "index-signature": "nospace",
- "parameter": "nospace",
- "property-declaration": "nospace",
- "variable-declaration": "nospace"
- }
- ],
- "unified-signatures": true,
- "variable-name": false,
- "whitespace": [
- true,
- "check-branch",
- "check-decl",
- "check-operator",
- "check-separator",
- "check-type"
- ],
- "no-output-on-prefix": true,
- "no-input-rename": true,
- "no-output-rename": true,
- "use-life-cycle-interface": true,
- "use-pipe-transform-interface": true,
- "component-class-suffix": true,
- "directive-class-suffix": true
- }
-}
diff --git a/config.toml b/config.toml
new file mode 100644
index 000000000..a20de746d
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,39 @@
+baseURL = 'https://fireship.io/'
+languageCode = 'en-us'
+title = 'Fireship - Learn to Code Faster'
+enableRobotsTXT = true
+
+[outputs]
+home = ["HTML", "RSS", "Algolia"]
+
+[outputFormats.Algolia]
+baseName = "algolia"
+isPlainText = true
+mediaType = "application/json"
+notAlternative = true
+
+[params]
+mainSections = ["lessons", "snippets"]
+
+[params.algolia]
+vars = ["title", "description", "summary", "date", "publishdate", "lastmod", "permalink"]
+params = ["tags"]
+
+[markup.goldmark.renderer]
+unsafe= true
+
+[markup]
+ [markup.highlight]
+ anchorLineNos = false
+ codeFences = true
+ guessSyntax = false
+ hl_Lines = ''
+ hl_inline = false
+ lineAnchors = ''
+ lineNoStart = 1
+ lineNos = false
+ lineNumbersInTable = true
+ noClasses = false
+ noHl = false
+ style = 'monokai'
+ tabWidth = 4
\ No newline at end of file
diff --git a/content/about.md b/content/about.md
new file mode 100644
index 000000000..56281bf3b
--- /dev/null
+++ b/content/about.md
@@ -0,0 +1,72 @@
+---
+title: "About Page"
+date: 2022-07-09T10:15:38-07:00
+---
+
+[dashboard](/dashboard/?autoplay=true)
+
+
+
+
+
+
+
+
Modal Dialog
+
This is a modal dialog.
+
+
+# About Page
+
+Look, I used a web component in markdown
+
+
+
+# Malum in molle fibula
+
+## Sati naribus agant
+
+Lorem markdownum Clytii per vos quod montibus conantur Saturnia, in quae.
+Quaecumque *fortiter tegumenque* exierant sed: ore [fecit neu
+Ne](http://www.hanc-pelagi.net/refert-receperat) constitit ferre, nec positus
+grani. Prorae subiectis aliis penna relinquit atque volucrem umerumque tertius
+duro victorque superamur illi haec montibus ripae dextraque insula ante super.
+Felicia nare; at necem Hectora circuit, non ara bis, pectore ausa fertur? Di
+ausa pugnatum, ita, calido oculos moderamina haec: cum aut ferebat esse;
+speciem?
+
+## Hos urbem gramina fugante praesagaque procubuere nomine
+
+Pro sunt diuturnior: frena [Autonoeius](http://sepulchro.io/arma.aspx) templo
+hinnitibus o **dixit imperium exhibuit** o non pia mihi litus. Undas **ponti
+magni** quam **propior** postera litore fugiuntque nec Seditioque edidit?
+Grandia Hector fallit. Minos sequi parentis redemit nymphae *eripuit caecae*,
+quippe et. Maiorem conviva, sic volentem quod *latentem*.
+
+## Quas tempore
+
+Dicebat de trahens imitante, fugisse me cupido fine illic vellet! Lacerata
+fractus condebat pulmonis, et inpulsum moenibus, hoc herbas, pascitur, et. Quae
+nullum recumbere visa ictu exsiluere referente **summa gratamque**! Ibi Ceyx
+molimine populi ut undas mortalia comitem multorumque columbam viso, **in** illo
+terreat. Aut tuum Veneri Nonacrina succiso et, iuvabat geminam.
+
+Nunc femina templa blanditus obnoxia, aureus tot cadat figentem morientem.
+Longius arvo studii, in meliore arida superest est, et.
+
+## De acciperet vestes iamque diffudit ferar positoque
+
+Fumabant fluctus queat sequeretur exigit, spectansque ducentem evincitque
+aberant cvrrvs. Fuit est poteratque pignus ostendere bellare aequore insania,
+est vobis? Saevique auro properas Venus?
+
+Flos nisi laudis humum, puerilibus postquam cura: ignem et magna, guttas. Te
+sunt boves mollito pia truncum esse, paludosa lactantia, omni.
+
+## Creaverat adhaerent enim servata laceri armentis gaudia
+
+Aequi me parens intravit lacertis exitium *fabula*, tibi eburno! Devolvunt
+perdidit deprendit eris paterque ac habet [cadit
+deprendere](http://patrium-inter.io/adnuit.html) vocavit et litoris tenentem
+velata ut maiorque: et. Exercet soporem et dedit nota reluctanti omnibus ventris
+fatum heu procumbere magno! Vestros esse. Repertum *in exspatiemur* in mihi
+occupat partique silvas.
diff --git a/hugo/content/contributors/alex-guja.md b/content/contributors/alex-guja.md
similarity index 100%
rename from hugo/content/contributors/alex-guja.md
rename to content/contributors/alex-guja.md
diff --git a/hugo/content/contributors/arjun-yelamanchili.md b/content/contributors/arjun-yelamanchili.md
similarity index 100%
rename from hugo/content/contributors/arjun-yelamanchili.md
rename to content/contributors/arjun-yelamanchili.md
diff --git a/hugo/content/contributors/darshan-gowda.md b/content/contributors/darshan-gowda.md
similarity index 100%
rename from hugo/content/contributors/darshan-gowda.md
rename to content/contributors/darshan-gowda.md
diff --git a/hugo/content/contributors/david-bautista.md b/content/contributors/david-bautista.md
similarity index 100%
rename from hugo/content/contributors/david-bautista.md
rename to content/contributors/david-bautista.md
diff --git a/hugo/content/contributors/dominik-simonik.md b/content/contributors/dominik-simonik.md
similarity index 100%
rename from hugo/content/contributors/dominik-simonik.md
rename to content/contributors/dominik-simonik.md
diff --git a/hugo/content/contributors/finn-krestel.md b/content/contributors/finn-krestel.md
similarity index 100%
rename from hugo/content/contributors/finn-krestel.md
rename to content/contributors/finn-krestel.md
diff --git a/content/contributors/img/alex-guja.webp b/content/contributors/img/alex-guja.webp
new file mode 100644
index 000000000..f1de15f56
Binary files /dev/null and b/content/contributors/img/alex-guja.webp differ
diff --git a/content/contributors/img/arjun-yelamanchili.webp b/content/contributors/img/arjun-yelamanchili.webp
new file mode 100644
index 000000000..d80c390ed
Binary files /dev/null and b/content/contributors/img/arjun-yelamanchili.webp differ
diff --git a/content/contributors/img/darshan-gowda.webp b/content/contributors/img/darshan-gowda.webp
new file mode 100644
index 000000000..aa7d835bd
Binary files /dev/null and b/content/contributors/img/darshan-gowda.webp differ
diff --git a/content/contributors/img/david-bautista.webp b/content/contributors/img/david-bautista.webp
new file mode 100644
index 000000000..3e89b23eb
Binary files /dev/null and b/content/contributors/img/david-bautista.webp differ
diff --git a/content/contributors/img/dominik-simonik.webp b/content/contributors/img/dominik-simonik.webp
new file mode 100644
index 000000000..7f0df6f33
Binary files /dev/null and b/content/contributors/img/dominik-simonik.webp differ
diff --git a/content/contributors/img/finn-krestel.webp b/content/contributors/img/finn-krestel.webp
new file mode 100644
index 000000000..4c9495399
Binary files /dev/null and b/content/contributors/img/finn-krestel.webp differ
diff --git a/content/contributors/img/jarrett-helton.webp b/content/contributors/img/jarrett-helton.webp
new file mode 100644
index 000000000..420383e1d
Binary files /dev/null and b/content/contributors/img/jarrett-helton.webp differ
diff --git a/content/contributors/img/jeff-delaney.png b/content/contributors/img/jeff-delaney.png
new file mode 100644
index 000000000..8c9719e84
Binary files /dev/null and b/content/contributors/img/jeff-delaney.png differ
diff --git a/content/contributors/img/jeff-delaney.webp b/content/contributors/img/jeff-delaney.webp
new file mode 100644
index 000000000..66b9f592e
Binary files /dev/null and b/content/contributors/img/jeff-delaney.webp differ
diff --git a/content/contributors/img/jeroen-ouwehand.webp b/content/contributors/img/jeroen-ouwehand.webp
new file mode 100644
index 000000000..7d4ba6994
Binary files /dev/null and b/content/contributors/img/jeroen-ouwehand.webp differ
diff --git a/content/contributors/img/johan-walhout.webp b/content/contributors/img/johan-walhout.webp
new file mode 100644
index 000000000..03b33d2b9
Binary files /dev/null and b/content/contributors/img/johan-walhout.webp differ
diff --git a/content/contributors/img/jorge-dacosta.webp b/content/contributors/img/jorge-dacosta.webp
new file mode 100644
index 000000000..317d839a1
Binary files /dev/null and b/content/contributors/img/jorge-dacosta.webp differ
diff --git a/content/contributors/img/kyle-leary.webp b/content/contributors/img/kyle-leary.webp
new file mode 100644
index 000000000..7fc5f2a2e
Binary files /dev/null and b/content/contributors/img/kyle-leary.webp differ
diff --git a/content/contributors/img/lenny-cunningham.webp b/content/contributors/img/lenny-cunningham.webp
new file mode 100644
index 000000000..7498b8689
Binary files /dev/null and b/content/contributors/img/lenny-cunningham.webp differ
diff --git a/content/contributors/img/marc-stammerjohann.webp b/content/contributors/img/marc-stammerjohann.webp
new file mode 100644
index 000000000..9cd87658f
Binary files /dev/null and b/content/contributors/img/marc-stammerjohann.webp differ
diff --git a/content/contributors/img/patrick-mullot.webp b/content/contributors/img/patrick-mullot.webp
new file mode 100644
index 000000000..d5038b258
Binary files /dev/null and b/content/contributors/img/patrick-mullot.webp differ
diff --git a/content/contributors/img/radi-cho.webp b/content/contributors/img/radi-cho.webp
new file mode 100644
index 000000000..1469d8f29
Binary files /dev/null and b/content/contributors/img/radi-cho.webp differ
diff --git a/content/contributors/img/sabz.webp b/content/contributors/img/sabz.webp
new file mode 100644
index 000000000..f2e92e1cd
Binary files /dev/null and b/content/contributors/img/sabz.webp differ
diff --git a/content/contributors/img/shawn-eubanks.webp b/content/contributors/img/shawn-eubanks.webp
new file mode 100644
index 000000000..3eadf32b2
Binary files /dev/null and b/content/contributors/img/shawn-eubanks.webp differ
diff --git a/content/contributors/img/weilun.webp b/content/contributors/img/weilun.webp
new file mode 100644
index 000000000..b579300b6
Binary files /dev/null and b/content/contributors/img/weilun.webp differ
diff --git a/content/contributors/img/zack-de-rose.webp b/content/contributors/img/zack-de-rose.webp
new file mode 100644
index 000000000..aec033657
Binary files /dev/null and b/content/contributors/img/zack-de-rose.webp differ
diff --git a/hugo/content/contributors/jarrett-helton.md b/content/contributors/jarrett-helton.md
similarity index 100%
rename from hugo/content/contributors/jarrett-helton.md
rename to content/contributors/jarrett-helton.md
diff --git a/content/contributors/jeff-delaney.md b/content/contributors/jeff-delaney.md
new file mode 100644
index 000000000..df00542a6
--- /dev/null
+++ b/content/contributors/jeff-delaney.md
@@ -0,0 +1,15 @@
+---
+title: Jeff Delaney
+date: 2021-02-27T09:32:30-07:00
+draft: false
+
+links:
+ youtube: https://www.youtube.com/channel/UCsBjURrPoezykLs9EqgamOA
+ linkedin: https://www.linkedin.com/in/jeff-delaney/
+ medium: https://medium.com/@jeffdelaney
+ twitter: https://twitter.com/Jeffdelaney23
+ github: https://github.com/codediodeio
+ portfolio: https://jeffdelaney.me
+---
+
+Jeff Delaney is a Google Developer Expert and the creator of fireship.io. When not writing code, he is out seeking adventure with his wife and 3 boys.
diff --git a/hugo/content/contributors/jeroen.ouwehand.md b/content/contributors/jeroen.ouwehand.md
similarity index 100%
rename from hugo/content/contributors/jeroen.ouwehand.md
rename to content/contributors/jeroen.ouwehand.md
diff --git a/hugo/content/contributors/johan-walhout.md b/content/contributors/johan-walhout.md
similarity index 100%
rename from hugo/content/contributors/johan-walhout.md
rename to content/contributors/johan-walhout.md
diff --git a/hugo/content/contributors/jorge-dacosta.md b/content/contributors/jorge-dacosta.md
similarity index 100%
rename from hugo/content/contributors/jorge-dacosta.md
rename to content/contributors/jorge-dacosta.md
diff --git a/hugo/content/contributors/kyle-leary.md b/content/contributors/kyle-leary.md
similarity index 88%
rename from hugo/content/contributors/kyle-leary.md
rename to content/contributors/kyle-leary.md
index 1bc83f0c3..b218290bd 100644
--- a/hugo/content/contributors/kyle-leary.md
+++ b/content/contributors/kyle-leary.md
@@ -1,8 +1,7 @@
---
-title: Kyle "Klutch" Leary
+title: Kyle Leary
date: 2021-07-08T22:00:30-04:00
draft: false
-featured_img: /img/contributors/klutch.png
links:
youtube: https://www.youtube.com/channel/UCrIC6P1BVbV8w5mYJYBWkvw
diff --git a/hugo/content/contributors/lenny-cunningham.md b/content/contributors/lenny-cunningham.md
similarity index 100%
rename from hugo/content/contributors/lenny-cunningham.md
rename to content/contributors/lenny-cunningham.md
diff --git a/hugo/content/contributors/marc-stammerjohann.md b/content/contributors/marc-stammerjohann.md
similarity index 100%
rename from hugo/content/contributors/marc-stammerjohann.md
rename to content/contributors/marc-stammerjohann.md
diff --git a/hugo/content/contributors/patrick-mullot.md b/content/contributors/patrick-mullot.md
similarity index 88%
rename from hugo/content/contributors/patrick-mullot.md
rename to content/contributors/patrick-mullot.md
index 348b90c3a..cd0bd7de9 100644
--- a/hugo/content/contributors/patrick-mullot.md
+++ b/content/contributors/patrick-mullot.md
@@ -2,7 +2,6 @@
title: Patrick Mullot
date: 2018-06-13 10:22:57
-featured_img: /img/contributors/patrick-mullot.png
links:
linkedin: https://www.linkedin.com/in/patrick-mullot-ba267a2/
diff --git a/hugo/content/contributors/radi-cho.md b/content/contributors/radi-cho.md
similarity index 100%
rename from hugo/content/contributors/radi-cho.md
rename to content/contributors/radi-cho.md
diff --git a/hugo/content/contributors/sabz.md b/content/contributors/sabz.md
similarity index 100%
rename from hugo/content/contributors/sabz.md
rename to content/contributors/sabz.md
diff --git a/hugo/content/contributors/shawn-eubanks.md b/content/contributors/shawn-eubanks.md
similarity index 100%
rename from hugo/content/contributors/shawn-eubanks.md
rename to content/contributors/shawn-eubanks.md
diff --git a/hugo/content/contributors/weilun.md b/content/contributors/weilun.md
similarity index 100%
rename from hugo/content/contributors/weilun.md
rename to content/contributors/weilun.md
diff --git a/hugo/content/contributors/zack-de-rose.md b/content/contributors/zack-de-rose.md
similarity index 91%
rename from hugo/content/contributors/zack-de-rose.md
rename to content/contributors/zack-de-rose.md
index 42e8bdaf4..25555044b 100644
--- a/hugo/content/contributors/zack-de-rose.md
+++ b/content/contributors/zack-de-rose.md
@@ -2,8 +2,6 @@
title: Zack DeRose
date: 2018-06-13 10:22:57
-featured_img: /img/contributors/zack-derose.jpeg
-
links:
github: https://github.com/ZackDeRose
medium: https://medium.com/@zackderose
diff --git a/content/courses/_index.md b/content/courses/_index.md
new file mode 100644
index 000000000..62d87245d
--- /dev/null
+++ b/content/courses/_index.md
@@ -0,0 +1,3 @@
+---
+title: Courses
+---
diff --git a/content/courses/angular/_index.md b/content/courses/angular/_index.md
new file mode 100644
index 000000000..f5b89fe8c
--- /dev/null
+++ b/content/courses/angular/_index.md
@@ -0,0 +1,57 @@
+---
+lastmod: 2019-08-24T10:23:30-09:00
+title: The Angular Firebase Project Course
+description: Build a high-performance PWA with Angular and Firebase from scratch.
+weight: 0
+type: courses
+tags:
+ - pro
+ - angular
+ - firebase
+
+author: Jeff Delaney
+vimeo: 359329279
+stack:
+ - angular
+ - firebase
+ - ts
+---
+
+
+## 🍱 What will I build?
+
+The **Angular Firebase PWA Course** will teach you how to build a complex progressive web app with Angular 12 (ivy), Material Design, and Firebase. It starts from absolute basics and eventually culminates with the deployment of a server-rendered PWA on Google Cloud Run.
+
+You will build a full-stack [Kanban (看板)](https://en.wikipedia.org/wiki/Kanban) storyboard app inspired by Trello. Authenticated users can create, sort, update, and delete boards with all interaction persisted in Firestore.
+
+
+
+
+## 💡 What will I Learn?
+
+- Code organization with feature modules
+- Lazy-loaded routing
+- Usage of common Angular Material components
+- User authentication with Firebase (Google OAuth, Email/Password)
+- Reactive Forms vs Template-driven Forms
+- Drag-and-Drop with the Angular CDK
+- Data modeling and complex writes/queries with Firestore
+- Firestore security rules
+- Angular Universal with Nest.js
+- Prerendering and/or deployment to Google Cloud Run
+
+### 🤔 Is this Course Right for Me?
+
+This course is intermediate level and designed to expose you to real-world challenges when building PWAs with Angular. It assumes you have at least basic knowledge of web programming and basic skills in JavaScript, HTML, and CSS. It is fast-paced and similar to [my style on YouTube](https://www.youtube.com/channel/UCsBjURrPoezykLs9EqgamOA?), but far more in-depth and comprehensive.
+
+## Is this Course Updated?
+
+The last code review and update was completed on **Sep 2nd, 2022** using Angular version `12.0`. The course receives regular updates, especially to address breaking changes in Angular and/or Firebase.
+
+
+### 🏎️ Test Drive
+
+Visit the [Firestarter demo app](https://firestarter.fireship.io/) and install it as a PWA to give it a test drive before you enroll.
+
diff --git a/hugo/content/courses/angular/app-firebase-setup.md b/content/courses/angular/app-firebase-setup.md
similarity index 100%
rename from hugo/content/courses/angular/app-firebase-setup.md
rename to content/courses/angular/app-firebase-setup.md
diff --git a/hugo/content/courses/angular/app-material.md b/content/courses/angular/app-material.md
similarity index 95%
rename from hugo/content/courses/angular/app-material.md
rename to content/courses/angular/app-material.md
index c33dbc6af..9013bd5c9 100644
--- a/hugo/content/courses/angular/app-material.md
+++ b/content/courses/angular/app-material.md
@@ -18,9 +18,9 @@ We're ready to start building the app! It's ideal to kick off any new project wi
- Install [Angular Material](https://material.angular.io/)
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
ng add @angular/material
-{{< /highlight >}}
+```
### Step 2 - Customize your Theme Colors (Optional)
@@ -32,7 +32,7 @@ ng add @angular/material
Example of a custom color pallette.
{{< file "scss" "styles.scss" >}}
-{{< highlight scss >}}
+```scss
$custom-orange: (
50: #fff3e0,
100: #ffe0b2,
@@ -66,7 +66,7 @@ $custom-orange: (
)
);
$firestarter-demo-primary: mat-palette($custom-orange);
-{{< /highlight >}}
+```
### Bonus Video
diff --git a/content/courses/angular/app-primer.md b/content/courses/angular/app-primer.md
new file mode 100644
index 000000000..e7cac1007
--- /dev/null
+++ b/content/courses/angular/app-primer.md
@@ -0,0 +1,22 @@
+---
+title: App Overview
+description: Overview of the organization and architecture of the Firestarter demo app.
+weight: 20
+lastmod: 2019-07-16T10:23:30-09:00
+draft: false
+vimeo: 358695516
+emoji: 💻
+chapter_start: Main App
+video_length: 2:50
+---
+
+Recommended: Clone the [source code](https://github.com/codediodeio/angular-firestarter) as a reference.
+
+## Start a New Project
+
+Start a new project and make sure to use routing and *scss* for styles.
+
+{{< file "terminal" "command line" >}}
+```text
+ng new firestarter
+```
diff --git a/content/courses/angular/app-routing.md b/content/courses/angular/app-routing.md
new file mode 100644
index 000000000..008d4d297
--- /dev/null
+++ b/content/courses/angular/app-routing.md
@@ -0,0 +1,53 @@
+---
+title: Routing
+description: Create a home page configured with the Angular Router.
+weight: 25
+lastmod: 2019-07-16T10:23:30-09:00
+draft: false
+vimeo: 358715861
+emoji: 🏠
+video_length: 2:56
+---
+
+Learn routing basics in Angular and the usage of the `routerLink` directive in templates.
+
+## Steps
+
+### Step 1 - Generate a Component
+
+Generate home page component that is loaded by the router.
+
+{{< file "terminal" "command line" >}}
+```text
+ng g component home-page
+```
+
+### Step 2 - Register it in the Router
+
+{{< file "ngts" "app-routing.module.ts" >}}
+```typescript
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+import { HomePageComponent } from './home-page/home-page.component';
+
+
+const routes: Routes = [
+ { path: '', component: HomePageComponent }
+];
+
+@NgModule({
+ imports: [RouterModule.forRoot(routes)],
+ exports: [RouterModule]
+})
+export class AppRoutingModule { }
+
+```
+
+### Step 3 - Navigate with routerLink
+
+Example of a router link with a special CSS class when active.
+
+{{< file "html" "some.component.html" >}}
+```html
+Home page
+```
\ No newline at end of file
diff --git a/hugo/content/courses/angular/app-schematics.md b/content/courses/angular/app-schematics.md
similarity index 92%
rename from hugo/content/courses/angular/app-schematics.md
rename to content/courses/angular/app-schematics.md
index 10530ccec..3984f6ebf 100644
--- a/hugo/content/courses/angular/app-schematics.md
+++ b/content/courses/angular/app-schematics.md
@@ -14,6 +14,6 @@ Schematics provide sophisticated code blueprints using the Angular CLI, with man
For example, you could replace the component command from the last video with:
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
ng generate @angular/material:nav shared/shell
-{{< /highlight >}}
\ No newline at end of file
+```
\ No newline at end of file
diff --git a/hugo/content/courses/angular/app-shared-module.md b/content/courses/angular/app-shared-module.md
similarity index 93%
rename from hugo/content/courses/angular/app-shared-module.md
rename to content/courses/angular/app-shared-module.md
index f8b3758ab..563d77313 100644
--- a/hugo/content/courses/angular/app-shared-module.md
+++ b/content/courses/angular/app-shared-module.md
@@ -18,14 +18,14 @@ Create a shared module to avoid duplicate imports and exports of common Angular
### Step 1 - Create a Module
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
ng g module shared
-{{< /highlight >}}
+```
Add it to the app module. It will be imported by all features in this app.
{{< file "ngts" "app.module.ts" >}}
-{{< highlight typescript >}}
+```typescript
import { SharedModule } from './shared/shared.module';
@NgModule({
@@ -42,14 +42,14 @@ import { SharedModule } from './shared/shared.module';
bootstrap: [AppComponent]
})
export class AppModule { }
-{{< /highlight >}}
+```
### Step 2 - Consolidate Imports
Avoid duplication by consolidating your imports with the the spread syntax. We will be using the common material modules throughout the course. All Material modules listed below will be used in this app.
{{< file "ngts" "shared.module.ts" >}}
-{{< highlight typescript >}}
+```typescript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@@ -95,11 +95,11 @@ const modules = [
]
})
export class SharedModule {}
-{{< /highlight >}}
+```
### Step 3 - Add a Component
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
ng g component shared/shell --export
-{{< /highlight >}}
+```
diff --git a/hugo/content/courses/angular/app-shell.md b/content/courses/angular/app-shell.md
similarity index 96%
rename from hugo/content/courses/angular/app-shell.md
rename to content/courses/angular/app-shell.md
index 012a86510..c9e4041b4 100644
--- a/hugo/content/courses/angular/app-shell.md
+++ b/content/courses/angular/app-shell.md
@@ -18,20 +18,20 @@ Add a basic navigation shell to the app and make it responsive on mobile.
Nesting components inside each other is known as *transclusion*.
{{< file "html" "app.component.html" >}}
-{{< highlight html >}}
+```html
-{{< /highlight >}}
+```
### Shell Breakpoint Logic
Make your navigation responsive by listening to breakpoints.
{{< file "ngts" "shell.component.ts" >}}
-{{< highlight typescript >}}
+```typescript
import { Component } from '@angular/core';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { Observable } from 'rxjs';
@@ -53,14 +53,14 @@ export class ShellComponent {
constructor(private breakpointObserver: BreakpointObserver) {}
}
-{{< /highlight >}}
+```
### Shell HTML
Full markup for the navigation shell.
{{< file "html" "shell.component.html" >}}
-{{< highlight html >}}
+```html
@@ -123,4 +123,4 @@ Full markup for the navigation shell.
-{{< /highlight >}}
+```
diff --git a/hugo/content/courses/angular/basics-anatomy-of-angular.md b/content/courses/angular/basics-anatomy-of-angular.md
similarity index 100%
rename from hugo/content/courses/angular/basics-anatomy-of-angular.md
rename to content/courses/angular/basics-anatomy-of-angular.md
diff --git a/hugo/content/courses/angular/basics-cli.md b/content/courses/angular/basics-cli.md
similarity index 92%
rename from hugo/content/courses/angular/basics-cli.md
rename to content/courses/angular/basics-cli.md
index af38ae556..0ec1b01bf 100644
--- a/hugo/content/courses/angular/basics-cli.md
+++ b/content/courses/angular/basics-cli.md
@@ -15,7 +15,7 @@ The [Angular CLI](https://angular.io/cli) provides a powerful set of tools that
## Getting Started
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
npm install -g @angular/cli
ng --version
@@ -25,5 +25,5 @@ ng generate component --help
ng new my-app
code my-app
-{{< /highlight >}}
+```
diff --git a/content/courses/angular/basics-components.md b/content/courses/angular/basics-components.md
new file mode 100644
index 000000000..a3f48d47d
--- /dev/null
+++ b/content/courses/angular/basics-components.md
@@ -0,0 +1,29 @@
+---
+title: Components
+description: An introduction to Components, Directives, and Pipes
+weight: 16
+lastmod: 2019-07-16T10:23:30-09:00
+draft: false
+vimeo:
+youtube: 23o0evRtrFI
+emoji: 📦
+free: true
+video_length: 13:51
+---
+
+## Components, Directive, and Pipes
+
+This video below originally appeared at [Angular Components - Ten Basic Concepts](https://angularfirebase.com/lessons/angular-components-basics-top-ten/). It was originally produced for Angular v6, but the core concepts are identical.
+
+
+## Component Composition
+
+Cross-component communication is one of the most useful concepts to master when working component-based UIs. This video below originally appeared as [Sharing Data between Components](https://angularfirebase.com/lessons/sharing-data-between-angular-components-four-methods/) and provides a reference when sharing data between components.
+
+## Bonus Video
+
+
+{{< youtube I317BhehZKM >}}
+
+
+
diff --git a/hugo/content/courses/angular/basics-modules.md b/content/courses/angular/basics-modules.md
similarity index 87%
rename from hugo/content/courses/angular/basics-modules.md
rename to content/courses/angular/basics-modules.md
index ccb116c4a..74ec1be63 100644
--- a/hugo/content/courses/angular/basics-modules.md
+++ b/content/courses/angular/basics-modules.md
@@ -11,14 +11,14 @@ video_length: 2:41
---
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
ng generate module cool
-{{< /highlight >}}
+```
Get comfortable with declarations, imports, and exports.
{{< file "ngts" "some.module.ts" >}}
-{{< highlight typescript >}}
+```typescript
@NgModule({
// Components defined in this module
declarations: [
@@ -33,4 +33,4 @@ Get comfortable with declarations, imports, and exports.
FooComponent
],
})
-{{< /highlight >}}
+```
diff --git a/hugo/content/courses/angular/basics-resources.md b/content/courses/angular/basics-resources.md
similarity index 97%
rename from hugo/content/courses/angular/basics-resources.md
rename to content/courses/angular/basics-resources.md
index 0827b5fa2..cc1cd32e1 100644
--- a/hugo/content/courses/angular/basics-resources.md
+++ b/content/courses/angular/basics-resources.md
@@ -8,6 +8,7 @@ vimeo: 359322932
emoji: 📜
free: true
chapter_start: Intro
+chapter_icon: 📜
video_length: 1:51
---
diff --git a/hugo/content/courses/angular/basics-services.md b/content/courses/angular/basics-services.md
similarity index 80%
rename from hugo/content/courses/angular/basics-services.md
rename to content/courses/angular/basics-services.md
index 326afc0cb..251eae843 100644
--- a/hugo/content/courses/angular/basics-services.md
+++ b/content/courses/angular/basics-services.md
@@ -1,6 +1,6 @@
---
-title: Dependency Injection and Services
-description: What is dependency injection (DI) and why is it so useful?
+title: Dependency Injection
+description: Use dependency injection (DI) to create services
weight: 17
lastmod: 2019-07-16T10:23:30-09:00
draft: false
@@ -14,9 +14,9 @@ video_length: 3:18
## Generate a Service
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
ng g service clock
-{{< /highlight >}}
+```
## Use-Cases for Services
diff --git a/hugo/content/courses/angular/img/featured.jpg b/content/courses/angular/img/featured.jpg
similarity index 100%
rename from hugo/content/courses/angular/img/featured.jpg
rename to content/courses/angular/img/featured.jpg
diff --git a/hugo/content/courses/angular/img/featured.png b/content/courses/angular/img/featured.png
similarity index 100%
rename from hugo/content/courses/angular/img/featured.png
rename to content/courses/angular/img/featured.png
diff --git a/hugo/content/courses/angular/img/featured.webp b/content/courses/angular/img/featured.webp
similarity index 100%
rename from hugo/content/courses/angular/img/featured.webp
rename to content/courses/angular/img/featured.webp
diff --git a/hugo/content/courses/angular/img/shared-module.png b/content/courses/angular/img/shared-module.png
similarity index 100%
rename from hugo/content/courses/angular/img/shared-module.png
rename to content/courses/angular/img/shared-module.png
diff --git a/hugo/content/courses/angular/img/tic-tac-toe-demo.png b/content/courses/angular/img/tic-tac-toe-demo.png
similarity index 100%
rename from hugo/content/courses/angular/img/tic-tac-toe-demo.png
rename to content/courses/angular/img/tic-tac-toe-demo.png
diff --git a/hugo/content/courses/angular/kanban-animation.md b/content/courses/angular/kanban-animation.md
similarity index 94%
rename from hugo/content/courses/angular/kanban-animation.md
rename to content/courses/angular/kanban-animation.md
index 3b2163a54..f30d24f9b 100644
--- a/hugo/content/courses/angular/kanban-animation.md
+++ b/content/courses/angular/kanban-animation.md
@@ -22,7 +22,7 @@ Animate the the CDK Drag & Drop elements using CSS transitions.
### Board List
{{< file "html" "board-list.component.scss" >}}
-{{< highlight html >}}
+```html
.cdk-drag-placeholder {
opacity: 0.2;
width: 350px;
@@ -38,13 +38,13 @@ Animate the the CDK Drag & Drop elements using CSS transitions.
.cdk-drop-list-dragging .cdk-drag {
transition: transform 300ms ease;
}
-{{< /highlight >}}
+```
### Board
{{< file "html" "board.component.scss" >}}
-{{< highlight html >}}
+```html
.cdk-drag-placeholder {
opacity: 0.5;
}
@@ -63,5 +63,5 @@ Animate the the CDK Drag & Drop elements using CSS transitions.
.purple { background: #b15cff; }
.red { background: #e74a4a; }
.gray { background: gray; text-decoration: line-through; }
-{{< /highlight >}}
+```
diff --git a/hugo/content/courses/angular/kanban-database-service.md b/content/courses/angular/kanban-database-service.md
similarity index 98%
rename from hugo/content/courses/angular/kanban-database-service.md
rename to content/courses/angular/kanban-database-service.md
index d4af6dab4..3574d925c 100644
--- a/hugo/content/courses/angular/kanban-database-service.md
+++ b/content/courses/angular/kanban-database-service.md
@@ -14,7 +14,7 @@ Separate all database logic into a dedicated service.
## Database Service
{{< file "ngts" "database.service.ts" >}}
-{{< highlight typescript >}}
+```typescript
import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';
@@ -102,4 +102,4 @@ export class BoardService {
batch.commit();
}
}
-{{< /highlight >}}
+```
diff --git a/hugo/content/courses/angular/kanban-delete-button.md b/content/courses/angular/kanban-delete-button.md
similarity index 88%
rename from hugo/content/courses/angular/kanban-delete-button.md
rename to content/courses/angular/kanban-delete-button.md
index 1f70f8250..0d45fddff 100644
--- a/hugo/content/courses/angular/kanban-delete-button.md
+++ b/content/courses/angular/kanban-delete-button.md
@@ -16,16 +16,16 @@ Create a delete button that confirms the operation before sending the write to t
### Step 1 - Generate the Component
{{< file "terminal" "command line" >}}
-{{< highlight text >}}
+```text
ng g c shared/delete-button
-{{< /highlight >}}
+```
### Step 2 - Delete Button Component
The delete button component is just UI (dumb component), meaning it only emits an event with the user's delete intention. The parent component handles the actual database write.
{{< file "ngts" "delete-button.component.ts" >}}
-{{< highlight typescript >}}
+```typescript
import { Component, Output, EventEmitter } from '@angular/core';
@Component({
@@ -52,10 +52,10 @@ export class DeleteButtonComponent {
}
}
-{{< /highlight >}}
+```
{{< file "html" "delete-button.component.html" >}}
-{{< highlight html >}}
+```html