@use "sass:map"; @use "../settings" as *; @if map.get($modules, "components/dropdown") and $enable-classes { /** * Dropdown (details.dropdown) */ // Container // –––––––––––––––––––– #{$parent-selector} details.dropdown { position: relative; border-bottom: none; // Marker // –––––––––––––––––––– summary, > button, > a { &::after { display: block; width: 1rem; height: calc(1rem * var(#{$css-var-prefix}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(#{$css-var-prefix}icon-chevron); background-position: right center; background-size: 1rem auto; background-repeat: no-repeat; content: ""; } } } // Container type accordion // inside a nav // –––––––––––––––––––– #{$parent-selector} nav details.dropdown { // Override height margin-bottom: 0; } // Bouton as a select // inside container type accordion // –––––––––––––––––––– #{$parent-selector} details.dropdown summary:not([role]) { height: calc( 1rem * var(#{$css-var-prefix}line-height) + var(#{$css-var-prefix}form-element-spacing-vertical) * 2 + var(#{$css-var-prefix}border-width) * 2 ); 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); line-height: inherit; cursor: pointer; user-select: none; @if $enable-transitions { transition: 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); } &:active, &:focus { border-color: var(#{$css-var-prefix}form-element-active-border-color); background-color: var(#{$css-var-prefix}form-element-active-background-color); } &:focus { box-shadow: 0 0 0 var(#{$css-var-prefix}outline-width) var(#{$css-var-prefix}form-element-focus-color); } // Reset focus visible from accordion component &:focus-visible { outline: none; } // Aria-invalid &[aria-invalid="false"] { #{$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 ); } &[aria-invalid="true"] { #{$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 ); } } // Dropdown inside a nav // –––––––––––––––––––– #{$parent-selector} nav details.dropdown { display: inline; margin: calc(var(#{$css-var-prefix}nav-element-spacing-vertical) * -1) 0; summary { &::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); } } } } // Submenu // –––––––––––––––––––– #{$parent-selector} 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(#{$css-var-prefix}outline-width); padding: 0; 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); white-space: nowrap; opacity: 0; @if $enable-transitions { transition: opacity var(#{$css-var-prefix}transition), transform 0s ease-in-out 1s; } &[dir="rtl"] { right: 0; left: auto; } li { width: 100%; margin-bottom: 0; padding: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * 0.5) var(#{$css-var-prefix}form-element-spacing-horizontal); list-style: none; &:first-of-type { margin-top: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * 0.5); } &:last-of-type { margin-bottom: calc(var(#{$css-var-prefix}form-element-spacing-vertical) * 0.5); } a { display: block; 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); overflow: hidden; border-radius: 0; color: var(#{$css-var-prefix}dropdown-color); text-decoration: none; text-overflow: ellipsis; &:hover, &:focus, &:active, &:focus-visible, &[aria-current]:not([aria-current="false"]) { background-color: var(#{$css-var-prefix}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(#{$css-var-prefix}dropdown-hover-background-color); } } } // Button opened // inside container type accordion // –––––––––––––––––––– #{$parent-selector} details.dropdown[open] summary { margin-bottom: 0; } // Menu opened // –––––––––––––––––––– // 1. Inside container type accordion #{$parent-selector} details.dropdown[open] summary { + ul { transform: scaleY(1); opacity: 1; @if $enable-transitions { transition: opacity var(#{$css-var-prefix}transition), transform 0s ease-in-out 0s; } } } // Close for dropdown // inside container type accordion // –––––––––––––––––––– #{$parent-selector} details.dropdown[open] summary { &::before { display: block; z-index: 1; position: fixed; width: 100vw; height: 100vh; inset: 0; background: none; content: ""; cursor: default; } } // Label // –––––––––––––––––––– #{$parent-selector} label > details.dropdown { margin-top: calc(var(#{$css-var-prefix}spacing) * 0.25); } }