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

Commit 049117c

Browse files
andrewseguinjelbourn
authored andcommitted
add sidenav toggle on mobile displays (#62)
* add sidenav toggle when mobile * fix lint errors
1 parent 9e9001b commit 049117c

20 files changed

+146
-32
lines changed

src/app/app-module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {ExampleModule} from './examples/example-module';
1515
import {SharedModule} from './shared/shared-module';
1616
import {ComponentCategoryList} from './pages/component-category-list/component-category-list';
1717
import {ComponentSidenav} from './pages/component-sidenav/component-sidenav';
18+
import {ComponentPageTitle} from './pages/page-title/page-title';
19+
import {ComponentPageHeader} from './pages/component-page-header/component-page-header';
1820

1921

2022
@NgModule({
@@ -24,6 +26,7 @@ import {ComponentSidenav} from './pages/component-sidenav/component-sidenav';
2426
ComponentList,
2527
ComponentSidenav,
2628
ComponentViewer,
29+
ComponentPageHeader,
2730
GuideList,
2831
GuideViewer,
2932
Homepage,
@@ -39,6 +42,7 @@ import {ComponentSidenav} from './pages/component-sidenav/component-sidenav';
3942
],
4043
providers: [
4144
Location,
45+
ComponentPageTitle,
4246
{provide: LocationStrategy, useClass: PathLocationStrategy},
4347
],
4448
bootstrap: [MaterialDocsApp],

src/app/pages/component-category-list/_component-category-list-theme.scss

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,6 @@
55
$background: map-get($theme, background);
66
$foreground: map-get($theme, foreground);
77

8-
.docs-component-category-list-header {
9-
background: md-color($primary);
10-
11-
h1 {
12-
color: md-color($primary, default-contrast);
13-
}
14-
}
15-
168
.docs-component-category-list-card-summary {
179
color: md-color($foreground, secondary-text);
1810
}

src/app/pages/component-category-list/component-category-list.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
<div class="docs-component-category-list-header">
2-
<h1>Component Library</h1>
3-
</div>
4-
51
<div class="docs-component-category-list">
62
<md-card
73
*ngFor="let category of docItems.getItemsInCategories()"

src/app/pages/component-category-list/component-category-list.scss

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1+
@import '../../../styles/constants';
2+
13
.docs-component-category-list {
24
padding: 20px;
5+
6+
@media (max-width: $small-breakpoint-width) {
7+
display: flex;
8+
flex-wrap: wrap;
9+
justify-content: center;
10+
}
311
}
412

513
.docs-component-category-list-card {
@@ -24,6 +32,8 @@
2432

2533
.docs-component-category-list-header {
2634
padding-left: 20px;
35+
display: flex;
36+
align-items: center;
2737

2838
h1 {
2939
font-size: 30px;
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {Component} from '@angular/core';
22
import {DocumentationItems} from '../../shared/documentation-items/documentation-items';
3+
import {ComponentPageTitle} from '../page-title/page-title';
34

45

56
@Component({
@@ -8,5 +9,10 @@ import {DocumentationItems} from '../../shared/documentation-items/documentation
89
styleUrls: ['./component-category-list.scss']
910
})
1011
export class ComponentCategoryList {
11-
constructor(public docItems: DocumentationItems) {}
12+
constructor(public docItems: DocumentationItems,
13+
private _componentPageTitle: ComponentPageTitle) {}
14+
15+
ngOnInit() {
16+
this._componentPageTitle.title = 'Component Library';
17+
}
1218
}

src/app/pages/component-list/component-list.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
<div class="docs-primary-header">
2-
<h1> {{category.name}} </h1>
3-
</div>
4-
51
<div class="docs-component-list-category">
62
<a *ngFor="let component of category.items"
73
class="docs-component-list-item"

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
@import '~@angular/material/button/button-base';
2-
2+
@import '../../../styles/constants';
33

44
.docs-component-list-category {
55
margin: 20px;
6+
7+
@media (max-width: $small-breakpoint-width) {
8+
display: flex;
9+
flex-wrap: wrap;
10+
justify-content: space-around;
11+
}
612
}
713

814
.docs-component-list-item {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
DocCategory
55
} from '../../shared/documentation-items/documentation-items';
66
import {ActivatedRoute} from '@angular/router';
7+
import {ComponentPageTitle} from '../page-title/page-title';
78

89
@Component({
910
selector: 'app-components',
@@ -13,9 +14,12 @@ import {ActivatedRoute} from '@angular/router';
1314
export class ComponentList {
1415
category: DocCategory;
1516

16-
constructor(public docItems: DocumentationItems, private _route: ActivatedRoute) {
17+
constructor(public docItems: DocumentationItems,
18+
private _componentPageTitle: ComponentPageTitle,
19+
private _route: ActivatedRoute) {
1720
_route.params.subscribe(p => {
1821
this.category = docItems.getCategoryById(p['id']);
22+
this._componentPageTitle.title = this.category.name;
1923
});
2024
}
2125
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<div class="docs-primary-header component-page-header">
2+
<button md-button class="sidenav-toggle" (click)="toggleSidenav.emit()">
3+
<md-icon>menu</md-icon>
4+
</button>
5+
6+
<h1>{{getTitle()}} </h1>
7+
</div>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
@import '../../../styles/constants';
2+
3+
.component-page-header {
4+
display: flex;
5+
align-items: center;
6+
7+
@media (max-width: $small-breakpoint-width) {
8+
padding-left: 0;
9+
}
10+
}
11+
12+
h1 {
13+
@media (max-width: $small-breakpoint-width) {
14+
padding: 24px 8px;
15+
font-size: 20px;
16+
}
17+
}
18+
19+
.sidenav-toggle {
20+
padding: 0;
21+
margin: 8px;
22+
min-width: 64px;
23+
display: none;
24+
@media (max-width: $small-breakpoint-width) {
25+
display: flex;
26+
align-items: center;
27+
justify-content: center;
28+
}
29+
30+
md-icon {
31+
font-size: 30px;
32+
height: 64px;
33+
width: 64px;
34+
line-height: 64px;
35+
color: white;
36+
}
37+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {Component, EventEmitter, Output} from '@angular/core';
2+
import 'rxjs/add/operator/first';
3+
import {ComponentPageTitle} from '../page-title/page-title';
4+
5+
@Component({
6+
selector: 'component-page-header',
7+
templateUrl: './component-page-header.html',
8+
styleUrls: ['./component-page-header.scss']
9+
})
10+
export class ComponentPageHeader {
11+
constructor(private _componentPageTitle: ComponentPageTitle) { }
12+
13+
@Output() toggleSidenav = new EventEmitter<void>();
14+
15+
getTitle() {
16+
return this._componentPageTitle.title;
17+
}
18+
}

src/app/pages/component-sidenav/_component-sidenav-theme.scss

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@
66
$warn: map-get($theme, warn);
77
$background: map-get($theme, background);
88
$foreground: map-get($theme, foreground);
9-
$sidenav: '.docs-component-viewer-sidenav';
9+
$sidenav: '.docs-component-viewer-sidenav';
1010

1111

1212
.docs-component-viewer-sidenav {
13-
background: rgba(md-color($foreground, secondary-text), .04);
14-
1513

1614
// Section divider
1715
h3 {
@@ -27,8 +25,8 @@
2725
> a {
2826
color: md-color($foreground, secondary-text);
2927

30-
&.is-selected,
31-
&:hover,
28+
&.is-selected,
29+
&:hover,
3230
&:focus {
3331
background: md-color($background, background);
3432
color: md-color($primary);

src/app/pages/component-sidenav/component-sidenav.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<md-sidenav-layout class="docs-component-viewer-sidenav-container">
2-
<md-sidenav opened mode="side" class="docs-component-viewer-sidenav">
2+
<md-sidenav #sidenav class="docs-component-viewer-sidenav"
3+
[opened]="!isScreenSmall()"
4+
[mode]="isScreenSmall() ? 'over' : 'side'">
35
<nav *ngFor="let category of docItems.getItemsInCategories()">
46
<h3>{{category.name}}</h3>
57
<ul>
@@ -13,5 +15,6 @@ <h3>{{category.name}}</h3>
1315
</nav>
1416
</md-sidenav>
1517

18+
<component-page-header (toggleSidenav)="sidenav.toggle()"></component-page-header>
1619
<router-outlet></router-outlet>
1720
</md-sidenav-layout>
Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
import {Component, ViewEncapsulation} from '@angular/core';
1+
import {Component, ViewEncapsulation, ViewChild} from '@angular/core';
22
import {DocumentationItems} from '../../shared/documentation-items/documentation-items';
3+
import {MdSidenav} from '@angular/material';
4+
import {Router} from '@angular/router';
35

6+
const SMALL_WIDTH_BREAKPOINT = 840;
47

58
@Component({
69
selector: 'app-component-sidenav',
@@ -9,5 +12,20 @@ import {DocumentationItems} from '../../shared/documentation-items/documentation
912
encapsulation: ViewEncapsulation.None,
1013
})
1114
export class ComponentSidenav {
12-
constructor(public docItems: DocumentationItems) {}
15+
constructor(public docItems: DocumentationItems,
16+
private _router: Router) {}
17+
18+
@ViewChild(MdSidenav) sidenav: MdSidenav;
19+
20+
ngOnInit() {
21+
this._router.events.subscribe(() => {
22+
if (this.isScreenSmall()) {
23+
this.sidenav.close();
24+
}
25+
});
26+
}
27+
28+
isScreenSmall(): boolean {
29+
return window.matchMedia(`(max-width: ${SMALL_WIDTH_BREAKPOINT}px)`).matches;
30+
}
1331
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
<div class="docs-primary-header">
2-
<h1> Component - {{componentDocItem.name}} </h1>
3-
</div>
4-
51
<!-- TODO(jelbourn): turn this into nav tabs -->
62
<md-tab-group class="docs-component-viewer-tabbed-content"
73
(selectedIndexChange)="overviewViewer.releadLiveExamples()">

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
@import '../../../styles/constants';
2+
13
app-component-viewer {
24
font-weight: 400;
35
}
46

57
.docs-component-viewer-tabbed-content {
68
margin: 50px 70px;
9+
@media (max-width: $small-breakpoint-width) {
10+
margin: 16px;
11+
}
712

813
md-tab {
914
margin: 30px;

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {Component, ViewEncapsulation} from '@angular/core';
22
import {ActivatedRoute} from '@angular/router';
33
import {DocumentationItems, DocItem} from '../../shared/documentation-items/documentation-items';
4+
import {ComponentPageTitle} from '../page-title/page-title';
45

56

67
@Component({
@@ -12,9 +13,12 @@ import {DocumentationItems, DocItem} from '../../shared/documentation-items/docu
1213
export class ComponentViewer {
1314
componentDocItem: DocItem;
1415

15-
constructor(private _route: ActivatedRoute, public docItems: DocumentationItems) {
16+
constructor(private _route: ActivatedRoute,
17+
private _componentPageTitle: ComponentPageTitle,
18+
public docItems: DocumentationItems) {
1619
_route.params.subscribe(p => {
1720
this.componentDocItem = docItems.getItemById(p['id']);
21+
this._componentPageTitle.title = `Component - ${this.componentDocItem.name}`;
1822
});
1923
}
2024
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import {Injectable} from '@angular/core';
2+
3+
/**
4+
* Service responsible for setting the title that appears above the components and guide pages.
5+
*/
6+
@Injectable()
7+
export class ComponentPageTitle {
8+
_title: string = '';
9+
10+
get title(): string { return this._title; }
11+
set title(title: string) { this._title = title; }
12+
}

src/app/shared/example-viewer/_example-viewer-theme.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
.docs-example-viewer-wrapper {
1010
border: 1px solid rgba(md-color($foreground, secondary-text), .03);
1111
box-shadow: 0 2px 2px rgba(0,0,0,0.24), 0 0 2px rgba(0,0,0,0.12);
12+
margin: 4px;
1213
}
1314

1415
.docs-example-viewer-title {

src/styles/_constants.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
$small-breakpoint-width: 840px;

0 commit comments

Comments
 (0)