/*! Spec design system 1.0.0 (2026-11-07). Licensed to Design Systems Library members, single user. */

/* ---- base ---- */
/* Spec base: document defaults, zero-specificity resets inside .sp-page, type roles, the 12-column
   grid (span and start classes), section rhythm, skip link, arrow link, the specimen frame used by
   demo/components.html and the social card frame. Load after tokens.css, before every component. */

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-padding-top: calc(var(--sp-nav-h) + var(--sp-space-4));
}

body {
  margin: 0;
  background: var(--sp-paper);
  color: var(--sp-body);
  font-family: var(--sp-font-sans);
  font-size: var(--sp-fs-body);
  line-height: var(--sp-lh-body);
  font-weight: var(--sp-weight-regular);
  font-kerning: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

:where(.sp-page),
:where(.sp-page) *,
:where(.sp-page) *::before,
:where(.sp-page) *::after {
  box-sizing: border-box;
}

:where(.sp-page) {
  position: relative;
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
}

:where(.sp-page) > :where(main) {
  flex: 1 0 auto;
}

:where(.sp-page) :where(h1, h2, h3, h4, h5, p, ul, ol, figure, dl, dd, pre, table, blockquote, fieldset) {
  margin: 0;
}

:where(.sp-page) :where(ul, ol)[role="list"] {
  padding: 0;
  list-style: none;
}

:where(.sp-page) :where(img, svg, video, canvas) {
  display: block;
  max-width: 100%;
}

:where(.sp-page) :where(img, video) {
  height: auto;
}

:where(.sp-page) :where(button, input, select, textarea) {
  font: inherit;
  color: inherit;
}

:where(.sp-page) :where(h1, h2, h3, h4, h5) {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
  text-wrap: balance;
}

:where(.sp-page) :where(h1) {
  font-size: var(--sp-fs-display);
  line-height: var(--sp-lh-display);
  letter-spacing: var(--sp-track-display);
}

:where(.sp-page) :where(h2) {
  font-size: var(--sp-fs-title);
  line-height: var(--sp-lh-title);
  letter-spacing: var(--sp-track-title);
}

:where(.sp-page) :where(h3) {
  font-size: var(--sp-fs-card);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

:where(.sp-page) :where(h4, h5) {
  font-size: var(--sp-fs-body);
  line-height: var(--sp-lh-snug);
}

:where(.sp-page) :where(p, li, dd, blockquote, figcaption) {
  text-wrap: pretty;
}

:where(.sp-page) :where(a) {
  color: var(--sp-ink);
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.22em;
  text-decoration-color: var(--sp-mark);
  transition: text-decoration-thickness var(--sp-dur-fast) var(--sp-ease), color var(--sp-dur-fast) var(--sp-ease);
}

:where(.sp-page) :where(a:hover) {
  text-decoration-thickness: 2px;
}

:where(.sp-page) :where(a, button, summary, input, select, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

:where(.sp-page) :where(code, kbd, samp, pre) {
  font-family: var(--sp-font-mono);
  font-size: 0.82em;
  font-variant-ligatures: none;
}

:where(.sp-page) :where(p code, li code, td code, dd code) {
  padding: 1px 5px;
  background: var(--sp-sunk);
  color: var(--sp-ink);
  overflow-wrap: anywhere;
}

:where(.sp-page) :where(kbd) {
  display: inline-block;
  min-width: 1.8em;
  padding: 0 5px;
  border: 1px solid var(--sp-hair-strong);
  background: var(--sp-paper);
  color: var(--sp-ink);
  font-size: var(--sp-fs-label);
  line-height: 1.7;
  text-align: center;
}

:where(.sp-page) :where(strong, b) {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-semibold);
}

:where(.sp-page) :where(mark) {
  padding: 0 2px;
  background: var(--sp-accent-soft);
  color: var(--sp-ink);
}

:where(.sp-page) :where(hr) {
  height: 1px;
  margin: var(--sp-space-8) 0;
  border: 0;
  background: var(--sp-hair);
}

:where(.sp-page) :where(sup) {
  font-size: 0.7em;
  line-height: 0;
}

:where(.sp-page) ::selection {
  background: var(--sp-accent);
  color: var(--sp-accent-ink);
}

:where(.sp-page) :where([hidden]) {
  display: none !important;
}

/* Type roles as classes, for when the element and the look differ */
.sp-display {
  color: var(--sp-ink);
  font-size: var(--sp-fs-display);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-display);
  letter-spacing: var(--sp-track-display);
}

.sp-title {
  color: var(--sp-ink);
  font-size: var(--sp-fs-title);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-title);
  letter-spacing: var(--sp-track-title);
}

.sp-headline {
  color: var(--sp-ink);
  font-size: var(--sp-fs-headline);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

.sp-lede {
  max-width: 34em;
  color: var(--sp-ink);
  font-size: var(--sp-fs-lede);
  line-height: 1.38;
  letter-spacing: -0.006em;
}

.sp-note {
  color: var(--sp-muted);
  font-size: 1rem;
  line-height: var(--sp-lh-body);
}

.sp-meta {
  color: var(--sp-muted);
  font-size: var(--sp-fs-meta);
  line-height: var(--sp-lh-snug);
}

.sp-label {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-mono);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-mono {
  font-family: var(--sp-font-mono);
  font-variant-ligatures: none;
}

.sp-num {
  font-variant-numeric: tabular-nums;
}

.sp-muted {
  color: var(--sp-muted);
}

.sp-accent {
  color: var(--sp-accent-text);
}

/* Layout: the wrap is the grid's frame. Every page edge, gridline and column hangs off it. */
.sp-wrap {
  width: 100%;
  max-width: calc(var(--sp-content) + 2 * var(--sp-gutter));
  margin-inline: auto;
  padding-inline: var(--sp-gutter);
}

.sp-section {
  position: relative;
  padding-block: var(--sp-section-pad);
}

.sp-section--tight {
  padding-block: calc(var(--sp-section-pad) * 0.6);
}

.sp-section--flush-top {
  padding-block-start: 0;
}

.sp-section--flush-bottom {
  padding-block-end: 0;
}

.sp-section--sunk {
  background: var(--sp-sunk);
}

.sp-stack {
  display: flex;
  flex-direction: column;
  gap: var(--sp-space-4);
}

.sp-stack--tight {
  gap: var(--sp-space-2);
}

.sp-stack--loose {
  gap: var(--sp-space-8);
}

.sp-cluster {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-space-3);
}

/* The 12-column grid. Columns: 12 from 960px, 8 from 640px, 4 below (tokens.css sets --sp-cols).
   Below 960px every child spans the full row unless it carries an .sp-md-span-* class. */
.sp-grid {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-8);
}

.sp-grid > * {
  grid-column: 1 / -1;
  min-width: 0;
}

.sp-grid--dense {
  row-gap: var(--sp-space-5);
}

.sp-grid--loose {
  row-gap: var(--sp-space-11);
}

.sp-grid {
  align-items: start;
}

.sp-grid--end {
  align-items: end;
}

.sp-grid--stretch {
  align-items: stretch;
}

.sp-stretch {
  align-self: stretch;
}

.sp-grid--start {
  align-items: start;
}

/* Visually hidden, still read aloud */
.sp-sr {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

.sp-skip {
  position: absolute;
  inset-inline-start: var(--sp-space-4);
  top: var(--sp-space-3);
  z-index: 200;
  padding: var(--sp-space-2) var(--sp-space-4);
  background: var(--sp-accent);
  color: var(--sp-accent-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  font-weight: var(--sp-weight-medium);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-decoration: none;
  transform: translateY(-180%);
  transition: transform var(--sp-dur) var(--sp-ease);
}

.sp-skip:focus-visible {
  transform: none;
  color: var(--sp-accent-ink);
}

/* Arrow link: mono caps with a trailing arrow, for "see all" and next steps */
.sp-link {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-space-2);
  min-height: 32px;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  font-weight: var(--sp-weight-medium);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.45em;
  text-decoration-color: var(--sp-mark);
}

.sp-link svg {
  flex: none;
  transition: transform var(--sp-dur-fast) var(--sp-ease);
}

.sp-link:hover svg {
  transform: translateX(3px);
}

/* Directional icons (arrows, chevrons) carry .sp-flip and mirror in right-to-left pages */
[dir="rtl"] .sp-flip {
  transform: scaleX(-1);
}

[dir="rtl"] .sp-link:hover svg {
  transform: scaleX(-1) translateX(3px);
}

/* Specimen frame: labels and frames for demo/components.html, never needed on product pages.
   From 1100px the name and summary sit in columns 1 to 3 beside the frame; .sp-specimen--wide
   keeps full-width parts (hero, nav, footer) stacked. .sp-specimen__row puts states side by side. */
.sp-specimen {
  display: grid;
  gap: var(--sp-space-5);
  padding-block: var(--sp-space-8);
  border-block-start: 1px solid var(--sp-rule);
  scroll-margin-top: calc(var(--sp-nav-h) + var(--sp-space-4));
}

.sp-specimen__head {
  display: grid;
  gap: var(--sp-space-2);
  align-content: start;
}

.sp-specimen__name {
  font-size: var(--sp-fs-headline);
  letter-spacing: var(--sp-track-headline);
}

.sp-specimen__file {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
}

.sp-specimen__summary {
  max-width: 46rem;
  color: var(--sp-muted);
  font-size: 1rem;
}

@media (min-width: 1100px) {
  .sp-specimen:not(.sp-specimen--wide) {
    grid-template-columns: repeat(12, minmax(0, 1fr));
    column-gap: var(--sp-gap);
  }

  .sp-specimen:not(.sp-specimen--wide) > .sp-specimen__head {
    grid-column: 1 / span 3;
    position: sticky;
    top: calc(var(--sp-nav-h) + var(--sp-space-6));
  }

  .sp-specimen:not(.sp-specimen--wide) > .sp-specimen__frame {
    grid-column: 4 / -1;
  }

  .sp-specimen--wide > .sp-specimen__head {
    grid-template-columns: repeat(12, minmax(0, 1fr));
    column-gap: var(--sp-gap);
    align-items: baseline;
  }

  .sp-specimen--wide > .sp-specimen__head > .sp-specimen__name {
    grid-column: 1 / span 3;
  }

  .sp-specimen--wide > .sp-specimen__head > .sp-specimen__file {
    grid-column: 4 / span 2;
  }

  .sp-specimen--wide > .sp-specimen__head > .sp-specimen__summary {
    grid-column: 6 / -1;
  }
}

.sp-specimen__label {
  margin-block: var(--sp-space-4) calc(var(--sp-space-1) * -1);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-specimen__label:first-child {
  margin-block-start: 0;
}

.sp-specimen__frame {
  display: grid;
  gap: var(--sp-space-4);
  align-content: start;
  min-width: 0;
}

.sp-specimen__row {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: var(--sp-space-6);
}

.sp-specimen__row > * {
  flex: 1 1 15rem;
  min-width: 0;
}

.sp-specimen__box {
  position: relative;
  padding: var(--sp-space-6);
  border: 1px dashed var(--sp-hair-strong);
}

/* Social card frame for extras/og: 1200 by 630, screenshot at 1x */
.sp-og {
  position: relative;
  isolation: isolate;
  flex: none;
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  grid-template-rows: auto 1fr auto;
  column-gap: 24px;
  width: 1200px;
  height: 630px;
  padding: 56px 64px;
  overflow: hidden;
  background: var(--sp-paper);
  --sp-cols: 12;
  --sp-gutter: 64px;
  --sp-gap: 24px;
  --sp-content: 1072px;
}

.sp-og__top {
  grid-column: 1 / -1;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding-block-end: 16px;
  border-block-end: 1px solid var(--sp-rule);
}

.sp-og__title {
  grid-column: 1 / span 10;
  align-self: end;
  max-width: 15ch;
  font-size: 92px;
  line-height: 0.92;
  letter-spacing: var(--sp-track-display);
}

.sp-og__foot {
  grid-column: 1 / -1;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-block-start: 36px;
  padding-block-start: 16px;
  border-block-start: 1px solid var(--sp-rule);
}

.sp-og__num {
  color: var(--sp-mark);
  font-family: var(--sp-font-mono);
  font-size: 32px;
  line-height: 1;
}

.sp-og__url {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: 18px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* Spans and starts apply from 960px. .sp-md-span-* apply from 640px to 959px (8 columns). */
@media (min-width: 640px) and (max-width: 959px) {
  .sp-md-span-1 {
    grid-column: auto / span 1;
  }

  .sp-md-span-2 {
    grid-column: auto / span 2;
  }

  .sp-md-span-3 {
    grid-column: auto / span 3;
  }

  .sp-md-span-4 {
    grid-column: auto / span 4;
  }

  .sp-md-span-5 {
    grid-column: auto / span 5;
  }

  .sp-md-span-6 {
    grid-column: auto / span 6;
  }

  .sp-md-span-7 {
    grid-column: auto / span 7;
  }

  .sp-md-span-8 {
    grid-column: auto / span 8;
  }
}

@media (min-width: 960px) {
  .sp-span-1 {
    grid-column: auto / span 1;
  }

  .sp-span-2 {
    grid-column: auto / span 2;
  }

  .sp-span-3 {
    grid-column: auto / span 3;
  }

  .sp-span-4 {
    grid-column: auto / span 4;
  }

  .sp-span-5 {
    grid-column: auto / span 5;
  }

  .sp-span-6 {
    grid-column: auto / span 6;
  }

  .sp-span-7 {
    grid-column: auto / span 7;
  }

  .sp-span-8 {
    grid-column: auto / span 8;
  }

  .sp-span-9 {
    grid-column: auto / span 9;
  }

  .sp-span-10 {
    grid-column: auto / span 10;
  }

  .sp-span-11 {
    grid-column: auto / span 11;
  }

  .sp-span-12 {
    grid-column: auto / span 12;
  }

  .sp-start-1 {
    grid-column-start: 1;
  }

  .sp-start-2 {
    grid-column-start: 2;
  }

  .sp-start-3 {
    grid-column-start: 3;
  }

  .sp-start-4 {
    grid-column-start: 4;
  }

  .sp-start-5 {
    grid-column-start: 5;
  }

  .sp-start-6 {
    grid-column-start: 6;
  }

  .sp-start-7 {
    grid-column-start: 7;
  }

  .sp-start-8 {
    grid-column-start: 8;
  }

  .sp-start-9 {
    grid-column-start: 9;
  }

  .sp-start-10 {
    grid-column-start: 10;
  }

  .sp-start-11 {
    grid-column-start: 11;
  }

  .sp-start-12 {
    grid-column-start: 12;
  }
}

/* ---- buttons ---- */
/* Buttons: rectangles, 0 radius, mono caps labels. The primary is a solid accent block with black
   type; everything else is ink on paper and inverts on hover. One primary per view. */

.sp-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-space-2);
  min-height: 44px;
  padding: 10px 18px;
  border: 1px solid var(--sp-ink);
  border-radius: var(--sp-radius-btn);
  background: transparent;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  font-weight: var(--sp-weight-medium);
  line-height: 1.2;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
  transition:
    background-color var(--sp-dur-fast) var(--sp-ease),
    border-color var(--sp-dur-fast) var(--sp-ease),
    color var(--sp-dur-fast) var(--sp-ease),
    transform var(--sp-dur-fast) var(--sp-ease);
}

.sp-btn svg {
  flex: none;
  transition: transform var(--sp-dur-fast) var(--sp-ease);
}

.sp-btn:hover,
.sp-btn.is-hover {
  background: var(--sp-ink);
  color: var(--sp-paper);
}

.sp-btn:active,
.sp-btn.is-active {
  transform: translateY(1px);
}

.sp-btn:focus-visible,
.sp-btn.is-focus {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-btn--primary {
  border-color: var(--sp-accent);
  background: var(--sp-accent);
  color: var(--sp-accent-ink);
}

.sp-btn--primary:hover,
.sp-btn--primary.is-hover {
  border-color: var(--sp-accent-hover);
  background: var(--sp-accent-hover);
  color: var(--sp-accent-ink);
}

.sp-btn--primary:hover svg:last-child,
.sp-btn--primary.is-hover svg:last-child {
  transform: translateX(3px);
}

[dir="rtl"] .sp-btn--primary:hover svg.sp-flip:last-child {
  transform: scaleX(-1) translateX(3px);
}

.sp-btn--secondary {
  background: var(--sp-paper);
}

.sp-btn--ghost {
  border-color: transparent;
}

.sp-btn--ghost:hover,
.sp-btn--ghost.is-hover {
  border-color: transparent;
  background: var(--sp-sunk);
  color: var(--sp-ink);
}

.sp-btn--danger {
  border-color: var(--sp-danger);
  color: var(--sp-danger);
}

.sp-btn--danger:hover,
.sp-btn--danger.is-hover {
  background: var(--sp-danger-soft);
  color: var(--sp-danger);
}

.sp-btn--sm {
  min-height: 36px;
  padding: 6px 12px;
  font-size: var(--sp-fs-label);
}

.sp-btn--lg {
  min-height: 56px;
  padding: 14px 26px;
  font-size: 0.875rem;
}

.sp-btn--block {
  display: flex;
  width: 100%;
}

.sp-btn--icon {
  width: 44px;
  padding: 0;
}

.sp-btn--icon.sp-btn--sm {
  width: 36px;
}

.sp-btn:disabled,
.sp-btn[aria-disabled="true"] {
  border-color: var(--sp-hair-strong);
  background: var(--sp-sunk);
  color: var(--sp-muted);
  cursor: not-allowed;
  pointer-events: none;
  transform: none;
}

.sp-btn--ghost:disabled,
.sp-btn--ghost[aria-disabled="true"] {
  border-color: transparent;
  background: transparent;
}

/* Loading: a square that turns in quarter steps joins a present-tense label ("Sending") */
.sp-btn.is-loading {
  pointer-events: none;
}

.sp-btn.is-loading::before {
  content: "";
  width: 10px;
  height: 10px;
  flex: none;
  border: 2px solid currentColor;
  border-inline-end-color: transparent;
  animation: sp-btn-step 800ms steps(4) infinite;
}

@keyframes sp-btn-step {
  to {
    transform: rotate(1turn);
  }
}

@media (pointer: coarse) {
  .sp-btn--sm {
    min-height: 44px;
  }

  .sp-btn--icon.sp-btn--sm {
    width: 44px;
  }
}

/* Action group: one primary and at most one secondary */
.sp-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-space-3);
}

