// stylelint-disable selector-max-type // selector-max-type is needed for body:not(.intent-mouse) to target keyboard only styles. // TODO@15.0.0: remove styles below @media (hover: hover) { .SelectMenu-tab:not([aria-checked="true"]):hover, .SelectMenu-tab:not([aria-checked="true"]):active { background-color: $bg-white; } } $SelectMenu-max-height: 480px !default; // Select Menu // // A more advanced menu with support for navigation, filtering, and more. .SelectMenu { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 99; display: flex; padding: $spacer-3; pointer-events: none; flex-direction: column; @include breakpoint(sm) { position: absolute; top: auto; right: auto; bottom: auto; left: auto; padding: 0; } } // Backdrop // // Adds a dark, semi transparent "cover" underneat the modal. Only visible for xs. .SelectMenu::before { position: absolute; top: 0; right: 0; bottom: 0; left: 0; pointer-events: none; content: ""; background-color: $bg-black-fade; @include breakpoint(sm) { display: none; } } // Modal // // The main "box" that contains the content .SelectMenu-modal { position: relative; z-index: 99; // Needs to be higher than .details-overlay's z-index: 80. display: flex; max-height: 66%; margin: auto 0; overflow: hidden; // Enables border radius on scrollable child elements pointer-events: auto; flex-direction: column; background-color: $bg-gray; // stylelint-disable-next-line primer/borders border-radius: $border-radius * 2; // stylelint-disable-next-line primer/box-shadow box-shadow: 0 0 18px rgba(0, 0, 0, 0.4); animation: SelectMenu-modal-animation 0.12s cubic-bezier(0, 0.1, 0.1, 1) backwards; @keyframes SelectMenu-modal-animation { 0% { opacity: 0; transform: scale(0.9); } } @keyframes SelectMenu-modal-animation--sm { 0% { opacity: 0; transform: translateY(-$spacer-3); } } @include breakpoint(sm) { width: 300px; height: auto; max-height: $SelectMenu-max-height; margin: $spacer-1 0 $spacer-3 0; font-size: $font-size-small; border: $border-width $border-style $border-gray-dark; border-radius: $border-radius; box-shadow: $box-shadow-medium; animation-name: SelectMenu-modal-animation--sm; } } // Header // // Used for showing a title and the close button. Close button is only visible for xs. .SelectMenu-header { display: flex; flex: none; // fixes header from getting squeezed in Safari iOS padding: $spacer-3; @include breakpoint(sm) { padding-top: $spacer-2; padding-bottom: $spacer-2; } } .SelectMenu-title { flex: auto; font-size: $body-font-size; font-weight: $font-weight-bold; @include breakpoint(sm) { font-size: inherit; } } .SelectMenu-closeButton { padding: $spacer-3; margin: -$spacer-3; color: $text-gray-light; background-color: transparent; border: 0; @include breakpoint(sm) { display: none; } } // Filter // // An input to filter a large list .SelectMenu-filter { padding: $spacer-3; margin: 0; border-top: $border; @include breakpoint(sm) { padding: $spacer-2; } } .SelectMenu-input { display: block; width: 100%; @include breakpoint(sm) { font-size: $h5-size; } } // List // // The container that holds all the list items. Starts scrolling when the list gets too long. .SelectMenu-list { position: relative; padding: 0; margin: 0; // stylelint-disable-next-line primer/spacing margin-bottom: -$border-width; // Hides the last border in the list flex: auto; overflow-x: hidden; overflow-y: auto; background-color: $bg-white; border-top: $border; -webkit-overflow-scrolling: touch; // Adds momentum + bouncy scrolling } // List Item // // The interactive element used to make a selection .SelectMenu-item { display: flex; align-items: center; width: 100%; padding: $spacer-3; overflow: hidden; color: $text-gray; text-align: left; cursor: pointer; background-color: $bg-white; border: 0; border-bottom: $border-width $border-style $border-gray-light; @include breakpoint(sm) { padding-top: $spacer-2; padding-bottom: $spacer-2; } } // Icon // // Icon shown on the left of a list item. .SelectMenu-icon { width: $spacer-3; // fixed width to make sure following content aligns margin-right: $spacer-2; flex-shrink: 0; } // Check icon .SelectMenu-icon--check { visibility: hidden; transition: transform 0.12s cubic-bezier(0.5, 0.1, 1, 0.5), visibility 0s 0.12s linear; transform: scale(0); } // Tabs // // Allows switching between multiple lists .SelectMenu-tabs { display: flex; flex-shrink: 0; // stylelint-disable-next-line primer/spacing margin-bottom: -$border-width; // hide border of element below overflow-x: auto; overflow-y: hidden; border-top: $border; -webkit-overflow-scrolling: touch; // Hide scrollbar so it doesn't cover the text &::-webkit-scrollbar { display: none; } @include breakpoint(sm) { padding: 0 $spacer-2; border-top: 0; } } .SelectMenu-tab { flex: 1; padding: $spacer-2 $spacer-3; font-size: $font-size-small; font-weight: $font-weight-semibold; color: $text-gray-light; text-align: center; background-color: transparent; border: 0; // stylelint-disable-next-line primer/box-shadow box-shadow: inset 0 -1px 0 $border-color; @include breakpoint(sm) { flex: none; padding: $spacer-1 $spacer-3; border: $border-width $border-style transparent; border-bottom-width: 0; border-top-left-radius: $border-radius; border-top-right-radius: $border-radius; } &[aria-selected="true"] { z-index: 1; // Keeps box-shadow visible when hovering color: $text-gray-dark; cursor: default; background-color: $bg-white; // stylelint-disable-next-line primer/box-shadow box-shadow: 0 0 0 1px $border-color; @include breakpoint(sm) { border-color: $border-color; box-shadow: none; } } } // Message, Blankslate and Loading // // A container used to show different kinds of content. Like a message, a blankslate or the loading animation. .SelectMenu-message { border-bottom: $border-width $border-style $border-gray-light; } .SelectMenu-message, .SelectMenu-blankslate, .SelectMenu-loading { padding: $spacer-4 $spacer-3; text-align: center; background-color: $bg-white; } // Divider // // Can be used to divide the list into multiple groups .SelectMenu-divider { padding: $spacer-1 $spacer-3; margin: 0; font-size: $font-size-small; font-weight: $font-weight-bold; color: $text-gray-light; background-color: $bg-gray; border-bottom: $border-width $border-style $border-gray-light; } // Footer // // A container at the bottom. .SelectMenu-footer { z-index: 0; // Avoid top border from getting covered by the negative margin of the list padding: $spacer-2 $spacer-3; font-size: $font-size-small; color: $text-gray-light; text-align: center; border-top: $border; @include breakpoint(sm) { padding: $spacer-1 $spacer-2; } } // Has Filter (modifier) // // Makes sure that the filter input keeps a fixed position at the top while typing. Only visible for xs. .SelectMenu--hasFilter { .SelectMenu-modal { height: 80%; max-height: none; margin-top: 0; @include breakpoint(sm) { height: auto; max-height: $SelectMenu-max-height; margin-top: $spacer-1; } } } // States // // Different states // Reset outlines .SelectMenu-tab:focus, .SelectMenu-item:focus { outline: none; } // Reset elements .SelectMenu-item:hover { text-decoration: none; } // Selected // // Visible when a used clicks/taps on a list item .SelectMenu-item[aria-checked="true"] { font-weight: $font-weight-semibold; color: $text-gray-dark; .SelectMenu-icon--check { visibility: visible; transition: transform 0.12s cubic-bezier(0, 0, 0.2, 1), visibility 0s linear; transform: scale(1); } } // Can hover states // // For mouse/keyboard input @media (hover: hover) { body:not(.intent-mouse) .SelectMenu-item:focus, .SelectMenu-item:hover { background-color: $bg-gray; } .SelectMenu-item:active { background-color: $bg-gray-light; } body:not(.intent-mouse) .SelectMenu-tab:focus { // stylelint-disable-next-line primer/colors background-color: $blue-100; } .SelectMenu-tab:not([aria-selected="true"]):hover { color: $text-gray-dark; // stylelint-disable-next-line primer/colors background-color: $gray-200; } .SelectMenu-tab:not([aria-selected="true"]):active { color: $text-gray-dark; background-color: $bg-gray; } } // Can not hover states // // For touch input @media (hover: none) { // Android .SelectMenu-item:focus, .SelectMenu-item:active { background-color: $bg-gray-light; } // iOS Safari // :active would work if ontouchstart is added to the button // Instead this tweaks the "native" highlight color .SelectMenu-item { -webkit-tap-highlight-color: rgba($gray-300, 0.5); } }