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

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

    &[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;

    &:has(input:checked)  {
      --btn-color: var(--color-ink);

      .icon.checked {
        display: block;
      }

      @media (any-hover: hover) {
        &:where(:not(:active):hover) {
          --btn-background: var(--color-selected);
        }
      }
    }
  }

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