diff --git a/browser-providers.js b/browser-providers.js index 850158dde..352f1c03a 100644 --- a/browser-providers.js +++ b/browser-providers.js @@ -26,7 +26,7 @@ const configuration = { 'iOS7': { unitTest: {target: null}, e2e: {target: null}}, 'iOS8': { unitTest: {target: null}, e2e: {target: null}}, 'iOS9': { unitTest: {target: 'BS'}, e2e: {target: null}}, - 'WindowsPhone': { unitTest: {target: 'BS'}, e2e: {target: null}} + 'WindowsPhone': { unitTest: {target: null}, e2e: {target: null}} }; exports.customLaunchers = { diff --git a/karma.conf.js b/karma.conf.js index a97bab555..d4081d884 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -16,7 +16,8 @@ module.exports = function (config) { require('karma-sauce-launcher'), ], files: [ - { pattern: './src/test.ts', watched: false } + {pattern: './src/test.ts', watched: false}, + {pattern: 'node_modules/hammerjs/hammer.js', included: true, watched: false}, ], preprocessors: { './src/test.ts': ['@angular/cli'] @@ -35,8 +36,8 @@ module.exports = function (config) { environment: 'dev' }, reporters: config.angularCli && config.angularCli.codeCoverage - ? ['progress', 'karma-remap-istanbul'] - : ['progress'], + ? ['dots', 'karma-remap-istanbul'] + : ['dots'], port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/package.json b/package.json index cef12aa9b..4e1084e00 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "MIT", "angular-cli": {}, "scripts": { - "start": "npm run build-themes && ng serve", + "start": "npm run build-themes && ng serve --aot --sourcemaps=false", "lint": "tslint \"src/**/*.ts\"", "test": "ng test", "pree2e": "webdriver-manager update", @@ -27,7 +27,6 @@ "@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" @@ -37,6 +36,7 @@ "@angular/compiler-cli": "^4.0.0", "@types/jasmine": "^2.5.41", "@types/node": "^7.0.5", + "hammerjs": "^2.0.8", "highlight.js": "^9.9.0", "jasmine-core": "2.4.1", "jasmine-spec-reporter": "2.5.0", diff --git a/scripts/ci/build-and-test.sh b/scripts/ci/build-and-test.sh index b4235f175..23a66bfda 100755 --- a/scripts/ci/build-and-test.sh +++ b/scripts/ci/build-and-test.sh @@ -18,8 +18,9 @@ if is_lint; then elif is_e2e; then $(npm bin)/ng e2e else + npm run build-themes $(npm bin)/ng test --watch false fi # Shutdown the previous created tunnel. -teardown_tunnel \ No newline at end of file +teardown_tunnel diff --git a/scripts/saucelabs/start-tunnel.sh b/scripts/saucelabs/start-tunnel.sh index 21f5f9091..c01a890c5 100755 --- a/scripts/saucelabs/start-tunnel.sh +++ b/scripts/saucelabs/start-tunnel.sh @@ -2,7 +2,7 @@ set -e -o pipefail -TUNNEL_FILE="sc-4.4.1-linux.tar.gz" +TUNNEL_FILE="sc-4.4.7-linux.tar.gz" TUNNEL_URL="https://saucelabs.com/downloads/$TUNNEL_FILE" TUNNEL_DIR="/tmp/saucelabs-connect" diff --git a/src/_app-theme.scss b/src/_app-theme.scss index 4b5800e80..d7230e74a 100644 --- a/src/_app-theme.scss +++ b/src/_app-theme.scss @@ -1,17 +1,18 @@ @import '../node_modules/@angular/material/theming'; -@import './app/pages/homepage/homepage-theme'; + +@import './app/pages/component-category-list/component-category-list-theme'; +@import './app/pages/component-list/component-list-theme'; @import './app/pages/component-sidenav/component-sidenav-theme'; @import './app/pages/component-viewer/component-viewer-theme'; -@import './app/pages/component-list/component-list-theme'; -@import './app/pages/component-category-list/component-category-list-theme'; @import './app/pages/guide-list/guide-list-theme'; - +@import './app/pages/homepage/homepage-theme'; +@import './app/shared/example-viewer/example-viewer-theme'; +@import './app/shared/footer/footer-theme'; +@import './app/shared/navbar/navbar-theme'; @import './styles/api-theme'; @import './styles/markdown-theme'; +@import './styles/svg-theme'; @import './styles/tables-theme'; -@import './app/shared/navbar/navbar-theme'; -@import './app/shared/example-viewer/example-viewer-theme'; -@import './app/shared/footer/footer-theme'; // Styles for the docs app that are based on the current theme. @@ -39,17 +40,17 @@ color: mat-color($primary, default-contrast); } + @include component-category-list-theme($theme); + @include component-list-theme($theme); + @include component-viewer-sidenav-theme($theme); + @include component-viewer-theme($theme); @include docs-site-api-theme($theme); @include docs-site-markdown-theme($theme); + @include docs-site-svg-theme($theme); @include docs-site-tables-theme($theme); - @include nav-bar-theme($theme); - @include component-viewer-sidenav-theme($theme); - @include home-page-theme($theme); - @include component-viewer-theme($theme); - @include component-list-theme($theme); - @include component-category-list-theme($theme); - @include nav-bar-theme($theme); @include example-viewer-theme($theme); @include footer-theme($theme); @include guide-list-theme($theme); + @include home-page-theme($theme); + @include nav-bar-theme($theme); } diff --git a/src/app/app-module.ts b/src/app/app-module.ts index 97cc2e327..e14f0302d 100644 --- a/src/app/app-module.ts +++ b/src/app/app-module.ts @@ -1,60 +1,68 @@ import {BrowserModule} from '@angular/platform-browser'; import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {NgModule} from '@angular/core'; -import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common'; +import {LocationStrategy, PathLocationStrategy} from '@angular/common'; import {FormsModule} from '@angular/forms'; import {HttpModule} from '@angular/http'; -import {MaterialModule, MdNativeDateModule} from '@angular/material'; +import {RouterModule} from '@angular/router'; +import {MdNativeDateModule} from '@angular/material'; import {ExampleModule} from '@angular/material-examples'; import {MaterialDocsApp} from './material-docs-app'; -import {Homepage} from './pages/homepage/homepage'; -import {routing} from './routes'; -import {ComponentList} from './pages/component-list/component-list'; -import {ComponentViewer} from './pages/component-viewer/component-viewer'; -import {GuideList} from './pages/guide-list'; -import {GuideViewer} from './pages/guide-viewer'; -import {SharedModule} from './shared/shared-module'; -import {ComponentCategoryList} from './pages/component-category-list/component-category-list'; -import {ComponentSidenav} from './pages/component-sidenav/component-sidenav'; -import {Footer} from './shared/footer/footer'; +import {HomepageModule} from './pages/homepage/homepage'; +import {MATERIAL_DOCS_ROUTES} from './routes'; +import {ComponentListModule} from './pages/component-list/component-list'; +import {ComponentViewerModule} from './pages/component-viewer/component-viewer'; +import {ComponentCategoryListModule} from './pages/component-category-list/component-category-list'; +import {ComponentSidenavModule} from './pages/component-sidenav/component-sidenav'; +import {FooterModule} from './shared/footer/footer'; import {ComponentPageTitle} from './pages/page-title/page-title'; -import {ComponentPageHeader} from './pages/component-page-header/component-page-header'; +import {ComponentHeaderModule} from './pages/component-page-header/component-page-header'; import {StyleManager} from './shared/style-manager/style-manager'; - +import {SvgViewerModule} from './shared/svg-viewer/svg-viewer'; +import {ThemePickerModule} from './shared/theme-picker/theme-picker'; +import {PlunkerButtonModule} from './shared/plunker/plunker-button'; +import {NavBarModule} from './shared/navbar/navbar'; +import {ThemeStorage} from './shared/theme-picker/theme-storage/theme-storage'; +import {GuideItems} from './shared/guide-items/guide-items'; +import {DocumentationItems} from './shared/documentation-items/documentation-items'; +import {GuideListModule} from './pages/guide-list/guide-list'; +import {GuideViewerModule} from './pages/guide-viewer/guide-viewer'; +import {DocViewerModule} from './shared/doc-viewer/doc-viewer-module'; @NgModule({ - declarations: [ - MaterialDocsApp, - ComponentCategoryList, - ComponentList, - ComponentSidenav, - ComponentViewer, - ComponentPageHeader, - GuideList, - GuideViewer, - Homepage, - Footer, - ], - exports: [ - MaterialDocsApp, - Homepage, - ], imports: [ BrowserModule, BrowserAnimationsModule, ExampleModule, - SharedModule, FormsModule, HttpModule, - MaterialModule, MdNativeDateModule, - routing, + RouterModule.forRoot(MATERIAL_DOCS_ROUTES), + + ComponentCategoryListModule, + ComponentHeaderModule, + ComponentListModule, + ComponentSidenavModule, + ComponentViewerModule, + DocViewerModule, + FooterModule, + GuideListModule, + GuideListModule, + GuideViewerModule, + HomepageModule, + NavBarModule, + PlunkerButtonModule, + SvgViewerModule, + ThemePickerModule, ], + declarations: [MaterialDocsApp], providers: [ - Location, ComponentPageTitle, + DocumentationItems, + GuideItems, StyleManager, + ThemeStorage, {provide: LocationStrategy, useClass: PathLocationStrategy}, ], bootstrap: [MaterialDocsApp], diff --git a/src/app/material-docs-app.spec.ts b/src/app/material-docs-app.spec.ts deleted file mode 100644 index 3e6dca7c5..000000000 --- a/src/app/material-docs-app.spec.ts +++ /dev/null @@ -1,9 +0,0 @@ - -describe('Material Docs', () => { - - - it('should expect true to be true', () => { - expect(true).toBe(true); - }); - -}); diff --git a/src/app/material-docs-app.ts b/src/app/material-docs-app.ts index dd9fd9b01..7596e28b0 100644 --- a/src/app/material-docs-app.ts +++ b/src/app/material-docs-app.ts @@ -6,20 +6,41 @@ import {Router, NavigationStart} from '@angular/router'; selector: 'material-docs-app', templateUrl: './material-docs-app.html', styleUrls: ['./material-docs-app.scss'], - host: { - '[class.docs-dark-theme]': 'isDarkTheme', - }, encapsulation: ViewEncapsulation.None, }) export class MaterialDocsApp { - isDarkTheme = false; showShadow = false; - constructor( - router: Router, - ) { + constructor(router: Router) { + let previousRoute = router.routerState.snapshot.url; + router.events.subscribe((data: NavigationStart) => { this.showShadow = data.url.startsWith('/components'); + + // We want to reset the scroll position on navigation except when navigating within + // the documentation for a single component. + if (!isNavigationWithinComponentView(previousRoute, data.url)) { + resetScrollPosition(); + } + + previousRoute = data.url; }); } } + +function isNavigationWithinComponentView(oldUrl: string, newUrl: string) { + const componentViewExpression = /components\/(\w+)/; + return oldUrl && newUrl + && componentViewExpression.test(oldUrl) + && componentViewExpression.test(newUrl) + && oldUrl.match(componentViewExpression)[1] === newUrl.match(componentViewExpression)[1]; +} + +function resetScrollPosition() { + if (typeof document === 'object' && document) { + const sidenavContent = document.querySelector('.mat-sidenav-content'); + if (sidenavContent) { + sidenavContent.scrollTop = 0; + } + } +} 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 e0c0a24fa..740f47926 100644 --- a/src/app/pages/component-category-list/component-category-list.html +++ b/src/app/pages/component-category-list/component-category-list.html @@ -2,11 +2,11 @@ + [routerLink]="['/categories/', category.id]"> {{category.name}}

{{category.summary}}

+ [src]="'../../../assets/img/component-categories/' + category.id + '.svg'">
diff --git a/src/app/pages/component-category-list/component-category-list.spec.ts b/src/app/pages/component-category-list/component-category-list.spec.ts index 87a617a10..f5d1e99ca 100644 --- a/src/app/pages/component-category-list/component-category-list.spec.ts +++ b/src/app/pages/component-category-list/component-category-list.spec.ts @@ -1,10 +1,6 @@ -import {async, TestBed, ComponentFixture} from '@angular/core/testing'; -import {MaterialModule} from '@angular/material'; -import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; - -import {DocumentationItems} from '../../shared/documentation-items/documentation-items'; -import {ComponentPageTitle} from '../page-title/page-title'; -import {ComponentCategoryList} from './component-category-list'; +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentCategoryList, ComponentCategoryListModule} from './component-category-list'; +import {DocsAppTestingModule} from '../../testing/testing-module'; describe('ComponentCategoryList', () => { @@ -12,18 +8,14 @@ describe('ComponentCategoryList', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [MaterialModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - declarations: [ComponentCategoryList], - providers: [ - DocumentationItems, - ComponentPageTitle - ] - }); - - fixture = TestBed.createComponent(ComponentCategoryList) + imports: [ComponentCategoryListModule, DocsAppTestingModule], + }).compileComponents(); })); + beforeEach(() => { + fixture = TestBed.createComponent(ComponentCategoryList); + }); + it('should set page title on init', () => { const component = fixture.componentInstance; spyOn(component, 'ngOnInit').and.callThrough(); diff --git a/src/app/pages/component-category-list/component-category-list.ts b/src/app/pages/component-category-list/component-category-list.ts index caf01b8e4..8630cd050 100644 --- a/src/app/pages/component-category-list/component-category-list.ts +++ b/src/app/pages/component-category-list/component-category-list.ts @@ -1,6 +1,10 @@ -import {Component} from '@angular/core'; +import {Component, NgModule} from '@angular/core'; +import {MdCardModule} from '@angular/material'; +import {CommonModule} from '@angular/common'; +import {RouterModule} from '@angular/router'; import {DocumentationItems} from '../../shared/documentation-items/documentation-items'; import {ComponentPageTitle} from '../page-title/page-title'; +import {SvgViewerModule} from '../../shared/svg-viewer/svg-viewer'; @Component({ @@ -16,3 +20,11 @@ export class ComponentCategoryList { this._componentPageTitle.title = 'Component Library'; } } + +@NgModule({ + imports: [SvgViewerModule, MdCardModule, CommonModule, RouterModule], + exports: [ComponentCategoryList], + declarations: [ComponentCategoryList], + providers: [DocumentationItems, ComponentPageTitle], +}) +export class ComponentCategoryListModule { } diff --git a/src/app/pages/component-list/component-list.html b/src/app/pages/component-list/component-list.html index 4db71b583..92f928b73 100644 --- a/src/app/pages/component-list/component-list.html +++ b/src/app/pages/component-list/component-list.html @@ -1,10 +1,10 @@
+ [routerLink]="['/components/', component.id]"> + [attr.aria-label]="component.name" + [src]="'../../../assets/img/components/' + component.id + '.svg'"> {{component.name}} diff --git a/src/app/pages/component-list/component-list.spec.ts b/src/app/pages/component-list/component-list.spec.ts index 36d21cda5..db140c5ff 100644 --- a/src/app/pages/component-list/component-list.spec.ts +++ b/src/app/pages/component-list/component-list.spec.ts @@ -1,13 +1,8 @@ -import {async, TestBed, ComponentFixture} from '@angular/core/testing'; -import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; -import {MaterialModule} from '@angular/material'; -import {ActivatedRoute, Router} from '@angular/router'; -import {RouterTestingModule} from '@angular/router/testing'; +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {ActivatedRoute} from '@angular/router'; import {Observable} from 'rxjs/Observable'; - -import {DocumentationItems} from '../../shared/documentation-items/documentation-items'; -import {ComponentPageTitle} from '../page-title/page-title'; -import {ComponentList} from './component-list'; +import {ComponentList, ComponentListModule} from './component-list'; +import {DocsAppTestingModule} from '../../testing/testing-module'; const CATEGORY_ID = 'forms'; const mockActivatedRoute = { @@ -22,18 +17,16 @@ describe('ComponentList', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [MaterialModule, RouterTestingModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - declarations: [ComponentList], + imports: [ComponentListModule, DocsAppTestingModule], providers: [ - {provide: ActivatedRoute, useValue: mockActivatedRoute}, - ComponentPageTitle, - DocumentationItems, + {provide: ActivatedRoute, useValue: mockActivatedRoute} ] - }); + }).compileComponents(); + })); + beforeEach(() => { fixture = TestBed.createComponent(ComponentList); - })); + }); it('should set the category from router params', done => { const component = fixture.componentInstance; diff --git a/src/app/pages/component-list/component-list.ts b/src/app/pages/component-list/component-list.ts index 5ad1467cf..051a89266 100644 --- a/src/app/pages/component-list/component-list.ts +++ b/src/app/pages/component-list/component-list.ts @@ -1,10 +1,12 @@ -import {Component} from '@angular/core'; +import {Component, NgModule} from '@angular/core'; import { DocumentationItems, DocCategory } from '../../shared/documentation-items/documentation-items'; -import {ActivatedRoute} from '@angular/router'; +import {ActivatedRoute, RouterModule} from '@angular/router'; import {ComponentPageTitle} from '../page-title/page-title'; +import {SvgViewerModule} from '../../shared/svg-viewer/svg-viewer'; +import {CommonModule} from '@angular/common'; @Component({ selector: 'app-components', @@ -23,3 +25,11 @@ export class ComponentList { }); } } + +@NgModule({ + imports: [SvgViewerModule, RouterModule, CommonModule], + exports: [ComponentList], + declarations: [ComponentList], + providers: [DocumentationItems, ComponentPageTitle], +}) +export class ComponentListModule { } diff --git a/src/app/pages/component-page-header/component-page-header.spec.ts b/src/app/pages/component-page-header/component-page-header.spec.ts index 21a511c06..5a0203c44 100644 --- a/src/app/pages/component-page-header/component-page-header.spec.ts +++ b/src/app/pages/component-page-header/component-page-header.spec.ts @@ -1,9 +1,6 @@ -import {async, TestBed, ComponentFixture} from '@angular/core/testing'; -import {MaterialModule} from '@angular/material'; -import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; - -import {ComponentPageTitle} from '../page-title/page-title'; -import {ComponentPageHeader} from './component-page-header'; +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentHeaderModule, ComponentPageHeader} from './component-page-header'; +import {DocsAppTestingModule} from '../../testing/testing-module'; describe('ComponentPageHeader', () => { @@ -11,14 +8,13 @@ describe('ComponentPageHeader', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [MaterialModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - declarations: [ComponentPageHeader], - providers: [ComponentPageTitle], - }); + imports: [ComponentHeaderModule, DocsAppTestingModule], + }).compileComponents(); + })); + beforeEach(() => { fixture = TestBed.createComponent(ComponentPageHeader); - })); + }); it('should return the title', () => { const component = fixture.componentInstance; diff --git a/src/app/pages/component-page-header/component-page-header.ts b/src/app/pages/component-page-header/component-page-header.ts index 7b1f5cdc7..624f53684 100644 --- a/src/app/pages/component-page-header/component-page-header.ts +++ b/src/app/pages/component-page-header/component-page-header.ts @@ -1,6 +1,7 @@ -import {Component, EventEmitter, Output} from '@angular/core'; +import {Component, EventEmitter, NgModule, Output} from '@angular/core'; import 'rxjs/add/operator/first'; import {ComponentPageTitle} from '../page-title/page-title'; +import {MdButtonModule, MdIconModule} from '@angular/material'; @Component({ selector: 'component-page-header', @@ -16,3 +17,11 @@ export class ComponentPageHeader { return this._componentPageTitle.title; } } + +@NgModule({ + imports: [MdButtonModule, MdIconModule], + exports: [ComponentPageHeader], + declarations: [ComponentPageHeader], + providers: [ComponentPageTitle], +}) +export class ComponentHeaderModule { } diff --git a/src/app/pages/component-sidenav/component-sidenav.html b/src/app/pages/component-sidenav/component-sidenav.html index a91534557..c36bc03ea 100644 --- a/src/app/pages/component-sidenav/component-sidenav.html +++ b/src/app/pages/component-sidenav/component-sidenav.html @@ -6,7 +6,7 @@

{{category.name}}