/* Shared styling for the BTT event surfaces (event page + rally page).
   Deliberately a shared file, not inlined per page, so the two event surfaces
   cannot drift apart visually the way the rest of this repo's pages can. */
:root{
  --navy:#131e3d; --navy-deep:#0d1528; --green:#1e6b38; --green-light:#2a7d42;
  --gold:#c9a84c; --cream:#f7f7f2; --cream-dark:#eeeee8; --charcoal:#1a1a1a;
  --mid:#4a4a4a; --muted:#7a7a6e; --border:#ddddd5; --white:#fff;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Inter',system-ui,-apple-system,sans-serif;color:var(--charcoal);background:var(--cream);line-height:1.6;-webkit-font-smoothing:antialiased}
img{max-width:100%;display:block}
.container{max-width:1160px;margin:0 auto;padding:0 24px}
.narrow{max-width:840px}

.topbar{background:var(--navy-deep);padding:14px 0;position:sticky;top:0;z-index:50}
.topbar .container{display:flex;align-items:center;justify-content:space-between;gap:16px}
.wordmark{font-family:'Playfair Display',serif;font-size:19px;color:#fff;text-decoration:none;font-weight:700}
.wordmark .g{color:#4fae6e}
.topbar nav{display:flex;gap:22px;font-size:14px;align-items:center}
.topbar nav a{color:rgba(255,255,255,.72);text-decoration:none}
.topbar nav a:hover{color:#fff}
.topbar .nav-cta{background:var(--green);color:#fff!important;padding:9px 17px;border-radius:7px;font-weight:600}
.topbar .nav-cta:hover{background:var(--green-light)}

.hero{background:linear-gradient(160deg,var(--navy) 0%,var(--navy-deep) 100%);color:#fff;padding:60px 0 56px}
.hero-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:46px;align-items:center}
.badge{display:inline-flex;align-items:center;gap:8px;background:rgba(201,168,76,.15);border:1px solid rgba(201,168,76,.5);color:var(--gold);
  font-size:12px;font-weight:700;letter-spacing:.13em;padding:7px 14px;border-radius:99px;margin-bottom:20px}
.badge::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--gold)}
h1{font-family:'Playfair Display',serif;font-size:clamp(31px,4.3vw,50px);line-height:1.14;margin-bottom:18px;font-weight:700}
.lede{font-size:17px;color:rgba(255,255,255,.78);max-width:620px;margin-bottom:26px}

/* Countdown */
.cd{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);border-left:3px solid var(--gold);
  border-radius:11px;padding:18px 22px;margin-bottom:26px;max-width:620px}
.cd .lead{font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.6);margin-bottom:12px}
.cd .units{display:flex;gap:22px;flex-wrap:wrap}
.cd .u{min-width:56px}
.cd .n{font-family:'Playfair Display',serif;font-size:32px;color:var(--gold);line-height:1;font-weight:700}
.cd .l{font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;color:rgba(255,255,255,.5);margin-top:5px}
.cd .state{font-family:'Playfair Display',serif;font-size:26px;color:var(--gold)}
.cd .basis{font-size:12px;color:rgba(255,255,255,.45);margin-top:12px;line-height:1.5}

.ctas{display:flex;flex-wrap:wrap;gap:12px}
.btn{display:inline-block;padding:14px 26px;border-radius:8px;font-weight:600;font-size:15px;text-decoration:none;
  transition:.25s;cursor:pointer;border:0;font-family:inherit;text-align:center}
.btn-primary{background:var(--green);color:#fff;box-shadow:0 6px 20px rgba(30,107,56,.35)}
.btn-primary:hover{background:var(--green-light);transform:translateY(-2px)}
.btn-gold{background:var(--gold);color:var(--navy-deep);box-shadow:0 6px 20px rgba(201,168,76,.28)}
.btn-gold:hover{background:#d8b95e;transform:translateY(-2px)}
.btn-outline{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.4)}
.btn-outline:hover{border-color:#fff;background:rgba(255,255,255,.07)}
.btn-ghost{background:transparent;color:var(--navy);border:1px solid var(--border)}
.btn-ghost:hover{border-color:var(--navy)}

.flyerwrap{border-radius:14px;overflow:hidden;border:1px solid rgba(255,255,255,.16);
  box-shadow:0 24px 60px rgba(0,0,0,.42);display:block;max-width:420px;margin-left:auto;margin-right:auto;
  background:#0a1020;line-height:0}
/* Intrinsic ratio of the supplied artwork. Locks the box so the image is never
   stretched and never leaves a gap while it loads. */
.flyerwrap img{width:100%;height:auto;aspect-ratio:1061/1441;object-fit:contain;display:block}
.flyer-cap{font-size:12px;color:rgba(255,255,255,.45);margin-top:11px;text-align:center}

section{padding:68px 0}
.sec-label{font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--green);font-weight:700;margin-bottom:10px}
.sec-title{font-family:'Playfair Display',serif;font-size:clamp(26px,3vw,36px);color:var(--navy);margin-bottom:14px}
.sec-body{color:var(--mid);max-width:760px;font-size:16px}

.facts{background:var(--white);border-top:1px solid var(--border);border-bottom:1px solid var(--border);padding:42px 0}
.facts-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:26px}
.fact .k{font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--muted);margin-bottom:6px}
.fact .v{font-size:17px;color:var(--navy);font-weight:600}
.fact .v.soft{color:var(--mid);font-weight:400;font-size:14.5px}

.speakers{background:var(--navy);color:#fff}
.speakers .sec-title{color:#fff}.speakers .sec-label{color:var(--gold)}.speakers .sec-body{color:rgba(255,255,255,.62)}
.spk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:18px;margin-top:34px}
.spk{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:22px}
.spk .n{font-family:'Playfair Display',serif;font-size:19px;margin-bottom:8px}
.spk .t{font-size:13px;color:rgba(255,255,255,.6);line-height:1.55}
.leaders{margin-top:32px;padding-top:26px;border-top:1px solid rgba(255,255,255,.12)}
.leaders .h{font-size:12px;letter-spacing:.13em;text-transform:uppercase;color:var(--gold);margin-bottom:14px}
.chips{display:flex;flex-wrap:wrap;gap:10px}
.chip{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.14);border-radius:99px;padding:8px 16px;font-size:14px}

.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(255px,1fr));gap:22px;margin-top:32px}
.card{background:var(--white);border:1px solid var(--border);border-radius:13px;padding:26px}
.card .i{font-size:24px;margin-bottom:12px}
.card .t{font-family:'Playfair Display',serif;font-size:18px;color:var(--navy);margin-bottom:9px}
.card .d{font-size:14.5px;color:var(--mid);line-height:1.7}

