picocss/scss/components/_dropdown.scss

281 lines
8.1 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
//
2024-01-25 01:42:54 +07:00
#{$parent-selector} 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,
2023-01-01 14:00:33 +07:00
> button,
> a {
&::after {
display: block;
width: 1rem;
2023-12-28 13:21:52 +07:00
height: calc(1rem * var(#{$css-var-prefix}line-height, 1.5));
2023-01-01 14:00:33 +07:00
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);
2023-12-28 13:21:52 +07:00
background-image: var(#{$css-var-prefix}icon-chevron);
2023-01-01 14:00:33 +07:00
background-position: right center;
background-size: 1rem auto;
background-repeat: no-repeat;
content: "";
}
}
}
// Container type accordion
// inside a nav
//
2024-01-25 01:42:54 +07:00
#{$parent-selector} nav details.dropdown {
2023-01-01 14:00:33 +07:00
// Override height
margin-bottom: 0;
2022-10-23 10:47:50 +07:00
}
// Button as a select
2023-01-01 14:00:33 +07:00
// inside container type accordion
//
#{$parent-selector} details.dropdown > summary:not([role]) {
2023-01-01 14:00:33 +07:00
height: calc(
1rem *
2023-12-28 13:21:52 +07:00
var(#{$css-var-prefix}line-height) +
var(#{$css-var-prefix}form-element-spacing-vertical) *
2023-01-01 14:00:33 +07:00
2 +
2023-12-28 13:21:52 +07:00
var(#{$css-var-prefix}border-width) *
2023-01-01 14:00:33 +07:00
2
);
2023-12-28 13:21:52 +07:00
padding: var(#{$css-var-prefix}form-element-spacing-vertical)
var(#{$css-var-prefix}form-element-spacing-horizontal);
border: var(#{$css-var-prefix}border-width)
solid
var(#{$css-var-prefix}form-element-border-color);
border-radius: var(#{$css-var-prefix}border-radius);
background-color: var(#{$css-var-prefix}form-element-background-color);
color: var(#{$css-var-prefix}form-element-placeholder-color);
2023-01-01 14:00:33 +07:00
line-height: inherit;
cursor: pointer;
user-select: none;
@if $enable-transitions {
2023-12-24 10:41:54 +07:00
transition:
2023-12-28 13:21:52 +07:00
background-color var(#{$css-var-prefix}transition),
border-color var(#{$css-var-prefix}transition),
color var(#{$css-var-prefix}transition),
box-shadow var(#{$css-var-prefix}transition);
2023-01-01 14:00:33 +07:00
}
&:active,
&:focus {
2023-12-28 13:21:52 +07:00
border-color: var(#{$css-var-prefix}form-element-active-border-color);
background-color: var(#{$css-var-prefix}form-element-active-background-color);
2023-01-01 14:00:33 +07:00
}
&:focus {
2023-12-28 13:21:52 +07:00
box-shadow: 0
0
0
var(#{$css-var-prefix}outline-width)
var(#{$css-var-prefix}form-element-focus-color);
2023-01-01 14:00:33 +07:00
}
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"] {
2023-12-28 13:21:52 +07:00
#{$css-var-prefix}form-element-border-color: var(
#{$css-var-prefix}form-element-valid-border-color
);
#{$css-var-prefix}form-element-active-border-color: var(
#{$css-var-prefix}form-element-valid-focus-color
);
#{$css-var-prefix}form-element-focus-color: var(
#{$css-var-prefix}form-element-valid-focus-color
);
2023-01-01 14:00:33 +07:00
}
&[aria-invalid="true"] {
2023-12-28 13:21:52 +07:00
#{$css-var-prefix}form-element-border-color: var(
#{$css-var-prefix}form-element-invalid-border-color
);
#{$css-var-prefix}form-element-active-border-color: var(
#{$css-var-prefix}form-element-invalid-focus-color
);
#{$css-var-prefix}form-element-focus-color: var(
#{$css-var-prefix}form-element-invalid-focus-color
);
2023-01-01 14:00:33 +07:00
}
}
2023-04-01 10:09:45 +07:00
// Dropdown inside a nav
2023-01-01 14:00:33 +07:00
//
2024-01-25 01:42:54 +07:00
#{$parent-selector} nav details.dropdown {
2023-04-01 10:09:45 +07:00
display: inline;
2023-12-28 13:21:52 +07:00
margin: calc(var(#{$css-var-prefix}nav-element-spacing-vertical) * -1) 0;
2023-04-01 10:09:45 +07:00
> summary {
2024-01-25 21:27:02 +07:00
&::after {
transform: rotate(0deg) translateX(0rem);
}
&:not([role]) {
// Override height
height: calc(
(1rem * var(#{$css-var-prefix}line-height)) +
(var(#{$css-var-prefix}nav-link-spacing-vertical) * 2)
);
padding: calc(
var(#{$css-var-prefix}nav-link-spacing-vertical) -
(var(#{$css-var-prefix}border-width) * 2)
)
var(#{$css-var-prefix}nav-link-spacing-horizontal);
&:focus-visible {
box-shadow: 0
0
0
var(#{$css-var-prefix}outline-width)
var(#{$css-var-prefix}primary-focus);
}
2023-04-01 10:09:45 +07:00
}
}
2023-01-01 14:00:33 +07:00
}
// Submenu
//
#{$parent-selector} 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-12-28 13:21:52 +07:00
margin-top: var(#{$css-var-prefix}outline-width);
2022-10-23 10:47:50 +07:00
padding: 0;
2023-12-28 13:21:52 +07:00
border: var(#{$css-var-prefix}border-width) solid var(#{$css-var-prefix}dropdown-border-color);
border-radius: var(#{$css-var-prefix}border-radius);
background-color: var(#{$css-var-prefix}dropdown-background-color);
box-shadow: var(#{$css-var-prefix}dropdown-box-shadow);
color: var(#{$css-var-prefix}dropdown-color);
2022-10-23 10:47:50 +07:00
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:
2023-12-28 13:21:52 +07:00
opacity var(#{$css-var-prefix}transition),
2023-12-24 10:41:54 +07:00
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;
2023-12-28 13:21:52 +07:00
padding: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * 0.5)
var(#{$css-var-prefix}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 {
2023-12-28 13:21:52 +07:00
margin-top: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * 0.5);
}
2022-10-23 10:47:50 +07:00
&:last-of-type {
2023-12-28 13:21:52 +07:00
margin-bottom: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * 0.5);
}
2022-10-23 10:47:50 +07:00
a {
display: block;
2023-12-28 13:21:52 +07:00
margin: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * -0.5)
calc(var(#{$css-var-prefix}form-element-spacing-horizontal) * -1);
padding: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * 0.5)
var(#{$css-var-prefix}form-element-spacing-horizontal);
2022-10-23 10:47:50 +07:00
overflow: hidden;
2023-01-01 14:00:33 +07:00
border-radius: 0;
2023-12-28 13:21:52 +07:00
color: var(#{$css-var-prefix}dropdown-color);
2022-10-23 10:47:50 +07:00
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"]) {
2023-12-28 13:21:52 +07:00
background-color: var(#{$css-var-prefix}dropdown-hover-background-color);
2022-10-23 10:47:50 +07:00
}
}
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 {
2023-12-28 13:21:52 +07:00
background-color: var(#{$css-var-prefix}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
//
#{$parent-selector} 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
#{$parent-selector} 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:
2023-12-28 15:33:37 +07:00
opacity var(#{$css-var-prefix}transition),
2023-12-24 10:41:54 +07:00
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
//
#{$parent-selector} 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
//
2024-01-25 01:42:54 +07:00
#{$parent-selector} label > details.dropdown {
2023-12-28 13:21:52 +07:00
margin-top: calc(var(#{$css-var-prefix}spacing) * 0.25);
2023-04-09 12:01:33 +07:00
}
2022-10-15 23:22:12 +07:00
}