Skip to content

Commit 52d8633

Browse files
authored
Learn css side nav (GoogleChrome#4892)
* comment editorconfig * svg icons for hamburger and close button * abstract default nav out * remove unresolved stuff * Fix overflow hidden bug when side nav is open * move hero banner styles into an actual stylesheet * style the side nav links * get last links to scroll into vieww * leftpad! * sidenav and header roughly working * the many states of the side nav buttons * Get default drawer working again * Dismiss is working again. * Add standard drawer type and clean up css for navs * wip * sticky headers * wire up sticky header * rough impl of drawer hover effect * add background image * add gradient text * remove app-bar background * Add header styles * Hack in some scrollbar nastiness * wip * checkpoint * min/max breakpoint working * simplify course nav * Add translated course title * Make header use BaseStateElement * Remove Live from default drawer * localize header buttons * localize close button * add scrollbar back to side toc * rename course-nav to drawer-course * localize close button * use flexbox instead of hardcoding vh on drawer links * Add configurable backgrounds * remove unused breakpoint on course body
1 parent 59d814e commit 52d8633

50 files changed

Lines changed: 1008 additions & 795 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1+
# https://EditorConfig.org
2+
3+
# top-most EditorConfig file
14
root = true
25

6+
# Make sure every file:
7+
# - Uses utf-8
8+
# - Indents with spaces instead of tabs
9+
# - Uses two space indents
10+
# - Uses Unix-style newlines
11+
# - Has a newline at the end of every file
12+
# - Trims trailing whitespace
313
[*]
14+
charset = utf-8
415
indent_style = space
516
indent_size = 2
617
end_of_line = lf
7-
charset = utf-8
8-
trim_trailing_whitespace = true
918
insert_final_newline = true
19+
trim_trailing_whitespace = true

.eleventy.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ const stripBlog = require(`./${filtersDir}/strip-blog`);
8989
const stripQueryParamsDev = require(`./${filtersDir}/strip-query-params-dev`);
9090
const getPaths = require(`./${filtersDir}/get-paths`);
9191
const navigation = require(`./${filtersDir}/navigation`);
92+
const padStart = require(`./${filtersDir}/pad-start`);
9293

9394
const transformsDir = 'src/site/_transforms';
9495
const disableLazyLoad = require(`./${transformsDir}/disable-lazy-load`);
@@ -209,6 +210,7 @@ module.exports = function (config) {
209210
config.addFilter('strip', strip);
210211
config.addFilter('courseToc', courseToc);
211212
config.addFilter('updateSvgForInclude', updateSvgForInclude);
213+
config.addFilter('padStart', padStart);
212214

213215
// ----------------------------------------------------------------------------
214216
// SHORTCODES

src/images/courses/learn-css.svg

Lines changed: 1 addition & 0 deletions
Loading

src/lib/actions.js

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -124,41 +124,58 @@ export const requestFetchReports = store.action((_, url, startDate) => {
124124
});
125125
});
126126