.sp-actions--end {
  justify-content: flex-end;
}

@media (max-width: 479px) {
  .sp-actions--stack-sm {
    flex-direction: column;
    align-items: stretch;
  }

  .sp-actions--stack-sm .sp-btn {
    width: 100%;
  }
}

/* Segmented control: joined rectangles, the pressed one in ink */
/* Buttons overlap by 1px so the frame stays a single line, even when the group wraps */
.sp-seg {
  display: inline-flex;
  flex-wrap: wrap;
  width: fit-content;
  max-width: 100%;
  padding-block-start: 1px;
  padding-inline-start: 1px;
}

.sp-seg__btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 36px;
  margin-block-start: -1px;
  margin-inline-start: -1px;
  padding: 6px 14px;
  border: 1px solid var(--sp-ink);
  background: transparent;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color var(--sp-dur-fast) var(--sp-ease), color var(--sp-dur-fast) var(--sp-ease);
}

.sp-seg__btn:hover {
  background: var(--sp-sunk);
}

.sp-seg__btn[aria-pressed="true"] {
  background: var(--sp-ink);
  color: var(--sp-paper);
}

.sp-seg__btn:focus-visible {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

@media (pointer: coarse) {
  .sp-seg__btn {
    min-height: 44px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .sp-btn,
  .sp-btn svg,
  .sp-seg__btn {
    transition: none;
  }

  .sp-btn:active {
    transform: none;
  }

  .sp-btn.is-loading::before {
    animation-duration: 3s;
  }
}

/* ---- badges ---- */
/* Tags: square, mono caps, 12px. Status lives in the text as well as the color. */

.sp-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 24px;
  padding: 2px 8px;
  border: 1px solid var(--sp-hair-strong);
  background: var(--sp-paper);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  line-height: 1.3;
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
  white-space: nowrap;
}

.sp-tag svg {
  flex: none;
}

.sp-tag__dot {
  width: 7px;
  height: 7px;
  flex: none;
  background: currentColor;
}

.sp-tag--ink {
  border-color: var(--sp-ink);
  background: var(--sp-ink);
  color: var(--sp-paper);
}

.sp-tag--accent {
  border-color: var(--sp-accent);
  background: var(--sp-accent);
  color: var(--sp-accent-ink);
}

.sp-tag--ok {
  border-color: var(--sp-ok-soft);
  background: var(--sp-ok-soft);
  color: var(--sp-ok);
}

.sp-tag--warn {
  border-color: var(--sp-warn-soft);
  background: var(--sp-warn-soft);
  color: var(--sp-warn);
}

.sp-tag--danger {
  border-color: var(--sp-danger-soft);
  background: var(--sp-danger-soft);
  color: var(--sp-danger);
}

.sp-tags {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-space-2);
}

/* ---- avatar ---- */
/* Avatars: squares with initials or a geometric mark. Never a photo, never a face. */

.sp-avatar {
  display: inline-grid;
  place-items: center;
  width: 40px;
  height: 40px;
  flex: none;
  overflow: hidden;
  background: var(--sp-sunk);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-avatar svg {
  width: 100%;
  height: 100%;
}

.sp-avatar--ink {
  background: var(--sp-ink);
  color: var(--sp-paper);
}

.sp-avatar--accent {
  background: var(--sp-accent);
  color: var(--sp-accent-ink);
}

.sp-avatar--sm {
  width: 32px;
  height: 32px;
}

.sp-avatar--lg {
  width: 64px;
  height: 64px;
  font-size: var(--sp-fs-mono);
}

.sp-avatar__shape {
  fill: var(--sp-ink);
}

.sp-avatar__shape--accent {
  fill: var(--sp-accent);
}

.sp-avatars {
  display: flex;
  flex-wrap: wrap;
  gap: 2px;
}

/* ---- nav ---- */
/* Nav: a ruled bar laid on the same 12 columns as the page. Brand in 1 to 3, links in 4 to 9,
   actions in 10 to 12. Under 1100px the links fold into a numbered menu. */

.sp-nav {
  position: sticky;
  top: 0;
  z-index: 60;
  background: var(--sp-paper);
  border-block-end: 1px solid var(--sp-rule);
}

.sp-nav__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-space-3);
  width: 100%;
  max-width: calc(var(--sp-content) + 2 * var(--sp-gutter));
  min-height: var(--sp-nav-h);
  margin-inline: auto;
  padding-inline: var(--sp-gutter);
}

.sp-nav__brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  color: var(--sp-ink);
  font-size: 1.125rem;
  font-weight: var(--sp-weight-semibold);
  letter-spacing: -0.02em;
  text-decoration: none;
  white-space: nowrap;
}

.sp-nav__mark {
  width: 14px;
  height: 14px;
  flex: none;
  background: var(--sp-accent);
  box-shadow: inset 0 0 0 1px var(--sp-ink);
}

.sp-nav__links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-space-5);
}

.sp-nav__link {
  display: inline-flex;
  align-items: baseline;
  gap: var(--sp-space-2);
  min-height: 44px;
  padding-block: 10px;
  color: var(--sp-ink);
  font-size: 0.9375rem;
  text-decoration-line: underline;
  text-decoration-color: transparent;
  text-decoration-thickness: 2px;
  text-underline-offset: 0.5em;
}

.sp-nav__link:hover {
  text-decoration-color: var(--sp-hair-strong);
}

.sp-nav__link[aria-current="page"] {
  text-decoration-color: var(--sp-mark);
}

.sp-nav__num {
  display: none;
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
}

.sp-nav__actions {
  display: flex;
  align-items: center;
  gap: var(--sp-space-1);
}

.sp-nav__cta {
  margin-inline-start: var(--sp-space-2);
}

.sp-nav__menu-cta {
  display: none;
}

.sp-theme-toggle__sun {
  display: none;
}

.sp-theme-toggle__moon,
.sp-theme-toggle__sun {
  line-height: 0;
}

:root[data-theme="dark"] .sp-theme-toggle__sun {
  display: inline;
}

:root[data-theme="dark"] .sp-theme-toggle__moon {
  display: none;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sp-theme-toggle__sun {
    display: inline;
  }

  :root:not([data-theme="light"]) .sp-theme-toggle__moon {
    display: none;
  }
}

@media (min-width: 1100px) {
  .sp-nav__inner {
    display: grid;
    grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
    column-gap: var(--sp-gap);
  }

  .sp-nav__brand {
    grid-column: 1 / span 3;
    justify-self: start;
  }

  .sp-nav__menu {
    grid-column: 4 / span 6;
  }

  .sp-nav__actions {
    grid-column: 10 / -1;
    justify-self: end;
  }

  .sp-nav__toggle {
    display: none;
  }
}

/* From 1280px each link starts on its own column line */
@media (min-width: 1280px) {
  .sp-nav__menu,
  .sp-nav__menu > nav,
  .sp-nav__links {
    display: grid;
    grid-template-columns: subgrid;
  }

  .sp-nav__menu > nav,
  .sp-nav__links {
    grid-column: 1 / -1;
  }
}

@media (max-width: 1279px) {
  .sp-grid-toggle__label {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
  }
}

@media (max-width: 1099px) {
  .sp-nav__cta {
    display: none;
  }

  .sp-nav.is-ready .sp-nav__menu {
    display: none;
  }

  .sp-nav:not(.is-ready) .sp-nav__menu {
    order: 3;
    width: 100%;
    overflow-x: auto;
  }

  .sp-nav:not(.is-ready) .sp-nav__links {
    flex-wrap: nowrap;
  }

  .sp-nav.is-open .sp-nav__menu {
    display: grid;
    order: 3;
    gap: var(--sp-space-6);
    width: 100%;
    max-height: calc(100dvh - var(--sp-nav-h));
    overflow-y: auto;
    padding-block: var(--sp-space-2) var(--sp-space-6);
  }

  .sp-nav.is-open .sp-nav__links {
    display: grid;
    gap: 0;
  }

  .sp-nav.is-open .sp-nav__link {
    display: flex;
    gap: var(--sp-space-4);
    width: 100%;
    padding-block: var(--sp-space-3);
    border-block-start: 1px solid var(--sp-hair);
    font-size: 1.75rem;
    font-weight: var(--sp-weight-medium);
    letter-spacing: var(--sp-track-headline);
    line-height: 1.15;
  }

  .sp-nav.is-open .sp-nav__num {
    display: inline;
    min-width: 2.2em;
    color: var(--sp-mark);
    font-size: 1rem;
  }

  .sp-nav.is-open .sp-nav__menu-cta {
    display: flex;
  }
}

@media (prefers-reduced-motion: reduce) {
  .sp-nav__link {
    transition: none;
  }
}

/* Static nav for embedding (component galleries, previews) */
.sp-nav--static {
  position: relative;
  z-index: auto;
}

/* ---- announcement-bar ---- */
/* Announcement: an inverted ink bar above the nav. One line, one link, dismissible. */

.sp-announce {
  background: var(--sp-ink);
  color: var(--sp-paper);
}

.sp-announce__inner {
  display: flex;
  align-items: center;
  gap: var(--sp-space-3);
  width: 100%;
  max-width: calc(var(--sp-content) + 2 * var(--sp-gutter));
  min-height: 44px;
  margin-inline: auto;
  padding-inline: var(--sp-gutter);
}

.sp-announce__mark {
  width: 10px;
  height: 10px;
  flex: none;
  background: var(--sp-accent);
}