.notice{background:rgba(138,28,28,.14);border:1px solid rgba(180,80,80,.35);border-left:3px solid #b45050;
  border-radius:10px;padding:15px 19px;font-size:14.5px;line-height:1.6;color:var(--mid);margin-top:22px}
.notice strong{color:var(--navy)}
.notice-dark{background:rgba(255,255,255,.06);border:1px solid rgba(255,150,150,.35);border-left:3px solid #ff8080;color:#ffe2e2}
.notice-dark strong{color:#fff}

.join{background:var(--navy-deep);color:#fff;text-align:center}
.join h2{font-family:'Playfair Display',serif;font-size:clamp(24px,2.8vw,32px);margin-bottom:12px}
.join p{color:rgba(255,255,255,.7);max-width:620px;margin:0 auto 24px}
.cred{display:inline-flex;gap:9px;background:rgba(201,168,76,.12);border:1px solid rgba(201,168,76,.4);
  border-radius:99px;padding:8px 18px;font-size:13px;color:var(--gold);margin-bottom:20px;font-weight:600}

footer{background:#080d18;color:rgba(255,255,255,.52);padding:34px 0;font-size:13px}
.attrib{border:1px solid rgba(255,255,255,.12);border-radius:10px;padding:17px 20px;margin-bottom:18px;color:rgba(255,255,255,.66);line-height:1.65}
.disclosure{font-size:12px;color:rgba(255,255,255,.4);line-height:1.6;max-width:840px}

/* Forms */
form.btt{margin-top:32px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);border-radius:14px;padding:30px}
.row{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-bottom:18px}
.row.one{grid-template-columns:1fr}
.fld label{display:block;font-size:12.5px;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.62);margin-bottom:7px;font-weight:600}
.fld input,.fld select,.fld textarea{width:100%;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.18);
  border-radius:8px;padding:12px 14px;color:#fff;font-family:inherit;font-size:15px}
.fld input::placeholder,.fld textarea::placeholder{color:rgba(255,255,255,.35)}
.fld select option{background:var(--navy-deep);color:#fff}
.fld input:focus,.fld select:focus,.fld textarea:focus{outline:0;border-color:var(--gold)}
.fld .hint{font-size:12px;color:rgba(255,255,255,.45);margin-top:6px}
.check{display:flex;gap:11px;align-items:flex-start;margin-bottom:14px}
.check input{margin-top:4px;width:16px;height:16px;flex:0 0 auto}
.check label{font-size:13.5px;color:rgba(255,255,255,.75);line-height:1.6}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.err{background:rgba(180,60,60,.2);border:1px solid rgba(255,140,140,.4);border-radius:8px;padding:12px 15px;
  font-size:13.5px;color:#ffdede;margin-bottom:18px;display:none}
.privacy{font-size:12.5px;color:rgba(255,255,255,.5);line-height:1.65;margin-top:18px;padding-top:16px;border-top:1px solid rgba(255,255,255,.12)}

/* Success state */
.success{display:none;text-align:center;padding:44px 30px;background:rgba(255,255,255,.05);
  border:1px solid rgba(201,168,76,.4);border-radius:14px;margin-top:32px}
.success .tick{font-size:44px;margin-bottom:14px}
.success h3{font-family:'Playfair Display',serif;font-size:27px;color:#fff;margin-bottom:12px}
.success p{color:rgba(255,255,255,.75);max-width:480px;margin:0 auto 22px}
.success .acts{display:flex;flex-wrap:wrap;gap:11px;justify-content:center}
canvas.confetti{position:fixed;inset:0;pointer-events:none;z-index:9999}

@media(max-width:900px){
  .hero-grid{grid-template-columns:1fr;gap:32px}
  .flyerwrap{max-width:400px;margin:0 auto}
  .topbar nav a:not(.nav-cta){display:none}
}
@media(max-width:640px){
  section{padding:50px 0}
  .hero{padding:42px 0 40px}
  .row{grid-template-columns:1fr}
  .ctas .btn{width:100%}
  form.btt{padding:22px}
  .cd .units{gap:16px}
  .cd .n{font-size:27px}
}
@media(prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important}
}


/* ---- Featured speakers: running marquee ----
   CSS keyframes, not requestAnimationFrame: a per-frame scrollLeft write is
   swallowed by scroll-behavior:smooth and rounded away by integer
   quantization. The track is cloned once in JS and animates 0 to -50%, so the
   seam is invisible. Cloned cards are aria-hidden so a screen reader does not
   meet every speaker twice. */
.spk-car{position:relative;margin-top:34px;width:100%}
@supports (width: 100dvw){
  .spk-car{width:100dvw;margin-left:calc(50% - 50dvw);margin-right:calc(50% - 50dvw)}
}
.spk-viewport{overflow:hidden;mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent);
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent)}
.spk-track{display:flex;gap:18px;padding:4px 24px 8px;width:max-content;
  animation:spkMarquee 26s linear infinite}
@keyframes spkMarquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.spk-car:hover .spk-track,.spk-car:focus-within .spk-track{animation-play-state:paused}
.spk-track .spk{flex:0 0 230px}
@media(prefers-reduced-motion:reduce){
  .spk-track{animation:none;width:100%;flex-wrap:wrap;justify-content:center}
  .spk-track .spk[aria-hidden="true"]{display:none}
}

/* ---------------------------------------------------------------- PAST EVENT
   A concluded event keeps its page. Links to it are already in the wild, and a
   404 is a worse outcome than an honest past-tense page that routes forward.
   It reads as a record rather than a promotion: muted rather than gold, no
   pulse on the badge, and no clock anywhere near it. */
.badge.is-past{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.2);color:rgba(255,255,255,.72)}
.badge.is-past::before{background:rgba(255,255,255,.4)}
.evt-past{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);border-left:3px solid rgba(255,255,255,.3);
  border-radius:10px;padding:20px 22px;margin:26px 0 24px;max-width:620px}
