UNPKG

uikit

Version:

UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.

668 lines (528 loc) • 18.4 kB
// Name: Navbar // Description: Component to create horizontal navigation bars // // Component: `uk-navbar` // // Sub-objects: `uk-navbar-container` // `uk-navbar-left` // `uk-navbar-right` // `uk-navbar-center` // `uk-navbar-center-left` // `uk-navbar-center-right` // `uk-navbar-nav` // `uk-navbar-parent-icon` // `uk-navbar-item` // `uk-navbar-toggle` // `uk-navbar-subtitle` // `uk-navbar-dropbar` // // Adopted: `uk-navbar-dropdown` + Modifiers // `uk-navbar-dropdown-nav` // `uk-navbar-toggle-icon` // // Modifiers: `uk-navbar-primary` // `uk-navbar-transparent` // `uk-navbar-sticky` // // States: `uk-active` // `uk-parent` // `uk-open` // // ======================================================================== // Variables // ======================================================================== @navbar-background: @global-muted-background; @navbar-gap: 0px; // Must have a unit because of `calc` @navbar-color-mode: dark; @navbar-nav-gap: 0px; // Must have a unit because of `calc` @navbar-nav-item-height: 80px; @navbar-nav-item-padding-horizontal: 15px; @navbar-nav-item-color: @global-muted-color; @navbar-nav-item-font-size: @global-font-size; @navbar-nav-item-font-family: @global-font-family; @navbar-nav-item-hover-color: @global-color; @navbar-nav-item-onclick-color: @global-emphasis-color; @navbar-nav-item-active-color: @global-emphasis-color; @navbar-parent-icon-margin-left: 4px; @navbar-item-padding-horizontal: 15px; @navbar-item-color: @global-color; @navbar-toggle-color: @global-muted-color; @navbar-toggle-hover-color: @global-color; @navbar-subtitle-font-size: @global-small-font-size; @navbar-dropdown-margin: 0; @navbar-dropdown-shift-margin: 0; @navbar-dropdown-viewport-margin: 15px; @navbar-dropdown-width: 200px; @navbar-dropdown-padding: 15px; @navbar-dropdown-background: @global-muted-background; @navbar-dropdown-color: @global-color; @navbar-dropdown-color-mode: dark; @navbar-dropdown-focus-outline: @base-focus-outline; @navbar-dropdown-grid-gutter-horizontal: @global-gutter; @navbar-dropdown-grid-gutter-vertical: @navbar-dropdown-grid-gutter-horizontal; @navbar-dropdown-large-shift-margin: 0; @navbar-dropdown-large-padding: 40px; @navbar-dropdown-dropbar-margin: 0; @navbar-dropdown-dropbar-shift-margin: 0; @navbar-dropdown-dropbar-padding-top: @navbar-dropdown-padding; @navbar-dropdown-dropbar-padding-bottom: @navbar-dropdown-dropbar-padding-top; @navbar-dropdown-dropbar-viewport-margin: 15px; @navbar-dropdown-dropbar-viewport-margin-s: @global-gutter; @navbar-dropdown-dropbar-viewport-margin-m: @global-medium-gutter; @navbar-dropdown-dropbar-large-shift-margin: 0; @navbar-dropdown-dropbar-large-padding-top: @navbar-dropdown-large-padding; @navbar-dropdown-dropbar-large-padding-bottom: @navbar-dropdown-dropbar-large-padding-top; @navbar-dropdown-nav-item-color: @global-muted-color; @navbar-dropdown-nav-item-hover-color: @global-color; @navbar-dropdown-nav-item-active-color: @global-emphasis-color; @navbar-dropdown-nav-subtitle-font-size: @global-small-font-size; @navbar-dropdown-nav-header-color: @global-emphasis-color; @navbar-dropdown-nav-divider-border-width: @global-border-width; @navbar-dropdown-nav-divider-border: @global-border; @navbar-dropdown-nav-sublist-item-color: @global-muted-color; @navbar-dropdown-nav-sublist-item-hover-color: @global-color; @navbar-dropdown-nav-sublist-item-active-color: @global-emphasis-color; /* ======================================================================== Component: Navbar ========================================================================== */ /* * 1. Create position context to center navbar group */ .uk-navbar { display: flex; /* 1 */ position: relative; .hook-navbar(); } /* Container ========================================================================== */ .uk-navbar-container:not(.uk-navbar-transparent) { background: @navbar-background; .hook-navbar-container(); } // Color Mode .uk-navbar-container:not(.uk-navbar-transparent):extend(.uk-light all) when (@navbar-color-mode = light) {} .uk-navbar-container:not(.uk-navbar-transparent):extend(.uk-dark all) when (@navbar-color-mode = dark) {} /* Groups ========================================================================== */ /* * 1. Align navs and items vertically if they have a different height */ .uk-navbar-left, .uk-navbar-right, [class*="uk-navbar-center"] { display: flex; gap: @navbar-gap; /* 1 */ align-items: center; } /* * Horizontal alignment * 1. Create position context for centered navbar with sub groups (left/right) * 2. Fix text wrapping if content is larger than 50% of the container. * 3. Needed for dropdowns because a new position context is created * `z-index` must be smaller than off-canvas * 4. Align sub groups for centered navbar */ .uk-navbar-right { margin-left: auto; } .uk-navbar-center:only-child { margin-left: auto; margin-right: auto; /* 1 */ position: relative; } .uk-navbar-center:not(:only-child) { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); /* 2 */ width: max-content; box-sizing: border-box; /* 3 */ z-index: @global-z-index - 10; } /* 4 */ .uk-navbar-center-left, .uk-navbar-center-right { position: absolute; top: 0; } .uk-navbar-center-left { right: ~'calc(100% + @{navbar-gap})'; } .uk-navbar-center-right { left: ~'calc(100% + @{navbar-gap})'; } [class*="uk-navbar-center-"] { width: max-content; box-sizing: border-box; } /* Nav ========================================================================== */ /* * 1. Reset list */ .uk-navbar-nav { display: flex; gap: @navbar-nav-gap; /* 1 */ margin: 0; padding: 0; list-style: none; } /* * Allow items to wrap into the next line * Only not `absolute` positioned groups */ .uk-navbar-left, .uk-navbar-right, .uk-navbar-center:only-child { flex-wrap: wrap; } /* * Items * 1. Center content vertically and horizontally * 2. Imitate white space gap when using flexbox * 3. Dimensions * 4. Style * 5. Required for `a` */ .uk-navbar-nav > li > a, // Nav item .uk-navbar-item, // Content item .uk-navbar-toggle { // Clickable item /* 1 */ display: flex; justify-content: center; align-items: center; /* 2 */ column-gap: 0.25em; /* 3 */ box-sizing: border-box; min-height: @navbar-nav-item-height; /* 4 */ font-size: @navbar-nav-item-font-size; font-family: @navbar-nav-item-font-family; /* 5 */ text-decoration: none; } /* * Nav items */ .uk-navbar-nav > li > a { padding: 0 @navbar-nav-item-padding-horizontal; color: @navbar-nav-item-color; .hook-navbar-nav-item(); } /* * Hover * Apply hover style also if dropdown is opened */ .uk-navbar-nav > li:hover > a, .uk-navbar-nav > li > a[aria-expanded="true"] { color: @navbar-nav-item-hover-color; .hook-navbar-nav-item-hover(); } /* OnClick */ .uk-navbar-nav > li > a:active { color: @navbar-nav-item-onclick-color; .hook-navbar-nav-item-onclick(); } /* Active */ .uk-navbar-nav > li.uk-active > a { color: @navbar-nav-item-active-color; .hook-navbar-nav-item-active(); } /* Parent icon modifier ========================================================================== */ .uk-navbar-parent-icon { margin-left: @navbar-parent-icon-margin-left; transition: transform 0.3s ease-out; } .uk-navbar-nav > li > a[aria-expanded="true"] .uk-navbar-parent-icon { transform: rotateX(180deg); } /* Item ========================================================================== */ .uk-navbar-item { padding: 0 @navbar-item-padding-horizontal; color: @navbar-item-color; .hook-navbar-item(); } /* * Remove margin from the last-child */ .uk-navbar-item > :last-child { margin-bottom: 0; } /* Toggle ========================================================================== */ .uk-navbar-toggle { padding: 0 @navbar-item-padding-horizontal; color: @navbar-toggle-color; .hook-navbar-toggle(); } .uk-navbar-toggle:hover, .uk-navbar-toggle[aria-expanded="true"] { color: @navbar-toggle-hover-color; text-decoration: none; .hook-navbar-toggle-hover(); } /* * Icon * Adopts `uk-icon` */ .uk-navbar-toggle-icon { .hook-navbar-toggle-icon(); } /* Hover */ :hover > .uk-navbar-toggle-icon { .hook-navbar-toggle-icon-hover(); } /* Subtitle ========================================================================== */ .uk-navbar-subtitle { font-size: @navbar-subtitle-font-size; .hook-navbar-subtitle(); } /* Justify modifier ========================================================================== */ .uk-navbar-justify .uk-navbar-left, .uk-navbar-justify .uk-navbar-right, .uk-navbar-justify .uk-navbar-nav, .uk-navbar-justify .uk-navbar-nav > li, // Nav item .uk-navbar-justify .uk-navbar-item, // Content item .uk-navbar-justify .uk-navbar-toggle { flex-grow: 1; } /* Style modifiers ========================================================================== */ .uk-navbar-primary { .hook-navbar-primary(); } .uk-navbar-transparent { .hook-navbar-transparent(); } .uk-navbar-sticky { .hook-navbar-sticky(); } /* Dropdown ========================================================================== */ /* * Adopts `uk-drop` * 1. Set a default width * 2. Style */ .uk-navbar-dropdown { --uk-position-offset: @navbar-dropdown-margin; --uk-position-shift-offset: @navbar-dropdown-shift-margin; --uk-position-viewport-offset: @navbar-dropdown-viewport-margin; --uk-inverse: @navbar-dropdown-color-mode; /* 1 */ width: @navbar-dropdown-width; /* 2 */ padding: @navbar-dropdown-padding; background: @navbar-dropdown-background; color: @navbar-dropdown-color; .hook-navbar-dropdown(); } /* * Remove margin from the last-child */ .uk-navbar-dropdown > :last-child { margin-bottom: 0; } // Color Mode .uk-navbar-dropdown:extend(.uk-light all) when (@navbar-dropdown-color-mode = light) {} .uk-navbar-dropdown:extend(.uk-dark all) when (@navbar-dropdown-color-mode = dark) {} .uk-navbar-dropdown :focus-visible when not (@navbar-dropdown-color-mode = @inverse-global-color-mode) { outline-color: @navbar-dropdown-focus-outline !important; } /* * Grid * Adopts `uk-grid` */ /* Gutter Horizontal */ .uk-navbar-dropdown .uk-drop-grid { margin-left: -@navbar-dropdown-grid-gutter-horizontal; } .uk-navbar-dropdown .uk-drop-grid > * { padding-left: @navbar-dropdown-grid-gutter-horizontal; } /* Gutter Vertical */ .uk-navbar-dropdown .uk-drop-grid > .uk-grid-margin { margin-top: @navbar-dropdown-grid-gutter-vertical; } /* * Width modifier */ .uk-navbar-dropdown-width-2:not(.uk-drop-stack) { width: (@navbar-dropdown-width * 2); } .uk-navbar-dropdown-width-3:not(.uk-drop-stack) { width: (@navbar-dropdown-width * 3); } .uk-navbar-dropdown-width-4:not(.uk-drop-stack) { width: (@navbar-dropdown-width * 4); } .uk-navbar-dropdown-width-5:not(.uk-drop-stack) { width: (@navbar-dropdown-width * 5); } /* * Size modifier */ .uk-navbar-dropdown-large { --uk-position-shift-offset: @navbar-dropdown-large-shift-margin; padding: @navbar-dropdown-large-padding; .hook-navbar-dropdown-large(); } /* * Dropbar modifier * 1. Reset dropdown width to prevent to early shifting * 2. Reset style * 3. Padding */ .uk-navbar-dropdown-dropbar { /* 1 */ width: auto; /* 2 */ background: transparent; /* 3 */ padding: @navbar-dropdown-dropbar-padding-top 0 @navbar-dropdown-dropbar-padding-bottom 0; --uk-position-offset: @navbar-dropdown-dropbar-margin; --uk-position-shift-offset: @navbar-dropdown-dropbar-shift-margin; --uk-position-viewport-offset: @navbar-dropdown-dropbar-viewport-margin; .hook-navbar-dropdown-dropbar(); } /* Phone landscape and bigger */ @media (min-width: @breakpoint-small) { .uk-navbar-dropdown-dropbar { --uk-position-viewport-offset: @navbar-dropdown-dropbar-viewport-margin-s; } } /* Tablet landscape and bigger */ @media (min-width: @breakpoint-medium) { .uk-navbar-dropdown-dropbar { --uk-position-viewport-offset: @navbar-dropdown-dropbar-viewport-margin-m; } } .uk-navbar-dropdown-dropbar-large { --uk-position-shift-offset: @navbar-dropdown-dropbar-large-shift-margin; padding-top: @navbar-dropdown-dropbar-large-padding-top; padding-bottom: @navbar-dropdown-dropbar-large-padding-bottom; .hook-navbar-dropdown-dropbar-large(); } /* Dropdown Nav * Adopts `uk-nav` ========================================================================== */ .uk-navbar-dropdown-nav { .hook-navbar-dropdown-nav(); } /* * Items */ .uk-navbar-dropdown-nav > li > a { color: @navbar-dropdown-nav-item-color; .hook-navbar-dropdown-nav-item(); } /* Hover */ .uk-navbar-dropdown-nav > li > a:hover { color: @navbar-dropdown-nav-item-hover-color; .hook-navbar-dropdown-nav-item-hover(); } /* Active */ .uk-navbar-dropdown-nav > li.uk-active > a { color: @navbar-dropdown-nav-item-active-color; .hook-navbar-dropdown-nav-item-active(); } /* * Subtitle */ .uk-navbar-dropdown-nav .uk-nav-subtitle { font-size: @navbar-dropdown-nav-subtitle-font-size; .hook-navbar-dropdown-nav-subtitle(); } /* * Header */ .uk-navbar-dropdown-nav .uk-nav-header { color: @navbar-dropdown-nav-header-color; .hook-navbar-dropdown-nav-header(); } /* * Divider */ .uk-navbar-dropdown-nav .uk-nav-divider { border-top: @navbar-dropdown-nav-divider-border-width solid @navbar-dropdown-nav-divider-border; .hook-navbar-dropdown-nav-divider(); } /* * Sublists */ .uk-navbar-dropdown-nav .uk-nav-sub a { color: @navbar-dropdown-nav-sublist-item-color; } .uk-navbar-dropdown-nav .uk-nav-sub a:hover { color: @navbar-dropdown-nav-sublist-item-hover-color; } .uk-navbar-dropdown-nav .uk-nav-sub li.uk-active > a { color: @navbar-dropdown-nav-sublist-item-active-color; } /* Dropbar ========================================================================== */ /* * Adopts `uk-dropnav-dropbar` */ .uk-navbar-dropbar { .hook-navbar-dropbar(); } // Hooks // ======================================================================== .hook-navbar-misc(); .hook-navbar() {} .hook-navbar-container() {} .hook-navbar-nav-item() {} .hook-navbar-nav-item-hover() {} .hook-navbar-nav-item-onclick() {} .hook-navbar-nav-item-active() {} .hook-navbar-item() {} .hook-navbar-toggle() {} .hook-navbar-toggle-hover() {} .hook-navbar-toggle-icon() {} .hook-navbar-toggle-icon-hover() {} .hook-navbar-subtitle() {} .hook-navbar-primary() {} .hook-navbar-transparent() {} .hook-navbar-sticky() {} .hook-navbar-dropdown() {} .hook-navbar-dropdown-large() {} .hook-navbar-dropdown-dropbar() {} .hook-navbar-dropdown-dropbar-large() {} .hook-navbar-dropdown-nav() {} .hook-navbar-dropdown-nav-item() {} .hook-navbar-dropdown-nav-item-hover() {} .hook-navbar-dropdown-nav-item-active() {} .hook-navbar-dropdown-nav-subtitle() {} .hook-navbar-dropdown-nav-header() {} .hook-navbar-dropdown-nav-divider() {} .hook-navbar-dropbar() {} .hook-navbar-misc() {} // Inverse // ======================================================================== @inverse-navbar-nav-item-color: @inverse-global-muted-color; @inverse-navbar-nav-item-hover-color: @inverse-global-color; @inverse-navbar-nav-item-onclick-color: @inverse-global-emphasis-color; @inverse-navbar-nav-item-active-color: @inverse-global-emphasis-color; @inverse-navbar-item-color: @inverse-global-color; @inverse-navbar-toggle-color: @inverse-global-muted-color; @inverse-navbar-toggle-hover-color: @inverse-global-color; .hook-inverse() { // // Nav Item // .uk-navbar-nav > li > a { color: @inverse-navbar-nav-item-color; .hook-inverse-navbar-nav-item(); } .uk-navbar-nav > li:hover > a, .uk-navbar-nav > li > a[aria-expanded="true"] { color: @inverse-navbar-nav-item-hover-color; .hook-inverse-navbar-nav-item-hover(); } .uk-navbar-nav > li > a:active { color: @inverse-navbar-nav-item-onclick-color; .hook-inverse-navbar-nav-item-onclick(); } .uk-navbar-nav > li.uk-active > a { color: @inverse-navbar-nav-item-active-color; .hook-inverse-navbar-nav-item-active(); } // // Item // .uk-navbar-item { color: @inverse-navbar-item-color; .hook-inverse-navbar-item(); } // // Toggle // .uk-navbar-toggle { color: @inverse-navbar-toggle-color; .hook-inverse-navbar-toggle(); } .uk-navbar-toggle:hover, .uk-navbar-toggle[aria-expanded="true"] { color: @inverse-navbar-toggle-hover-color; .hook-inverse-navbar-toggle-hover(); } } .hook-inverse-navbar-nav-item() {} .hook-inverse-navbar-nav-item-hover() {} .hook-inverse-navbar-nav-item-onclick() {} .hook-inverse-navbar-nav-item-active() {} .hook-inverse-navbar-item() {} .hook-inverse-navbar-toggle() {} .hook-inverse-navbar-toggle-hover() {}