@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 screen and (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;
    }
  }

  /* 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 {
      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;
    }
  }

  /* 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%;
    }
  }
}
