@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; } } }