diff --git a/assets/js/theme/nav/mainMenu.js b/assets/js/theme/nav/mainMenu.js index 72aa6aed91540c33fb8534c308eee5a1c4a2f731..d6857e3a2d6051702503dc144d59fb5bb423907a 100644 --- a/assets/js/theme/nav/mainMenu.js +++ b/assets/js/theme/nav/mainMenu.js @@ -1,13 +1,24 @@ import breakpoints from '../utils/breakpoints'; +const CLASSES = { + mainMenuOpened: 'is-opened', + bodyOverlay: 'has-overlay', + scrollingDown: 'is-scrolling-down', + menusOpened: 'is-menu-opened', + sticky: 'is-sticky' +}; class MainMenu { - constructor () { - this.element = document.querySelector('nav[role="navigation"]'); + constructor (selector) { + this.element = document.querySelector(selector); this.menu = this.element.querySelector('.menu'); this.mainButton = this.element.querySelector('button'); this.dropdownsButtons = this.element.querySelectorAll('.has-children a[role="button"]'); - this.isOpened = false; - this.isActive = false; + + this.state = { + isOpened: false, + isActive: false, + previousScrollY: window.scrollY + }; this.listen(); } @@ -21,23 +32,47 @@ class MainMenu { this.toggleDropdown(button); }); }); + ['scroll', 'touchmove'].forEach(event => { + window.addEventListener(event, this.onScroll.bind(this)); + }); } resize () { - this.isActive = window.innerWidth <= breakpoints.md; + this.state.isActive = window.innerWidth <= breakpoints.md; } toggleMain () { - this.isOpened = !this.isOpened; - this.mainButton.setAttribute('aria-expanded', this.isOpened ? 'true' : 'false'); - this.menu.classList.toggle('show'); - document.body.classList.toggle('has-overlay'); + this.isOpened = !this.state.isOpened; + this.mainButton.setAttribute('aria-expanded', this.state.isOpened); + this.menu.classList.toggle(CLASSES.mainMenuOpened); + document.body.classList.toggle(CLASSES.bodyOverlay); } toggleDropdown (button) { - const expanded = button.getAttribute('aria-expanded') === 'true'; - button.setAttribute('aria-expanded', expanded ? 'false' : 'true'); + const isExpanded = button.getAttribute('aria-expanded') === 'true'; + button.setAttribute('aria-expanded', !isExpanded); + } + + onScroll () { + const offset = this.element.offsetHeight, + y = window.scrollY; + + console.log(y > offset); + + if (y > offset) { + this.element.classList.add(CLASSES.sticky); + } else { + this.element.classList.remove(CLASSES.sticky); + } + + if (y > this.state.previousScrollY && y > offset) { + document.documentElement.classList.add(CLASSES.scrollingDown); + } else { + document.documentElement.classList.remove(CLASSES.scrollingDown); + } + + this.state.previousScrollY = y; } } -export default new MainMenu(); +export default new MainMenu('header[role="banner"]'); diff --git a/assets/js/theme/nav/responsive.js b/assets/js/theme/nav/responsive.js index aca9dad135886028b177be88c9191fca3bf94675..6e287c1a56fad0013221ac4979ebed32d196b8cf 100644 --- a/assets/js/theme/nav/responsive.js +++ b/assets/js/theme/nav/responsive.js @@ -1,7 +1,7 @@ const events = ['load', 'resize']; let navBtn = document.querySelector('nav[role="navigation"] button'), menuHeader = document.querySelector('.menu'), - bodyOverlay = document.querySelector('body'), + bodyOverlay = document.querySelector('body'), // document.body dropdownBtns = document.querySelectorAll('.has-children a[role="button"]'), breckpointMd = 768, classMobile = 'show'; diff --git a/assets/js/theme/nav/stickyNav.js b/assets/js/theme/nav/stickyNav.js index 0598fc822651332964625a3487584ae8cb40c033..4f533aa4451f41f69406000613b72d0ef001d6fd 100644 --- a/assets/js/theme/nav/stickyNav.js +++ b/assets/js/theme/nav/stickyNav.js @@ -1,51 +1,51 @@ -const events = ['scroll', 'touchmove']; -let previousY = 0, - y = 0, - classSticky = 'is-sticky', - classScrollingDown = 'is-scrolling-down', - classMenuOpen = 'is-menu-open', - header = document.querySelector('header[role="banner"]'), - offset = header.offsetHeight, - dropdowns = header.querySelectorAll('[data-bs-toggle="dropdown"]'), - menu = header.querySelector('.menu'); +// const events = ['scroll', 'touchmove']; +// let previousY = 0, +// y = 0, +// classSticky = 'is-sticky', +// classScrollingDown = 'is-scrolling-down', +// classMenuOpen = 'is-menu-open', +// header = document.querySelector('header[role="banner"]'), +// offset = header.offsetHeight, +// dropdowns = header.querySelectorAll('[data-bs-toggle="dropdown"]'), +// menu = header.querySelector('.menu'); -dropdowns.forEach((dropdown) => { - dropdown.addEventListener('hidden.bs.dropdown', () => { - if (!header.querySelector('[aria-expanded="true"]')) { - document.documentElement.classList.remove(classMenuOpen); - } - }); - dropdown.addEventListener('show.bs.dropdown', () => { - document.documentElement.classList.add(classMenuOpen); - }); -}); +// // dropdowns.forEach((dropdown) => { +// // dropdown.addEventListener('hidden.bs.dropdown', () => { +// // if (!header.querySelector('[aria-expanded="true"]')) { +// // document.documentElement.classList.remove(classMenuOpen); +// // } +// // }); +// // dropdown.addEventListener('show.bs.dropdown', () => { +// // document.documentElement.classList.add(classMenuOpen); +// // }); +// // }); -menu.addEventListener('show.bs.collapse', () => { - document.documentElement.classList.add(classMenuOpen); -}); +// // menu.addEventListener('show.bs.collapse', () => { +// // document.documentElement.classList.add(classMenuOpen); +// // }); -menu.addEventListener('hide.bs.collapse', () => { - document.documentElement.classList.remove(classMenuOpen); -}); +// // menu.addEventListener('hide.bs.collapse', () => { +// // document.documentElement.classList.remove(classMenuOpen); +// // }); -events.forEach((event) => { - window.addEventListener(event, () => { - y = window.scrollY; +// events.forEach((event) => { +// window.addEventListener(event, () => { +// y = window.scrollY; - if (y > offset) { - header.classList.add(classSticky); - } else { - header.classList.remove(classSticky); - } +// if (y > offset) { +// header.classList.add(classSticky); +// } else { +// header.classList.remove(classSticky); +// } - if (y > previousY && y > offset) { - document.documentElement.classList.add(classScrollingDown); - // document.documentElement.style.setProperty(scrollMarginTop, '100px'); - } else { - document.documentElement.classList.remove(classScrollingDown); - // document.documentElement.style.setProperty(scrollMarginTop, '200px'); - } +// if (y > previousY && y > offset) { +// document.documentElement.classList.add(classScrollingDown); +// // document.documentElement.style.setProperty(scrollMarginTop, '100px'); +// } else { +// document.documentElement.classList.remove(classScrollingDown); +// // document.documentElement.style.setProperty(scrollMarginTop, '200px'); +// } - previousY = y; - }); -}); +// previousY = y; +// }); +// }); diff --git a/assets/sass/_theme/_configuration.sass b/assets/sass/_theme/_configuration.sass index 732ddfce7ee4b70a0557d2602efddec1ffde0aa8..12b503085d043ef0b625e6390e547ad76d106a61 100644 --- a/assets/sass/_theme/_configuration.sass +++ b/assets/sass/_theme/_configuration.sass @@ -65,6 +65,7 @@ $grid-gutter-sm: 20px $zindex-nav-accessibility: 1010 !default $zindex-stretched-link: 2 !default $zindex-header: 10 !default +$zindex-body-overlay: 9 !default // Header $header-color: $main-color !default diff --git a/assets/sass/_theme/design-system/layout.sass b/assets/sass/_theme/design-system/layout.sass index ca911e77fec38d12c852a6791a317f5135413787..28877a4d68c1939e3fbec0f73f98861618b38b1b 100644 --- a/assets/sass/_theme/design-system/layout.sass +++ b/assets/sass/_theme/design-system/layout.sass @@ -19,6 +19,7 @@ body display: block inset: 82px 0 0 0 position: fixed + z-index: $zindex-body-overlay main // Create padding-top for fixed header under md diff --git a/assets/sass/_theme/design-system/nav.sass b/assets/sass/_theme/design-system/nav.sass index beb9e644d1991d147a3461597d62816cd13bfa10..6d38a5628887ab1d3ffd31bc0ae8e33ceee78794 100644 --- a/assets/sass/_theme/design-system/nav.sass +++ b/assets/sass/_theme/design-system/nav.sass @@ -69,35 +69,36 @@ span font-size: px2rem(14) - &.show - flex-grow: 1 - display: block - a - text-decoration: none - .nav-level-1 - li - a - padding: 1rem 0 - > li:not(:last-child) - border-bottom: 1px solid #adb5bd - li.has-children - a[role="button"] - align-items: center - display: flex - justify-content: space-between - @include icon("caret-bottom", after) - &::after - font-size: .375rem - line-height: 1 - .dropdown-menu - display: none - padding-top: 0 - - a[aria-expanded=true] - @include icon("caret-top", after) + @include media-breakpoint-down(md) + &.is-opened + flex-grow: 1 + display: block + a + text-decoration: none + .nav-level-1 + li + a + padding: 1rem 0 + > li:not(:last-child) + border-bottom: 1px solid #adb5bd + li.has-children + a[role="button"] + align-items: center + display: flex + justify-content: space-between + @include icon("caret-bottom", after) + &::after + font-size: .375rem + line-height: 1 + .dropdown-menu + display: none + padding-top: 0 + + a[aria-expanded=true] + @include icon("caret-top", after) - + .dropdown-menu - display: block + + .dropdown-menu + display: block .share display: flex