Files
fizzy/app/assets/stylesheets/expander.css
T
2025-04-17 14:10:35 -05:00

113 lines
2.5 KiB
CSS

/* https://nerdy.dev/open-and-close-transitions-for-the-details-element */
.expander {
--expander-height: calc(1em + 1lh);
--expander-width: 11ch;
--expander-radius: calc(var(--expander-height) / 2);
--expander-duration: 150ms;
interpolate-size: allow-keywords;
position: relative;
z-index: 1;
}
.expander__button {
--btn-border-radius: var(--expander-radius);
align-items: center;
block-size: var(--expander-height);
cursor: pointer;
display: flex;
inline-size: var(--expander-width);
justify-content: flex-start;
padding-inline: 1.5ch;
position: relative;
white-space: nowrap;
z-index: 1;
&::-webkit-details-marker {
display: none;
}
[open] & {
box-shadow: none;
}
.icon {
font-size: 1ch;
}
}
.expander__content {
--btn-border-radius: var(--expander-radius);
align-items: stretch;
border-radius: var(--expander-radius);
flex-direction: column;
gap: 0;
padding-block-start: var(--expander-height);
&:hover {
box-shadow: none;
}
}
/* For browsers that support animation */
@supports selector(details::details-content) {
.expander::details-content {
--btn-border-radius: var(--expander-radius);
block-size: var(--expander-height);
border-radius: var(--expander-radius);
inset: 0 auto auto 0;
inline-size: var(--expander-width);
overflow: clip;
position: absolute;
transition: content-visibility var(--expander-duration) allow-discrete, block-size var(--expander-duration), inline-size var(--expander-duration);
}
.expander[open]::details-content {
block-size: auto;
inline-size: auto;
}
.expander__content {
min-inline-size: var(--expander-width);
}
}
/* Fallback for browsers that don't support animation */
@supports not selector(details::details-content) {
.expander__content {
border-radius: var(--expander-radius);
inset: 0 auto auto 0;
min-inline-size: var(--expander-width);
position: absolute;
[open] & {
block-size: auto;
inline-size: auto;
}
}
}
.expander__item {
--btn-background: transparent;
--btn-border-radius: 0.3em;
--btn-border-size: 0;
--btn-font-weight: 500;
--btn-padding: var(--inline-space-half) var(--inline-space);
--hover-size: 0;
--outline-color: transparent;
inline-size: calc(100% + var(--inline-space-double));
margin-inline-start: calc(-1 * var(--inline-space));
justify-content: flex-start;
white-space: nowrap;
&:hover,
&:focus-visible {
background-color: oklch(var(--lch-ink-inverted) / 15%);
}
}