// Site navigation desktop layout // The main layout for the website navigation, for a desktop devices only. // Settings $absolute-navigation: true; $use-dropdown-bubble: true; $use-dropdown-toggle-animation: true; // CSS variables // These can be adjusted with media queries for in-between breakpoints :root { // Dimensions, gaps and spacings --border-radius-sub-menu: 0; --box-shadow-navigation-static: 0 0 10px rgba(84, 87, 115, .1); --dropdown-toggle-size: 12px; --gap-dropdown: 1rem; --gap-between-dropdown-toggle: 1.5rem; --padding-main-level-vertical: .6rem; --padding-main-level-horizontal: 2rem; --padding-sub-menu-vertical: .6rem; --padding-sub-menu-horizontal: 1.5rem; --width-sub-menu: 22rem; // Colors --color-background-nav-desktop: var(--color-white); --color-background-sub-menu: var(--color-white); --color-border-sub-menu: rgba(41, 44, 61, .05); --color-dropdown-toggle: var(--color-valhalla); --color-sub-menu: var(--color-valhalla); --color-hover-main-level: var(--color-white); --color-hover-sub-menu: var(--color-valhalla); --color-main-level: var(--color-white); --color-current: var(--color-main); // Font styles --font-size-main-level: 17px; --font-size-sub-menu: 16px; --font-weight-main-level: var(--font-weight-bold); --font-weight-sub-menu: var(--font-weight-regular); } // General navigation resets .site-header ul { list-style: none; } @media only screen and (min-width: $width-max-mobile) { .nav-container { @if $absolute-navigation == false { background-color: var(--color-background-nav-desktop); box-shadow: var(--box-shadow-navigation-static); position: relative; z-index: 222; } @if $absolute-navigation == true { background-color: transparent; position: absolute; width: 100%; } } @media only screen and (max-width: $width-max-mobile) { ul li:focus > ul, ul li:hover > ul { display: block; } } // Disable animations on IE10 + IE11 @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { // Enable hovers ul li:focus > ul, ul li:hover > ul { display: block; } } // Need to use display: none here to make sure mobile nav-toggle is visually hidden on desktop /* stylelint-disable a11y/no-display-none */ .nav-toggle { display: none; } /* stylelint-enable */ // Navigation wrapper .nav-primary { padding-bottom: 0; padding-top: 0; } // Navigation unordered list wrapper element .menu-items { align-items: center; background-color: transparent; display: flex; margin: 0; padding: 0; position: relative; } // Navigation list item .menu-item { margin: 0; position: relative; } // Menu items .menu-item > a { align-items: center; color: var(--color-main-level); display: inline-flex; font-size: var(--font-size-main-level); font-weight: var(--font-weight-main-level); padding-bottom: var(--padding-main-level-vertical); padding-left: var(--padding-main-level-horizontal); padding-right: var(--padding-main-level-horizontal); padding-top: var(--padding-main-level-vertical); } .menu-item .sub-menu a { align-items: center; color: var(--color-sub-menu); display: flex; font-size: var(--font-size-sub-menu); font-weight: var(--font-weight-sub-menu); line-height: 1.5; padding-bottom: var(--padding-sub-menu-vertical); padding-left: var(--padding-sub-menu-horizontal); padding-right: var(--padding-sub-menu-horizontal); padding-top: var(--padding-sub-menu-vertical); } // Current menu item color .menu-item.current-menu-parent > a, .menu-item.current-menu-item > a { color: var(--color-current); } // Let's make space for the nav-toggle/arrow .menu-item.menu-item-has-children a { padding-bottom: 0; padding-right: var(--gap-between-dropdown-toggle); padding-top: 0; transition: padding .2s cubic-bezier(.19, 1, .22, 1), background-color .2s cubic-bezier(.19, 1, .22, 1); } .menu-item > a:hover, .menu-item > a:focus { color: var(--color-hover-main-level); } .menu-item .sub-menu a:hover, .menu-item .sub-menu a:focus { color: var(--color-hover-sub-menu); } // Create animation illusion /* stylelint-disable no-descending-specificity */ .sub-menu.toggled-on a, .sub-menu.toggled-on .sub-menu a, .menu-item.menu-item-has-children:hover .sub-menu a, .menu-item.menu-item-has-children:focus .sub-menu a { padding-bottom: var(--padding-sub-menu-vertical); padding-top: var(--padding-sub-menu-vertical); } /* stylelint-enable */ .nav-primary > ul:first-of-type > .menu-item-has-children:focus::before, .nav-primary > ul:first-of-type > .menu-item-has-children:hover::before { transform: scale(1); transition: all .2s cubic-bezier(.19, 1, .22, 1); } // Dropdowns .sub-menu { background-color: var(--color-background-sub-menu); border-bottom: 1px solid var(--color-border-sub-menu); border-bottom-left-radius: var(--border-radius-sub-menu); border-bottom-right-radius: var(--border-radius-sub-menu); border-left: 1px solid var(--color-border-sub-menu); border-right: 1px solid var(--color-border-sub-menu); border-top-left-radius: var(--border-radius-sub-menu); border-top-right-radius: var(--border-radius-sub-menu); box-shadow: 0 25px 20px -10px rgba(5, 4, 25, .05); left: 5%; margin-left: 0; margin-top: var(--gap-dropdown); opacity: 0; padding-bottom: .5rem; padding-left: 0; padding-top: .5rem; position: absolute; top: -9999px; transition: padding .2s cubic-bezier(.19, 1, .22, 1); visibility: hidden; width: var(--width-sub-menu); z-index: 9; // All dropdowns in level 2 and after .sub-menu { left: 100%; margin-left: 0; margin-top: -5px; top: 0; } li { float: none; padding: 0; width: var(--width-sub-menu); } } // This is where the magic happens .menu-item-has-children > .sub-menu.toggled-on, .menu-item-has-children:focus > .sub-menu, .menu-item-has-children:hover > .sub-menu { // If you want to use "out"-animation, add this: // .menu-item-has-children.hover-intent > .sub-menu { opacity: 1; top: 100%; transform: translateY(0%); visibility: visible; z-index: 1; } .menu-item-has-children .sub-menu.toggled-on .sub-menu, .menu-item-has-children .sub-menu .sub-menu.toggled-on, .menu-item-has-children:focus .sub-menu .sub-menu, .menu-item-has-children:hover .sub-menu .sub-menu { margin-top: -5px; top: 0; z-index: 10; } // Sub menu items that have items under them .menu-item.menu-item-has-children { align-items: center; display: flex; justify-content: space-between; margin-right: .8rem; position: relative; // Add a pseudo element to fill the gap // between menu item and sub menu to help hovering &::after { content: ''; display: block; height: var(--gap-dropdown); position: absolute; top: 100%; width: 100%; } } // Toggle icon dimensions on desktop .dropdown-toggle svg { height: var(--dropdown-toggle-size); width: var(--dropdown-toggle-size); @if $use-dropdown-toggle-animation == true { transition: all .35s cubic-bezier(.19, 1, .22, 1); } } // Main level toggle icon .dropdown-toggle.toggled-on svg { transform: rotateX(180deg); } .dropdown-toggle { align-items: center; background-color: transparent; border: 0; color: var(--color-dropdown-toggle); display: inline-flex; justify-content: center; padding: 0; } // Sub-menu toggle icon .sub-menu .dropdown-toggle { width: 3rem; } .sub-menu .dropdown-toggle svg { transform: rotate(-90deg) rotateX(0deg); } .sub-menu .dropdown-toggle.toggled-on svg { transform: rotate(-90deg) rotateX(180deg); } // Smooth animation @if $use-dropdown-toggle-animation == true { .menu-item.menu-item-has-children > .dropdown-toggle.toggled-on svg, .menu-item.menu-item-has-children:hover > .dropdown-toggle svg, .menu-item.menu-item-has-children:focus > .dropdown-toggle svg { transform: translateY(0%) rotate(180deg); } // Smooth animation /* stylelint-disable selector-max-specificity, selector-max-class */ .menu-item.menu-item-has-children .menu-item.menu-item-has-children > .dropdown-toggle.toggled-on svg, .menu-item.menu-item-has-children .menu-item.menu-item-has-children:hover > .dropdown-toggle svg, .menu-item.menu-item-has-children .menu-item.menu-item-has-children:focus > .dropdown-toggle svg { transform: translateY(0%) rotate(90deg); } /* stylelint-enable */ } // Don't use gap filler in sub menu items // Acceptable use of display: none here, for visual/technical purposes /* stylelint-disable a11y/no-display-none */ .sub-menu .menu-item-has-children::after { display: none; } /* stylelint-enable */ // Dropdown bubble @if $use-dropdown-bubble == true { .menu-item-has-children::before { // Use of non-variable is acceptable here because bubble needs it /* stylelint-disable sh-waqar/declaration-use-variable */ border-color: transparent transparent var(--color-white); border-style: solid; border-width: 0 5px 5px; /* stylelint-enable */ bottom: -10px; content: ''; display: block; height: 0; left: 50%; margin-left: -20px; position: absolute; transform: scale(0); transform-origin: center bottom; transition: none; width: 0; } } } // @media only screen and (min-width: $width-max-mobile)