/* ============================================================
   GoPokerPro — SINGLE-COURSE PAGE (Phase-5 branded scaffold)
   ------------------------------------------------------------
   BRAND-05 / D-01 / D-02 / D-03.

   The mockup's tokens.css is MAPPED, NOT shipped — there is NO
   @import here; the canonical v1 token NAMES in
   assets/css/gpp-brand-tokens.css are the single source of
   truth (D-01). Every mockup token was collapsed to its nearest
   existing v1 token with NO new shade added (D-02); this file
   only references var(--gpp-*) — no bare surface hex (D-03). The
   single-course page therefore reads as the SAME BRAND as live
   /courses (square corners, flat, Lexend, no underlines, 1020px
   centered container).

   Loads AFTER gpp-brand-tokens.css (declared as the `gpp-tokens`
   dependency in the enqueue, handle `gpp-single-course`), so
   every var(--gpp-*) below resolves.

   Phase-5 SCOPE (scaffold ONLY — CONTEXT D-13/D-14):
     1. TB-frame width fix + branded shell (body.single-course #content)
     2. The 5 labeled placeholder section mounts (.gpp-sc-mount)
     3. The throwaway per-persona state readout (.gpp-sc-readout)
   The REAL sections (Course Header — Phase 6; Action Bar / Value
   Strip / Instructor — Phase 7; Syllabus hero — Phase 8) are OUT
   OF SCOPE here. Do NOT style them in this file.

   Brand law (binding, carries from v1 / CLAUDE.md):
     border-radius: 0 everywhere (Phase 5 ships ZERO rounded
     elements — the ring SVG + 54px .inst-photo are Phase 6/7) ·
     flat (no drop shadow) · Lexend via var(--gpp-font*) · no
     underlined link text anywhere (affordance = color/
     weight) · var(--gpp-*) only (the sanctioned
     rgba(246,166,100,…) gold-tints v1 already ships are the only
     literal-rgba allowed).

   CSS is RISKLESS to deploy — overwrite freely (NOT subject to
   the kill-switch-first PHP procedure).
   ============================================================ */

/* ------------------------------------------------------------
   0. Square corners + no-underline brand law (BRAND-04 / D-03)
   ------------------------------------------------------------
   GoPokerPro never uses rounded corners and never underlines
   link text — link affordance is color/weight. Phase 5 ships no
   round elements at all, so border-radius:0 is universal here.
   ------------------------------------------------------------ */
body.single-course *,
.gpp-sc * { box-sizing: border-box; }
body.single-course .gpp-sc *,
.gpp-sc * { border-radius: 0; }            /* square — no rounded elements ship in Phase 5 */
body.single-course .gpp-sc a { text-decoration: none; }  /* no underlines — affordance is color/weight */

/* ------------------------------------------------------------
   1. TB-frame width fix + branded shell
   ------------------------------------------------------------
   The live single-course page renders through the SAME Divi
   Theme Builder frame as /courses (#et-main-area > #container >
   #content) — there is NO classic-Divi #left-area/.container/
   #sidebar here. Retarget the shipped v1 hotfix verbatim
   (v1 used body.post-type-archive-course #content, commit
   bea12cb) to constrain the actual TB content wrapper to the
   1020px centered column. single-course.css only loads on a
   single course (is_singular('course')), so this #content rule
   cannot affect any other page.
   ------------------------------------------------------------ */
body.single-course #content {
  max-width: 1020px !important;
  margin: 0 auto !important;
  box-sizing: border-box;   /* keep the 24/12px side padding INSIDE the 1020px cap (match the catalog #content recipe; don't rely on a universal reset surviving Divi's cascade) */
  /* Container gutter — MATCH THE /courses CATALOG EXACTLY (founder decision 2026-06-11): 24px desktop
     → 12px ≤480px, carried on #content (the Divi TB content wrapper) with !important, mirroring the v1
     catalog `body.post-type-archive-course #content` fix (curriculum.css) which PROVED Divi needs
     !important on this wrapper's padding. `.gpp-sc` side padding is zeroed (below) so the gutter lives
     in ONE place and the card content + the page heading/rule share the same left/right edge — and the
     single-course page renders at the SAME width as /courses (1020px container, 24/12 gutter). */
  padding-left: 24px !important;
  padding-right: 24px !important;
  background: var(--gpp-bg);
  color: var(--gpp-ink);
  font-family: var(--gpp-font);
}
@media (max-width: 480px) {
  /* Catalog mobile gutter — matches curriculum.css `.gpp-curric-wrap` 12px @≤480px. */
  body.single-course #content { padding-left: 12px !important; padding-right: 12px !important; }
}

/* Page canvas — deep navy on the TB wrappers (mirrors the v1
   catalog-body chrome recipe, retargeted to the single course). */
body.single-course,
body.single-course #page-container,
body.single-course #main-content { background-color: var(--gpp-bg); }

/* Container wrapper — HARNESS-ONLY scaffold (1020px centered). NOTE: `.gpp-sc` is emitted ONLY by the
   test harness (render-single-course.php wraps the mounts in it); the LIVE page has NO `.gpp-sc` — the 5
   sections mount directly onto lifterlms_single_course_after_summary and the 1020px container + gutter
   come SOLELY from `body.single-course #content` (above). So on live this rule is inert; it exists so the
   harness preview matches the live #content geometry. The side gutter is carried by #content (24px →
   12px ≤480px, == /courses), so .gpp-sc has ZERO horizontal padding and the harness card content spans
   the full content column (== the page heading/rule, == the catalog cards). Vertical 48px top/bottom
   unchanged. (Was `48px 20px` → 32px ≥720px; SUPERSEDED 2026-06-11 by the founder's catalog-match decision
   — supersedes the frozen-mockup 20/32px value and the 07-UI-SPEC gutter.) */
.gpp-sc {
  max-width: 1020px;
  margin: 0 auto;
  padding: 48px 0;
  font-family: var(--gpp-font);
  color: var(--gpp-ink);
}

/* WR-02 resolution (founder-approved 2026-06-11) — neutralize Divi 4's GLOBAL `.container` (max-width +
   side padding) on the syllabus `.container` wrapper (inc/single-course-syllabus.php), so on live it does
   NOT re-inset the syllabus relative to the other mounts (header/action-bar/instructor have no .container).
   SCOPED TO `#content .container` (NOT page-wide `.container`, NOT the harness-only `.gpp-sc .container`):
   - `.gpp-sc` is HARNESS-ONLY (live mounts emit directly onto lifterlms_single_course_after_summary with no
     .gpp-sc parent), so a .gpp-sc-gated rule is INERT on live — exactly where WR-02 bites.
   - A PAGE-WIDE `body.single-course .container` would ALSO zero Divi's header/footer `.container` chrome
     (#main-header / #main-footer use .container) → broken site chrome. `#content .container` confines the
     reset to the TB content region where our syllabus .container lives (mirrors the catalog's own
     `#main-content .container` scoping at curriculum.css:54). Specificity (1,1,1) beats Divi's plain
     `.container`. No-op in the harness (.container is unstyled there → the declarations match but change
     nothing visible). LIVE-VERIFY the syllabus left edge lines up with the header rule (add !important, or
     the inc/ rename to .gpp-sc-syl-inner, if Divi's .container proves more specific). */
