@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 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; } } }