Files
fizzy/app/assets/stylesheets/popup.css
T
Jason Zimdars 8c4d3fd700 Don't try to orient these
We need to figure out how to handle the assignment popup when it's close
to the bottom of the screen but this isn't doing it
2025-10-30 17:11:22 -05:00

235 lines
5.1 KiB
CSS

@layer components {
.popup {
--btn-background: transparent;
--panel-border-radius: 0.5em;
--panel-padding: var(--block-space);
--panel-size: auto;
--popup-icon-size: 24px;
--popup-item-padding-inline: 0.5rem;
inset: 0 auto auto 50%;
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);
}
form {
display: contents;
}
}
.popup__title {
font-weight: 800;
white-space: nowrap;
}
/* Hide lists when all the items within are hidden */
.popup__section {
&:not(:has(.popup__list)),
&:not(:has(.popup__list > *)),
&:has(.popup__item[hidden]):not(:has(.popup__item:not([hidden]))) {
display: none;
}
}
.popup__section-title {
background: var(--color-canvas);
font-size: var(--text-small);
font-weight: bold;
list-style: none;
padding: var(--block-space-half) var(--inline-space-half);
position: sticky;
text-transform: uppercase;
top: calc(-1 * var(--block-space));
z-index: 1;
&:is(summary) {
align-items: center;
cursor: pointer;
display: flex;
gap: 2ch;
justify-content: space-between;
}
&::-webkit-details-marker {
display: none;
}
.icon--caret-down {
opacity: 0.66;
transition: rotate 150ms ease-out;
}
.popup__section:not([open]) & {
.icon--caret-down {
rotate: -90deg;
}
}
}
.popup__list {
display: flex;
flex-direction: column;
inline-size: 100%;
list-style: none;
margin: 0;
max-inline-size: 100%;
padding: 0;
row-gap: 1px;
}
.popup__item {
align-items: center;
background: transparent;
border-radius: 0.3em;
display: flex;
inline-size: 100%;
max-inline-size: 100%;
@media (any-hover: hover) {
&:hover {
background: var(--color-ink-lightest);
}
}
.checked {
display: none;
}
&[aria-checked="true"] .checked {
display: block;
}
&[aria-selected] {
background-color: var(--color-selected);
@media (any-hover: hover) {
&:hover {
background-color: var(--color-selected);
}
}
}
}
/* The actionable thing with padding within popup__item */
.popup__btn {
--btn-border-radius: 0.3em;
--btn-border-size: 0;
flex: 1 1 auto;
font-weight: 500;
justify-content: start;
inline-size: 100%;
min-inline-size: 0;
max-inline-size: 100%;
padding: var(--inline-space-half) var(--popup-item-padding-inline);
text-align: start;
}
.popup__icon {
--icon-size: 1em;
inline-size: var(--popup-icon-size);
margin-inline-start: var(--popup-item-padding-inline);
}
.popup__radio {
--icon-size: var(--text-x-small);
block-size: var(--popup-icon-size);
inline-size: var(--popup-icon-size);
margin-inline-start: var(--popup-item-padding-inline);
flex-shrink: 0;
&:hover {
--btn-border-color: var(--color-ink);
}
}
.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;
}
/* Variants
/* ------------------------------------------------------------------------ */
.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; }
}
}