From 05fed023abb93f89314a1a2fce4f45003f4813bb Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Tue, 22 Nov 2016 10:23:33 -0800 Subject: [PATCH] feat(navbar): Add themepicker component with lazy loaded themes --- .gitignore | 2 + angular-cli.json | 6 +- package.json | 11 ++- src/_app-theme.scss | 2 +- src/app/app-module.ts | 8 +- src/app/material-docs-app.ts | 4 +- .../component-category-list.html | 6 +- .../component-category-list.scss | 20 ++-- .../pages/component-list/component-list.html | 12 +-- .../_component-sidenav-theme.scss | 2 +- .../_component-viewer-theme.scss | 2 +- .../pages/guide-list/_guide-list-theme.scss | 2 +- src/app/pages/guide-viewer/guide-viewer.scss | 2 +- src/app/pages/homepage/_homepage-theme.scss | 2 +- src/app/pages/homepage/homepage.html | 8 +- src/app/pages/homepage/homepage.scss | 2 +- src/app/shared/footer/footer.html | 4 +- src/app/shared/navbar/navbar.html | 10 +- src/app/shared/navbar/navbar.scss | 5 + src/app/shared/shared-module.ts | 19 ++-- src/app/shared/style-manager/index.ts | 1 + .../style-manager/style-manager.spec.ts | 52 +++++++++++ src/app/shared/style-manager/style-manager.ts | 46 ++++++++++ src/app/shared/svg-viewer/svg-builder.spec.ts | 85 +++++++++++++++++ src/app/shared/svg-viewer/svg-builder.ts | 91 +++++++++++++++++++ src/app/shared/svg-viewer/svg-viewer.ts | 72 +++++++++++++++ src/app/shared/theme-chooser/index.ts | 1 + .../shared/theme-chooser/theme-chooser.html | 17 ++++ .../shared/theme-chooser/theme-chooser.scss | 58 ++++++++++++ .../theme-chooser/theme-chooser.spec.ts | 29 ++++++ src/app/shared/theme-chooser/theme-chooser.ts | 65 +++++++++++++ .../theme-storage/theme-storage.spec.ts | 52 +++++++++++ .../theme-storage/theme-storage.ts | 30 ++++++ .../custom-themes/deeppurple-amber.scss | 9 ++ src/assets/custom-themes/indigo-pink.scss | 9 ++ src/assets/custom-themes/pink-bluegrey.scss | 9 ++ src/assets/custom-themes/purple-green.scss | 9 ++ src/assets/img/component-categories/forms.svg | 2 +- .../img/component-categories/modals.svg | 2 +- src/assets/img/components/autocomplete.svg | 2 +- src/assets/img/components/button-toggle.svg | 2 +- src/assets/img/components/checkbox.svg | 2 +- .../img/components/progress-spinner.svg | 2 +- src/assets/img/components/radio.svg | 2 +- src/assets/img/components/select.svg | 2 +- src/assets/img/components/slider.svg | 2 +- src/assets/img/homepage/fastandconsistent.svg | 2 +- src/assets/img/homepage/material_splash.svg | 86 +----------------- src/assets/img/homepage/optimized.svg | 2 +- src/assets/img/homepage/sprintzerotoapp.svg | 2 +- src/assets/img/homepage/versatile.svg | 2 +- src/main.scss | 36 +------- src/styles/_api-theme.scss | 2 +- src/styles/_general.scss | 57 ++++++++++++ src/styles/_markdown-theme.scss | 2 +- src/styles/_tables-theme.scss | 2 +- tools/build-themes.sh | 19 ++++ 57 files changed, 804 insertions(+), 190 deletions(-) create mode 100644 src/app/shared/style-manager/index.ts create mode 100644 src/app/shared/style-manager/style-manager.spec.ts create mode 100644 src/app/shared/style-manager/style-manager.ts create mode 100644 src/app/shared/svg-viewer/svg-builder.spec.ts create mode 100644 src/app/shared/svg-viewer/svg-builder.ts create mode 100644 src/app/shared/svg-viewer/svg-viewer.ts create mode 100644 src/app/shared/theme-chooser/index.ts create mode 100644 src/app/shared/theme-chooser/theme-chooser.html create mode 100644 src/app/shared/theme-chooser/theme-chooser.scss create mode 100644 src/app/shared/theme-chooser/theme-chooser.spec.ts create mode 100644 src/app/shared/theme-chooser/theme-chooser.ts create mode 100644 src/app/shared/theme-chooser/theme-storage/theme-storage.spec.ts create mode 100644 src/app/shared/theme-chooser/theme-storage/theme-storage.ts create mode 100644 src/assets/custom-themes/deeppurple-amber.scss create mode 100644 src/assets/custom-themes/indigo-pink.scss create mode 100644 src/assets/custom-themes/pink-bluegrey.scss create mode 100644 src/assets/custom-themes/purple-green.scss create mode 100644 src/styles/_general.scss create mode 100755 tools/build-themes.sh diff --git a/.gitignore b/.gitignore index 302d77575..0f5104f43 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ /src/assets/documents /src/assets/examples /src/assets/plunker/examples +/src/assets/*.css +/src/assets/*.html # dependencies /node_modules diff --git a/angular-cli.json b/angular-cli.json index ca142e3a8..e4f229734 100644 --- a/angular-cli.json +++ b/angular-cli.json @@ -19,7 +19,11 @@ "mobile": false, "styles": [ "main.scss", - "highlightjs/solarized-light.css" + "highlightjs/solarized-light.css", + {"input": "assets/pink-bluegrey.css", "lazy": true}, + {"input": "assets/deeppurple-amber.css", "lazy": true}, + {"input": "assets/indigo-pink.css", "lazy": true}, + {"input": "assets/purple-green.css", "lazy": true} ], "scripts": [], "environmentSource": "environments/environment.ts", diff --git a/package.json b/package.json index e0401cbcc..cef12aa9b 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,16 @@ "license": "MIT", "angular-cli": {}, "scripts": { - "start": "ng serve", + "start": "npm run build-themes && ng serve", "lint": "tslint \"src/**/*.ts\"", "test": "ng test", "pree2e": "webdriver-manager update", "e2e": "protractor", - "prod-build": "ng build --aot --prod && npm run prerender && cp -r tmp/prerendered/* dist/", + "build-themes": "./tools/build-themes.sh", + "prod-build": "npm run build-themes && ng build --aot --prod && npm run prerender && cp -r tmp/prerendered/* dist/", "postinstall": "webdriver-manager update && tools/fetch-assets.sh", - "publish-prod": "ng build --aot --prod && firebase use material-angular-io && firebase deploy", - "publish-dev": "ng build --aot --prod && firebase use material2-docs-dev && firebase deploy" + "publish-prod": "npm run build-themes && ng build --aot --prod && firebase use material-angular-io && firebase deploy", + "publish-dev": "npm run build-themes && ng build --aot --prod && firebase use material2-docs-dev && firebase deploy" }, "private": true, "dependencies": { @@ -26,6 +27,7 @@ "@angular/platform-browser": "^4.0.0", "@angular/platform-browser-dynamic": "^4.0.0", "@angular/router": "^4.0.0", + "color": "^1.0.3", "core-js": "^2.4.1", "rxjs": "^5.1.0", "zone.js": "^0.8.4" @@ -44,6 +46,7 @@ "karma-jasmine": "^1.1.0", "karma-remap-istanbul": "^0.2.1", "karma-sauce-launcher": "^1.1.0", + "node-sass": "^4.5.3", "protractor": "^5.1.1", "ts-node": "^2.0.0", "tslint": "^4.4.2", diff --git a/src/_app-theme.scss b/src/_app-theme.scss index 46c56bef6..4b5800e80 100644 --- a/src/_app-theme.scss +++ b/src/_app-theme.scss @@ -1,4 +1,4 @@ -@import '~@angular/material/theming'; +@import '../node_modules/@angular/material/theming'; @import './app/pages/homepage/homepage-theme'; @import './app/pages/component-sidenav/component-sidenav-theme'; @import './app/pages/component-viewer/component-viewer-theme'; diff --git a/src/app/app-module.ts b/src/app/app-module.ts index ca16677dc..97cc2e327 100644 --- a/src/app/app-module.ts +++ b/src/app/app-module.ts @@ -20,6 +20,7 @@ import {ComponentSidenav} from './pages/component-sidenav/component-sidenav'; import {Footer} from './shared/footer/footer'; import {ComponentPageTitle} from './pages/page-title/page-title'; import {ComponentPageHeader} from './pages/component-page-header/component-page-header'; +import {StyleManager} from './shared/style-manager/style-manager'; @NgModule({ @@ -33,7 +34,11 @@ import {ComponentPageHeader} from './pages/component-page-header/component-page- GuideList, GuideViewer, Homepage, - Footer + Footer, + ], + exports: [ + MaterialDocsApp, + Homepage, ], imports: [ BrowserModule, @@ -49,6 +54,7 @@ import {ComponentPageHeader} from './pages/component-page-header/component-page- providers: [ Location, ComponentPageTitle, + StyleManager, {provide: LocationStrategy, useClass: PathLocationStrategy}, ], bootstrap: [MaterialDocsApp], diff --git a/src/app/material-docs-app.ts b/src/app/material-docs-app.ts index b109e1acb..dd9fd9b01 100644 --- a/src/app/material-docs-app.ts +++ b/src/app/material-docs-app.ts @@ -15,7 +15,9 @@ export class MaterialDocsApp { isDarkTheme = false; showShadow = false; - constructor(router: Router) { + constructor( + router: Router, + ) { router.events.subscribe((data: NavigationStart) => { this.showShadow = data.url.startsWith('/components'); }); diff --git a/src/app/pages/component-category-list/component-category-list.html b/src/app/pages/component-category-list/component-category-list.html index bc9dc72fb..e0c0a24fa 100644 --- a/src/app/pages/component-category-list/component-category-list.html +++ b/src/app/pages/component-category-list/component-category-list.html @@ -5,8 +5,8 @@ [routerLink]="['/components/category/', category.id]"> {{category.name}}

{{category.summary}}

-
-
+ + diff --git a/src/app/pages/component-category-list/component-category-list.scss b/src/app/pages/component-category-list/component-category-list.scss index 7b78df401..9439c3ae3 100644 --- a/src/app/pages/component-category-list/component-category-list.scss +++ b/src/app/pages/component-category-list/component-category-list.scss @@ -1,43 +1,35 @@ @import '../../../styles/constants'; .docs-component-category-list { + display: flex; + flex-wrap: wrap; padding: 20px; @media (max-width: $small-breakpoint-width) { - display: flex; - flex-wrap: wrap; justify-content: center; } } .docs-component-category-list-card { + cursor: pointer; display: inline-block; - width: 260px; margin: 20px; vertical-align: top; - cursor: pointer; + width: 260px; .mat-card-title { font-size: 20px; } } -.docs-component-category-list-card-image { - width: 100%; - height: 160px; - background-size: contain; - background-repeat: no-repeat; - background-position: center; -} - .docs-component-category-list-card-summary { height: 2.4em; } .docs-component-category-list-header { - padding-left: 20px; - display: flex; align-items: center; + display: flex; + padding-left: 20px; h1 { font-size: 30px; diff --git a/src/app/pages/component-list/component-list.html b/src/app/pages/component-list/component-list.html index 67aff7b9c..4db71b583 100644 --- a/src/app/pages/component-list/component-list.html +++ b/src/app/pages/component-list/component-list.html @@ -1,11 +1,11 @@
-
-
+ class="docs-component-list-item" + [routerLink]="['/components/component/', component.id]"> + + {{component.name}}
diff --git a/src/app/pages/component-sidenav/_component-sidenav-theme.scss b/src/app/pages/component-sidenav/_component-sidenav-theme.scss index edb5eed9e..fe4e01adb 100644 --- a/src/app/pages/component-sidenav/_component-sidenav-theme.scss +++ b/src/app/pages/component-sidenav/_component-sidenav-theme.scss @@ -1,4 +1,4 @@ -@import '~@angular/material/theming'; +@import '../../../../node_modules/@angular/material/theming'; @mixin component-viewer-sidenav-theme($theme) { $primary: map-get($theme, primary); diff --git a/src/app/pages/component-viewer/_component-viewer-theme.scss b/src/app/pages/component-viewer/_component-viewer-theme.scss index abadd9642..1d196fa55 100644 --- a/src/app/pages/component-viewer/_component-viewer-theme.scss +++ b/src/app/pages/component-viewer/_component-viewer-theme.scss @@ -1,4 +1,4 @@ -@import '~@angular/material/theming'; +@import '../../../../node_modules/@angular/material/theming'; @mixin component-viewer-theme($theme) { $primary: map-get($theme, primary); diff --git a/src/app/pages/guide-list/_guide-list-theme.scss b/src/app/pages/guide-list/_guide-list-theme.scss index dbe5eb8fc..59b61e929 100644 --- a/src/app/pages/guide-list/_guide-list-theme.scss +++ b/src/app/pages/guide-list/_guide-list-theme.scss @@ -1,4 +1,4 @@ -@import '~@angular/material/theming'; +@import '../../../../node_modules/@angular/material/theming'; @mixin guide-list-theme($theme) { $primary: map-get($theme, primary); diff --git a/src/app/pages/guide-viewer/guide-viewer.scss b/src/app/pages/guide-viewer/guide-viewer.scss index 8774d5bed..12c4ddad8 100644 --- a/src/app/pages/guide-viewer/guide-viewer.scss +++ b/src/app/pages/guide-viewer/guide-viewer.scss @@ -1,4 +1,4 @@ -@import "~@angular/material/theming"; +@import "../../../../node_modules/@angular/material/theming"; /* For desktop, the content should be aligned with the page title. */ $guide-content-margin-side: 70px; diff --git a/src/app/pages/homepage/_homepage-theme.scss b/src/app/pages/homepage/_homepage-theme.scss index 97af2c983..71ce38e02 100644 --- a/src/app/pages/homepage/_homepage-theme.scss +++ b/src/app/pages/homepage/_homepage-theme.scss @@ -7,7 +7,7 @@ app-homepage { .docs-header-background { - background: url('assets/img/homepage/material_splash.svg') repeat-x center center, mat-color($primary); + background: url('/assets/img/homepage/material_splash.svg') repeat-x center center, mat-color($primary); } .docs-header-headline { diff --git a/src/app/pages/homepage/homepage.html b/src/app/pages/homepage/homepage.html index f0fd50788..02ba6a657 100644 --- a/src/app/pages/homepage/homepage.html +++ b/src/app/pages/homepage/homepage.html @@ -13,7 +13,7 @@

Material Design components for Angular apps

- Sprint from Zero to App +

Sprint from Zero to App

@@ -23,7 +23,7 @@

Sprint from Zero to App

- Fast and Consistent +

Fast and Consistent

@@ -33,7 +33,7 @@

Fast and Consistent

- Versatile +

Versatile

@@ -43,7 +43,7 @@

Versatile

- Optimized for Angular +

Optimized for Angular

diff --git a/src/app/pages/homepage/homepage.scss b/src/app/pages/homepage/homepage.scss index f9fb6678d..b354fbaee 100644 --- a/src/app/pages/homepage/homepage.scss +++ b/src/app/pages/homepage/homepage.scss @@ -56,7 +56,7 @@ $margin-promotion-sections: 60px; margin: $margin-promotion-sections 0; } -.docs-homepage-row img { +.docs-homepage-row .docs-svg-image{ max-width: 90%; } diff --git a/src/app/shared/footer/footer.html b/src/app/shared/footer/footer.html index a7885ff5a..2d18f8517 100644 --- a/src/app/shared/footer/footer.html +++ b/src/app/shared/footer/footer.html @@ -2,8 +2,8 @@