@use "sass:map"; @use "../settings" as *; @if map.get($modules, "components/dropdown") and $enable-classes { /** * Dropdown (details.dropdown) */ // Container // –––––––––––––––––––– details.dropdown { 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: ""; } } } // Container type accordion // inside a nav // –––––––––––––––––––– nav details.dropdown { // Override height margin-bottom: 0; } // Bouton as a select // inside container type accordion // –––––––––––––––––––– details.dropdown 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); } } // Dropdown inside a nav // –––––––––––––––––––– nav details.dropdown { 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); } } } // Submenu // –––––––––––––––––––– details.dropdown 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, &[aria-current]:not([aria-current="false"]) { 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.dropdown[open] summary { margin-bottom: 0; } // Menu opened // –––––––––––––––––––– // 1. Inside container type accordion details.dropdown[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.dropdown[open] summary { &::before { display: block; z-index: 1; position: fixed; width: 100vw; height: 100vh; inset: 0; background: none; content: ""; cursor: default; } } // Label // –––––––––––––––––––– label > details.dropdown { margin-top: calc(var(#{$✨}spacing) * 0.25); } }