127-
export const expandSideNav = store.action(() => {
128-
openModal();
129-
return {isSideNavExpanded: true};
127+
/**
128+
* Inert the page so scrolling and pointer events are disabled.
129+
* This is used when we open the navigation drawer or show a modal dialog.
130+
*/
131+
const disablePage = () => {
132+
/** @type {HTMLElement|object} */
133+
const main = document.querySelector('main') || {};
134+
/** @type {HTMLElement|object} */
135+
const header = document.querySelector('web-header') || {};
136+
/** @type {HTMLElement|object} */
137+
const footer = document.querySelector('.w-footer') || {};
138+
139+
document.documentElement.classList.add('overflow-hidden');
140+
main.inert = true;
141+
header.inert = true;
142+
footer.inert = true;
143+
};
144+
145+
/**
146+
* Uninert the page so scrolling and pointer events work again.
147+
*/
148+
const enablePage = () => {
149+
/** @type {HTMLElement|object} */
150+
const main = document.querySelector('main') || {};
151+
/** @type {HTMLElement|object} */
152+
const header = document.querySelector('web-header') || {};
153+
/** @type {HTMLElement|object} */
154+
const footer = document.querySelector('.w-footer') || {};
155+
156+
document.documentElement.classList.remove('overflow-hidden');
157+
main.inert = false;
158+
header.inert = false;
159+
footer.inert = false;
160+
};
161+
162+
export const openNavigationDrawer = store.action(() => {
163+
disablePage();
164+
return {isNavigationDrawerOpen: true};
130165
});
131166

132-
export const collapseSideNav = store.action(() => {
133-
closeModal();
134-
return {isSideNavExpanded: false};
167+
export const closeNavigationDrawer = store.action(() => {
168+
enablePage();
169+
return {isNavigationDrawerOpen: false};
135170
});
136171

137172
export const openModal = store.action(() => {
138-
const main = document.querySelector('main');
139-
/** @type import('./components/Header').Header */
140-
const header = document.querySelector('web-header');
141-
/** @type {HTMLElement} */
142-
const footer = document.querySelector('.w-footer');
143-
144-
document.documentElement.classList.add('web-modal__overflow-hidden');
145-
main.inert = true;
146-
header.inert = true;
147-
footer.inert = true;
173+
disablePage();
148174
return {isModalOpen: true};
149175
});
150176

151177
export const closeModal = store.action(() => {
152-
const main = document.querySelector('main');
153-
/** @type import('./components/Header').Header */
154-
const header = document.querySelector('web-header');
155-
/** @type {HTMLElement} */
156-
const footer = document.querySelector('.w-footer');
157-
158-
document.documentElement.classList.remove('web-modal__overflow-hidden');
159-
main.inert = false;
160-
header.inert = false;
161-
footer.inert = false;
178+
enablePage();
162179
return {isModalOpen: false};
163180
});
164181

src/lib/components/BaseModalElement/_styles.scss

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
$MODAL_CONTENT_PADDING: 1.5rem;
44
$MODAL_ANIMATION_DURATION: 150ms;
55

6-
.web-modal__overflow-hidden {
7-
overflow: hidden;
8-
}
9-
106
@keyframes fadein {
117
0% {
128
opacity: 0;

src/lib/components/Header/index.js

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,33 @@
1515
*/
1616

1717
/**
18-
* @fileoverview A responsive header that can trigger a side-nav.
18+
* @fileoverview A responsive header that can trigger a navigation drawer.
1919
*
2020
* This does not inherit from BaseStateElement as it is not a LitElement.
2121
*/
2222

2323
import {store} from '../../store';
24-
import {expandSideNav} from '../../actions';
24+
import {openNavigationDrawer} from '../../actions';
25+
import {BaseStateElement} from '../BaseStateElement';
2526

26-
export class Header extends HTMLElement {
27+
export class Header extends BaseStateElement {
2728
constructor() {
2829
super();
29-
30-
this.onStateChanged = this.onStateChanged.bind(this);
3130
}
3231

3332
connectedCallback() {
33+
super.connectedCallback();
3434
/** @type HTMLButtonElement */
35-
this.hamburgerBtn = this.querySelector('.web-header__hamburger-btn');
36-
this.hamburgerBtn.classList.remove('unresolved');
37-
this.hamburgerBtn.addEventListener('click', expandSideNav);
38-
39-
store.subscribe(this.onStateChanged);
35+
this.openDrawerBtn = this.querySelector('[data-open-drawer-button]');
36+
if (this.openDrawerBtn) {
37+
this.openDrawerBtn.addEventListener('click', openNavigationDrawer);
38+
}
4039
}
4140

4241
disconnectedCallback() {
43-
this.hamburgerBtn.removeEventListener('click', expandSideNav);
42+
if (this.openDrawerBtn) {
43+
this.openDrawerBtn.removeEventListener('click', openNavigationDrawer);
44+
}
4445

4546
store.unsubscribe(this.onStateChanged);
4647
}
@@ -72,12 +73,14 @@ export class Header extends HTMLElement {
7273
}
7374

7475
/**
75-
* This is called by the SideNav to return focus to this control when the
76-
* user closes the SideNav.
76+
* This is called by the NavigationDrawer to return focus to this control when
77+
* the user closes the NavigationDrawer.
7778
* This is important for accessibility.
7879
*/
7980
manageFocus() {
80-
this.hamburgerBtn.focus();
81+
if (this.openDrawerBtn) {
82+
this.openDrawerBtn.focus();
83+
}
8184
}
8285
}
8386

0 commit comments

Comments
 (0)