pico/scss/components/_dropdown.scss

246 lines
6.9 KiB
SCSS
Raw Normal View History

2022-10-23 10:47:50 +07:00
@use "sass:map";
2022-10-22 13:11:51 +07:00
@use "../settings" as *;
2022-10-22 11:44:10 +07:00
2023-04-02 22:37:00 +07:00
@if map.get($modules, "components/dropdown") and $enable-classes {
2022-10-23 10:47:50 +07:00
/**
2023-04-02 22:37:00 +07:00
* Dropdown (details.dropdown)
2022-10-23 10:47:50 +07:00
*/
2023-01-01 14:00:33 +07:00
// Container
//
2023-04-02 22:37:00 +07:00
details.dropdown {
2022-10-23 10:47:50 +07:00
position: relative;
2023-01-01 14:00:33 +07:00
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)
2023-03-15 22:16:28 +07:00
// for the marker to be aligned with the regular select
2023-01-01 14:00:33 +07:00
transform: rotate(0deg) translateX(0.2rem);
background-image: var(#{$}icon-chevron);
background-position: right center;
background-size: 1rem auto;
background-repeat: no-repeat;
content: "";
}
}
}
// Container type accordion
// inside a nav
//
2023-04-02 22:37:00 +07:00
nav details.dropdown {
2023-01-01 14:00:33 +07:00
// Override height
margin-bottom: 0;
2022-10-23 10:47:50 +07:00
}
2023-01-01 14:00:33 +07:00
// Bouton as a select
// inside container type accordion
//
2023-04-02 22:37:00 +07:00
details.dropdown summary:not([role]) {
2023-01-01 14:00:33 +07:00
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 {
2023-12-24 10:41:54 +07:00
transition:
background-color var(#{$}transition),
border-color var(#{$}transition),
color var(#{$}transition),
box-shadow var(#{$}transition);
2023-01-01 14:00:33 +07:00
}
&: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);
}
2023-01-28 12:22:55 +07:00
// Reset focus visible from accordion component
&:focus-visible {
outline: none;
}
2023-01-01 14:00:33 +07:00
// 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);
}
}
2023-04-01 10:09:45 +07:00
// Dropdown inside a nav
2023-01-01 14:00:33 +07:00
//
2023-04-02 22:37:00 +07:00
nav details.dropdown {
2023-04-01 10:09:45 +07:00
display: inline;
margin: calc(var(#{$}nav-element-spacing-vertical) * -1) 0;
summary:not([role]) {
// Override height
height: calc((1rem * var(#{$}line-height)) + (var(#{$}nav-link-spacing-vertical) * 2));
padding: calc(var(#{$}nav-link-spacing-vertical) - (var(#{$}border-width) * 2))
var(#{$}nav-link-spacing-horizontal);
&:focus-visible {
box-shadow: 0 0 0 var(#{$}outline-width) var(#{$}primary-focus);
}
}
2023-01-01 14:00:33 +07:00
}
// Submenu
//
2023-04-02 22:37:00 +07:00
details.dropdown summary + ul {
2022-10-23 10:47:50 +07:00
display: flex;
z-index: 99;
position: absolute;
left: 0;
flex-direction: column;
2023-01-01 14:00:33 +07:00
width: 100%;
min-width: fit-content;
2022-10-23 10:47:50 +07:00
margin: 0;
2023-01-01 14:00:33 +07:00
margin-top: var(#{$}outline-width);
2022-10-23 10:47:50 +07:00
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;
2023-01-01 14:00:33 +07:00
opacity: 0;
@if $enable-transitions {
2023-12-24 10:41:54 +07:00
transition:
opacity var(--pico-transition),
transform 0s ease-in-out 1s;
2023-01-01 14:00:33 +07:00
}
&[dir="rtl"] {
right: 0;
left: auto;
}
2022-10-23 10:47:50 +07:00
li {
width: 100%;
margin-bottom: 0;
2022-10-22 13:11:51 +07:00
padding: calc(var(#{$}form-element-spacing-vertical) * 0.5)
var(#{$}form-element-spacing-horizontal);
2022-10-23 10:47:50 +07:00
list-style: none;
2022-10-23 10:47:50 +07:00
&:first-of-type {
margin-top: calc(var(#{$}form-element-spacing-vertical) * 0.5);
}
2022-10-23 10:47:50 +07:00
&:last-of-type {
margin-bottom: calc(var(#{$}form-element-spacing-vertical) * 0.5);
}
2022-10-23 10:47:50 +07:00
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;
2023-01-01 14:00:33 +07:00
border-radius: 0;
2022-10-23 10:47:50 +07:00
color: var(#{$}dropdown-color);
text-decoration: none;
text-overflow: ellipsis;
2023-01-01 14:00:33 +07:00
&:hover,
&:focus,
&:active,
2023-04-01 10:09:45 +07:00
&:focus-visible,
&[aria-current]:not([aria-current="false"]) {
2022-10-23 10:47:50 +07:00
background-color: var(#{$}dropdown-hover-background-color);
}
}
2022-12-29 18:00:21 +07:00
2023-03-19 01:51:49 +07:00
label {
width: 100%;
}
// Not working in Firefox, which doesn't support the `:has()` pseudo-class
2023-01-01 14:00:33 +07:00
&:has(label):hover {
background-color: var(#{$}dropdown-hover-background-color);
2022-12-29 18:00:21 +07:00
}
}
}
2023-01-01 14:00:33 +07:00
// Button opened
// inside container type accordion
//
2023-04-02 22:37:00 +07:00
details.dropdown[open] summary {
2023-01-01 14:00:33 +07:00
margin-bottom: 0;
}
2022-10-23 10:47:50 +07:00
2023-01-01 14:00:33 +07:00
// Menu opened
//
// 1. Inside container type accordion
2023-04-02 22:37:00 +07:00
details.dropdown[open] summary {
2023-01-01 14:00:33 +07:00
+ ul {
transform: scaleY(1);
opacity: 1;
2023-02-15 00:14:05 +07:00
2023-01-01 14:00:33 +07:00
@if $enable-transitions {
2023-12-24 10:41:54 +07:00
transition:
opacity var(--pico-transition),
transform 0s ease-in-out 0s;
2022-10-23 10:47:50 +07:00
}
}
2023-01-01 14:00:33 +07:00
}
2023-03-05 09:20:24 +07:00
2023-01-01 14:00:33 +07:00
// Close for dropdown
// inside container type accordion
//
2023-04-02 22:37:00 +07:00
details.dropdown[open] summary {
2023-01-01 14:00:33 +07:00
&::before {
display: block;
z-index: 1;
position: fixed;
width: 100vw;
height: 100vh;
inset: 0;
background: none;
content: "";
cursor: default;
2022-10-23 10:47:50 +07:00
}
2022-02-27 22:43:15 +07:00
}
2023-04-09 12:01:33 +07:00
// Label
//
label > details.dropdown {
margin-top: calc(var(#{$}spacing) * 0.25);
}
2022-10-15 23:22:12 +07:00
}