picocss/scss/components/_dropdown.scss
2023-01-28 12:22:55 +07:00

287 lines
8 KiB
SCSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@use "sass:map";
@use "../settings" as *;
@if map.get($modules, "components/dropdown") {
/**
* Dropdown ([role="list"])
*/
// Container
//
// 1. Container type accordion
details[role="list"],
// 2. Container type nested list
nav li:has(button, a):has(li) {
position: relative;
// margin-bottom: var(#{$✨}spacing);
border-bottom: none;
// Marker
//
summary,
> button,
> a {
&::after {
display: block;
width: 1rem;
height: calc(1rem * var(#{$}line-height, 1.5));
margin-inline-start: 0.25rem;
float: right;
// TODO: find out why we need this magic number (0.2 rem)
// for the marker to be aligned with the on in the regular select
transform: rotate(0deg) translateX(0.2rem);
background-image: var(#{$}icon-chevron);
background-position: right center;
background-size: 1rem auto;
background-repeat: no-repeat;
content: "";
}
}
// Marker as button
summary[role="button"],
> button {
&::after {
background-image: var(#{$}icon-chevron-button);
}
@if $enable-classes {
&.outline {
&::after {
background-image: var(#{$}icon-chevron);
}
}
&.contrast:not(.outline) {
&::after {
background-image: var(#{$}icon-chevron-button-contrast);
}
}
}
}
}
// Container type accordion
// inside a nav
//
nav details[role="list"] {
// Override height
margin-bottom: 0;
}
// Bouton as a select
// inside container type accordion
//
details[role="list"] summary:not([role]) {
height: calc(
1rem *
var(#{$}line-height) +
var(#{$}form-element-spacing-vertical) *
2 +
var(#{$}border-width) *
2
);
padding: var(#{$}form-element-spacing-vertical) var(#{$}form-element-spacing-horizontal);
border: var(#{$}border-width) solid var(#{$}form-element-border-color);
border-radius: var(#{$}border-radius);
background-color: var(#{$}form-element-background-color);
color: var(#{$}form-element-placeholder-color);
line-height: inherit;
cursor: pointer;
user-select: none;
@if $enable-transitions {
transition: background-color var(#{$}transition), border-color var(#{$}transition),
color var(#{$}transition), box-shadow var(#{$}transition);
}
&:active,
&:focus {
border-color: var(#{$}form-element-active-border-color);
background-color: var(#{$}form-element-active-background-color);
}
&:focus {
box-shadow: 0 0 0 var(#{$}outline-width) var(#{$}form-element-focus-color);
}
// Reset focus visible from accordion component
&:focus-visible {
outline: none;
}
// Aria-invalid
&[aria-invalid="false"] {
#{$✨}form-element-border-color: var(#{$}form-element-valid-border-color);
#{$✨}form-element-active-border-color: var(#{$}form-element-valid-focus-color);
#{$✨}form-element-focus-color: var(#{$}form-element-valid-focus-color);
}
&[aria-invalid="true"] {
#{$✨}form-element-border-color: var(#{$}form-element-invalid-border-color);
#{$✨}form-element-active-border-color: var(#{$}form-element-invalid-focus-color);
#{$✨}form-element-focus-color: var(#{$}form-element-invalid-focus-color);
}
}
// Bouton as a select
// inside container type accordion
// AND inside a nav
//
nav details[role="list"] summary:not([role]) {
// Override height
height: auto;
padding: calc(var(#{$}nav-link-spacing-vertical) - (var(#{$}border-width) * 2))
var(#{$}nav-link-spacing-horizontal);
}
// Submenu
//
// 1. Inside container type accordion
details[role="list"] summary + ul,
// 2. Inside container type nested list
nav li button + ul,
nav li a + ul {
display: flex;
z-index: 99;
position: absolute;
left: 0;
flex-direction: column;
width: 100%;
min-width: fit-content;
margin: 0;
margin-top: var(#{$}outline-width);
padding: 0;
border: var(#{$}border-width) solid var(#{$}dropdown-border-color);
border-radius: var(#{$}border-radius);
background-color: var(#{$}dropdown-background-color);
box-shadow: var(#{$}dropdown-box-shadow);
color: var(#{$}dropdown-color);
white-space: nowrap;
opacity: 0;
@if $enable-transitions {
transition: opacity var(--pico-transition), transform 0s ease-in-out 1s;
}
&[dir="rtl"] {
right: 0;
left: auto;
}
li {
width: 100%;
margin-bottom: 0;
padding: calc(var(#{$}form-element-spacing-vertical) * 0.5)
var(#{$}form-element-spacing-horizontal);
list-style: none;
&:first-of-type {
margin-top: calc(var(#{$}form-element-spacing-vertical) * 0.5);
}
&:last-of-type {
margin-bottom: calc(var(#{$}form-element-spacing-vertical) * 0.5);
}
a {
display: block;
margin: calc(var(#{$}form-element-spacing-vertical) * -0.5)
calc(var(#{$}form-element-spacing-horizontal) * -1);
padding: calc(var(#{$}form-element-spacing-vertical) * 0.5)
var(#{$}form-element-spacing-horizontal);
overflow: hidden;
border-radius: 0;
color: var(#{$}dropdown-color);
text-decoration: none;
text-overflow: ellipsis;
&:hover,
&:focus,
&:active,
&:focus-visible {
background-color: var(#{$}dropdown-hover-background-color);
}
}
&:has(label):hover {
background-color: var(#{$}dropdown-hover-background-color);
label {
cursor: pointer;
}
}
}
}
// Submenu inside container
// type nested list
//
nav li button + ul,
nav li a + ul {
transform: scaleY(0%);
transform-origin: top;
&:first-of-type,
&:last-of-type {
margin-right: var(#{$}nav-link-spacing-horizontal);
margin-left: var(#{$}nav-link-spacing-horizontal);
}
}
// Button opened
// inside container type accordion
//
details[role="list"][open] summary {
margin-bottom: 0;
}
// Menu opened
//
// 1. Inside container type accordion
details[role="list"][open] summary,
// 2. Inside container type nested list
nav li:has(:focus, :focus-within) button,
nav li:has(:focus, :focus-within) a {
+ ul {
transform: scaleY(1);
opacity: 1;
@if $enable-transitions {
transition: opacity var(--pico-transition), transform 0s ease-in-out 0s;
}
}
}
// Menu opened inside container
// type nested list on a touch device
//
@media (any-hover: none) {
nav li button,
nav li a {
&:hover {
+ ul {
transform: scaleY(1);
opacity: 1;
@if $enable-transitions {
transition: opacity var(--pico-transition), transform 0s ease-in-out 0s;
}
}
}
}
}
// Close for dropdown
// inside container type accordion
//
details[role="list"][open] summary {
&::before {
display: block;
z-index: 1;
position: fixed;
width: 100vw;
height: 100vh;
inset: 0;
background: none;
content: "";
cursor: default;
}
}
}