Skip to content
This repository was archived by the owner on Dec 18, 2024. It is now read-only.

Commit b63a914

Browse files
committed
Change ComponentViewer to use nav-tabs
1 parent 4486ed3 commit b63a914

15 files changed

+95
-48
lines changed

src/app/app-module.ts

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {SvgViewerModule} from './shared/svg-viewer/svg-viewer';
2323
import {ThemePickerModule} from './shared/theme-picker/theme-picker';
2424
import {PlunkerButtonModule} from './shared/plunker/plunker-button';
2525
import {NavBarModule} from './shared/navbar/navbar';
26-
import {ExampleViewer} from './shared/example-viewer/example-viewer';
2726
import {ThemeStorage} from './shared/theme-picker/theme-storage/theme-storage';
2827
import {GuideItems} from './shared/guide-items/guide-items';
2928
import {DocumentationItems} from './shared/documentation-items/documentation-items';

src/app/material-docs-app.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,30 @@ export class MaterialDocsApp {
1212
showShadow = false;
1313

1414
constructor(router: Router) {
15+
let previousRoute = router.routerState.snapshot.url;
16+
1517
router.events.subscribe((data: NavigationStart) => {
1618
this.showShadow = data.url.startsWith('/components');
17-
resetScrollPosition();
19+
20+
// We want to reset the scroll position on navigation except when navigating within
21+
// the documentation for a single component.
22+
if (!isNavigationWithinComponentView(previousRoute, data.url)) {
23+
resetScrollPosition();
24+
}
25+
26+
previousRoute = data.url;
1827
});
1928
}
2029
}
2130