body.single-course #content .container {
  /* CONFIRMED LIVE 2026-06-11: Divi 4's global `.container` is `width:80%; max-width:1080px; margin:auto`,
     which inset the syllabus ~40px while the rest of the page (header/rule/action-bar/instructor — no
     .container) stayed full-width. Reset ALL of Divi's sizing — incl. `width` (the piece the first pass
     missed) — and use !important, since Divi's `.container` was winning. */
  width: auto !important;
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
}

/* Belt-and-suspenders suppression of any stray default LifterLMS/
   Divi sidebar/meta on the single-course body — the PHP unhook
   removes them at source; this is the visual fallback only.
   DEPLOY: live-verify stray TB chrome (hit the TB DOM twice, same
   as v1) — the exact stray selectors are confirmed on the real
   live DOM during the Phase-9 deploy pass. */
body.single-course #content .llms-meta-info,
body.single-course #content .llms-author,
body.single-course #content #sidebar { display: none; }

/* ------------------------------------------------------------
   1.5 Restricted-access notice (LifterLMS "must enrol" message)
   ------------------------------------------------------------
   When a logged-out / no-access user opens a gated course,
   LifterLMS prints `ul.llms-notice.llms-error > li` carrying
   "You must enrol in this course to access course content."
   Out of the box it renders ROUNDED, TALL/LOPSIDED (its default
   1em 1.618em + theme <li> margins float one line in a ~64px
   box), in the THEME FONT, in a SALMON red too close to the
   gold accent. Restyle it brand-true: square, flat, Lexend,
   Ruby restricted-red (var(--gpp-restrict) — DISTINCT from
   --gpp-leak), symmetric 14px 18px padding, a baked-Ruby lock
   glyph, and a tight 28px gap above the .gpp-sc-head below. The
   box already shares the header's left/right edges (both live
   inside #content's 1020px / 24px-gutter column).

   border-radius:0 is EXPLICIT here: the universal square reset
   (section 0) is gated on `.gpp-sc *`, which is HARNESS-ONLY
   (the live notice has no .gpp-sc parent), so without this the
   live box keeps LifterLMS's 5px radius. !important beats
   LifterLMS's own llms.css + Divi list/notice rules on these
   properties.

   CSS-only — RISKLESS to deploy (no PHP, no kill-switch). Only
   shows for users without access (logged-out / non-enrolled);
   enrolled members never see it.
   ------------------------------------------------------------ */
body.single-course .llms-notice.llms-error {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0 0 28px;
  padding: 14px 18px !important;                  /* symmetric — replaces the default tall/lopsided 1em 1.618em */
  list-style: none;
  background:
    linear-gradient(rgba(217,45,58,.07), rgba(217,45,58,.07)),
    var(--gpp-card) !important;                   /* Ruby tint over card navy */
  border: 1px solid rgba(217,45,58,.32) !important;
  border-left: 3px solid var(--gpp-restrict) !important;
  border-radius: 0 !important;                    /* square (section-0 reset is harness-only) */
  box-shadow: none !important;                    /* flat */
  font-family: var(--gpp-font) !important;        /* Lexend */
  color: var(--gpp-white);
}
/* Lock glyph — baked-Ruby data-URI SVG as a leading flex item
   (background-image can't read currentColor, so the red is baked;
   it tracks --gpp-restrict by value). Square lock body + circular
   keyhole (genuine SVG illustration — the square-corner exception). */
body.single-course .llms-notice.llms-error::before {
  content: "";
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10V7a5 5 0 0 1 10 0v3' fill='none' stroke='%23d92d3a' stroke-width='2'/%3E%3Crect x='4.5' y='10' width='15' height='11' fill='%23d92d3a'/%3E%3Crect x='11' y='14.5' width='2' height='3.6' fill='%230d1b2a'/%3E%3Ccircle cx='12' cy='14.2' r='1.5' fill='%230d1b2a'/%3E%3C/svg%3E") center / contain no-repeat;
}
body.single-course .llms-notice.llms-error li {
  margin: 0;
  padding: 0;
  list-style: none;
  font: 500 15px/1.4 var(--gpp-font);             /* Lexend on the message too */
  color: var(--gpp-white);
}

/* ------------------------------------------------------------
   2. The 5 labeled placeholder section mounts (D-13)
   ------------------------------------------------------------
   Five stacked, labeled empty boxes (NOT real content) in the
   mockup's top-to-bottom order: header / actionbar / valuestrip
   (logged-out only) / syllabus / instructor. Appearance LOCKED
   (UI-SPEC §Component Inventory #2). Square, flat, var(--gpp-*).
   ------------------------------------------------------------ */
.gpp-sc-mount {
  background: var(--gpp-card);
  border: 1px solid var(--gpp-line);
  border-radius: 0;
  padding: 16px;
  margin-top: 24px;
}
.gpp-sc-mount:first-child { margin-top: 0; }
@media (min-width: 720px) {
  .gpp-sc-mount { padding: 24px; margin-top: 32px; }
}

/* Mount label — eyebrow style (reuses the mockup .eyebrow
   treatment so the scaffold already reads on-brand). */
.gpp-sc-mount-label {
  font-family: var(--gpp-font-display);
  font-size: 12px;
  font-weight: 500;
  line-height: 1.2;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--gpp-orange);
}

/* Sub-caption below the label — the "(Phase N — placeholder)"
   orienting note. AA-pass --gpp-dim (NEVER the mockup faint
   value, which fails AA — see FOUNDER-SIGNOFF flag 1 below). */
.gpp-sc-mount-note {
  font-size: 13px;
  font-weight: 400;
  line-height: 1.5;
  color: var(--gpp-dim);
  margin-top: 8px;
}

/* Locked-persona left strip — the visitor/locked accent on the
   logged-out persona's mounts (data-audience or .is-locked). */
.gpp-sc-mount[data-audience="logged-out"],
.gpp-sc-mount.is-locked {
  border-left: 3px solid var(--gpp-lock-border);
}

/* ------------------------------------------------------------
   3. The throwaway per-persona state readout (D-13/D-14)
   ------------------------------------------------------------
   A minimal debug strip proving the state engine. THROWAWAY —
   Phases 6–8 DELETE it. Keep it dead simple; it must NOT pull
   any real section content forward. Wraps gracefully at 360px.
   ------------------------------------------------------------ */
