From 51dd2293cab8d77cf13fc2c32b6053ffa654bc56 Mon Sep 17 00:00:00 2001 From: Lucas Larroche Date: Sun, 1 Jan 2023 14:00:33 +0700 Subject: [PATCH] refactor: accordion and dropdown --- scss/components/_accordion.scss | 21 +- scss/components/_dropdown.scss | 381 ++++++++++++++++++-------------- 2 files changed, 227 insertions(+), 175 deletions(-) diff --git a/scss/components/_accordion.scss b/scss/components/_accordion.scss index 39cae2e5..30c0879d 100644 --- a/scss/components/_accordion.scss +++ b/scss/components/_accordion.scss @@ -63,11 +63,17 @@ &:focus { outline: none; - &:not([role="button"]) { + &:not([role]) { color: var(#{$✨}accordion-active-summary-color); } } + &:focus-visible { + &:not([role]) { + color: var(#{$✨}primary); + } + } + // Type button &[role="button"] { width: 100%; @@ -80,11 +86,14 @@ } @if $enable-classes { - // .contrast - &:not(.outline).contrast { - // Marker + &.outline { &::after { - background-image: var(#{$✨}icon-chevron-button-inverse); + background-image: var(#{$✨}icon-chevron); + } + } + &.contrast:not(.outline) { + &::after { + background-image: var(#{$✨}icon-chevron-button-contrast); } } } @@ -94,7 +103,7 @@ // Open &[open] { > summary { - margin-bottom: calc(var(#{$✨}spacing)); + margin-bottom: var(#{$✨}spacing); &:not([role]) { &:not(:focus) { diff --git a/scss/components/_dropdown.scss b/scss/components/_dropdown.scss index c0efaac4..b59605f6 100644 --- a/scss/components/_dropdown.scss +++ b/scss/components/_dropdown.scss @@ -6,31 +6,162 @@ * Dropdown ([role="list"]) */ - // Menu + // Container + // –––––––––––––––––––– + // 1. Container type accordion details[role="list"], - li[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 on in 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); + } + + // 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, - li[role="list"] > ul { + // 2. Inside container type nested list + nav li button + ul, + nav li a + ul { display: flex; z-index: 99; position: absolute; - top: auto; - right: 0; 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); - border-top-right-radius: 0; - border-top-left-radius: 0; 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%; @@ -54,186 +185,98 @@ 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 { - background-color: var(#{$✨}dropdown-hover-background-color); - } - } - - &:has(label) { - &:hover { - background-color: var(#{$✨}dropdown-hover-background-color); - - label { - cursor: pointer; - } - } - } - } - } - - // Marker - details[role="list"] summary, - li[role="list"] > a { - &::after { - display: block; - width: 1rem; - height: calc(1rem * var(#{$✨}line-height, 1.5)); - margin-inline-start: 0.5rem; - float: right; - transform: rotate(0deg); - background-position: right center; - background-size: 1rem auto; - background-repeat: no-repeat; - content: ""; - } - } - - // Global dropdown only - details[role="list"] { - padding: 0; - border-bottom: none; - - // Style as