@layer components {
  /* Base
  /* ------------------------------------------------------------------------ */

  .card {
    --avatar-size: 2.75em;
    --card-bg-color: color-mix(in srgb, var(--card-color) 4%, var(--color-canvas));
    --card-content-color: color-mix(in srgb, var(--card-color) 12%, var(--color-ink));
    --card-text-color: color-mix(in srgb, var(--card-color) 30%, var(--color-ink));
    --card-border: 1px solid color-mix(in srgb, var(--card-color) 33%, var(--color-ink-inverted));
    --card-header-space: 1ch;
    --card-padding-inline: var(--inline-space-double);
    --card-padding-block: var(--block-space);
    --border-color: transparent;
    --border-radius: 0.2em;
    --border-size: 0;

    aspect-ratio: var(--card-aspect-ratio, auto);
    background-color: var(--card-bg-color);
    border-radius: var(--border-radius);
    box-shadow: var(--shadow);
    display: flex;
    flex-direction: column;
    inline-size: 100%;
    padding: var(--card-padding-block) var(--card-padding-inline);
    position: relative;
    text-align: start;
    transition: transform 120ms ease-out, box-shadow 120ms ease-out;
    z-index: 1;

    html[data-theme="dark"] & {
      box-shadow: 0 0 0 1px var(--color-ink-lighter);
    }

    @media (prefers-color-scheme: dark) {
      html:not([data-theme]) & {
        box-shadow: 0 0 0 1px var(--color-ink-lighter);
      }
    }

    /* Lift only clickable cards (either the card is the link or wraps one).
       Skip anything mid-drag so SortableJS's ghost stays put. */
    @media (hover: hover) {
      &:is(a[href], :has(a[href])):not(.sortable-chosen, .sortable-ghost):hover {
        box-shadow: var(--shadow-hover);
        transform: translateY(-2px);
        z-index: 2;
      }
    }

    .popup {
      inline-size: 260px;
    }
  }

  /* Header

  .card__board {
    align-self: flex-start;
    background-color: var(--card-color);
    border-radius: var(--border-radius) 0 var(--border-radius) 0;
    color: var(--color-ink-inverted);
    display: inline-flex;
    font-weight: 600;
    max-inline-size: 100%;
    text-transform: uppercase;
    min-inline-size: 0;
    padding-block: 0.25lh;
    padding-inline: var(--card-padding-inline) 1ch;

    &:has(.board-picker__button) {
      cursor: pointer;
      transition: background-color 100ms ease-out;

      @media (any-hover: hover) {
        &:hover {
          background-color: color-mix(in srgb, var(--card-color) 90%, var(--color-ink));
        }
      }

      &:has(.btn:focus-visible) {
        outline: var(--focus-ring-size) solid var(--focus-ring-color);
        outline-offset: var(--focus-ring-offset);
      }
    }
  }

  /* Hide the header steps badge on the card detail (perma) — the detail
   * page shows the steps list in the body, so the header counter is redundant. */
  .card-perma .card__steps {
    display: none;
  }

  /* Body

  /* Meta
  /* ------------------------------------------------------------------------ */

  .card__meta {
    --meta-spacer-block: 0.4ch;
    --meta-spacer-inline: 0.65ch;

    align-items: center;
    color: var(--card-text-color);
    display: grid;
    font-family: var(--font-data);
    font-size: var(--text-x-small);
    font-weight: 500;
    grid-template-areas:
      "text-health text-health"
      "text-points text-updated"
      "text-nc     text-nc";
    grid-template-columns: auto auto;
    inline-size: fit-content;
    letter-spacing: 0.02em;
    text-transform: uppercase;

    strong,
    .local-time-value {
      font-weight: 700;
      letter-spacing: 0.01em;
    }
  }

  .card__meta-text {
    line-height: 1;
    white-space: nowrap;

    .icon {
      --icon-size: 0.9em;

      margin-inline-end: 0.5ch;
      vertical-align: top;
    }
  }

  /* Check meta (fizzy-style): avatar | execution / by | last result / status */
  .card__meta--check {
    --meta-spacer-block: 0.5ch;
    --meta-spacer-inline: 0.75ch;
    --avatar-size: 2.25em;

    align-items: center;
    display: grid;
    font-family: var(--font-data);
    font-size: var(--text-x-small);
    font-weight: 500;
    grid-template-areas:
      "avatar text-execution text-result-label"
      "avatar text-executor  text-result-status";
    grid-template-columns: auto auto 1fr;
    inline-size: fit-content;
    letter-spacing: 0.02em;
    text-transform: uppercase;
  }

  .card__meta--check .card__meta-avatar {
    grid-area: avatar;
    margin-inline-end: var(--meta-spacer-inline);
  }

  .card__meta--check .card__meta-text--execution { grid-area: text-execution; }
  .card__meta--check .card__meta-text--executor { grid-area: text-executor; }
  .card__meta--check .card__meta-text--result-label { grid-area: text-result-label; }
  .card__meta--check .card__meta-text--result-status { grid-area: text-result-status; }

  /* Top row gets bottom border */
  .card__meta--check .card__meta-text--execution,
  .card__meta--check .card__meta-text--result-label {
    border-block-end: var(--card-border);
    padding-block-end: var(--meta-spacer-block);
  }

  /* Bottom row gets top padding */
  .card__meta--check .card__meta-text--executor,
  .card__meta--check .card__meta-text--result-status {
    padding-block-start: var(--meta-spacer-block);
  }

  /* Left column gets right border */
  .card__meta--check .card__meta-text--execution,
  .card__meta--check .card__meta-text--executor {
    border-inline-end: var(--card-border);
    padding-inline-end: var(--meta-spacer-inline);
  }

  /* Right column */
  .card__meta--check .card__meta-text--result-label,
  .card__meta--check .card__meta-text--result-status {
    padding-inline-start: var(--meta-spacer-inline);
  }

  /* Health: full-width top row — most important info */
  .card__meta-text--health {
    border-block-end: var(--card-border);
    font-size: 1.1em;
    grid-area: text-health;
    padding-block-end: var(--meta-spacer-block);
  }

  /* Points: left cell of middle row */
  .card__meta-text--points {
    border-inline-end: var(--card-border);
    grid-area: text-points;
    padding-block-start: var(--meta-spacer-block);
    padding-inline-end: var(--meta-spacer-inline);
  }

  /* Updated: right cell of middle row */
  .card__meta-text--updated {
    grid-area: text-updated;
    padding-block-start: var(--meta-spacer-block);
    padding-inline-start: var(--meta-spacer-inline);
  }

  /* NC: full-width bottom row (only when present) */
  .card__meta-text--nc {
    grid-area: text-nc;
  }

  .card__meta-text--nc:not(:empty) {
    border-block-start: var(--card-border);
    padding-block-start: var(--meta-spacer-block);
  }

  @media (max-width: 639px) {
    .card__meta {
      inline-size: 100%;
    }

    .card__meta-avatars--nc,
    .card__meta-avatars--assignees .avatar {
      display: none;
    }
  }

  /* Closed stamp

  .card:has(.card__closed),
  .card:is(.card--postponed),
  .card-perma:has(.card__closed),
  .card-perma:has(.card--postponed) {
    --card-color: var(--color-card-complete) !important;

    .bubble {
      display: none;
    }
  }

  /* Misc bits

  .card:nth-child(2n+1) .bubble {
    --bubble-rotate: -90deg;
  }

  .card:nth-child(3n+1) .bubble {
    --bubble-rotate: 45deg;
  }

  /* Keyboard Navigation Selection
  /* ------------------------------------------------------------------------ */

  .card.is-keyboard-selected,
  .event.is-keyboard-selected {
    outline: 3px solid oklch(var(--lch-blue-medium));
    outline-offset: 2px;
    z-index: 2;
  }
}
