media/css/m24/components/navigation-refresh.scss (556 lines of code) (raw):

// This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. @use '../vars/lib' as *; $margin-top: 54px; // top margin offset for mobile navigation menu @keyframes nav-slide-in { from { transform: translateX(100%); } to { transform: translateX(0); } } @keyframes nav-slide-in-reverse { from { transform: translateX(-100%); } to { transform: translateX(0); } } .m24-navigation-refresh { background-color: $color-white; border-bottom: $border-width solid $m24-color-light-mid-gray; display: flex; width: 100%; @media #{$mq-md} { display: block; } } // * -------------------------------------------------------------------------- */ // Sticky navigation styles @supports (position: sticky) { html.mzp-has-sticky-navigation { .m24-navigation-refresh.m24-mzp-is-sticky { position: sticky; z-index: 1000; left: 0; top: 0; @include transition(transform 300ms ease-in-out, box-shadow 300ms ease-in-out); &.mzp-is-scrolling { // Shadow colors are equivalent to $color-ink-90, $color-blue-90, $color-ink-90 // We can't use a $box-shadow token here because it needs a different size and offset box-shadow: 0 0 6px 1px rgba(29, 17, 51, 0.04), 0 0 8px $border-width rgba(9, 32, 77, 0.12), 0 0 5px -3px rgba(29, 17, 51, 0.12); } &.mzp-is-hidden { @include transform(translate(0, -110%)); } @media (prefers-reduced-motion: reduce) { position: static; } } } } // Common navigation styles .m24-c-navigation-l-content { display: flex; padding: $spacer-xs $spacer-md; position: relative; width: 100%; @media #{$mq-md} { display: block; padding: $spacer-sm 0 0; width: auto; } } .m24-c-navigation-container { margin: 0 auto; max-width: $content-max; padding: 0; position: relative; width: 100%; @media #{$mq-md} { align-items: start; display: flex; flex-direction: row; justify-content: space-between; position: static; padding: 0 $container-padding; box-sizing: border-box; } } // Mobile navigation menu button. .m24-c-navigation-menu-button { display: none; } .js .m24-c-navigation-menu-button { background-color: transparent; border: none; color: $color-black; display: block; float: right; font-weight: 600; height: 32px; margin: 4px 0 0; padding: 0; position: relative; text-decoration: underline; text-underline-offset: 2px; text-decoration-thickness: 1px; &.mzp-is-active { background: transparent url('/media/protocol/img/icons/close.svg') center center no-repeat; width: 40px; @include image-replaced; &::after { content: none; } } @media #{$mq-md} { display: none; margin: 24px 0; } } [dir='rtl'].js .m24-c-navigation-menu-button { float: left; } .m24-c-navigation-logo-link { display: inline-block; } .m24-c-navigation-logo-image { height: 27px; width: auto; padding-top: $spacing-xs; @media #{$mq-md} { height: 24px; padding: 0; } } .spacer-gif { display: inline-block; width: 100px; } // Mobile navigation menu with JS enabled. .js .m24-c-navigation-items { display: none; @media (max-width: $screen-md) { &.mzp-is-open { display: flex; height: calc(100vh - $margin-top); margin-top: $margin-top; overflow: hidden auto; padding-top: 0; position: fixed; right: 0; top: 0; width: 100%; z-index: 100; @include bidi(((animation, nav-slide-in 0.45s ease, nav-slide-in-reverse 0.45s ease),)); @media (prefers-reduced-motion: reduce) { @include bidi(((animation, none, none),)); } .m24-c-menu-category-list:has(.m24-c-menu-category.mzp-is-selected) { margin-bottom: 0; .m24-c-menu-category:not(.mzp-is-selected) { display: none; } } } } @media #{$mq-md} { display: block; } } .m24-c-navigation-menu { margin-bottom: 0; width: 100%; @media #{$mq-md} { border-top: transparent; width: auto; } } // Basic hover interactions with JavaScript disabled or not supported. .m24-c-menu.m24-mzp-is-basic .m24-c-menu-category { @media #{$mq-md} { &.mzp-has-drop-down:hover, &.mzp-has-drop-down:focus { .m24-c-menu-panel { display: block; } } &.mzp-has-drop-down:focus-within { .m24-c-menu-panel { display: block; } } } } // Enhanced hover interactions with JavaScript enabled. .m24-c-menu.m24-mzp-is-enhanced .m24-c-menu-category { &.mzp-is-selected { border-bottom: transparent; .m24-c-menu-title { @include bidi(((padding-left, $spacing-md, padding-right, $spacing-md),)); &::before { content: '/'; padding: 0 $spacing-xs; } } .m24-c-menu-panel { display: block; @include bidi(((animation, nav-slide-in 450ms ease, nav-slide-in-reverse 450ms ease),)); @media (prefers-reduced-motion: reduce) { @include bidi(((animation, none, none),)); } } } // Arrow styles for mobile menu items. &::after { background: transparent url('/media/img/icons/m24-small/up-arrow.svg') center center no-repeat; content: ''; height: 20px; position: absolute; top: 8px; width: 20px; @include bidi(( (transform, rotate(90deg), rotate(-90deg)), (right, 8px, left, auto), )); @include background-size(16px, 16px); } &.mzp-is-selected::after { @include bidi(( (transform, rotate(-90deg), rotate(90deg)), (left, 8px, right, auto), )); } @media #{$mq-md} { &.mzp-is-selected { .m24-c-menu-button-close { display: block; } .m24-c-menu-title { color: $m24-color-dark-green; @include bidi(((padding-left, 0, padding-right, 0),)); &::before { content: none; display: none; } } &::after { background: $m24-color-dark-green; } .m24-c-menu-panel { @include bidi(((animation, none, none),)); } } &::after { display: none; } } } .m24-c-menu-category-list { padding: 0; margin-bottom: 0; position: relative; @media #{$mq-md} { position: static; display: flex; justify-content: space-between; } } .m24-c-menu-category { border-bottom: $border-width solid $token-color-light-gray; border-top: none; padding: 8px 16px; position: relative; width: calc(100% - 32px); z-index: 1000; @media #{$mq-md} { border-bottom: transparent; padding: 0 $spacer-md $spacer-sm; position: static; width: auto; } &.m24-c-menu-category-has-icon { .m24-c-menu-title-icon { @include bidi(((margin, 0 8px 0 0, 0 0 0 8px),)); } .m24-c-menu-title { @media #{$mq-md} { &:hover::after { bottom: 1px; width: calc(100% - 24px); @include bidi(((left, 24px, right, auto),)); } } } } } .m24-c-menu-title { align-items: center; border: none; color: $color-black; display: flex; font-size: $text-body-md; font-weight: 600; padding: 0; position: relative; text-decoration: none; width: 100%; // extra specificity to override link colors on some Firefox pages &:link, &:visited { color: $color-black; text-decoration: none; } &:hover:is(a) { color: $color-black; } .m24-c-menu-title-icon { @include bidi(((margin, 0 8px 0 0, 0 0 0 8px),)); } @media #{$mq-md} { &:hover::after { background: $color-black; bottom: 1px; content: ""; display: block; height: 1px; left: 0; position: absolute; width: 100%; } } } .m24-c-menu-panel { background-color: $color-white; color: $color-black; height: auto; overflow: hidden auto; width: 100%; z-index: 1000; @include border-box; @media #{$mq-md} { border: $border-width solid $m24-color-light-mid-gray; border-top: $border-width solid $m24-color-white; left: 50%; margin: 0 auto; overflow: auto; padding: 0; position: absolute; right: auto; top: 100%; width: calc(680px + $grid-gutter); // at 1440px this makes the width 6 columns plus 1/2 a gutter transform: translateX(-50%); .mzp-is-scrolling & { // copied from the parent .mzp-is-scrolling definition, but edited to move it down so it doesn't appear to hover over top of the parent menu box-shadow: 0 6px 6px 1px rgba(29, 17, 51, 0.04), 0 8px 8px $border-width rgba(9, 32, 77, 0.12), 0 5px 5px -3px rgba(29, 17, 51, 0.12); } } } .m24-mzp-is-basic .m24-c-menu-panel { display: block; @media #{$mq-md} { display: none; } } .m24-mzp-is-enhanced .m24-c-menu-panel { display: none; } .m24-c-menu-panel .m24-c-menu-panel-container { margin: 0 auto; max-width: $content-max; @media #{$mq-md} { padding: $spacer-lg 0; } } .m24-c-menu-item-title { font-family: var(--body-font-family); font-size: $text-body-md; font-weight: 600; margin-bottom: 0; } .m24-c-menu-item { max-width: 100%; padding: 0; @media #{$mq-md} { width: auto; } .m24-c-menu-item-link { align-items: center; display: flex; padding: 8px 0; text-decoration: none; width: 100%; &:link, &:visited { text-decoration: none; } .m24-c-menu-item-title { border: none; position: relative; } } } .m24-c-menu-item .m24-c-menu-item-link .m24-c-menu-item .m24-c-menu-item-link:link, .m24-c-menu-item .m24-c-menu-item-link:visited { text-decoration: none; .m24-c-menu-item-title { border: none; } svg path { fill: $color-black; } } .m24-c-menu-item .m24-c-menu-item-link:hover, .m24-c-menu-item .m24-c-menu-item-link:visited:hover { .m24-c-menu-item-title { color: $m24-color-dark-green; border: none; &::after { background: $m24-color-dark-green; bottom: 1px; content: ""; display: block; height: 1px; left: 0; position: absolute; width: 100%; } } svg path { fill: $m24-color-dark-green; } } .m24-c-menu-panel-content.multi-column { @media #{$mq-md} { display: flex; padding: 0 $grid-margin; column-gap: $spacer-lg; margin: 0 auto; } .m24-mzp-l-content-container { margin-top: $spacer-xl; @media #{$mq-md} { margin-top: 0; } p { margin-bottom: $spacer-sm; color: #6d6d6d; font-size: $text-body-sm; font-weight: 600; } } } .m24-c-menu-panel .m24-c-menu-panel-content > .m24-mzp-l-content { display: flex; flex-direction: column; margin: 0 auto; padding: $spacer-md $grid-margin; max-width: $content-max; @media #{$mq-md} { padding: 0 $grid-margin; } & > li { border-bottom: $border-width solid transparent; width: 100%; @media #{$mq-md} { border-bottom: $border-width solid $token-color-light-gray; } .m24-c-menu-item { border-bottom: transparent; } } } .m24-c-menu-panel .m24-c-menu-category-link { border: none; display: flex; font-size: $text-body-md; justify-content: flex-end; margin: $spacer-lg $spacer-lg 0; padding: 0; } .m24-c-menu-panel .m24-c-menu-category-link a, .m24-c-menu-panel .m24-c-menu-category-link a:visited, .m24-c-menu-panel .m24-c-menu-category-link a:link { border: none; color: $color-black; display: flex; font-weight: 600; position: relative; text-decoration: none; width: fit-content; svg { @include bidi(( (left, auto, 0), (margin-left, $spacing-xs, 0), (margin-right, 0, $spacing-xs), (right, 0, auto), (transition-property, right, left), (transform, none, rotate(-180deg)), )); height: 0.8em; position: relative; top: 0.15em; transition-duration: $fast; transition-timing-function: $bezier; width: auto; } } .m24-c-menu-panel .m24-c-menu-category-link a:hover, .m24-c-menu-panel .m24-c-menu-category-link a:focus { color: $m24-color-dark-green; svg { @include bidi(( (right, -$spacing-sm, auto), (left, auto, -$spacing-sm), )); } } .mzp-has-icon .m24-c-menu-item-link { @include bidi(((padding-right, 0, 0), (padding-left, 0, 0))); .m24-c-menu-item-icon { height: 16px; width: 16px; @include bidi(((padding-right, 8px, 0), (padding-left, 0, 8px))); } } .mzp-has-icon.m24-c-menu-item .m24-c-menu-item-link, .mzp-has-icon.m24-c-menu-item .m24-c-menu-item-link:link, .mzp-has-icon.m24-c-menu-item .m24-c-menu-item-link:active, .mzp-has-icon.m24-c-menu-item .m24-c-menu-item-link:visited { .m24-c-menu-item-title { border: none; font-weight: 600; position: relative; text-decoration: none; } } .mzp-has-icon.m24-c-menu-item .m24-c-menu-item-link:hover, .mzp-has-icon.m24-c-menu-item .m24-c-menu-item-link:visited:hover { .m24-c-menu-item-title { border: none; text-decoration: none; &::after { background: $m24-color-dark-green; } } } // Menu panel close button shown on desktop sized view ports. .m24-c-menu-button-close { @include bidi(((right, 15px, left, auto), (left, auto, right, 15px))); @include image-replaced; background: $color-white url('/media/protocol/img/icons/close.svg') center center no-repeat; @include background-size(20px, 20px); border: $border-width solid transparent; cursor: pointer; display: none; height: 24px; padding: var(--spacer-xs); position: absolute; top: 15px; width: 24px; transition: border-color $fast $bezier; &:hover, &:focus { border-color: $m24-color-mid-gray; } } // page content - hide all content except for the nav when mobile nav menu is open // This is not part of Protocol, it is specifc to Bedrock; should be documented in future body:has(.m24-c-navigation-items.mzp-is-open) { & > .m24-pencil-banner, & > .c-sub-navigation, & > .moz-consent-banner.is-visible, & > .c-banner.c-banner-is-visible, & > #outer-wrapper { display: none !important; /* stylelint-disable-line declaration-no-important */ @media #{$mq-md} { display: block !important; /* stylelint-disable-line declaration-no-important */ } } }