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

Commit 1cc1e78

Browse files
committed
feat(nav): add mobile nav toggling
Mobile nav hides when click is different to toggler and navigation. --- scss/include/_layout.scss | 22 ++++++++++---- src/resources/side-nav/nav-state.js | 22 ++++++++++---- src/resources/side-nav/nav-toggler.js | 12 +++----- src/resources/side-nav/navigation.js | 43 +++++++++++++++++++--------- 4 files changed, 68 insertions(+), 31 deletions(-)
1 parent 006c843 commit 1cc1e78

File tree

4 files changed

+68
-31
lines changed

4 files changed

+68
-31
lines changed

scss/include/_layout.scss

+17-5
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,33 @@ body {
2222
}
2323

2424
navigation-side {
25+
background-color: #fff;
2526
position: fixed;
2627
padding: 14px 22px;
2728
top: 54px;
2829
width: 230px;
2930
}
3031

3132
@media (max-width: 992px) {
32-
.show-navigation {
33-
display: block;
34-
position: absolute;
33+
navigation {
34+
display: none;
35+
z-index: 20000;
3536
}
3637

37-
.show-navigation navigation-side {
38+
navigation-side {
39+
padding: 5px 0;
40+
margin: 2px 0 0;
41+
color: #373a3c;
42+
text-align: left;
43+
list-style: none;
3844
background-color: #fff;
39-
z-index: 20000;
45+
border-bottom: 1px solid rgba(0,0,0,.15);
46+
border-right: 1px solid rgba(0,0,0,.15);
47+
border-bottom-right-radius: .25rem;
48+
}
49+
50+
.show-navigation {
51+
position: absolute;
4052
}
4153
}
4254

src/resources/side-nav/nav-state.js

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,28 @@
11
const MAX_WIDTH_MOBILE_NAV = 992;
22

33
class NavState {
4+
mobileNav = false;
45
navToggled = true;
56
mobileNavToggled = false;
6-
mobileNav = false;
77

8-
toggleNav() {
9-
this.navToggled = !this.navToggled;
8+
constructor() {
9+
if (window.innerWidth < MAX_WIDTH_MOBILE_NAV) {
10+
this.mobileNav = true;
11+
this.navToggled = true;
12+
this.mobileNavToggled = false;
13+
}
14+
}
15+
16+
toggle() {
17+
if (this.mobileNav) {
18+
this.mobileNavToggled = !this.mobileNavToggled;
19+
} else {
20+
this.navToggled = !this.navToggled;
21+
}
1022
}
1123

12-
toggleMobileNav() {
13-
this.mobileNavToggled = !this.mobileNavToggled;
24+
setMobileNavToggled(state) {
25+
this.mobileNavToggled = state;
1426
}
1527

1628
setMobileNav(mobileNav) {

src/resources/side-nav/nav-toggler.js

+4-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {customElement, inlineView} from 'aurelia-templating';
2-
import {NavState, MAX_WIDTH_MOBILE_NAV} from './nav-state';
2+
import {NavState} from './nav-state';
33

44
@customElement('nav-toggler')
55
@inlineView(`
66
<template>
7-
<button class="navbar-toggler" type="button" click.delegate="toggleNav()">
7+
<button class="navbar-toggler" type="button" click.delegate="toggle()">
88
<i class="fa fa-bars fa-fw"></i>
99
</button>
1010
</template>
@@ -16,11 +16,7 @@ export class NavToggler {
1616
this.navState = navState;
1717
}
1818

19-
toggleNav() {
20-
if (this.navState.isMobileNav() == false) {
21-
this.navState.toggleNav();
22-
} else {
23-
this.navState.toggleMobileNav();
24-
}
19+
toggle() {
20+
this.navState.toggle();
2521
}
2622
}

src/resources/side-nav/navigation.js

+30-13
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,37 @@ import {NavState, MAX_WIDTH_MOBILE_NAV} from './nav-state';
55
@customElement('navigation')
66
@inject(BindingEngine, NavState, Element)
77
export class Navigation {
8-
showNavigationEvent = () => {
8+
constructor(bindingEngine, navState, element) {
9+
this.navState = navState;
10+
this.element = element;
11+
this.windowResizeListener = () => this.handleResize();
12+
this.outsideClickListener = event => this.handleBlur(event);
13+
14+
bindingEngine.propertyObserver(this.navState, 'navToggled').subscribe(this.navStateChanged.bind(this));
15+
bindingEngine.propertyObserver(this.navState, 'mobileNavToggled').subscribe(this.mobileNavStateChanged.bind(this));
16+
}
17+
18+
handleResize() {
919
if (window.innerWidth < MAX_WIDTH_MOBILE_NAV) {
10-
this.navState.setMobileNav(true);
1120
this.element.classList.remove('navigation-pinned');
21+
this.navState.setMobileNav(true);
22+
this.navState.setMobileNavToggled(false);
23+
this.mobileNavStateChanged();
1224
} else {
13-
this.navState.setMobileNav(false);
1425
this.element.classList.add('navigation-pinned');
26+
this.navState.setMobileNav(false);
27+
this.navStateChanged();
1528
}
16-
};
29+
}
1730

18-
constructor(bindingEngine, navState, element) {
19-
this.navState = navState;
20-
this.element = element;
31+
handleBlur(event) {
32+
if (this.navState.isMobileNav() === false || event.defaultPrevented === true) {
33+
return;
34+
}
2135

22-
bindingEngine.propertyObserver(this.navState, 'navToggled').subscribe(this.navStateChanged.bind(this));
23-
bindingEngine.propertyObserver(this.navState, 'mobileNavToggled').subscribe(this.mobileNavStateChanged.bind(this));
24-
this.showNavigationEvent();
36+
if (this.element.contains(event.target) === false && this.navState.mobileNavToggled === true) {
37+
this.navState.toggle();
38+
}
2539
}
2640

2741
navStateChanged() {
@@ -36,15 +50,18 @@ export class Navigation {
3650
if (this.navState.isMobileNav() === true && this.navState.mobileNavToggled === true) {
3751
this.element.classList.add('show-navigation');
3852
} else if (this.navState.isMobileNav() === true && this.navState.mobileNavToggled === false) {
39-
this.element.classList.remove('show-navigation')
53+
this.element.classList.remove('show-navigation');
4054
}
4155
}
4256

4357
attached() {
44-
window.addEventListener('resize', this.showNavigationEvent);
58+
window.addEventListener('resize', this.windowResizeListener);
59+
document.addEventListener('click', this.outsideClickListener);
60+
this.handleResize();
4561
}
4662

4763
detached() {
48-
window.removeEventListener('resize', this.showNavigationEvent);
64+
window.removeEventListener('resize', this.windowResizeListener);
65+
document.removeEventListener('click', this.outsideClickListener);
4966
}
5067
}

0 commit comments

Comments
 (0)