Files
fizzy/app/assets/stylesheets/popup.css
T
2025-08-14 16:33:56 -05:00

225 lines
4.8 KiB
CSS

@layer components {
.popup {
--panel-border-radius: 0.5em;
--panel-padding: var(--block-space);
--panel-size: auto;
inset: 0 auto auto 50%;
max-block-size: 80vh;
min-inline-size: min(25ch, calc(100dvw - var(--block-space-double)));
max-inline-size: min(55ch, calc(100dvw - var(--block-space-double)));
overflow: auto;
position: absolute;
transform: translateX(-50%);
z-index: var(--z-popup);
&[open] {
display: flex;
}
&.orient-left {
inset-inline: auto 0;
transform: translateX(0);
}
&.orient-right {
inset-inline: 0 auto;
transform: translateX(0);
}
&:has(.popup__footer) {
--panel-padding: var(--block-space) var(--block-space) 0 var(--block-space);
}
#header:has(&) {
max-inline-size: 100vw;
position: relative;
z-index: 5;
}
.card & {
min-inline-size: 25ch;
max-inline-size: 25ch;
}
}
.popup__footer {
background-color: var(--color-canvas);
border-block-start: 1px solid var(--color-ink-lighter);
font-size: var(--text-small);
inset: auto 0 0;
line-height: 1.6;
margin-block-start: var(--block-space-half);
padding: 1.5ch;
position: sticky;
text-align: center;
z-index: 1;
}
.popup__group {
align-items: center;
background: transparent;
border-radius: 0.3em;
display: flex;
inline-size: 100%;
max-inline-size: 100%;
.popup__list &:has(*:first-child:not(.popup__item)) {
padding-inline-start: var(--inline-space-half);
}
.btn {
--btn-background: transparent;
}
@media (any-hover: hover) {
&:hover {
background: var(--color-ink-lightest);
}
}
&[aria-selected] {
background-color: var(--color-selected);
@media (any-hover: hover) {
&:hover {
background-color: var(--color-selected);
}
}
}
}
.popup__list {
display: flex;
flex-direction: column;
inline-size: 100%;
list-style: none;
margin: 0;
max-inline-size: 100%;
padding: 0;
row-gap: 2px;
/* Hide lists when all the items within are hidden */
&:has(.popup__group-title:only-child),
&:has(.popup__group[hidden]):not(:has(.popup__group:not([hidden]))) {
display: none;
}
}
.popup__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);
flex: 1 1 auto;
justify-content: start;
inline-size: 100%;
min-inline-size: 0;
max-inline-size: 100%;
text-align: start;
@media (any-hover: hover) {
&:where(:not(:active):hover) {
--btn-background: var(--color-selected);
}
}
.icon {
block-size: 1em;
inline-size: 1em;
}
&:has(input:checked) {
--btn-background: transparent;
--btn-color: var(--color-ink);
.icon.checked {
display: block;
}
@media (any-hover: hover) {
&:where(:not(:active):hover) {
--btn-background: var(--color-selected);
}
}
}
}
.popup__new {
--btn-icon-size: 1em;
padding-inline-start: var(--inline-space-half);
.icon {
margin-inline-end: 0.5em;
}
}
.popup__title {
font-weight: 800;
}
.popup__group-title {
background: var(--color-canvas);
font-size: var(--text-small);
font-weight: bold;
padding: var(--block-space-half) var(--inline-space-half);
position: sticky;
text-transform: uppercase;
top: calc(-1 * var(--block-space));
z-index: 1;
}
.popup--animated {
opacity: 0;
transform: scale(0.2) translateX(-50%);
transform-origin: top left;
transition: var(--dialog-duration) allow-discrete;
transition-property: display, opacity, overlay, transform;
&::backdrop {
background-color: var(--color-always-black);
opacity: 0;
transform: scale(1);
transition: var(--dialog-duration) allow-discrete;
transition-property: display, opacity, overlay;
}
/* Safari doesn't position the sticky footer properly during the
* transition, so we need to delay the footer entrance. */
.popup__footer {
animation: safari-sticky-footer-hack 0s;
animation-delay: var(--dialog-duration);
animation-fill-mode: both;
inset-inline: var(--block-space);
}
&[open] {
opacity: 1;
transform: scale(1) translateX(-50%);
&::backdrop {
opacity: 0.5;
}
}
@starting-style {
&[open] {
opacity: 0;
transform: scale(0.2) translateX(-50%);
}
&[open]::backdrop {
opacity: 0;
}
}
}
@keyframes safari-sticky-footer-hack {
0% { position: absolute; }
100% { position: sticky; }
}
}