.sp-announce__text {
  flex: 1 1 auto;
  min-width: 0;
  padding-block: 10px;
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-announce__text a {
  color: var(--sp-paper);
  text-decoration-color: var(--sp-accent);
  white-space: nowrap;
}

.sp-announce__close {
  display: inline-grid;
  place-items: center;
  width: 36px;
  height: 36px;
  flex: none;
  border: 0;
  background: transparent;
  color: var(--sp-paper);
  cursor: pointer;
}

.sp-announce__close:hover {
  background: color-mix(in srgb, var(--sp-paper) 14%, transparent);
}

.sp-announce__close:focus-visible {
  outline: 2px solid var(--sp-accent);
  outline-offset: -2px;
}

/* ---- breadcrumbs ---- */
/* Breadcrumbs: mono caps trail, slash separators, current page in ink. */

.sp-crumbs ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-crumbs li {
  display: inline-flex;
  align-items: center;
  color: var(--sp-muted);
}

.sp-crumbs li + li::before {
  content: "/";
  margin-inline: var(--sp-space-2);
  color: var(--sp-hair-strong);
}

.sp-crumbs a {
  display: inline-flex;
  align-items: center;
  min-height: 32px;
  color: var(--sp-muted);
  text-decoration: none;
}

.sp-crumbs a:hover {
  color: var(--sp-ink);
  text-decoration: underline;
  text-decoration-color: var(--sp-mark);
}

.sp-crumbs [aria-current="page"] {
  color: var(--sp-ink);
}

/* ---- sidebar-nav ---- */
/* Sidebar nav: grouped, numbered, with an accent bar on the current item. */

.sp-sidenav {
  display: grid;
  gap: var(--sp-space-6);
}

.sp-sidenav__group {
  display: grid;
  gap: var(--sp-space-2);
}

.sp-sidenav__head {
  padding-block-end: var(--sp-space-2);
  border-block-end: 1px solid var(--sp-rule);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-sidenav__list {
  display: grid;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-sidenav__link {
  position: relative;
  display: grid;
  grid-template-columns: 2.4em minmax(0, 1fr) auto;
  align-items: baseline;
  gap: var(--sp-space-2);
  min-height: 40px;
  padding-block: 8px;
  padding-inline: var(--sp-space-3) 0;
  border-block-end: 1px solid var(--sp-hair);
  color: var(--sp-body);
  font-size: 0.9375rem;
  text-decoration: none;
}

.sp-sidenav__link::before {
  content: "";
  position: absolute;
  inset-block: 6px;
  inset-inline-start: 0;
  width: 3px;
  background: transparent;
}

.sp-sidenav__link:hover {
  color: var(--sp-ink);
  background: var(--sp-sunk);
}

.sp-sidenav__link[aria-current="page"],
.sp-sidenav__link[aria-current="true"],
.sp-sidenav__link.is-current {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-sidenav__link[aria-current="page"]::before,
.sp-sidenav__link[aria-current="true"]::before,
.sp-sidenav__link.is-current::before {
  background: var(--sp-mark);
}

.sp-sidenav__num,
.sp-sidenav__count {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-regular);
}

@media (pointer: coarse) {
  .sp-sidenav__link {
    min-height: 44px;
  }
}

/* ---- footer ---- */
/* Footer: the grid again, then the studio name set edge to edge across the frame. */

.sp-footer {
  margin-block-start: auto;
  padding-block: var(--sp-space-10) var(--sp-space-6);
  border-block-start: 1px solid var(--sp-rule);
  background: var(--sp-paper);
}

.sp-footer__grid {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-8);
}

:where(.sp-footer__grid) > * {
  grid-column: 1 / -1;
  min-width: 0;
}

.sp-footer__about {
  display: grid;
  gap: var(--sp-space-4);
  align-content: start;
}

.sp-footer__text {
  max-width: 28rem;
  color: var(--sp-muted);
  font-size: 1rem;
}

.sp-footer__head {
  margin-block-end: var(--sp-space-3);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  line-height: var(--sp-lh-mono);
  text-transform: uppercase;
}

.sp-footer__links {
  display: grid;
  gap: 2px;
}

.sp-footer__links a {
  display: inline-flex;
  align-items: center;
  min-height: 32px;
  color: var(--sp-ink);
  text-decoration-color: transparent;
}

.sp-footer__links a:hover {
  text-decoration-color: var(--sp-mark);
}

.sp-footer > .sp-wrap {
  container-type: inline-size;
}

.sp-footer__word {
  margin-block: var(--sp-space-11) 0;
  color: var(--sp-ink);
  margin-inline-start: -0.055em;
  font-size: calc(100cqi / var(--sp-word-fit, 2.74));
  font-weight: var(--sp-weight-medium);
  line-height: 0.78;
  letter-spacing: -0.065em;
  white-space: nowrap;
}

@supports not (font-size: 1cqi) {
  .sp-footer__word {
    font-size: 20vw;
  }
}

.sp-footer__base {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: var(--sp-space-2) var(--sp-space-6);
  margin-block-start: var(--sp-space-6);
  padding-block-start: var(--sp-space-4);
  border-block-start: 1px solid var(--sp-hair);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-footer__base a {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--sp-ink);
  text-decoration: none;
}

.sp-footer__base a:hover {
  text-decoration: underline;
  text-decoration-color: var(--sp-mark);
}

@media (min-width: 640px) {
  .sp-footer__about {
    grid-column: 1 / -1;
  }

  .sp-footer__col {
    grid-column: auto / span 2;
  }
}

@media (min-width: 960px) {
  .sp-footer__about {
    grid-column: 1 / span 4;
  }

  .sp-footer__col {
    grid-column: auto / span 2;
  }
}

/* ---- grid-overlay ---- */
/* The visible grid. .sp-gridlines sits inside any .sp-has-grid block and draws a 1px line on the start
   of each column plus the closing edge, exactly on the .sp-wrap frame. It draws itself in on load.
   With data-grid="on" on <html> (the nav toggle), .sp-gridlines--page lays the grid over the whole page
   in the accent color; data-grid="off" removes every gridline. */

.sp-has-grid {
  position: relative;
  isolation: isolate;
}

.sp-gridlines {
  position: absolute;
  inset-block: 0;
  inset-inline: max(var(--sp-gutter), calc((100% - var(--sp-content)) / 2));
  z-index: -1;
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  pointer-events: none;
  --sp-gl: var(--sp-grid-line);
}

.sp-gridlines > span {
  position: relative;
  min-width: 0;
}

.sp-gridlines > span::before,
.sp-gridlines::after {
  content: "";
  position: absolute;
  inset-block: 0;
  width: 1px;
  background: var(--sp-gl);
  transform-origin: 50% 0;
}

/* Draw-in: grid-overlay.js adds .is-drawing on load and removes it when the lines are down, so a
   resized or re-rendered page always shows static lines */
.sp-gridlines.is-drawing > span::before,
.sp-gridlines.is-drawing::after {
  animation: sp-grid-draw var(--sp-dur-draw) var(--sp-ease-draw) both;
}

.sp-gridlines > span::before {
  inset-inline-start: 0;
}

.sp-gridlines::after {
  inset-inline-end: 0;
  animation-delay: 540ms;
}

.sp-gridlines > span:nth-child(2)::before { animation-delay: 45ms; }
.sp-gridlines > span:nth-child(3)::before { animation-delay: 90ms; }
.sp-gridlines > span:nth-child(4)::before { animation-delay: 135ms; }
.sp-gridlines > span:nth-child(5)::before { animation-delay: 180ms; }
.sp-gridlines > span:nth-child(6)::before { animation-delay: 225ms; }
.sp-gridlines > span:nth-child(7)::before { animation-delay: 270ms; }
.sp-gridlines > span:nth-child(8)::before { animation-delay: 315ms; }
.sp-gridlines > span:nth-child(9)::before { animation-delay: 360ms; }
.sp-gridlines > span:nth-child(10)::before { animation-delay: 405ms; }
.sp-gridlines > span:nth-child(11)::before { animation-delay: 450ms; }
.sp-gridlines > span:nth-child(12)::before { animation-delay: 495ms; }

@keyframes sp-grid-draw {
  from {
    transform: scaleY(0);
  }
}

/* Column numbers along the top edge: a ruler, decorative and hidden from assistive tech */
.sp-gridlines--numbered > span {
  padding-block-start: var(--sp-space-3);
  padding-inline-start: 7px;
  color: var(--sp-line-control);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  line-height: 1;
}

@media (max-width: 959px) {
  .sp-gridlines > span:nth-child(n + 9) {
    display: none;
  }
}

@media (max-width: 639px) {
  .sp-gridlines > span:nth-child(n + 5) {
    display: none;
  }
}

/* Whole-page overlay, toggled from the nav */
.sp-gridlines--page {
  position: fixed;
  z-index: 90;
  inset-inline: max(var(--sp-gutter), calc((100vw - var(--sp-content)) / 2));
  --sp-gl: color-mix(in srgb, var(--sp-mark) 42%, transparent);
  display: none;
}

:root[data-grid="on"] .sp-gridlines--page {
  display: grid;
}

:root[data-grid="off"] .sp-gridlines {
  display: none;
}

/* The toggle in the nav */
.sp-grid-toggle[aria-pressed="true"] {
  background: var(--sp-ink);
  color: var(--sp-paper);
}

.sp-grid-toggle[aria-pressed="true"]:hover {
  background: var(--sp-ink);
  color: var(--sp-paper);
}

@media (prefers-reduced-motion: reduce) {
  .sp-gridlines.is-drawing > span::before,
  .sp-gridlines.is-drawing::after {
    animation: none;
  }
}

/* On the accent field (cta) the lines darken instead of lighten */
.sp-cta .sp-gridlines {
  --sp-gl: color-mix(in srgb, var(--sp-accent-ink) 14%, transparent);
}

@media print {
  .sp-gridlines {
    display: none;
  }
}

/* ---- section-index ---- */
/* Section index: the numbered header row. A 1px rule across the frame, the number in mono in the
   first columns, the title from column 3 and an aside in the metadata columns 10 to 12. The rule
   draws from the start edge when the row scrolls into view (script-gated; static without JS). */

.sp-index {
  position: relative;
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-3);
  align-items: baseline;
  margin-block-end: clamp(2.5rem, 1.5rem + 3vw, 4.5rem);
  padding-block-start: var(--sp-space-4);
}

.sp-index::before {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  height: 1px;
  background: var(--sp-rule);
  transform-origin: 0 50%;
}

[dir="rtl"] .sp-index::before {
  transform-origin: 100% 50%;
}

.sp-js .sp-index::before {
  transform: scaleX(0);
}

.sp-js .sp-index.is-in::before {
  transform: none;
  transition: transform var(--sp-dur-draw) var(--sp-ease-draw);
}

.sp-index__num {
  grid-column: 1 / span 1;
  color: var(--sp-mark);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-index);
  font-weight: var(--sp-weight-regular);
  line-height: 1;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}

.sp-index__title {
  grid-column: 2 / -1;
  min-width: 0;
}

.sp-index__aside {
  grid-column: 2 / -1;
  color: var(--sp-muted);
  font-size: 1rem;
  line-height: var(--sp-lh-body);
}

.sp-index__aside .sp-link {
  margin-block-start: -6px;
}

@media (min-width: 960px) {
  .sp-index__num {
    grid-column: 1 / span 2;
  }

  .sp-index__title {
    grid-column: 3 / span 7;
  }

  .sp-index__aside {
    grid-column: 10 / span 3;
  }
}

/* Sub-sections: a hairline, a small muted number and a headline */
.sp-index--sub {
  margin-block-end: var(--sp-space-7);
}

.sp-index--sub:not(:first-child) {
  margin-block-start: clamp(3rem, 2rem + 3vw, 5rem);
}

.sp-index--sub::before {
  background: var(--sp-hair-strong);
}

.sp-index--sub .sp-index__num {
  color: var(--sp-muted);
  font-size: var(--sp-fs-mono);
  letter-spacing: 0;
}

.sp-index--sub .sp-index__title {
  font-size: var(--sp-fs-headline);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

@media (prefers-reduced-motion: reduce) {
  .sp-js .sp-index::before,
  .sp-js .sp-index.is-in::before {
    transform: none;
    transition: none;
  }
}

/* ---- hero ---- */
/* Hero: type only, on the visible grid. Title across columns 1 to 11, lede in 1 to 6, spec rows in
   9 to 12. The page variant is shorter and opens every inner page. */

.sp-hero {
  position: relative;
  isolation: isolate;
  padding-block: clamp(4.5rem, 2.5rem + 7vw, 9rem) clamp(3.5rem, 2rem + 5vw, 7rem);
  border-block-end: 1px solid var(--sp-rule);
}

.sp-hero__grid {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-7);
  align-items: start;
}

:where(.sp-hero__grid) > * {
  grid-column: 1 / -1;
  min-width: 0;
}

.sp-hero__crumbs {
  margin-block-end: var(--sp-space-4);
}

.sp-hero__title {
  color: var(--sp-ink);
  font-size: var(--sp-fs-display);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-display);
  letter-spacing: var(--sp-track-display);
  text-wrap: balance;
}

.sp-hero__title em {
  color: var(--sp-mark);
  font-style: normal;
}

.sp-hero__lede {
  margin-block-start: clamp(1rem, 3vw, 3rem);
}

.sp-hero__aside {
  align-self: end;
}

.sp-hero__actions {
  margin-block-start: var(--sp-space-2);
}

@media (min-width: 640px) {
  .sp-hero__lede,
  .sp-hero__actions {
    grid-column: 1 / span 6;
  }
}

@media (min-width: 960px) {
  .sp-hero__grid {
    grid-auto-flow: row dense;
  }

  .sp-hero__title {
    grid-column: 1 / span 11;
  }

  .sp-hero__lede {
    grid-column: 1 / span 6;
  }

  .sp-hero__aside {
    grid-column: 9 / span 4;
    grid-row: span 2;
  }

  .sp-hero__actions {
    grid-column: 1 / span 6;
  }
}

.sp-hero--page {
  padding-block: clamp(3.5rem, 2rem + 5vw, 6.5rem) clamp(2.5rem, 1.5rem + 3vw, 4.5rem);
}

.sp-hero--page .sp-hero__title {
  font-size: clamp(2.5rem, 1.3rem + 4.6vw, 5.75rem);
}

@media (min-width: 960px) {
  .sp-hero--page .sp-hero__title {
    grid-column: 1 / span 9;
  }
}

/* ---- section-header ---- */
/* Section header: an unnumbered heading. Title in columns 1 to 7, intro in 9 to 12 on the title's
   last line. Use the stacked variant when the intro needs the reading width. */

.sp-head {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-4);
  align-items: end;
  margin-block-end: clamp(2.5rem, 1.5rem + 3vw, 4rem);
}

:where(.sp-head) > * {
  grid-column: 1 / -1;
  min-width: 0;
}

.sp-head__intro {
  max-width: 34em;
  color: var(--sp-body);
}

@media (min-width: 960px) {
  .sp-head__title {
    grid-column: 1 / span 7;
  }

  .sp-head__intro,
  .sp-head__actions {
    grid-column: 9 / span 4;
  }

  .sp-head--stack .sp-head__intro,
  .sp-head--stack .sp-head__actions {
    grid-column: 1 / span 6;
  }
}

.sp-head--sm .sp-head__title {
  font-size: var(--sp-fs-headline);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

/* ---- spec-rows ---- */
/* Spec rows: label and value, mono caps label, a hairline between rows and an ink rule on top.
   Read like the spec sheet on the back of an instrument. */

.sp-spec {
  display: grid;
  margin: 0;
  border-block-end: 1px solid var(--sp-hair);
}

.sp-spec__row {
  display: grid;
  grid-template-columns: minmax(6.5rem, 2fr) minmax(0, 3fr);
  gap: var(--sp-space-4);
  align-items: baseline;
  padding-block: 9px;
  border-block-start: 1px solid var(--sp-hair);
}

.sp-spec__row:first-child {
  border-block-start-color: var(--sp-rule);
}

.sp-spec__label {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-mono);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-spec__value {
  margin: 0;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  line-height: var(--sp-lh-mono);
  font-variant-ligatures: none;
  overflow-wrap: anywhere;
}

.sp-spec__value a {
  color: var(--sp-ink);
}

.sp-spec__note {
  display: block;
  color: var(--sp-muted);
}

.sp-spec--sans .sp-spec__value {
  font-family: var(--sp-font-sans);
  font-size: 1rem;
  line-height: var(--sp-lh-snug);
}

.sp-spec--stacked .sp-spec__row {
  grid-template-columns: minmax(0, 1fr);
  gap: 2px;
}

/* Strip: the rows become columns that sit on the page grid, label above value */
.sp-spec--strip {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 11rem), 1fr));
  column-gap: var(--sp-gap);
  border-block-end: 0;
}

.sp-spec--strip .sp-spec__row {
  grid-template-columns: minmax(0, 1fr);
  gap: var(--sp-space-1);
  padding-block: var(--sp-space-3) 0;
  border-block-start-color: var(--sp-rule);
}

.sp-spec--strip .sp-spec__value {
  font-family: var(--sp-font-sans);
  font-size: var(--sp-fs-card);
  line-height: var(--sp-lh-snug);
  letter-spacing: -0.01em;
}

/* ---- big-figure ---- */
/* Big figure: the number is the headline. It runs to its column edge (the fit classes size it from
   the column width), sits in the mark color, and always carries a caption and a source line. */

.sp-figure {
  container-type: inline-size;
  display: grid;
  gap: var(--sp-space-3);
  align-content: start;
  margin: 0;
  min-width: 0;
}

.sp-figure__num {
  margin: 0;
  margin-inline-start: -0.055em;
  color: var(--sp-mark);
  font-size: min(var(--sp-fs-figure), 52cqi);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-figure);
  letter-spacing: var(--sp-track-figure);
  font-variant-numeric: lining-nums tabular-nums;
  white-space: nowrap;
}

.sp-figure__unit {
  margin-inline-start: 0.04em;
  font-size: 0.42em;
  letter-spacing: -0.02em;
  vertical-align: 0.98em;
}

.sp-figure--fit-2 .sp-figure__num { font-size: 86cqi; }
.sp-figure--fit-3 .sp-figure__num { font-size: 60cqi; }
.sp-figure--fit-4 .sp-figure__num { font-size: 46cqi; }
.sp-figure--fit-5 .sp-figure__num { font-size: 37cqi; }
.sp-figure--fit-6 .sp-figure__num { font-size: 31cqi; }

.sp-figure__caption {
  padding-block-start: var(--sp-space-3);
  border-block-start: 1px solid var(--sp-rule);
  color: var(--sp-ink);
  font-size: 1.0625rem;
  line-height: var(--sp-lh-snug);
}

.sp-figure__source {
  display: block;
  max-width: 44em;
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  line-height: var(--sp-lh-mono);
}

.sp-figure__source a {
  color: var(--sp-muted);
}

.sp-figure--ink .sp-figure__num {
  color: var(--sp-ink);
}

/* Crop: the figure runs off the bottom of its frame like a poster. Pair it with a visible number in text. */
.sp-figure--crop {
  overflow: hidden;
}

.sp-figure--crop .sp-figure__num {
  margin-block-end: -0.17em;
}

/* ---- features ---- */
/* Features: no boxes. Each one stands on a 1px rule with an icon, a mono code, a title and a sentence. */

.sp-features {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-10);
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-feature {
  display: grid;
  gap: var(--sp-space-3);
  align-content: start;
  grid-column: 1 / -1;
  min-width: 0;
  padding-block-start: var(--sp-space-4);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-feature__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-block-end: var(--sp-space-5);
  color: var(--sp-ink);
}

.sp-feature__code {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
}

.sp-feature__title {
  font-size: var(--sp-fs-card);
}

.sp-feature__text {
  color: var(--sp-body);
}

@media (min-width: 640px) {
  .sp-feature {
    grid-column: auto / span 4;
  }
}

@media (min-width: 960px) {
  .sp-feature {
    grid-column: auto / span 4;
  }

  .sp-features--4 .sp-feature {
    grid-column: auto / span 3;
  }

  .sp-features--2 .sp-feature {
    grid-column: auto / span 6;
  }
}

