/*
 * KexAI public site. Layer order is the cascade contract: later layers win
 * regardless of specificity. Components consume tokens; raw values belong
 * in the tokens layer.
 */
@layer reset, tokens, base, layout, components, pages, utilities;

/* ================================================================= reset */
@layer reset {
  *,
  *::before,
  *::after {
    box-sizing: border-box;
  }

  body,
  h1,
  h2,
  h3,
  h4,
  p,
  figure,
  blockquote,
  dl,
  dd,
  ol,
  ul {
    margin: 0;
  }

  ol[role="list"],
  ul[role="list"] {
    padding: 0;
    list-style: none;
  }

  img,
  video,
  svg,
  iframe {
    display: block;
    max-width: 100%;
  }

  input,
  button,
  select,
  textarea {
    font: inherit;
    color: inherit;
  }

  /* Progress UI ships `hidden` and is revealed by the script, so visitors
     without JS never see controls that can't work. */
  [hidden] {
    display: none !important;
  }
}

/* ================================================================ tokens */
@layer tokens {
  @font-face {
    font-family: "Inter";
    src: url("/static/fonts/inter.woff2") format("woff2");
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
  }

  @font-face {
    font-family: "Newsreader";
    src: url("/static/fonts/newsreader.woff2") format("woff2");
    font-weight: 200 800;
    font-style: normal;
    font-display: swap;
  }

  @font-face {
    font-family: "Newsreader";
    src: url("/static/fonts/newsreader-italic.woff2") format("woff2");
    font-weight: 200 800;
    font-style: italic;
    font-display: swap;
  }

  /*
   * Colours are light-dark() pairs, resolved by the element's color-scheme:
   * the system preference by default, or the visitor's choice via
   * html[data-theme] (set by static/js/theme.js before first paint).
   * Admin pins itself to light.
   */
  :root {
    color-scheme: light dark;

    --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
    --font-serif: "Newsreader", "Iowan Old Style", "Palatino Linotype", Georgia, serif;
    --font-mono: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;

    --paper: light-dark(#fbfaf8, #0e0e12);
    --surface: light-dark(#ffffff, #16161c);
    --surface-2: light-dark(#f3f2ee, #1f1f27);
    --ink: light-dark(#111118, #ededf2);
    --ink-2: light-dark(#3d3d48, #b9b9c6);
    --ink-3: light-dark(#6e6e7a, #8b8b99);
    --line: light-dark(#ecebe6, #25252e);
    --line-2: light-dark(#dcdad3, #353540);
    /* The video stage and course hero are dark in both themes. */
    --stage: #0b0b10;

    --accent: light-dark(#3d3ad6, #9391ff);
    --accent-hover: light-dark(#2e2bb4, #aeacff);
    --accent-wash: color-mix(in oklab, var(--accent) 11%, var(--surface));
    --accent-line: color-mix(in oklab, var(--accent) 34%, var(--surface));
    --on-accent: light-dark(#ffffff, #0e0e12);

    --done: light-dark(#15803d, #4ade80);
    --done-wash: color-mix(in oklab, var(--done) 13%, var(--surface));
    --danger: light-dark(#b42318, #f87171);
    --danger-wash: color-mix(in oklab, var(--danger) 11%, var(--surface));

    --kind-video: light-dark(#2563eb, #60a5fa);
    --kind-reading: light-dark(#4f46e5, #a5b4fc);
    --kind-pdf: light-dark(#c2410c, #fb923c);
    --kind-presentation: light-dark(#b45309, #fbbf24);
    --kind-document: light-dark(#0f766e, #2dd4bf);
    --kind-file: light-dark(#52525b, #a1a1aa);
    --kind-link: light-dark(#0e7490, #22d3ee);
    --kind-quiz: light-dark(#7c3aed, #c4b5fd);
    --kind-placeholder: light-dark(#71717a, #a1a1aa);

    --radius-sm: 0.5rem;
    --radius: 0.75rem;
    --radius-lg: 1.125rem;
    --radius-xl: 1.5rem;
    --radius-pill: 999px;

    --shadow-ink: light-dark(rgb(17 17 24 / 0.18), rgb(0 0 0 / 0.7));
    --shadow-edge: light-dark(rgb(17 17 24 / 0.05), rgb(0 0 0 / 0.4));
    --shadow-sm: 0 1px 2px var(--shadow-edge);
    --shadow: 0 1px 2px var(--shadow-edge), 0 10px 30px -14px var(--shadow-ink);
    --shadow-lg: 0 2px 6px var(--shadow-edge), 0 30px 60px -24px var(--shadow-ink);

    --space-1: 0.25rem;
    --space-2: 0.5rem;
    --space-3: 0.75rem;
    --space-4: 1rem;
    --space-5: 1.5rem;
    --space-6: 2rem;
    --space-7: 3rem;
    --space-8: 4.5rem;
    --space-9: 6rem;

    --text-xs: 0.75rem;
    --text-sm: 0.875rem;
    --text-base: 1rem;
    --text-lg: 1.125rem;
    --text-xl: 1.375rem;
    --text-2xl: clamp(1.5rem, 1.25rem + 1vw, 1.875rem);
    --text-3xl: clamp(2rem, 1.4rem + 2.4vw, 3rem);
    --text-display: clamp(2.6rem, 1.5rem + 4.2vw, 4.75rem);

    --header-height: 4rem;
    --page-width: 76rem;
    --reading-width: 42rem;
    --focus-ring: 0 0 0 2px var(--surface), 0 0 0 4px var(--accent);
    --ease: cubic-bezier(0.22, 0.8, 0.24, 1);

    /* Aliases used by admin.css. */
    --kx-text: var(--ink);
    --kx-bg: var(--paper);
    --kx-accent: var(--accent);
    --kx-space: var(--space-4);
    --kx-radius: var(--radius-sm);
    --kx-font-body: var(--font-sans);
    --surface-sunken: var(--surface-2);
    --ink-soft: var(--ink-2);
    --ink-muted: var(--ink-3);
  }

  :root[data-theme="light"],
  body.admin {
    color-scheme: light;
  }

  :root[data-theme="dark"] {
    color-scheme: dark;
  }
}

/* ================================================================== base */
@layer base {
  html {
    -webkit-text-size-adjust: 100%;
    scroll-padding-top: calc(var(--header-height) + var(--space-5));
  }

  body {
    min-height: 100dvh;
    font-family: var(--font-sans);
    font-size: var(--text-base);
    line-height: 1.6;
    color: var(--ink);
    background: var(--paper);
    -webkit-font-smoothing: antialiased;
    font-feature-settings: "cv11", "ss03";
  }

  h1,
  h2,
  h3,
  h4 {
    line-height: 1.15;
    letter-spacing: -0.022em;
    font-weight: 700;
    text-wrap: balance;
  }

  p,
  li {
    text-wrap: pretty;
  }

  a {
    color: var(--accent);
    text-underline-offset: 0.2em;
    text-decoration-thickness: 1px;
  }

  a:hover {
    color: var(--accent-hover);
  }

  :focus-visible {
    outline: none;
    box-shadow: var(--focus-ring);
    border-radius: var(--radius-sm);
  }

  ::selection {
    background: color-mix(in oklab, var(--accent) 22%, transparent);
  }

  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      transition-duration: 0.01ms !important;
      animation-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

/* ================================================================ layout */
@layer layout {
  .container {
    width: min(100% - 2.5rem, var(--page-width));
    margin-inline: auto;
  }

  .skip-link {
    position: absolute;
    z-index: 100;
    inset-inline-start: var(--space-4);
    inset-block-start: -100%;
    padding: var(--space-2) var(--space-4);
    background: var(--surface);
    border-radius: var(--radius-sm);
    box-shadow: var(--shadow);
  }

  .skip-link:focus {
    inset-block-start: var(--space-3);
  }

  main:focus {
    outline: none;
  }

  .site-header {
    position: sticky;
    top: 0;
    z-index: 40;
    height: var(--header-height);
    background: color-mix(in oklab, var(--paper) 84%, transparent);
    backdrop-filter: saturate(1.5) blur(16px);
    border-block-end: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
  }

  .site-header-inner {
    display: flex;
    align-items: center;
    gap: var(--space-5);
    height: 100%;
  }

  .site-nav {
    display: flex;
    gap: var(--space-5);
    margin-inline-start: auto;
    font-size: var(--text-sm);
    font-weight: 500;
  }

  .site-nav a {
    color: var(--ink-3);
    text-decoration: none;
  }

  .site-nav a:hover,
  .site-nav a[aria-current="page"] {
    color: var(--ink);
  }

  .site-footer {
    margin-block-start: var(--space-9);
    padding-block: var(--space-6);
    border-block-start: 1px solid var(--line);
    color: var(--ink-3);
    font-size: var(--text-sm);
  }

  .site-footer-inner {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-4);
  }

  .site-footer .brand {
    font-size: var(--text-base);
  }
}

/* ============================================================ components */
@layer components {
  .icon {
    width: 1.2em;
    height: 1.2em;
    flex: none;
  }

  .brand {
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
    color: var(--ink);
    font-weight: 750;
    font-size: 1.0625rem;
    letter-spacing: -0.03em;
    text-decoration: none;
  }

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

  .brand-mark {
    display: grid;
    place-items: center;
    width: 1.85rem;
    height: 1.85rem;
    border-radius: 0.55rem;
    background: var(--ink);
    color: var(--paper);
    font-size: 0.95rem;
    font-weight: 800;
  }

  .eyebrow {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    color: var(--ink-3);
    font-size: var(--text-xs);
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
  }

  .display {
    font-size: var(--text-display);
    font-weight: 750;
    letter-spacing: -0.045em;
    line-height: 1;
  }

  .lead {
    color: var(--ink-2);
    font-size: clamp(1.0625rem, 1rem + 0.35vw, 1.25rem);
    line-height: 1.55;
  }

  /* ---------- Buttons */
  .btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2);
    min-height: 2.625rem;
    padding: 0 var(--space-5);
    border: 1px solid transparent;
    border-radius: var(--radius-pill);
    background: none;
    font-size: var(--text-sm);
    font-weight: 600;
    line-height: 1;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
    transition:
      background-color 0.18s var(--ease),
      border-color 0.18s var(--ease),
      color 0.18s var(--ease),
      transform 0.18s var(--ease);
  }

  .btn:active {
    transform: scale(0.98);
  }

  .btn .icon {
    width: 1.1em;
    height: 1.1em;
  }

  .btn-primary {
    background: var(--accent);
    color: var(--on-accent);
  }

  .btn-primary:hover {
    background: var(--accent-hover);
    color: var(--on-accent);
  }

  .btn-primary .icon:last-child {
    transition: transform 0.2s var(--ease);
  }

  .btn-primary:hover .icon:last-child {
    transform: translateX(3px);
  }

  .btn-ghost {
    color: var(--ink-2);
  }

  .btn-ghost:hover {
    background: var(--surface-2);
    color: var(--ink);
  }

  .btn-secondary {
    border-color: var(--line-2);
    background: var(--surface);
    color: var(--ink);
  }

  .btn-secondary:hover {
    border-color: var(--ink-3);
    color: var(--ink);
  }

  .btn-lg {
    min-height: 3.25rem;
    padding: 0 var(--space-6);
    font-size: var(--text-base);
  }

  .btn-sm {
    min-height: 2.125rem;
    padding: 0 var(--space-3);
    font-size: var(--text-xs);
  }

  .icon-btn {
    display: inline-grid;
    place-items: center;
    width: 2.5rem;
    height: 2.5rem;
    border: 0;
    border-radius: var(--radius);
    background: none;
    color: var(--ink-2);
    cursor: pointer;
    transition: background-color 0.15s var(--ease);
  }

  .icon-btn:hover {
    background: var(--surface-2);
    color: var(--ink);
  }

  /* ---------- Chips */
  .chip {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.7rem;
    border-radius: var(--radius-pill);
    font-size: var(--text-xs);
    font-weight: 600;
    line-height: 1.2;
  }

  .chip .icon {
    width: 0.95rem;
    height: 0.95rem;
  }

  .chip-glass {
    background: rgb(255 255 255 / 0.88);
    color: #111118;
    backdrop-filter: blur(8px);
  }

  .chip-progress {
    background: var(--accent-wash);
    color: var(--accent);
  }

  .chip-progress.is-complete {
    background: var(--done-wash);
    color: var(--done);
  }

  /* ---------- Kinds: each learner-facing kind has a hue. */
  [data-kind] {
    --kind: var(--kind-file);
  }
  [data-kind="video"] {
    --kind: var(--kind-video);
  }
  [data-kind="reading"] {
    --kind: var(--kind-reading);
  }
  [data-kind="pdf"] {
    --kind: var(--kind-pdf);
  }
  [data-kind="presentation"] {
    --kind: var(--kind-presentation);
  }
  [data-kind="document"] {
    --kind: var(--kind-document);
  }
  [data-kind="link"] {
    --kind: var(--kind-link);
  }
  [data-kind="quiz"] {
    --kind: var(--kind-quiz);
  }
  [data-kind="placeholder"] {
    --kind: var(--kind-placeholder);
  }

  .kind-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    justify-self: start;
    padding: 0.35rem 0.75rem;
    border-radius: var(--radius-pill);
    background: color-mix(in oklab, var(--kind) 10%, var(--surface));
    color: color-mix(in oklab, var(--kind) 85%, var(--ink));
    font-size: var(--text-sm);
    font-weight: 600;
  }

  .kind-chip .icon {
    width: 1rem;
    height: 1rem;
  }

  /* ---------- Course art: uploaded image or generated gradient + monogram. */
  .art {
    --h1: 265;
    --h2: 200;
    position: relative;
    overflow: hidden;
    container-type: inline-size;
    background:
      radial-gradient(120% 90% at 100% 0%, oklch(0.8 0.12 var(--h2) / 0.95), transparent 55%),
      radial-gradient(90% 90% at 0% 100%, oklch(0.5 0.2 var(--h1) / 0.95), transparent 60%),
      linear-gradient(135deg, oklch(0.38 0.15 var(--h1)), oklch(0.62 0.14 var(--h2)));
  }

  .art::after {
    content: "";
    position: absolute;
    inset: 0;
    background-image:
      linear-gradient(rgb(255 255 255 / 0.08) 1px, transparent 1px),
      linear-gradient(90deg, rgb(255 255 255 / 0.08) 1px, transparent 1px);
    background-size: 32px 32px;
    mask-image: linear-gradient(135deg, transparent 25%, black 95%);
  }

  .art:has(img)::after {
    display: none;
  }

  .art img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  .art-mark {
    position: absolute;
    z-index: 1;
    inset-block-end: -0.14em;
    inset-inline-end: 0.06em;
    color: rgb(255 255 255 / 0.2);
    font-size: 42cqi;
    font-weight: 800;
    letter-spacing: -0.07em;
    line-height: 1;
    user-select: none;
  }

  .hue-0 {
    --h1: 268;
    --h2: 205;
  }
  .hue-1 {
    --h1: 295;
    --h2: 350;
  }
  .hue-2 {
    --h1: 215;
    --h2: 175;
  }
  .hue-3 {
    --h1: 28;
    --h2: 60;
  }
  .hue-4 {
    --h1: 158;
    --h2: 195;
  }
  .hue-5 {
    --h1: 335;
    --h2: 25;
  }
  .hue-6 {
    --h1: 240;
    --h2: 295;
  }
  .hue-7 {
    --h1: 190;
    --h2: 245;
  }

  /* ---------- Progress */
  .progress {
    display: grid;
    gap: var(--space-2);
  }

  .progress-track {
    height: 0.375rem;
    overflow: hidden;
    border-radius: var(--radius-pill);
    background: var(--surface-2);
  }

  .progress-bar {
    width: var(--value, 0%);
    height: 100%;
    border-radius: inherit;
    background: linear-gradient(
      90deg,
      var(--accent),
      color-mix(in oklab, var(--accent) 40%, #38bdf8)
    );
  }

  /* Animate only changes after the first paint, not the fill on page load. */
  .kx-ready .progress-bar {
    transition: width 0.6s var(--ease);
  }

  .progress-label {
    color: var(--ink-3);
    font-size: var(--text-sm);
  }

  .status {
    display: grid;
    place-items: center;
    flex: none;
    width: 1.375rem;
    height: 1.375rem;
    border: 1.5px solid var(--line-2);
    border-radius: 50%;
    color: transparent;
    transition:
      background-color 0.2s var(--ease),
      border-color 0.2s var(--ease);
  }

  .status .icon {
    width: 0.8rem;
    height: 0.8rem;
  }

  .is-done .status,
  [aria-pressed="true"] .status {
    border-color: var(--done);
    background: var(--done);
    color: var(--on-accent);
  }

  /* ---------- Curriculum: chapters with numbered lessons. */
  .chapters {
    display: grid;
  }

  .chapter {
    display: grid;
    gap: var(--space-4);
    padding-block: var(--space-6);
    border-block-start: 1px solid var(--line);
  }

  .chapter:first-child {
    border-block-start: 0;
    padding-block-start: var(--space-4);
  }

  .chapter-head {
    display: grid;
    grid-template-columns: 3.25rem minmax(0, 1fr);
    gap: var(--space-4);
    align-items: start;
  }

  .chapter-no {
    color: var(--line-2);
    font-size: 2.25rem;
    font-weight: 750;
    letter-spacing: -0.05em;
    line-height: 1;
    font-variant-numeric: tabular-nums;
    transition: color 0.3s var(--ease);
  }

  .chapter.is-done .chapter-no {
    color: var(--done);
  }

  .chapter-text {
    display: grid;
    gap: var(--space-1);
  }

  .chapter-label {
    color: var(--ink-3);
    font-size: var(--text-xs);
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }

  .chapter h3 {
    font-size: var(--text-xl);
  }

  .chapter-summary {
    margin-block-start: var(--space-1);
    color: var(--ink-2);
  }

  .lessons {
    display: grid;
    gap: 2px;
    margin-inline-start: calc(3.25rem + var(--space-4) - var(--space-4));
  }

  .lesson-link {
    display: grid;
    grid-template-columns: 2.5rem minmax(0, 1fr) auto;
    gap: var(--space-3);
    align-items: center;
    padding: var(--space-3) var(--space-4);
    border-radius: var(--radius);
    color: var(--ink);
    text-decoration: none;
    transition:
      background-color 0.15s var(--ease),
      box-shadow 0.15s var(--ease);
  }

  .lesson-link:hover {
    background: var(--surface);
    box-shadow: var(--shadow);
    color: var(--ink);
  }

  .lesson-link[aria-current="page"] {
    background: var(--accent-wash);
    box-shadow: none;
  }

  .lesson-link[aria-current="page"] .lesson-title {
    color: var(--accent);
  }

  .lesson-index {
    color: var(--ink-3);
    font-size: var(--text-sm);
    font-variant-numeric: tabular-nums;
  }

  .lesson-text {
    display: grid;
    gap: 0.1rem;
    min-width: 0;
  }

  .lesson-title {
    font-weight: 550;
    line-height: 1.35;
  }

  .lesson-meta {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    color: var(--ink-3);
    font-size: var(--text-sm);
  }

  .lesson-meta .icon {
    width: 0.95rem;
    height: 0.95rem;
    color: var(--kind);
  }

  .chapters.is-compact .chapter {
    gap: var(--space-2);
    padding-block: var(--space-4);
  }

  .chapters.is-compact .chapter-head {
    grid-template-columns: 1fr;
    padding-inline: var(--space-4);
  }

  .chapters.is-compact .chapter-no {
    display: none;
  }

  .chapters.is-compact .chapter h3 {
    font-size: var(--text-base);
  }

  .chapters.is-compact .lessons {
    margin-inline-start: 0;
  }

  .chapters.is-compact .lesson-link {
    grid-template-columns: 2.25rem minmax(0, 1fr) auto;
    padding-block: var(--space-2);
  }

  .chapters.is-compact .lesson-title {
    font-size: var(--text-sm);
  }

  .chapters.is-compact .lesson-meta {
    font-size: var(--text-xs);
  }

  /* ---------- Prose: rendered course HTML, set like a good article. */
  /* min-width: 0 lets long <pre> and tables scroll inside themselves
     instead of widening the page. */
  .prose {
    min-width: 0;
    font-family: var(--font-serif);
    font-size: clamp(1.125rem, 1.05rem + 0.3vw, 1.25rem);
    line-height: 1.7;
    color: var(--ink);
    font-optical-sizing: auto;
  }

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

  .prose > p:first-child {
    color: var(--ink-2);
    font-size: 1.15em;
    line-height: 1.6;
  }

  .prose h1,
  .prose h2,
  .prose h3,
  .prose h4 {
    margin-block-start: 2em;
    font-family: var(--font-sans);
    letter-spacing: -0.02em;
  }

  .prose h1,
  .prose h2 {
    font-size: 1.35em;
  }

  .prose h3 {
    font-size: 1.12em;
  }

  .prose h4 {
    font-size: 1em;
  }

  .prose :is(h1, h2, h3, h4) + * {
    margin-block-start: 0.6em;
  }

  .prose a {
    color: inherit;
    text-decoration-color: var(--accent-line);
    text-decoration-thickness: 2px;
  }

  .prose a:hover {
    color: var(--accent);
    text-decoration-color: currentColor;
  }

  .prose strong {
    font-weight: 650;
  }

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

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

  .prose li::marker {
    color: var(--ink-3);
  }

  .prose blockquote {
    padding-inline-start: 1.1em;
    border-inline-start: 3px solid var(--accent);
    color: var(--ink-2);
    font-style: italic;
  }

  .prose code {
    padding: 0.12em 0.36em;
    border-radius: 0.35rem;
    background: var(--surface-2);
    font-family: var(--font-mono);
    font-size: 0.82em;
  }

  .prose pre {
    overflow-x: auto;
    padding: 1.1em 1.25em;
    border-radius: var(--radius-lg);
    background: var(--stage);
    color: #ececf1;
    font-size: 0.8em;
    line-height: 1.65;
  }

  .prose pre code {
    padding: 0;
    background: none;
    font-size: 1em;
  }

  .prose img,
  .prose video {
    height: auto;
    border-radius: var(--radius-lg);
  }

  .prose figcaption {
    margin-block-start: 0.5em;
    color: var(--ink-3);
    font-family: var(--font-sans);
    font-size: var(--text-sm);
  }

  .prose iframe {
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 9;
    border: 0;
    border-radius: var(--radius-lg);
  }

  .prose table {
    display: block;
    overflow-x: auto;
    width: 100%;
    border-collapse: collapse;
    font-family: var(--font-sans);
    font-size: var(--text-sm);
    line-height: 1.5;
  }

  .prose th,
  .prose td {
    padding: 0.7em 0.9em;
    border-block-end: 1px solid var(--line);
    text-align: start;
  }

  .prose thead th {
    border-block-end-color: var(--line-2);
    color: var(--ink-3);
    font-size: var(--text-xs);
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
  }

  .prose hr {
    border: 0;
    border-block-start: 1px solid var(--line);
  }

  .empty-state {
    padding: var(--space-7) var(--space-5);
    border: 1px dashed var(--line-2);
    border-radius: var(--radius-xl);
    color: var(--ink-3);
    text-align: center;
  }

  .notice {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-5);
    border-radius: var(--radius-lg);
    background: var(--surface-2);
    color: var(--ink-2);
  }

  .input {
    width: 100%;
    min-height: 3rem;
    padding: 0 var(--space-4);
    border: 1px solid var(--line-2);
    border-radius: var(--radius);
    background: var(--surface);
    transition: border-color 0.15s var(--ease);
  }

  .input:hover {
    border-color: var(--ink-3);
  }

  .input:focus-visible {
    border-color: var(--accent);
    border-radius: var(--radius);
  }

  .input[aria-invalid="true"] {
    border-color: var(--danger);
  }

  .form-error {
    padding: var(--space-3) var(--space-4);
    border-radius: var(--radius);
    background: var(--danger-wash);
    color: var(--danger);
    font-size: var(--text-sm);
    font-weight: 600;
  }

  .back-link {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    color: var(--ink-3);
    font-size: var(--text-sm);
    font-weight: 500;
    text-decoration: none;
  }

  .back-link:hover {
    color: var(--ink);
  }
}

/* ================================================================= pages */
@layer pages {
  /* ---------- Catalog */
  .catalog-hero {
    padding-block: var(--space-9) var(--space-7);
  }

  .catalog-hero .container {
    display: grid;
    gap: var(--space-4);
    justify-items: start;
  }

  .catalog-hero .display {
    max-width: 14ch;
  }

  .catalog-hero .lead {
    max-width: 38rem;
  }

  .course-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 21rem), 1fr));
    gap: var(--space-7) var(--space-6);
  }

  .course-card {
    position: relative;
    display: grid;
    gap: var(--space-4);
    align-content: start;
  }

  .course-card-art {
    position: relative;
  }

  .card-art {
    aspect-ratio: 16 / 10;
    border-radius: var(--radius-xl);
    box-shadow: var(--shadow);
    transition:
      transform 0.35s var(--ease),
      box-shadow 0.35s var(--ease);
  }

  .course-card:hover .card-art {
    transform: translateY(-4px);
    box-shadow: var(--shadow-lg);
  }

  .course-card-art .chip {
    position: absolute;
    z-index: 2;
    inset-block-start: var(--space-4);
    inset-inline-start: var(--space-4);
  }

  .course-card-body {
    display: grid;
    gap: var(--space-2);
  }

  .course-card-meta {
    color: var(--ink-3);
    font-size: var(--text-sm);
  }

  .course-card h2 {
    font-size: var(--text-xl);
    letter-spacing: -0.028em;
  }

  .course-card h2 a {
    color: var(--ink);
    text-decoration: none;
  }

  /* The whole card is the link target. */
  .course-card h2 a::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 3;
    border-radius: var(--radius-xl);
  }

  .course-card h2 a:focus-visible {
    box-shadow: none;
  }

  .course-card h2 a:focus-visible::after {
    box-shadow: var(--focus-ring);
  }

  .course-card p {
    display: -webkit-box;
    overflow: hidden;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    color: var(--ink-2);
  }

  .course-card-foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    margin-block-start: var(--space-2);
  }

  .course-card-cta {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    color: var(--accent);
    font-size: var(--text-sm);
    font-weight: 600;
  }

  .course-card-cta .icon {
    width: 1rem;
    height: 1rem;
    transition: transform 0.25s var(--ease);
  }

  .course-card:hover .course-card-cta .icon {
    transform: translateX(4px);
  }

  /* ---------- Course overview */
  .course-hero {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    background: var(--stage);
    color: #fff;
  }

  .hero-art {
    position: absolute;
    inset: 0;
    z-index: -2;
  }

  .hero-art .art-mark {
    font-size: min(34cqi, 26rem);
    color: rgb(255 255 255 / 0.12);
  }

  .course-hero::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background:
      linear-gradient(90deg, rgb(8 8 12 / 0.86) 0%, rgb(8 8 12 / 0.62) 50%, rgb(8 8 12 / 0.12) 100%),
      linear-gradient(0deg, rgb(8 8 12 / 0.5), transparent 45%);
  }

  .course-hero-inner {
    display: grid;
    gap: var(--space-5);
    justify-items: start;
    padding-block: var(--space-8) var(--space-8);
  }

  @media (min-width: 60rem) {
    .course-hero-inner {
      padding-block: var(--space-9) var(--space-9);
    }
  }

  .course-hero-inner > * {
    max-width: 46rem;
  }

  .course-hero .back-link,
  .course-hero .eyebrow {
    color: rgb(255 255 255 / 0.7);
  }

  .course-hero .back-link:hover {
    color: #fff;
  }

  .course-hero .lead {
    color: rgb(255 255 255 / 0.82);
  }

  .course-hero .lead > * + * {
    margin-block-start: 0.6em;
  }

  .course-hero .lead a {
    color: #fff;
  }

  .hero-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-5) var(--space-6);
    margin-block-start: var(--space-3);
  }

  .course-hero .btn-primary {
    background: #fff;
    color: #111118;
  }

  .course-hero .btn-primary:hover {
    background: rgb(255 255 255 / 0.88);
    color: #111118;
  }

  .progress-on-dark {
    min-width: 14rem;
  }

  .progress-on-dark .progress-track {
    background: rgb(255 255 255 / 0.18);
  }

  .progress-on-dark .progress-bar {
    background: #fff;
  }

  .progress-on-dark .progress-label {
    color: rgb(255 255 255 / 0.75);
  }

  .course-layout {
    display: grid;
    gap: var(--space-7);
    padding-block: var(--space-8) 0;
  }

  @media (min-width: 64rem) {
    .course-layout {
      grid-template-columns: minmax(0, 1fr) 20rem;
      gap: var(--space-8);
    }
  }

  .section-title {
    margin-block-end: var(--space-4);
    font-size: var(--text-2xl);
  }

  .course-aside {
    order: -1;
  }

  @media (min-width: 64rem) {
    .course-aside {
      order: 0;
    }

    .aside-card {
      position: sticky;
      top: calc(var(--header-height) + var(--space-5));
    }
  }

  .aside-card {
    display: grid;
    gap: var(--space-5);
    padding: var(--space-5);
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
    background: var(--surface);
    box-shadow: var(--shadow-sm);
  }

  .aside-title {
    font-size: var(--text-base);
  }

  .includes {
    display: grid;
    gap: var(--space-3);
    color: var(--ink-2);
    font-size: var(--text-sm);
  }

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

  .includes .icon {
    color: var(--ink-3);
  }

  .aside-card .btn {
    width: 100%;
  }

  /* ---------- Lesson player */
  .page-lesson {
    background: var(--surface);
  }

  .player-bar {
    position: sticky;
    top: 0;
    z-index: 40;
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto auto auto;
    gap: var(--space-3);
    align-items: center;
    height: var(--header-height);
    padding-inline: var(--space-3) var(--space-4);
    background: color-mix(in oklab, var(--surface) 86%, transparent);
    backdrop-filter: saturate(1.5) blur(16px);
    border-block-end: 1px solid var(--line);
  }

  .player-bar-title {
    display: grid;
    min-width: 0;
    line-height: 1.3;
  }

  .player-bar-title a {
    overflow: hidden;
    color: var(--ink);
    font-size: var(--text-sm);
    font-weight: 650;
    text-decoration: none;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .player-bar-title span {
    overflow: hidden;
    color: var(--ink-3);
    font-size: var(--text-xs);
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .player-bar-count {
    color: var(--ink-3);
    font-size: var(--text-sm);
    font-variant-numeric: tabular-nums;
  }

  .player-bar-meter {
    position: absolute;
    inset-inline: 0;
    inset-block-end: -1px;
    height: 2px;
  }

  .player-bar-meter .progress-bar {
    border-radius: 0;
  }

  @media (max-width: 40rem) {
    .player-bar-count,
    .player-bar .btn-ghost span {
      display: none;
    }

    .player-bar .btn-ghost {
      padding-inline: var(--space-3);
    }
  }

  /* Video lessons: a dark stage for the player, like a cinema. */
  .is-video .player-bar {
    background: color-mix(in oklab, var(--stage) 92%, transparent);
    border-block-end-color: rgb(255 255 255 / 0.08);
    color-scheme: dark;
  }

  .is-video .player-bar-title a,
  .is-video .player-bar .icon-btn,
  .is-video .player-bar .btn-ghost {
    color: #f4f4f6;
  }

  .is-video .player-bar-title span,
  .is-video .player-bar-count {
    color: rgb(255 255 255 / 0.55);
  }

  .is-video .player-bar .icon-btn:hover,
  .is-video .player-bar .btn-ghost:hover {
    background: rgb(255 255 255 / 0.1);
  }

  .stage {
    padding: clamp(var(--space-4), 3vw, var(--space-7)) var(--space-4)
      clamp(var(--space-5), 4vw, var(--space-8));
    background: var(--stage);
  }

  .stage-inner {
    width: min(100%, 76rem, (100dvh - var(--header-height) - 8rem) * 16 / 9);
    margin-inline: auto;
  }

  .video {
    overflow: hidden;
    aspect-ratio: 16 / 9;
    border-radius: var(--radius-lg);
    background: #000;
    box-shadow: 0 40px 80px -30px rgb(0 0 0 / 0.8);
  }

  .video iframe,
  .video video {
    width: 100%;
    height: 100%;
    border: 0;
  }

  .lesson {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-6);
    width: min(100% - 2.5rem, var(--reading-width));
    margin-inline: auto;
    padding-block: clamp(var(--space-6), 5vw, var(--space-8)) 9rem;
  }

  .lesson.is-wide {
    width: min(100% - 2.5rem, 64rem);
  }

  .lesson.is-wide .prose {
    max-width: var(--reading-width);
  }

  .lesson-head {
    display: grid;
    gap: var(--space-4);
  }

  .lesson-head h1 {
    font-size: var(--text-3xl);
    font-weight: 750;
    letter-spacing: -0.035em;
    line-height: 1.08;
  }

  .document-viewer {
    overflow: hidden;
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
    background: var(--surface-2);
    box-shadow: var(--shadow);
  }

  .document-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-2) var(--space-4);
    padding: var(--space-2) var(--space-2) var(--space-2) var(--space-4);
    border-block-end: 1px solid var(--line);
    background: var(--surface);
  }

  .document-name {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    min-width: 0;
    font-size: var(--text-sm);
    font-weight: 600;
    overflow-wrap: anywhere;
  }

  .document-name .icon {
    color: var(--kind-pdf);
  }

  .document-name small {
    color: var(--ink-3);
    font-weight: 400;
  }

  .document-actions {
    display: flex;
    gap: var(--space-1);
  }

  .document-viewer iframe {
    width: 100%;
    height: min(80dvh, 64rem);
    border: 0;
  }

  .resource {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-4) var(--space-5);
    padding: var(--space-5);
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
    background: var(--paper);
  }

  .resource-icon {
    display: grid;
    place-items: center;
    width: 3.5rem;
    height: 3.5rem;
    border-radius: var(--radius-lg);
    background: color-mix(in oklab, var(--kind) 11%, var(--surface));
    color: var(--kind);
  }

  .resource-icon .icon {
    width: 1.6rem;
    height: 1.6rem;
  }

  .resource-text {
    display: grid;
    flex: 1 1 14rem;
    min-width: 0;
  }

  .resource-text strong {
    font-weight: 650;
    overflow-wrap: anywhere;
  }

  .resource-text span {
    color: var(--ink-3);
    font-size: var(--text-sm);
    overflow-wrap: anywhere;
  }

  /* Floating navigation dock. */
  .dock {
    position: fixed;
    z-index: 30;
    inset-inline: 0;
    inset-block-end: max(var(--space-4), env(safe-area-inset-bottom));
    display: flex;
    justify-content: center;
    padding-inline: var(--space-3);
    pointer-events: none;
  }

  .dock-inner {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    gap: var(--space-2);
    align-items: center;
    width: min(100%, 48rem);
    padding: var(--space-2);
    border: 1px solid var(--line);
    border-radius: 1.25rem;
    background: color-mix(in oklab, var(--surface) 88%, transparent);
    backdrop-filter: saturate(1.6) blur(18px);
    box-shadow: var(--shadow-lg);
    pointer-events: auto;
  }

  .dock-link {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    min-width: 0;
    min-height: 3.25rem;
    padding: var(--space-2) var(--space-4);
    border-radius: var(--radius-lg);
    color: var(--ink);
    text-decoration: none;
    transition: background-color 0.15s var(--ease);
  }

  .dock-link:hover {
    background: var(--surface-2);
    color: var(--ink);
  }

  .dock-label {
    display: grid;
    min-width: 0;
    line-height: 1.25;
  }

  .dock-label small {
    color: var(--ink-3);
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }

  .dock-label span {
    overflow: hidden;
    font-size: var(--text-sm);
    font-weight: 600;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .dock-next {
    justify-content: flex-end;
    background: var(--ink);
    color: var(--paper);
    text-align: end;
  }

  .dock-next:hover {
    background: color-mix(in oklab, var(--ink) 85%, var(--accent));
    color: var(--paper);
  }

  .dock-next .dock-label small {
    color: color-mix(in oklab, var(--paper) 62%, transparent);
  }

  .done-toggle {
    min-height: 3.25rem;
    border-radius: var(--radius-lg);
  }

  .done-toggle[aria-pressed="true"] {
    color: var(--done);
  }

  @media (max-width: 40rem) {
    .dock-link:not(.dock-next) .dock-label,
    .done-toggle [data-done-label] {
      display: none;
    }

    .dock-inner {
      grid-template-columns: auto auto minmax(0, 1fr);
    }
  }

  /* Outline drawer (native <dialog>). */
  .outline {
    width: min(27rem, 100vw);
    max-width: 100vw;
    height: 100dvh;
    max-height: 100dvh;
    margin: 0 0 0 auto;
    padding: 0;
    border: 0;
    background: var(--paper);
    color: var(--ink);
    box-shadow: var(--shadow-lg);
    overscroll-behavior: contain;
    transform: translateX(0);
    transition:
      transform 0.35s var(--ease),
      display 0.35s allow-discrete,
      overlay 0.35s allow-discrete;
  }

  .outline:not([open]) {
    transform: translateX(100%);
  }

  @starting-style {
    .outline[open] {
      transform: translateX(100%);
    }
  }

  .outline::backdrop {
    background: rgb(12 12 17 / 0.4);
    backdrop-filter: blur(2px);
  }

  .outline-head {
    position: sticky;
    top: 0;
    z-index: 1;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--space-4);
    padding: var(--space-5) var(--space-4) var(--space-4) var(--space-5);
    background: var(--paper);
  }

  .outline-head h2 {
    margin-block-start: var(--space-1);
    font-size: var(--text-xl);
  }

  .outline-head h2 a {
    color: var(--ink);
    text-decoration: none;
  }

  .outline > .progress {
    padding: 0 var(--space-5) var(--space-4);
    border-block-end: 1px solid var(--line);
  }

  .outline .chapters {
    padding: var(--space-2) var(--space-3) var(--space-7);
  }

  /* ---------- Password gate */
  .page-gate {
    background: var(--stage);
  }

  .gate {
    position: relative;
    isolation: isolate;
    display: grid;
    place-items: center;
    min-height: calc(100dvh - var(--header-height));
    padding: var(--space-7) var(--space-4);
    overflow: hidden;
  }

  .gate-art {
    position: absolute;
    inset: 0;
    z-index: -2;
  }

  .gate::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background: rgb(8 8 12 / 0.35);
  }

  .gate-card {
    display: grid;
    gap: var(--space-4);
    width: min(100%, 27rem);
    padding: var(--space-6);
    border-radius: var(--radius-xl);
    background: var(--surface);
    box-shadow: 0 40px 100px -30px rgb(0 0 0 / 0.6);
  }

  .gate-card h1 {
    font-size: var(--text-2xl);
    letter-spacing: -0.03em;
  }

  .gate-card p {
    color: var(--ink-2);
  }

  .gate-lock {
    display: grid;
    place-items: center;
    width: 3rem;
    height: 3rem;
    border-radius: var(--radius-lg);
    background: var(--accent-wash);
    color: var(--accent);
  }

  .gate-form {
    display: grid;
    gap: var(--space-3);
    margin-block-start: var(--space-2);
  }

  .gate-form label {
    font-size: var(--text-sm);
    font-weight: 600;
  }

  .gate-form .btn {
    margin-block-start: var(--space-2);
  }

  .gate-card > .btn {
    justify-self: start;
  }

  /* ---------- Simple pages (errors) */
  .simple-page {
    display: grid;
    gap: var(--space-4);
    justify-items: start;
    max-width: 38rem;
    padding-block: var(--space-9);
  }

  .simple-page h1 {
    font-size: var(--text-display);
    letter-spacing: -0.045em;
    line-height: 1;
  }

  .simple-page p {
    color: var(--ink-2);
    font-size: var(--text-lg);
  }

  /* ---------- Preview banner (admin) */
  .preview-banner {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: var(--space-2) var(--space-4);
    padding: var(--space-2) var(--space-4);
    background: #fef3c7;
    color: #78350f;
    font-size: var(--text-sm);
    font-weight: 500;
    text-align: center;
  }

  .preview-banner a {
    color: inherit;
    font-weight: 700;
  }
}

/* ============================================================= utilities */
@layer utilities {
  .visually-hidden {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    overflow: hidden !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
  }
}

/* =============================================================== polish */

@layer components {
  .prose pre {
    border: 1px solid light-dark(transparent, var(--line));
  }

  .chip-done {
    background: rgb(74 222 128 / 0.18);
    color: #bbf7d0;
  }

  .up-next {
    justify-self: start;
    margin-block: 0.2rem 0.1rem;
    padding: 0.1rem 0.55rem;
    border-radius: var(--radius-pill);
    background: var(--accent);
    color: var(--on-accent);
    font-size: var(--text-xs);
    font-weight: 600;
    line-height: 1.5;
  }

  .lesson-link.is-next {
    background: var(--surface);
    box-shadow:
      inset 0 0 0 1px var(--accent-line),
      var(--shadow-sm);
  }

  .chapter-progress {
    color: var(--done);
  }
}

@layer pages {
  .hero-kicker {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-3);
  }

  .lesson-head .eyebrow {
    color: var(--ink-3);
  }

  .lesson-head h1 + .kind-chip {
    margin-block-start: var(--space-1);
  }
}

/* Smooth page-to-page navigation: the bars stay put while content crossfades. */
@view-transition {
  navigation: auto;
}

@layer utilities {
  .site-header {
    view-transition-name: site-header;
  }

  .player-bar {
    view-transition-name: player-bar;
  }

  .dock {
    view-transition-name: dock;
  }

  ::view-transition-old(root),
  ::view-transition-new(root) {
    animation-duration: 0.22s;
  }

  @media (prefers-reduced-motion: reduce) {
    ::view-transition-group(*),
    ::view-transition-old(*),
    ::view-transition-new(*) {
      animation: none !important;
    }
  }
}

/* Printing a lesson gives a clean document. */
@media print {
  @layer utilities {
    .site-header,
    .player-bar,
    .dock,
    .outline,
    .skip-link,
    .preview-banner,
    .site-footer,
    .stage,
    .document-viewer iframe,
    [data-done-toggle],
    [data-progress] {
      display: none !important;
    }

    body,
    .page-lesson {
      background: #fff !important;
      color: #000 !important;
    }

    .lesson {
      width: 100% !important;
      padding: 0 !important;
    }

    .prose {
      font-size: 11pt;
      color: #000;
    }

    .prose a[href^="http"]::after {
      content: " (" attr(href) ")";
      font-size: 0.85em;
      color: #555;
    }

    .course-hero {
      background: none !important;
      color: #000 !important;
    }

    .course-hero::after,
    .hero-art {
      display: none;
    }
  }
}

/* ======================================================= theme and lecture */
@layer components {
  .theme-toggle .theme-icon-sun,
  .theme-toggle.is-dark .theme-icon-moon {
    display: none;
  }

  .theme-toggle.is-dark .theme-icon-sun {
    display: block;
  }

  .site-header .theme-toggle {
    margin-inline-end: calc(var(--space-2) * -1);
  }
}

@layer pages {
  html {
    background: var(--paper);
  }

  /* The stage glows faintly in the course's colours, like ambient light. */
  .stage {
    position: relative;
    isolation: isolate;
    background:
      radial-gradient(70% 70% at 50% 0%, oklch(0.42 0.14 var(--h1) / 0.55), transparent 70%),
      radial-gradient(45% 60% at 90% 100%, oklch(0.55 0.12 var(--h2) / 0.28), transparent 70%),
      var(--stage);
  }

  .lecture {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-6);
    width: min(100% - 2.5rem, var(--page-width));
    margin-inline: auto;
    padding-block: clamp(var(--space-5), 4vw, var(--space-7)) 9rem;
  }

  @media (min-width: 64rem) {
    .lecture {
      grid-template-columns: minmax(0, 1fr) 22rem;
      gap: var(--space-8);
      align-items: start;
    }

    .lecture-side {
      position: sticky;
      top: calc(var(--header-height) + var(--space-5));
    }
  }

  .lecture-main {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    min-width: 0;
    gap: var(--space-6);
    max-width: var(--reading-width);
  }

  .lecture-main .lesson-head h1 {
    font-size: clamp(1.75rem, 1.3rem + 1.6vw, 2.5rem);
  }

  .lecture-side {
    display: grid;
    gap: var(--space-4);
  }

  .upnext {
    display: grid;
    gap: var(--space-4);
    padding: var(--space-5);
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
    background: var(--surface);
    box-shadow: var(--shadow);
    color: var(--ink);
    text-decoration: none;
    transition:
      border-color 0.2s var(--ease),
      box-shadow 0.2s var(--ease),
      transform 0.2s var(--ease);
  }

  .upnext:hover {
    border-color: var(--accent-line);
    box-shadow: var(--shadow-lg);
    color: var(--ink);
    transform: translateY(-2px);
  }

  .upnext:hover .btn-primary {
    background: var(--accent-hover);
  }

  .upnext:hover .btn-primary .icon:last-child {
    transform: translateX(3px);
  }

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

  .upnext .resource-icon {
    width: 3rem;
    height: 3rem;
  }

  .upnext-text {
    display: grid;
    min-width: 0;
    line-height: 1.35;
  }

  .upnext-text strong {
    font-weight: 650;
  }

  .upnext-text span {
    color: var(--ink-3);
    font-size: var(--text-sm);
  }

  .btn-block {
    width: 100%;
  }

  .steps-card {
    display: grid;
    gap: var(--space-3);
    padding: var(--space-5);
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
  }

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

  .steps li {
    position: relative;
  }

  /* A thin line joins the step markers into a track. */
  .steps li + li::before {
    content: "";
    position: absolute;
    inset-inline-start: calc(var(--space-3) + 0.6875rem - 1px);
    inset-block-start: calc(var(--space-2) * -1 - 0.1rem);
    width: 2px;
    height: 0.9rem;
    border-radius: 1px;
    background: var(--line-2);
  }

  .step {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: var(--space-3);
    align-items: center;
    padding: var(--space-2) var(--space-3);
    border-radius: var(--radius);
    color: var(--ink);
    text-decoration: none;
  }

  .step:hover {
    background: var(--surface-2);
    color: var(--ink);
  }

  .step[aria-current="step"] {
    background: var(--accent-wash);
  }

  .step[aria-current="step"] .status {
    border-color: var(--accent);
  }

  .step-text {
    display: grid;
    min-width: 0;
    line-height: 1.35;
  }

  .step-text > span {
    font-size: var(--text-sm);
    font-weight: 550;
  }

  .step[aria-current="step"] .step-text > span {
    color: var(--accent);
    font-weight: 650;
  }

  .step-text small {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    color: var(--ink-3);
    font-size: var(--text-xs);
  }

  .step-text small .icon {
    width: 0.9rem;
    height: 0.9rem;
    color: var(--kind);
  }
}

@layer pages {
  .lesson-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-3);
    margin-block-start: var(--space-1);
  }

  .lesson-actions .done-toggle {
    min-height: 2.25rem;
    padding-inline: var(--space-3) var(--space-4);
    border: 1px solid var(--line-2);
    border-radius: var(--radius-pill);
  }

  .lesson-actions .done-toggle[aria-pressed="true"] {
    border-color: color-mix(in oklab, var(--done) 40%, var(--surface));
    background: var(--done-wash);
  }

  /* On video lectures the side column (up next, chapter steps) and the
     in-page toggle take over from the dock on wide screens. */
  .is-video .done-toggle.in-dock {
    display: none;
  }

  @media (min-width: 64rem) {
    .is-video .dock {
      display: none;
    }

    .is-video .lecture {
      padding-block-end: var(--space-8);
    }
  }
}

/* =================================================================== quiz */
@layer tokens {
  :root {
    --partly: light-dark(#b45309, #fbbf24);
    --partly-wash: color-mix(in oklab, var(--partly) 12%, var(--surface));
  }
}

@layer pages {
  .lesson.is-quiz {
    width: min(100% - 2.5rem, 46rem);
  }

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

  .quiz-steps {
    display: flex;
    gap: 0.4rem;
  }

  .quiz-dot {
    flex: 1;
    height: 0.375rem;
    border-radius: var(--radius-pill);
    background: var(--surface-2);
    transition: background-color 0.3s var(--ease);
  }

  .quiz-dot.is-current {
    background: var(--accent);
  }

  .quiz-dot.is-correct {
    background: var(--done);
  }

  .quiz-dot.is-partly {
    background: var(--partly);
  }

  .quiz-dot.is-incorrect {
    background: var(--danger);
  }

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

  .question {
    display: grid;
    gap: var(--space-5);
    padding: clamp(var(--space-5), 4vw, var(--space-6));
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
    background: var(--surface);
    box-shadow: var(--shadow-sm);
  }

  .question fieldset {
    display: grid;
    gap: var(--space-4);
    min-width: 0;
    margin: 0;
    padding: 0;
    border: 0;
  }

  .question-head {
    display: grid;
    gap: var(--space-2);
  }

  .question-count {
    color: var(--ink-3);
    font-size: var(--text-xs);
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }

  .question-prompt {
    font-size: clamp(1.125rem, 1.05rem + 0.4vw, 1.3rem);
    font-weight: 600;
    letter-spacing: -0.012em;
    line-height: 1.45;
  }

  .question-prompt > * + * {
    margin-block-start: 0.6em;
  }

  .question-prompt img {
    height: auto;
    border-radius: var(--radius);
  }

  .question-prompt code {
    font-family: var(--font-mono);
    font-size: 0.9em;
  }

  .question-hint {
    margin-block-start: calc(var(--space-2) * -1);
    color: var(--ink-3);
    font-size: var(--text-sm);
  }

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

  @media (min-width: 30rem) {
    .choices-row {
      grid-template-columns: 1fr 1fr;
    }
  }

  .choice {
    position: relative;
    display: flex;
    align-items: center;
    gap: var(--space-3);
    padding: 0.85rem 1rem;
    border: 1.5px solid var(--line-2);
    border-radius: var(--radius-lg);
    background: var(--surface);
    cursor: pointer;
    transition:
      border-color 0.15s var(--ease),
      background-color 0.15s var(--ease);
  }

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

  /* The real input stays focusable but invisible; the label shows the state. */
  .choice input {
    position: absolute;
    opacity: 0;
    pointer-events: none;
  }

  .choice:has(input:focus-visible) {
    box-shadow: var(--focus-ring);
  }

  .choice:has(input:checked) {
    border-color: var(--accent);
    background: var(--accent-wash);
  }

  .choice-mark {
    display: grid;
    place-items: center;
    flex: none;
    width: 1.375rem;
    height: 1.375rem;
    border: 1.5px solid var(--line-2);
    border-radius: 0.4rem;
    color: transparent;
    transition:
      background-color 0.15s var(--ease),
      border-color 0.15s var(--ease);
  }

  .choice input[type="radio"] + .choice-mark {
    border-radius: 50%;
  }

  .choice-mark .icon {
    width: 0.85rem;
    height: 0.85rem;
  }

  .choice input:checked + .choice-mark {
    border-color: var(--accent);
    background: var(--accent);
    color: var(--on-accent);
  }

  .choice-text {
    min-width: 0;
    line-height: 1.45;
  }

  .choice-text > * {
    margin: 0;
  }

  .question fieldset:disabled .choice {
    cursor: default;
  }

  .question fieldset:disabled .choice:hover {
    border-color: var(--line-2);
  }

  /* Graded states must beat the checked state (which uses :has). */
  .choice.is-answer,
  .choice.is-answer:has(input:checked),
  .question fieldset:disabled .choice.is-answer:hover {
    border-color: var(--done);
    background: var(--done-wash);
  }

  .choice.is-answer .choice-mark,
  .choice.is-answer input:checked + .choice-mark {
    border-color: var(--done);
    background: var(--done);
    color: var(--on-accent);
  }

  .choice.is-wrong,
  .choice.is-wrong:has(input:checked),
  .question fieldset:disabled .choice.is-wrong:hover {
    border-color: var(--danger);
    background: var(--danger-wash);
  }

  .choice.is-wrong .choice-mark,
  .choice.is-wrong input:checked + .choice-mark {
    border-color: var(--danger);
    background: var(--danger);
    color: var(--on-accent);
  }

  .answer-input {
    max-width: 26rem;
  }

  .question.is-graded .answer-input {
    border-width: 1.5px;
  }

  .question.is-correct .answer-input {
    border-color: var(--done);
  }

  .question.is-incorrect .answer-input {
    border-color: var(--danger);
  }

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

  .pair {
    display: grid;
    gap: var(--space-2) var(--space-4);
    align-items: center;
    padding: var(--space-2) var(--space-2) var(--space-2) var(--space-4);
    border: 1.5px solid var(--line-2);
    border-radius: var(--radius-lg);
  }

  @media (min-width: 36rem) {
    .pair {
      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    }
  }

  .pair-left {
    font-weight: 550;
  }

  .pair.is-answer {
    border-color: var(--done);
    background: var(--done-wash);
  }

  .pair.is-wrong {
    border-color: var(--danger);
    background: var(--danger-wash);
  }

  select.input {
    appearance: none;
    padding-inline-end: 2.5rem;
    background-image:
      linear-gradient(45deg, transparent 50%, var(--ink-3) 50%),
      linear-gradient(135deg, var(--ink-3) 50%, transparent 50%);
    background-position:
      calc(100% - 1.15rem) 50%,
      calc(100% - 0.8rem) 50%;
    background-size: 0.35rem 0.35rem;
    background-repeat: no-repeat;
    cursor: pointer;
  }

  .feedback {
    display: grid;
    gap: var(--space-2);
    padding: var(--space-4) var(--space-5);
    border-inline-start: 4px solid var(--line-2);
    border-radius: var(--radius);
    background: var(--surface-2);
    animation: feedback-in 0.3s var(--ease);
  }

  @keyframes feedback-in {
    from {
      opacity: 0;
      transform: translateY(4px);
    }
  }

  .feedback.is-correct {
    border-color: var(--done);
    background: var(--done-wash);
  }

  .feedback.is-partly {
    border-color: var(--partly);
    background: var(--partly-wash);
  }

  .feedback.is-incorrect {
    border-color: var(--danger);
    background: var(--danger-wash);
  }

  .verdict {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    font-weight: 700;
  }

  .feedback.is-correct .verdict {
    color: var(--done);
  }

  .feedback.is-partly .verdict {
    color: var(--partly);
  }

  .feedback.is-incorrect .verdict {
    color: var(--danger);
  }

  .reveal {
    font-weight: 500;
  }

  .reveal-pairs {
    display: grid;
    gap: var(--space-1);
    padding: 0;
    list-style: none;
  }

  .reveal-pairs li {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-2);
  }

  .reveal-pairs .icon {
    width: 1rem;
    height: 1rem;
    color: var(--ink-3);
  }

  .explanation {
    color: var(--ink-2);
  }

  .explanation > * + * {
    margin-block-start: 0.5em;
  }

  .question-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: var(--space-3);
  }

  .question-error {
    margin-inline-end: auto;
    color: var(--danger);
    font-size: var(--text-sm);
    font-weight: 600;
  }

  .quiz-submit {
    display: flex;
    justify-content: flex-end;
  }

  .quiz-result {
    display: grid;
    gap: var(--space-5) var(--space-6);
    align-items: center;
    padding: var(--space-6);
    border: 1px solid var(--line);
    border-radius: var(--radius-xl);
    background: var(--surface);
    box-shadow: var(--shadow);
    animation: feedback-in 0.4s var(--ease);
  }

  .quiz-result:focus {
    outline: none;
  }

  @media (min-width: 36rem) {
    .quiz-result {
      grid-template-columns: auto minmax(0, 1fr);
    }
  }

  .quiz-ring {
    position: relative;
    display: grid;
    place-items: center;
    width: 8.5rem;
    aspect-ratio: 1;
  }

  .quiz-ring svg {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    transform: rotate(-90deg);
  }

  .quiz-ring circle {
    fill: none;
    stroke-width: 10;
  }

  .quiz-ring-track {
    stroke: var(--surface-2);
  }

  .quiz-ring-value {
    stroke: var(--accent);
    stroke-linecap: round;
    transition: stroke-dasharray 0.9s var(--ease);
  }

  .quiz-ring strong {
    font-size: 1.75rem;
    font-weight: 750;
    letter-spacing: -0.03em;
    font-variant-numeric: tabular-nums;
  }

  .quiz-result-text {
    display: grid;
    gap: var(--space-2);
  }

  .quiz-result-text h2 {
    font-size: var(--text-2xl);
    letter-spacing: -0.03em;
  }

  .quiz-result-text p {
    color: var(--ink-2);
  }

  .quiz-result-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    margin-block-start: var(--space-3);
  }

  /* After finishing, the questions below serve as a review. */
  .quiz.is-done .question {
    box-shadow: none;
  }
}

@layer pages {
  .choice-mark .icon-x,
  .choice.is-wrong .choice-mark .icon-check {
    display: none;
  }

  .choice.is-wrong .choice-mark .icon-x {
    display: block;
  }

  /* On a quiz, finishing it completes the lesson; no separate toggle. */
  .is-quiz-page .done-toggle.in-dock {
    display: none;
  }
}

@layer pages {
  /* Without the toggle, keep "Next" in the right-hand column. */
  .is-quiz-page .dock-next {
    grid-column: 3;
  }
}
