picocss/scss/components/_dropdown.scss
2023-03-19 10:19:09 +07:00

248 lines
6.9 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
//
details[role="list"] {
position: relative;
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 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 {
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);
}
}
label {
width: 100%;
}
// Not working in Firefox, which doesn't support the `:has()` pseudo-class
&:has(label):hover {
background-color: var(#{$}dropdown-hover-background-color);
}
}
}
// 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 {
+ 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;
}
}
}