/* Checklist: square bullets with a check, for "included" and "you get" lists */
.sp-checks {
  display: grid;
  gap: var(--sp-space-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-checks li {
  display: grid;
  grid-template-columns: 20px minmax(0, 1fr);
  gap: var(--sp-space-3);
  align-items: baseline;
}

.sp-checks svg {
  align-self: start;
  margin-block-start: 3px;
  color: var(--sp-ink);
}

.sp-checks .is-no {
  color: var(--sp-muted);
}

.sp-checks .is-no svg {
  color: var(--sp-muted);
}

/* ---- cards ---- */
/* Cards: a top rule, not a box. Mono meta, a title, a sentence and a link. The boxed variant is for
   the rare card that must read as a separate object (a downloadable file, a form step). */

.sp-cards {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-10);
  margin: 0;
  padding: 0;
  list-style: none;
}

:where(.sp-cards) > * {
  grid-column: 1 / -1;
  min-width: 0;
}

@media (min-width: 640px) {
  :where(.sp-cards) > * {
    grid-column: auto / span 4;
  }
}

@media (min-width: 960px) {
  :where(.sp-cards) > * {
    grid-column: auto / span 4;
  }

  .sp-cards--2 > * {
    grid-column: auto / span 6;
  }

  .sp-cards--4 > * {
    grid-column: auto / span 3;
  }
}

.sp-card {
  position: relative;
  display: grid;
  gap: var(--sp-space-3);
  align-content: start;
  padding-block-start: var(--sp-space-4);
  border-block-start: 1px solid var(--sp-rule);
  border-radius: var(--sp-radius-card);
}

.sp-card__visual {
  margin-block-end: var(--sp-space-2);
}

.sp-card__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-space-1) var(--sp-space-4);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-card__title {
  font-size: var(--sp-fs-card);
}

.sp-card__title a {
  color: var(--sp-ink);
  text-decoration-color: transparent;
}

.sp-card--link .sp-card__title a::after {
  content: "";
  position: absolute;
  inset: 0;
}

.sp-card--link:hover .sp-card__title a,
.sp-card__title a:hover {
  text-decoration-color: var(--sp-mark);
}

.sp-card__text {
  color: var(--sp-body);
}

.sp-card__foot {
  margin-block-start: var(--sp-space-2);
}

.sp-card--boxed {
  padding: var(--sp-space-6);
  border: 1px solid var(--sp-hair-strong);
}

.sp-card--boxed.sp-card--link:hover {
  border-color: var(--sp-ink);
}

.sp-card--lg .sp-card__title {
  font-size: var(--sp-fs-headline);
  line-height: var(--sp-lh-snug);
}

/* ---- bento ---- */
/* Bento: cells of different widths on the page grid, each on a top rule. Mix a figure, spec rows, a
   small chart and a sentence. One cell may take the sunk fill. */

.sp-bento {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-9);
}

.sp-bento__cell {
  display: grid;
  gap: var(--sp-space-4);
  align-content: start;
  grid-column: 1 / -1;
  min-width: 0;
  min-height: 15rem;
  padding-block-start: var(--sp-space-4);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-bento__cell--spread {
  align-content: space-between;
}

.sp-bento__cell--fill {
  padding: var(--sp-space-6);
  border-block-start-color: transparent;
  background: var(--sp-sunk);
}

.sp-bento__label {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-bento__title {
  font-size: var(--sp-fs-card);
}

.sp-bento__text {
  color: var(--sp-body);
}

@media (min-width: 640px) {
  .sp-bento__cell {
    grid-column: auto / span 4;
  }

  .sp-bento__cell--w8,
  .sp-bento__cell--w12 {
    grid-column: 1 / -1;
  }
}

@media (min-width: 960px) {
  .sp-bento__cell { grid-column: auto / span 4; }
  .sp-bento__cell--w3 { grid-column: auto / span 3; }
  .sp-bento__cell--w5 { grid-column: auto / span 5; }
  .sp-bento__cell--w6 { grid-column: auto / span 6; }
  .sp-bento__cell--w7 { grid-column: auto / span 7; }
  .sp-bento__cell--w8 { grid-column: auto / span 8; }
  .sp-bento__cell--w12 { grid-column: 1 / -1; }

  .sp-bento__cell--tall {
    grid-row: span 2;
  }
}

/* ---- stats ---- */
/* Stats: sourced figures standing on column rules. Every number gets a source line. */

.sp-stats {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-8);
  margin: 0;
}

.sp-stat {
  display: grid;
  gap: var(--sp-space-2);
  align-content: start;
  grid-column: auto / span 2;
  min-width: 0;
  padding-inline-start: var(--sp-space-3);
  border-inline-start: 1px solid var(--sp-rule);
}

.sp-stat__num {
  order: -1;
  margin: 0;
  color: var(--sp-ink);
  font-size: clamp(2.5rem, 1.9rem + 2.4vw, 4.25rem);
  font-weight: var(--sp-weight-medium);
  line-height: 1;
  letter-spacing: -0.045em;
  font-variant-numeric: tabular-nums;
}

.sp-stat__num small {
  margin-inline-start: 2px;
  font-size: 0.5em;
  letter-spacing: -0.01em;
}

.sp-stat__label {
  margin: 0;
  color: var(--sp-ink);
  font-size: 1rem;
  line-height: var(--sp-lh-snug);
}

.sp-stat__source {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  line-height: var(--sp-lh-mono);
}

@media (min-width: 640px) {
  .sp-stat {
    grid-column: auto / span 2;
  }
}

@media (min-width: 960px) {
  .sp-stat {
    grid-column: auto / span 3;
  }
}

/* ---- logo-row ---- */
/* Logo row: invented geometric marks with names, each in two columns of the grid, on a rule. */

.sp-logos {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  margin: 0;
  padding: 0;
  list-style: none;
  border-block: 1px solid var(--sp-hair);
  border-block-start-color: var(--sp-rule);
}

.sp-logo {
  display: flex;
  align-items: center;
  gap: var(--sp-space-3);
  grid-column: auto / span 2;
  min-width: 0;
  min-height: 84px;
  color: var(--sp-ink);
}

.sp-logo svg {
  width: 30px;
  height: 30px;
  flex: none;
}

.sp-logo__name {
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  line-height: 1.3;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-logo__fill {
  fill: currentColor;
}

.sp-logo__cut {
  fill: var(--sp-paper);
}

@media (min-width: 640px) {
  .sp-logo {
    grid-column: auto / span 2;
  }
}

/* ---- testimonial ---- */
/* Quote: large type with a hanging accent quotation mark, attributed to someone at the studio. */

.sp-quote {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-7);
  margin: 0;
}

:where(.sp-quote) > * {
  grid-column: 1 / -1;
  min-width: 0;
}

.sp-quote__text {
  margin: 0;
  color: var(--sp-ink);
  font-size: clamp(1.625rem, 1.15rem + 1.9vw, 2.875rem);
  font-weight: var(--sp-weight-regular);
  line-height: 1.12;
  letter-spacing: -0.022em;
}

.sp-quote__text p {
  text-wrap: pretty;
}

.sp-quote__text p:first-child::before {
  content: "\201C";
  display: inline-block;
  width: 0.5em;
  margin-inline-start: -0.5em;
  color: var(--sp-mark);
}

.sp-quote__text p:last-child::after {
  content: "\201D";
}

.sp-quote__by {
  display: flex;
  align-items: center;
  gap: var(--sp-space-3);
}

.sp-quote__name {
  display: block;
  color: var(--sp-ink);
  font-style: normal;
  font-weight: var(--sp-weight-medium);
}

.sp-quote__role {
  display: block;
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

@media (max-width: 639px) {
  .sp-quote__text {
    padding-inline-start: 0.5em;
  }
}

@media (min-width: 960px) {
  .sp-quote__text {
    grid-column: 3 / span 9;
  }

  .sp-quote__by {
    grid-column: 3 / span 6;
  }

  .sp-quote--sm .sp-quote__text {
    font-size: var(--sp-fs-headline);
    line-height: var(--sp-lh-snug);
  }
}

/* ---- pricing ---- */
/* Pricing: engagement columns on rules, not cards. Name, code, price, the terms as spec rows, what's
   included, one action. The featured plan's rule is thicker and in the mark color. */

.sp-plans {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-10);
}

.sp-plan {
  position: relative;
  display: grid;
  grid-template-rows: auto auto auto auto 1fr auto;
  gap: var(--sp-space-5);
  grid-column: 1 / -1;
  min-width: 0;
  padding-block-start: var(--sp-space-5);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-plan--featured {
  border-block-start: 6px solid var(--sp-mark);
  padding-block-start: calc(var(--sp-space-5) - 5px);
}

.sp-plan__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--sp-space-3);
}

.sp-plan__name {
  font-size: var(--sp-fs-card);
}

.sp-plan__code {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
}

.sp-plan__price {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--sp-space-2);
  margin: 0;
  color: var(--sp-ink);
}

.sp-plan__amount {
  font-size: clamp(2.75rem, 2.1rem + 2.4vw, 4.25rem);
  font-weight: var(--sp-weight-medium);
  line-height: 1;
  letter-spacing: -0.045em;
  font-variant-numeric: tabular-nums;
}

.sp-plan__per {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-plan__desc {
  color: var(--sp-body);
}

.sp-plan__list {
  align-content: start;
}

.sp-plan__cta {
  margin-block-start: var(--sp-space-3);
}

.sp-plans__bar {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  gap: var(--sp-space-4);
  margin-block-end: var(--sp-space-8);
}

.sp-plans__note {
  margin-block-start: var(--sp-space-8);
  color: var(--sp-muted);
  font-size: 1rem;
}

@media (min-width: 960px) {
  .sp-plan {
    grid-column: auto / span 4;
    grid-row: span 6;
    grid-template-rows: subgrid;
  }
}

/* ---- faq ---- */
/* FAQ: native details on rules. A mono question number in the first columns, the question from
   column 3, a plus that turns into a cross. The answer sits in the question's column. */

.sp-faq {
  border-block-end: 1px solid var(--sp-hair);
}

.sp-faq__item {
  border-block-start: 1px solid var(--sp-hair);
}

.sp-faq__item:first-child {
  border-block-start-color: var(--sp-rule);
}

.sp-faq__q {
  display: grid;
  grid-template-columns: 3.25rem minmax(0, 1fr) 24px;
  column-gap: var(--sp-gap);
  align-items: baseline;
  min-height: 56px;
  padding-block: var(--sp-space-5);
  color: var(--sp-ink);
  font-size: clamp(1.125rem, 1.05rem + 0.35vw, 1.375rem);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-snug);
  letter-spacing: -0.01em;
  list-style: none;
  cursor: pointer;
}

.sp-faq__q::-webkit-details-marker {
  display: none;
}

.sp-faq__q:hover .sp-faq__text {
  text-decoration: underline;
  text-decoration-color: var(--sp-mark);
  text-decoration-thickness: 1px;
  text-underline-offset: 0.2em;
}

.sp-faq__num {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-regular);
  letter-spacing: var(--sp-track-caps);
}

.sp-faq__icon {
  align-self: center;
  color: var(--sp-ink);
  transition: transform var(--sp-dur) var(--sp-ease);
}

.sp-faq__item[open] .sp-faq__icon {
  transform: rotate(45deg);
}

.sp-faq__a {
  display: grid;
  grid-template-columns: 3.25rem minmax(0, 1fr) 24px;
  column-gap: var(--sp-gap);
  padding-block-end: var(--sp-space-6);
}

.sp-faq__a > * {
  grid-column: 2;
  max-width: 40em;
}

.sp-faq__a > * + * {
  margin-block-start: var(--sp-space-3);
}

@media (min-width: 960px) {
  .sp-faq__q,
  .sp-faq__a {
    grid-template-columns: repeat(12, minmax(0, 1fr));
  }

  .sp-faq__num {
    grid-column: 1 / span 2;
  }

  .sp-faq__text,
  .sp-faq__a > * {
    grid-column: 3 / span 8;
  }

  .sp-faq__icon {
    grid-column: 12;
    justify-self: end;
  }
}

@media (prefers-reduced-motion: reduce) {
  .sp-faq__icon {
    transition: none;
  }
}

/* ---- cta ---- */
/* CTA: the accent field. A full-bleed block of the accent color, black type at display size, one
   ink button. The only place the accent becomes a surface. One per page, at the end. */

.sp-cta {
  position: relative;
  isolation: isolate;
  padding-block: clamp(4rem, 2.5rem + 6vw, 9rem);
  background: var(--sp-accent);
  color: var(--sp-accent-ink);
}

.sp-cta__grid {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-7);
}

:where(.sp-cta__grid) > * {
  grid-column: 1 / -1;
  min-width: 0;
}

.sp-cta__title {
  color: var(--sp-accent-ink);
  font-size: clamp(2.75rem, 1rem + 7vw, 8rem);
  line-height: 0.92;
  letter-spacing: var(--sp-track-display);
}

.sp-cta__text {
  max-width: 30em;
  color: var(--sp-accent-ink);
  font-size: var(--sp-fs-lede);
  line-height: 1.38;
}

.sp-cta__meta {
  display: block;
  color: var(--sp-accent-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-cta a:not(.sp-btn) {
  color: var(--sp-accent-ink);
  text-decoration-color: currentColor;
}

/* The CTA button: black block, paper label; inverts on hover */
.sp-cta .sp-btn {
  border-color: var(--sp-accent-ink);
  background: var(--sp-accent-ink);
  color: var(--sp-accent);
}

.sp-cta .sp-btn:hover {
  background: transparent;
  color: var(--sp-accent-ink);
}

.sp-cta .sp-btn:focus-visible {
  outline-color: var(--sp-accent-ink);
}

@media (min-width: 960px) {
  .sp-cta__title {
    grid-column: 1 / span 10;
  }

  .sp-cta__text {
    grid-column: 1 / span 6;
  }

  .sp-cta__side {
    grid-column: 9 / span 4;
    align-self: end;
  }
}

/* ---- case-study-header ---- */
/* Case study header: the visible grid, a breadcrumb, a giant title, the lede in 1 to 6 and the
   project's spec rows in 9 to 12, then a coded plate across the frame. */

.sp-case-head {
  position: relative;
  isolation: isolate;
  padding-block: clamp(3rem, 2rem + 4vw, 6rem) 0;
}

.sp-case-head__grid {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-7);
}

:where(.sp-case-head__grid) > * {
  grid-column: 1 / -1;
  min-width: 0;
}

.sp-case-head__title {
  margin-block-start: clamp(2rem, 1rem + 4vw, 5rem);
  color: var(--sp-ink);
  font-size: var(--sp-fs-display);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-display);
  letter-spacing: var(--sp-track-display);
}

.sp-case-head__lede {
  margin-block-start: clamp(0.5rem, 2vw, 2rem);
}

.sp-case-head__plate {
  margin-block-start: clamp(2.5rem, 1.5rem + 4vw, 5rem);
}

.sp-case-head__plate .sp-comp {
  aspect-ratio: 21 / 9;
}

