UNPKG

cirrus-ui

Version:

A lightweight UI framework written in SCSS

461 lines (390 loc) 13.6 kB
@use '../src/internal' as *; @mixin mobile-dropdown-menu-show { border-radius: 0; box-shadow: none; display: block; position: relative; top: 1rem; float: none; border: none; background-color: transparent; margin-bottom: 1rem; } /* These styles can also be used on menus in the body */ @mixin nav-bar-position($position) { align-items: stretch; flex-basis: 0; flex-grow: 1; flex-shrink: 0; display: flex; justify-content: flex-#{$position}; white-space: nowrap; } @if should-generate-classes($HEADER) { /* HEADER */ .header { flex-grow: 1; width: 100%; z-index: 100; margin-bottom: 20px; box-shadow: 0 3px 15px rgba(57, 63, 72, 0.1); background-color: var(--cirrus-bg); max-height: 100vh; padding: 0 2rem; transition: all 0.3s; display: flex; --header-link-color: #{fill('gray', '700')}; --header-link-color-hover: #{lighten(fill('gray', '700'), 10%)}; /* Remove any padding set for headers in default.scss */ @for $i from 1 through 6 { h#{$i} { margin: 0; } } a { color: var(--header-link-color); &:hover { color: var(--header-link-color-hover); } } /* Header dark theme */ &.header-dark { background-color: rgba(0, 0, 0, 0.87); color: #fff; --header-link-color: #fff; --header-link-color-hover: #fff; /* Theme for dark menu */ // .nav-item a { // color: #fff; // } } &.header-clear { background-color: transparent; box-shadow: none; /* Add border radius to whole menu with clear header */ .nav-item .dropdown-menu { border-radius: 4px; } } /* Add transition to nav menu when it drops down */ &.header-animated .header-nav { transition: all 0.3s; } /* The container that contains all the header menu components. Child of header */ .header-nav { /* Flex display 768px and higher */ overflow: auto; } .header-brand { align-items: stretch; display: flex; flex-shrink: 0; max-width: 100vw; min-height: 3.25rem; overflow-x: auto; overflow-y: hidden; } /* Static header at the top of the screen */ &.header-fixed { position: fixed; top: 0; /* Change this if you want to float the header somewhere else */ } /* Hover effect for header elements when appropriate */ &:not(.header-clear) .nav-item:not(.no-hover):hover, &:not(.header-clear) .nav-item:not(.no-hover).hovered { background-color: rgba(216, 216, 216, 0.15); transition: all 0.3s; } &:not(.header-clear) .nav-item.active, /* active:hover removes the transition effect when hovering over the dropdown menu */ &:not(.header-clear) .nav-item.active:hover { background-color: rgba(216, 216, 216, 0.35); } .nav-btn { cursor: pointer; display: block; height: 3.5rem; position: relative; width: 3.5rem; } #{$button-selectors} { margin: 0; } } /* Styles for header menu (aka the nav bar) */ .nav-menu { transition: all 0.3s; .has-sub { position: relative; } } /* Allow the user to scroll through navbar items if it exceeds nav-left, nav-center, or nav-right widths */ .nav-overflow-x { justify-content: inherit; overflow-x: scroll; } /* Wrapper to vertically center header items */ .nav-item { align-items: center; display: flex; position: relative; flex-grow: 0; flex-shrink: 0; justify-content: center; transition: all 0.3s; padding: 0 0.3rem; cursor: pointer; div { /* Cursor should be reset for children */ cursor: default; } a { align-items: center; display: flex; } /* HEADER DROP DOWN MENU */ .dropdown-menu { background-color: var(--cirrus-bg); position: absolute; top: 95%; /*right: 0; /* Unable to solve problem when we have multiple drop down menus */ z-index: 1000; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-clip: padding-box; border: 1px solid fill('gray', '200'); border-radius: 0 0 4px 4px; box-shadow: 0 0.5rem 1rem rgba(10, 10, 10, 0.1); /* Just add a transition in general */ &.dropdown-animated { transition: all var(--animation-duration); } & > li > a { display: block; padding: 0.5rem 1rem; clear: both; line-height: 1.42857143; white-space: nowrap; } & > li { margin: 0; transition: all 0.3s; } & > li:hover { transition: all 0.3s; background-color: rgba(216, 216, 216, 0.15); } & > li:active { transition: all 0.3s; background-color: rgba(216, 216, 216, 0.25); } & > li:last-child { margin-bottom: 0; } .dropdown-menu-divider { border: none; background-color: rgba(216, 216, 216, 0.15); height: 1px; margin: 0.5rem 0; } } /* Add room for the dropdown chevron pseudoelement */ &.has-sub .nav-dropdown-link { padding-right: 2.5rem; position: relative; /* Needed for hiding glyphs in mobile header */ /* Dropdown menu location adjustment located below for sizes above phones */ /* Dropdown menu indicator */ &::after { border: 2px solid fill('primary'); /* Must be first to create the triangle shape */ border-right: 0; /* Create the triangle effect */ border-top: 0; display: block; height: 0.5em; width: 0.5em; content: ' '; transform: rotate(-45deg); pointer-events: none; margin-top: -0.435em; right: 1.125em; top: 50%; position: absolute; } } } /* Dark dropdown menu theme */ .nav-item .dropdown-menu.dropdown-dark, .header.header-dark .dropdown-menu { background-color: rgba(0, 0, 0, 0.87); border: 1px solid fill('gray', '800'); color: #fff; } .dropdown-menu.dropdown-shown, .nav-item.active { opacity: 1; } @include screen-above($sm) { .header { align-items: stretch; display: flex; .header-nav { flex-grow: 1; align-items: stretch; /* Make items fill up all available space regardless of width https://drafts.csswg.org/css-align/ */ display: flex; position: relative; text-align: center; width: 100%; top: 0; overflow: visible; /* Only visible for showing dropdown menus, hidden for mobile */ } /* Align items to the left */ .nav-left { @include nav-bar-position('start'); /* Align dropdown menu to the left side of the parent nav-item for header-left */ .has-sub .dropdown-menu { left: 0; right: auto; } } /* Align items to the right */ .nav-right { @include nav-bar-position('end'); /* Align dropdown menu to the right side of the parent nav-item for header-right */ .has-sub .dropdown-menu { left: auto; right: 0; } } /* Centering items, best used when nav-brand is not used to prevent offset */ .nav-center { align-items: stretch; display: flex; flex-grow: 0; flex-shrink: 0; justify-content: center; margin-left: auto; margin-right: auto; } /* Hide hamburger button */ .nav-btn { display: none; } .nav-item { /* Expand link area for desktop views so it is easier to click */ a { padding: 0.5rem 1rem; } .dropdown-menu { opacity: 0; pointer-events: none; /* Make cursor not respond to menu links when not displayed */ } .dropdown-menu.dropdown-animated { transform: translateY(-5px); } .dropdown-menu.dropdown-shown, &.toggle-hover:hover .dropdown-menu, .dropdown-menu.dropdown-animated.dropdown-shown { opacity: 1; transform: none; pointer-events: auto; } } } } @include screen-below($sm) { /* Add scrolling support in header */ .header { flex-direction: column; .header-brand .nav-item:first-child { padding: 0 1rem; /* Add padding to the first child, usually the logo */ } /* Hide dropdown menu on mobile */ .header-nav { height: 0; /* Show the dropdown */ &.active { height: 100vh; } /* Make the menu items larger in the dropdown menu */ .nav-item { padding: 1rem; } /* Get rid of extra spaces */ .nav-item > a { padding: 0; width: 100%; /* Stretch the link to span the entire list item */ } } } /* Remove flex for mobile devices */ .nav-item.has-sub { display: block; .dropdown-menu { /* Hide the menu by default in mobile view (overflow on header-right can expose it) */ display: none; &.dropdown-shown { @include mobile-dropdown-menu-show(); } &.dropdown-dark { background-color: rgba(0, 0, 0, 0.17); border: 0; } } } /* Hamburger button */ .nav-btn { cursor: pointer; display: block; position: relative; margin-left: auto; span { background-color: var(--header-link-color); display: block; height: 2px; left: 50%; margin-left: -7px; position: absolute; top: 50%; transition: all 86ms ease-out; width: 15px; /* Line spacing in hamburger button */ &:nth-child(1) { margin-top: -6px; } &:nth-child(2) { margin-top: -1px; } &:nth-child(3) { margin-top: 4px; } } /* Hamburger button on active */ &.active span:nth-child(1) { margin-left: -5px; transform: rotate(45deg); transform-origin: left top; } &.active span:nth-child(2) { opacity: 0; } &.active span:nth-child(3) { margin-left: -5px; transform: rotate(-45deg); transform-origin: left bottom; } } /* Hide drop down menu items */ .nav-left, .nav-center, .nav-right { overflow: hidden; } /* No need for JS to show dropdown menu on mobile devices now */ .header .nav-item.has-sub.toggle-hover:not(.no-hover):hover > .dropdown-menu { @include mobile-dropdown-menu-show(); } } }