.gpp-sc-readout {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 12px 16px;
  background: var(--gpp-card-2);
  border-top: 1px solid var(--gpp-line);
  border-bottom: 1px solid var(--gpp-line);
  font-family: var(--gpp-font);
  font-size: 12px;
  font-weight: 400;
  line-height: 1.4;
  color: var(--gpp-dim);
}

/* Numbers emphasis — bold white figures (9 of 22, 41%). */
.gpp-sc-readout strong,
.gpp-sc-readout-num {
  font-weight: 600;
  color: var(--gpp-white);
}

/* Per-audience accent figures:
     in-progress / not-started → orange (%, next marker)
     completed                 → green (100% / complete: yes)
     logged-out                → stays --gpp-dim (no progress). */
.gpp-sc-readout[data-audience="in-progress"] .gpp-sc-readout-accent,
.gpp-sc-readout[data-audience="not-started"] .gpp-sc-readout-accent {
  color: var(--gpp-orange);
}
.gpp-sc-readout[data-audience="completed"] .gpp-sc-readout-accent {
  color: var(--gpp-green);
}

/* ------------------------------------------------------------
   4. The REAL dossier course header + "Builds on" theory pill
      (Phase 6 — HEAD-01..05 / CARD-03 / PILL-01/02)
   ------------------------------------------------------------
   Ported from the mockup reference single-course.css:88-196
   (.crumbs / .course-head / .head-grid / .head-cat / .facet-pill /
   .head-title / .builds-on / .bo-link / .ring-slot / .head-rule).
   The mockup's token NAMES do NOT exist in gpp-brand-tokens.css —
   every one is MAPPED to its verified v1 token (06-PATTERNS.md
   mapping table; D-01/D-02/D-03): --gpp-gold→--gpp-orange,
   --gpp-fg-1→--gpp-white, --gpp-fg-2→--gpp-ink, --gpp-fg-dim/
   --gpp-fg-4→--gpp-dim (the AA-pass muted #9fb0c3, NEVER the
   AA-fail faint navies on readable text), --gpp-navy-line→--gpp-line, --gpp-navy-line-2→
   --gpp-card-2; the 2px/3px gold accents + the gold-tint-14 hover
   wash are inlined (no token exists), reusing the sanctioned
   rgba(246,166,100,…) gold-tint literals v1 already ships. NO new
   shade added. The header renders INSIDE .gpp-sc, so it inherits
   the square-corner (@51) + no-underline (@52) brand resets. The
   LOCKED pixels-win port px (crumbs 18px, head 22px, bo-link
   9px 14px 9px 13px, ring slot 195px, watermark 40px/330px, head
   rule 28px, title clamp(32px,8vw,54px)) are verbatim — do NOT
   round to the 4/8 grid (ui-checker PASSES this documented
   exception). CSS is RISKLESS (no kill-switch). var(--gpp-*) only.
   ------------------------------------------------------------ */

/* Belt-and-suspenders: kill any inherited link underline on the
   header's two link surfaces (the .gpp-sc a reset @52 already does
   this; explicit here so the header is self-contained). */
.gpp-sc-bo-link,
.gpp-sc-crumbs a { text-decoration: none; }

/* The header wrapper — relative so the spade watermark positions
   against it; 22px top pad (LOCKED port). */
.gpp-sc-head { position: relative; padding: 22px 0 0; }

/* Spade watermark — decorative, behind the content (pure-CSS background; the bare div carries
   no data). FLEXIBLE height (UAT 2026-06-10): spans from the breadcrumb text top (top:40px =
   the head's 22px pad + the crumbs' 18px pad) down to the content bottom (bottom:30px = the
   rule's 28px margin + its 2px), so it grows/shrinks with the header content and always keeps
   the SAME gap to the gold rule as the content — never crossing it. aspect-ratio holds the
   spade's proportions as the height flexes; width follows. The SVG carries its own internal
   0.1 opacity (no css opacity). url() is relative to this stylesheet → resolves in the theme
   AND the zero-WP harness. */
.gpp-sc-head-bg {
  position: absolute;
  top: 40px;
  bottom: 30px;
  left: 50%;
  transform: translateX(-50%);
  width: auto;
  aspect-ratio: 320 / 356;
  background: url("../Hero-bg.svg") center / contain no-repeat;
  pointer-events: none;
  z-index: 0;
}
.gpp-sc-head > *:not(.gpp-sc-head-bg) { position: relative; z-index: 1; }
@media (max-width: 720px) {
  /* Responsive on mobile (UAT 2026-06-10): keep the spade anchored top:40 → bottom:30 (inherited)
     so it flexes with the taller mobile header and NEVER crosses the gold rule; only CAP its width
     to the narrow viewport and release the fixed aspect-ratio, so background:contain fits the SVG
     inside the resulting tall/narrow box (centered, proportions preserved) — never overflowing. */
  .gpp-sc-head-bg { width: min(58%, 260px); aspect-ratio: auto; }
}

/* Breadcrumb — 18px top pad (LOCKED port); muted AA-pass --gpp-dim
   text; gold on hover/focus. The decorative '/' separator is the
   ONLY place a faint non-AA navy is permitted (non-text glyph,
   aria-hidden — UI-SPEC Color row). */