31+
function isNavigationWithinComponentView(oldUrl: string, newUrl: string) {
32+
const componentViewExpression = /components\/(\w+)/;
33+
return oldUrl && newUrl
34+
&& componentViewExpression.test(oldUrl)
35+
&& componentViewExpression.test(newUrl)
36+
&& oldUrl.match(componentViewExpression)[1] === newUrl.match(componentViewExpression)[1];
37+
}
38+
2239
function resetScrollPosition() {
2340
if (typeof document === 'object' && document) {
2441
const sidenavContent = document.querySelector('.mat-sidenav-content');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<doc-viewer
2+
documentUrl="/assets/documents/api/{{componentViewer.componentDocItem.id}}.html"
3+
class="docs-component-view-text-content"></doc-viewer>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<example-viewer
2+
*ngFor="let example of componentViewer.componentDocItem.examples"
3+
[example]="example"></example-viewer>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<doc-viewer
2+
documentUrl="/assets/documents/overview/{{componentViewer.componentDocItem.id}}.html"
3+
class="docs-component-view-text-content"></doc-viewer>
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
11
<!-- TODO(jelbourn): turn this into nav tabs -->
2-
<md-tab-group class="docs-component-viewer-tabbed-content"
3-
(selectedIndexChange)="overviewViewer.releadLiveExamples()">
4-
<md-tab label="OVERVIEW">
5-
<doc-viewer #overviewViewer
6-
documentUrl="/assets/documents/overview/{{componentDocItem.id}}.html"
7-
class="docs-component-view-text-content">
8-
</doc-viewer>
9-
</md-tab>
10-
11-
<md-tab label="API REFERENCE">
12-
<doc-viewer documentUrl="/assets/documents/api/{{componentDocItem.id}}.html"
13-
class="docs-component-view-text-content"></doc-viewer>
14-
</md-tab>
15-
16-
<md-tab label="EXAMPLES">
17-
18-
<example-viewer *ngFor="let example of componentDocItem.examples" [example]="example">
19-
</example-viewer>
20-
21-
</md-tab>
22-
</md-tab-group>
2+
<nav md-tab-nav-bar class="docs-component-viewer-tabbed-content">
3+
<a md-tab-link class="docs-component-viewer-section-tab"
4+
*ngFor="let section of ['Overview', 'API', 'Examples']"
5+
[routerLink]="section.toLowerCase()"
6+
routerLinkActive #rla="routerLinkActive"
7+
[active]="rla.isActive">{{section}}</a>
8+
</nav>
9+
10+
<div class="docs-component-viewer-content">
11+
<router-outlet></router-outlet>
12+
</div>

src/app/pages/component-viewer/component-viewer.scss

+9-16
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,19 @@
22

33
app-component-viewer {
44
font-weight: 400;
5+
margin: 20px 70px 50px 70px;
56
}
67

7-
.docs-component-viewer-tabbed-content {
8-
margin: 50px 70px;
9-
@media (max-width: $small-breakpoint-width) {
10-
margin: 16px;
11-
}
8+
.docs-component-viewer-section-tab {
9+
text-transform: uppercase;
10+
}
1211

13-
// Direct chain is necessary to avoid styling tabs in the example viewer
14-
& > .mat-tab-header {
15-
border: none;
16-
margin-bottom: 30px;
12+
.docs-component-viewer-tabbed-content {
13+
margin-bottom: 50px;
14+
}
1715

18-
& > .mat-tab-label-container > .mat-tab-list > .mat-tab-labels > .mat-tab-label {
19-
font-weight: 400;
20-
margin: 0 10px;
21-
min-width: 0;
22-
padding: 0 5px;
23-
}
24-
}
16+
.docs-component-viewer-content {
17+
min-height: 500px;
2518
}
2619

2720
.docs-example-source {

src/app/pages/component-viewer/component-viewer.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const docItemsId = 'button';
1313
const exampleKey = 'button-types';
1414

1515
const mockActivatedRoute = {
16+
snapshot: {},
1617
params: Observable.create(observer => {
1718
observer.next({id: docItemsId});
1819
observer.complete();

src/app/pages/component-viewer/component-viewer.ts

+26-1
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,35 @@ export class ComponentViewer {
2626
}
2727
}
2828

29+
@Component({
30+
selector: 'component-overview',
31+
templateUrl: './component-overview.html',
32+
encapsulation: ViewEncapsulation.None,
33+
})
34+
export class ComponentOverview {
35+
constructor(public componentViewer: ComponentViewer) {}
36+
}
37+
38+
@Component({
39+
selector: 'component-api',
40+
templateUrl: './component-api.html',
41+
encapsulation: ViewEncapsulation.None,
42+
})
43+
export class ComponentApi extends ComponentOverview {}
44+
45+
@Component({
46+
selector: 'component-examples',
47+
templateUrl: './component-examples.html',
48+
encapsulation: ViewEncapsulation.None,
49+
})
50+
export class ComponentExamples extends ComponentOverview {}
51+
52+
53+
2954
@NgModule({
3055
imports: [MdTabsModule, RouterModule, DocViewerModule, CommonModule],
3156
exports: [ComponentViewer],
32-
declarations: [ComponentViewer],
57+
declarations: [ComponentViewer, ComponentOverview, ComponentApi, ComponentExamples],
3358
providers: [DocumentationItems, ComponentPageTitle],
3459
})
3560
export class ComponentViewerModule {}

src/app/pages/page-title/page-title.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {Injectable} from '@angular/core';
55
*/
66
@Injectable()
77
export class ComponentPageTitle {
8-
_title: string = '';
8+
_title = '';
99

1010
get title(): string { return this._title; }
1111
set title(title: string) { this._title = title; }

src/app/routes.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import {Homepage} from './pages/homepage';
22
import {ComponentList} from './pages/component-list';
33
import {GuideList} from './pages/guide-list';
44
import {Routes} from '@angular/router';
5-
import {ComponentViewer} from './pages/component-viewer/component-viewer';
5+
import {
6+
ComponentApi,
7+
ComponentExamples,
8+
ComponentOverview,
9+
ComponentViewer
10+
} from './pages/component-viewer/component-viewer';
611
import {ComponentCategoryList} from './pages/component-category-list/component-category-list';
712
import {ComponentSidenav} from './pages/component-sidenav/component-sidenav';
813
import {GuideViewer} from './pages/guide-viewer/guide-viewer';
@@ -24,7 +29,16 @@ export const MATERIAL_DOCS_ROUTES: Routes = [
2429
{path: '', component: ComponentCategoryList},
2530
{path: 'component/:id', redirectTo: ':id', pathMatch: 'full'},
2631
{path: 'category/:id', redirectTo: '/categories/:id', pathMatch: 'full'},
27-
{path: ':id', component: ComponentViewer},
32+
{
33+
path: ':id',
34+
component: ComponentViewer,
35+
children: [
36+
{path: '', redirectTo: 'overview', pathMatch: 'full'},
37+
{path: 'overview', component: ComponentOverview, pathMatch: 'full'},
38+
{path: 'api', component: ComponentApi, pathMatch: 'full'},
39+
{path: 'examples', component: ComponentExamples, pathMatch: 'full'},
40+
],
41+
},
2842
],
2943
},
3044
{path: 'guides', component: GuideList},

src/app/shared/example-viewer/example-viewer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class ExampleViewer {
2020
exampleData: LiveExample;
2121

2222
/** Whether the source for the example is being displayed. */
23-
showSource: boolean = false;
23+
showSource = false;
2424

2525
get example() {
2626
return this._example;

src/app/shared/svg-viewer/svg-viewer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export class SvgViewer implements OnInit {
3030
private fetchAndInlineSvgContent(path: string): void {
3131
const svgAbsPath = getAbsolutePathFromSrc(path);
3232
this.http.get(svgAbsPath).subscribe(svgResponse => {
33-
this.inlineSvgContent(svgResponse.text())
33+
this.inlineSvgContent(svgResponse.text());
3434
});
3535
}
3636
}

src/app/shared/theme-picker/theme-picker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class ThemePicker {
4545
];
4646

4747
constructor(
48-
public styleManager : StyleManager,
48+
public styleManager: StyleManager,
4949
private _themeStorage: ThemeStorage
5050
) {
5151
const currentTheme = this._themeStorage.getStoredTheme();

src/app/shared/theme-picker/theme-storage/theme-storage.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ export class ThemeStorage {
2121
}
2222

2323
public getStoredTheme(): DocsSiteTheme {
24-
const theme = JSON.parse(window.localStorage[ThemeStorage.storageKey] || null);
25-
return theme
24+
return JSON.parse(window.localStorage[ThemeStorage.storageKey] || null);
2625
}
2726

2827
public clearStorage() {

0 commit comments

Comments
 (0)