Skip to content

Commit 702dcfc

Browse files
committed
Combine + simplify nav/masthead
Now uses top-down drawer similar to Solid. Does not yet address IE9 issues related to dependency on classList, but paves the way for that to be a much simpler change. Refs: #14
1 parent abacefb commit 702dcfc

File tree

11 files changed

+162
-253
lines changed

11 files changed

+162
-253
lines changed

app/templates/src/assets/fabricator/scripts/fabricator.js

+4-69
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,9 @@ fabricator.options = {
1818
labels: true,
1919
notes: true,
2020
code: false
21-
},
22-
menu: false,
23-
mq: '(min-width: 60em)'
21+
}
2422
};
2523

26-
// open menu by default if large screen
27-
fabricator.options.menu = window.matchMedia(fabricator.options.mq).matches;
28-
2924
/**
3025
* Feature detection
3126
* @type {Object}
@@ -58,7 +53,7 @@ fabricator.dom = {
5853
root: document.querySelector('html'),
5954
primaryMenu: document.querySelector('.f-Nav'),
6055
menuItems: document.querySelectorAll('.f-Nav-item'),
61-
menuToggle: document.querySelector('.f-Masthead-control'),
56+
menuToggle: document.querySelector('.f-Nav-header-toggle'),
6257
labels: document.querySelectorAll('[data-f-toggle="labels"]'),
6358
notes: document.querySelectorAll('[data-f-toggle="notes"]'),
6459
code: document.querySelectorAll('[data-f-toggle="code"]')
@@ -155,37 +150,10 @@ fabricator.setActiveItem = function () {
155150
*/
156151
fabricator.menuToggle = function () {
157152

158-
// shortcut menu DOM
159-
var toggle = fabricator.dom.menuToggle;
160-
161-
var options = fabricator.getOptions();
162-
163-
// toggle classes on certain elements
164-
var toggleClasses = function () {
165-
options.menu = !fabricator.dom.root.classList.contains('f-is-active');
166-
fabricator.dom.root.classList.toggle('f-is-active');
167-
168-
if (fabricator.test.sessionStorage) {
169-
sessionStorage.setItem('fabricator', JSON.stringify(options));
170-
}
171-
};
172-
173-
// toggle classes on click
174-
toggle.addEventListener('click', function () {
175-
toggleClasses();
153+
fabricator.dom.menuToggle.addEventListener('click', function () {
154+
fabricator.toggleClass(fabricator.dom.primaryMenu, 'f-is-open');
176155
});
177156

178-
// close menu when clicking on item (for collapsed menu view)
179-
var closeMenu = function () {
180-
if (!window.matchMedia(fabricator.options.mq).matches) {
181-
toggleClasses();
182-
}
183-
};
184-
185-
for (var i = 0; i < fabricator.dom.menuItems.length; i++) {
186-
fabricator.dom.menuItems[i].addEventListener('click', closeMenu);
187-
}
188-
189157
return this;
190158

191159
};
@@ -272,46 +240,13 @@ fabricator.bindCodeAutoSelect = function () {
272240
};
273241

274242

275-
/**
276-
* Open/Close menu based on session var.
277-
* Also attach a media query listener to close the menu when resizing to smaller screen.
278-
*/
279-
fabricator.setInitialMenuState = function () {
280-
281-
// root element
282-
var root = document.querySelector('html');
283-
284-
var mq = window.matchMedia(fabricator.options.mq);
285-
286-
// if small screen
287-
var mediaChangeHandler = function (list) {
288-
if (!list.matches) {
289-
root.classList.remove('f-is-active');
290-
} else {
291-
if (fabricator.getOptions().menu) {
292-
root.classList.add('f-is-active');
293-
} else {
294-
root.classList.remove('f-is-active');
295-
}
296-
}
297-
};
298-
299-
mq.addListener(mediaChangeHandler);
300-
mediaChangeHandler(mq);
301-
302-
return this;
303-
304-
};
305-
306-
307243
/**
308244
* Initialization
309245
*/
310246
(function () {
311247

312248
// invoke
313249
fabricator
314-
.setInitialMenuState()
315250
.menuToggle()
316251
.singleItemToggle()
317252
.setActiveItem()

app/templates/src/assets/fabricator/styles/base/variables.css

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33

44
--Item-border: #ccc;
55

6-
--Nav-background: #444;
6+
--Nav-background: #fff;
77
--Nav-hover-background: #333;
8-
--Nav-color: #fff;
8+
--Nav-border: var(--Item-border);
9+
--Nav-active-color: inherit;
10+
--Nav-active-border: currentColor;
911

1012
--Label-inprogress: #ffd739;
1113
--Label-deprecated: #ff4136;

app/templates/src/assets/fabricator/styles/components/index.css

-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22
@import "./item";
33
@import "./label";
44
@import "./layout";
5-
@import "./masthead";
65
@import "./nav";
76
@import "./swatch";

app/templates/src/assets/fabricator/styles/components/layout.css

+18-56
Original file line numberDiff line numberDiff line change
@@ -3,68 +3,30 @@
33
margin: 0;
44
}
55

6-
.f-Layout.f-is-active {
7-
overflow: hidden;
8-
}
9-
10-
@media (--large-viewport) {
11-
.f-Layout.f-is-active {
12-
overflow: auto;
13-
}
14-
}
15-
16-
.f-Layout-body {
17-
position: relative;
6+
.f-Layout-nav,
7+
.f-Layout-body,
8+
.f-Layout-main {
189
margin: 0;
19-
}
20-
21-
.f-Layout.f-is-active .f-Layout-body {
22-
overflow: hidden;
23-
width: 100%;
24-
height: 100%;
10+
position: relative;
2511
}
2612

2713
@media (--large-viewport) {
28-
.f-Layout.f-is-active .f-Layout-body {
29-
overflow: auto;
14+
.f-Layout-nav {
15+
position: fixed;
16+
z-index: 1;
17+
top: 0;
18+
left: 0;
19+
overflow-x: hidden;
20+
overflow-y: auto;
21+
box-sizing: border-box;
22+
width: var(--Layout-nav-width);
23+
height: 100%;
24+
margin: 0;
25+
26+
-webkit-overflow-scrolling: touch;
3027
}
31-
}
32-
33-
.f-Layout-main {
34-
position: relative;
35-
z-index: 0;
36-
box-sizing: border-box;
37-
min-height: 100vh;
38-
margin: 0;
39-
}
4028

41-
.f-Layout.f-is-active .f-Layout-main {
42-
transform: translate(var(--Layout-nav-width), 0);
43-
}
44-
45-
@media (--large-viewport) {
46-
.f-Layout.f-is-active .f-Layout-main {
29+
.f-Layout-main {
4730
margin-left: var(--Layout-nav-width);
48-
transform: translate(0, 0);
4931
}
5032
}
51-
52-
.f-Layout-nav {
53-
position: fixed;
54-
z-index: 1;
55-
top: 0;
56-
left: 0;
57-
overflow-x: hidden;
58-
overflow-y: auto;
59-
box-sizing: border-box;
60-
width: var(--Layout-nav-width);
61-
height: 100%;
62-
margin: 0;
63-
transform: translate(calc(var(--Layout-nav-width) * -1), 0);
64-
65-
-webkit-overflow-scrolling: touch;
66-
}
67-
68-
.f-Layout.f-is-active .f-Layout-nav {
69-
transform: translate(0, 0);
70-
}

app/templates/src/assets/fabricator/styles/components/masthead.css

-29
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,112 @@
11
.f-Nav {
2-
color: var(--Nav-color);
3-
background-color: var(--Nav-background);
2+
background: var(--Nav-background);
3+
border-color: var(--Nav-border);
4+
border-style: solid;
5+
border-width: 0 0 1px;
6+
margin: 0;
7+
}
8+
9+
@media (--large-viewport) {
10+
.f-Nav {
11+
border-width: 0 1px 0 0;
12+
}
413
}
514

615
.f-Nav a,
716
.f-Nav a:matches(:focus, :hover, :active) {
817
text-decoration: none;
9-
color: inherit;
1018
}
1119

1220
.f-Nav-header {
13-
margin: 0.5rem 1rem;
21+
margin: 0;
22+
padding: 1rem;
23+
position: relative;
24+
}
25+
26+
.f-Nav-header-logo {
27+
font-weight: bold;
28+
margin: 0;
29+
}
30+
31+
.f-Nav-header-logo > img {
32+
vertical-align: bottom;
1433
}
1534

16-
.f-Nav-header svg {
17-
width: 2rem;
18-
height: 2rem;
35+
.f-Nav-header-toggle {
36+
background: transparent;
37+
border: 0;
38+
box-shadow: none;
39+
cursor: pointer;
40+
font: inherit;
41+
margin: -1.5em 0 0;
42+
padding: 1em;
43+
position: absolute;
44+
top: 50%;
45+
right: 0;
46+
}
47+
48+
.f-Nav.f-is-open .f-Nav-header-toggle {
49+
transform: rotate(180deg);
50+
}
51+
52+
@media (--large-viewport) {
53+
.f-Nav-header-toggle {
54+
display: none;
55+
}
56+
}
1957

58+
.f-Nav-header-toggle svg {
59+
display: block;
2060
fill: currentColor;
61+
height: 1em;
62+
opacity: 0.5;
63+
width: 1em;
64+
}
65+
66+
.f-Nav-main {
67+
display: none;
68+
margin: 0;
69+
}
70+
71+
.f-Nav.f-is-open .f-Nav-main {
72+
display: block;
73+
}
74+
75+
@media (--large-viewport) {
76+
.f-Nav-main {
77+
display: block;
78+
padding-bottom: 3rem; /* room for tota11y */
79+
}
2180
}
2281

2382
.f-Nav-menu {
24-
margin-top: 0;
25-
margin-bottom: 0;
26-
padding-left: 0;
83+
margin: 0 0 1rem;
84+
padding: 0;
2785
list-style: none;
2886
}
2987

88+
.f-Nav-menu .f-Nav-menu {
89+
margin-bottom: 0;
90+
}
91+
3092
.f-Nav-menu > li {
3193
margin: 0;
3294
}
3395

3496
.f-Nav-item {
97+
border-color: transparent;
98+
border-style: solid;
99+
border-width: 0 0 0 0.25rem;
35100
display: block;
36-
padding: 0.5rem 1rem;
37-
font-size: 0.75rem;
101+
padding: 0.5rem 1rem 0.5rem 0.75rem;
38102
}
39103

40104
.f-Nav-menu .f-Nav-menu .f-Nav-item {
41-
padding-left: 2rem;
105+
font-size: 0.875em;
106+
padding-left: 1.875rem;
42107
}
43108

44109
.f-Nav-item.f-is-active {
45-
box-shadow: 3px 0 0 var(--Nav-color) inset;
46-
}
47-
48-
.f-Nav-item:hover,
49-
.f-Nav-item:focus {
50-
background-color: var(--Nav-hover-background);
51-
}
52-
53-
.f-Nav-item--heading {
54-
margin-top: 0.75rem;
55-
font-size: 1rem;
56-
font-weight: 300;
57-
}
58-
59-
.f-Nav-footer {
60-
margin: 2rem 1rem 1rem;
61-
font-size: 0.75rem;
62-
opacity: 0.5;
110+
border-color: var(--Nav-active-border);
111+
color: var(--Nav-active-color);
63112
}

0 commit comments

Comments
 (0)