.sp-case-head__caption {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: var(--sp-space-2) var(--sp-space-6);
  padding-block: var(--sp-space-3);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

@media (max-width: 639px) {
  .sp-case-head__plate .sp-comp {
    aspect-ratio: 3 / 2;
  }
}

@media (min-width: 960px) {
  .sp-case-head__title {
    grid-column: 1 / span 11;
  }

  .sp-case-head__lede {
    grid-column: 1 / span 6;
  }

  .sp-case-head__spec {
    grid-column: 9 / span 4;
    margin-block-start: clamp(0.5rem, 2vw, 2rem);
  }
}

/* ---- project-index ---- */
/* Project index: a real table of projects. Number, project (the link), client, discipline, year.
   Filter buttons hide rows by discipline and a polite count says how many remain. */

.sp-projects__bar {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  gap: var(--sp-space-4);
  margin-block-end: var(--sp-space-6);
}

.sp-projects__count {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-projects {
  width: 100%;
  border-collapse: collapse;
  font-variant-numeric: tabular-nums;
}

.sp-projects th {
  padding: 0 var(--sp-space-3) var(--sp-space-3) 0;
  border-block-end: 1px solid var(--sp-rule);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-align: left;
  text-transform: uppercase;
  white-space: nowrap;
}

[dir="rtl"] .sp-projects th,
[dir="rtl"] .sp-projects td {
  padding-inline: 0 var(--sp-space-3);
  text-align: right;
}

.sp-projects td {
  padding: var(--sp-space-4) var(--sp-space-3) var(--sp-space-4) 0;
  border-block-end: 1px solid var(--sp-hair);
  vertical-align: baseline;
  text-align: left;
}

.sp-projects tbody tr {
  position: relative;
  transition: background-color var(--sp-dur-fast) var(--sp-ease);
}

.sp-projects tbody tr:hover {
  background: var(--sp-sunk);
}

.sp-projects__no,
.sp-projects__year {
  width: 4.5rem;
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
}

.sp-projects__year {
  width: 4rem;
}

.sp-projects__name {
  font-size: clamp(1.125rem, 1rem + 0.5vw, 1.5rem);
  font-weight: var(--sp-weight-medium);
  letter-spacing: -0.015em;
}

.sp-projects__link {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-space-2);
  color: var(--sp-ink);
  text-decoration: none;
}

.sp-projects__link::after {
  content: "";
  position: absolute;
  inset: 0;
}

.sp-projects__link svg {
  opacity: 0;
  transform: translateX(-4px);
  transition: opacity var(--sp-dur-fast) var(--sp-ease), transform var(--sp-dur-fast) var(--sp-ease);
}

.sp-projects tr:hover .sp-projects__link svg,
.sp-projects__link:focus-visible svg {
  opacity: 1;
  transform: none;
}

.sp-projects__client {
  color: var(--sp-body);
}

.sp-projects__disc {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-projects tr[hidden] {
  display: none;
}

.sp-projects__empty td {
  padding-block: var(--sp-space-8);
  color: var(--sp-muted);
}

@media (max-width: 759px) {
  .sp-projects thead {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
  }

  .sp-projects,
  .sp-projects tbody {
    display: block;
  }

  .sp-projects tbody tr {
    display: grid;
    grid-template-columns: 3.5rem minmax(0, 1fr) auto;
    column-gap: var(--sp-space-3);
    row-gap: 2px;
    padding-block: var(--sp-space-4);
    border-block-end: 1px solid var(--sp-hair);
  }

  .sp-projects tbody tr:first-child {
    border-block-start: 1px solid var(--sp-rule);
  }

  .sp-projects td {
    width: auto;
    padding: 0;
    border: 0;
  }

  .sp-projects__no {
    grid-row: span 3;
  }

  .sp-projects__name {
    grid-column: 2;
  }

  .sp-projects__year {
    grid-column: 3;
    grid-row: 1;
    text-align: end;
  }

  .sp-projects__client,
  .sp-projects__disc {
    grid-column: 2 / -1;
  }
}

@media (prefers-reduced-motion: reduce) {
  .sp-projects tbody tr,
  .sp-projects__link svg {
    transition: none;
  }
}

/* ---- contact-sheet ---- */
/* Contact sheet: project frames as coded SVG compositions, numbered like frames on a proof sheet.
   Compositions use only the .sp-comp__* fills and strokes, so they follow the theme and accent. */

.sp-sheet {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-9);
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-sheet__item {
  grid-column: 1 / -1;
  min-width: 0;
}

@media (min-width: 640px) {
  .sp-sheet__item {
    grid-column: auto / span 4;
  }
}

@media (min-width: 960px) {
  .sp-sheet__item {
    grid-column: auto / span 4;
  }

  .sp-sheet--4 .sp-sheet__item {
    grid-column: auto / span 3;
  }

  .sp-sheet__item--wide {
    grid-column: auto / span 8;
  }
}

.sp-sheet__link {
  display: grid;
  gap: var(--sp-space-3);
  color: var(--sp-ink);
  text-decoration: none;
}

.sp-sheet__meta {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  column-gap: var(--sp-space-3);
  align-items: baseline;
  padding-block-start: var(--sp-space-3);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-sheet__no,
.sp-sheet__info {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
}

.sp-sheet__title {
  font-size: 1.0625rem;
  line-height: var(--sp-lh-snug);
}

.sp-sheet__link:hover .sp-sheet__title {
  text-decoration: underline;
  text-decoration-color: var(--sp-mark);
  text-underline-offset: 0.22em;
}

/* Composition frame and its paint classes */
.sp-comp {
  position: relative;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--sp-sunk);
}

.sp-comp svg {
  width: 100%;
  height: 100%;
  transition: transform 500ms var(--sp-ease);
}

.sp-sheet__link:hover .sp-comp svg {
  transform: scale(1.035);
}

.sp-comp__ink { fill: var(--sp-ink); }
.sp-comp__acc { fill: var(--sp-accent); }
.sp-comp__paper { fill: var(--sp-paper); }
.sp-comp__mid { fill: var(--sp-line-control); }
.sp-comp__line { fill: none; stroke: var(--sp-ink); }
.sp-comp__acc-line { fill: none; stroke: var(--sp-accent); }
.sp-comp__hair { fill: none; stroke: var(--sp-hair-strong); }
.sp-comp__text {
  fill: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: 12px;
}

@media (prefers-reduced-motion: reduce) {
  .sp-comp svg {
    transition: none;
  }

  .sp-sheet__link:hover .sp-comp svg {
    transform: none;
  }
}

/* ---- process ---- */
/* Process: numbered phases on rules. Number, title, what happens, and a week scale showing when the
   phase runs. Set --sp-total on the list and --sp-from / --sp-len (in weeks) on each step. */

.sp-process {
  margin: 0;
  padding: 0;
  list-style: none;
  border-block-end: 1px solid var(--sp-hair);
  --sp-total: 12;
}

.sp-process__step {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-3);
  align-items: baseline;
  padding-block: var(--sp-space-6);
  border-block-start: 1px solid var(--sp-hair);
  --sp-from: 0;
  --sp-len: 1;
}

.sp-process__step:first-child {
  border-block-start-color: var(--sp-rule);
}

.sp-process__num {
  grid-column: 1 / span 1;
  color: var(--sp-mark);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-index);
  line-height: 1;
}