.evt-past .state{font-family:'Playfair Display',serif;font-size:26px;color:rgba(255,255,255,.9);line-height:1.2}
.evt-past .basis{font-size:13px;color:rgba(255,255,255,.5);margin-top:10px;line-height:1.55}
.rally-closed{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:26px}

/* ==========================================================================
   RECOGNITION SPOTLIGHT
   ==========================================================================
   The award line and the awarding body are separate elements, never one string,
   so a badge can never imply that the convention organizer issued a recognition
   somebody else issued. */
.recog{background:linear-gradient(155deg,var(--navy) 0%,var(--navy-deep) 100%);color:#fff;padding:64px 0}
.recog-grid{display:grid;grid-template-columns:.95fr 1.05fr;gap:44px;align-items:center}
.recog-copy .badge{margin-bottom:18px}
.recog h2{font-family:'Playfair Display',serif;font-size:clamp(27px,3.4vw,40px);line-height:1.16;margin-bottom:16px;font-weight:700}
.recog-award{border-left:3px solid var(--gold);padding:14px 0 14px 18px;margin:0 0 20px}
/* Name in white, award in gold. Rendered in one colour they read as a single
   title and it is not obvious where the person ends and the recognition
   begins. */
.recog-award .who{font-family:'Playfair Display',serif;font-size:clamp(20px,2.4vw,27px);color:#fff;line-height:1.2;margin-bottom:5px}
.recog-award .t{font-size:clamp(15px,1.8vw,18px);font-weight:600;letter-spacing:.02em;color:var(--gold);line-height:1.4}
.recog-award .by{font-size:12.5px;letter-spacing:.12em;text-transform:uppercase;color:rgba(255,255,255,.55);margin-top:8px}
.recog-copy p{color:rgba(255,255,255,.78);font-size:16.5px;max-width:560px;margin-bottom:22px}
.recog-role{font-size:13.5px;color:rgba(255,255,255,.55)}

/* Two photographs, the presentation leading. Portrait sources, so both boxes
   are ratio-locked to what the files actually are: nothing reflows on load and
   no face is cropped. */
.recog-shots{display:grid;grid-template-columns:1.25fr .75fr;gap:16px;align-items:start}
.recog-shot{position:relative;border-radius:14px;overflow:hidden;border:1px solid rgba(255,255,255,.16);
  box-shadow:0 24px 60px rgba(0,0,0,.45);background:#0a1020;line-height:0}
.recog-shot img{width:100%;height:auto;aspect-ratio:3/4;object-fit:contain;object-position:center;background:#0a1020}
.recog-shot.sm{margin-top:34px}
.recog-cap{font-size:12.5px;color:rgba(255,255,255,.5);line-height:1.5;margin-top:12px;grid-column:1/-1}

/* ==========================================================================
   EVENT GALLERY
   ==========================================================================
   NATIVE SCROLL SNAP, deliberately. Swipe, momentum, and the accessibility of a
   real scroll container all come free and cannot be broken by a stalled frame
   loop. The buttons scroll by whole slide widths, so the sub-pixel quantization
   that killed an earlier rAF marquee in this repo cannot apply.

   THE STAGE IS CONTAIN. A portrait photograph is shown whole against a backdrop
   rather than cropped to a landscape box. The ratio is fixed in CSS, so the
   stage is the same height before any image has loaded as after: there is no
   layout jump as photographs of different shapes arrive. */
.gal{background:var(--navy-deep);color:#fff;padding:60px 0 66px}
/* The homepage links straight to #gallery and the topbar is sticky, so
   without this the heading lands underneath it and the visitor arrives
   looking at a paragraph cut in half. */
.gal,.recog{scroll-margin-top:78px}
.gal .sec-label{color:var(--gold)}
.gal h2{font-family:'Playfair Display',serif;font-size:clamp(25px,3.2vw,36px);margin-bottom:10px;font-weight:700}
.gal .intro{color:rgba(255,255,255,.62);max-width:680px;margin-bottom:28px;font-size:15.5px}

.gal-stage{position:relative;border-radius:16px;overflow:hidden;border:1px solid rgba(255,255,255,.14);
  background:radial-gradient(120% 100% at 50% 0%,#16223f 0%,#0a1020 100%)}
.gal-track{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;
  -webkit-overflow-scrolling:touch;scrollbar-width:none}
.gal-track::-webkit-scrollbar{display:none}
.gal-slide{flex:0 0 100%;scroll-snap-align:center;scroll-snap-stop:always;position:relative;
  aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;padding:0;border:0;background:transparent;cursor:zoom-in}
/* Absolute rather than height:100%, for the same reason as the homepage stage:
   a percentage height can resolve against a different box than the one that
   actually bounds the slide, and the image then overflows and is clipped while
   object-fit:contain sits there looking correct. Filling the padding box
   removes the percentage entirely. */
.gal-slide img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;object-position:center}
.gal-cap{position:absolute;left:0;right:0;bottom:0;padding:34px 22px 16px;text-align:left;
  background:linear-gradient(180deg,transparent,rgba(6,10,22,.86));font-size:14px;color:rgba(255,255,255,.92);
  line-height:1.45;pointer-events:none}
.gal-cap .cat{display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--gold);margin-bottom:5px}

.gal-nav{position:absolute;top:50%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;
  background:rgba(10,16,32,.62);border:1px solid rgba(255,255,255,.28);color:#fff;font-size:19px;line-height:1;
  cursor:pointer;display:none;align-items:center;justify-content:center;transition:.2s;z-index:3}
.gal-nav:hover{background:rgba(10,16,32,.92);border-color:var(--gold)}
.gal-nav:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.gal-nav.prev{left:14px}
.gal-nav.next{right:14px}
@media(hover:hover) and (pointer:fine){.gal-nav{display:flex}}

.gal-dots{display:flex;gap:8px;justify-content:center;margin-top:16px;flex-wrap:wrap}
.gal-dot{width:9px;height:9px;border-radius:50%;background:rgba(255,255,255,.26);border:0;padding:0;cursor:pointer;
  transition:.25s;flex:0 0 auto}
.gal-dot[aria-current="true"]{background:var(--gold);width:24px;border-radius:99px}
.gal-dot:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
.gal-count{text-align:center;font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.45);margin-top:12px}

.gal-strip{display:grid;grid-auto-flow:column;grid-auto-columns:132px;gap:10px;overflow-x:auto;margin-top:22px;
  padding-bottom:6px;scrollbar-width:thin}
.gal-thumb{border:1px solid rgba(255,255,255,.14);border-radius:9px;overflow:hidden;padding:0;background:#0a1020;
  cursor:pointer;line-height:0;transition:.2s;opacity:.62}
.gal-thumb img{width:100%;height:99px;object-fit:cover}
.gal-thumb:hover,.gal-thumb:focus-visible{opacity:1;border-color:rgba(201,168,76,.6)}
.gal-thumb[aria-current="true"]{opacity:1;border-color:var(--gold);box-shadow:0 0 0 1px var(--gold)}
.gal-credit{font-size:12.5px;color:rgba(255,255,255,.42);line-height:1.6;margin-top:20px;max-width:720px}

/* More is coming. Stated plainly rather than left as an empty grid. */
.gal-more{margin-top:26px;padding:18px 20px;border:1px dashed rgba(255,255,255,.22);border-radius:12px;
  font-size:14px;color:rgba(255,255,255,.6);line-height:1.6}

/* ---------------------------------------------------------------- lightbox */
.lb{border:0;padding:0;background:transparent;max-width:100vw;max-height:100vh;width:100%;height:100%;overflow:hidden}
.lb::backdrop{background:rgba(4,7,15,.94)}
.lb-wrap{position:relative;width:100%;height:100%;display:flex;flex-direction:column}
.lb-track{flex:1 1 auto;display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;
  scrollbar-width:none;min-height:0}
.lb-track::-webkit-scrollbar{display:none}
.lb-slide{flex:0 0 100%;scroll-snap-align:center;scroll-snap-stop:always;display:flex;align-items:center;
  justify-content:center;padding:52px 16px 8px;min-height:0}
.lb-slide img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
.lb-bar{flex:0 0 auto;padding:12px 18px 20px;color:rgba(255,255,255,.85);font-size:14px;text-align:center;line-height:1.45}
.lb-bar .cat{display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--gold);margin-bottom:5px}
.lb-close{position:absolute;top:12px;right:12px;width:42px;height:42px;border-radius:50%;background:rgba(255,255,255,.12);
  border:1px solid rgba(255,255,255,.3);color:#fff;font-size:20px;cursor:pointer;z-index:4;line-height:1}
.lb-close:hover{background:rgba(255,255,255,.22)}
.lb-nav{position:absolute;top:50%;transform:translateY(-50%);width:46px;height:46px;border-radius:50%;
  background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.3);color:#fff;font-size:20px;cursor:pointer;
  z-index:4;display:none;align-items:center;justify-content:center;line-height:1}
.lb-nav.prev{left:12px}
.lb-nav.next{right:12px}
.lb-nav:hover{background:rgba(255,255,255,.22)}
@media(hover:hover) and (pointer:fine){.lb-nav{display:flex}}

@media(max-width:860px){
  .recog-grid{grid-template-columns:1fr;gap:30px}
  .recog-shots{grid-template-columns:1.2fr .8fr}
}
@media(max-width:640px){
  /* Taller stage on a phone so a portrait photograph is not reduced to a
     letterboxed sliver inside a wide box. */
  .gal-slide{aspect-ratio:4/5}
  .gal-strip{grid-auto-columns:104px}
  .gal-thumb img{height:78px}
  .recog-shot.sm{margin-top:0}
  .recog{padding:48px 0}
}

/* Motion preference is honoured by the browser's own smooth scrolling as well
   as by the auto-advance, which is disabled in script. */
@media(prefers-reduced-motion:reduce){
  .gal-track,.lb-track{scroll-behavior:auto}
  .btn-primary:hover,.btn-gold:hover{transform:none}
}

/* ===================================================== FAST START EVENT PAGE
   Scoped to the /fast-start layout. Everything else on the page reuses the
   existing .phero / .container / .grid / .card / .btt form primitives, so this
   is the hero split, the meta block and the speaker band only. */
.fs-hero{padding-bottom:56px}
.fs-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:44px;align-items:center}
.fs-hero h1{margin:14px 0 10px}
.fs-tag{font-size:19px;color:rgba(255,255,255,.78);margin:0 0 22px;max-width:52ch}
.fs-meta{display:flex;gap:34px;flex-wrap:wrap;margin:0 0 22px}
.fs-meta>div{font-size:15px;color:rgba(255,255,255,.72);line-height:1.55}
.fs-meta .k{display:block;font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--gold);margin-bottom:6px;font-weight:700}
.fs-meta strong{display:block;color:#fff;font-size:17px;font-weight:600}
.fs-ctas{display:flex;gap:12px;flex-wrap:wrap;margin:22px 0 16px}
.fs-note{font-size:13px;color:rgba(255,255,255,.5);max-width:56ch;line-height:1.6;margin:0}
/* CONTAIN, never cover. The flyer is the organizer's artwork and every word on
   it matters, so it is shown whole rather than cropped to fit a frame. */
.fs-art img{width:100%;height:auto;display:block;border-radius:14px;
  box-shadow:0 24px 60px rgba(0,0,0,.45);border:1px solid rgba(255,255,255,.1)}
.fs-credit{font-size:11.5px;color:rgba(255,255,255,.4);margin:10px 0 0;text-align:center}
.fs-speaker{background:rgba(255,255,255,.03);border-top:1px solid rgba(255,255,255,.08);
  border-bottom:1px solid rgba(255,255,255,.08)}
.fs-cred{font-size:17px;color:var(--gold);font-weight:600;margin:6px 0 0}
/* The credential is the SPEAKER'S, printed on the flyer. This note sits with it
   so the claim can never read as something an attendee is promised. */
.fs-cred-note{font-size:12.5px;color:rgba(255,255,255,.48);margin:12px 0 0;max-width:64ch;line-height:1.6}
.fs-pending{font-size:13px;color:rgba(255,255,255,.5);margin:22px 0 0;line-height:1.6}
.evt-cd .cd-lead{flex-basis:100%;font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:rgba(255,255,255,.55);font-weight:700;margin-bottom:2px}
@media(max-width:980px){
  .fs-grid{grid-template-columns:1fr;gap:32px}
  /* Artwork first on a small screen: the flyer carries the date, the time and
     the venue, so it is the fastest way for a visitor to see what this is. */
  .fs-art{order:-1;max-width:420px;margin:0 auto}
}
@media(max-width:560px){
  .fs-meta{gap:22px}
  .fs-ctas .btn{width:100%;text-align:center}
}

/* --- Countdown, and why it lives here now ---------------------------------
   The .evt-cd rules existed ONLY inside btt-website.html's inline <style>, so
   the markup rendered on any other page as a vertical stack of bare numbers:
   present, correct, and unreadable. Moving the layout into the shared
   stylesheet is the same lesson this repo already recorded about shared chrome
   living in the shell rather than in whichever page happened to be built first. */
.evt-cd{display:flex;gap:20px;flex-wrap:wrap;background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.13);border-radius:12px;padding:16px 20px;margin:0 0 22px;
  align-items:flex-end}
.evt-cd .u{min-width:52px}
.evt-cd .n{font-family:'Playfair Display',serif;font-size:27px;color:var(--gold);line-height:1;font-weight:700}
.evt-cd .l{font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:rgba(255,255,255,.5);margin-top:4px}
.evt-cd .state{font-family:'Playfair Display',serif;font-size:22px;color:var(--gold)}

/* --- Light-background sections on /fast-start -----------------------------
   THE DEFECT THIS FIXES. The first build wrote these against a dark palette,
   because every surface that already used .sec-title and the .btt form was a
   dark page. On /fast-start they sit on the cream page background, so the copy
   was white on cream: every word present, correct, and invisible. No text
   assertion can see that, which is why it was caught by looking. */
.fs-speaker{background:#fff;border-top:1px solid rgba(19,30,61,.1);border-bottom:1px solid rgba(19,30,61,.1)}
.fs-speaker .sec-label{color:var(--green,#1e6b38)}
.fs-speaker .sec-title{color:var(--navy,#131e3d)}
.fs-cred{color:#8a6d18}
.fs-cred-note{color:rgba(19,30,61,.62)}
.fs-pending{color:rgba(19,30,61,.62)}

/* The RSVP band is DARK ON PURPOSE. The .btt form primitives it reuses were
   built for the dark rally page: white labels, translucent-white inputs, gold
   focus ring. Restyling every one of them for a light ground would fork the
   form; giving the section the ground those styles already expect does not. */
.rally-sec{background:var(--navy-deep,#0d1528);padding:64px 0}
.rally-sec .sec-title{color:#fff}
.rally-sec .container.narrow{max-width:720px}
