/* ==========================================================================
   Tim Campbell / The Clarity Roadmap — design system
   Extracted from https://theclarityroadmap.com (all 47 routes), Sept 2026.
   Plain CSS, no build step. Class names that exist on the live site are kept
   verbatim (cta-shimmer, cta-flat, cta-whatsapp, faq-*, vip-*). Everything
   else is prefixed tc-.

   Two themes:
     Light "ivory"   — default. Landing, about, confirmation, legal.
     Dark "VIP stage" — wrap the page in .vip-stage. VIP, call, application,
                        replay, resources, register-interest.

   Fonts: the display family is self-hosted (section 0). Only Barlow loads in <head>:
   <link href="https://fonts.googleapis.com/css2?family=Barlow:wght@300;400;500;600;700&display=swap" rel="stylesheet">
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. Display font: "TC Display"
   One composite family so nothing else has to care which font is which:
     font-style: normal  →  Playfair Display 400, drawn at 95% (size-adjust)
     font-style: italic  →  Instrument Serif Italic, at full size
   Chosen by Will, Sept 2026 (tuner: Playfair Display · 400 · 95% · spacing -2%).
   The live site uses Instrument Serif for both; this pairing keeps its italic
   and swaps the condensed upright for a roomier one. Files are self-hosted in
   fonts/ (both SIL OFL). size-adjust needs Chrome 92 / Firefox 92 / Safari 17;
   older Safari just shows Playfair at 100%.
   -------------------------------------------------------------------------- */
