/* ─────────────────────────────────────────────────────────────────────────────
   Brown Ballroom Dance Team — site stylesheet
   Built from the design boards in design/canvas/ (the "v5" system in _motion.css).
   Desktop-first, matching the 1440-wide boards; the 390-wide mobile board's
   values are the @media (max-width: 640px) block at the end.
   No build step, no dependencies. Edit this file directly.
   ───────────────────────────────────────────────────────────────────────────── */

:root {
  --ink: #0A0A0B;           /* body text */
  --black: #07070A;         /* dark section grounds */
  --red: #CE0E2D;           /* accent */
  --red-hover: #E4143A;
  --grad: linear-gradient(96deg, #CE0E2D 0%, #F0442E 44%, #FF9F1C 100%);
  --body: #48484D;          /* secondary text */
  --prose: #2A2A2E;         /* long-form prose */
  --muted: #6E6E73;
  --footer-grey: #8E8E93;
  --fine: #8A8A8F;   /* was #636366: 3.36:1 on the footer black, under the 4.5:1 floor */
  --panel: #F5F5F7;
  /* Competition levels. Each has the true metal, used for the swatch, and a darker
     shade of the same hue for the text — real gold and silver are far too light to
     read at 13px, so the swatch carries the colour and the text carries the contrast.
     Every -ink shade clears 4.5:1 on white, --panel and --tile. */
  --lv-bronze: #CD7F32;  --lv-bronze-ink: #9A5F25;
  --lv-silver: #AEB4BB;  --lv-silver-ink: #656E78;
  --lv-gold:   #D4AF37;  --lv-gold-ink:   #826A1C;
  --lv-open:   #7A4FB5;  --lv-open-ink:   #7A4FB5;
  --tile: #EFEFF2;
  --rule: #EDEDF0;
  --rule-2: #E4E4E8;
  --chip-border: #DCDCE1;
  --pill-border: #D6D6DB;
  --ease: cubic-bezier(.16, 1, .3, 1);      /* entrances, transforms */
  --ease-fade: cubic-bezier(.33, 0, .2, 1); /* crossfades */
  --gutter: 56px;
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
html, body { margin: 0; padding: 0; }
body {
  background: #FFFFFF; color: var(--ink);
  font-family: "Archivo", "SF Pro Display", "Helvetica Neue", Arial, sans-serif;
  -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;
}
a { color: inherit; text-decoration: none; }
/* The filter chips hide items with the `hidden` attribute. Any author rule that sets
   `display` (e.g. `.tile { display: block }`) beats the browser's own `[hidden]` rule,
   so state it explicitly or filtering silently does nothing. */
[hidden] { display: none !important; }
img { border-style: none; }
button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
:focus-visible { outline: 2px solid var(--red); outline-offset: 3px; border-radius: 4px; }
.skip { position: absolute; left: -9999px; top: 0; z-index: 100; background: #fff; color: var(--ink); padding: 14px 20px; border-radius: 0 0 12px 0; font-weight: 600; }
.skip:focus { left: 0; }
.vh { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

.fill { width: 100%; height: 100%; object-fit: cover; display: block; filter: saturate(1.2) contrast(1.07); }
.tight { letter-spacing: -0.045em; line-height: 0.94; font-weight: 700; margin: 0; }
.eyebrow { font-size: 12px; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase; }
.muted { color: var(--muted); }
.ov { position: absolute; inset: 0; pointer-events: none; }
.sec { padding: 0 var(--gutter); max-width: 1552px; margin: 0 auto; }
.grad { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }

/* Placeholders — everything the team still has to supply.
   `.ph` on light grounds, `.phw` on dark. Deliberately conspicuous. */
.ph  { background: rgba(206,14,45,0.10); color: #9B1028; padding: 0 5px; border-radius: 4px; font-weight: 500; }
.phw { background: rgba(255,255,255,0.18); color: #FFFFFF; padding: 0 5px; border-radius: 4px; }

/* ── motion ─────────────────────────────────────────────────────────────── */
/* `.armed` is added to <body> by JS, so with JS off everything is simply visible. */
.lines .ln { display: block; overflow: hidden; }
.lines .ln > span { display: block; will-change: transform; padding-bottom: 0.1em; }
.armed .lines .ln > span { transform: translateY(112%); transition: transform 1250ms var(--ease); }
.armed .lines.in .ln > span { transform: none; }
.armed .lines.in .ln:nth-child(2) > span { transition-delay: 110ms; }
.armed .lines.in .ln:nth-child(3) > span { transition-delay: 220ms; }
.armed .lines.in .ln:nth-child(4) > span { transition-delay: 330ms; }

.reveal { transition: opacity 1150ms var(--ease), transform 1150ms var(--ease), filter 1150ms var(--ease); }
.armed .reveal { opacity: 0; transform: translateY(38px) scale(0.985); filter: blur(6px); }
.armed .reveal.in { opacity: 1; transform: none; filter: none; }

@keyframes nudge { 0%, 100% { transform: translate(-50%, 0); opacity: .5; } 50% { transform: translate(-50%, 8px); opacity: 1; } }
@keyframes fillbar { from { width: 0%; } to { width: 100%; } }

/* ── chrome ─────────────────────────────────────────────────────────────── */
#progress { position: fixed; left: 0; top: 0; height: 2px; z-index: 70; width: 0%;
  background: linear-gradient(90deg, #CE0E2D, #F0442E 45%, #FF9F1C); }

#nav { position: fixed; left: 0; right: 0; top: 0; z-index: 60; height: 74px;
  display: flex; align-items: center; justify-content: space-between; padding: 0 var(--gutter);
  backdrop-filter: blur(0px); -webkit-backdrop-filter: blur(0px);
  background: rgba(10,10,11,0); border-bottom: 1px solid rgba(255,255,255,0);
  transition: background 700ms var(--ease), backdrop-filter 700ms var(--ease), border-color 700ms ease, color 700ms ease; }
#nav .brand { font-size: 16px; font-weight: 700; letter-spacing: -0.02em; color: #FFFFFF; transition: color 700ms ease; }
#nav .links { display: flex; align-items: center; gap: 34px; font-size: 14px; font-weight: 500; }
#nav .lk { color: #FFFFFF; transition: color 700ms ease; }
#nav .lk.on { font-weight: 600; }
#nav .join { display: inline-flex; align-items: center; height: 36px; padding: 0 20px; border-radius: 999px;
  background: var(--red); color: #FFFFFF; font-weight: 600; transition: background 420ms ease; }
#nav .join:hover { background: var(--red-hover); }
#nav.solid { background: rgba(255,255,255,0.72); backdrop-filter: blur(26px) saturate(180%);
  -webkit-backdrop-filter: blur(26px) saturate(180%); border-bottom: 1px solid rgba(0,0,0,0.07); }
#nav.solid .brand { color: var(--ink); }
#nav.solid .lk { color: var(--body); }
#nav.solid .lk.on { color: var(--ink); }
.burger { display: none; width: 46px; height: 46px; flex-direction: column; align-items: flex-end; justify-content: center; gap: 6px; }
.burger i { display: block; width: 24px; height: 1.5px; background: #FFFFFF; transition: background 700ms ease, transform 420ms var(--ease), opacity 300ms ease; }
#nav.solid .burger i { background: var(--ink); }

/* ── buttons ────────────────────────────────────────────────────────────── */
.pill { display: inline-flex; align-items: center; justify-content: center; height: 56px; padding: 0 34px;
  border-radius: 999px; font-size: 16px; font-weight: 600; letter-spacing: -0.01em; cursor: pointer;
  position: relative; overflow: hidden;
  transition: transform 620ms var(--ease), box-shadow 620ms var(--ease), background 420ms ease, color 420ms ease, border-color 420ms ease; }
.pill:hover { transform: translateY(-3px); }
.pill-light { background: #FFFFFF; color: var(--ink); }
.pill-light:hover { box-shadow: 0 22px 60px rgba(0,0,0,0.34); }
.pill-red { background: var(--red); color: #FFFFFF; }
.pill-red:hover { background: var(--red-hover); box-shadow: 0 22px 60px rgba(206,14,45,0.42); }
.pill-ghost { border: 1px solid rgba(255,255,255,0.34); color: #FFFFFF; }
.pill-ghost:hover { background: rgba(255,255,255,0.14); border-color: rgba(255,255,255,0.62); }
.pill-dark { border: 1px solid var(--pill-border); color: var(--ink); }
.pill-dark:hover { background: var(--black); color: #FFFFFF; border-color: var(--black); }

.lnk { display: inline-flex; align-items: center; gap: 10px; font-size: 16px; font-weight: 600;
  letter-spacing: -0.01em; color: var(--red); cursor: pointer; }
.lnk svg { transition: transform 520ms var(--ease); }
.lnk:hover svg { transform: translateX(6px); }

.chip { font-size: 14px; font-weight: 500; padding: 10px 18px; border-radius: 999px;
  border: 1px solid var(--chip-border); color: var(--body); cursor: pointer; background: none;
  transition: background 300ms ease, color 300ms ease, border-color 300ms ease, transform 420ms var(--ease); }
.chip:hover { border-color: var(--ink); color: var(--ink); transform: translateY(-2px); }
.chip-on { background: var(--black); border-color: var(--black); color: #FFFFFF; }
.chip-on:hover { color: #FFFFFF; }

.rnd { width: 58px; height: 58px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.24);
  display: flex; align-items: center; justify-content: center; cursor: pointer;
  transition: background 320ms ease, transform 520ms var(--ease); }
.rnd:hover { background: rgba(255,255,255,0.16); transform: scale(1.08); }

/* ── tiles ──────────────────────────────────────────────────────────────── */
.tile { overflow: hidden; border-radius: 20px; background: var(--tile); position: relative; display: block; }
.tile .fill { transition: transform 1600ms var(--ease), filter 800ms ease; }
.tile:hover .fill { transform: scale(1.07); filter: saturate(1.36) contrast(1.1); }
.tname { position: absolute; left: 0; right: 0; bottom: 0; padding: 18px 16px;
  background: linear-gradient(to top, rgba(0,0,0,0.90) 0%, rgba(0,0,0,0.34) 56%, rgba(0,0,0,0) 100%);
  transform: translateY(7px); opacity: 0.9;
  transition: transform 640ms var(--ease), opacity 640ms ease; }
.tile:hover .tname { transform: translateY(0); opacity: 1; }
.tname b { display: block; font-size: 15px; font-weight: 600; color: #FFFFFF; }
.tname i { display: block; font-style: normal; font-size: 12px; color: rgba(255,255,255,0.72); margin-top: 2px; }

/* ── home hero ──────────────────────────────────────────────────────────── */
#hero { cursor: pointer; position: relative; height: 100vh; height: 100svh; overflow: hidden; background: var(--black); }
#heroScroll { position: absolute; inset: 0; will-change: transform; }
#ohHero { position: absolute; inset: 0; }
.glow { position: absolute; inset: 0; pointer-events: none; opacity: 0;
  transition: opacity 1800ms var(--ease-fade); mix-blend-mode: screen; }
.gw1 { background: radial-gradient(125% 88% at 4% 106%, rgba(214,18,52,0.62), transparent 62%), radial-gradient(88% 66% at 98% 2%, rgba(255,150,26,0.34), transparent 58%); }
.gw2 { background: radial-gradient(125% 88% at 8% 106%, rgba(124,42,232,0.56), transparent 62%), radial-gradient(88% 66% at 94% 6%, rgba(232,44,140,0.38), transparent 58%); }
.gw3 { background: radial-gradient(125% 88% at 10% 106%, rgba(10,168,140,0.52), transparent 62%), radial-gradient(88% 66% at 92% 2%, rgba(28,150,255,0.32), transparent 58%); }
.gw4 { background: radial-gradient(125% 88% at 4% 106%, rgba(255,148,20,0.58), transparent 62%), radial-gradient(88% 66% at 98% 6%, rgba(226,54,26,0.36), transparent 58%); }
.gw5 { background: radial-gradient(125% 88% at 8% 106%, rgba(40,74,224,0.58), transparent 62%), radial-gradient(88% 66% at 94% 2%, rgba(0,206,226,0.30), transparent 58%); }
.glow.on { opacity: 1; }
#hero .scrim-l { position: absolute; inset: 0; pointer-events: none; z-index: 1;
  background: linear-gradient(100deg, rgba(5,4,8,0.82) 0%, rgba(5,4,8,0.55) 26%, rgba(5,4,8,0.10) 52%, rgba(5,4,8,0) 68%); }
#heroCopy { cursor: auto; position: absolute; left: var(--gutter); right: var(--gutter); bottom: 196px; will-change: transform, opacity; z-index: 2; }
#heroCopy .lines { max-width: 1000px; }
#heroCopy .eyebrow { color: rgba(255,255,255,0.70); margin-bottom: 26px; display: block; }
#heroCopy .h { font-size: 122px; color: #FFFFFF; }
#heroCopy p { margin: 30px 0 40px; max-width: 540px; font-size: 19px; line-height: 1.55; color: rgba(255,255,255,0.84); }
#heroCopy .cta { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
/* With the depth hero the scene carries a giant "Ballroom", so the heading steps down to one
   line under it: the eyebrow, then "Brown Ballroom Dance Team" at 44px. Desktop only. */
#hero.depth #heroCopy { bottom: 150px; }
#hero.depth #heroCopy .lines { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 0.26em; font-size: 44px; }
#hero.depth #heroCopy .lines .ln:first-child { flex-basis: 100%; font-size: 16px; }
#hero.depth #heroCopy .eyebrow { margin-bottom: 16px; }
#hero.depth #heroCopy .h { font-size: 44px; padding-bottom: 0.08em; }
#hero.depth #heroCopy p { margin: 18px 0 28px; }
#heroFoot { position: absolute; left: var(--gutter); right: var(--gutter); bottom: 58px; z-index: 2;
  display: flex; align-items: flex-end; justify-content: space-between; gap: 40px; }
#heroFoot .cap-wrap { max-width: 560px; flex: 1; }
#heroFoot .rule { height: 1px; background: rgba(255,255,255,0.20); margin-bottom: 16px; }
#caption { font-size: 13px; color: rgba(255,255,255,0.76); }
#bars { display: flex; align-items: flex-end; gap: 14px; }
.dot { cursor: pointer; display: flex; flex-direction: column; gap: 10px; background: none; }
.bar { position: relative; height: 2px; width: 58px; border-radius: 2px; background: rgba(255,255,255,0.24); overflow: hidden; }
.bar i { position: absolute; left: 0; top: 0; bottom: 0; display: block; width: 0%; background: #FFFFFF; }
.num { font-size: 11px; font-weight: 600; letter-spacing: 0.02em; color: rgba(255,255,255,0.40); transition: color 600ms ease; }
.nudge { position: absolute; left: 50%; bottom: 22px; z-index: 2; animation: nudge 2.6s ease-in-out infinite; }

/* ── home sections ──────────────────────────────────────────────────────── */
.statement { padding-top: 160px; padding-bottom: 150px; display: grid; grid-template-columns: 1.45fr 1fr; gap: 100px; align-items: start; }
.statement h2 { font-size: 66px; }
.statement .col2 { padding-top: 14px; }
.statement p { margin: 0 0 22px; font-size: 17px; line-height: 1.68; color: var(--body); }
.statement p + p { margin-bottom: 30px; }

#expand { padding: 0 130px; transition: padding 60ms linear; }
#expandInner { position: relative; height: 86vh; overflow: hidden; border-radius: 32px; background: var(--black); }
#expandInner .copy { position: absolute; left: var(--gutter); right: var(--gutter); bottom: var(--gutter); z-index: 2; }
#expandInner .eyebrow { color: rgba(255,255,255,0.66); margin-bottom: 20px; display: block; }
#expandInner .h { font-size: 76px; color: #FFFFFF; }
#expandInner p { margin: 26px 0 0; max-width: 520px; font-size: 17px; line-height: 1.6; color: rgba(255,255,255,0.80); }

.styles { padding: 130px 20px 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
.styles .panel { height: 760px; }
.styles .copy { position: absolute; left: 48px; right: 48px; bottom: 48px; z-index: 2; }
.styles h3 { font-size: 54px; margin: 0 0 16px; color: #FFFFFF; }
.styles p { margin: 0 0 22px; max-width: 420px; font-size: 16px; line-height: 1.62; color: rgba(255,255,255,0.84); }
.styles .dances { font-size: 13px; color: rgba(255,255,255,0.58); }
/* Hovering a dance name prints its note on a reserved line under the list, rather than
   expanding the list itself, so the row of names never reflows. The note is absolutely
   positioned, so a long one cannot push the card around either. */
.dance-list { position: relative; padding-bottom: 24px; }
.dance-list .dn { cursor: default; outline: none; transition: color 200ms ease; }
.dance-list .dn:hover, .dance-list .dn:focus { color: #FFFFFF; }
.dance-list .dn i { position: absolute; left: 0; right: 0; bottom: 0; font-style: normal;
  color: rgba(255,255,255,0.92); opacity: 0; transform: translateY(3px);
  transition: opacity 220ms var(--ease-fade), transform 220ms var(--ease); pointer-events: none; }
.dance-list .dn:hover i, .dance-list .dn:focus i { opacity: 1; transform: none; }
.dance-list .dn:focus-visible { outline: 2px solid rgba(255,255,255,0.8); outline-offset: 3px; border-radius: 3px; }
/* no hover to give: print every note inline instead of hiding them all */
@media (hover: none) {
  .dance-list { padding-bottom: 0; line-height: 1.85; }
  .dance-list .dn i { position: static; opacity: 1; transform: none; }
  .dance-list .dn i::before { content: " \2014 "; }
}
.sc-a { background: linear-gradient(to top, rgba(5,9,42,0.95) 0%, rgba(20,30,92,0.36) 50%, rgba(40,58,132,0.12) 100%); }
.sc-b { background: radial-gradient(70% 55% at 84% 8%, rgba(60,110,255,0.30), transparent 62%); }
.lc-a { background: linear-gradient(to top, rgba(54,3,18,0.95) 0%, rgba(168,14,58,0.36) 50%, rgba(232,40,86,0.14) 100%); }
.lc-b { background: radial-gradient(70% 55% at 84% 8%, rgba(255,150,26,0.28), transparent 62%); }

.quote { position: relative; height: 88vh; overflow: hidden; background: var(--black);
  display: flex; align-items: center; justify-content: center; }
.quote .inner { position: relative; z-index: 2; padding: 0 220px; text-align: center; max-width: 1552px; }
.quote p { margin: 0 0 30px; font-size: 44px; font-weight: 500; line-height: 1.32; letter-spacing: -0.03em; color: #FFFFFF; }
/* the byline is a <footer> inside the blockquote, so undo the site footer's box */
.quote .who { font-size: 15px; color: rgba(255,255,255,0.60); background: none; padding: 0; overflow: visible; }
.quote-about { height: 480px; }
/* a year on the left and what happened on the right: About's milestones, Alumni's list */
.year-row { display: grid; grid-template-columns: 160px 1fr; gap: 32px; align-items: baseline; }
.quote-about p { font-size: 32px; font-weight: 400; line-height: 1.42; }
.quote-about .who { font-size: 14px; color: rgba(255,255,255,0.66); }
.q-a { background: radial-gradient(100% 100% at 50% 50%, rgba(8,4,12,0.24) 0%, rgba(6,3,9,0.94) 100%); }
.q-b { background: radial-gradient(74% 58% at 16% 90%, rgba(214,18,52,0.46), transparent 64%); }
.q-c { background: radial-gradient(66% 52% at 86% 12%, rgba(255,150,26,0.30), transparent 62%); }

.practices { padding-top: 150px; padding-bottom: 150px; display: grid; grid-template-columns: 1fr 1.9fr; gap: 72px; align-items: start; }
.practices h2 { font-size: 58px; margin: 0 0 28px; }
.practices .lede { margin: 0 0 34px; font-size: 17px; line-height: 1.68; color: var(--body); }
.card { border-radius: 26px; background: var(--panel); padding: 12px; }
.card .row { display: grid; grid-template-columns: 140px 1fr 140px 190px; gap: 20px; align-items: baseline; padding: 26px 30px; }
.card .row.first { background: #FFFFFF; border-radius: 18px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); }
.card .row.ruled { border-top: 1px solid var(--rule-2); }
.card .day { font-size: 17px; font-weight: 600; }
.card .row.dim .day, .card .row.dim .what b { font-weight: 500; }
.card .what b { display: block; font-size: 17px; font-weight: 600; }
.card .what span { display: block; font-size: 14px; color: var(--muted); margin-top: 4px; }
.card .when, .card .where { font-size: 16px; color: var(--body); }
.card .foot { padding: 10px 30px 24px; font-size: 15px; line-height: 1.68; color: var(--muted); }
.card .foot strong { color: var(--ink); font-weight: 500; }

.comps { background: var(--panel); padding: 140px var(--gutter); }
.comps .inner { max-width: 1440px; margin: 0 auto; }
.comps .head { display: flex; align-items: flex-end; justify-content: space-between; gap: 40px; margin-bottom: 44px; }
.comps h2 { font-size: 58px; }
.comps .table { background: #FFFFFF; border-radius: 26px; overflow: hidden; }
.comps .row { display: grid; grid-template-columns: 200px 1fr 300px; gap: 24px; padding: 28px 34px; align-items: baseline; }
.comps .row + .row { border-top: 1px solid var(--rule); }
.comps .when, .comps .where { font-size: 15px; color: var(--muted); }
.comps .what { font-size: 21px; font-weight: 500; letter-spacing: -0.02em; }
.host { font-size: 14px; font-weight: 600; color: var(--red); }

/* ── footer ─────────────────────────────────────────────────────────────── */
footer { background: var(--black); color: #FFFFFF; padding: 110px var(--gutter) 48px; position: relative; overflow: hidden; }
footer .glowf { position: absolute; inset: 0; pointer-events: none; background: radial-gradient(70% 90% at 88% 0%, rgba(214,18,52,0.20), transparent 62%); }
footer .inner { position: relative; z-index: 2; max-width: 1440px; margin: 0 auto; }
footer .cols { display: grid; grid-template-columns: 1.6fr 1fr 1fr 1fr; gap: 48px; padding-bottom: 76px; }
footer .wordmark { font-size: 38px; margin-bottom: 26px; }
footer address { font-style: normal; font-size: 15px; line-height: 1.8; color: var(--footer-grey); }
footer h2 { font-size: 13px; font-weight: 600; margin: 0 0 16px; }
footer ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; font-size: 15px; color: var(--footer-grey); }
footer ul a:hover { color: #FFFFFF; }
footer .divider { height: 1px; background: #1E1E22; }
footer .bottom { padding-top: 28px; font-size: 13px; color: var(--fine); display: flex; justify-content: space-between; gap: 24px; flex-wrap: wrap; }

/* ── interior pages ─────────────────────────────────────────────────────── */
.page-hero { position: relative; height: 460px; overflow: hidden; background: var(--black); }
/* The photograph used to be sized by `height: 100%` against the hero's fixed height.
   On a phone the hero grows to fit its copy, and a percentage height against an auto
   parent resolves to the image's own, so it stopped covering. Take it out of flow. */
.page-hero > .fill { position: absolute; inset: 0; }
.page-hero .bottom { position: absolute; left: 48px; right: 48px; bottom: 44px; z-index: 2;
  display: flex; align-items: flex-end; justify-content: space-between; gap: 64px; }
.page-hero h1 { font-size: 92px; color: #FFFFFF; }
.page-hero p { margin: 0 0 12px; max-width: 440px; font-size: 16px; line-height: 1.65; color: rgba(255,255,255,0.86); }
.isec { padding-top: 88px; padding-bottom: 88px; }
.isec h2 { font-size: 40px; font-weight: 600; }
.band { background: var(--panel); padding: 88px 48px; }
.band .inner { max-width: 1440px; margin: 0 auto; }
.split { display: grid; grid-template-columns: 1fr 1.9fr; gap: 80px; align-items: start; }
.split-wide { display: grid; grid-template-columns: 1fr 1.6fr; gap: 80px; align-items: start; }
/* A lead paragraph. There was no generic rule for this, only `.practices .lede` and
   `.join-form .lede`, so `class="lede"` anywhere else silently did nothing and rendered
   at body size. Both scoped rules are more specific and still win. */
.lede { font-size: 21px; line-height: 1.6; letter-spacing: -0.01em; color: var(--ink); margin: 0; }
@media (max-width: 640px) { .lede { font-size: 18px; line-height: 1.62; } }
.prose { font-size: 16px; line-height: 1.75; color: var(--prose); }
.prose p { margin: 0 0 22px; }
.prose p:last-child { margin-bottom: 0; }
.eyebrow.lead-eyebrow { color: var(--muted); margin-bottom: 18px; display: block; }

.rows { border-top: 1px solid var(--ink); }
.rows .r { border-bottom: 1px solid var(--rule); padding: 26px 0; }
.cta-band { position: relative; height: 380px; overflow: hidden; background: var(--black); }
.cta-band .copy { position: absolute; left: 48px; top: 50%; transform: translateY(-50%); z-index: 2; max-width: 620px; }
.cta-band h2 { font-size: 46px; color: #FFFFFF; margin: 0 0 14px; font-weight: 700; }
.cta-band p { font-size: 16px; color: rgba(255,255,255,0.82); margin: 0 0 28px; }
/* with no paragraph between them the heading sat too close to the button */
.cta-band .copy h2 + .pill { margin-top: 14px; }
.btn-white { background: #FFFFFF; color: var(--ink); }

/* Gallery */
.mosaic { padding: 0 20px 104px; display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); grid-auto-rows: 248px; grid-auto-flow: dense; gap: 20px; max-width: 1552px; margin: 0 auto; }
.mosaic .tile { grid-column: span 4; width: 100%; padding: 0; border: 0; cursor: zoom-in; }
.mosaic .tile.w3 { grid-column: span 3; } .mosaic .tile.w4 { grid-column: span 4; }
.mosaic .tile.w5 { grid-column: span 5; } .mosaic .tile.w6 { grid-column: span 6; }
.mosaic .tile.h2 { grid-row: span 2; }
.mosaic .tile img { width: 100%; height: 100%; object-fit: cover; display: block; filter: saturate(1.2) contrast(1.07); transition: transform 1600ms var(--ease), filter 800ms ease; }
.mosaic .tile:hover img { transform: scale(1.07); filter: saturate(1.36) contrast(1.1); }
#lightbox { position: fixed; inset: 0; z-index: 80; opacity: 0; pointer-events: none; transition: opacity 420ms var(--ease); }
#lightbox.open { opacity: 1; pointer-events: auto; }
#lightbox .backdrop { position: absolute; inset: 0; background: rgba(8,8,10,0.86); backdrop-filter: blur(30px) saturate(140%); -webkit-backdrop-filter: blur(30px) saturate(140%); }
#lightbox .tint { position: absolute; inset: 0; pointer-events: none; background: radial-gradient(70% 60% at 14% 92%, rgba(206,14,45,0.22) 0%, rgba(206,14,45,0) 62%); }
#lightbox .stage { position: absolute; left: 104px; right: 104px; top: 96px; bottom: 148px; }
.lbimg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; opacity: 0; transform: scale(0.97);
  transition: opacity 620ms var(--ease), transform 900ms var(--ease); filter: saturate(1.16) contrast(1.05); }
.lbimg.on { opacity: 1; transform: scale(1); }
#lightbox .close { position: absolute; right: 44px; top: 36px; width: 48px; height: 48px; z-index: 3; }
#lightbox .lbfoot { position: absolute; left: 104px; right: 104px; bottom: 52px; display: flex; align-items: flex-end; justify-content: space-between; gap: 40px; }
#lightbox .counter { font-size: 12px; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase; color: rgba(255,255,255,0.44); margin-bottom: 12px; }
#lightbox .lbcap { font-size: 19px; color: #FFFFFF; max-width: 640px; line-height: 1.5; letter-spacing: -0.01em; }
#lightbox .nav-btns { display: flex; gap: 12px; }

/* Team */
.grid-4 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; }
.grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
.person .tile { aspect-ratio: 4 / 5; }
.person b { display: block; font-size: 18px; font-weight: 600; margin-top: 14px; }
.person span { display: block; font-size: 14px; color: var(--muted); margin-top: 4px; }
.roster { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 6px; }
.roster .tile { aspect-ratio: 4 / 5; border-radius: 0; }
.bio-card { background: #FFFFFF; border-radius: 22px; overflow: hidden; display: grid; grid-template-columns: 320px 1fr; }
.bio-card .body { padding: 48px 56px; }
.bio-card h3 { font-size: 42px; margin: 0 0 10px; }
.bio-card .meta { font-size: 15px; color: var(--muted); margin-bottom: 30px; }
.bio-card .stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px; padding-top: 26px; border-top: 1px solid var(--rule); }
.bio-card .stats dt { font-size: 13px; color: var(--muted); margin-bottom: 6px; }
.bio-card .stats dd { margin: 0; font-size: 16px; }

/* The weekly schedule — three days, each with its level sessions. auto-fit so the
   same markup works in the wide Home column and the narrower Join one. */
.sched { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; }
.sched-day { background: var(--panel); border-radius: 20px; padding: 22px 22px 18px; }
.sched-day h3 { font-size: 19px; font-weight: 600; letter-spacing: -0.02em; margin: 0; }
.sched-where { font-size: 13px; color: var(--muted); margin: 3px 0 14px; }
/* venue links keep whatever colour they sit in; only the underline marks them as links */
.map-link, .syl-link { color: inherit; border-bottom: 1px dotted currentColor; padding-bottom: 1px;
  transition: border-bottom-color 220ms ease; }
.map-link:hover, .map-link:focus-visible,
.syl-link:hover, .syl-link:focus-visible { border-bottom-style: solid; }
.sched-day dl { margin: 0; border-top: 1px solid var(--rule-2); }
.sched-day dl > div { display: flex; align-items: baseline; gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--rule); }
.sched-day dl > div:last-child { border-bottom: 0; padding-bottom: 0; }
.sched-day dt { flex: none; width: 58px; font-size: 13px; font-variant-numeric: tabular-nums; color: var(--muted); margin: 0; }
.sched-day dd { margin: 0; font-size: 15px; }
/* the newcomer session is the one the page is arguing for */
.sched-day .is-new dd { font-weight: 600; color: var(--red); }
.sched-note { margin: 22px 0 0; font-size: 15px; line-height: 1.68; color: var(--muted); }
/* the dues ladder on join.html — a row per tier, figure right-aligned against the label */
.dues { margin: 0; padding-top: 20px; border-top: 1px solid var(--rule-2); }
.dues > div { display: flex; align-items: baseline; justify-content: space-between; gap: 20px;
  padding: 11px 0; border-bottom: 1px solid var(--rule); }
.dues > div:last-child { border-bottom: 0; }
.dues dt { margin: 0; font-size: 15px; color: var(--prose); }
/* the pledge form — labelled fields, unlike the join form's placeholder-only inputs,
   because a donor is giving four different kinds of answer and needs to see which is which */
.pledge label { display: block; margin-bottom: 16px; }
.pledge .lb { display: block; font-size: 13px; font-weight: 500; color: var(--prose); margin-bottom: 7px; }
.pledge .opt { font-weight: 400; color: var(--muted); }
.pledge input, .pledge select, .pledge textarea {
  width: 100%; font: inherit; font-size: 15px; color: var(--ink); background: #FFFFFF;
  border: 1px solid var(--rule-2); border-radius: 12px; padding: 13px 14px; }
.pledge textarea { resize: vertical; min-height: 84px; }
.pledge input:focus, .pledge select:focus, .pledge textarea:focus {
  outline: 2px solid var(--red); outline-offset: 1px; border-color: transparent; }
.pledge button { margin-top: 6px; }
.pledge .form-note { margin: 14px 0 0; font-size: 13px; line-height: 1.6; color: var(--muted); }

/* the resource list on consent.html — a term and its one-line explanation */
.res { margin: 0; }
.res > div { padding: 15px 0; border-bottom: 1px solid var(--rule); }
.res > div:last-child { border-bottom: 0; }
.res dt { margin: 0 0 3px; font-size: 16px; font-weight: 500; }
.res dd { margin: 0; font-size: 14px; line-height: 1.6; color: var(--muted); }
.dues dd { margin: 0; font-size: 19px; font-weight: 600; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.sched-note strong { color: var(--ink); font-weight: 500; }
@media (max-width: 640px) {
  .sched { grid-template-columns: 1fr; gap: 8px; }
  .sched-day { padding: 18px 18px 14px; border-radius: 14px; }
  .sched-day h3 { font-size: 17px; }
  .sched-note { font-size: 14px; margin-top: 18px; }
}

/* Competition levels, colour-coded wherever a level is named */
/* font-size and display are inherited on purpose: these sit inside <b>, <dd> and <span>
   that already set their own, and a level must never restyle its host. */
/* `[class]` only raises specificity to (0,2,0). Several containers colour bare
   `span` at (0,1,1), such as .levels span, and would otherwise repaint a level grey.
   It deliberately does NOT set font-size: doing so also beat `.levels b` and shrank
   four of the five level headings from 18px to 16px. Size is left to the host. */
.lv[class] { color: var(--lv-ink); white-space: nowrap; }
dd > .lv, dd .lv { font-weight: 500; }
.lv-dot::before { content: ""; display: inline-block; width: 8px; height: 8px; border-radius: 999px;
  margin-right: 7px; background: var(--lv-metal);
  box-shadow: inset 0 -1px 1.5px rgba(0,0,0,0.28), inset 0 1px 1.5px rgba(255,255,255,0.6); }
.lv-bronze { --lv-metal: var(--lv-bronze); --lv-ink: var(--lv-bronze-ink); }
.lv-silver { --lv-metal: var(--lv-silver); --lv-ink: var(--lv-silver-ink); }
.lv-gold   { --lv-metal: var(--lv-gold);   --lv-ink: var(--lv-gold-ink); }
.lv-open   { --lv-metal: var(--lv-open);   --lv-ink: var(--lv-open-ink); }
/* Newcomer is the house red on the ladder in competitions.html, not a metal, and
   Syllabus spans three levels at once so it gets a neutral rather than one of them. */
.lv-newcomer { --lv-metal: var(--red); --lv-ink: var(--red); }
/* warm, so it does not read as a second silver when the two sit in the same bar */
.lv-syl      { --lv-metal: #BFB2A0;   --lv-ink: #6B6154; }
/* the open tier, Novice through Championship, is one hue in rising weights, so the rungs
   read as a family without collapsing into the same swatch on a chart */
.lv-novice   { --lv-metal: #D3C3F0;   --lv-ink: #6B45A0; }
.lv-prechamp { --lv-metal: #BCA3E4;   --lv-ink: #6B45A0; }
.lv-champ    { --lv-metal: #9A73CE;   --lv-ink: #6B45A0; }
/* on the dark grounds the metals can run brighter, since contrast now works the other way */
#hero .lv-bronze, .quote .lv-bronze, .page-hero .lv-bronze, .cta-band .lv-bronze, footer .lv-bronze { --lv-ink: #E09A55; }
#hero .lv-silver, .quote .lv-silver, .page-hero .lv-silver, .cta-band .lv-silver, footer .lv-silver { --lv-ink: #C3C9D0; }
#hero .lv-gold,   .quote .lv-gold,   .page-hero .lv-gold,   .cta-band .lv-gold,   footer .lv-gold   { --lv-ink: #E3C25A; }
#hero .lv-open,   .quote .lv-open,   .page-hero .lv-open,   .cta-band .lv-open,   footer .lv-open   { --lv-ink: #B18BE0; }

/* Ballboard (eboard.html) */
.bb-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 48px; margin-bottom: 52px; flex-wrap: wrap; }
.bb-head h2 { font-size: 52px; }
.bb-head p { max-width: 320px; font-size: 15px; line-height: 1.7; color: var(--body); margin: 0 0 6px; }
.bb-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 52px 24px; }
/* a gentle stagger so twelve cards read as a rhythm rather than a spreadsheet */
.bb:nth-child(4n+2), .bb:nth-child(4n+4) { margin-top: 46px; }
.bb { margin: 0; }

.bb-face { position: relative; aspect-ratio: 4 / 5; border-radius: 20px; overflow: hidden; background: var(--tile);
  display: flex; align-items: center; justify-content: center;
  transition: transform 680ms var(--ease), box-shadow 680ms var(--ease); }
.bb:hover .bb-face, .bb:focus-within .bb-face { transform: translateY(-6px); box-shadow: 0 28px 70px rgba(10,10,11,0.20); }
.bb-face .fill { transition: transform 1400ms var(--ease), opacity 620ms var(--ease-fade); }

/* two photographs per person: the portrait, and them dancing. The second is on top at
   zero opacity so it is already decoded when the swap happens. */
.bb-move { position: absolute; inset: 0; opacity: 0; }
.bb-swap:hover .bb-move, .bb:focus-within .bb-move { opacity: 1; }
.bb-swap:hover .bb-still, .bb:focus-within .bb-still { opacity: 0; }

/* no photograph yet: a monogram on the team's crimson, with the traced dancer behind it */
.bb-mono { background: linear-gradient(150deg, #CE0E2D 0%, #9B1028 62%, #6E0A1C 100%); }
.bb-mono::before { content: ""; position: absolute; inset: -12% -22% -28% -18%;
  background: url("../icons/dancer.svg") no-repeat center/contain; opacity: .10; }
.bb-mono::after { content: ""; position: absolute; inset: 0;
  background: radial-gradient(70% 55% at 78% 8%, rgba(255,159,28,0.30), transparent 62%); }
.bb-mono .mono { position: relative; z-index: 1; font-size: 52px; font-weight: 700; letter-spacing: -0.04em;
  color: #fff; opacity: .94; text-shadow: 0 2px 20px rgba(80,4,16,0.5); }

/* Hovering the role swaps it for the team's own joke title. Both lines share one
   grid cell, so the cell is already as tall as the taller of the two and nothing
   reflows on hover. Where there is no hover at all the joke simply sits underneath. */
/* Set at the official title's size and tracking, four of the joke titles run to two
   lines. Reserving two lines on every swapping card keeps all the cards in a row level,
   rather than dropping four of them by a line. */
.bb-role-swap { display: grid; outline: none; line-height: 1.1; min-height: 2.2em; }
.bb-role-swap > span { grid-area: 1 / 1; transition: opacity 260ms var(--ease-fade), transform 260ms var(--ease); }
/* the joke title is set exactly like the official one; it inherits everything from
   .bb-role and only carries its own resting opacity */
.bb-role-swap .r2 { opacity: 0; transform: translateY(3px); }
/* Hover and keyboard focus show it on a pointer, and a click does nothing. Hover is
   fenced to devices that really have it: iOS treats a tap as a hover that sticks until
   you tap elsewhere, which would outlast the two seconds the tap handler allows. */
@media (hover: hover) {
  .bb-role-swap:hover .r1 { opacity: 0; }
  .bb-role-swap:hover .r2 { opacity: 1; transform: none; }
}
.bb-role-swap:focus-visible .r1 { opacity: 0; }
.bb-role-swap:focus-visible .r2 { opacity: 1; transform: none; }
.bb-role-swap:focus-visible { outline: 2px solid var(--red); outline-offset: 4px; border-radius: 4px; }
/* Tap on a touch screen, hover on a pointer. `.on` is added by the tap handler in
   site.js and taken away again after a couple of seconds. */
.bb-role-swap.on .r1 { opacity: 0; }
.bb-role-swap.on .r2 { opacity: 1; transform: none; }
@media (hover: none) {
  .bb-role-swap { cursor: pointer; -webkit-tap-highlight-color: transparent; }
}

.bb-role { font-size: 11px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--red); margin: 18px 0 7px; }
.bb-name { font-size: 20px; font-weight: 600; letter-spacing: -0.025em; margin: 0 0 5px; }
.bb-meta { font-size: 14px; line-height: 1.5; color: var(--muted); margin: 0; }
.bb-facts { display: flex; flex-wrap: wrap; gap: 3px 16px; margin: 11px 0 0;
  padding-top: 11px; border-top: 1px solid var(--rule); }
.bb-facts div { display: flex; gap: 6px; align-items: baseline; }
.bb-facts dt { font-size: 12px; color: var(--muted); margin: 0; }
.bb-facts dd { font-size: 13px; font-weight: 500; margin: 0; }
.bb-bio { font-size: 14px; line-height: 1.65; color: var(--prose); margin: 12px 0 0; }
.bb-mail { overflow-wrap: anywhere; display: inline-block; margin-top: 11px; font-size: 13px; color: var(--muted);
  border-bottom: 1px solid transparent; transition: color 300ms ease, border-color 300ms ease; word-break: break-all; }
.bb-mail:hover { color: var(--red); border-bottom-color: var(--red); }
.bb-note { margin: 56px 0 0; font-size: 14px; color: var(--muted); }

/* Competitions */
.season .r { display: grid; grid-template-columns: 180px 1fr 260px 170px; gap: 24px; padding: 26px 0; align-items: baseline; }
.season .r.mine { background: var(--panel); }
.season .r.mine .when { padding-left: 14px; } .season .r.mine .status { padding-right: 14px; }
.season .when, .season .where { font-size: 15px; color: var(--muted); }
.season .what b { display: block; font-size: 20px; font-weight: 500; margin-bottom: 5px; }
.season .what span { font-size: 14px; color: var(--muted); }
/* `.host` is (0,1,0) and loses to the line above, which is (0,2,1). Without this the
   one line on the table meant to stand out renders grey here and red on the home page. */
.season .what .host, .table .what .host { color: var(--red); font-weight: 600; }
.season .status { font-size: 15px; color: var(--muted); }
.season .status.open { color: var(--red); font-weight: 500; }
/* The season splits three ways. It cannot live in the status column, which is display:none
   below 900px, so it is a labelled heading row that survives every width. */
.season .grp { grid-template-columns: 1fr; padding: 34px 0 10px; border-bottom: 0; }
.season .grp:first-child { padding-top: 0; }
.season .grp h3 { font-size: 12px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink); margin: 0 0 6px; }
.season .grp p { font-size: 14px; line-height: 1.6; color: var(--muted); margin: 0; max-width: 560px; }
.levels { border-top: 1px solid var(--rule-2); padding-top: 26px; }
.levels .grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 20px; }
.levels b { display: block; font-size: 18px; font-weight: 600; }
.levels b.first { color: var(--red); }
.levels span { display: block; font-size: 13px; line-height: 1.6; color: var(--muted); margin-top: 6px; }
/* Live results (assets/js/results.js). Two views in one container: an overview of the
   season, and one competition drilled into. Everything is rendered client-side, so the
   container is empty in the markup and every state has to look deliberate. */
.live-results { min-height: 180px; }
.res-note { font-size: 13px; line-height: 1.6; color: var(--muted); margin: 18px 0 0; max-width: 620px; }
.res-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(128px, 1fr)); gap: 14px;
  border-top: 1px solid var(--ink); border-bottom: 1px solid var(--rule); padding: 26px 0; margin-bottom: 30px; }
.res-stats > div { display: flex; flex-direction: column; gap: 4px; }
.res-stats b { font-size: 40px; font-weight: 600; letter-spacing: -0.03em; line-height: 1;
  font-variant-numeric: tabular-nums; }
.res-stats span { font-size: 13px; color: var(--muted); }

.res-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(232px, 1fr)); gap: 14px; }
.res-card { text-align: left; background: var(--panel); border-radius: 18px; padding: 22px 20px 20px;
  cursor: pointer; transition: transform 420ms var(--ease), box-shadow 420ms var(--ease); }
.res-card:hover, .res-card:focus-visible { transform: translateY(-3px); box-shadow: 0 18px 44px rgba(10,10,11,0.12); }
.res-card.ours { background: linear-gradient(160deg, rgba(206,14,45,0.10), rgba(206,14,45,0.03)); }
.rc-date { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
.rc-name { font-size: 19px; font-weight: 500; letter-spacing: -0.02em; margin-bottom: 3px; }
.rc-where { font-size: 13px; color: var(--muted); margin-bottom: 16px; }
.rc-nums { font-size: 13px; color: var(--muted); }
.rc-nums b { font-size: 16px; font-weight: 600; color: var(--ink); font-variant-numeric: tabular-nums; }

.res-back { font-size: 14px; color: var(--muted); margin-bottom: 18px; cursor: pointer; }
.res-back:hover { color: var(--red); }
.res-head h3 { font-size: 30px; font-weight: 600; letter-spacing: -0.03em; margin: 0 0 4px; }
.res-head p { font-size: 14px; color: var(--muted); margin: 0 0 22px; }
.res-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 22px; }
.res-who { font: inherit; font-size: 14px; padding: 8px 12px; border: 1px solid var(--rule-2);
  border-radius: 999px; background: #FFFFFF; margin-left: auto; max-width: 240px; }

.res-table { border-top: 1px solid var(--ink); }
.res-table .r { display: grid; grid-template-columns: 1fr 1fr 84px; gap: 20px; padding: 14px 0;
  border-bottom: 1px solid var(--rule); align-items: baseline; }
.res-table .head { font-size: 12px; color: var(--muted); border-bottom: 0; padding: 10px 0; }
.res-table .ev { font-size: 15px; }
.res-table .ev .dances { display: block; font-size: 12.5px; color: var(--fine);
  margin-top: 3px; padding-left: 15px; }
.res-table .who { font-size: 14px; color: var(--body); }
.res-table .who span { color: var(--muted); }
.res-table .pl { font-size: 16px; font-weight: 600; text-align: right; font-variant-numeric: tabular-nums; }
.res-table .pl.win { color: var(--red); }
.res-table .ev .lv-dot::before { width: 7px; height: 7px; margin-right: 8px;
  position: relative; top: -1px; }
/* Charts. Bars are plain elements with a height or a width, so there is no library and
   nothing to load; the numbers are printed beside every one of them rather than left to
   be read off the bar. */
.res-viz { display: grid; grid-template-columns: 1.15fr 1fr; gap: 52px;
  margin: 46px 0 0; padding-top: 34px; border-top: 1px solid var(--rule); }
.viz h4 { font-size: 13px; font-weight: 600; letter-spacing: 0.02em; text-transform: uppercase;
  color: var(--muted); margin: 0 0 22px; }
.viz-cols { display: flex; align-items: flex-end; gap: 10px;
  border-bottom: 1px solid var(--ink); padding-bottom: 8px; }
.viz-col { flex: 1 1 0; display: flex; flex-direction: column; align-items: center; gap: 7px; }
.viz-col b { font-size: 15px; font-weight: 600; font-variant-numeric: tabular-nums; }
.viz-col span { font-size: 12px; color: var(--muted); }
.viz-track { width: 100%; height: 108px; display: flex; align-items: flex-end; }
.viz-bar { display: block; width: 100%; border-radius: 4px 4px 0 0; background: var(--lv-metal, #D5D5DA);
  transition: height 760ms var(--ease); }
/* the podium reads down from the house red; everything past it is neutral */
.viz-bar.p1 { background: var(--red); }
.viz-bar.p2 { background: rgba(206,14,45,0.55); }
.viz-bar.p3 { background: rgba(206,14,45,0.30); }
.viz-bar.pn { background: #DCDCE1; }

.viz-sub { font-size: 12px; color: var(--fine); margin: 0 0 9px; }
.viz-sub + .viz-stack { margin-bottom: 12px; }
.viz-stack { display: flex; height: 13px; border-radius: 7px; overflow: hidden; background: var(--rule); }
.viz-stack i { display: block; min-width: 2px; background: var(--lv-metal, #D5D5DA);
  transition: width 760ms var(--ease); }
.viz-stack i.ramp { background: rgba(28,28,30,0.82); }
.viz-stack i.r1 { background: rgba(28,28,30,0.60); }
.viz-stack i.r2 { background: rgba(28,28,30,0.38); }
.viz-stack i.r3 { background: rgba(28,28,30,0.20); }
.viz-key { list-style: none; margin: 0 0 26px; padding: 0; display: flex; flex-wrap: wrap;
  gap: 5px 18px; font-size: 13px; color: var(--body); }
.viz-key .viz-break { flex-basis: 100%; height: 0; margin-top: -5px; }
.viz-key li { display: flex; align-items: baseline; gap: 0; }
.viz-key b { font-weight: 600; margin-left: 6px; font-variant-numeric: tabular-nums; }
.viz-key .lv-dot::before { width: 7px; height: 7px; margin-right: 7px; }
.viz-key .ramp::before { background: rgba(28,28,30,0.82); }
.viz-key .r1::before { background: rgba(28,28,30,0.60); }
.viz-key .r2::before { background: rgba(28,28,30,0.38); }
.viz-key .r3::before { background: rgba(28,28,30,0.20); }
.viz-key :last-child { margin-bottom: 0; }
@media (prefers-reduced-motion: reduce) {
  .viz-bar, .viz-stack i { transition: none; transition-delay: 0s !important; }
}
@media (max-width: 780px) {
  .res-viz { grid-template-columns: 1fr; gap: 38px; margin-top: 36px; }
  .viz-track { height: 88px; }
  .viz-cols { gap: 6px; }
  .viz-col b { font-size: 13px; }
  .viz-col span { font-size: 11px; }
}
.res-more { font-size: 14px; font-weight: 500; color: var(--red); cursor: pointer;
  padding: 16px 0 0; border-bottom: 1px solid transparent; }
.res-more:hover { border-bottom-color: var(--red); }
/* a card that has not come back yet: present, sized, and visibly still reading */
.res-card.waiting { cursor: default; }
.res-card.waiting:hover { transform: none; box-shadow: none; }
.rc-wait { color: var(--fine); }
.rc-wait::after { content: ""; display: inline-block; width: 26px; height: 3px; margin-left: 8px;
  vertical-align: middle; border-radius: 2px; background: var(--rule); overflow: hidden;
  background-image: linear-gradient(90deg, var(--red), var(--red));
  background-size: 40% 100%; background-repeat: no-repeat;
  animation: rcwait 1.1s ease-in-out infinite; }
@keyframes rcwait { 0% { background-position: -30% 0; } 100% { background-position: 130% 0; } }
@media (prefers-reduced-motion: reduce) { .rc-wait::after { animation: none; } }
@media (max-width: 640px) {
  .res-stats b { font-size: 30px; }
  /* two rows per result: the event and its placing on one line, the dancers under them.
     Every cell is placed explicitly — left to auto-placement the spanning .who pushes the
     placing onto a third row of its own. */
  .res-table .r { grid-template-columns: 1fr 58px; gap: 3px 12px; padding: 13px 0; }
  .res-table .head { display: none; }
  .res-table .ev { grid-column: 1; grid-row: 1; }
  .res-table .pl { grid-column: 2; grid-row: 1; }
  .res-table .who { grid-column: 1 / -1; grid-row: 2; }
  .res-table .ev .dances { padding-left: 0; }
  .res-who { margin-left: 0; width: 100%; max-width: none; }
}

/* Join */
.faq .q { border-bottom: 1px solid var(--rule); }
.faq .q h3 { font-size: 21px; font-weight: 600; letter-spacing: -0.015em; margin: 0; }
.faq .q button { width: 100%; display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; padding: 28px 0; text-align: left; }
.faq .q .sign { flex: none; width: 16px; height: 16px; margin-top: 6px; position: relative; }
.faq .q .sign::before, .faq .q .sign::after { content: ""; position: absolute; background: var(--ink); transition: transform 420ms var(--ease), opacity 300ms ease; }
.faq .q .sign::before { left: 0; right: 0; top: 7px; height: 1.5px; }
.faq .q .sign::after { top: 0; bottom: 0; left: 7px; width: 1.5px; }
.faq .q[open] .sign::after, .faq .q.open .sign::after { transform: scaleY(0); opacity: 0; }
.faq .a { overflow: hidden; height: 0; transition: height 520ms var(--ease); }
.faq .a p { font-size: 16px; line-height: 1.75; color: var(--body); max-width: 740px; margin: 0 0 28px; }
.join-split { display: grid; grid-template-columns: 1fr 1fr; }
.join-split .photo { position: relative; overflow: hidden; background: var(--black); min-height: 620px; }
.join-form { background: var(--black); color: #FFFFFF; padding: 80px 64px; }
.join-form h2 { font-size: 42px; margin: 0 0 20px; color: #FFFFFF; }
.join-form .lede { font-size: 16px; line-height: 1.7; color: rgba(255,255,255,0.72); max-width: 480px; margin: 0 0 34px; }
.join-form form { display: flex; flex-direction: column; gap: 16px; max-width: 520px; }
.join-form .two { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }
.join-form input, .join-form select, .join-form textarea { width: 100%; background: transparent; color: #FFFFFF;
  border: 1px solid #2C2C30; border-radius: 14px; padding: 14px 16px; font: inherit; font-size: 15px; }
.join-form textarea { height: 92px; resize: vertical; }
.join-form ::placeholder { color: var(--footer-grey); }
.join-form select { appearance: none; -webkit-appearance: none; color: var(--footer-grey);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='none'><path d='m1 1 4 4 4-4' stroke='%238E8E93' stroke-width='1.2'/></svg>");
  background-repeat: no-repeat; background-position: right 16px center; }
.join-form select:focus, .join-form select.chosen { color: #FFFFFF; }
.join-form option { color: var(--ink); }
.join-steps { max-width: 480px; margin: 16px 0 0; font-size: 14px; line-height: 1.65;
  color: rgba(255,255,255,0.72); }
.join-form .contact { margin-top: 34px; padding-top: 26px; border-top: 1px solid #232326; font-size: 15px; line-height: 2; color: rgba(255,255,255,0.72); }
.join-form .contact .ph { background: #232326; color: #FFFFFF; }
.form-note { font-size: 14px; line-height: 1.6; color: var(--footer-grey); margin: 0; }
/* it is a live region, present and empty until the form has something to say */
.form-note:empty { display: none; }

/* page layouts that need to collapse on small screens (keep these out of inline
   styles — an inline grid-template-columns cannot be overridden by a media query) */
.about-story { display: grid; grid-template-columns: 1fr 1.3fr 0.9fr; gap: 56px; align-items: start; }
.about-coach { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: start; }
.values-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 44px 56px; }
.inline-link { color: var(--red); border-bottom: 1px solid var(--red); }
.values-grid h3 { font-size: 22px; font-weight: 600; letter-spacing: -0.02em; margin: 0 0 12px; }
.values-grid p { margin: 0; font-size: 16px; line-height: 1.7; color: var(--body); }
.comp-prose { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 40px; margin-bottom: 44px; }
.join-what { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 40px; }
.join-prac { display: grid; grid-template-columns: 1.55fr 1fr; gap: 80px; align-items: start; }
.team-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 40px; margin-bottom: 36px; }

/* ── responsive ─────────────────────────────────────────────────────────── */
@media (max-width: 1100px) {
  :root { --gutter: 32px; }
  .statement, .practices { grid-template-columns: 1fr; gap: 48px; }
  .split, .split-wide { grid-template-columns: 1fr; gap: 40px; }
  .grid-4, .bb-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bb:nth-child(4n+2), .bb:nth-child(4n+4) { margin-top: 0; }
  .bb:nth-child(2n) { margin-top: 40px; }
  .about-story, .about-coach, .join-prac { grid-template-columns: 1fr; gap: 40px; }
  .team-head { flex-direction: column; align-items: flex-start; gap: 12px; }
  .roster { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .levels .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
  .bio-card { grid-template-columns: 1fr; }
  .join-split { grid-template-columns: 1fr; }
  .join-split .photo { min-height: 360px; }
  #heroCopy .h { font-size: 84px; }
  .page-hero h1 { font-size: 64px; }
  .quote .inner { padding: 0 64px; }
  .quote p { font-size: 34px; }
  .quote.quote-about { height: auto; min-height: 480px; padding: 72px 0; }
  .quote.quote-about p { font-size: 28px; }
  #expand { padding: 0 32px; }
  .statement h2, .practices h2, .comps h2 { font-size: 44px; }
  .styles h3 { font-size: 40px; }
  #expandInner .h { font-size: 52px; }
  .mosaic { grid-auto-rows: 200px; gap: 12px; }
  .season .r { grid-template-columns: 140px 1fr 150px; }
  .season .status { display: none; }
  .card .row { grid-template-columns: 1fr; gap: 6px; padding: 20px 22px; }
  .comps .row { grid-template-columns: 1fr; gap: 6px; }
}

@media (max-width: 640px) {
  :root { --gutter: 20px; }
  .tight { letter-spacing: -0.038em; }
  .tile { border-radius: 14px; }
  /* a pill stretched across a phone reads as a slab rather than a button; only the
     form submits, which are the full width of their field above them, still do */
  .pill { height: 48px; font-size: 15px; padding: 0 26px; width: auto; }
  form .pill, .pledge .pill { width: 100%; }
  .armed .reveal { transform: translateY(26px) scale(0.99); filter: blur(4px); }

  #nav { height: 64px; }
  #nav .links { display: none; }
  #nav .links.open { display: flex; position: fixed; left: 0; right: 0; top: 64px; flex-direction: column;
    align-items: flex-start; gap: 0; padding: 12px 20px 24px; background: rgba(10,10,11,0.94);
    backdrop-filter: blur(24px) saturate(180%); -webkit-backdrop-filter: blur(24px) saturate(180%); }
  #nav .links.open .lk { color: #FFFFFF; padding: 14px 0; font-size: 17px; width: 100%; }
  #nav .links.open .join { margin-top: 10px; height: 46px; }
  #nav.solid .links.open { background: rgba(255,255,255,0.96); }
  #nav.solid .links.open .lk { color: var(--ink); }
  .burger { display: flex; }
  .burger.x i:nth-child(1) { transform: translateY(3.75px) rotate(45deg); }
  .burger.x i:nth-child(2) { transform: translateY(-3.75px) rotate(-45deg); }

  #hero { background: #0A0A0B; }
  #heroCopy { bottom: 108px; }
  #heroCopy .eyebrow { margin-bottom: 16px; color: rgba(255,255,255,0.76); }
  #heroCopy .h { font-size: 46px; }
  #heroCopy p { font-size: 16px; margin: 18px 0 24px; }
  #heroCopy .cta .pill-ghost { display: none; }
  #heroFoot { bottom: 34px; flex-direction: column; align-items: stretch; gap: 12px; }
  #heroFoot .rule { background: rgba(255,255,255,0.26); }
  #caption { font-size: 11px; color: rgba(255,255,255,0.78); }
  .bar { width: 22px; } #bars { gap: 6px; } .num { display: none; }
  .nudge { display: none; }

  .statement { padding-top: 56px; padding-bottom: 56px; gap: 22px; }
  .statement h2 { font-size: 30px; font-weight: 600; line-height: 1.12; }
  .statement p, .practices .lede { font-size: 15px; line-height: 1.7; }
  #expand { padding: 0; } #expandInner { height: 60vh; border-radius: 0; }
  #expandInner .copy { left: 20px; right: 20px; bottom: 28px; }
  #expandInner .h { font-size: 34px; }
  #expandInner p { font-size: 15px; margin-top: 18px; }
  .styles { grid-template-columns: 1fr; gap: 6px; padding: 56px 0 0; }
  .styles .panel { height: 430px; border-radius: 0; }
  .styles .copy { left: 20px; right: 20px; bottom: 24px; }
  .styles h3 { font-size: 30px; margin-bottom: 10px; }
  .styles p { font-size: 14px; line-height: 1.6; margin-bottom: 12px; }
  .styles .dances { font-size: 12px; color: rgba(255,255,255,0.6); }
  .quote { height: 420px; } .quote .inner { padding: 0 28px; }
  .quote p { font-size: 21px; font-weight: 400; line-height: 1.45; margin-bottom: 18px; }
  .quote .who { font-size: 13px; color: rgba(255,255,255,0.66); }
  .quote.quote-about { height: auto; min-height: 420px; padding: 72px 0; }
  .quote.quote-about p { font-size: 21px; }
  .year-row { grid-template-columns: 64px 1fr; gap: 16px; }
  .year-row > :first-child { font-size: 22px !important; }
  .practices { padding-top: 56px; padding-bottom: 56px; gap: 26px; }
  .practices h2 { font-size: 34px; font-weight: 600; }
  .card { background: none; padding: 0; border-top: 1px solid var(--ink); }
  .card .row { padding: 18px 0; border-bottom: 1px solid var(--rule); background: none !important;
    box-shadow: none !important; border-radius: 0; grid-template-columns: 1fr auto; column-gap: 16px; }
  .card .row.ruled { border-top: 0; }
  .card .day { order: 3; grid-column: 1 / -1; font-size: 13px; color: var(--muted); font-weight: 400; }
  .card .what b { font-size: 16px; font-weight: 500; }
  .card .what span { display: none; }
  .card .when { font-size: 14px; white-space: nowrap; text-align: right; }
  .card .where { order: 4; grid-column: 1 / -1; font-size: 13px; color: var(--muted); margin-top: -4px; }
  .card .foot { padding: 20px 0 0; font-size: 14px; }
  .comps { padding: 56px 20px; }
  .comps .head { flex-direction: column; align-items: flex-start; gap: 12px; margin-bottom: 24px; }
  .comps h2 { font-size: 34px; font-weight: 600; }
  .comps .table { background: none; border-radius: 0; border-top: 1px solid var(--ink); }
  .comps .row { padding: 16px 0; border-bottom: 1px solid var(--rule-2); border-top: 0 !important; }
  .comps .what { font-size: 16px; font-weight: 500; }
  .comps .when, .comps .where { font-size: 13px; }

  footer { padding: 48px 20px 32px; background: #0A0A0B; }
  footer .glowf { display: none; }
  footer .cols { grid-template-columns: repeat(2, 1fr); gap: 26px; padding-bottom: 26px; }
  footer .wordmark { font-size: 24px; letter-spacing: -0.03em; line-height: 1.12; margin-bottom: 16px; }
  footer .brandcol { grid-column: 1 / -1; }
  footer address { font-size: 14px; }
  footer .divider { background: #232326; }
  footer .bottom { padding-top: 20px; font-size: 12px; line-height: 1.7; flex-direction: column; gap: 4px; }

  /* tall content used to overflow the fixed height and run up behind the nav, so the
     hero grows instead and the copy sits in normal flow under the header */
  .page-hero { height: auto; min-height: 340px; }
  /* relative, not static: it has to stay in flow so the hero takes its height from
     the copy, but z-index only works on a positioned element and without it the
     gradient overlay paints straight over the words */
  .page-hero .bottom { position: relative; padding: 104px 20px 34px; left: auto; right: auto; bottom: auto;
    flex-direction: column; align-items: flex-start; gap: 14px; }
  .page-hero h1 { font-size: 40px; }
  .page-hero p { font-size: 15px; margin: 0; }
  .isec { padding-top: 56px; padding-bottom: 56px; }
  .isec h2, .band h2 { font-size: 30px; font-weight: 600; }
  .band { padding: 56px 20px; }
  .prose { font-size: 15px; line-height: 1.7; }
  .grid-4, .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  .bb-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 30px 12px; }
  .bb:nth-child(2n) { margin-top: 26px; }
  .bb-head { margin-bottom: 30px; } .bb-head h2 { font-size: 30px; font-weight: 600; }
  .bb-head p { max-width: none; }
  .bb-name { font-size: 16px; } .bb-role { font-size: 10px; margin-top: 12px; } .bb-meta { font-size: 13px; }
  .bb-mono .mono { font-size: 34px; } .bb-face { border-radius: 14px; }
  .bb-facts { gap: 2px 12px; } .bb-note { margin-top: 34px; }
  .values-grid, .comp-prose, .join-what { grid-template-columns: 1fr; gap: 28px; }
  .roster { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }
  .person b { font-size: 15px; margin-top: 10px; } .person span { font-size: 13px; }
  .bio-card .body { padding: 24px 20px; } .bio-card h3 { font-size: 30px; }
  .bio-card .stats { grid-template-columns: 1fr; gap: 16px; }
  .cta-band { height: 320px; } .cta-band .copy { left: 20px; right: 20px; }
  .cta-band h2 { font-size: 30px; }
  .mosaic { padding: 0 12px; grid-template-columns: repeat(2, minmax(0, 1fr)); grid-auto-rows: 150px; gap: 6px; }
  .mosaic .tile, .mosaic .tile.w3, .mosaic .tile.w4, .mosaic .tile.w5, .mosaic .tile.w6 { grid-column: span 1; }
  #lightbox .stage { left: 12px; right: 12px; top: 64px; bottom: 132px; }
  #lightbox .lbfoot { left: 20px; right: 20px; bottom: 28px; }
  #lightbox .lbcap { font-size: 15px; }
  #lightbox .close { right: 16px; top: 12px; }
  .rnd { width: 46px; height: 46px; }
  .season .r { grid-template-columns: 1fr; gap: 5px; padding: 20px 0; }
  .season .when { font-size: 14px; }
  .season .where { font-size: 13px; }
  .season .r.mine .when { padding-left: 0; }
  .season .what b { font-size: 16px; }
  .join-form { padding: 48px 20px; } .join-form h2 { font-size: 30px; }
  .faq .q button { padding: 20px 0; } .faq .q h3 { font-size: 17px; }
  .faq .a p { font-size: 15px; margin-bottom: 20px; }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  * { animation-duration: 0.001ms !important; transition-duration: 0.001ms !important; }
  .armed .reveal { opacity: 1; transform: none; filter: none; }
  .armed .lines .ln > span { transform: none; }
  .faq .a { height: auto !important; }
}

/* The journey's stage chrome is anchored to the foot of the pinned stage; once the
   section is scrolling away that foot would pass under the masthead. Retire it. */
.oj-stage.oj-exiting .oj-foot,
.oj-stage.oj-exiting .oj-progress,
.oj-stage.oj-exiting .oj-title,
.oj-stage.oj-exiting .oj-cos,
.oj-stage.oj-exiting .oj-costack { opacity: 0 !important; transition: opacity 240ms ease; }