.gpp-sc-crumbs {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 18px 0 0;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--gpp-dim);
}
.gpp-sc-crumbs a { color: var(--gpp-dim); }
.gpp-sc-crumbs a:hover,
.gpp-sc-crumbs a:focus-visible { color: var(--gpp-orange); }
.gpp-sc-crumb-sep { color: #3d5a7a; } /* decorative separator glyph ONLY — never text content */

/* Two-column dossier grid: stacked on mobile, meta-left / 195px
   ring-slot-right at >=820px. */
.gpp-sc-head-grid {
  display: flex;
  flex-direction: column;
  gap: 28px;
}
@media (min-width: 820px) {
  .gpp-sc-head-grid { flex-direction: row; align-items: start; gap: 40px; }
}
.gpp-sc-head-meta { flex: 1 1 auto; min-width: 0; }

/* Facet pills — outline-only gold, REUSING the deployed
   .gpp-curric-facet treatment (D-05, byte-identical to /courses):
   gold text, gold-@45%-alpha border, no fill, square. The
   orange-at-alpha border has no token — reuse the sanctioned v1
   rgba literal. */
.gpp-sc-head-cat {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-top: 16px;
}
.gpp-sc-facet {
  font-family: var(--gpp-font-display);
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: var(--gpp-orange);
  border: 1px solid rgba(246, 166, 100, 0.45);
  background: transparent;
  padding: 2px 8px;
}

/* Two-line title (HEAD-03) — LOCKED clamp(32px,8vw,54px), weight
   400 (the brief overrides the mockup's --disp-weight:600),
   uppercase, line-height 1.04. line2 (the gold .hl span) is only
   emitted when non-empty (no orphan gold span on single-line
   titles — the PHP guards it). */
.gpp-sc-head-title {
  font-family: var(--gpp-font-display);
  font-size: clamp(32px,8vw,54px);
  font-weight: 400;
  text-transform: uppercase;
  line-height: 1.04;
  color: var(--gpp-white);
  margin: 16px 0 0;
}
.gpp-sc-t-line { display: block; }
.gpp-sc-hl { color: var(--gpp-orange); }

/* Descriptor (HEAD-04) — AA-pass --gpp-dim; only rendered when
   gpp_course_descriptor() is non-empty (D-04 deferred → no
   reserved space this phase). */
.gpp-sc-head-desc {
  font-size: 16px;
  font-weight: 300;
  line-height: 1.55;
  color: var(--gpp-dim);
  max-width: 46ch;
  margin: 12px 0 0;
}

/* "Builds on" wayfinding (CARD-03 / PILL-01) — the GPP signature
   3px gold left-accent on a faint navy outline. The pill resting
   border is --gpp-line; the 3px gold left accent + the hover wash
   are inlined (no token). Hover/focus = the sanctioned
   rgba(246,166,100,.14) gold-tint, raised-surface border, gold
   left accent retained; the name brightens to white. Color/bg
   transition only — reduced-motion-safe (no transform/opacity
   animation introduced). */
.gpp-sc-builds-on {
  display: flex;
  flex-direction: column;
  align-items: stretch;       /* UAT (founder): pills equal-width — was flex-start */
  width: fit-content;          /* group shrinks to the widest pill … */
  max-width: 100%;             /* … but never overflows the meta column */
  gap: 8px;
  margin-top: 16px;
}
.gpp-sc-bo-link {
  display: flex;               /* UAT: block flex so the stretch equalizes width — was inline-flex */
  align-items: center;
  justify-content: flex-start; /* keep icon + label left-aligned in the equalized box */
  gap: 9px;
  white-space: normal;
  padding: 9px 14px 9px 13px;
  border: 1px solid var(--gpp-line);
  border-left: 3px solid var(--gpp-orange);
  background: transparent;
  color: var(--gpp-ink);
  font-size: 13px;
  line-height: 1.2;
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.gpp-sc-bo-link:hover,
.gpp-sc-bo-link:focus-visible {
  background: rgba(246, 166, 100, 0.14);
  border-color: var(--gpp-card-2);
  border-left-color: var(--gpp-orange);
  color: var(--gpp-white);
}
.gpp-sc-bo-link:hover .gpp-sc-bo-name,
.gpp-sc-bo-link:focus-visible .gpp-sc-bo-name { color: var(--gpp-white); }
.gpp-sc-bo-icon { display: inline-flex; flex: none; color: var(--gpp-orange); }
.gpp-sc-bo-pre { flex: none; color: var(--gpp-white); }
.gpp-sc-bo-name { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; white-space: normal; color: var(--gpp-orange); font-weight: 600; }
.gpp-sc-bo-arr { flex: none; color: var(--gpp-orange); font-size: 12px; line-height: 1; }

/* Ring dossier slot (HEAD-05) — centered/stacked on mobile; fixed
   195px slot, right-aligned, at >=820px (LOCKED port). The shipped
   gpp_ring() SVG fills the slot up to 260px; shrinks ~25% (to
   195px) at <=640px to free vertical space. */
.gpp-sc-ring-slot {
  display: flex;
  justify-content: center;
  align-items: center;
}
@media (min-width: 820px) {
  .gpp-sc-ring-slot { flex: 0 0 195px; width: 195px; justify-content: flex-end; }
}
.gpp-sc-ring-slot svg { width: 100%; max-width: 260px; height: auto; }
@media (max-width: 640px) {
  /* UAT (founder, 2026-06-10): on mobile remove the position-ring seat table entirely
     (supersedes RESP-05's "~25% shrink ≤640px" — Phase 9 must honor hidden-on-mobile). */
  .gpp-sc-ring-slot { display: none; }
}

/* Position-ring seat recolor (HEAD-05) — the .art layer that colors the ring's
   seat classes (s-hero / s-sel / s-dim / felt / t-*) lives in curriculum.css for the
   /courses catalog, but that sheet does NOT load on single-course pages (enqueue is
   gated on is_courses()), so the ring here would fall back to the SVG default black on
   every seat. Ported verbatim from curriculum.css:100-107 (same project tokens). */
.art { font-family: var(--gpp-font-display); }
.art .felt { fill: var(--gpp-soft); stroke: var(--gpp-line); stroke-width: 2.5; }
.art .s-hero { fill: var(--gpp-orange); }
.art .s-sel { fill: var(--gpp-card); stroke: var(--gpp-orange); stroke-width: 2.5; }
.art .s-dim { fill: var(--gpp-card); stroke: rgba(255, 255, 255, .25); stroke-width: 2.5; }
.art .t-hero { fill: var(--gpp-bg); }
.art .t-sel { fill: var(--gpp-orange); }
.art .t-dim { fill: var(--gpp-seat-dim); }

/* Gold head rule (HEAD-01) — the 2px gold dossier underline; 28px
   top margin (LOCKED port). 2px inlined (no --gpp-border-accent
   token). */
.gpp-sc-head-rule {
  height: 0;
  border: 0;
  border-top: 2px solid var(--gpp-orange);
  margin: 28px 0 0;
}

/* Focus-visible parity for the header's new links (reuse the v1
   gold-outline pattern from curriculum.css:514-517). */
.gpp-sc-crumbs a:focus-visible,
.gpp-sc-bo-link:focus-visible { outline: 2px solid var(--gpp-orange); outline-offset: 2px; }

/* A11Y-05 / D-01 — keyboard focus on EVERY syllabus interactive control.
   The LOCKED /courses focus indicator copied verbatim from curriculum.css:514-517:
   keyboard-only :focus-visible, 2px gold outline, outline-offset:2px (places the
   gold ring on the navy page bg OUTSIDE the box → visible even around the gold-filled
   .cta-main; ONE rule covers every control — D-01b, no distinct filled-button style).
   The global *{border-radius:0} keeps the outline SQUARE (no rounded glow / box-shadow).
   Color is var(--gpp-orange) — never a bare hex. No underline. ADDITIVE — alters no
   layout, so it lives OUTSIDE any breakpoint block and applies at every viewport.
   Structural a11y (Enter/Space + aria-expanded + aria-controls) ALREADY ships Phase 8
   (D-01c) — this adds ONLY the visible outline; the controls are not rebuilt.
   Builds-on theory pill uses .gpp-sc-bo-link — already covered by the existing
   :435-436 :focus-visible rule above; no new selector needed (D-01). */
.sec-head:focus-visible,        /* section toggle <button> (also carries .gpp-curric-sechead) */
.expand-toggle:focus-visible,   /* master Expand/Collapse-all <button> */
.cta:focus-visible,             /* per-section CTA <a> (base "cta" catches -done/-cont/-start) */
.cta-main:focus-visible,        /* action-bar primary CTA (== .btn.btn-primary) */
.lesson:focus-visible { outline: 2px solid var(--gpp-orange); outline-offset: 2px; }  /* lesson row <a> */

/* === FOUNDER-SIGNOFF: 5 D-04 escalation flags (do NOT silently resolve) ===
   ------------------------------------------------------------------------
   D-04 standing rule: where collapsing a mockup color to a v1 token VISIBLY
   changes the look, FLAG it for the founder rather than silently adopting
   either value. v1 is the anchor; the mockup conforms. The token MAP is done
   now (BRAND-05), but each value below is recorded VERBATIM, pending founder
   sign-off — NONE is silently resolved in this scaffold. Most bite in
   Phases 6–8 (the scaffold renders only shell/mount/readout, none of which
   draws these five surfaces). Hex values are written WITHOUT the leading
   hash on purpose — they are documentary references in a comment, never
   active surface values.

   Flag 1 — faint value 3d5a7a (mockup --gpp-fg-faint) on carets / sec-idx /
     lesson-num / lesson-state border. PENDING founder sign-off. Proposed v1
     resolution: text (lesson-num, sec-idx) → var(--gpp-dim) (9fb0c3, AA-pass);
     non-text caret glyph → var(--gpp-seat-dim) (5b6b80) or var(--gpp-dim).
     NEVER keep 3d5a7a (2.44:1, AA-fail — Phase-4 D-08 reject). Lands Phase 6 & 8.

   Flag 2 — solid navy line 1e3a5f (mockup --gpp-navy-line) on section / lesson
     / instructor borders. PENDING founder sign-off. Proposed v1 resolution:
     var(--gpp-line) (rgba 255,255,255,.12, the translucent-white line) for
     parity with /courses (the mockup's own .sec rule already uses the alpha
     line). Lands Phases 6–8.

   Flag 3 — line-2 2a4a6a (mockup --gpp-navy-line-2), DUAL role. PENDING founder
     sign-off. Proposed v1 resolution: lock-border role → var(--gpp-lock-border)
     (2a4a6a, exact); hover/outline-border role (.dep-pill / .btn-outline) →
     var(--gpp-line) or var(--gpp-orange) on hover. Lands Phases 6–8.

   Flag 4 — value-strip gradient: linear-gradient(135deg, 0f1f36, 112240)
     (the mockup's deferred panel-gradient token — name elided here as a
     prose documentary reference, like the hashless hexes above; this token
     is NOT added to the v1 set). PENDING founder sign-off. Proposed v1
     resolution: FLATTEN to var(--gpp-card) or var(--gpp-card-2) — the flat
     brand ships NO gradient token, so this is a deliberate visual flatten.
     STRIP-01 / the value strip is DEFERRED (Phase-7 D-04) — no value-strip
     CSS ships this phase; this flag stays open for whenever STRIP-01 is
     picked up.

   Flag 5 — instructor card bg 0f1f36 (mockup --gpp-navy-deep). PENDING founder
     sign-off. Proposed v1 resolution: maps cleanest to var(--gpp-card)
     (0d1b2a); flag only if the founder wants the instructor card visibly
     distinct from the section cards. Lands Phase 7.
   ------------------------------------------------------------------------ */

/* ------------------------------------------------------------
   5. The REAL action bar + progress block + instructor card
      (Phase 7 — ACT-01 / ACT-02 / INST-01)
   ------------------------------------------------------------
   LOCKED-port of the mockup reference single-course.css:201-228
   (.action-bar / .btn / .btn-primary / .progress-* ) and :387-404
   (.instructor / .inst-*). Every mockup token NAME is MAPPED to its
   verified v1 token (07-RESEARCH §6 / 07-UI-SPEC mapping table;
   BRAND-05; D-01/D-02/D-03 carry from §4): gold→--gpp-orange,
   navy-deepest→--gpp-bg, navy(hover text)→--gpp-card, fg-1→--gpp-white,
   hover-fill #fff→--gpp-white (the shipped v1 card uses the token at
   curriculum.css:221 — NOT a bare hex), fg-meta→--gpp-dim,
   success→--gpp-green, navy-raised→--gpp-card-2, navy-line→--gpp-line,
   navy-deep(inst bg)→--gpp-card (Flag 5 adopted). NO new token is added
   (the mockup panel-gradient token from Flag 4 above is NOT added —
   STRIP-01 deferred, D-04).
   These rules render INSIDE .gpp-sc, so they inherit the square-corner
   (@50-51) + no-underline (@52) brand resets — square, flat, Lexend,
   no underlines. The LOCKED off-grid pixels-win port px (action-bar
   24px/20px/gap10, btn 15px 26px, arr 17px translateY -0.5px, progress
   gap 10px/12px, meta 13px, pct 15px/0.04em, track 6px, instructor 36px,
   inst-card 16px 18px/gap16, inst-photo 54px, inst-role 10.5px/0.14em,
   inst-name 16px, inst-bio 12.5px/1.5) are verbatim — do NOT round to
   the 4/8 grid (documented ui-checker pixels-win exception). The ONLY
   sanctioned bare literals are the decorative .inst-photo placeholder
   gradient + the gold-tint photo ring (illustration colors — no tokens
   exist, consistent with the ring/felt SVG exception). The mockup's
   instructor anchor rule (D-07 — dead CSS) and the .btn-outline rule
   (unused this phase) are OMITTED entirely; no value-strip CSS; no
   box-shadow (flat). CSS is
   RISKLESS to deploy — overwrite freely (NOT subject to the kill-switch-
   first PHP procedure). var(--gpp-*) only.
   ------------------------------------------------------------ */

/* Action bar — vertical stack: CTA above, enrolled-only progress block
   below. 24px top pad, 20px gap (LOCKED port). */
.action-bar {
  padding: 24px 0 0;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 20px;
}

/* Button base (.btn) — full-width on mobile; centered inline-flex; the
   transparent border reserves the hover border-color so the box never
   shifts on hover. Lexend (inherited). LOCKED 15px 26px pad / 10px gap. */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  font-weight: 600;
  font-size: 15px;
  padding: 15px 26px;
  border: 1px solid transparent;
  cursor: pointer;
  transition: background 0.2s cubic-bezier(0.4, 0, 0.2, 1),
              border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
              color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  text-align: center;
  line-height: 1.1;
  width: 100%;
}

/* The ▸ resume glyph — 17px, optically nudged up 0.5px (LOCKED port). */
.btn .arr {
  font-size: 17px;
  line-height: 1;
  transform: translateY(-0.5px);
}

/* Primary CTA (.btn-primary, used as .cta-main) — gold fill / navy text
   resting; white fill / navy text on hover (the v1 white-fill CTA hover,
   var(--gpp-white) — NOT a bare #fff). */
.btn-primary {
  background: var(--gpp-orange);
  color: var(--gpp-bg);
}
.btn-primary:hover {
  background: var(--gpp-white);
  color: var(--gpp-card);
  border-color: var(--gpp-white);
}

/* ≥560px — the CTA shrinks to its content width (auto), no longer full-bleed. */
@media (min-width: 560px) {
  .btn { width: auto; }
}

/* Progress block (ACT-02) — enrolled-only; the PHP withholds this markup
   for logged-out (D-03). Meta row ("X of Y lessons complete" / %) above a
   flat 6px track. 10px gap (LOCKED port). */
.progress-block {
  display: flex;
  flex-direction: column;
  gap: 10px;
  width: 100%;
}

/* Meta row — count left, % right, baseline-aligned. 12px gap, 13px text,
   muted AA-pass --gpp-dim. */
.progress-meta {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  font-size: 13px;
  color: var(--gpp-dim);
}
.progress-meta .pm-num {
  color: var(--gpp-white);
  font-weight: 600;
}
.progress-meta .pct {
  font-family: var(--gpp-font);
  font-size: 15px;
  letter-spacing: 0.04em;
  color: var(--gpp-orange);
  font-weight: 600;
}
.progress-meta .pct.is-done { color: var(--gpp-green); }

/* Flat 6px track bed (LOCKED port) — raised-surface navy. */
.progress-track {
  height: 6px;
  background: var(--gpp-card-2);
  width: 100%;
  overflow: hidden;
}
/* Gold fill → green at 100% (is_complete-driven .is-done, NEVER pct==100). */
.progress-fill {
  height: 100%;
  background: var(--gpp-orange);
  width: 0;
  transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.progress-fill.is-done { background: var(--gpp-green); }

/* Instructor card (INST-01) — bottom of the page; 36px top pad (LOCKED). */
.instructor { padding: 36px 0 0; }

/* The card — photo left, meta right; 2px gold top accent + 1px line border
   on a --gpp-card bg (Flag 5 adopted). 16px 18px pad / 16px gap (LOCKED). */
.inst-card {
  display: flex;
  align-items: center;
  gap: 16px;
  border: 1px solid var(--gpp-line);
  border-top: 2px solid var(--gpp-orange);
  background: var(--gpp-card);
  padding: 16px 18px;
}

/* The 54px portrait. Base rule carries size/gradient/object-fit/border
   ONLY — the round corners are applied by the high-specificity override
   below (the square-reset GROUP at @50-51 must be out-specified). The
   placeholder gradient + the gold-tint ring are the sole sanctioned bare
   literals (decorative illustration colors — no tokens exist). */
.inst-photo {
  flex: none;
  width: 54px;
  height: 54px;
  background: linear-gradient(160deg, #9a7c3e, #5a4720);
  object-fit: cover;
  border: 1px solid rgba(246, 166, 100, 0.30);
}
/* BRAND-05 round exception (the sole rounded element on this page) — MUST
   out-specify the square-reset GROUP at single-course.css:50-51. The
   BINDING reset member is `body.single-course .gpp-sc *` = specificity
   (0,2,1) — NOT the weaker `.gpp-sc *` (0,1,0) at :51. A bare `.inst-photo`
   (0,1,0) or `.gpp-sc .inst-photo` (0,2,0) BOTH LOSE → square portrait.
   This rule is (0,3,1) — wins outright. Do NOT downgrade its specificity. */
body.single-course .gpp-sc .inst-photo { border-radius: 50%; }

/* Meta column — takes remaining width; min-width:0 lets the bio ellipsize
   gracefully without overflowing the flex row. */
.inst-meta {
  flex: 1;
  min-width: 0;
}
.inst-role {
  font-family: var(--gpp-font);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-size: 10.5px;
  color: var(--gpp-orange);
}
.inst-name {
  font-size: 16px;
  font-weight: 600;
  color: var(--gpp-white);
  margin-top: 2px;
}
.inst-bio {
  font-size: 12.5px;
  color: var(--gpp-dim);
  margin-top: 3px;
  line-height: 1.5;
}
/* The mockup's instructor-anchor rule is OMITTED entirely (D-07) — ship
   NO matching markup, NO rule (dead CSS; the card carries no link). */

/* ============================================================
   §6 Syllabus (Phase 8 — SYL-01..07)
   ============================================================
   The visible-but-locked section→lesson outline hero. Markup is
   emitted by inc/single-course-syllabus.php (Plan 03) — this block
   styles it. curriculum.css/.js are is_courses()-gated and DO NOT
   load on single-course pages (D-03c), so the panel reveal recipe
   + the lesson-hover wash are CLONED from curriculum.css here (NOT
   @import-ed / referenced).

   Ported from the mockup reference single-course.css:233-368 onto v1
   tokens (the mockup's --gpp-* names do NOT exist here; mechanical
   remap, NO new shade): #22c55e→var(--gpp-green), #16a34a→
   var(--gpp-green-dk), #2a4a6a→var(--gpp-lock-border), #f6a664→
   var(--gpp-orange), #e8933f→var(--gpp-orange-dk), #9fb0c3/#e6ebf2→
   var(--gpp-dim)/var(--gpp-ink), #fff→var(--gpp-white), navy-on-gold
   CTA text→var(--gpp-bg), card bg→var(--gpp-card), line→var(--gpp-line).
   Sanctioned inline literals: gold-tint wash rgba(246,166,100,.08),
   track rgba(255,255,255,.09)/.05, done-CTA border rgba(34,197,94,.45).
   Faint-navy #3d5a7a is inlined ONLY on the THREE non-text glyph
   spots (resting chevron / resting lesson-state border / resting
   go-arrow) — the .gpp-sc-crumb-sep precedent (@277); NEVER on
   readable text (muted readable text uses var(--gpp-dim)).

   DROPPED (D-03a/D-04a/D-01c): the mockup's grid-rows reveal trick
   (:323-325 — it fights the WAAPI height tween on the same node; the
   cloned height:0↔auto recipe is the shipped mechanism), the dead
   per-lesson status pill (:357-362), and the per-section index label
   (:273-277, sections are number-less). The syllabus renders INSIDE .gpp-sc so it inherits
   the square-corner (@51) + no-underline (@52) brand resets — NO
   round element ships (no round exception added), flat (no drop
   shadow), NO underline. The LOCKED pixels-win port px (the verbatim
   font sizes / paddings below) are NOT rounded (ui-checker exception).
   CSS is RISKLESS to deploy (overwrite freely; no kill-switch). The
   transition timing uses the literal 0.2s/0.33s/0.6s cubic-bezier the
   rest of this file uses (no --gpp-dur-*/--gpp-ease tokens exist here).
   ------------------------------------------------------------ */

/* The syllabus wrapper. Top spacing moved off the <section> (it was unreliable on live — Divi's old
   .container was actually supplying the gap; renaming it away dropped it) onto our private inner wrapper
   so it's deterministic and Divi-proof. The 20px matches the action-bar's internal CTA→progress gap
   (.action-bar { gap: 20px }) — the project's standard mount-to-mount rhythm (live fix 2026-06-11). */
.syllabus { padding: 0 0 8px; }
.gpp-sc-syl-inner { padding-top: 20px; }

/* Syllabus head — H2 + live count on the left, Expand/Collapse-all toggle on the right. */
.syllabus-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 16px;
  padding-bottom: 16px;
  margin-bottom: 20px;
  border-bottom: 1px solid var(--gpp-line);
}
.syllabus-head h2 {
  font-family: var(--gpp-font-display);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-weight: 600;
  font-size: clamp(18px, 4.5vw, 24px);
  color: var(--gpp-white);
}
.syllabus-head .count {
  font-size: 12.5px;
  color: var(--gpp-dim);
  font-variant-numeric: tabular-nums;
}
/* Master Expand/Collapse-all toggle — native-button reset, muted→gold on hover. */
.expand-toggle {
  background: none;
  border: 0;
  cursor: pointer;
  font-family: var(--gpp-font);
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--gpp-dim);
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.expand-toggle:hover { color: var(--gpp-orange); }

/* Section card — flat card on the page, 1px line, 12px gap, hover→gold border.
   The 3px state strip is a ::before (NOT border-left) so it survives the hover
   border-color flip (higher specificity not needed — it's a separate property). */
.sec {
  position: relative;
  background: var(--gpp-card);
  border: 1px solid var(--gpp-line);
  margin-bottom: 12px;
  overflow: hidden;
  transition: border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.sec:last-child { margin-bottom: 0; }
.sec:hover { border-color: var(--gpp-orange); }
/* 3px left state strip — survives the gold hover border (separate ::before layer). */
.sec::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 3px;
}
.sec.is-done::before { background: var(--gpp-green); }
.sec.is-active::before { background: var(--gpp-orange); }
.sec.is-lock::before { background: var(--gpp-lock-border); }

/* Section-head ROW (CR-01/CR-02 structural fix) — the flex container that holds the toggle
   <button>, the per-section CTA <a>, and the disclosure chevron as SIBLINGS (the CTA is NO
   LONGER nested inside the button: that was invalid interactive HTML and is what made a CTA
   click also toggle the accordion). DOM order [button (sec-main) | CTA | chevron] preserves
   the mockup's visual order. The button flex-grows to fill the row so it stays the full toggle
   hit-area; the CTA + chevron sit at the row end. align-items:center keeps the CTA + chevron
   vertically centered against the (taller, multi-line) button. The 14px gap is the same rhythm
   the button previously used between its children, so the relocation does NOT change the look.
   The 18px right inset (moved off the button) keeps the chevron flush to the card edge as before. */
.sec-head-row {
  display: flex;
  align-items: center;
  gap: 14px;
  width: 100%;
  padding-right: 18px;
}

/* Section head — a REAL <button> (native-chrome reset). It flex-grows inside .sec-head-row and
   stays the full-width toggle target; it now wraps only .sec-main (the CTA + chevron are siblings
   in .sec-head-row). The right pad is moved to .sec-head-row so the chevron aligns to the card edge. */
.sec-head {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  background: none;
  border: 0;
  cursor: pointer;
  font-family: var(--gpp-font);
  color: inherit;
  text-align: left;
  padding: 16px 0 16px 18px;
}
.sec-main { flex: 1 1 auto; min-width: 0; }
.sec-title {
  display: block;
  font-size: 16px;
  font-weight: 700;
  line-height: 1.25;
  color: var(--gpp-white);
}
.sec-meta {
  font-size: 12.5px;
  color: var(--gpp-dim);
  margin-top: 5px;
  font-variant-numeric: tabular-nums;
}

/* Per-section 5px progress sub-bar + percent readout. */
.pwrap {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 10px;
  max-width: 360px;
}
.pbar {
  flex: 1 1 auto;
  height: 5px;
  background: rgba(255, 255, 255, 0.09);
  overflow: hidden;
}
.pbar > i {
  display: block;
  height: 100%;
  width: 0;
  background: linear-gradient(90deg, var(--gpp-orange), var(--gpp-orange-dk));
  transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.pbar.pdone > i { background: linear-gradient(90deg, var(--gpp-green), var(--gpp-green-dk)); }
.pbar.plocked { background: rgba(255, 255, 255, 0.05); }
.ppct {
  flex: 0 0 auto;
  min-width: 62px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.3px;
  color: var(--gpp-dim);
  font-variant-numeric: tabular-nums;
}
.ppct.pdone-t { color: var(--gpp-green); }
/* Locked readout is READABLE text → var(--gpp-dim), NOT the faint non-text navy. */
.ppct.plocked-t {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  min-width: 66px;
  line-height: 1;
  color: var(--gpp-dim);
}
.ppct.plocked-t svg { display: block; flex: 0 0 auto; }

/* Per-section CTA — fixed-width, native reset; gold fill / navy text → white on hover. */
.cta {
  flex: 0 0 auto;
  width: 122px;
  font: inherit;
  font-size: 12.5px;
  font-weight: 700;
  white-space: nowrap;
  text-align: center;
  padding: 8px 0;
  border: 1px solid var(--gpp-line);
  background: transparent;
  color: var(--gpp-white);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  transition: background 0.2s cubic-bezier(0.4, 0, 0.2, 1),
              border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
              color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.cta-start,
.cta-cont {
  background: var(--gpp-orange);
  border-color: var(--gpp-orange);
  color: var(--gpp-bg);
}
.cta-done {
  background: transparent;
  color: var(--gpp-green);
  border-color: rgba(34, 197, 94, 0.45);
}
.cta:hover {
  background: var(--gpp-white);
  border-color: var(--gpp-white);
  color: var(--gpp-card);
}

/* RESP-05 / D-03 — narrow-width section-CTA reflow. At <560px the per-section
   CTA drops to its OWN full-width row beneath the section title/meta/chevron:
   the Phase-8 .sec-head-row flex wrapper switches to a column and stretches its
   children, then the otherwise fixed-122px .cta goes full-bleed. This mirrors
   the action-bar .btn full-width-<560 treatment (.btn width:100% / ≥560px auto
   at :545/:569). Ring stays HIDDEN ≤640px (the carried :403-407 block — D-03a;
   NO shrink rule). No value-strip rule (STRIP-01 deferred — D-03a). Tokens only;
   square corners; no underline. The ≥560px shell rules are untouched (max-width
   opt-in matches the syllabus reflow being added). */
@media (max-width: 559px) {
  .sec-head-row { flex-direction: column; align-items: stretch; }
  .cta { width: 100%; }   /* per-section CTA full-bleed below the title — mirrors .btn full-width-<560 (D-03) */

  /* RESP-05 (founder UAT, 2026-06-11) — kill the 360px horizontal scroll + left-align the header.
     (3) "Builds on:" name drops to a 2nd row: wrap the pill, give the name a full-width basis so
     "Builds on:" + icon + arrow sit on row 1 and the long theory title flows to row 2.
     align-items:flex-start aligns the wrapped rows left (founder note 2). The equal-width-pills LOCK
     (.gpp-sc-builds-on align-items:stretch / width:fit-content / max-width:100%) is untouched — only
     the pill's INTERNAL flow wraps; multiple pills still stretch to equal width. */
  .gpp-sc-bo-link { flex-wrap: wrap; align-items: flex-start; }
  .gpp-sc-bo-name { flex-basis: 100%; }

  /* (3b) Keep the ▸ affordance on the NAME's row instead of orphaning it onto a 3rd line
     (founder re-UAT 2026-06-11). The standalone .gpp-sc-bo-arr is flex:none and follows the
     name in source order, so on the full-width name row it has no room and wraps ALONE below
     the title (the lone orange triangle the founder flagged). Retire that span at this width
     and re-emit the glyph as a NON-BREAKING trailing char on the name (\00A0 = nbsp binds it to
     the last word) so it always rides the end of the name's last line. Decorative only — the
     link's text already reads "Builds on: <name>"; this is the same triangle the desktop span
     draws (12px ≈ 0.85em, lighter weight), inheriting the name's --gpp-orange. */
  .gpp-sc-bo-arr { display: none; }
  .gpp-sc-bo-name::after { content: '\00A0\25B8'; font-size: 0.85em; font-weight: 400; }

  /* (4) Breadcrumb STACKS: "My Courses" = row 1, course title = row 2 (was left/right on one row).
     align-items:flex-start left-aligns (founder note 2). Hide the '/' separator — it reads oddly
     mid-stack. Let the long last crumb wrap so it can never force width. */
  .gpp-sc-crumbs { flex-direction: column; align-items: flex-start; gap: 4px; }
  .gpp-sc-crumb-sep { display: none; }
  .gpp-sc-crumbs > span:last-child { overflow-wrap: anywhere; }
}

/* Rotating disclosure chevron — resting faint-navy NON-TEXT glyph → gold when open. */
.sec-chev {
  color: #3d5a7a;
  font-size: 20px;
  line-height: 1;
  transform: rotate(0deg);
  transition: transform 0.33s cubic-bezier(0.4, 0, 0.2, 1);
}
.sec.gpp-curric-secopen .sec-chev,
.sec.is-open .sec-chev {
  transform: rotate(90deg);
  color: var(--gpp-orange);
}

/* THE PANEL RECIPE — CLONED from curriculum.css:280-281 (the WAAPI height:0↔auto
   tween target, NOT a grid-rows reveal — D-03a). The reused curriculum.js
   delegated listener flips .gpp-curric-secopen on the section; the WAAPI
   animateToggle tweens the measured before/after height of this panel. */
.sec-body.gpp-curric-lessons { height: 0; overflow: hidden; }
.sec.gpp-curric-secopen > .sec-body.gpp-curric-lessons { height: auto; }
.sec-body-inner { overflow: hidden; min-height: 0; }

/* Lesson row — flex; viewable rows are real <a>, locked rows inert <div>. */
.lesson {
  position: relative;
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 13px 18px;
  color: var(--gpp-ink);
  cursor: pointer;
  border-top: 1px solid var(--gpp-line);
  transition: background 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Lesson-state glyph box — 20px square; resting border is the faint NON-TEXT navy. */
.lesson-state {
  flex: none;
  width: 20px;
  height: 20px;
  border: 1px solid #3d5a7a;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #3d5a7a;
  font-size: 12px;
}
.lesson-state svg { display: block; }
/* OPEN/next — gold play triangle in a faint-white-bordered box (the curriculum .play port). */
.lesson.is-open .lesson-state {
  border-color: rgba(255, 255, 255, 0.12);
  color: var(--gpp-orange);
  font-size: 9px;
}
/* DONE — green ✓ in a green-bordered box. */
.lesson.is-done .lesson-state {
  border-color: var(--gpp-green);
  color: var(--gpp-green);
}
/* LOCKED — orange lock glyph (founder UAT override 2026-06-11: was faint navy #3d5a7a;
   box border stays faint navy, like the .is-open state's orange glyph in a faint box). */
.lesson.is-locked .lesson-state { color: var(--gpp-orange); }
.lesson-num {
  flex: 0 0 auto;
  min-width: 34px;
  font-family: var(--gpp-font);
  font-size: 11.5px;
  color: var(--gpp-dim);
  font-variant-numeric: tabular-nums;
}
.lesson-title {
  flex: 1;
  min-width: 0;
  font-family: var(--gpp-font);
  font-size: 13px;
  font-weight: 400;
  line-height: 1.45;
  color: var(--gpp-ink);
}
/* The right-edge go-arrow — resting faint NON-TEXT navy, fades in gold on hover/focus. */
.lesson-go {
  margin-left: auto;
  color: #3d5a7a;
  font-size: 15px;
  opacity: 0;
  transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1),
              color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}

/* THE LESSON-HOVER WASH — CLONED from curriculum.css:286-288. Faint gold wash,
   title brightens to white, the go-arrow fades in gold (keyboard :focus-visible
   gets it too via the existing affordance — color/weight only, never an underline). */
.lesson:hover { background: rgba(246, 166, 100, 0.08); }
.lesson:hover .lesson-title { color: var(--gpp-white); }
.lesson:hover .lesson-go,
.lesson:focus-visible .lesson-go { opacity: 1; color: var(--gpp-orange); }
/* LOCKED rows are inert (SYL-07) — no hover reaction, no go-arrow reveal. */
.lesson.is-locked { cursor: default; }
.lesson.is-locked:hover { background: transparent; }
.lesson.is-locked:hover .lesson-go { opacity: 0; }