.sp-process__title {
  grid-column: 2 / -1;
  font-size: var(--sp-fs-headline);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

.sp-process__text {
  grid-column: 2 / -1;
  max-width: 34em;
}

.sp-process__time {
  grid-column: 2 / -1;
  display: grid;
  gap: var(--sp-space-2);
  margin-block-start: var(--sp-space-2);
}

.sp-process__dur {
  display: flex;
  justify-content: space-between;
  gap: var(--sp-space-3);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-process__dur strong {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-process__track {
  position: relative;
  height: 12px;
  border-block-end: 1px solid var(--sp-hair-strong);
  background-image: repeating-linear-gradient(to right, var(--sp-hair-strong) 0 1px, transparent 1px calc(100% / var(--sp-total)));
}

[dir="rtl"] .sp-process__track {
  background-image: repeating-linear-gradient(to left, var(--sp-hair-strong) 0 1px, transparent 1px calc(100% / var(--sp-total)));
}

.sp-process__bar {
  position: absolute;
  inset-block: 2px 0;
  inset-inline-start: calc(var(--sp-from) / var(--sp-total) * 100%);
  width: calc(var(--sp-len) / var(--sp-total) * 100%);
  background: var(--sp-mark);
}

@media (min-width: 960px) {
  .sp-process__title {
    grid-column: 2 / span 3;
  }

  .sp-process__text {
    grid-column: 5 / span 4;
  }

  .sp-process__time {
    grid-column: 9 / span 4;
    margin-block-start: 0;
  }
}

/* ---- credits ---- */
/* Credits: roles as mono caps labels in columns 1 to 3, names from column 4, one row per role. */

.sp-credits {
  display: grid;
  margin: 0;
  border-block-end: 1px solid var(--sp-hair);
}

.sp-credits__row {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-1);
  align-items: baseline;
  padding-block: var(--sp-space-4);
  border-block-start: 1px solid var(--sp-hair);
}

.sp-credits__row:first-child {
  border-block-start-color: var(--sp-rule);
}

.sp-credits__role {
  grid-column: 1 / -1;
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-credits__names {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-space-1) var(--sp-space-6);
  margin: 0;
  color: var(--sp-ink);
  font-size: clamp(1.0625rem, 1rem + 0.4vw, 1.375rem);
  letter-spacing: -0.01em;
}

.sp-credits__names span {
  white-space: nowrap;
}

@media (min-width: 960px) {
  .sp-credits__role {
    grid-column: 1 / span 3;
  }

  .sp-credits__names {
    grid-column: 4 / -1;
  }
}

/* ---- prose ---- */
/* Prose: long-form reading. 18px on a 40rem measure, numbered h2s on a rule, square bullets in the
   mark color, mono figure captions and footnote marks. Put it in columns 1 to 7; metadata goes in 9 to 12. */

.sp-prose {
  max-width: var(--sp-measure);
  color: var(--sp-body);
  font-size: var(--sp-fs-reading);
  line-height: var(--sp-lh-reading);
}

.sp-prose > * + * {
  margin-block-start: 1.1em;
}

.sp-prose > .sp-prose__lede {
  color: var(--sp-ink);
  font-size: var(--sp-fs-lede);
  line-height: 1.45;
}

.sp-prose h2 {
  display: flex;
  gap: 0.6em;
  align-items: baseline;
  margin-block-start: 2.4em;
  padding-block-start: var(--sp-space-3);
  border-block-start: 1px solid var(--sp-rule);
  font-size: clamp(1.625rem, 1.35rem + 1.1vw, 2.25rem);
  line-height: 1.12;
  letter-spacing: -0.022em;
  scroll-margin-top: calc(var(--sp-nav-h) + var(--sp-space-6));
}

.sp-prose__num {
  flex: none;
  color: var(--sp-mark);
  font-family: var(--sp-font-mono);
  font-size: max(0.75em, 1.5rem);
  font-weight: var(--sp-weight-regular);
  letter-spacing: -0.02em;
}

.sp-prose h3 {
  margin-block-start: 2em;
  font-size: 1.3125rem;
  scroll-margin-top: calc(var(--sp-nav-h) + var(--sp-space-6));
}

.sp-prose h2 + *,
.sp-prose h3 + * {
  margin-block-start: 0.6em;
}

.sp-prose a {
  text-decoration-color: var(--sp-mark);
}

.sp-prose ul,
.sp-prose ol {
  padding-inline-start: 1.4em;
}

.sp-prose ul {
  list-style: square;
}

.sp-prose ol {
  padding-inline-start: 2.4em;
  list-style: decimal-leading-zero;
}

.sp-prose li + li {
  margin-block-start: 0.4em;
}

.sp-prose ul > li::marker {
  color: var(--sp-mark);
}

.sp-prose ol > li::marker {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: 0.8em;
}

.sp-prose blockquote {
  margin-inline: 0;
  padding-inline-start: var(--sp-space-5);
  border-inline-start: 2px solid var(--sp-rule);
  color: var(--sp-ink);
  font-size: 1.3125rem;
  line-height: 1.4;
  letter-spacing: -0.01em;
}

.sp-prose figure {
  margin-block: 2em;
}

.sp-prose figcaption {
  margin-block-start: var(--sp-space-3);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  line-height: var(--sp-lh-mono);
}

.sp-prose pre {
  padding: var(--sp-space-4) var(--sp-space-5);
  overflow-x: auto;
  background: var(--sp-sunk);
  color: var(--sp-ink);
  font-size: 0.875rem;
  line-height: 1.6;
}

.sp-prose table {
  width: 100%;
  border-collapse: collapse;
  font-size: 1rem;
  font-variant-numeric: tabular-nums;
}

.sp-prose th {
  padding: 0 var(--sp-space-3) var(--sp-space-2) 0;
  border-block-end: 1px solid var(--sp-rule);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-align: left;
  text-transform: uppercase;
}

.sp-prose td {
  padding: var(--sp-space-2) var(--sp-space-3) var(--sp-space-2) 0;
  border-block-end: 1px solid var(--sp-hair);
  text-align: left;
}

[dir="rtl"] .sp-prose th,
[dir="rtl"] .sp-prose td {
  padding-inline: 0 var(--sp-space-3);
  text-align: right;
}

/* A sources list at the end of an article keeps its own layout, not the prose list style */
.sp-prose .sp-sources {
  padding-inline-start: 0;
  list-style: none;
}

.sp-prose .sp-sources li + li {
  margin-block-start: 0;
}

.sp-prose hr {
  width: 3rem;
  height: 2px;
  margin-block: 2.4em;
  background: var(--sp-mark);
}

/* ---- callout ---- */
/* Callout: an aside on a colored top rule. A mono label with an icon, then the text. No box. */

.sp-callout {
  display: grid;
  gap: var(--sp-space-2);
  padding-block: var(--sp-space-4) var(--sp-space-5);
  border-block-start: 2px solid var(--sp-rule);
  border-block-end: 1px solid var(--sp-hair);
  color: var(--sp-body);
  font-size: 1rem;
  line-height: var(--sp-lh-body);
}

.sp-callout__label {
  display: flex;
  align-items: center;
  gap: var(--sp-space-2);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-callout__body > * + * {
  margin-block-start: var(--sp-space-2);
}

.sp-callout--method {
  border-block-start-color: var(--sp-mark);
}

.sp-callout--method .sp-callout__label {
  color: var(--sp-accent-text);
}

.sp-callout--ok {
  border-block-start-color: var(--sp-ok);
}

.sp-callout--ok .sp-callout__label {
  color: var(--sp-ok);
}

.sp-callout--warn {
  border-block-start-color: var(--sp-warn);
}

.sp-callout--warn .sp-callout__label {
  color: var(--sp-warn);
}

.sp-callout--danger {
  border-block-start-color: var(--sp-danger);
}

.sp-callout--danger .sp-callout__label {
  color: var(--sp-danger);
}

@media (min-width: 960px) {
  .sp-callout--wide {
    grid-template-columns: repeat(12, minmax(0, 1fr));
    column-gap: var(--sp-gap);
  }

  .sp-callout--wide .sp-callout__label {
    grid-column: 1 / span 3;
    align-self: start;
  }

  .sp-callout--wide .sp-callout__body {
    grid-column: 4 / span 7;
  }
}

/* ---- toc ---- */
/* Contents: numbered links; the section in view gets the accent bar and ink. */

.sp-toc {
  display: grid;
  gap: var(--sp-space-2);
}

.sp-toc__head {
  padding-block-end: var(--sp-space-2);
  border-block-end: 1px solid var(--sp-rule);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-toc__list {
  display: grid;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-toc__link {
  position: relative;
  display: grid;
  grid-template-columns: 2.2em minmax(0, 1fr);
  gap: var(--sp-space-2);
  align-items: baseline;
  min-height: 40px;
  padding-block: 8px;
  padding-inline: var(--sp-space-3) 0;
  border-block-end: 1px solid var(--sp-hair);
  color: var(--sp-body);
  font-size: 0.9375rem;
  line-height: var(--sp-lh-snug);
  text-decoration: none;
}

.sp-toc__link::before {
  content: "";
  position: absolute;
  inset-block: 6px;
  inset-inline-start: 0;
  width: 3px;
  background: transparent;
}

.sp-toc__link:hover {
  color: var(--sp-ink);
}

.sp-toc__link[aria-current="true"],
.sp-toc__link.is-current {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-toc__link[aria-current="true"]::before,
.sp-toc__link.is-current::before {
  background: var(--sp-mark);
}

.sp-toc__num {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-regular);
}

.sp-toc--sticky {
  position: sticky;
  top: calc(var(--sp-nav-h) + var(--sp-space-6));
}

/* ---- byline ---- */
/* Byline: who wrote it and the facts about the piece, as inline spec rows. */

.sp-byline {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-space-4) var(--sp-space-8);
}

.sp-byline__who {
  display: flex;
  align-items: center;
  gap: var(--sp-space-3);
}

.sp-byline__name {
  display: block;
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
  line-height: 1.3;
}

.sp-byline__role {
  display: block;
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-byline__facts {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-space-2) var(--sp-space-6);
  margin: 0;
}

.sp-byline__fact {
  display: grid;
  gap: 2px;
}

.sp-byline__fact dt {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-byline__fact dd {
  margin: 0;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
}

.sp-byline--rule {
  padding-block: var(--sp-space-4);
  border-block: 1px solid var(--sp-hair);
  border-block-start-color: var(--sp-rule);
}

/* ---- footnotes ---- */
/* Footnotes: numbered marks in the text and a sources list with links back. Evidence, not decoration. */

.sp-fn {
  font-family: var(--sp-font-mono);
  font-size: max(0.68em, 0.75rem);
  font-weight: var(--sp-weight-medium);
  line-height: 0;
  vertical-align: super;
}

.sp-fn a {
  display: inline-block;
  min-width: 1.4em;
  padding-inline: 2px;
  color: var(--sp-accent-text);
  text-align: center;
  text-decoration: none;
}

.sp-fn a:hover {
  background: var(--sp-accent-soft);
}

.sp-sources {
  display: grid;
  margin: 0;
  padding: 0;
  list-style: none;
  border-block-start: 1px solid var(--sp-rule);
}

.sp-sources__item {
  display: grid;
  grid-template-columns: 2.6rem minmax(0, 1fr);
  gap: var(--sp-space-3);
  align-items: baseline;
  padding-block: var(--sp-space-3);
  border-block-end: 1px solid var(--sp-hair);
  color: var(--sp-body);
  font-size: 1rem;
  line-height: var(--sp-lh-body);
  scroll-margin-top: calc(var(--sp-nav-h) + var(--sp-space-6));
}

.sp-sources__item:target {
  background: var(--sp-accent-soft);
}

.sp-sources__num {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
}

.sp-sources__back {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-inline-start: var(--sp-space-2);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  text-decoration: none;
  vertical-align: baseline;
}

.sp-sources__back:hover {
  color: var(--sp-ink);
}

/* ---- timeline ---- */
/* Timeline: dated rows on rules for changelogs and roadmaps. Date in columns 1 and 2, the entry
   from 3, and its tags in 10 to 12. Planned rows are muted with a dashed rule. */

.sp-timeline {
  margin: 0;
  padding: 0;
  list-style: none;
  border-block-end: 1px solid var(--sp-hair);
}

.sp-timeline__item {
  display: grid;
  grid-template-columns: repeat(var(--sp-cols), minmax(0, 1fr));
  column-gap: var(--sp-gap);
  row-gap: var(--sp-space-2);
  align-items: baseline;
  padding-block: var(--sp-space-5);
  border-block-start: 1px solid var(--sp-hair);
}

.sp-timeline__item:first-child {
  border-block-start-color: var(--sp-rule);
}

.sp-timeline__date {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  gap: var(--sp-space-2);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  font-variant-numeric: tabular-nums;
}

.sp-timeline__body {
  grid-column: 1 / -1;
  display: grid;
  gap: var(--sp-space-2);
  max-width: 40em;
}

.sp-timeline__title {
  font-size: var(--sp-fs-card);
}

.sp-timeline__tags {
  grid-column: 1 / -1;
}

.sp-timeline__item.is-new .sp-timeline__date::before {
  content: "";
  width: 8px;
  height: 8px;
  background: var(--sp-mark);
}

.sp-timeline__item.is-planned:not(:first-child) {
  border-block-start-style: dashed;
}

.sp-timeline__item.is-planned .sp-timeline__date,
.sp-timeline__item.is-planned .sp-timeline__title {
  color: var(--sp-muted);
}

@media (min-width: 960px) {
  .sp-timeline__date {
    grid-column: 1 / span 2;
  }

  .sp-timeline__body {
    grid-column: 3 / span 7;
  }

  .sp-timeline__tags {
    grid-column: 10 / span 3;
    justify-content: flex-end;
  }
}

/* ---- forms ---- */
/* Forms: mono caps labels above square inputs with a 1px control border. Hints and messages under
   the field. Errors say what to do, in danger red with an icon, never by color alone. */

.sp-form {
  display: grid;
  gap: var(--sp-space-6);
}

.sp-form__row {
  display: grid;
  gap: var(--sp-space-6);
}

@media (min-width: 640px) {
  .sp-form__row {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: var(--sp-gap);
  }
}

.sp-field {
  display: grid;
  gap: var(--sp-space-2);
  align-content: start;
  min-width: 0;
}

.sp-field__label {
  display: flex;
  justify-content: space-between;
  gap: var(--sp-space-3);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-mono);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-field__opt {
  color: var(--sp-muted);
  font-weight: var(--sp-weight-regular);
}

.sp-input,
.sp-select__control,
.sp-textarea {
  width: 100%;
  min-height: 48px;
  padding: 10px 14px;
  border: 1px solid var(--sp-line-control);
  border-radius: var(--sp-radius-input);
  background: var(--sp-paper);
  color: var(--sp-ink);
  font-family: var(--sp-font-sans);
  font-size: var(--sp-fs-body);
  line-height: 1.4;
  transition: border-color var(--sp-dur-fast) var(--sp-ease);
}

.sp-input::placeholder,
.sp-textarea::placeholder {
  color: var(--sp-muted);
  opacity: 1;
}

.sp-input:hover,
.sp-select__control:hover,
.sp-textarea:hover {
  border-color: var(--sp-ink);
}

.sp-input:focus-visible,
.sp-select__control:focus-visible,
.sp-textarea:focus-visible {
  border-color: var(--sp-ink);
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-textarea {
  min-height: 9rem;
  resize: vertical;
  line-height: var(--sp-lh-body);
}

.sp-select {
  position: relative;
}

.sp-select__control {
  appearance: none;
  padding-inline-end: 44px;
  cursor: pointer;
}

.sp-select__icon {
  position: absolute;
  inset-block: 0;
  inset-inline-end: 14px;
  display: flex;
  align-items: center;
  color: var(--sp-ink);
  pointer-events: none;
}

.sp-field__hint {
  color: var(--sp-muted);
  font-size: var(--sp-fs-meta);
  line-height: var(--sp-lh-snug);
}

.sp-field__msg {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  font-size: var(--sp-fs-meta);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-snug);
}

.sp-field__msg svg {
  flex: none;
  margin-block-start: 1px;
}

.sp-field.is-error .sp-field__msg {
  color: var(--sp-danger);
}

.sp-field.is-valid .sp-field__msg {
  color: var(--sp-ok);
}

.sp-field.is-error .sp-input,
.sp-field.is-error .sp-select__control,
.sp-field.is-error .sp-textarea {
  border-color: var(--sp-danger);
  box-shadow: inset 0 -2px 0 var(--sp-danger);
}

.sp-field.is-valid .sp-input {
  border-color: var(--sp-ok);
}

.sp-input:disabled,
.sp-select__control:disabled,
.sp-textarea:disabled {
  border-color: var(--sp-hair-strong);
  background: var(--sp-sunk);
  color: var(--sp-muted);
  cursor: not-allowed;
}

.sp-input[readonly],
.sp-textarea[readonly] {
  border-style: dashed;
  background: var(--sp-sunk);
}

/* Checkboxes and radios: real inputs, restyled. Radios stay round: the circle is the control's meaning. */
.sp-fieldset {
  display: grid;
  gap: var(--sp-space-3);
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}

.sp-fieldset legend {
  margin-block-end: var(--sp-space-3);
  padding: 0;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-check {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr);
  gap: var(--sp-space-3);
  align-items: start;
  min-height: 32px;
  color: var(--sp-ink);
  cursor: pointer;
}

.sp-check__input {
  appearance: none;
  position: relative;
  width: 22px;
  height: 22px;
  margin: 1px 0 0;
  border: 1px solid var(--sp-line-control);
  background: var(--sp-paper);
  cursor: pointer;
  transition: background-color var(--sp-dur-fast) var(--sp-ease), border-color var(--sp-dur-fast) var(--sp-ease);
}

.sp-check__input:hover {
  border-color: var(--sp-ink);
}

.sp-check__input:checked {
  border-color: var(--sp-ink);
  background: var(--sp-ink);
}

.sp-check__input:checked::after {
  content: "";
  position: absolute;
  inset-inline-start: 7px;
  top: 3px;
  width: 6px;
  height: 11px;
  border: solid var(--sp-paper);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}

.sp-check__input[type="radio"] {
  border-radius: 50%;
}

.sp-check__input[type="radio"]:checked {
  background: var(--sp-paper);
  box-shadow: inset 0 0 0 5px var(--sp-ink);
}

.sp-check__input[type="radio"]:checked::after {
  content: none;
}

.sp-check__input:focus-visible {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-check__input:disabled {
  border-color: var(--sp-hair-strong);
  background: var(--sp-sunk);
  cursor: not-allowed;
}

.sp-check:has(.sp-check__input:disabled) {
  color: var(--sp-muted);
  cursor: not-allowed;
}

.sp-check__hint {
  display: block;
  color: var(--sp-muted);
  font-size: var(--sp-fs-meta);
}

@media (prefers-reduced-motion: reduce) {
  .sp-input,
  .sp-select__control,
  .sp-textarea,
  .sp-check__input {
    transition: none;
  }
}

/* ---- switch ---- */
/* Switch: a square track and square thumb on a real checkbox with role="switch". On fills the track
   with the accent and moves the thumb; the visible On or Off word repeats the state. */

.sp-switch {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-space-3);
  min-height: 44px;
  color: var(--sp-ink);
  cursor: pointer;
}

.sp-switch__input {
  appearance: none;
  position: relative;
  flex: none;
  width: 46px;
  height: 26px;
  margin: 0;
  border: 1px solid var(--sp-ink);
  background: var(--sp-paper);
  cursor: pointer;
  transition: background-color var(--sp-dur) var(--sp-ease);
}

.sp-switch__input::before {
  content: "";
  position: absolute;
  top: 3px;
  inset-inline-start: 3px;
  width: 18px;
  height: 18px;
  background: var(--sp-ink);
  transition: transform var(--sp-dur) var(--sp-ease);
}

.sp-switch__input:checked {
  background: var(--sp-accent);
}

.sp-switch__input:checked::before {
  transform: translateX(20px);
}

[dir="rtl"] .sp-switch__input:checked::before {
  transform: translateX(-20px);
}

.sp-switch__input:focus-visible {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-switch__input:disabled {
  border-color: var(--sp-hair-strong);
  background: var(--sp-sunk);
  cursor: not-allowed;
}

.sp-switch__input:disabled::before {
  background: var(--sp-hair-strong);
}

.sp-switch__state {
  min-width: 2.2em;
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-switch__state::after {
  content: "Off";
}

.sp-switch__input:checked ~ .sp-switch__state::after {
  content: "On";
}

.sp-switch__input:checked ~ .sp-switch__state {
  color: var(--sp-ink);
}

.sp-switch--row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  gap: var(--sp-space-4);
  width: 100%;
  padding-block: var(--sp-space-4);
  border-block-end: 1px solid var(--sp-hair);
}

.sp-switch--row .sp-switch__text {
  order: -1;
}

.sp-switch__title {
  display: block;
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-switch__desc {
  display: block;
  color: var(--sp-muted);
  font-size: var(--sp-fs-meta);
}

@media (prefers-reduced-motion: reduce) {
  .sp-switch__input,
  .sp-switch__input::before {
    transition: none;
  }
}

/* ---- choice-cards ---- */
/* Choice cards: ruled radio options. The chosen one gets an ink frame and the accent bar on its start edge. */

.sp-choices {
  display: grid;
  gap: var(--sp-space-3);
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}

.sp-choices legend {
  margin-block-end: var(--sp-space-3);
  padding: 0;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

@media (min-width: 760px) {
  .sp-choices--3 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    column-gap: var(--sp-gap);
  }
}

.sp-choice {
  position: relative;
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr);
  gap: var(--sp-space-2) var(--sp-space-3);
  align-content: start;
  padding: var(--sp-space-5);
  border: 1px solid var(--sp-hair-strong);
  background: var(--sp-paper);
  cursor: pointer;
  transition: border-color var(--sp-dur-fast) var(--sp-ease);
}

.sp-choice::before {
  content: "";
  position: absolute;
  inset-block: -1px;
  inset-inline-start: -1px;
  width: 5px;
  background: transparent;
}

.sp-choice:hover {
  border-color: var(--sp-ink);
}

.sp-choice:has(.sp-check__input:checked) {
  border-color: var(--sp-ink);
}

.sp-choice:has(.sp-check__input:checked)::before {
  background: var(--sp-mark);
}

.sp-choice:has(.sp-check__input:focus-visible) {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-choice .sp-check__input:focus-visible {
  outline: 0;
}

.sp-choice:has(.sp-check__input:disabled) {
  border-color: var(--sp-hair);
  background: var(--sp-sunk);
  color: var(--sp-muted);
  cursor: not-allowed;
}

.sp-choice__body {
  display: grid;
  gap: var(--sp-space-1);
}

.sp-choice__title {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-choice:has(.sp-check__input:disabled) .sp-choice__title {
  color: var(--sp-muted);
}

.sp-choice__desc {
  color: var(--sp-muted);
  font-size: var(--sp-fs-meta);
  line-height: var(--sp-lh-snug);
}

.sp-choice__meta {
  margin-block-start: var(--sp-space-2);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* ---- search-field ---- */
/* Search: a ruled box with the icon, the input, a clear button and the slash hint, plus a listbox of
   suggestions you can walk with the arrow keys. */

.sp-search {
  position: relative;
  width: 100%;
  max-width: 40rem;
}

.sp-search__box {
  display: flex;
  align-items: center;
  min-height: 52px;
  border: 1px solid var(--sp-ink);
  background: var(--sp-paper);
}

.sp-search__box:focus-within {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-search__icon {
  display: flex;
  padding-inline: 14px 8px;
  color: var(--sp-ink);
}

.sp-search__input {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 50px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--sp-ink);
  font-size: var(--sp-fs-body);
}

.sp-search__input:focus,
.sp-search__input:focus-visible {
  outline: none;
}

.sp-search__input::placeholder {
  color: var(--sp-muted);
  opacity: 1;
}

.sp-search__input::-webkit-search-cancel-button {
  appearance: none;
}

.sp-search__clear {
  display: inline-grid;
  place-items: center;
  width: 44px;
  height: 44px;
  flex: none;
  border: 0;
  background: transparent;
  color: var(--sp-ink);
  cursor: pointer;
}

.sp-search__clear:hover {
  background: var(--sp-sunk);
}

.sp-search.is-empty .sp-search__clear {
  display: none;
}

.sp-search__kbd {
  margin-inline-end: 12px;
}

.sp-search:not(.is-empty) .sp-search__kbd,
.sp-search__box:focus-within .sp-search__kbd {
  display: none;
}

.sp-search__list {
  position: absolute;
  inset-inline: 0;
  top: calc(100% - 1px);
  z-index: 30;
  margin: 0;
  padding: 0;
  list-style: none;
  border: 1px solid var(--sp-ink);
  background: var(--sp-paper);
  box-shadow: var(--sp-shadow-pop);
}

.sp-search__list--static {
  position: static;
  margin-block-start: -1px;
  box-shadow: none;
}

.sp-search__option {
  display: flex;
  justify-content: space-between;
  gap: var(--sp-space-3);
  padding: 12px 14px;
  border-block-start: 1px solid var(--sp-hair);
  color: var(--sp-ink);
  cursor: pointer;
}

.sp-search__option:first-child {
  border-block-start: 0;
}

.sp-search__option:hover,
.sp-search__option[aria-selected="true"] {
  background: var(--sp-sunk);
}

.sp-search__type {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
}

.sp-search--lg .sp-search__box {
  min-height: 64px;
}

.sp-search--lg .sp-search__input {
  font-size: 1.25rem;
}

/* ---- file-drop ---- */
/* File drop: a dashed zone over a real file input, then file rows with progress, done and error. */

.sp-drop {
  display: grid;
  gap: var(--sp-space-4);
}

.sp-drop__zone {
  position: relative;
  display: grid;
  justify-items: center;
  gap: var(--sp-space-2);
  padding: var(--sp-space-8) var(--sp-space-6);
  border: 1px dashed var(--sp-line-control);
  background: var(--sp-paper);
  text-align: center;
  transition: border-color var(--sp-dur-fast) var(--sp-ease), background-color var(--sp-dur-fast) var(--sp-ease);
}

.sp-drop__zone:hover,
.sp-drop__zone.is-over {
  border-color: var(--sp-ink);
  border-style: solid;
}

.sp-drop__zone.is-over {
  background: var(--sp-accent-soft);
}

.sp-drop__zone:focus-within {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-drop__input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

.sp-drop__icon {
  color: var(--sp-ink);
}

.sp-drop__title {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-drop__hint {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-files {
  display: grid;
  margin: 0;
  padding: 0;
  list-style: none;
  border-block-start: 1px solid var(--sp-rule);
}

.sp-file {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr) auto;
  gap: var(--sp-space-1) var(--sp-space-3);
  align-items: center;
  padding-block: var(--sp-space-3);
  border-block-end: 1px solid var(--sp-hair);
}

.sp-file__icon {
  color: var(--sp-ink);
}

.sp-file__name {
  min-width: 0;
  overflow: hidden;
  color: var(--sp-ink);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.sp-file__size,
.sp-file__state {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
}

.sp-file__bar {
  grid-column: 2 / -1;
}

.sp-file.is-done .sp-file__icon,
.sp-file.is-done .sp-file__state {
  color: var(--sp-ok);
}

.sp-file.is-error .sp-file__icon,
.sp-file.is-error .sp-file__state,
.sp-file__error {
  color: var(--sp-danger);
}

.sp-file__error {
  grid-column: 2 / -1;
  font-size: var(--sp-fs-meta);
}

@media (prefers-reduced-motion: reduce) {
  .sp-drop__zone {
    transition: none;
  }
}

/* ---- newsletter ---- */
/* Newsletter: the field and the button joined into one ruled bar, with a hint and the result line. */

.sp-newsletter {
  display: grid;
  gap: var(--sp-space-2);
  width: 100%;
  max-width: 34rem;
}

.sp-newsletter__row {
  display: flex;
}

.sp-newsletter__row .sp-input {
  flex: 1 1 auto;
  min-width: 0;
  border-color: var(--sp-ink);
  border-inline-end: 0;
}

.sp-newsletter__row .sp-btn {
  flex: none;
  min-height: 48px;
}

.sp-newsletter__msg {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--sp-fs-meta);
  font-weight: var(--sp-weight-medium);
}

.sp-newsletter.is-done .sp-newsletter__msg {
  color: var(--sp-ok);
}

.sp-newsletter.is-error .sp-newsletter__msg {
  color: var(--sp-danger);
}

.sp-newsletter.is-error .sp-input {
  border-color: var(--sp-danger);
  box-shadow: inset 0 -2px 0 var(--sp-danger);
}

.sp-newsletter.is-done .sp-newsletter__row {
  display: none;
}

@media (max-width: 419px) {
  .sp-newsletter__row {
    flex-direction: column;
  }

  .sp-newsletter__row .sp-input {
    border-inline-end: 1px solid var(--sp-ink);
    border-block-end: 0;
  }
}

/* ---- tables ---- */
/* Tables: ink rule under the head, hairlines between rows, mono caps headers, mono numerals aligned
   to the end edge. Under 640px a .sp-table--stack table becomes labelled rows. */

.sp-table-wrap {
  width: 100%;
  overflow-x: auto;
}

.sp-table {
  width: 100%;
  border-collapse: collapse;
  color: var(--sp-body);
  font-size: 1rem;
  font-variant-numeric: tabular-nums;
}

.sp-table caption {
  padding-block-end: var(--sp-space-4);
  color: var(--sp-ink);
  font-size: var(--sp-fs-card);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-headline);
  text-align: left;
}

[dir="rtl"] .sp-table caption {
  text-align: right;
}

.sp-table__note {
  display: block;
  margin-block-start: var(--sp-space-1);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-regular);
  letter-spacing: 0;
}

.sp-table thead th {
  padding: 0 var(--sp-space-4) var(--sp-space-3) 0;
  border-block-end: 1px solid var(--sp-rule);
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-align: left;
  text-transform: uppercase;
  vertical-align: bottom;
  white-space: nowrap;
}

.sp-table td,
.sp-table tbody th {
  padding: var(--sp-space-3) var(--sp-space-4) var(--sp-space-3) 0;
  border-block-end: 1px solid var(--sp-hair);
  text-align: left;
  vertical-align: baseline;
}

.sp-table tbody th {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-regular);
}

[dir="rtl"] .sp-table thead th,
[dir="rtl"] .sp-table td,
[dir="rtl"] .sp-table tbody th {
  padding-inline: 0 var(--sp-space-4);
  text-align: right;
}

.sp-table .is-num {
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-meta);
  text-align: right;
  white-space: nowrap;
}

[dir="rtl"] .sp-table .is-num {
  text-align: left;
}

.sp-table__group th {
  padding-block: var(--sp-space-2);
  background: var(--sp-sunk);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
}

.sp-table tbody .sp-table__group th {
  padding-inline-start: var(--sp-space-3);
}

.sp-table__total th,
.sp-table__total td {
  border-block-start: 1px solid var(--sp-rule);
  border-block-end: 0;
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-yes,
.sp-no {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.sp-yes {
  color: var(--sp-ink);
}

.sp-no {
  color: var(--sp-muted);
}

/* Comparison: the featured column carries a mark-colored cap on its header */
.sp-table--compare thead th.is-featured {
  box-shadow: inset 0 4px 0 var(--sp-mark);
  color: var(--sp-ink);
  padding-block-start: var(--sp-space-3);
}

.sp-table--compare td.is-featured {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-medium);
}

.sp-table--compare tbody th {
  width: 34%;
}

@media (max-width: 639px) {
  .sp-table--stack thead {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
  }

  .sp-table--stack,
  .sp-table--stack caption,
  .sp-table--stack tbody,
  .sp-table--stack tr {
    display: block;
  }

  .sp-table--stack .is-num {
    font-family: var(--sp-font-mono);
    text-align: left;
  }

  [dir="rtl"] .sp-table--stack .is-num {
    text-align: right;
  }

  .sp-table--stack tr {
    padding-block: var(--sp-space-3);
    border-block-end: 1px solid var(--sp-hair);
  }

  .sp-table--stack tbody tr:first-child {
    border-block-start: 1px solid var(--sp-rule);
  }

  .sp-table--stack td,
  .sp-table--stack tbody th {
    display: grid;
    grid-template-columns: 9rem minmax(0, 1fr);
    gap: var(--sp-space-3);
    padding: 4px 0;
    border: 0;
    text-align: left;
  }

  [dir="rtl"] .sp-table--stack td,
  [dir="rtl"] .sp-table--stack tbody th {
    text-align: right;
  }

  .sp-table--stack tbody th {
    display: block;
    font-weight: var(--sp-weight-medium);
  }

  .sp-table--stack td::before {
    content: attr(data-label);
    color: var(--sp-muted);
    font-family: var(--sp-font-mono);
    font-size: var(--sp-fs-label);
    font-weight: var(--sp-weight-medium);
    letter-spacing: var(--sp-track-caps);
    text-transform: uppercase;
  }

  .sp-table--stack .sp-table__group th {
    padding: var(--sp-space-2) var(--sp-space-3);
  }

  .sp-table--stack .sp-table__total td,
  .sp-table--stack .sp-table__total th {
    border: 0;
  }
}

/* ---- description-list ---- */
/* Description list: term and value in the sans face, ruled rows or two columns of rows. */

.sp-dl {
  display: grid;
  margin: 0;
  border-block-end: 1px solid var(--sp-hair);
}

.sp-dl__row {
  display: grid;
  grid-template-columns: minmax(7rem, 1fr) minmax(0, 2fr);
  gap: var(--sp-space-4);
  align-items: baseline;
  padding-block: var(--sp-space-3);
  border-block-start: 1px solid var(--sp-hair);
}

.sp-dl__row:first-child {
  border-block-start-color: var(--sp-rule);
}

.sp-dl dt {
  color: var(--sp-muted);
}

.sp-dl dd {
  margin: 0;
  color: var(--sp-ink);
}

@media (min-width: 760px) {
  .sp-dl--cols {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: var(--sp-gap);
  }

  .sp-dl--cols .sp-dl__row:nth-child(2) {
    border-block-start-color: var(--sp-rule);
  }
}

/* ---- pagination ---- */
/* Pagination: previous and next in mono caps at the ends, square page numbers between, the current
   page as an ink block. */

.sp-pager {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  gap: var(--sp-space-3);
  padding-block-start: var(--sp-space-4);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-pager__list {
  display: flex;
  flex-wrap: wrap;
  gap: 2px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-pager__link,
.sp-pager__gap {
  display: inline-grid;
  place-items: center;
  min-width: 44px;
  height: 44px;
  padding-inline: 6px;
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  font-variant-numeric: tabular-nums;
}

.sp-pager__link {
  border: 1px solid transparent;
  color: var(--sp-ink);
  text-decoration: none;
}

.sp-pager__link:hover {
  border-color: var(--sp-ink);
}

.sp-pager__link[aria-current="page"] {
  border-color: var(--sp-ink);
  background: var(--sp-ink);
  color: var(--sp-paper);
}

.sp-pager__gap {
  color: var(--sp-muted);
}

.sp-pager__step {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-space-2);
  min-height: 44px;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  font-weight: var(--sp-weight-medium);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  text-decoration: none;
}

.sp-pager__step:hover {
  text-decoration: underline;
  text-decoration-color: var(--sp-mark);
  text-underline-offset: 0.45em;
}

.sp-pager__step[aria-disabled="true"] {
  color: var(--sp-muted);
  pointer-events: none;
}

@media (max-width: 639px) {
  .sp-pager__list li:not(:has([aria-current])):not(:first-child):not(:last-child) {
    display: none;
  }
}

/* ---- chart ---- */
/* Charts: inline SVG that reads only the viz tokens. Values are labelled on the marks, legends differ
   by shape as well as color, and the numbers are one click away as a table. */

.sp-chart {
  display: grid;
  gap: var(--sp-space-4);
  min-width: 0;
  margin: 0;
}

.sp-chart__head {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--sp-space-1) var(--sp-space-4);
  padding-block-start: var(--sp-space-3);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-chart__title {
  color: var(--sp-ink);
  font-size: 1.0625rem;
  font-weight: var(--sp-weight-medium);
}

.sp-chart__sub {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
}

.sp-chart__plot {
  overflow-x: auto;
}

.sp-chart__plot:focus-visible {
  outline: 2px solid var(--sp-focus);
  outline-offset: 2px;
}

.sp-chart__svg {
  width: 100%;
  min-width: 520px;
  max-width: 720px;
  height: auto;
  overflow: visible;
}

.sp-chart--donut .sp-chart__svg {
  min-width: 0;
  max-width: 320px;
}

.sp-chart__grid {
  stroke: var(--sp-hair);
  stroke-width: 1;
}

.sp-chart__axis {
  stroke: var(--sp-ink);
  stroke-width: 1;
}

.sp-chart__label {
  fill: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: 12px;
}

.sp-chart__value {
  fill: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: 12px;
  font-weight: var(--sp-weight-medium);
}

.sp-chart__center {
  fill: var(--sp-ink);
  font-family: var(--sp-font-sans);
  font-size: 30px;
  font-weight: var(--sp-weight-medium);
  letter-spacing: -0.03em;
}

.sp-chart__fill--1 { fill: var(--sp-viz-1); }
.sp-chart__fill--2 { fill: var(--sp-viz-2); }
.sp-chart__fill--3 { fill: var(--sp-viz-3); }
.sp-chart__fill--4 { fill: var(--sp-viz-4); }
.sp-chart__fill--5 { fill: var(--sp-viz-5); }
.sp-chart__fill--6 { fill: var(--sp-viz-6); }

.sp-chart__line--1,
.sp-chart__line--2,
.sp-chart__line--3 {
  fill: none;
  stroke-width: 2.5;
  stroke-linejoin: round;
}

.sp-chart__line--1 { stroke: var(--sp-viz-1); }
.sp-chart__line--2 { stroke: var(--sp-viz-2); stroke-dasharray: 7 5; }
.sp-chart__line--3 { stroke: var(--sp-viz-3); stroke-dasharray: 2 4; }

.sp-chart__dot--1 { fill: var(--sp-viz-1); }
.sp-chart__dot--2 { fill: var(--sp-viz-2); }

.sp-chart__track {
  fill: none;
  stroke: var(--sp-sunk);
}

.sp-chart__arc--1,
.sp-chart__arc--2,
.sp-chart__arc--3,
.sp-chart__arc--4,
.sp-chart__arc--5,
.sp-chart__arc--6 {
  fill: none;
}

.sp-chart__arc--1 { stroke: var(--sp-viz-1); }
.sp-chart__arc--2 { stroke: var(--sp-viz-2); }
.sp-chart__arc--3 { stroke: var(--sp-viz-3); }
.sp-chart__arc--4 { stroke: var(--sp-viz-4); }
.sp-chart__arc--5 { stroke: var(--sp-viz-5); }
.sp-chart__arc--6 { stroke: var(--sp-viz-6); }

.sp-chart__legend {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-space-2) var(--sp-space-5);
  margin: 0;
  padding: 0;
  list-style: none;
  color: var(--sp-body);
  font-size: var(--sp-fs-meta);
}

.sp-chart__legend li {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-space-2);
}

.sp-chart__legend-value {
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
}

.sp-chart__key {
  display: inline-block;
  width: 12px;
  height: 12px;
  flex: none;
}

.sp-chart__key--1 { background: var(--sp-viz-1); }
.sp-chart__key--2 { background: var(--sp-viz-2); }
.sp-chart__key--3 { background: var(--sp-viz-3); }
.sp-chart__key--4 { background: var(--sp-viz-4); }
.sp-chart__key--5 { background: var(--sp-viz-5); }
.sp-chart__key--6 { background: var(--sp-viz-6); }

/* Line keys: a short stroke with the line's dash pattern, so the legend differs by shape too */
.sp-chart__key--line {
  width: 22px;
  height: 0;
  border-block-start: 3px solid var(--sp-viz-1);
  background: none;
}

.sp-chart__key--line.sp-chart__key--2 {
  border-block-start: 3px dashed var(--sp-viz-2);
}

.sp-chart__key--line.sp-chart__key--3 {
  border-block-start: 3px dotted var(--sp-viz-3);
}

.sp-chart__data summary {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 32px;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
  cursor: pointer;
}

.sp-chart__data[open] summary {
  margin-block-end: var(--sp-space-3);
}

.sp-chart-grid {
  display: grid;
  gap: var(--sp-space-10) var(--sp-gap);
}

@media (min-width: 1100px) {
  .sp-chart-grid--2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* ---- report-chart ---- */
/* Report charts: the report style. One series in the viz-1 accent, the rest in gray, labels written
   on the marks (no legend boxes), a figure number, a title that states the finding, and a source line.
   Ranked bars and the share bar are HTML, so they reflow on phones without shrinking the type. */

.sp-rchart {
  display: grid;
  gap: var(--sp-space-4);
  min-width: 0;
  margin: 0;
}

.sp-rchart__head {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--sp-space-1) var(--sp-space-4);
  align-items: baseline;
  padding-block-start: var(--sp-space-3);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-rchart__fig {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: var(--sp-track-caps);
  text-transform: uppercase;
  white-space: nowrap;
}

.sp-rchart__title {
  color: var(--sp-ink);
  font-size: var(--sp-fs-card);
  font-weight: var(--sp-weight-medium);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

.sp-rchart__source {
  color: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  line-height: var(--sp-lh-mono);
}

/* Ranked bars: label, bar, value; --sp-v on each row, --sp-max on the list */
.sp-rbars {
  display: grid;
  gap: var(--sp-space-3);
  margin: 0;
  padding: 0;
  list-style: none;
  --sp-max: 100;
}

.sp-rbars__row {
  display: grid;
  grid-template-columns: minmax(7.5rem, 2fr) minmax(0, 5fr) 3.5rem;
  gap: var(--sp-space-3);
  align-items: center;
  --sp-v: 0;
}

.sp-rbars__label {
  color: var(--sp-body);
  font-size: 0.9375rem;
  line-height: 1.25;
}

.sp-rbars__track {
  position: relative;
  height: 18px;
}

.sp-rbars__bar {
  position: absolute;
  inset-block: 0;
  inset-inline-start: 0;
  width: calc(var(--sp-v) / var(--sp-max) * 100%);
  background: var(--sp-viz-4);
}

.sp-rbars__value {
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
  text-align: end;
}

.sp-rbars__row.is-hi .sp-rbars__bar {
  background: var(--sp-viz-1);
}

.sp-rbars__row.is-hi .sp-rbars__label,
.sp-rbars__row.is-hi .sp-rbars__value {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-semibold);
}

@media (max-width: 479px) {
  .sp-rbars__row {
    grid-template-columns: minmax(0, 1fr) 3.5rem;
    row-gap: 4px;
  }

  .sp-rbars__track {
    grid-column: 1 / -1;
    grid-row: 2;
  }
}

/* Share bar: one 100% bar split into labelled segments */
.sp-rshare {
  display: flex;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-rshare__seg {
  display: grid;
  gap: var(--sp-space-2);
  flex: 0 0 calc(var(--sp-v) * 1%);
  min-width: 0;
  --sp-v: 0;
}

.sp-rshare__seg::before {
  content: "";
  height: 28px;
  border-inline-end: 2px solid var(--sp-paper);
  background: var(--sp-viz-4);
}

.sp-rshare__seg:nth-child(2)::before { background: var(--sp-viz-2); }
.sp-rshare__seg:nth-child(3)::before { background: var(--sp-viz-3); }
.sp-rshare__seg:nth-child(4)::before { background: var(--sp-viz-5); }
.sp-rshare__seg:nth-child(5)::before { background: var(--sp-viz-6); }

.sp-rshare__seg.is-hi::before {
  background: var(--sp-viz-1);
}

.sp-rshare__label {
  padding-inline-end: var(--sp-space-2);
  color: var(--sp-body);
  font-size: var(--sp-fs-meta);
  line-height: 1.25;
  overflow-wrap: anywhere;
}

.sp-rshare__value {
  display: block;
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-mono);
}

/* Phones: the share bar unstacks into one labelled bar per segment, so no label is squeezed */
@media (max-width: 639px) {
  .sp-rshare {
    flex-direction: column;
    gap: var(--sp-space-3);
  }

  .sp-rshare__seg {
    flex: none;
    gap: var(--sp-space-1);
  }

  .sp-rshare__seg::before {
    width: calc(var(--sp-v) * 1%);
    height: 14px;
    border-inline-end: 0;
  }

  .sp-rshare__label {
    display: flex;
    justify-content: space-between;
    gap: var(--sp-space-3);
    padding-inline-end: 0;
    overflow-wrap: normal;
  }
}

/* SVG slope and line charts in report style: end labels instead of a legend */
.sp-rchart__plot {
  overflow-x: auto;
}

.sp-rchart__svg {
  width: 100%;
  min-width: 460px;
  max-width: 720px;
  height: auto;
  overflow: visible;
}

.sp-rchart__grid {
  stroke: var(--sp-hair);
  stroke-width: 1;
}

.sp-rchart__axis {
  stroke: var(--sp-ink);
  stroke-width: 1;
}

.sp-rchart__line {
  fill: none;
  stroke: var(--sp-viz-4);
  stroke-width: 2;
}

.sp-rchart__line--hi {
  stroke: var(--sp-viz-1);
  stroke-width: 3.5;
}

.sp-rchart__dot {
  fill: var(--sp-viz-4);
}

.sp-rchart__dot--hi {
  fill: var(--sp-viz-1);
}

.sp-rchart__tick {
  fill: var(--sp-muted);
  font-family: var(--sp-font-mono);
  font-size: 12px;
}

.sp-rchart__end {
  fill: var(--sp-body);
  font-family: var(--sp-font-sans);
  font-size: 14px;
}

.sp-rchart__end--hi {
  fill: var(--sp-ink);
  font-weight: var(--sp-weight-semibold);
}

/* ---- alert ---- */
/* Alert: a page-level message on a 2px status rule over its soft tone. Icon, title, sentence,
   optional actions and dismiss. */

.sp-alert {
  display: grid;
  grid-template-columns: 20px minmax(0, 1fr) auto;
  gap: var(--sp-space-1) var(--sp-space-3);
  align-items: start;
  padding: var(--sp-space-4) var(--sp-space-5);
  border-block-start: 2px solid var(--sp-ink);
  background: var(--sp-sunk);
  color: var(--sp-body);
}

.sp-alert__icon {
  margin-block-start: 2px;
  color: var(--sp-ink);
}

.sp-alert__body {
  display: grid;
  gap: var(--sp-space-1);
  font-size: 1rem;
}

.sp-alert__title {
  color: var(--sp-ink);
  font-weight: var(--sp-weight-semibold);
}

.sp-alert__actions {
  margin-block-start: var(--sp-space-2);
}

.sp-alert__close {
  display: inline-grid;
  place-items: center;
  width: 36px;
  height: 36px;
  margin-block-start: -8px;
  margin-inline-end: -10px;
  border: 0;
  background: transparent;
  color: var(--sp-ink);
  cursor: pointer;
}

.sp-alert__close:hover {
  background: color-mix(in srgb, var(--sp-ink) 8%, transparent);
}

.sp-alert--ok {
  border-block-start-color: var(--sp-ok);
  background: var(--sp-ok-soft);
}

.sp-alert--ok .sp-alert__icon {
  color: var(--sp-ok);
}

.sp-alert--warn {
  border-block-start-color: var(--sp-warn);
  background: var(--sp-warn-soft);
}

.sp-alert--warn .sp-alert__icon {
  color: var(--sp-warn);
}

.sp-alert--danger {
  border-block-start-color: var(--sp-danger);
  background: var(--sp-danger-soft);
}

.sp-alert--danger .sp-alert__icon {
  color: var(--sp-danger);
}

@media (pointer: coarse) {
  .sp-alert__close {
    width: 44px;
    height: 44px;
  }
}

/* ---- toast ---- */
/* Toast: an inverted ink block in a polite live region at the bottom end corner. Text, one action,
   close. Leaves after five seconds; reduced motion removes it without the slide. */

.sp-toasts {
  position: fixed;
  inset-block-end: var(--sp-space-6);
  inset-inline-end: var(--sp-space-6);
  z-index: 120;
  display: grid;
  gap: var(--sp-space-2);
  width: min(400px, calc(100vw - 2 * var(--sp-space-4)));
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-toasts--static {
  position: static;
  width: 100%;
  max-width: 400px;
}

.sp-toast {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  align-items: center;
  gap: var(--sp-space-2);
  min-height: 52px;
  padding: 8px 6px 8px 16px;
  background: var(--sp-ink);
  color: var(--sp-paper);
  box-shadow: var(--sp-shadow-pop);
  font-size: 0.9375rem;
  line-height: 1.35;
  animation: sp-toast-in var(--sp-dur) var(--sp-ease) both;
}

.sp-toast.is-leaving {
  opacity: 0;
  transform: translateY(8px);
  transition: opacity var(--sp-dur) var(--sp-ease), transform var(--sp-dur) var(--sp-ease);
}

@keyframes sp-toast-in {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
}

.sp-toast__action {
  min-height: 36px;
  padding: 0 10px;
  border: 0;
  background: transparent;
  color: var(--sp-paper);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  font-weight: var(--sp-weight-medium);
  letter-spacing: 0.06em;
  text-decoration: underline;
  text-decoration-color: var(--sp-accent);
  text-decoration-thickness: 2px;
  text-underline-offset: 0.4em;
  text-transform: uppercase;
  cursor: pointer;
}

.sp-toast__close {
  display: inline-grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border: 0;
  background: transparent;
  color: var(--sp-paper);
  cursor: pointer;
}

.sp-toast__action:focus-visible,
.sp-toast__close:focus-visible {
  outline: 2px solid var(--sp-accent);
  outline-offset: 0;
}

@media (prefers-reduced-motion: reduce) {
  .sp-toast {
    animation: none;
  }

  .sp-toast.is-leaving {
    transition: none;
  }
}

/* ---- dialog ---- */
/* Dialog: native <dialog>. A 1px ink frame, a ruled head with the title and close, the body and
   actions at the end edge. The destructive confirm gets a 4px danger rule on top. */

.sp-dialog {
  width: min(560px, calc(100vw - 2 * var(--sp-space-4)));
  max-height: calc(100dvh - 2 * var(--sp-space-6));
  padding: 0;
  border: 1px solid var(--sp-ink);
  background: var(--sp-paper);
  color: var(--sp-body);
  box-shadow: var(--sp-shadow-pop);
}

.sp-dialog::backdrop {
  background: var(--sp-scrim);
}

.sp-dialog[open] {
  animation: sp-dialog-in var(--sp-dur) var(--sp-ease) both;
}

@keyframes sp-dialog-in {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
}

.sp-dialog__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: var(--sp-space-4);
  padding: var(--sp-space-5) var(--sp-space-6) var(--sp-space-4);
  border-block-end: 1px solid var(--sp-rule);
}

.sp-dialog__title {
  font-size: var(--sp-fs-headline);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

.sp-dialog__close {
  margin-block-start: -6px;
  margin-inline-end: -10px;
}

.sp-dialog__body {
  display: grid;
  gap: var(--sp-space-3);
  padding: var(--sp-space-5) var(--sp-space-6);
}

.sp-dialog__foot {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--sp-space-3);
  padding: 0 var(--sp-space-6) var(--sp-space-6);
}

.sp-dialog--danger {
  border-block-start: 4px solid var(--sp-danger);
}

/* Static: shows a dialog inline on a components page without opening it */
.sp-dialog--static {
  position: static;
  display: block;
  margin: 0;
  box-shadow: none;
  animation: none;
}

@media (prefers-reduced-motion: reduce) {
  .sp-dialog[open] {
    animation: none;
  }
}

/* ---- tooltip ---- */
/* Tooltip: a short mono label in ink above its trigger on hover and focus. Escape hides it. It only
   repeats what the trigger already says. */

.sp-tip {
  position: relative;
  display: inline-flex;
}

.sp-tip__bubble {
  position: absolute;
  bottom: calc(100% + 8px);
  left: 50%;
  z-index: 40;
  width: max-content;
  max-width: 16rem;
  padding: 6px 9px;
  background: var(--sp-ink);
  color: var(--sp-paper);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  line-height: 1.4;
  letter-spacing: 0.02em;
  white-space: normal;
  pointer-events: none;
  opacity: 0;
  visibility: hidden;
  transform: translate(-50%, 4px);
  transition: opacity var(--sp-dur-fast) var(--sp-ease), transform var(--sp-dur-fast) var(--sp-ease), visibility var(--sp-dur-fast);
}

.sp-tip:hover .sp-tip__bubble,
.sp-tip:focus-within .sp-tip__bubble,
.sp-tip.is-open .sp-tip__bubble {
  opacity: 1;
  visibility: visible;
  transform: translate(-50%, 0);
}

.sp-tip.is-dismissed .sp-tip__bubble {
  opacity: 0;
  visibility: hidden;
}

.sp-tip--below .sp-tip__bubble {
  top: calc(100% + 8px);
  bottom: auto;
}

@media (prefers-reduced-motion: reduce) {
  .sp-tip__bubble {
    transition: none;
  }
}

/* ---- empty-state ---- */
/* Empty state: a giant outlined zero, then what's missing, why, and the one thing to do next. */

.sp-empty {
  display: grid;
  gap: var(--sp-space-4) var(--sp-space-8);
  align-items: end;
  padding-block: var(--sp-space-6);
  border-block-start: 1px solid var(--sp-rule);
}

.sp-empty__fig {
  color: transparent;
  font-size: clamp(5rem, 3rem + 8vw, 9rem);
  font-weight: var(--sp-weight-medium);
  line-height: 0.8;
  letter-spacing: -0.06em;
  -webkit-text-stroke: 1.5px var(--sp-line-control);
}

.sp-empty__body {
  display: grid;
  gap: var(--sp-space-2);
  max-width: 32rem;
}

.sp-empty__title {
  font-size: var(--sp-fs-headline);
  line-height: var(--sp-lh-snug);
  letter-spacing: var(--sp-track-headline);
}

.sp-empty__text {
  color: var(--sp-muted);
}

.sp-empty__actions {
  margin-block-start: var(--sp-space-3);
}

@media (min-width: 640px) {
  .sp-empty {
    grid-template-columns: auto minmax(0, 1fr);
  }
}

/* ---- skeleton ---- */
/* Skeleton: sunk blocks in the shape of what's coming, with a slow sweep. Static with reduced motion. */

.sp-skel-group {
  display: grid;
  gap: var(--sp-space-3);
}

.sp-skel {
  position: relative;
  display: block;
  overflow: hidden;
  background: var(--sp-sunk);
}

.sp-skel::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, color-mix(in srgb, var(--sp-paper) 55%, transparent), transparent);
  transform: translateX(-100%);
  animation: sp-skel 1600ms var(--sp-ease-draw) infinite;
}

@keyframes sp-skel {
  to {
    transform: translateX(100%);
  }
}

.sp-skel--line {
  width: 100%;
  height: 14px;
}

.sp-skel--short {
  width: 58%;
}

.sp-skel--title {
  width: 72%;
  height: 34px;
}

.sp-skel--figure {
  width: 44%;
  height: 96px;
}

.sp-skel--rule {
  width: 100%;
  height: 1px;
}

.sp-skel--block {
  width: 100%;
  aspect-ratio: 4 / 3;
}

@media (prefers-reduced-motion: reduce) {
  .sp-skel::after {
    animation: none;
    opacity: 0;
  }
}

/* ---- progress ---- */
/* Progress: square-ended bars in the mark color with a mono label and value, an indeterminate bar,
   a three-square spinner, and numbered steps. */

.sp-progress {
  display: grid;
  gap: var(--sp-space-2);
  --sp-value: 0%;
}

.sp-progress__head {
  display: flex;
  justify-content: space-between;
  gap: var(--sp-space-3);
  color: var(--sp-ink);
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.sp-progress__track {
  position: relative;
  height: 8px;
  overflow: hidden;
  background: var(--sp-sunk);
}

.sp-progress__bar {
  position: absolute;
  inset-block: 0;
  inset-inline-start: 0;
  width: var(--sp-value);
  background: var(--sp-mark);
}

.sp-progress--ok .sp-progress__bar {
  background: var(--sp-ok);
}

.sp-progress--danger .sp-progress__bar {
  background: var(--sp-danger);
}

.sp-progress--indeterminate .sp-progress__bar {
  width: 32%;
  animation: sp-progress-slide 1400ms var(--sp-ease-draw) infinite;
}

@keyframes sp-progress-slide {
  from {
    transform: translateX(-100%);
  }

  to {
    transform: translateX(320%);
  }
}

/* Spinner: three squares that light up in turn */
.sp-spinner {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  flex: none;
}

.sp-spinner > span {
  width: 6px;
  height: 6px;
  background: var(--sp-ink);
  animation: sp-spin-blink 900ms steps(1) infinite;
}

.sp-spinner > span:nth-child(2) {
  animation-delay: 300ms;
}

.sp-spinner > span:nth-child(3) {
  animation-delay: 600ms;
}

@keyframes sp-spin-blink {
  0% {
    opacity: 1;
  }

  33% {
    opacity: 0.2;
  }
}

.sp-steps {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(5.5rem, 1fr));
  gap: var(--sp-space-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

.sp-step {
  display: grid;
  gap: 2px;
  padding-block-start: var(--sp-space-3);
  border-block-start: 3px solid var(--sp-hair-strong);
  color: var(--sp-muted);
}

.sp-step__num {
  font-family: var(--sp-font-mono);
  font-size: var(--sp-fs-label);
  letter-spacing: 0.04em;
}

.sp-step__label {
  font-size: 0.9375rem;
}

.sp-step.is-done {
  border-block-start-color: var(--sp-ink);
  color: var(--sp-ink);
}

.sp-step[aria-current="step"] {
  border-block-start-color: var(--sp-mark);
  color: var(--sp-ink);
}

.sp-step[aria-current="step"] .sp-step__label {
  font-weight: var(--sp-weight-semibold);
}

@media (prefers-reduced-motion: reduce) {
  .sp-progress--indeterminate .sp-progress__bar {
    animation: none;
    width: 100%;
    opacity: 0.4;
  }

  .sp-spinner > span {
    animation: none;
  }
}