@font-face { font-family: "TC Display"; font-style: normal; font-weight: 400; font-display: swap; size-adjust: 95%;
  src: url("fonts/playfair-display-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "TC Display"; font-style: normal; font-weight: 400; font-display: swap; size-adjust: 95%;
  src: url("fonts/playfair-display-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: "TC Display"; font-style: italic; font-weight: 400; font-display: swap;
  src: url("fonts/instrument-serif-italic-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "TC Display"; font-style: italic; font-weight: 400; font-display: swap;
  src: url("fonts/instrument-serif-italic-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }

/* --------------------------------------------------------------------------
   1. Tokens
   HSL triplets, shadcn-style, so alpha works: hsl(var(--accent) / .4)
   -------------------------------------------------------------------------- */
:root {
  /* surfaces */
  --background: 60 33% 95%;          /* #f6f6ee  warm ivory page */
  --card: 60 25% 97%;                /* #f9f9f5  card, lighter than page */
  --secondary: 60 20% 92%;           /* #efefe7  alt section / quiet card */
  --muted: 60 11% 90%;               /* #e8e8e3  icon circles, placeholders */
  --popover: 0 0% 100%;
  --gold-light: 40 54% 96%;          /* #faf7ef */

  /* text */
  --foreground: 0 0% 20%;            /* #333333 */
  --muted-foreground: 0 0% 45%;      /* #737373  all body copy */
  --card-foreground: 0 0% 20%;
  --secondary-foreground: 218 46% 20%;

  /* brand */
  --primary: 218 46% 20%;            /* #1c2d4a  navy */
  --primary-foreground: 0 0% 100%;
  --accent: 44 53% 54%;              /* #c8a74c  gold */
  --accent-foreground: 0 0% 100%;
  --cta: 44 53% 54%;
  --cta-foreground: 0 0% 100%;
  --destructive: 0 84.2% 60.2%;      /* #ef4444  urgency bar only */
  --destructive-foreground: 0 0% 100%;

  /* lines */
  --border: 60 11% 88%;              /* #e4e4dd */
  --input: 60 11% 88%;
  --ring: 218 46% 20%;

  --gradient-start: 218 46% 20%;
  --gradient-end: 218 46% 15%;

  /* dark-theme literals used on the live site */
  --vip-bg-top: #111b2d;
  --vip-bg-bottom: #0c1422;
  --vip-heading: 40 30% 94%;         /* #f4f1eb  headings on navy */
  --vip-heading-soft: 40 30% 92%;    /* #f1ede4 */
  --vip-body: 40 20% 80%;            /* #d6cfc2  hero sub-copy on navy */
  --vip-soft: #dad4c8;               /* .vip-soft  body copy */
  --vip-muted: #c9c2b6;              /* .vip-muted fine print */
  --vip-chip: 218 46% 18%;           /* #192843  chips, progress track */
  --vip-inset: 218 46% 10%;          /* #0e1625  video wells */
  --vip-inset-deep: 218 46% 8%;      /* #0b121e */
  --vip-panel: #10233b;              /* DQ page panels */
  --cta-ink: #111b2d;                /* text on gold buttons */

  /* radii — base .75rem; Tailwind lg/md/sm derive from it */
  --radius: .75rem;
  --radius-lg: .75rem;               /* rounded-lg: buttons, VIP cards, badges */
  --radius-md: calc(.75rem - 2px);   /* rounded-md: inputs, boxed eyebrow */
  --radius-sm: calc(.75rem - 4px);
  --radius-xl: .75rem;               /* Tailwind default xl — light cards */
  --radius-2xl: 1rem;                /* feature cards, framed images, CTA panel */
  --radius-3xl: 1.5rem;              /* DQ page panels */
  --radius-faq: 14px;
  --radius-full: 9999px;

  /* type */
  --font-button: var(--font-sans);   /* button labels are Barlow semibold, not the display serif (Will, Sept 2026; live site uses serif) */
  --button-weight: 600;
  --font-label: var(--font-sans);    /* all small text — eyebrows, chips, meta, captions, UI — is Barlow too (Will, Sept 2026) */
  --font-display: "TC Display", "Playfair Display", serif;   /* upright = Playfair Display, italic = Instrument Serif */
  --display-tracking: -.02em;                                /* upright headings only; italic stays at 0 */
  --font-sans: Barlow, sans-serif;

  /* shadows */
  --shadow-portrait: 0 25px 70px -25px hsl(var(--primary) / .55);
  --shadow-cta: 0 1px #f5dfa399 inset, 0 14px 30px -10px #755f2473;
  --shadow-cta-hover: 0 1px #f5dfa399 inset, 0 18px 40px -10px #755f2499;
  --shadow-vip-card: 0 1px hsl(var(--accent) / .15) inset, 0 30px 60px -30px #06090f80;
  --shadow-badge: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);

  /* motion */
  --ease-standard: cubic-bezier(.4, 0, .2, 1);
  --reveal-duration: .4s;            /* sections: fade + 10px rise, easeOut */
  --reveal-distance: 10px;
}

/* --------------------------------------------------------------------------
   2. Base
   -------------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; border: 0 solid hsl(var(--border)); }
html { line-height: 1.5; -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; }
body {
  margin: 0;
  background: hsl(var(--background));
  color: hsl(var(--foreground));
  font-family: var(--font-sans);
  font-variant-numeric: lining-nums;   /* Playfair defaults to old-style figures that dip below the line */
  overflow-x: hidden;
}
h1, h2, h3, h4, p, figure, blockquote { margin: 0; }
h1, h2, h3, h4 { font-size: inherit; font-weight: inherit; }
ul, ol { list-style: none; margin: 0; padding: 0; }
a { color: inherit; text-decoration: inherit; }
img, video, svg, iframe { display: block; max-width: 100%; }
img, video { height: auto; }
button { font: inherit; color: inherit; cursor: pointer; background: transparent; padding: 0; }

/* --------------------------------------------------------------------------
   3. Layout
   Breakpoints: sm 640 · md 768 · lg 1024. Container caps at 1400, but every
   section narrows it: 3xl 768 (FAQ, lists) · 4xl 896 (details, CTA panel) ·
   5xl 1024 (card grids) · 6xl 1152 (wide grids, split layouts).
   -------------------------------------------------------------------------- */
.tc-container { width: 100%; margin-inline: auto; padding-inline: 1rem; max-width: 1400px; }
.tc-container--2xl { max-width: 42rem; }
.tc-container--3xl { max-width: 48rem; }
.tc-container--4xl { max-width: 56rem; }
.tc-container--5xl { max-width: 64rem; }
.tc-container--6xl { max-width: 72rem; }

.tc-section { padding-block: 4rem; background: hsl(var(--background)); }          /* py-16 md:py-28 */
.tc-section--tight { padding-block: 3.5rem; }                                      /* py-14 md:py-24 */
.tc-section--alt { background: hsl(var(--secondary) / .4); }
.tc-section--tint { background: hsl(var(--accent) / .05); border-block: 1px solid hsl(var(--border) / .6); }
.tc-section--navy { background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); }
.tc-section--divided { border-top: 1px solid hsl(var(--border) / .6); }
.vip-stage .tc-section { background: transparent; }
@media (min-width: 768px) {
  .tc-section { padding-block: 7rem; }
  .tc-section--tight { padding-block: 6rem; }
}

.tc-grid { display: grid; gap: 1.25rem; }                                          /* gap-5 md:gap-6 */
@media (min-width: 640px) { .tc-grid--2, .tc-grid--3 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 768px) { .tc-grid { gap: 1.5rem; } .tc-grid--3-md { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1024px) { .tc-grid--3 { grid-template-columns: repeat(3, 1fr); } }

.tc-center { text-align: center; }
.tc-section-head { text-align: center; margin-bottom: 2.5rem; }
@media (min-width: 768px) { .tc-section-head { margin-bottom: 3.5rem; } }

/* --------------------------------------------------------------------------
   4. Typography
   Split (Will, Sept 2026 — the live site sets all of this in serif):
     display serif = headings, statements, the letter, big ornamental numerals
     Barlow        = body, buttons, and ALL small text (eyebrows, chips, meta,
                     captions, countdowns, FAQ questions, links, placeholders)
   Headings are ALWAYS the display family at weight 400 (only 400 is loaded —
   never bold it). Upright text is tracked in by --display-tracking; anything
   italic resets to normal because Instrument's italic is already tight. Body is Barlow 400 in muted grey. Emphasis is gold, not bold.
   -------------------------------------------------------------------------- */
.tc-display { letter-spacing: var(--display-tracking); font-family: var(--font-display); font-weight: 400; }

/* Eyebrow: serif, tiny, caps, wide tracking, gold */
.tc-eyebrow {
  font-family: var(--font-label); font-weight: 600;
  font-size: .75rem; line-height: 1rem;
  letter-spacing: .18em; text-transform: uppercase;
  color: hsl(var(--accent)); margin-bottom: .75rem;
}
.tc-eyebrow--wide { letter-spacing: .24em; }                                       /* about page */
.tc-eyebrow--navy { color: hsl(var(--primary)); }                                  /* brand blue instead of the default gold */
.tc-eyebrow--navy.tc-eyebrow--boxed { border-color: hsl(var(--primary) / .25); }
/* Filled pill — a small solid banner rather than an outline. For pointing at
   the thing directly beneath it ("Watch the breakdown ↓"), where an outlined
   chip reads as another eyebrow and gets lost. */
.tc-eyebrow--filled {
  display: inline-flex; align-items: center; gap: .5rem; font-weight: 600;
  background: hsl(var(--primary)); color: hsl(var(--primary-foreground));
  border: 0; border-radius: 9999px; padding: .5rem 1.125rem;
}
.tc-eyebrow--lined { display: inline-flex; align-items: center; gap: .75rem; }     /* line + label */
.tc-eyebrow--lined::before { content: ""; width: 2rem; height: 1px; background: hsl(var(--accent) / .6); }
.tc-eyebrow--boxed {                                                               /* "Free Training Replay" */
  display: inline-flex; align-items: center; font-weight: 500;
  border: 1px solid hsl(var(--accent) / .4); border-radius: var(--radius-md);
  padding: .5rem 1rem; margin-bottom: 1.25rem;
}
/* Dark-theme eyebrow is Barlow, not serif — verbatim from the site */
.vip-eyebrow {
  color: hsl(var(--accent)); font-family: var(--font-sans); font-weight: 500;
  letter-spacing: .22em; text-transform: uppercase; font-size: .72rem;
}

/* Hero h1: 1.5rem → 1.75 → 2.5 → 2.875rem, leading 1.12 → 1.2.
   (Live site: 1.65 → 1.875 → 2.75 → 3.25. Stepped down ~10% because Playfair runs ~21% wider.) */
.tc-h1 { letter-spacing: var(--display-tracking);
  font-family: var(--font-display); font-weight: 400;
  font-size: 1.5rem; line-height: 1.12; text-wrap: pretty; max-width: 36rem; margin-bottom: .75rem;
}
/* Statement h1 (about / register-interest): 2 → 3.375rem, leading 1.08 (live: 2.25 → 3.75) */
.tc-h1--statement { font-size: 2rem; line-height: 1.08; text-wrap: balance; max-width: 48rem; margin-bottom: 1.5rem; }
/* Utility-page h1 (confirmation, checkout, replay): italic, 1.5 → 2.5rem */
.tc-h1--utility { letter-spacing: normal; font-size: 1.5rem; line-height: 1.15; font-style: italic; max-width: 56rem; }
/* "You're in." moment: 3.75 → 6rem, italic, leading .95 */
.tc-h1--moment { letter-spacing: normal; font-size: 3.75rem; line-height: .95; font-style: italic; max-width: none; }

/* Section h2: 1.75 → 2.75rem, leading 1.25 (live: 1.875 → 3) */
.tc-h2 { letter-spacing: var(--display-tracking); font-family: var(--font-display); font-weight: 400; font-size: 1.75rem; line-height: 1.25; margin-bottom: 1rem; text-wrap: balance; }
.tc-h2--utility { letter-spacing: normal; font-size: 1.5rem; font-style: italic; }                         /* 1.5 → 2.25rem */
/* Card h3: 1.125 → 1.5rem */
.tc-h3 { letter-spacing: var(--display-tracking); font-family: var(--font-display); font-weight: 400; font-size: 1.125rem; line-height: 1.2; margin-bottom: .5rem; color: hsl(var(--foreground)); }
.tc-h3--lg { font-size: 1.5rem; line-height: 1.25; margin-bottom: .75rem; }        /* 1.5 → 1.875rem */

/* :not([class*="tc-h1--"]) keeps these base sizes from overriding the variants below */
@media (min-width: 640px) { .tc-h1:not([class*="tc-h1--"]) { font-size: 1.75rem; line-height: 1.15; margin-bottom: 1rem; } .tc-h1--statement { font-size: 2.75rem; } }
@media (min-width: 768px) {
  .tc-h1:not([class*="tc-h1--"]) { font-size: 2.5rem; line-height: 1.2; }
  .tc-h1--statement { font-size: 3.375rem; }
  .tc-h1--utility { font-size: 2.5rem; }
  .tc-h1--moment { font-size: 6rem; }
  .tc-h2 { font-size: 2.75rem; }
  .tc-h2--utility { font-size: 2.25rem; }
  .tc-h3 { font-size: 1.5rem; }
  .tc-h3--lg { font-size: 1.875rem; }
}
@media (min-width: 1024px) { .tc-h1:not([class*="tc-h1--"]) { font-size: 2.875rem; } .tc-h1--utility { font-size: 2.75rem; } }   /* live utility h1 is 3rem at lg */

/* The signature move: second clause of every headline in gold.
   Three dialects on the live site —
     landing:  upright heading, upright gold span            → .tc-accent
     utility:  italic heading, UPRIGHT gold span             → .tc-accent.tc-upright
     about:    upright heading, ITALIC gold span             → .tc-accent.tc-italic  */
.tc-accent { color: hsl(var(--accent)); }
.tc-italic { font-style: italic; letter-spacing: normal; }
.tc-upright { font-style: normal; letter-spacing: var(--display-tracking); }
.tc-h-line { display: block; margin-top: .2em; }   /* drops a headline clause onto its own line, with a little air above */

.tc-balance { text-wrap: balance; }   /* evens up the line lengths of a short paragraph */
.tc-inline-icon { display: inline-block; width: 1em; height: 1em; vertical-align: -.14em; margin-right: .4em; color: hsl(var(--accent)); }
.tc-body { color: hsl(var(--muted-foreground)); font-size: 1rem; line-height: 1.625; }
.tc-body--sm { font-size: .875rem; }
.tc-body--ui { font-size: .9375rem; }                                              /* 15px card copy */
.tc-lead { color: hsl(var(--muted-foreground)); font-size: 1rem; line-height: 1.625; max-width: 48rem; margin-inline: auto; }
.tc-fineprint { font-size: .75rem; color: hsl(var(--muted-foreground)); }
@media (min-width: 768px) { .tc-lead { font-size: 1.125rem; } .tc-body--grow { font-size: 1.125rem; } }

/* Serif pull-quote / statement paragraph */
.tc-statement { letter-spacing: var(--display-tracking); font-family: var(--font-display); font-size: 1.5rem; line-height: 1.375; color: hsl(var(--foreground)); text-wrap: balance; }
@media (min-width: 768px) { .tc-statement { font-size: 1.875rem; } }
/* Letter body ("A note from Tim") */
.tc-letter { font-family: var(--font-display); font-size: 1.125rem; line-height: 1.75; }
.tc-letter > * + * { margin-top: 1.5rem; }
.tc-dropcap::first-letter { float: left; font-style: italic; font-size: 3.75rem; line-height: .85; color: hsl(var(--accent)); margin: .25rem .75rem 0 0; }
@media (min-width: 768px) { .tc-letter { font-size: 1.25rem; } .tc-dropcap::first-letter { font-size: 4.5rem; } }

/* On navy */
.vip-stage, .tc-on-navy { color: #f1ede4; }
.vip-stage .tc-h1, .vip-stage .tc-h2, .vip-stage .tc-h3, .vip-stage .tc-statement { color: hsl(var(--vip-heading)); }
.vip-stage .tc-body, .vip-stage .tc-lead { color: var(--vip-soft); }
.vip-muted { color: #c9c2b6; }
.vip-soft { color: #dad4c8; }
.tc-section--navy .tc-h2 { color: hsl(var(--primary-foreground)); }
.tc-section--navy .tc-body { color: hsl(var(--primary-foreground) / .8); }

/* --------------------------------------------------------------------------
   5. Ornaments & rules — thin gold lines carry the whole identity
   -------------------------------------------------------------------------- */
.tc-rule { width: 4rem; height: 1px; background: hsl(var(--accent) / .6); margin: 0 auto 1.5rem; }
.tc-rule--left { margin-left: 0; }
.tc-rule--faint { background: hsl(var(--accent) / .3); }
.tc-rule--short { width: 2rem; margin: .5rem 0 .75rem; }                           /* inside cards */
.vip-rule { height: 1px; background: linear-gradient(90deg, transparent, hsl(var(--accent) / .6), transparent); width: 6rem; margin-inline: auto; }

/* line · dot · line, sits under section h2 */
.tc-ornament { display: flex; align-items: center; justify-content: center; gap: .5rem; margin-bottom: 1.5rem; }
.tc-ornament::before, .tc-ornament::after { content: ""; width: 1.5rem; height: 1px; background: hsl(var(--accent) / .4); }
.tc-ornament > span { width: .375rem; height: .375rem; border-radius: 9999px; background: hsl(var(--accent) / .6); }

/* gold left rule on a paragraph (pain-point list) */
.tc-barred { border-left: 2px solid hsl(var(--accent) / .4); padding-left: 1rem; }
@media (min-width: 768px) { .tc-barred { padding-left: 1.25rem; } }

/* Scroll cue: an eyebrow that bobs to say "keep going". Pair with .tc-eyebrow
   for the type. Wrap the words and the arrow in their own spans — inline-flex
   turns bare text into anonymous items and eats the gap. Apart from the CTA
   shimmer this is the only thing looping on a light page, so keep it to one. */
@keyframes tc-bob { 0%, 100% { transform: translateY(-3px); } 50% { transform: translateY(3px); } }
.tc-scroll-cue { display: inline-flex; align-items: center; gap: .375rem; margin-bottom: 0; animation: tc-bob 2s ease-in-out infinite; }

/* rotated-square marker (timeline nodes, closing card) */
.tc-diamond { width: .75rem; height: .75rem; transform: rotate(45deg); background: hsl(var(--accent)); }

/* --------------------------------------------------------------------------
   6. Buttons — Barlow semibold labels, sentence case, radius-lg, no caps.
   (The live site sets button labels in the display serif at 400. Will prefers
   sans here for legibility, so labels are a step larger and heavier.)
   -------------------------------------------------------------------------- */
.tc-btn {
  display: inline-block; width: 100%; max-width: 28rem; text-align: center;
  font-family: var(--font-button); font-weight: var(--button-weight); letter-spacing: .01em;
  font-size: 1.0625rem; line-height: 1.5rem; padding: 1rem 1.25rem; border-radius: var(--radius-lg); cursor: pointer;
}
.tc-btn > span { position: relative; z-index: 10; display: block; }               /* keeps label above the shimmer */
.tc-btn .tc-btn__sub { font-family: var(--font-sans); font-weight: 500; font-size: .8125rem; line-height: 1.125rem; letter-spacing: 0; opacity: .8; margin-top: .125rem; }
.tc-btn--sm { font-size: .9375rem; padding: .75rem 2rem; width: auto; }
.tc-btn--auto { width: auto; padding-inline: 2.5rem; }
@media (min-width: 640px) { .tc-btn { font-size: 1.1875rem; line-height: 1.75rem; padding-inline: 2rem; } }
@media (min-width: 768px) { .tc-btn { font-size: 1.3125rem; padding-block: 1.25rem; } .tc-btn--sm { font-size: 1.0625rem; } }

/* Primary: gold gradient with a light sweep every 3.5s. Verbatim. */
@keyframes shimmer { 0% { background-position: -200% 0; } to { background-position: 200% 0; } }
.cta-shimmer, .vip-cta {
  position: relative; overflow: hidden;
  background: linear-gradient(180deg, #dbb857, #bb993a);
  color: #111b2d;
  border: 1px solid hsl(44 65% 70%);
  box-shadow: var(--shadow-cta);
  transition: transform .15s ease, box-shadow .2s ease;
}
.cta-shimmer::after, .vip-cta::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(105deg, transparent 40%, hsl(0 0% 100% / .35) 50%, transparent 60%);
  background-size: 200% 100%;
  animation: shimmer 3.5s ease-in-out infinite;
  pointer-events: none;
}
.cta-shimmer:hover, .vip-cta:hover { transform: translateY(-1px); box-shadow: var(--shadow-cta-hover); }
.cta-shimmer:active, .vip-cta:active { transform: scale(.98); }

/* Secondary on light: flat navy */
.cta-flat { background: hsl(var(--primary)); color: #fff; border: 1px solid hsl(var(--primary)); transition: background .2s ease, border-color .2s ease, transform .15s ease; }
.cta-flat:hover { background: #243a61; border-color: #243a61; }
.cta-flat:active { transform: scale(.98); }

/* WhatsApp community join */
.cta-whatsapp { background: #1ea951; color: #fff; border: 1px solid hsl(142 70% 39%); transition: background .2s ease, border-color .2s ease, transform .15s ease; }
.cta-whatsapp:hover { background: #198f44; border-color: #198f44; }
.cta-whatsapp:active { transform: scale(.98); }

/* Secondary on navy: the "no thanks" button */
.vip-ghost-btn { background: transparent; color: #eae3d7; border: 1px solid hsl(var(--accent) / .3); transition: border-color .2s ease, background .2s ease; }
.vip-ghost-btn:hover { border-color: hsl(var(--accent) / .6); background: hsl(var(--accent) / .05); }

/* Quiet outline button on light (cookie banner, tertiary) */
.tc-btn-outline { font-family: var(--font-button); font-weight: var(--button-weight); font-size: .9375rem; padding: .625rem 1.25rem; border-radius: var(--radius-lg); border: 1px solid hsl(var(--border)); color: hsl(var(--foreground)); transition: background-color .15s var(--ease-standard); }
.tc-btn-outline:hover { background: hsl(var(--secondary)); }

/* Pill buttons (DQ page only) */
.tc-pill-btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; border-radius: 9999px; background: hsl(var(--accent)); color: hsl(220 40% 10%); padding: .75rem 1.5rem; font-size: .875rem; font-weight: 600; transition: opacity .15s; }
.tc-pill-btn:hover { opacity: .9; }
.tc-pill-link { display: inline-flex; align-items: center; justify-content: space-between; gap: .5rem; border-radius: 9999px; border: 1px solid hsl(var(--accent) / .3); padding: .625rem 1rem; font-size: .875rem; color: hsl(var(--vip-heading-soft)); transition: border-color .15s, background-color .15s; }
.tc-pill-link:hover { border-color: hsl(var(--accent) / .7); background: hsl(var(--accent) / .05); }

/* Text link */
.tc-link { font-family: var(--font-label); font-weight: 500; font-size: .875rem; letter-spacing: 0; color: hsl(var(--foreground) / .8); text-decoration: underline; text-underline-offset: 4px; transition: color .15s; }
.tc-link:hover, .tc-link--gold { color: hsl(var(--accent)); }
.tc-link--gold:hover { color: hsl(var(--accent) / .8); }

/* Trust row under the hero CTA: 14px line icon + 12px serif label */
.tc-trust { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: .375rem .75rem; margin-top: 1rem; }
.tc-trust > * { display: flex; align-items: center; gap: .375rem; color: hsl(var(--muted-foreground)); font-family: var(--font-label); font-weight: 500; font-size: .75rem; }
.tc-trust svg { width: .875rem; height: .875rem; color: hsl(var(--muted-foreground) / .7); }
@media (min-width: 640px) { .tc-trust { column-gap: 1.25rem; } }

/* --------------------------------------------------------------------------
   7. Badges, chips, live dot
   -------------------------------------------------------------------------- */
@keyframes ping { 75%, to { transform: scale(2); opacity: 0; } }
.tc-live-dot { position: relative; display: flex; width: .5rem; height: .5rem; flex-shrink: 0; }
.tc-live-dot::before { content: ""; position: absolute; inset: 0; border-radius: 9999px; background: #ef4444; opacity: .75; animation: ping 1s cubic-bezier(0, 0, .2, 1) infinite; }
.tc-live-dot::after { content: ""; position: relative; width: 100%; height: 100%; border-radius: 9999px; background: #ef4444; }
@media (min-width: 640px) { .tc-live-dot { width: .625rem; height: .625rem; } }

/* Hero date badge: 2px gold border, 5% gold wash, serif */
.tc-badge {
  display: inline-flex; align-items: center; gap: .5rem; text-align: center;
  font-family: var(--font-label); font-weight: 500; font-size: 12px; letter-spacing: .01em; color: hsl(var(--accent));
  border: 2px solid hsl(var(--accent) / .4); background: hsl(var(--accent) / .05);
  padding: .375rem .875rem; border-radius: var(--radius-lg); margin-bottom: .75rem;
}
@media (min-width: 640px) { .tc-badge { font-size: 1rem; padding: .75rem 1.5rem; margin-bottom: 1.5rem; } }

/* Social-proof badge: overlapping faces + a count, sits directly above a CTA.
   Swap each placeholder <span> for <img src="..." alt=""> when photos land.
   The pill is transparent so it sits on the page rather than on a block of
   colour; --badge-ring must therefore match the surface BEHIND it, which is
   why the navy contexts reset it. Faces stack left-over-right. Keep the label inside its own <span>: a flex container
   turns bare text into anonymous items and strips the spaces around <b>. */
.tc-proof-badge {
  --badge-bg: transparent;
  --badge-ring: hsl(var(--background));   /* must match what is BEHIND the pill, so the faces cut apart cleanly */
  --badge-text: hsl(var(--foreground));
  --badge-border: hsl(var(--border));
  display: inline-flex; align-items: center;
  padding: .375rem .9375rem .375rem .4375rem;
  border-radius: 9999px;
  background: var(--badge-bg); border: 1px solid var(--badge-border);
  color: var(--badge-text);
  font-family: var(--font-label); font-weight: 500;
  font-size: .8125rem; line-height: 1.25; text-align: left;
  margin-bottom: 1rem;
}
.tc-proof-badge b { font-weight: 600; }
/* margin, not gap: bare text around <b> would otherwise become flex items and get spaced */
.tc-proof-badge__faces { display: flex; flex-shrink: 0; margin-right: .625rem; }
.tc-proof-badge__faces > * {
  position: relative; width: 1.75rem; height: 1.75rem; flex-shrink: 0;
  border-radius: 9999px; overflow: hidden; object-fit: cover; object-position: top;
  background: hsl(var(--muted)); color: hsl(var(--primary) / .5);
  box-shadow: 0 0 0 2px var(--badge-ring);
  display: flex; align-items: center; justify-content: center;
}
.tc-proof-badge__faces > * + * { margin-left: -.5rem; }
.tc-proof-badge__faces > :nth-child(1) { z-index: 3; }
.tc-proof-badge__faces > :nth-child(2) { z-index: 2; }
.tc-proof-badge__faces > :nth-child(3) { z-index: 1; }
.tc-proof-badge__faces svg { width: 100%; height: 100%; padding: .1875rem; }
@media (min-width: 768px) {
  .tc-proof-badge { font-size: .875rem; }
  .tc-proof-badge__faces > * { width: 2rem; height: 2rem; }
  .tc-proof-badge__faces > * + * { margin-left: -.5625rem; }
}
/* on navy the hairline goes gold and the face rings follow the surface behind */
.tc-panel--navy .tc-proof-badge, .vip-stage .tc-proof-badge {
  --badge-text: hsl(var(--vip-heading)); --badge-border: hsl(var(--accent) / .25);
}
.tc-panel--navy .tc-proof-badge { --badge-ring: hsl(var(--primary)); }
.vip-stage .tc-proof-badge { --badge-ring: hsl(218 46% 11%); }
/* with no solid pill under them the faces need to be a shade darker than the page */
.tc-proof-badge__faces > * { background: hsl(var(--muted)); color: hsl(var(--primary) / .6); }
.tc-panel--navy .tc-proof-badge__faces > *, .vip-stage .tc-proof-badge__faces > * { background: hsl(218 46% 24%); color: hsl(var(--vip-heading) / .55); }

/* Small caps chip — light: card bg + border; navy: deep-navy bg + gold border */
.tc-chip { display: inline-flex; align-items: center; gap: .375rem; padding: .375rem .75rem; border-radius: 9999px; font-family: var(--font-label); font-weight: 500; font-size: .75rem; color: hsl(var(--foreground)); border: 1px solid hsl(var(--border)); background: hsl(var(--card)); }
.vip-stage .tc-chip, .tc-chip--vip { background: hsl(var(--vip-chip)); border-color: hsl(var(--accent) / .25); color: hsl(var(--vip-heading)); font-size: 11px; letter-spacing: .1em; text-transform: uppercase; padding: .25rem .75rem; }
.tc-chip--gold { color: hsl(var(--accent)); letter-spacing: .15em; }
/* "Most Popular" flag that straddles a card's top edge — add with .vip-cta */
.tc-flag { position: absolute; top: -.75rem; left: 50%; transform: translateX(-50%); z-index: 10; font-family: var(--font-label); font-weight: 600; font-size: .6875rem; padding: .375rem 1rem; border-radius: 9999px; text-transform: uppercase; letter-spacing: .05em; white-space: nowrap; }

/* Floating caption badge pinned to an image corner */
.tc-float-badge { position: absolute; bottom: -1rem; right: -1rem; display: flex; align-items: center; gap: .5rem; background: hsl(var(--card)); border: 1px solid hsl(var(--border)); border-radius: var(--radius-xl); padding: .5rem .75rem; box-shadow: var(--shadow-badge); text-align: left; line-height: 1.25; }
.tc-float-badge svg { width: 1rem; height: 1rem; color: hsl(var(--accent)); }
.tc-float-badge b { display: block; font-family: var(--font-label); font-weight: 600; font-size: .75rem; color: hsl(var(--foreground)); }
.tc-float-badge small { display: block; font-size: 10px; color: hsl(var(--muted-foreground)); }

/* --------------------------------------------------------------------------
   8. Cards — flat. 1px border, no drop shadow on light. Depth comes from
   border-colour change + 4px lift on hover.
   -------------------------------------------------------------------------- */
.tc-card { position: relative; background: hsl(var(--card)); border: 1px solid hsl(var(--border)); border-radius: var(--radius-xl); padding: 1.5rem; overflow: hidden; }
.tc-card--pad-lg { padding: 1.25rem; }
.tc-card--flush { padding: 0; display: flex; flex-direction: column; }             /* image/video on top, body below */
/* Banner strip across the head of a flush card: a label for the media below
   it, e.g. "Watch the breakdown ↓" over a video. Full width, so it reads as
   part of the embed rather than as a badge floating above it. The card
   already clips to its radius, so the strip picks up the rounded top. */
.tc-card__banner {
  display: flex; align-items: center; justify-content: center; gap: .5rem;
  background: hsl(var(--primary)); color: hsl(var(--primary-foreground));
  font-family: var(--font-label); font-weight: 600; font-size: .75rem;
  letter-spacing: .18em; text-transform: uppercase; text-align: center;
  padding: .6875rem 1rem;
}
.tc-card--flush > .tc-card__body { padding: 1.25rem; flex: 1; }
.tc-card--hover { transition: all .3s var(--ease-standard); }
.tc-card--hover:hover { border-color: hsl(var(--accent) / .5); transform: translateY(-.25rem); }
.tc-card--hover-soft { transition: border-color .15s var(--ease-standard); }
.tc-card--hover-soft:hover { border-color: hsl(var(--accent) / .4); }
/* Hero feature card: gold border, 5% gold wash, 2xl radius */
.tc-card--feature { border-color: hsl(var(--accent) / .3); background: hsl(var(--accent) / .05); border-radius: var(--radius-2xl); padding: 1.75rem; }
.tc-card--feature.tc-card--hover:hover { border-color: hsl(var(--accent) / .6); }
/* Solid navy (the middle "When" card; lifts out of the row on desktop) */
.tc-card--navy { background: hsl(var(--primary)); border-color: transparent; color: hsl(var(--primary-foreground)); }
.tc-card--quiet { background: hsl(var(--secondary)); }
/* 4px gold spine on the left (module list, quote card) */
.tc-card--spine { border-left: 4px solid hsl(var(--accent)); padding-left: 1.5rem; }
@media (min-width: 768px) {
  .tc-card--pad-lg { padding: 2rem; }
  .tc-card--flush > .tc-card__body { padding: 1.5rem; }
  .tc-card--feature { padding: 2.5rem; }
  .tc-card--raised { margin-block: -1rem; }
  .tc-card--spine { padding-left: 2rem; }
}

/* Ghost numeral in the corner: "01" in serif at 15% gold */
.tc-watermark { position: absolute; top: .75rem; right: 1rem; font-family: var(--font-display); font-size: 2.25rem; line-height: 1; color: hsl(var(--accent) / .15); user-select: none; pointer-events: none; }
.tc-watermark--xl { top: 1rem; right: 1.5rem; font-size: 3.75rem; }
.tc-watermark--strong { color: hsl(var(--accent) / .25); }
@media (min-width: 768px) { .tc-watermark--xl { font-size: 6rem; } }

/* Big gold numeral + hairline (the "nine outputs" cards) */
.tc-numeral { display: flex; align-items: baseline; gap: .75rem; margin-bottom: 1rem; }
.tc-numeral > b { font-family: var(--font-display); font-weight: 400; font-size: 3rem; line-height: 1; color: hsl(var(--accent)); }
.tc-numeral::after { content: ""; flex: 1; height: 1px; background: hsl(var(--border)); transition: background-color .15s; }
.tc-card:hover .tc-numeral::after { background: hsl(var(--accent) / .4); }
@media (min-width: 768px) { .tc-numeral > b { font-size: 3.75rem; } }

/* Icon holders. Icons are Lucide, stroke-width 1.5, always gold or navy. */
.tc-icon { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; color: hsl(var(--accent)); }
.tc-icon svg { width: 1.25rem; height: 1.25rem; stroke-width: 1.5; }
.tc-icon--box { width: 2.75rem; height: 2.75rem; border-radius: var(--radius-lg); border: 1px solid hsl(var(--accent) / .3); background: hsl(var(--accent) / .05); margin-bottom: 1rem; }
.tc-icon--tint { width: 2.75rem; height: 2.75rem; border-radius: var(--radius-lg); background: hsl(var(--accent) / .1); margin-bottom: 1rem; }
.tc-icon--box-lg { width: 4rem; height: 4rem; border-radius: var(--radius-xl); border: 1px solid hsl(var(--accent) / .4); background: hsl(var(--background)); }
.tc-icon--box-lg svg { width: 2rem; height: 2rem; }
.tc-icon--circle { width: 3rem; height: 3rem; border-radius: 9999px; background: hsl(var(--muted)); color: hsl(var(--primary)); margin-bottom: 1rem; }
.tc-icon--circle svg { width: 1.5rem; height: 1.5rem; }
.tc-card--navy .tc-icon--circle { background: hsl(var(--primary-foreground) / .15); color: hsl(var(--primary-foreground)); }
.tc-icon--navy { background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); border-radius: var(--radius-lg); padding: .75rem; height: fit-content; }
.tc-icon--navy svg { width: 1.5rem; height: 1.5rem; }
.vip-stage .tc-icon--circle, .tc-icon--vip { background: hsl(var(--accent) / .15); border: 1px solid hsl(var(--accent) / .35); color: hsl(var(--accent)); }
@media (min-width: 768px) {
  .tc-icon--box-lg { width: 5rem; height: 5rem; }
  .tc-icon--circle { width: 3.5rem; height: 3.5rem; margin-bottom: 1.25rem; }
  .tc-icon--circle svg { width: 1.75rem; height: 1.75rem; }
}

/* Agenda card: navy header strip with icon + serif title, checklist body */
.tc-agenda { display: flex; flex-direction: column; background: hsl(var(--card)); border: 1px solid hsl(var(--border)); border-radius: var(--radius-xl); }
.tc-agenda__head { display: flex; align-items: center; gap: .75rem; padding: 1rem 1.25rem; background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); border-radius: var(--radius-xl) var(--radius-xl) 0 0; font-family: var(--font-display); font-size: 1rem; line-height: 1.25; }
.tc-agenda__head svg { width: 1.5rem; height: 1.5rem; flex-shrink: 0; }
.tc-agenda__body { padding: 1.25rem; flex: 1; }
.tc-agenda__body > * + * { margin-top: .5rem; }
@media (min-width: 768px) { .tc-agenda__head { font-size: 1.125rem; padding: 1.25rem 1.5rem; } .tc-agenda__body { padding: 1.5rem; } }

/* Checklist row: gold 16–20px icon + muted copy */
.tc-check { display: flex; align-items: flex-start; gap: .75rem; font-size: .875rem; line-height: 1.625; color: hsl(var(--muted-foreground)); }
.tc-check svg { width: 1.25rem; height: 1.25rem; color: hsl(var(--accent)); flex-shrink: 0; margin-top: .125rem; }
.vip-stage .tc-check { color: var(--vip-soft); }
.tc-panel--navy .tc-check, .tc-section--navy .tc-check { color: hsl(var(--primary-foreground) / .8); }
@media (min-width: 768px) { .tc-check { font-size: 1rem; } }

/* Horizontal icon + text row card ("What you'll walk away with") */
.tc-row-card { display: flex; gap: 1rem; background: hsl(var(--card)); border: 1px solid hsl(var(--border)); border-radius: var(--radius-xl); padding: 1.25rem; }
@media (min-width: 768px) { .tc-row-card { gap: 1.5rem; padding: 1.75rem; } }

/* Stats: bordered strip, 2×2 → 4 across, hairline dividers */
.tc-stats { display: grid; grid-template-columns: repeat(2, 1fr); border-block: 1px solid hsl(var(--border)); }
.tc-stats > * { padding: 2.5rem 1rem; text-align: center; display: flex; flex-direction: column; align-items: center; }
.tc-stats > *:nth-child(even) { border-left: 1px solid hsl(var(--border)); }
.tc-stats > *:nth-child(n+3) { border-top: 1px solid hsl(var(--border)); }
.tc-stats b { font-family: var(--font-display); font-weight: 400; font-size: 2.25rem; line-height: 1; letter-spacing: -.025em; color: hsl(var(--foreground)); margin-bottom: .75rem; }
.tc-stats b + i { width: 1.5rem; height: 1px; background: hsl(var(--accent) / .6); margin-bottom: .75rem; }
.tc-stats small { font-family: var(--font-label); font-weight: 500; font-size: .75rem; line-height: 1.375; letter-spacing: .06em; text-transform: uppercase; color: hsl(var(--muted-foreground)); }
/* compact variant under the instructor photo: gold numerals, inside a card */
.tc-stats--card { border: 0; border-top: 1px solid hsl(var(--border)); }
.tc-stats--card > * { padding: 1rem; }
.tc-stats--card b { font-size: 1.5rem; line-height: 1.25; color: hsl(var(--accent)); margin-bottom: 0; }
@media (min-width: 768px) {
  .tc-stats { grid-template-columns: repeat(4, 1fr); }
  .tc-stats > * { padding-block: 3.5rem; }
  .tc-stats > * + * { border-left: 1px solid hsl(var(--border)); }
  .tc-stats > *:nth-child(n+3) { border-top: 0; }
  .tc-stats b { font-size: 3.75rem; }
  .tc-stats small { font-size: .875rem; }
  .tc-stats--card > * { padding: 1.5rem; }
  .tc-stats--card b { font-size: 1.875rem; }
}

/* Steps: numbered gold ring circles joined by a hairline */
.tc-steps { position: relative; display: flex; flex-direction: column; align-items: center; gap: 2rem; max-width: 48rem; margin-inline: auto; }
.tc-steps > * { position: relative; display: flex; align-items: center; gap: .75rem; flex: 1; width: 100%; max-width: 15rem; text-align: left; }  /* fixed-width rows keep the circles in one column on mobile */
.tc-step-num { width: 2.5rem; height: 2.5rem; border-radius: 9999px; border: 2px solid hsl(var(--accent)); color: hsl(var(--accent)); font-family: var(--font-display); font-size: 1.125rem; display: flex; align-items: center; justify-content: center; flex-shrink: 0; position: relative; z-index: 10; background: hsl(var(--background)); }
.tc-section--navy .tc-step-num, .tc-panel--navy .tc-step-num { background: hsl(var(--primary)); }
/* Icon in the circle instead of a numeral. Lucide glyphs, to match the live
   site's icon set; drop the bare 24x24 <svg> in and this sizes and strokes it. */
.tc-step-num--icon > svg { width: 1.25rem; height: 1.25rem; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
@media (min-width: 768px) {
  .tc-steps { flex-direction: row; align-items: stretch; gap: 0; }
  .tc-steps > * { flex-direction: column; gap: .5rem; max-width: none; text-align: center; }
  .tc-steps::before { content: ""; position: absolute; top: 1.25rem; left: 16%; right: 16%; height: 1px; background: hsl(var(--accent) / .3); }
}

/* Stacked variant: the same steps as a vertical list — circle on the left,
   copy beside it, a gold rule running down through the circles. For steps
   that are instructions to follow in order rather than a process to skim.
   Doubled class so it beats the md rules above whatever the source order. */
.tc-steps.tc-steps--stack { flex-direction: column; align-items: stretch; gap: 1.75rem; max-width: 36rem; margin-inline: 0; }
.tc-steps.tc-steps--stack > * { flex-direction: row; align-items: flex-start; gap: 1rem; max-width: none; text-align: left; }
.tc-steps.tc-steps--stack::before { content: none; }   /* no horizontal rule */
/* one connector per item, so the line stops at the last circle rather than
   running on past it to the foot of the list */
.tc-steps.tc-steps--stack > *:not(:last-child)::after {
  content: ""; position: absolute; left: 1.25rem; top: 2.5rem; bottom: -1.75rem;
  width: 1px; background: hsl(var(--accent) / .3);
}

/* Closing CTA panel: navy, 2xl radius, gold glow from the top edge */
.tc-panel--navy { position: relative; overflow: hidden; text-align: center; background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); border-radius: var(--radius-2xl); padding: 1.25rem; }
.tc-panel--navy::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(ellipse 80% 50% at 50% 0%, hsl(var(--accent) / .14), transparent 60%); }
.tc-panel--navy > * { position: relative; }
.tc-panel--navy .tc-h2 { color: hsl(var(--primary-foreground)); line-height: 1.15; text-wrap: pretty; }
.tc-panel--navy .tc-h3 { color: hsl(var(--primary-foreground)); }
/* Full-bleed variant: the same navy treatment, spotlight and inner theming,
   but as its own band rather than a card inside a light section. */
.tc-panel--navy.tc-panel--bleed { --edge-rise: 300px; border-radius: 0; overflow: visible; padding: 3.5rem 0 4rem; }
/* The spotlight has to cover the curved overhang too, or it stops dead in a
   straight line partway up the navy. Three things make that work:
   - it runs from -(--edge-rise) to the foot of the band; keep --edge-rise in
     step with .tc-edge-wave's height;
   - it moves to ::after, because the wave <svg> is a positioned child and
     would otherwise paint straight over a ::before;
   - it blends with `screen`, which lights the navy just as the normal-blend
     version did but leaves the ivory above it and the white copy below it
     untouched (screen against a near-white backdrop is a no-op), so the glow
     never reads as a gold smudge over the light section. */
.tc-panel--navy.tc-panel--bleed::before { display: none; }
.tc-panel--navy.tc-panel--bleed::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0;
  top: calc(-1 * var(--edge-rise));
  pointer-events: none; mix-blend-mode: screen;
  background:
    /* light pooling at the high point of the sweep, fading down the slope */
    radial-gradient(ellipse 62% calc(var(--edge-rise) * .8) at 76% calc(var(--edge-rise) * .06),
      hsl(var(--accent) / .3), transparent 62%),
    /* the original centred spotlight, still sitting on the band's own top edge */
    radial-gradient(ellipse 80% calc(var(--edge-rise) * .62) at 50% var(--edge-rise),
      hsl(var(--accent) / .14), transparent 62%);
}

/* Curved top edge for a full-bleed band. The shape hangs ABOVE the section
   and is filled in the BAND colour, so the band genuinely climbs into the
   section above rather than just masking its own top edge. That needs
   overflow: visible on the band, and anything it should pass behind (a video
   card, a caption) needs position + z-index above it. */
.tc-edge-wave {
  position: absolute; left: 0; bottom: 100%; width: 100%; height: 300px;
  display: block; pointer-events: none; z-index: 0;
  color: var(--edge-colour, hsl(var(--primary)));
}
@media (min-width: 640px) { .tc-panel--navy { padding: 2rem; } }
@media (min-width: 768px) { .tc-panel--navy { padding: 3.5rem; } .tc-panel--navy.tc-panel--bleed { --edge-rise: 640px; padding: 5rem 0 5.5rem; } .tc-edge-wave { height: 640px; } }

/* Seat map: a literal picture of the cohort. Filled dots are places already
   taken, hollow rings are still open, and the one with the padlock is the
   reader's own — it pulses so the eye lands on it. Set the counts in the
   markup by class; keep the aria-label on the wrapper in step with them,
   because the grid itself is decorative to a screen reader. */
.tc-seatmap {
  --seat-size: 2.25rem; --seat-gap: .625rem;
  /* the glyph inside a taken seat, as a mask so it takes currentColor */
  --seat-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='8.5' r='3.75'/%3E%3Cpath d='M4.5 20.5a7.5 7.5 0 0 1 15 0z'/%3E%3C/svg%3E");
  display: inline-flex; flex-direction: column; gap: 1.25rem;
}
.tc-seatmap__grid { display: grid; grid-template-columns: repeat(var(--seat-cols, 5), var(--seat-size));
                    gap: var(--seat-gap); list-style: none; margin: 0; padding: 0; }
.tc-seat { width: var(--seat-size); height: var(--seat-size); border-radius: 9999px;
           display: flex; align-items: center; justify-content: center; }
.tc-seat.is-taken { background: hsl(var(--foreground) / .13); color: hsl(var(--foreground) / .3); }
/* deliberately faint: the glyph is there to say "a person, not an empty seat",
   not to be read one by one */
.tc-seat.is-taken::before {
  content: ""; width: 50%; height: 50%; background: currentColor;
  -webkit-mask: var(--seat-icon) center / contain no-repeat;
          mask: var(--seat-icon) center / contain no-repeat;
}
/* Fade the map in from the side the copy sits on, so the text reads as the
   near layer and the grid emerges as the text runs out. Horizontal, so only
   apply it where the two are side by side. */
@media (min-width: 768px) {
  .tc-seatmap--fade .tc-seatmap__grid {
    -webkit-mask-image: linear-gradient(to right, transparent, #000 55%);
            mask-image: linear-gradient(to right, transparent, #000 55%);
  }
}
.tc-seat.is-open { border: 1px solid hsl(var(--accent) / .45); }
.tc-seat.is-held { border: 1px solid hsl(var(--accent) / .8); color: hsl(var(--accent));
                   animation: tc-seat-hold 1.8s var(--ease-standard) infinite; }
.tc-seat.is-held svg { width: 55%; height: 55%; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
@keyframes tc-seat-hold {
  0%, 100% { background-color: hsl(var(--accent) / .3);  box-shadow: 0 0 0 0 hsl(var(--accent) / .3); }
  55%      { background-color: hsl(var(--accent) / .02); box-shadow: 0 0 0 .5rem hsl(var(--accent) / 0); }
}
@media (prefers-reduced-motion: reduce) { .tc-seat.is-held { animation: none; background-color: hsl(var(--accent) / .3); } }
/* key: one row per state, mini dot + label */
.tc-seatmap__key { display: grid; gap: .5rem; margin: 0; font-family: var(--font-label); font-weight: 500;
                   font-size: .75rem; letter-spacing: .02em; color: hsl(var(--muted-foreground)); }
.tc-seatmap__key > span { display: flex; align-items: center; gap: .625rem; }
.tc-seatmap__key .tc-seat { --seat-size: .875rem; animation: none; }
.tc-seatmap__key .tc-seat.is-held { background-color: hsl(var(--accent) / .3); }
.tc-seatmap__key .tc-seat.is-held svg { display: none; }
/* on the dark stage and on navy panels, "taken" and the key invert */
.vip-stage .tc-seat.is-taken, .tc-panel--navy .tc-seat.is-taken, .tc-section--navy .tc-seat.is-taken { background: hsl(var(--primary-foreground) / .15); color: hsl(var(--primary-foreground) / .26); }
.vip-stage .tc-seatmap__key, .tc-panel--navy .tc-seatmap__key, .tc-section--navy .tc-seatmap__key { color: hsl(var(--primary-foreground) / .6); }

/* Progress bar on confirmation pages ("99%") */
.tc-progress { position: relative; width: 100%; max-width: 48rem; height: 1.25rem; border-radius: 9999px; background: hsl(var(--secondary)); border: 1px solid hsl(var(--border)); overflow: hidden; }
.tc-progress > i { display: block; height: 100%; border-radius: 9999px; background: hsl(var(--accent)); transition: width 1s var(--ease-standard); }
.tc-progress > span { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-family: var(--font-label); font-weight: 600; font-size: 11px; font-style: normal; color: hsl(var(--foreground)); }
.vip-stage .tc-progress { background: hsl(var(--vip-chip)); border-color: hsl(var(--accent) / .25); }
.vip-stage .tc-progress > span { color: hsl(var(--vip-heading)); }
@media (min-width: 768px) { .tc-progress { height: 1.5rem; } .tc-progress > span { font-size: .75rem; } }

/* Red urgency strip above confirmation pages */
.tc-alert-bar { width: 100%; background: hsl(var(--destructive)); color: #fff; padding-block: .75rem; text-align: center; font-family: var(--font-label); font-weight: 500; font-size: .875rem; letter-spacing: .025em; display: flex; align-items: center; justify-content: center; gap: .5rem; }

/* calm variant for "your call is confirmed" pages: navy strip, gold icon */
.tc-alert-bar--calm { background: hsl(218 46% 16%); color: hsl(var(--vip-heading)); border-bottom: 1px solid hsl(var(--accent) / .2); }
.tc-alert-bar--calm svg { color: hsl(var(--accent)); }

/* --------------------------------------------------------------------------
   9. Images
   Every photo gets a 1px border and a radius. Signature framing devices:
   offset gold outline, corner ticks, gold glow behind the hero portrait.
   -------------------------------------------------------------------------- */
.tc-img { width: 100%; object-fit: cover; border-radius: var(--radius-lg); border: 1px solid hsl(var(--border)); }
.tc-frame { position: relative; }
.tc-frame__media { position: relative; border-radius: var(--radius-2xl); overflow: hidden; border: 1px solid hsl(var(--border)); background: hsl(var(--card)); aspect-ratio: 4 / 5; }
.tc-frame__media img { width: 100%; height: 100%; object-fit: cover; object-position: top; }
/* offset outline, desktop only */
@media (min-width: 768px) { .tc-frame--offset::before { content: ""; position: absolute; top: -.75rem; left: -.75rem; width: 100%; height: 100%; border-radius: var(--radius-2xl); border: 1px solid hsl(var(--accent) / .4); } }
/* four corner ticks inside the photo */
.tc-ticks i { position: absolute; width: 1rem; height: 1rem; border: 0 solid hsl(var(--accent) / .7); z-index: 1; }
.tc-ticks i:nth-child(1) { top: .75rem; left: .75rem; border-top-width: 1px; border-left-width: 1px; }
.tc-ticks i:nth-child(2) { top: .75rem; right: .75rem; border-top-width: 1px; border-right-width: 1px; }
.tc-ticks i:nth-child(3) { bottom: .75rem; left: .75rem; border-bottom-width: 1px; border-left-width: 1px; }
.tc-ticks i:nth-child(4) { bottom: .75rem; right: .75rem; border-bottom-width: 1px; border-right-width: 1px; }

/* Hero portrait: gold radial glow behind, gold border, navy drop shadow */
.tc-portrait { position: relative; width: 68%; margin-inline: auto; }
.tc-portrait::before { content: ""; position: absolute; inset: -1.5rem; border-radius: 2rem; pointer-events: none; background: radial-gradient(ellipse at center, hsl(var(--accent) / .22), transparent 65%); }
.tc-portrait > div { position: relative; border-radius: var(--radius-2xl); overflow: hidden; border: 1px solid hsl(var(--accent) / .3); box-shadow: var(--shadow-portrait); }
.tc-portrait img { width: 100%; aspect-ratio: 5 / 6; object-fit: cover; object-position: top; }
@media (min-width: 640px) { .tc-portrait { width: 55%; } .tc-portrait img { aspect-ratio: 3 / 4; } }
@media (min-width: 768px) { .tc-portrait { width: 65%; } .tc-portrait::before { inset: -2rem; } }

/* Hero: 45/55 split, looping b-roll fills the left 35% at 65% opacity */
.tc-hero { position: relative; overflow: hidden; background: hsl(var(--background)); padding-top: 46px; }  /* clears the fixed countdown bar */
.tc-hero__video { display: none; }
.tc-hero__grid { display: grid; align-items: center; }
.tc-hero__copy { display: flex; flex-direction: column; align-items: center; text-align: center; margin-top: .75rem; }
@media (min-width: 768px) {
  .tc-hero { padding-top: 56px; }
  .tc-hero__video { display: block; position: absolute; top: 0; bottom: 0; left: 0; width: 35%; overflow: hidden; }
  .tc-hero__video video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
  .tc-hero__video::after { content: ""; position: absolute; inset: 0; background: hsl(var(--background) / .35); }
  .tc-hero__grid { grid-template-columns: 45% 55%; padding-block: 4rem; position: relative; z-index: 10; }
  .tc-hero__copy { align-items: flex-start; text-align: left; padding-left: 2.5rem; margin-top: 0; }
}
@media (min-width: 1024px) { .tc-hero__copy { padding-left: 3.5rem; } }

/* Full-bleed photo band between sections */
.tc-band { width: 100%; height: 26vh; object-fit: cover; }
@media (min-width: 768px) { .tc-band { height: 35vh; object-position: right 70%; } }

/* Press logo marquee: navy band, gold hairlines, edge fade, 120s loop.
   Duplicate the logo set once inside .tc-marquee__track so -50% loops clean. */
@keyframes scroll-left { 0% { transform: translate(0); } to { transform: translate(-50%); } }
.tc-marquee { width: 100%; background: hsl(var(--primary)); padding-block: 2rem; overflow: hidden; border-block: 1px solid hsl(var(--accent) / .15); }
.tc-marquee__label { display: flex; align-items: center; justify-content: center; gap: .75rem; margin-bottom: 1.25rem; font-family: var(--font-label); font-weight: 600; font-size: 11px; letter-spacing: .28em; text-transform: uppercase; color: hsl(var(--accent)); }
.tc-marquee__label::before, .tc-marquee__label::after { content: ""; width: 2rem; height: 1px; background: hsl(var(--accent) / .4); }
.tc-marquee__mask { -webkit-mask-image: linear-gradient(to right, transparent, black 8%, black 92%, transparent); mask-image: linear-gradient(to right, transparent, black 8%, black 92%, transparent); }
.tc-marquee__track { display: flex; align-items: center; white-space: nowrap; width: max-content; animation: scroll-left 120s linear infinite; }
.tc-marquee__track img { height: 2rem; width: auto; max-width: none; margin-inline: 1.5rem; opacity: .7; flex-shrink: 0; object-fit: contain; transition: opacity .15s; }
.tc-marquee__track img:hover { opacity: 1; }
@media (min-width: 640px) { .tc-marquee { padding-block: 2.5rem; } .tc-marquee__track img { height: 3rem; margin-inline: 2.5rem; } }
@media (min-width: 768px) { .tc-marquee__track img { height: 4rem; } }

/* Photo ticker: full-bleed row of bordered photos, same loop + edge fade as
   the press marquee. Write the tiles ONCE; duplicate them with JS (see
   funnel/free-training.html) so translate(-50%) loops seamlessly. Tiles use
   margin, not gap, so the two halves are exactly equal. Pauses on hover. */
.tc-ticker { width: 100%; overflow: hidden; -webkit-mask-image: linear-gradient(to right, transparent, black 6%, black 94%, transparent); mask-image: linear-gradient(to right, transparent, black 6%, black 94%, transparent); }
.tc-ticker__track { display: flex; width: max-content; animation: scroll-left var(--ticker-duration, 60s) linear infinite; }
.tc-ticker:hover .tc-ticker__track { animation-play-state: paused; }
.tc-ticker--nopause:hover .tc-ticker__track { animation-play-state: running; }   /* keep rolling under the cursor */
.tc-ticker__item { flex-shrink: 0; width: 13.5rem; margin-inline: .5rem; border: 1px solid hsl(var(--border)); border-radius: var(--radius-xl); overflow: hidden; background: hsl(var(--card)); }
.tc-ticker__item img, .tc-ticker__item .tc-placeholder { width: 100%; aspect-ratio: 4 / 5; object-fit: cover; object-position: top; }
.tc-ticker__item figcaption { padding: .75rem 1rem; border-top: 1px solid hsl(var(--border)); text-align: center; }
.tc-ticker__item figcaption b { display: block; font-family: var(--font-label); font-weight: 600; font-size: .9375rem; line-height: 1.25; color: hsl(var(--foreground)); }
.tc-ticker__item figcaption small { display: block; font-size: .75rem; line-height: 1.375; color: hsl(var(--muted-foreground)); margin-top: .125rem; }
.vip-stage .tc-ticker__item, .tc-panel--navy .tc-ticker__item { background: linear-gradient(180deg, #16243c, #111b2d); border-color: hsl(var(--accent) / .35); }
.vip-stage .tc-ticker__item figcaption, .tc-panel--navy .tc-ticker__item figcaption { border-top-color: hsl(var(--accent) / .18); }
.vip-stage .tc-ticker__item figcaption b, .tc-panel--navy .tc-ticker__item figcaption b { color: hsl(var(--vip-heading)); }
.vip-stage .tc-ticker__item figcaption small, .tc-panel--navy .tc-ticker__item figcaption small { color: var(--vip-muted); }
/* compact variant, e.g. running under a CTA band */
.tc-ticker--sm .tc-ticker__item { width: 8.5rem; margin-inline: .375rem; }
.tc-ticker--sm .tc-ticker__item figcaption { padding: .5rem .625rem; }
.tc-ticker--sm .tc-ticker__item figcaption b { font-size: .8125rem; }
.tc-ticker--sm .tc-ticker__item figcaption small { font-size: .6875rem; }
@media (min-width: 768px) { .tc-ticker__item { width: 17.5rem; margin-inline: .75rem; } .tc-ticker--sm .tc-ticker__item { width: 10.5rem; margin-inline: .5rem; } }
/* Landscape variant: 16:9 crops and wider tiles, for photo sets that are
   group shots or screenshots rather than headshots. Captions go left, which
   is what reads correctly under a wide tile — a centred name under a 16:9
   crop floats. Must stay after the --sm rules: same specificity, later wins. */
.tc-ticker--landscape .tc-ticker__item { width: 17rem; }
.tc-ticker--landscape .tc-ticker__item img, .tc-ticker--landscape .tc-ticker__item .tc-placeholder { aspect-ratio: 16 / 9; object-position: center; }
.tc-ticker--landscape .tc-ticker__item figcaption { text-align: left; }
.tc-ticker--landscape.tc-ticker--sm .tc-ticker__item { width: 13.5rem; }
@media (min-width: 768px) {
  .tc-ticker--landscape .tc-ticker__item { width: 22rem; }
  .tc-ticker--landscape.tc-ticker--sm .tc-ticker__item { width: 16.5rem; }
}

/* Empty media slot (the live site's own placeholder: muted fill, faint caps label) */
.tc-placeholder { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .5rem; background: hsl(var(--muted)); color: hsl(var(--muted-foreground) / .5); font-family: var(--font-label); font-weight: 500; font-size: .875rem; letter-spacing: .05em; text-transform: uppercase; user-select: none; text-align: center; padding: 1rem; }
.tc-placeholder svg { width: 2.5rem; height: 2.5rem; stroke-width: 1.5; }
.tc-placeholder--ghost { background: transparent; }   /* label only, so a .tc-skeleton behind it stays visible */
.vip-stage .tc-placeholder, .tc-panel--navy .tc-placeholder { background: hsl(var(--vip-inset)); color: hsl(var(--vip-heading) / .4); }

/* Testimonial video card: five gold stars above a 16:9 well */
.tc-stars { display: flex; justify-content: center; gap: .25rem; padding: 1rem 1.25rem; color: hsl(var(--accent)); }
.tc-stars svg { width: 1rem; height: 1rem; fill: currentColor; }
.tc-video-well { position: relative; width: 100%; aspect-ratio: 16 / 9; background: hsl(var(--muted)); }
/* The well is what shows through a player's own rounded corners, so on dark
   surfaces it has to be a dark inset — the light `muted` default reads as a
   white halo around the video. */
.vip-stage .tc-video-well, .tc-panel--navy .tc-video-well, .tc-section--navy .tc-video-well { background: hsl(var(--vip-inset)); }
.tc-video-well > iframe, .tc-video-well > video, .tc-video-well > wistia-player { position: absolute; inset: 0; width: 100%; height: 100%; }
/* Wistia: until its custom element is defined the tile would be an empty box,
   so show the media's own blurred swatch in the meantime — the live site does
   exactly this. Set the URL per player:
   style="--swatch:url('https://fast.wistia.com/embed/medias/ID/swatch')" */
wistia-player:not(:defined) { display: block; padding-top: 56.25%; filter: blur(5px); background: center / contain no-repeat var(--swatch); }
/* Fade the embed in over the skeleton once it is actually ready, rather than
   revealing the whole well on scroll. Needs the hook in the markup:
   <iframe ... onload="this.classList.add('is-loaded')"> */
.tc-video-well > iframe:not(.is-loaded) { opacity: 0; }
.tc-video-well > iframe { transition: opacity .4s ease-out; }

/* Skeleton loader: a grey block with a white shimmer crossing it at a steady
   interval while something slow is still arriving. Put the class ON the
   container (background + one pseudo-element, nothing else) and let the real
   <iframe>/<img> sit above it — the embed simply covers it once it paints, so
   there is nothing to switch off. The sweep is a ::before, i.e. the FIRST
   positioned child, so it passes behind the embed and behind a
   .tc-placeholder--ghost label rather than over the top of them.
   The keyframes finish the travel at 55% and hold, which is what gives the
   pause between passes. */
.tc-skeleton { position: relative; overflow: hidden; background: hsl(var(--muted)); }
.tc-skeleton::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(90deg, transparent 15%, hsl(0 0% 100% / .8) 50%, transparent 85%);
  transform: translateX(-100%);
  animation: tc-skeleton-sweep 1.6s var(--ease-standard) infinite;
}
@keyframes tc-skeleton-sweep { 0% { transform: translateX(-100%); } 55%, 100% { transform: translateX(100%); } }
.vip-stage .tc-skeleton, .tc-panel--navy .tc-skeleton, .tc-section--navy .tc-skeleton { background: hsl(var(--vip-inset)); }
.vip-stage .tc-skeleton::before, .tc-panel--navy .tc-skeleton::before, .tc-section--navy .tc-skeleton::before { background: linear-gradient(90deg, transparent 15%, hsl(0 0% 100% / .07) 50%, transparent 85%); }
@media (prefers-reduced-motion: reduce) { .tc-skeleton::before { display: none; } }

/* --------------------------------------------------------------------------
   10. Countdown
   -------------------------------------------------------------------------- */
.tc-topbar { position: fixed; top: 0; left: 0; right: 0; z-index: 9999; background: hsl(var(--primary)); border-bottom: 1px solid hsl(var(--accent) / .3); padding-block: .375rem; }
.tc-topbar__inner { display: flex; align-items: center; justify-content: center; gap: .5rem; text-align: center; font-family: var(--font-label); font-weight: 500; font-size: 11px; letter-spacing: .025em; color: hsl(var(--primary-foreground) / .9); }
.tc-topbar__time { display: flex; align-items: center; gap: .25rem; font-weight: 600; font-variant-numeric: tabular-nums; font-size: 13px; color: hsl(var(--accent)); flex-shrink: 0; }
/* sticky rather than fixed: it keeps its place in the flow, so the page below
   needs no top padding to clear it. Use on pages without a .tc-hero. */
.tc-topbar.tc-topbar--sticky { position: sticky; transition: transform .4s var(--ease-standard); }
/* Add .is-tucked (see the free-training page script) to slide the bar back up
   out of view once the reader reaches the closing CTA — the offer is on screen
   in full by then, so the reminder is just clutter. */
.tc-topbar.is-tucked { transform: translateY(-101%); }
@media (prefers-reduced-motion: reduce) { .tc-topbar.tc-topbar--sticky { transition: none; } }
.tc-topbar__inner { flex-wrap: wrap; row-gap: .25rem; }   /* promo bars carry more than a countdown; let them wrap on small screens */
/* Pair with .cta-shimmer in the markup so it is the real CTA in miniature:
   same gradient, border, shadow, shimmer, hover lift, active squash and
   --radius-lg corners. This class only resizes it. */
.tc-topbar__cta {
  flex-shrink: 0; white-space: nowrap; border-radius: var(--radius-lg);
  padding: .1875rem .625rem; font-weight: 600; font-size: 11px;
}
.tc-topbar__cta > span { position: relative; z-index: 10; }   /* keeps the label above the shimmer sweep */
/* Promo variant: plain white digits run tight like a clock (the boxed gold
   ones above are the live site's), a gold all-caps lead-in, bigger bar + pill.
   NOTE: white on the gold pill is ~2.3:1. Below AA — deliberate, Will's call. */
.tc-topbar--promo { padding-block: .625rem; }
.tc-topbar--promo .tc-topbar__inner { font-size: 13px; gap: 1.25rem; }
.tc-topbar--promo .tc-topbar__time { color: hsl(var(--primary-foreground)); font-size: 15px; gap: .0625rem; }
.tc-topbar--promo .tc-topbar__time b { background: none; border: 0; padding: 0; border-radius: 0; }
.tc-topbar--promo .tc-topbar__time i { color: hsl(var(--primary-foreground) / .5); }
.tc-topbar--promo .tc-topbar__cta { color: var(--cta-ink); font-size: 13px; padding: .375rem 1rem; }
.tc-topbar__lead { color: hsl(var(--accent)); text-transform: uppercase; letter-spacing: .1em; font-weight: 600; }
@media (max-width: 639px) { .tc-topbar__long { display: none; } }   /* trims the middle clause so the bar stays one line */
.tc-topbar__time b { font-weight: 600; background: hsl(var(--accent) / .15); border: 1px solid hsl(var(--accent) / .4); padding: .125rem .375rem; border-radius: .25rem; }
.tc-topbar__time i { font-style: normal; color: hsl(var(--accent) / .5); }
@media (min-width: 640px) { .tc-topbar { padding-block: .625rem; } .tc-topbar__inner, .tc-topbar__time { font-size: .875rem; gap: .75rem; } .tc-topbar__cta { font-size: 12px; padding: .25rem .75rem; } }
@media (min-width: 768px) { .tc-topbar { padding-block: .75rem; } .tc-topbar__inner, .tc-topbar__time { font-size: 1rem; } .tc-topbar__cta { font-size: 13px; padding: .3125rem .875rem; } }
@media (min-width: 640px) {
  .tc-topbar--promo { padding-block: .75rem; }
  .tc-topbar--promo .tc-topbar__inner { font-size: 14px; gap: 2rem; }
  .tc-topbar--promo .tc-topbar__time { font-size: 17px; }
  .tc-topbar--promo .tc-topbar__cta { font-size: 14px; padding: .4375rem 1.125rem; }
}
@media (min-width: 768px) {
  .tc-topbar--promo { padding-block: .875rem; }
  .tc-topbar--promo .tc-topbar__inner { font-size: 15px; gap: 2.5rem; }
  .tc-topbar--promo .tc-topbar__time { font-size: 19px; }
  .tc-topbar--promo .tc-topbar__cta { font-size: 15px; padding: .5rem 1.25rem; }
}

/* Large tiles inside the navy CTA panel */
.tc-countdown { display: flex; align-items: center; justify-content: center; gap: .375rem; margin-bottom: 1rem; }
.tc-countdown > * { display: flex; flex-direction: column; align-items: center; }
.tc-countdown b { font-family: var(--font-label); font-weight: 600; font-variant-numeric: tabular-nums; font-size: 1rem; padding: .5rem .625rem; border-radius: var(--radius-lg); background: hsl(var(--primary-foreground) / .1); border: 1px solid hsl(var(--accent) / .25); color: hsl(var(--accent)); }
.tc-countdown small { font-family: var(--font-label); font-weight: 500; font-size: 10px; text-transform: uppercase; letter-spacing: .05em; margin-top: .25rem; color: hsl(var(--primary-foreground) / .5); }
@media (min-width: 768px) { .tc-countdown { gap: .75rem; } .tc-countdown b { font-size: 1.5rem; padding-inline: 1rem; } .tc-countdown small { font-size: .75rem; } }
/* Inline variant: drops the digit boxes and the unit labels so the clock can
   run inside a line of text — beside an eyebrow, say. Inherits colour and
   size from that text, the way the promo bar's countdown does. */
.tc-countdown--inline { display: inline-flex; gap: .0625rem; margin-bottom: 0; letter-spacing: normal; }
.tc-countdown--inline > * { display: inline; }
.tc-countdown--inline b { font-size: inherit; font-weight: 700; padding: 0; border: 0; border-radius: 0; background: none; color: inherit; }
.tc-countdown--inline i { font-style: normal; opacity: .45; }

/* --------------------------------------------------------------------------
   11. FAQ — verbatim from the site (light), plus the VIP variant
   -------------------------------------------------------------------------- */
.tc-faq { display: flex; flex-direction: column; gap: .75rem; }
.faq-border { border: 1px solid hsl(var(--border)); border-radius: 14px; transition: border-color .2s ease; }
.faq-border:hover { border-color: hsl(var(--accent) / .4); }
.faq-border[data-state=open] { border-color: hsl(var(--accent) / .5); }
.faq-inner { background: hsl(var(--card)); border-radius: 12.5px; overflow: hidden; }
.faq-border[data-state=open] .faq-q-text { color: hsl(var(--primary)); }
.faq-q { width: 100%; padding: 1rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; text-align: left; border-radius: var(--radius-xl); }
.faq-q:focus-visible { outline: 2px solid hsl(var(--primary)); outline-offset: 2px; }
.faq-q-text { font-family: var(--font-label); font-weight: 500; font-size: .9375rem; line-height: 1.375; color: hsl(var(--foreground)); transition: color .2s; }
.faq-icon-box { flex-shrink: 0; width: 30px; height: 30px; border-radius: 8px; background: hsl(var(--primary) / .06); display: flex; align-items: center; justify-content: center; color: hsl(var(--primary)); }
.faq-icon-box svg { width: .875rem; height: .875rem; }
.faq-border[data-state=open] .faq-icon-box { background: hsl(var(--primary) / .1); }
.faq-a { max-height: 0; overflow: hidden; transition: max-height .4s var(--ease-standard); }
.faq-border[data-state=open] .faq-a { max-height: 500px; }
.faq-a > div { padding: 1rem 1rem 1.25rem; border-top: 1px solid hsl(var(--border)); font-size: .9375rem; line-height: 1.625; color: hsl(var(--muted-foreground)); }
@media (min-width: 768px) { .faq-q { padding: 1.25rem 1.5rem; } .faq-q-text, .faq-a > div { font-size: 1rem; } .faq-a > div { padding-inline: 1.5rem; } }
/* On navy: FAQ items are .vip-card, chevron rotates 180°, body uses the
   grid-rows 0fr→1fr trick over .3s instead of max-height. */
.vip-stage .faq-border { border: 0; }
.vip-stage .faq-inner { background: transparent; }
.vip-stage .faq-q-text, .vip-stage .faq-border[data-state=open] .faq-q-text { color: hsl(var(--vip-heading)); }
.vip-stage .faq-icon-box { background: transparent; color: hsl(var(--accent)); transition: transform .3s; }
.vip-stage .faq-border[data-state=open] .faq-icon-box { transform: rotate(180deg); background: transparent; }
.vip-stage .faq-a > div { border-top: 0; padding-top: 0; color: var(--vip-soft); }

/* --------------------------------------------------------------------------
   12. Timeline ("My Story") — centre spine, diamond nodes, alternating sides
   -------------------------------------------------------------------------- */
.tc-timeline { position: relative; }
.tc-timeline::before { content: ""; position: absolute; left: 1rem; top: 0; bottom: 0; width: 1px; background: hsl(var(--border)); }
.tc-timeline__progress { position: absolute; left: 1rem; top: 0; width: 1px; background: hsl(var(--accent)); z-index: 1; }  /* height driven by scroll */
.tc-timeline__item { position: relative; padding: 0 1rem 2.5rem 2.5rem; }
.tc-timeline__item > .tc-diamond { position: absolute; left: 1rem; top: 1.25rem; transform: translateX(-50%) rotate(45deg); border: 2px solid hsl(var(--background)); z-index: 10; }
.vip-stage .tc-timeline::before { background: hsl(var(--accent) / .2); }
.vip-stage .tc-timeline__item > .tc-diamond { border-color: hsl(var(--vip-inset)); }
@media (min-width: 768px) {
  .tc-timeline::before, .tc-timeline__progress, .tc-timeline__item > .tc-diamond { left: 50%; }
  .tc-timeline__item { display: flex; padding: 0 0 5rem; }
  .tc-timeline__item > .tc-diamond { top: 2.25rem; }
  .tc-timeline__item > div { width: 50%; padding-inline: 1.5rem; }
  .tc-timeline__item:nth-child(even) { flex-direction: row-reverse; }
}

/* --------------------------------------------------------------------------
   13. Dark "VIP stage" theme — verbatim from the site
   -------------------------------------------------------------------------- */
.vip-stage {
  background:
    radial-gradient(ellipse 80% 50% at 50% 0%, hsl(var(--accent) / .1), transparent 60%),
    radial-gradient(ellipse 60% 40% at 50% 100%, hsl(var(--accent) / .06), transparent 60%),
    linear-gradient(180deg, #111b2d, #0c1422);
  color: #f1ede4;
  position: relative;
  min-height: 100vh;
}
/* faint 56px gold grid, masked to fade out from the upper centre */
.vip-stage::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background-image: linear-gradient(hsl(var(--accent) / .04) 1px, transparent 1px), linear-gradient(90deg, hsl(var(--accent) / .04) 1px, transparent 1px);
  background-size: 56px 56px;
  -webkit-mask-image: radial-gradient(ellipse 80% 60% at 50% 30%, black 30%, transparent 80%);
  mask-image: radial-gradient(ellipse 80% 60% at 50% 30%, black 30%, transparent 80%);
}
.vip-stage > * { position: relative; z-index: 10; }
/* Brand-blue backdrop: the same dark theming, but the stage sits at --primary
   rather than the near-black VIP navy. For pages that should read as the
   brand colour rather than as a premium stage. */
.vip-stage--brand { background:
    radial-gradient(ellipse 80% 50% at 50% 0%, hsl(var(--accent) / .12), transparent 60%),
    radial-gradient(ellipse 60% 40% at 50% 100%, hsl(var(--accent) / .07), transparent 60%),
    linear-gradient(180deg, hsl(var(--primary)), hsl(218 46% 16%)); }

/* Base components on the dark stage. The theme covers its own furniture
   (.vip-card, FAQ, timeline) but these are the light-theme parts that a
   fully dark page still reaches for. */
.vip-stage .tc-card, .tc-panel--navy .tc-card, .tc-section--navy .tc-card { background: linear-gradient(180deg, #16243c, #111b2d); border-color: hsl(var(--accent) / .28); }
.vip-stage .tc-section--alt { background: hsl(0 0% 100% / .035); }
.vip-stage .tc-section--tint { background: hsl(var(--accent) / .05); border-block-color: hsl(var(--accent) / .18); }
.vip-stage .tc-section--divided { border-top-color: hsl(var(--accent) / .18); }
/* the circles sit over the connecting rule, so they need an opaque fill that
   matches the stage behind them rather than the light theme's --background */
.vip-stage .tc-step-num { background: #111b2d; }
.vip-stage--brand .tc-step-num { background: hsl(var(--primary)); }
/* Navy-on-navy would vanish. A gold wash won't do it either — at any alpha
   that stays subtle, gold over a blue base reads grey — so the label itself
   goes gold over a faint wash and a gold hairline. */
.vip-stage .tc-card__banner { background: hsl(var(--accent) / .08); color: hsl(var(--accent)); border-bottom: 1px solid hsl(var(--accent) / .25); }

.vip-card {
  background: linear-gradient(180deg, #16243c, #111b2d);
  border: 1px solid hsl(var(--accent) / .35);
  box-shadow: var(--shadow-vip-card);
  transition: border-color .25s ease, transform .25s ease;
  border-radius: var(--radius-lg);
}
.vip-card:hover { border-color: hsl(var(--accent) / .55); }
/* glassier variant for the main feature / video / letter */
.vip-card-feature {
  background: linear-gradient(180deg, #17263fd9, #121d30d9);
  border: 1px solid hsl(var(--accent) / .25);
  box-shadow: 0 1px hsl(var(--accent) / .15) inset, 0 30px 60px -30px #06090f99;
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border-radius: var(--radius-lg);
}
/* gold hairline along a card's top edge */
.tc-topline::before { content: ""; position: absolute; top: 0; left: 50%; transform: translateX(-50%); width: 8rem; height: 1px; background: linear-gradient(to right, transparent, hsl(var(--accent) / .5), transparent); }
/* gold gradient text (VIP modal title) */
.tc-gold-text { background: linear-gradient(180deg, hsl(44 75% 65%) 0%, hsl(44 55% 50%) 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }
/* DQ-page panels: softer, rounder, white hairline instead of gold */
.tc-panel--dq { background: #10233b; border: 1px solid rgb(255 255 255 / .08); border-radius: var(--radius-3xl); padding: 1.75rem; box-shadow: 0 30px 80px -30px rgb(0 0 0 / .6), 0 0 60px -20px hsl(var(--accent) / .08); color: #c9d1dc; font-size: 17px; line-height: 1.6; }
.tc-panel--dq.is-primary { border-color: hsl(var(--accent) / .55); box-shadow: 0 20px 60px -25px rgb(0 0 0 / .55), 0 0 40px -15px hsl(var(--accent) / .15); }
/* Monogram seal */
/* an SVG dropped into a seal instead of a letter — e.g. a tick to mark a
   completed step at the top of a confirmation page */
.tc-seal svg { width: 45%; height: 45%; fill: none; stroke: currentColor; stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; }
.tc-seal { letter-spacing: normal; display: inline-flex; align-items: center; justify-content: center; width: 4rem; height: 4rem; border-radius: 9999px; border: 1px solid hsl(var(--accent) / .5); background: hsl(var(--accent) / .08); font-family: var(--font-display); font-style: italic; font-size: 1.5rem; line-height: 1; color: hsl(var(--accent)); }

/* --------------------------------------------------------------------------
   14. Chrome: sticky CTA, modal, footer, forms, legal
   -------------------------------------------------------------------------- */
/* Mobile sticky CTA: slides up after the hero scrolls away */
.tc-sticky-cta { position: fixed; bottom: 0; left: 0; right: 0; z-index: 50; padding: .75rem; padding-bottom: max(.75rem, env(safe-area-inset-bottom)); background: hsl(var(--card)); border-top: 1px solid hsl(var(--border)); transform: translateY(100%); transition: transform .3s var(--ease-standard); }
.tc-sticky-cta.is-visible { transform: translateY(0); }
.tc-sticky-cta .tc-btn { display: block; margin-inline: auto; padding-block: .875rem; font-size: 1.0625rem; }

/* Modal: full-screen sheet on mobile, 32rem card on ≥640. Overlay black/80. */
.tc-overlay { position: fixed; inset: 0; z-index: 10000; background: rgb(0 0 0 / .8); }
.tc-modal { position: fixed; z-index: 10000; inset: 0; display: flex; flex-direction: column; background: hsl(var(--card)); }
.tc-modal__head { padding: 1.25rem 1.5rem .75rem; border-bottom: 1px solid hsl(var(--border)); flex-shrink: 0; }
.tc-modal__title { letter-spacing: normal; font-family: var(--font-display); font-style: italic; font-size: 1.5rem; line-height: 1.25; padding-right: 3rem; }
.tc-modal__body { flex: 1; overflow-y: auto; overscroll-behavior: contain; padding: .75rem 1rem 1.25rem; -webkit-overflow-scrolling: touch; }
.tc-modal__close { position: absolute; right: .75rem; top: .75rem; z-index: 10001; width: 2.5rem; height: 2.5rem; border-radius: 9999px; display: flex; align-items: center; justify-content: center; background: hsl(var(--foreground) / .9); color: hsl(var(--background)); box-shadow: var(--shadow-badge); }
/* The author `display` above beats the UA rule for [hidden], so say it here.
   Toggling `hidden` is then all a plain-HTML page needs to open and close. */
.tc-overlay[hidden], .tc-modal[hidden] { display: none; }
.tc-overlay:not([hidden]), .tc-modal:not([hidden]) { animation: tc-modal-in .2s var(--ease-standard); }
@keyframes tc-modal-in { from { opacity: 0; } }
body.tc-modal-open { overflow: hidden; }   /* stops the page scrolling behind the sheet */
/* Brand-blue variant: the same sheet in --primary rather than card ivory, for
   a pop-up that has to feel like part of the navy CTA it opened from. */
.tc-modal--navy { background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); border-color: hsl(var(--accent) / .25); }
.tc-modal--navy .tc-modal__head { border-bottom-color: hsl(var(--accent) / .2); }
.tc-modal--navy .tc-modal__title { color: hsl(var(--primary-foreground)); }
.tc-modal--navy .tc-modal__close { background: hsl(var(--accent) / .15); color: hsl(40 30% 88%); border: 1px solid hsl(var(--accent) / .3); box-shadow: none; }
.tc-modal--navy .tc-label { color: hsl(var(--primary-foreground)); }
.tc-modal--navy .tc-input { background: hsl(218 46% 15%); border-color: hsl(var(--accent) / .25); color: hsl(var(--primary-foreground)); }
.tc-modal--navy .tc-input::placeholder { color: hsl(var(--primary-foreground) / .4); }
.tc-modal--navy .tc-h3 { color: hsl(var(--primary-foreground)); }
/* Full-screen sheet on mobile: close button goes top-LEFT (thumb side, and it
   stops it colliding with the notch area), and the body stretches so the form
   fills the screen instead of sitting as a small block at the top. */
@media (max-width: 639px) {
  .tc-modal { height: 100dvh; }
  .tc-modal__close { left: .75rem; right: auto; }
  .tc-modal__title { padding-right: 0; padding-left: 3rem; }
  .tc-modal__body { display: flex; flex-direction: column; }
  .tc-modal__body > form { display: flex; flex-direction: column; flex: 1; }
  .tc-modal__body > form > [type="submit"] { margin-top: auto; }
}
.tc-modal--vip { background: linear-gradient(180deg, hsl(218 46% 10%) 0%, hsl(218 46% 7%) 100%); border-color: hsl(var(--accent) / .25); box-shadow: 0 25px 60px -15px hsl(218 46% 4% / .8), 0 0 0 1px hsl(var(--accent) / .08) inset; color: hsl(var(--vip-heading-soft)); }
.tc-modal--vip .tc-modal__head { border-bottom-color: hsl(var(--accent) / .2); }
.tc-modal--vip .tc-modal__body { background: hsl(var(--vip-inset-deep)); }
.tc-modal--vip .tc-modal__close { background: hsl(var(--accent) / .15); color: hsl(40 30% 88%); border: 1px solid hsl(var(--accent) / .3); }
@media (min-width: 640px) {
  .tc-modal { inset: auto; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 100%; max-width: 32rem; max-height: 90vh; border-radius: var(--radius-lg); border: 1px solid hsl(var(--border)); }
  .tc-modal__title { font-size: 1.875rem; }
  .tc-modal__body { padding-inline: 1.5rem; }
}

/* Inputs (shadcn defaults, themed) and the gold toggle */
.tc-input { display: flex; height: 2.5rem; width: 100%; border-radius: var(--radius-md); border: 1px solid hsl(var(--input)); background: hsl(var(--background)); padding: .5rem .75rem; font: inherit; font-size: 1rem; color: inherit; }
.tc-input::placeholder { color: hsl(var(--muted-foreground)); }
.tc-input:focus-visible { outline: 2px solid hsl(var(--ring)); outline-offset: 2px; }
/* Field: label stacked over an input. Wrap the pair in the <label> itself so
   no id/for plumbing is needed. Inputs run taller here than the shadcn
   default — this is a conversion form, not a settings panel. */
.tc-field { display: block; text-align: left; }
.tc-field + .tc-field { margin-top: 1rem; }
.tc-field .tc-input { height: 2.75rem; }
.tc-label { display: block; font-family: var(--font-label); font-weight: 600; font-size: .8125rem; letter-spacing: .02em; color: hsl(var(--foreground)); margin-bottom: .375rem; }
.tc-field .tc-input:user-invalid { border-color: hsl(var(--destructive)); }
.vip-stage .tc-label { color: hsl(var(--vip-heading)); }
.vip-stage .tc-input { background: hsl(var(--vip-inset)); border-color: hsl(var(--accent) / .25); color: hsl(var(--vip-heading-soft)); }
.tc-toggle { position: relative; width: 2.75rem; height: 1.5rem; background: hsl(var(--secondary)); border: 1px solid hsl(var(--border)); border-radius: 9999px; transition: background-color .15s; }
.tc-toggle::after { content: ""; position: absolute; top: 2px; left: 2px; width: 1.25rem; height: 1.25rem; border-radius: 9999px; background: hsl(var(--background)); border: 1px solid hsl(var(--border)); transition: transform .15s var(--ease-standard); }
input:checked + .tc-toggle { background: hsl(var(--accent)); }
input:checked + .tc-toggle::after { transform: translateX(1.25rem); }

/* Footer: hairline top, centred, tiny */
.tc-footer { margin-top: 5rem; padding: 2.5rem 0 6rem; border-top: 1px solid hsl(var(--border)); text-align: center; }  /* pb-24 clears the sticky CTA */
.tc-footer > * + * { margin-top: 1.5rem; }
.tc-footer__copy { font-size: .875rem; font-weight: 500; color: hsl(var(--muted-foreground)); }
.tc-footer__links { display: flex; flex-wrap: wrap; justify-content: center; gap: 1rem; font-size: .75rem; color: hsl(var(--muted-foreground)); }
.tc-footer__links a { transition: color .15s; }
.tc-footer__links a:hover { color: hsl(var(--foreground)); }
.tc-footer__legal { font-size: .75rem; line-height: 1.625; color: hsl(var(--muted-foreground) / .6); max-width: 42rem; margin-inline: auto; }
/* Navy footer: for pages that close on a navy band, so the small print reads
   as the foot of that block rather than dropping the page back to ivory. */
.tc-footer--navy { background: hsl(var(--primary)); border-top: 0; }
.tc-footer--navy .tc-footer__copy, .tc-footer--navy .tc-footer__links { color: hsl(var(--primary-foreground) / .6); }
.tc-footer--navy .tc-footer__links a:hover { color: hsl(var(--accent)); }
.tc-footer--navy .tc-footer__legal { color: hsl(var(--primary-foreground) / .4); }
.vip-stage .tc-footer { border-top: 0; margin-top: 0; padding-block: 2rem; }
.vip-stage .tc-footer__copy, .vip-stage .tc-footer__links { color: #c9c2b6; font-size: .75rem; font-weight: 400; }
.vip-stage .tc-footer__links a:hover { color: hsl(var(--accent)); }
@media (min-width: 768px) { .tc-footer { margin-top: 7rem; } }

/* Legal pages: 640–720px column, navy serif headings, grey body */
.tc-prose { max-width: 720px; margin-inline: auto; padding: 3rem 1.25rem; font-size: .875rem; }
.tc-prose h1 { font-family: var(--font-display); font-size: 1.875rem; color: hsl(var(--primary)); margin-bottom: .5rem; }
.tc-prose h2 { font-family: var(--font-display); font-size: 1.25rem; color: hsl(var(--primary)); margin: 2rem 0 .75rem; }
.tc-prose h3 { font-family: var(--font-display); font-size: 1rem; color: hsl(var(--primary)); margin: 1.5rem 0 .5rem; }
.tc-prose p, .tc-prose ul { color: hsl(var(--muted-foreground)); margin-bottom: 1rem; line-height: 1.625; }
.tc-prose ul { list-style: disc; padding-left: 1.25rem; }
.tc-prose li { margin-bottom: .25rem; }
.tc-prose a { color: hsl(var(--accent)); }
.tc-prose a:hover { color: hsl(var(--accent) / .8); }

/* --------------------------------------------------------------------------
   15. Motion
   Scroll reveal on the live site is framer-motion:
     sections  opacity 0→1, y 10→0, .4s easeOut, once, viewport margin -60px
     cards     opacity 0→1, y 20→0, .5s easeOut, once
   CSS equivalent below; toggle .is-visible with the IntersectionObserver
   snippet in DESIGN.md.
   -------------------------------------------------------------------------- */
.tc-reveal { opacity: 0; transform: translateY(var(--reveal-distance)); transition: opacity var(--reveal-duration) ease-out, transform var(--reveal-duration) ease-out; transition-delay: var(--reveal-delay, 0s); }
.tc-reveal--card { --reveal-distance: 20px; --reveal-duration: .5s; }
.tc-reveal.is-visible { opacity: 1; transform: none; }
.tc-lift { transition: transform .3s var(--ease-standard); }
.tc-lift:hover, .tc-lift-group:hover .tc-lift { transform: translateY(-.25rem); }

@media (prefers-reduced-motion: reduce) {
  .tc-reveal { opacity: 1; transform: none; transition: none; }
  .cta-shimmer::after, .vip-cta::after, .tc-marquee__track, .tc-ticker__track, .tc-live-dot::before, .tc-scroll-cue { animation: none; }
  .tc-ticker { overflow-x: auto; }
  .tc-card--hover:hover, .tc-lift:hover { transform: none; }
}
