refactor: modules and css vars

This commit is contained in:
Lucas Larroche 2022-10-23 10:47:50 +07:00
parent 2e4d6c66ec
commit ce2ed6826d
46 changed files with 3874 additions and 3534 deletions

View file

@ -1,117 +1,120 @@
@use "sass:map";
@use "../settings" as *;
/**
* Accordion (<details>)
*/
@if map.get($modules, "components/accordion") {
/**
* Accordion (<details>)
*/
details {
display: block;
margin-bottom: var(#{$}spacing);
padding-bottom: var(#{$}spacing);
border-bottom: var(#{$}border-width) solid var(#{$}accordion-border-color);
details {
display: block;
margin-bottom: var(#{$}spacing);
padding-bottom: var(#{$}spacing);
border-bottom: var(#{$}border-width) solid var(#{$}accordion-border-color);
summary {
line-height: 1rem;
list-style-type: none;
cursor: pointer;
&:not([role]) {
color: var(#{$}accordion-close-summary-color);
}
@if $enable-transitions {
transition: color var(#{$}transition);
}
// Reset marker
&::-webkit-details-marker {
display: none;
}
&::marker {
display: none;
}
&::-moz-list-bullet {
summary {
line-height: 1rem;
list-style-type: none;
}
cursor: pointer;
// Marker
&::after {
display: block;
width: 1rem;
height: 1rem;
margin-inline-start: calc(var(#{$}spacing, 1rem) * 0.5);
float: right;
transform: rotate(-90deg);
background-image: var(#{$}icon-chevron);
background-position: right center;
background-size: 1rem auto;
background-repeat: no-repeat;
content: "";
&:not([role]) {
color: var(#{$}accordion-close-summary-color);
}
@if $enable-transitions {
transition: transform var(#{$}transition);
transition: color var(#{$}transition);
}
}
&:focus {
outline: none;
&:not([role="button"]) {
color: var(#{$}accordion-active-summary-color);
// Reset marker
&::-webkit-details-marker {
display: none;
}
}
// Type button
&[role="button"] {
width: 100%;
text-align: left;
&::marker {
display: none;
}
&::-moz-list-bullet {
list-style-type: none;
}
// Marker
&::after {
height: calc(1rem * var(#{$}line-height, 1.5));
background-image: var(#{$}icon-chevron-button);
display: block;
width: 1rem;
height: 1rem;
margin-inline-start: calc(var(#{$}spacing, 1rem) * 0.5);
float: right;
transform: rotate(-90deg);
background-image: var(#{$}icon-chevron);
background-position: right center;
background-size: 1rem auto;
background-repeat: no-repeat;
content: "";
@if $enable-transitions {
transition: transform var(#{$}transition);
}
}
@if $enable-classes {
// .contrast
&:not(.outline).contrast {
// Marker
&::after {
background-image: var(#{$}icon-chevron-button-inverse);
&:focus {
outline: none;
&:not([role="button"]) {
color: var(#{$}accordion-active-summary-color);
}
}
// Type button
&[role="button"] {
width: 100%;
text-align: left;
// Marker
&::after {
height: calc(1rem * var(#{$}line-height, 1.5));
background-image: var(#{$}icon-chevron-button);
}
@if $enable-classes {
// .contrast
&:not(.outline).contrast {
// Marker
&::after {
background-image: var(#{$}icon-chevron-button-inverse);
}
}
}
}
}
}
// Open
&[open] {
> summary {
margin-bottom: calc(var(#{$}spacing));
// Open
&[open] {
> summary {
margin-bottom: calc(var(#{$}spacing));
&:not([role]) {
&:not(:focus) {
color: var(#{$}accordion-open-summary-color);
&:not([role]) {
&:not(:focus) {
color: var(#{$}accordion-open-summary-color);
}
}
&::after {
transform: rotate(0);
}
}
}
}
&::after {
transform: rotate(0);
}
}
}
}
[dir="rtl"] {
details {
summary {
text-align: right;
&::after {
float: left;
background-position: left center;
[dir="rtl"] {
details {
summary {
text-align: right;
&::after {
float: left;
background-position: left center;
}
}
}
}

View file

@ -1,37 +1,40 @@
@use "sass:map";
@use "../settings" as *;
/**
* Card (<article>)
*/
@if map.get($modules, "components/card") {
/**
* Card (<article>)
*/
article {
margin: var(#{$}block-spacing-vertical) 0;
padding: var(#{$}block-spacing-vertical) var(#{$}block-spacing-horizontal);
border-radius: var(#{$}border-radius);
background: var(#{$}card-background-color);
box-shadow: var(#{$}card-box-shadow);
article {
margin: var(#{$}block-spacing-vertical) 0;
padding: var(#{$}block-spacing-vertical) var(#{$}block-spacing-horizontal);
border-radius: var(#{$}border-radius);
background: var(#{$}card-background-color);
box-shadow: var(#{$}card-box-shadow);
> header,
> footer {
margin-right: calc(var(#{$}block-spacing-horizontal) * -1);
margin-left: calc(var(#{$}block-spacing-horizontal) * -1);
padding: calc(var(#{$}block-spacing-vertical) * 0.66) var(#{$}block-spacing-horizontal);
background-color: var(#{$}card-sectionning-background-color);
}
> header,
> footer {
margin-right: calc(var(#{$}block-spacing-horizontal) * -1);
margin-left: calc(var(#{$}block-spacing-horizontal) * -1);
padding: calc(var(#{$}block-spacing-vertical) * 0.66) var(#{$}block-spacing-horizontal);
background-color: var(#{$}card-sectionning-background-color);
}
> header {
margin-top: calc(var(#{$}block-spacing-vertical) * -1);
margin-bottom: var(#{$}block-spacing-vertical);
border-bottom: var(#{$}border-width) solid var(#{$}card-border-color);
border-top-right-radius: var(#{$}border-radius);
border-top-left-radius: var(#{$}border-radius);
}
> header {
margin-top: calc(var(#{$}block-spacing-vertical) * -1);
margin-bottom: var(#{$}block-spacing-vertical);
border-bottom: var(#{$}border-width) solid var(#{$}card-border-color);
border-top-right-radius: var(#{$}border-radius);
border-top-left-radius: var(#{$}border-radius);
}
> footer {
margin-top: var(#{$}block-spacing-vertical);
margin-bottom: calc(var(#{$}block-spacing-vertical) * -1);
border-top: var(#{$}border-width) solid var(#{$}card-border-color);
border-bottom-right-radius: var(#{$}border-radius);
border-bottom-left-radius: var(#{$}border-radius);
> footer {
margin-top: var(#{$}block-spacing-vertical);
margin-bottom: calc(var(#{$}block-spacing-vertical) * -1);
border-top: var(#{$}border-width) solid var(#{$}card-border-color);
border-bottom-right-radius: var(#{$}border-radius);
border-bottom-left-radius: var(#{$}border-radius);
}
}
}

View file

@ -1,208 +1,216 @@
@use "sass:map";
@use "../settings" as *;
/**
* Dropdown ([role="list"])
*/
@if map.get($modules, "components/dropdown") {
/**
* Dropdown ([role="list"])
*/
// Menu
details[role="list"],
li[role="list"] {
position: relative;
}
// Menu
details[role="list"],
li[role="list"] {
position: relative;
}
details[role="list"] summary + ul,
li[role="list"] > ul {
display: flex;
z-index: 99;
position: absolute;
top: auto;
right: 0;
left: 0;
flex-direction: column;
margin: 0;
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(#{$}card-box-shadow);
color: var(#{$}dropdown-color);
white-space: nowrap;
details[role="list"] summary + ul,
li[role="list"] > ul {
display: flex;
z-index: 99;
position: absolute;
top: auto;
right: 0;
left: 0;
flex-direction: column;
margin: 0;
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;
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);
li {
width: 100%;
margin-bottom: 0;
padding: calc(var(#{$}form-element-spacing-vertical) * 0.5)
var(#{$}form-element-spacing-horizontal);
overflow: hidden;
color: var(#{$}dropdown-color);
text-decoration: none;
text-overflow: ellipsis;
list-style: none;
&:hover {
background-color: var(#{$}dropdown-hover-background-color);
}
}
}
}
// 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 <summary> as <select>
summary {
margin-bottom: 0;
&: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;
@if $enable-transitions {
transition: background-color var(#{$}transition), border-color var(#{$}transition),
color var(#{$}transition), box-shadow var(#{$}transition);
&:first-of-type {
margin-top: calc(var(#{$}form-element-spacing-vertical) * 0.5);
}
&:active,
&:focus {
border-color: var(#{$}form-element-active-border-color);
background-color: var(#{$}form-element-active-background-color);
&:last-of-type {
margin-bottom: calc(var(#{$}form-element-spacing-vertical) * 0.5);
}
&:focus {
box-shadow: 0 0 0 var(#{$}outline-width) var(#{$}form-element-focus-color);
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;
color: var(#{$}dropdown-color);
text-decoration: none;
text-overflow: ellipsis;
&:hover {
background-color: var(#{$}dropdown-hover-background-color);
}
}
}
}
// Close for details[role="list"]
&[open] summary {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
&::before {
// Marker
details[role="list"] summary,
li[role="list"] > a {
&::after {
display: block;
z-index: 1;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: none;
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: "";
cursor: default;
}
}
}
// All Dropdowns inside <nav>
nav details[role="list"] summary,
nav li[role="list"] a {
display: flex;
direction: ltr;
}
// Global dropdown only
details[role="list"] {
padding: 0;
border-bottom: none;
nav details[role="list"] summary + ul,
nav li[role="list"] > ul {
min-width: fit-content;
border-radius: var(#{$}border-radius);
// Style <summary> as <select>
summary {
margin-bottom: 0;
li a {
border-radius: 0;
}
}
&: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;
// Dropdowns inside <nav> as nested <details>
nav details[role="list"] {
summary,
summary:not([role]) {
height: auto;
padding: var(#{$}nav-link-spacing-vertical) var(#{$}nav-link-spacing-horizontal);
}
@if $enable-transitions {
transition: background-color var(#{$}transition), border-color var(#{$}transition),
color var(#{$}transition), box-shadow var(#{$}transition);
}
&[open] summary {
border-radius: var(#{$}border-radius);
}
&:active,
&:focus {
border-color: var(#{$}form-element-active-border-color);
background-color: var(#{$}form-element-active-background-color);
}
summary + ul {
margin-top: var(#{$}outline-width);
margin-inline-start: 0;
}
&:focus {
box-shadow: 0 0 0 var(#{$}outline-width) var(#{$}form-element-focus-color);
}
}
}
summary[role="link"] {
margin-bottom: calc(var(#{$}nav-link-spacing-vertical) * -1);
line-height: var(#{$}line-height);
// Close for details[role="list"]
&[open] summary {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
+ ul {
margin-top: calc(var(#{$}nav-link-spacing-vertical) + var(#{$}outline-width));
margin-inline-start: calc(var(#{$}nav-link-spacing-horizontal) * -1);
&::before {
display: block;
z-index: 1;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: none;
content: "";
cursor: default;
}
}
}
}
// Dropdowns inside a <nav> without using <details>
li[role="list"] {
// Open on hover (for mobile)
// or on active/focus (for keyboard navigation)
&:hover > ul,
a:active ~ ul,
a:focus ~ ul {
// All Dropdowns inside <nav>
nav details[role="list"] summary,
nav li[role="list"] a {
display: flex;
direction: ltr;
}
> ul {
display: none;
margin-top: calc(var(#{$}nav-link-spacing-vertical) + var(#{$}outline-width));
margin-inline-start: calc(
var(#{$}nav-element-spacing-horizontal) - var(#{$}nav-link-spacing-horizontal)
);
nav details[role="list"] summary + ul,
nav li[role="list"] > ul {
min-width: fit-content;
border-radius: var(#{$}border-radius);
li a {
border-radius: 0;
}
}
> a::after {
background-image: var(#{$}icon-chevron);
// Dropdowns inside <nav> as nested <details>
nav details[role="list"] {
summary,
summary:not([role]) {
height: auto;
padding: var(#{$}nav-link-spacing-vertical) var(#{$}nav-link-spacing-horizontal);
}
&[open] summary {
border-radius: var(#{$}border-radius);
}
summary + ul {
margin-top: var(#{$}outline-width);
margin-inline-start: 0;
}
summary[role="link"] {
margin-bottom: calc(var(#{$}nav-link-spacing-vertical) * -1);
line-height: var(#{$}line-height);
+ ul {
margin-top: calc(var(#{$}nav-link-spacing-vertical) + var(#{$}outline-width));
margin-inline-start: calc(var(#{$}nav-link-spacing-horizontal) * -1);
}
}
}
// Dropdowns inside a <nav> without using <details>
li[role="list"] {
// Open on hover (for mobile)
// or on active/focus (for keyboard navigation)
&:hover > ul,
a:active ~ ul,
a:focus ~ ul {
display: flex;
}
> ul {
display: none;
margin-top: calc(var(#{$}nav-link-spacing-vertical) + var(#{$}outline-width));
margin-inline-start: calc(
var(#{$}nav-element-spacing-horizontal) - var(#{$}nav-link-spacing-horizontal)
);
}
> a::after {
background-image: var(#{$}icon-chevron);
}
}
}

View file

@ -1,58 +1,61 @@
@use "sass:map";
@use "../settings" as *;
/**
* Loading ([aria-busy=true])
*/
@if map.get($modules, "components/loading") {
/**
* Loading ([aria-busy=true])
*/
// Cursor
[aria-busy="true"] {
cursor: progress;
}
// Everyting except form elements
[aria-busy="true"]:not(input, select, textarea) {
&::before {
display: inline-block;
width: 1em;
height: 1em;
border: 0.1875em solid currentColor;
border-radius: 1em;
border-right-color: transparent;
content: "";
vertical-align: text-bottom;
vertical-align: -0.125em; // Visual alignment
animation: spinner 0.75s linear infinite;
opacity: var(#{$}loading-spinner-opacity);
// Cursor
[aria-busy="true"] {
cursor: progress;
}
&:not(:empty) {
// Everything except form elements
[aria-busy="true"]:not(input, select, textarea) {
&::before {
margin-right: calc(var(#{$}spacing) * 0.5);
margin-left: 0;
margin-inline-start: 0;
margin-inline-end: calc(var(#{$}spacing) * 0.5);
display: inline-block;
width: 1em;
height: 1em;
border: 0.1875em solid currentColor;
border-radius: 1em;
border-right-color: transparent;
content: "";
vertical-align: text-bottom;
vertical-align: -0.125em; // Visual alignment
animation: spinner 0.75s linear infinite;
opacity: var(#{$}loading-spinner-opacity);
}
&:not(:empty) {
&::before {
margin-right: calc(var(#{$}spacing) * 0.5);
margin-left: 0;
margin-inline-start: 0;
margin-inline-end: calc(var(#{$}spacing) * 0.5);
}
}
&:empty {
text-align: center;
}
}
&:empty {
text-align: center;
// Buttons and links
button,
input[type="submit"],
input[type="button"],
input[type="reset"],
a {
&[aria-busy="true"] {
pointer-events: none;
}
}
}
// Buttons and links
button,
input[type="submit"],
input[type="button"],
input[type="reset"],
a {
&[aria-busy="true"] {
pointer-events: none;
}
}
// Animation: rotate
@keyframes spinner {
to {
transform: rotate(360deg);
// Animation: rotate
@keyframes spinner {
to {
transform: rotate(360deg);
}
}
}

View file

@ -1,170 +1,172 @@
@use "sass:map";
@use "../settings" as *;
/**
* Modal (<dialog>)
*/
@if map.get($modules, "components/modal") {
/**
* Modal (<dialog>)
*/
:root {
#{$✨}scrollbar-width: 0px;
}
:root {
#{$✨}scrollbar-width: 0px;
}
dialog {
display: flex;
z-index: 999;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
align-items: center;
justify-content: center;
width: inherit;
min-width: 100%;
height: inherit;
min-height: 100%;
padding: var(#{$}spacing);
border: 0;
backdrop-filter: var(#{$}modal-overlay-backdrop-filter);
background-color: var(#{$}modal-overlay-background-color);
color: var(#{$}color);
dialog {
display: flex;
z-index: 999;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
align-items: center;
justify-content: center;
width: inherit;
min-width: 100%;
height: inherit;
min-height: 100%;
padding: var(#{$}spacing);
border: 0;
backdrop-filter: var(#{$}modal-overlay-backdrop-filter);
background-color: var(#{$}modal-overlay-background-color);
color: var(#{$}color);
// Content
article {
max-height: calc(100vh - var(#{$}spacing) * 2);
overflow: auto;
// Content
article {
max-height: calc(100vh - var(#{$}spacing) * 2);
overflow: auto;
@if map.get($breakpoints, "sm") {
@media (min-width: map.get(map.get($breakpoints, "sm"), "breakpoint")) {
max-width: map.get(map.get($breakpoints, "sm"), "viewport");
@if map.get($breakpoints, "sm") {
@media (min-width: map.get(map.get($breakpoints, "sm"), "breakpoint")) {
max-width: map.get(map.get($breakpoints, "sm"), "viewport");
}
}
}
@if map.get($breakpoints, "md") {
@media (min-width: map.get(map.get($breakpoints, "md"), "breakpoint")) {
max-width: map.get(map.get($breakpoints, "md"), "viewport");
@if map.get($breakpoints, "md") {
@media (min-width: map.get(map.get($breakpoints, "md"), "breakpoint")) {
max-width: map.get(map.get($breakpoints, "md"), "viewport");
}
}
}
> header,
> footer {
padding: calc(var(#{$}block-spacing-vertical) * 0.5) var(#{$}block-spacing-horizontal);
}
> header {
.close {
margin: 0;
margin-left: var(#{$}spacing);
float: right;
> header,
> footer {
padding: calc(var(#{$}block-spacing-vertical) * 0.5) var(#{$}block-spacing-horizontal);
}
}
> footer {
text-align: right;
> header {
.close {
margin: 0;
margin-left: var(#{$}spacing);
float: right;
}
}
[role="button"] {
margin-bottom: 0;
> footer {
text-align: right;
&:not(:first-of-type) {
margin-left: calc(var(#{$}spacing) * 0.5);
[role="button"] {
margin-bottom: 0;
&:not(:first-of-type) {
margin-left: calc(var(#{$}spacing) * 0.5);
}
}
}
p {
&:last-of-type {
margin: 0;
}
}
// Close icon
@if $enable-classes {
.close {
display: block;
width: 1rem;
height: 1rem;
margin-top: calc(var(#{$}spacing) * -1);
margin-bottom: var(#{$}spacing);
margin-left: auto;
background-image: var(#{$}icon-close);
background-position: center;
background-size: auto 1rem;
background-repeat: no-repeat;
opacity: 0.5;
@if $enable-transitions {
transition: opacity var(#{$}transition);
}
&:is([aria-current], :hover, :active, :focus) {
opacity: 1;
}
}
}
}
p {
&:last-of-type {
margin: 0;
// Closed state
&:not([open]),
&[open="false"] {
display: none;
}
}
// Utilities
@if $enable-classes {
.modal-is-open {
padding-right: var(#{$}scrollbar-width, 0px);
overflow: hidden;
pointer-events: none;
dialog {
pointer-events: auto;
}
}
}
// Close icon
@if $enable-classes {
.close {
display: block;
width: 1rem;
height: 1rem;
margin-top: calc(var(#{$}block-spacing-vertical) * -0.5);
margin-bottom: var(#{$}typography-spacing-vertical);
margin-left: auto;
background-image: var(#{$}icon-close);
background-position: center;
background-size: auto 1rem;
background-repeat: no-repeat;
opacity: 0.5;
// Animations
@if $enable-classes and $enable-transitions {
$animation-duration: 0.2s;
@if $enable-transitions {
transition: opacity var(#{$}transition);
}
:where(.modal-is-opening, .modal-is-closing) {
dialog,
dialog > article {
animation-duration: $animation-duration;
animation-timing-function: ease-in-out;
animation-fill-mode: both;
}
&:is([aria-current], :hover, :active, :focus) {
opacity: 1;
dialog {
animation-duration: ($animation-duration * 4);
animation-name: modal-overlay;
> article {
animation-delay: $animation-duration;
animation-name: modal;
}
}
}
}
// Closed state
&:not([open]),
&[open="false"] {
display: none;
}
}
// Utilities
@if $enable-classes {
.modal-is-open {
padding-right: var(#{$}scrollbar-width, 0px);
overflow: hidden;
pointer-events: none;
dialog {
pointer-events: auto;
}
}
}
// Animations
@if ($enable-classes and $enable-transitions) {
$animation-duration: 0.2s;
:where(.modal-is-opening, .modal-is-closing) {
dialog,
dialog > article {
animation-duration: $animation-duration;
animation-timing-function: ease-in-out;
animation-fill-mode: both;
.modal-is-closing {
dialog,
dialog > article {
animation-delay: 0s;
animation-direction: reverse;
}
}
dialog {
animation-duration: ($animation-duration * 4);
animation-name: modal-overlay;
@keyframes modal-overlay {
from {
backdrop-filter: none;
background-color: transparent;
}
}
> article {
animation-delay: $animation-duration;
animation-name: modal;
@keyframes modal {
from {
transform: translateY(-100%);
opacity: 0;
}
}
}
.modal-is-closing {
dialog,
dialog > article {
animation-delay: 0s;
animation-direction: reverse;
}
}
@keyframes modal-overlay {
from {
backdrop-filter: none;
background-color: transparent;
}
}
@keyframes modal {
from {
transform: translateY(-100%);
opacity: 0;
}
}
}

View file

@ -1,139 +1,142 @@
@use "sass:map";
@use "../settings" as *;
/**
* Nav
*/
@if map.get($modules, "components/nav") {
/**
* Nav
*/
// Reboot based on :
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
// Reboot based on :
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
// Prevent VoiceOver from ignoring list semantics in Safari (opinionated)
:where(nav li)::before {
float: left;
content: "\200B";
}
// Pico
//
// Horizontal Nav
nav,
nav ul {
display: flex;
}
nav {
justify-content: space-between;
ol,
ul {
align-items: center;
margin-bottom: 0;
padding: 0;
list-style: none;
&:first-of-type {
margin-left: calc(var(#{$}nav-element-spacing-horizontal) * -1);
}
&:last-of-type {
margin-right: calc(var(#{$}nav-element-spacing-horizontal) * -1);
}
// Prevent VoiceOver from ignoring list semantics in Safari (opinionated)
:where(nav li)::before {
float: left;
content: "\200B";
}
li {
display: inline-block;
margin: 0;
padding: var(#{$}nav-element-spacing-vertical) var(#{$}nav-element-spacing-horizontal);
// Pico
//
// Minimal support for buttons and forms elements
> * {
#{$✨}spacing: 0;
}
// Horizontal Nav
nav,
nav ul {
display: flex;
}
:where(a, [role="link"]) {
display: inline-block;
margin: calc(var(#{$}nav-link-spacing-vertical) * -1)
calc(var(#{$}nav-link-spacing-horizontal) * -1);
padding: var(#{$}nav-link-spacing-vertical) var(#{$}nav-link-spacing-horizontal);
border-radius: var(#{$}border-radius);
text-decoration: none;
nav {
justify-content: space-between;
&:is([aria-current], :hover, :active, :focus) {
text-decoration: none;
}
}
ol,
ul {
align-items: center;
margin-bottom: 0;
padding: 0;
list-style: none;
// Breadcrumb
&[aria-label="breadcrumb"] {
align-items: center;
justify-content: start;
& ul li {
&:not(:first-child) {
margin-inline-start: var(#{$}nav-link-spacing-horizontal);
&:first-of-type {
margin-left: calc(var(#{$}nav-element-spacing-horizontal) * -1);
}
&:last-of-type {
margin-right: calc(var(#{$}nav-element-spacing-horizontal) * -1);
}
}
&:not(:last-child) {
::after {
position: absolute;
width: calc(var(#{$}nav-link-spacing-horizontal) * 2);
margin-inline-start: calc(var(#{$}nav-link-spacing-horizontal) / 2);
content: "/";
color: var(#{$}muted-color);
text-align: center;
li {
display: inline-block;
margin: 0;
padding: var(#{$}nav-element-spacing-vertical) var(#{$}nav-element-spacing-horizontal);
// Minimal support for buttons and forms elements
> * {
#{$✨}spacing: 0;
}
}
:where(a, [role="link"]) {
display: inline-block;
margin: calc(var(#{$}nav-link-spacing-vertical) * -1)
calc(var(#{$}nav-link-spacing-horizontal) * -1);
padding: var(#{$}nav-link-spacing-vertical) var(#{$}nav-link-spacing-horizontal);
border-radius: var(#{$}border-radius);
text-decoration: none;
&:is([aria-current], :hover, :active, :focus) {
text-decoration: none;
}
}
// Breadcrumb
&[aria-label="breadcrumb"] {
align-items: center;
justify-content: start;
& ul li {
&:not(:first-child) {
margin-inline-start: var(#{$}nav-link-spacing-horizontal);
}
&:not(:last-child) {
::after {
position: absolute;
width: calc(var(#{$}nav-link-spacing-horizontal) * 2);
margin-inline-start: calc(var(#{$}nav-link-spacing-horizontal) / 2);
content: "/";
color: var(#{$}muted-color);
text-align: center;
}
}
}
& a[aria-current] {
background-color: transparent;
color: inherit;
text-decoration: none;
pointer-events: none;
}
}
& a[aria-current] {
background-color: transparent;
color: inherit;
text-decoration: none;
pointer-events: none;
// Minimal support for role="button"
[role="button"] {
margin-right: inherit;
margin-left: inherit;
padding: var(#{$}nav-link-spacing-vertical) var(#{$}nav-link-spacing-horizontal);
}
}
// Minimal support for role="button"
[role="button"] {
margin-right: inherit;
margin-left: inherit;
padding: var(#{$}nav-link-spacing-vertical) var(#{$}nav-link-spacing-horizontal);
}
}
// Vertical Nav
aside {
nav,
ol,
ul,
li {
display: block;
}
li {
padding: calc(var(#{$}nav-element-spacing-vertical) * 0.5)
var(#{$}nav-element-spacing-horizontal);
a {
// Vertical Nav
aside {
nav,
ol,
ul,
li {
display: block;
}
// Minimal support for links as buttons
[role="button"] {
margin: inherit;
li {
padding: calc(var(#{$}nav-element-spacing-vertical) * 0.5)
var(#{$}nav-element-spacing-horizontal);
a {
display: block;
}
// Minimal support for links as buttons
[role="button"] {
margin: inherit;
}
}
}
}
// Breadcrumb RTL
[dir="rtl"] {
nav {
&[aria-label="breadcrumb"] {
& ul li {
&:not(:last-child) {
::after {
content: "\\";
// Breadcrumb RTL
[dir="rtl"] {
nav {
&[aria-label="breadcrumb"] {
& ul li {
&:not(:last-child) {
::after {
content: "\\";
}
}
}
}

View file

@ -1,91 +1,94 @@
@use "sass:map";
@use "../settings" as *;
/**
* Progress
*/
@if map.get($modules, "components/progress") {
/**
* Progress
*/
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// Reboot based on :
// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css
// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css
//
// 1. Add the correct display in Edge 18- and IE
// 2. Add the correct vertical alignment in Chrome, Edge, and Firefox
progress {
display: inline-block; // 1
vertical-align: baseline; // 2
}
// 1. Add the correct display in Edge 18- and IE
// 2. Add the correct vertical alignment in Chrome, Edge, and Firefox
progress {
display: inline-block; // 1
vertical-align: baseline; // 2
}
// Pico
//
// Pico
//
progress {
// Reset the default appearance
-webkit-appearance: none;
-moz-appearance: none;
progress {
// Reset the default appearance
-webkit-appearance: none;
-moz-appearance: none;
// Styles
display: inline-block;
appearance: none;
width: 100%;
height: 0.5rem;
margin-bottom: calc(var(#{$}spacing) * 0.5);
overflow: hidden;
// Styles
display: inline-block;
appearance: none;
width: 100%;
height: 0.5rem;
margin-bottom: calc(var(#{$}spacing) * 0.5);
overflow: hidden;
// Remove Firefox and Opera border
border: 0;
border-radius: var(#{$}border-radius);
background-color: var(#{$}progress-background-color);
// IE10 uses `color` to set the bar background-color
color: var(#{$}progress-color);
&::-webkit-progress-bar {
// Remove Firefox and Opera border
border: 0;
border-radius: var(#{$}border-radius);
background: none;
}
&[value]::-webkit-progress-value {
background-color: var(#{$}progress-color);
}
&::-moz-progress-bar {
background-color: var(#{$}progress-color);
}
background-color: var(#{$}progress-background-color);
// Indeterminate state
@media (prefers-reduced-motion: no-preference) {
&:indeterminate {
background: var(#{$}progress-background-color)
linear-gradient(
to right,
var(#{$}progress-color) 30%,
var(#{$}progress-background-color) 30%
)
top left / 150% 150% no-repeat;
animation: progress-indeterminate 1s linear infinite;
// IE10 uses `color` to set the bar background-color
color: var(#{$}progress-color);
&[value]::-webkit-progress-value {
background-color: transparent;
}
&::-moz-progress-bar {
background-color: transparent;
&::-webkit-progress-bar {
border-radius: var(#{$}border-radius);
background: none;
}
&[value]::-webkit-progress-value {
background-color: var(#{$}progress-color);
}
&::-moz-progress-bar {
background-color: var(#{$}progress-color);
}
// Indeterminate state
@media (prefers-reduced-motion: no-preference) {
&:indeterminate {
background: var(#{$}progress-background-color)
linear-gradient(
to right,
var(#{$}progress-color) 30%,
var(#{$}progress-background-color) 30%
)
top left / 150% 150% no-repeat;
animation: progress-indeterminate 1s linear infinite;
&[value]::-webkit-progress-value {
background-color: transparent;
}
&::-moz-progress-bar {
background-color: transparent;
}
}
}
}
}
[dir="rtl"] {
@media (prefers-reduced-motion: no-preference) {
progress:indeterminate {
animation-direction: reverse;
[dir="rtl"] {
@media (prefers-reduced-motion: no-preference) {
progress:indeterminate {
animation-direction: reverse;
}
}
}
@keyframes progress-indeterminate {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
}
@keyframes progress-indeterminate {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}

View file

@ -1,276 +1,279 @@
@use "sass:map";
@use "../settings" as *;
/**
* Tooltip ([data-tooltip])
*/
@if map.get($modules, "components/tooltip") {
/**
* Tooltip ([data-tooltip])
*/
[data-tooltip] {
position: relative;
[data-tooltip] {
position: relative;
&:not(a, button, input) {
border-bottom: 1px dotted;
text-decoration: none;
cursor: help;
}
&:not(a, button, input) {
border-bottom: 1px dotted;
text-decoration: none;
cursor: help;
}
&[data-placement="top"]::before,
&[data-placement="top"]::after,
&::before,
&::after {
display: block;
z-index: 99;
position: absolute;
bottom: 100%;
left: 50%;
padding: 0.25rem 0.5rem;
overflow: hidden;
transform: translate(-50%, -0.25rem);
border-radius: var(#{$}border-radius);
background: var(#{$}tooltip-background-color);
content: attr(data-tooltip);
color: var(#{$}tooltip-color);
font-style: normal;
font-weight: var(#{$}font-weight);
font-size: 0.875rem;
text-decoration: none;
text-overflow: ellipsis;
white-space: nowrap;
opacity: 0;
pointer-events: none;
}
// Caret
&[data-placement="top"]::after,
&::after {
padding: 0;
transform: translate(-50%, 0rem);
border-top: 0.3rem solid;
border-right: 0.3rem solid transparent;
border-left: 0.3rem solid transparent;
border-radius: 0;
background-color: transparent;
content: "";
color: var(#{$}tooltip-background-color);
}
&[data-placement="bottom"] {
&[data-placement="top"]::before,
&[data-placement="top"]::after,
&::before,
&::after {
top: 100%;
bottom: auto;
transform: translate(-50%, 0.25rem);
display: block;
z-index: 99;
position: absolute;
bottom: 100%;
left: 50%;
padding: 0.25rem 0.5rem;
overflow: hidden;
transform: translate(-50%, -0.25rem);
border-radius: var(#{$}border-radius);
background: var(#{$}tooltip-background-color);
content: attr(data-tooltip);
color: var(#{$}tooltip-color);
font-style: normal;
font-weight: var(#{$}font-weight);
font-size: 0.875rem;
text-decoration: none;
text-overflow: ellipsis;
white-space: nowrap;
opacity: 0;
pointer-events: none;
}
&:after {
transform: translate(-50%, -0.3rem);
border: 0.3rem solid transparent;
border-bottom: 0.3rem solid;
}
}
&[data-placement="left"] {
&::before,
// Caret
&[data-placement="top"]::after,
&::after {
top: 50%;
right: 100%;
bottom: auto;
left: auto;
transform: translate(-0.25rem, -50%);
padding: 0;
transform: translate(-50%, 0rem);
border-top: 0.3rem solid;
border-right: 0.3rem solid transparent;
border-left: 0.3rem solid transparent;
border-radius: 0;
background-color: transparent;
content: "";
color: var(#{$}tooltip-background-color);
}
&:after {
transform: translate(0.3rem, -50%);
border: 0.3rem solid transparent;
border-left: 0.3rem solid;
}
}
&[data-placement="right"] {
&::before,
&::after {
top: 50%;
right: auto;
bottom: auto;
left: 100%;
transform: translate(0.25rem, -50%);
}
&:after {
transform: translate(-0.3rem, -50%);
border: 0.3rem solid transparent;
border-right: 0.3rem solid;
}
}
// Display
&:focus,
&:hover {
&::before,
&::after {
opacity: 1;
}
}
@if $enable-transitions {
// Animations, excluding touch devices
@media (hover: hover) and (pointer: fine) {
&[data-placement="bottom"]:focus,
&[data-placement="bottom"]:hover &:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-top;
}
&::after {
animation-name: tooltip-caret-slide-top;
}
}
&[data-placement="bottom"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-bottom;
}
&::after {
animation-name: tooltip-caret-slide-bottom;
}
}
}
&[data-placement="left"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-left;
}
&::after {
animation-name: tooltip-caret-slide-left;
}
}
}
&[data-placement="right"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-right;
}
&::after {
animation-name: tooltip-caret-slide-right;
}
}
}
}
@keyframes tooltip-slide-top {
from {
transform: translate(-50%, 0.75rem);
opacity: 0;
}
to {
transform: translate(-50%, -0.25rem);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-top {
from {
opacity: 0;
}
50% {
transform: translate(-50%, -0.25rem);
opacity: 0;
}
to {
transform: translate(-50%, 0rem);
opacity: 1;
}
}
@keyframes tooltip-slide-bottom {
from {
transform: translate(-50%, -0.75rem);
opacity: 0;
}
to {
&[data-placement="bottom"] {
&::before,
&::after {
top: 100%;
bottom: auto;
transform: translate(-50%, 0.25rem);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-bottom {
from {
opacity: 0;
}
50% {
transform: translate(-50%, -0.5rem);
opacity: 0;
}
to {
&:after {
transform: translate(-50%, -0.3rem);
opacity: 1;
border: 0.3rem solid transparent;
border-bottom: 0.3rem solid;
}
}
@keyframes tooltip-slide-left {
from {
transform: translate(0.75rem, -50%);
opacity: 0;
}
to {
&[data-placement="left"] {
&::before,
&::after {
top: 50%;
right: 100%;
bottom: auto;
left: auto;
transform: translate(-0.25rem, -50%);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-left {
from {
opacity: 0;
}
50% {
transform: translate(0.05rem, -50%);
opacity: 0;
}
to {
&:after {
transform: translate(0.3rem, -50%);
opacity: 1;
border: 0.3rem solid transparent;
border-left: 0.3rem solid;
}
}
@keyframes tooltip-slide-right {
from {
transform: translate(-0.75rem, -50%);
opacity: 0;
}
to {
&[data-placement="right"] {
&::before,
&::after {
top: 50%;
right: auto;
bottom: auto;
left: 100%;
transform: translate(0.25rem, -50%);
}
&:after {
transform: translate(-0.3rem, -50%);
border: 0.3rem solid transparent;
border-right: 0.3rem solid;
}
}
// Display
&:focus,
&:hover {
&::before,
&::after {
opacity: 1;
}
}
@keyframes tooltip-caret-slide-right {
from {
opacity: 0;
@if $enable-transitions {
// Animations, excluding touch devices
@media (hover: hover) and (pointer: fine) {
&[data-placement="bottom"]:focus,
&[data-placement="bottom"]:hover &:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-top;
}
&::after {
animation-name: tooltip-caret-slide-top;
}
}
&[data-placement="bottom"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-bottom;
}
&::after {
animation-name: tooltip-caret-slide-bottom;
}
}
}
&[data-placement="left"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-left;
}
&::after {
animation-name: tooltip-caret-slide-left;
}
}
}
&[data-placement="right"] {
&:focus,
&:hover {
&::before,
&::after {
animation-duration: 0.2s;
animation-name: tooltip-slide-right;
}
&::after {
animation-name: tooltip-caret-slide-right;
}
}
}
}
50% {
transform: translate(-0.05rem, -50%);
opacity: 0;
@keyframes tooltip-slide-top {
from {
transform: translate(-50%, 0.75rem);
opacity: 0;
}
to {
transform: translate(-50%, -0.25rem);
opacity: 1;
}
}
to {
transform: translate(-0.3rem, -50%);
opacity: 1;
@keyframes tooltip-caret-slide-top {
from {
opacity: 0;
}
50% {
transform: translate(-50%, -0.25rem);
opacity: 0;
}
to {
transform: translate(-50%, 0rem);
opacity: 1;
}
}
@keyframes tooltip-slide-bottom {
from {
transform: translate(-50%, -0.75rem);
opacity: 0;
}
to {
transform: translate(-50%, 0.25rem);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-bottom {
from {
opacity: 0;
}
50% {
transform: translate(-50%, -0.5rem);
opacity: 0;
}
to {
transform: translate(-50%, -0.3rem);
opacity: 1;
}
}
@keyframes tooltip-slide-left {
from {
transform: translate(0.75rem, -50%);
opacity: 0;
}
to {
transform: translate(-0.25rem, -50%);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-left {
from {
opacity: 0;
}
50% {
transform: translate(0.05rem, -50%);
opacity: 0;
}
to {
transform: translate(0.3rem, -50%);
opacity: 1;
}
}
@keyframes tooltip-slide-right {
from {
transform: translate(-0.75rem, -50%);
opacity: 0;
}
to {
transform: translate(0.25rem, -50%);
opacity: 1;
}
}
@keyframes tooltip-caret-slide-right {
from {
opacity: 0;
}
50% {
transform: translate(-0.05rem, -50%);
opacity: 0;
}
to {
transform: translate(-0.3rem, -50%);
opacity: 1;
}
}
}
}