/* =====================================================================
   ORIENTAL ACADEMY — DESIGN SYSTEM
   Shared across every page. Home page is the reference implementation.
   ---------------------------------------------------------------------
   Voice: a respected, established, WELCOMING school a Jammu parent trusts.
   Premium in quality, warm in mood — heritage + human, never luxury-cold.
   ---------------------------------------------------------------------
   Brand locks:
   - Navy #1B2A4A (primary) · Deep Navy #16243F · Blue #223A66
   - Gold #C9A84C (accent, SPARINGLY) · Dark Gold #B08D3A
   - Warm Paper #FBF8F1 / Off-White #F5F0E8 · White · Ink #1c1c1c
   - Playfair Display (headlines) · Inter (body/UI) · Noto Devanagari/Nastaliq
   - Gold pairs with NAVY for text. Never gold text on a light background.
   ===================================================================== */

/* ===== Self-hosted typography — heritage identity (Spectral · Tiro Devanagari Hindi · Gulzar) ===== */
@font-face{font-family:"Spectral";font-style:normal;font-weight:400;font-display:swap;src:url("fonts/spectral-400.woff2") format("woff2")}
@font-face{font-family:"Spectral";font-style:normal;font-weight:500;font-display:swap;src:url("fonts/spectral-500.woff2") format("woff2")}
@font-face{font-family:"Spectral";font-style:normal;font-weight:600;font-display:swap;src:url("fonts/spectral-600.woff2") format("woff2")}
@font-face{font-family:"Spectral";font-style:normal;font-weight:700;font-display:swap;src:url("fonts/spectral-700.woff2") format("woff2")}
@font-face{font-family:"Spectral";font-style:italic;font-weight:600;font-display:swap;src:url("fonts/spectral-600-italic.woff2") format("woff2")}
@font-face{font-family:"Inter";font-style:normal;font-weight:400;font-display:swap;src:url("fonts/inter-400.woff2") format("woff2")}
@font-face{font-family:"Inter";font-style:normal;font-weight:500;font-display:swap;src:url("fonts/inter-500.woff2") format("woff2")}
@font-face{font-family:"Inter";font-style:normal;font-weight:600;font-display:swap;src:url("fonts/inter-600.woff2") format("woff2")}
@font-face{font-family:"Inter";font-style:normal;font-weight:700;font-display:swap;src:url("fonts/inter-700.woff2") format("woff2")}
@font-face{font-family:"Source Serif 4";font-style:normal;font-weight:400;font-display:swap;src:url("fonts/sourceserif-400.woff2") format("woff2")}
@font-face{font-family:"Source Serif 4";font-style:normal;font-weight:600;font-display:swap;src:url("fonts/sourceserif-600.woff2") format("woff2")}
@font-face{font-family:"Source Serif 4";font-style:italic;font-weight:400;font-display:swap;src:url("fonts/sourceserif-400-italic.woff2") format("woff2")}
@font-face{font-family:"Tiro Devanagari Hindi";font-style:normal;font-weight:400;font-display:swap;src:url("fonts/tiro-deva-400.woff2") format("woff2")}
@font-face{font-family:"Tiro Devanagari Hindi";font-style:italic;font-weight:400;font-display:swap;src:url("fonts/tiro-deva-400-italic.woff2") format("woff2")}
@font-face{font-family:"Gulzar";font-style:normal;font-weight:400;font-display:swap;src:url("fonts/gulzar-400.woff2") format("woff2")}

:root{
  /* — Typography (self-hosted heritage identity) — */
  --font-display:"Spectral", Georgia, "Times New Roman", serif;
  --font-prose:"Source Serif 4", Georgia, serif;
  --font-ui:"Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --font-body:var(--font-ui);
  --font-deva:"Tiro Devanagari Hindi", "Noto Sans Devanagari", serif;
  --font-urdu:"Gulzar", "Noto Nastaliq Urdu", serif;

  /* — Brand palette — */
  --navy:        #1B2A4A;
  --navy-deep:   #16243F;
  --navy-ink:    #0E1726;   /* near-black navy — gradient foot / light-field floor */
  --blue:        #223A66;
  --gold:        #C9A84C;
  --gold-dark:   #886715;
  --focus-ring:  var(--gold-dark);   /* focus outline: AA-safe on light grounds; overridden on dark components below */   /* gold TEXT on light grounds — darkened for WCAG-AA (was #B08D3A = 2.95:1; now ~4.9:1) */
  --gold-light:  #E6C868;
  --gold-deep:   #A9842F;
  /* Metallic gold gradients — give gold dimension instead of flat mustard */
  --gold-grad:   linear-gradient(180deg, #E6C868 0%, #C9A84C 52%, #A9842F 100%);
  --gold-grad-h: linear-gradient(180deg, #EED27E 0%, #CDAB50 52%, #976F25 100%);
  --paper:       #FBF8F1;   /* warm paper — primary surface */
  --offwhite:    #F5F0E8;   /* alternate warm surface */
  --white:       #FFFFFF;
  --ink:         #1c1c1c;

  /* — Derived text tones (warm, never pure black) — */
  --text:        #2A3142;   /* body text on light */
  --text-soft:   #5A6172;   /* secondary text on light */
  --text-muted:  #726D5A;   /* tertiary / labels on light — darkened for WCAG-AA (was #8A8576 = 3.48:1; now ~4.9:1) */
  --on-navy:     #F3EFE6;   /* body text on navy */
  --on-navy-soft:#C8D0DE;   /* secondary text on navy (AA on navy) */

  /* — Lines / borders — */
  --rule:        #E4DCCB;   /* hairline on paper */
  --rule-strong: #D6CBB3;
  --rule-navy:   rgba(255,255,255,.14);

  /* — Spacing scale (8px base) — */
  --s-1: 4px;  --s-2: 8px;  --s-3: 12px; --s-4: 16px; --s-5: 24px;
  --s-6: 32px; --s-7: 48px; --s-8: 64px; --s-9: 96px; --s-10: 128px;

  /* — Radii (restrained — dignified, not bubbly) — */
  --r-sm: 4px; --r-md: 8px; --r-lg: 12px; --r-pill: 999px;

  /* — Shadows (soft, warm-tinted) — */
  --shadow-sm: 0 1px 2px rgba(22,36,63,.06), 0 2px 6px rgba(22,36,63,.05);
  --shadow-md: 0 6px 18px -8px rgba(22,36,63,.18), 0 2px 6px rgba(22,36,63,.06);
  --shadow-lg: 0 24px 48px -22px rgba(22,36,63,.30), 0 8px 18px -10px rgba(22,36,63,.12);

  --maxw: 1200px;
  --header-h: 84px;
}

*,*::before,*::after{ box-sizing:border-box; }
/* NOTE: do NOT put overflow-x:clip/hidden on <html> — it breaks position:sticky
   (the About gate scroll-scrub stops pinning → a huge empty gap). The horizontal-
   overflow guard lives on <body> below (clip, which is sticky-safe) instead. */
html{ scroll-behavior:smooth; -webkit-text-size-adjust:100%; }
@media (prefers-reduced-motion: reduce){ html{ scroll-behavior:auto; } }

body{
  margin:0;
  font-family:var(--font-body);
  background:var(--paper);
  color:var(--text);
  font-size:17px;
  line-height:1.65;
  font-weight:400;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow-x:clip;            /* clip, NOT hidden: `hidden` coerces overflow-y→auto, making body a
                                 scroll container that breaks position:sticky (the About gate scrub).
                                 `clip` contains horizontal overflow without that side effect. The
                                 actual gutter source is also clipped at .bg-navy below. */
}
/* height:auto is REQUIRED here: the HTML width/height attributes map to CSS as
   presentational hints, so without it a constrained image keeps its literal pixel
   height and stretches vertically. Scoped rules (e.g. .fc-media img{height:100%})
   still win on specificity. */
img{ display:block; max-width:100%; height:auto; }
figure{ margin:0; }
a{ color:inherit; }
::selection{ background:var(--navy); color:var(--paper); }

/* ---------- Typography primitives ---------- */
.serif{ font-family:var(--font-display); }
h1,h2,h3,h4{
  font-family:var(--font-display);
  color:var(--navy-deep);
  font-weight:600;
  line-height:1.1;
  letter-spacing:-0.01em;
  margin:0;
}
h1{ font-weight:700; }
p{ margin:0; }

.devanagari{ font-family:var(--font-deva); }
.nastaliq{ font-family:var(--font-urdu); line-height:2.1; }

/* Eyebrow / kicker label — Inter, uppercase, tracked. Gold ONLY on navy. */
.kicker{
  font-family:var(--font-ui);
  font-size:12.5px; font-weight:600;
  letter-spacing:.18em; text-transform:uppercase;
  color:var(--gold-dark);
  display:inline-flex; align-items:center; gap:10px;
}
.kicker::before{ content:""; width:26px; height:2px; background:var(--gold); display:inline-block; }
.kicker.center::before{ display:none; }
.on-navy .kicker, .kicker.on-navy{ color:var(--gold); }

/* ---------- Layout helpers ---------- */
.wrap{ max-width:var(--maxw); margin:0 auto; padding:0 28px; }
.wrap-narrow{ max-width:820px; margin:0 auto; padding:0 28px; }
.section{ padding:clamp(64px,9vw,112px) 0; }
.section-tight{ padding:clamp(48px,6vw,72px) 0; }
/* §5D — a barely-perceptible paper tooth so the ivory grounds read as warm paper, not a flat fill */
.bg-paper, .bg-offwhite{ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='0.04'/%3E%3C/svg%3E"); }
.bg-paper{ background-color:var(--paper); }
.bg-offwhite{ background-color:var(--offwhite); }
/* Heritage zone — warm "aged paper" surfaces on the PAST-TENSE pages (About, Legacy, Moments,
   Through the Years, Our Founder); present/conversion pages keep the crisp paper. Council rule:
   the surface matches the tense of the content. Slightly stronger grain here for an aged feel. */
/* --gold-dark and --text-muted were tuned to ~4.9:1 against the DEFAULT #FBF8F1 surface.
   This zone darkens the ground, which drops them to ~4.0-4.3:1 — under AA. Retune both here
   so the heritage pages keep the same contrast promise as the rest of the site. */
body[data-zone="heritage"]{ --paper:#F1E9D5; --offwhite:#ECE2CB;
  --gold-dark:#7C5E13;   /* 4.66:1 on #ECE2CB */
  --text-muted:#6A6553;  /* 4.60:1 on #ECE2CB */ }
body[data-zone="heritage"] .bg-paper, body[data-zone="heritage"] .bg-offwhite{ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='gh'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23gh)' opacity='0.06'/%3E%3C/svg%3E"); }
.bg-white{ background:var(--white); }
/* §5A navy depth: vertical gradient to near-Ink at the foot + a soft foot vignette so the section
   reads as a lit hall, not a flat slab. The single off-centre gold light-field stays the job of the
   .lit-left/.lit-right modifiers. §5B: one faint monogram watermark bleeding off the lower-right edge. */
.bg-navy{ background:
    radial-gradient(120% 75% at 50% 100%, rgba(11,18,38,.55), transparent 60%),
    linear-gradient(180deg, var(--navy) 0%, var(--navy) 42%, var(--navy-ink) 100%);
  color:var(--on-navy); position:relative; overflow-x:clip; }   /* clip contains the corner
    watermark below so it can't bleed past the right edge and expand the mobile viewport
    (the "white gutter"). overflow-x:clip (not hidden) → no scroll container, no sticky/scrub fallout. */
.bg-navy::after{ content:""; position:absolute; right:-90px; bottom:-70px; width:460px; height:460px; z-index:0;
  background:url("oa-monogram-gold.svg") right bottom/contain no-repeat; opacity:.05; pointer-events:none; }
.bg-navy > *{ position:relative; z-index:1; }
.bg-navy.section{ border-top:1px solid rgba(201,168,76,.42); }   /* gold thread on every navy anchor */
.bg-navy h1,.bg-navy h2,.bg-navy h3,.bg-navy h4{ color:var(--white); }
.bg-navy-deep{ background:var(--navy-deep); color:var(--on-navy); }
.bg-navy-deep h1,.bg-navy-deep h2,.bg-navy-deep h3,.bg-navy-deep h4{ color:var(--white); }
.bg-navy-deep .lede{ color:var(--on-navy-soft); }

/* --- Make ANY section safely retintable to full navy (brand anchors, §A) --- */
.bg-navy .kicker{ color:var(--gold); }
.bg-navy .kicker::before{ background:var(--gold); }
.bg-navy .lede,.bg-navy .section-head .lede{ color:var(--on-navy-soft); }
.bg-navy .prose p{ color:var(--on-navy-soft); }
.bg-navy .prose p.lead{ color:var(--white); }
.bg-navy .prose strong{ color:var(--white); }
.bg-navy .note-quote{ color:var(--white); }
.bg-navy .note-body p{ color:var(--on-navy-soft); }
.bg-navy .note-body p strong{ color:var(--white); }
.bg-navy .note-sign{ border-top-color:var(--rule-navy); }
.bg-navy .note-sign .nm{ color:var(--white); }
.bg-navy .note-sign .role{ color:var(--on-navy-soft); }
.bg-navy .note-figure img{ filter:grayscale(.12); }
.bg-navy .tlink{ color:var(--white); }
.bg-navy .devanagari{ color:var(--gold-glow,#D8BE73); }
.bg-navy .topper-card .tp-name{ color:var(--white); }
.bg-navy .topper-card .tp-pos{ color:var(--gold); }
/* WCAG-AA: gold small-cap labels keep --gold on navy (gold-dark would fail there) */
.bg-navy .feature-card .fc-kicker, .bg-navy .feature-card .fc-more .arrow{ color:var(--gold); }

/* --- Crest watermark: the real detailed crest as a robust <img> (§A) --- */
.has-crest{ position:relative; overflow:hidden; }
.has-crest .wrap{ position:relative; z-index:1; }
.crest-watermark{
  position:absolute; z-index:0; pointer-events:none; user-select:none;
  right:-60px; top:50%; transform:translateY(-50%);
  width:min(620px,56%); height:auto; opacity:.08;
}
.hero .crest-watermark{ opacity:.05; right:-20px; width:min(520px,50%); }
@media(max-width:760px){
  .crest-watermark{ right:-26%; opacity:.06; width:92%; }
  .hero .crest-watermark{ opacity:.045; }
}

/* --- Official heritage seal (About page only — content, not chrome) --- */
.official-seal{ display:flex; flex-direction:column; align-items:center; text-align:center; gap:clamp(26px,3.5vw,40px); }
/* Premium embossed medallion — ivory disc, engraved gold rim, soft depth */
.seal-stage{
  position:relative; display:grid; place-items:center;
  width:clamp(290px,34vw,392px); aspect-ratio:1/1; border-radius:50%;
  background:radial-gradient(circle at 50% 34%, #ffffff 0%, #f6efe3 62%, #ece1cd 100%);
  box-shadow:
    0 28px 56px -22px rgba(22,36,63,.40),
    0 8px 20px -10px rgba(22,36,63,.20),
    inset 0 2px 5px rgba(255,255,255,.95),
    inset 0 0 0 2px var(--gold),
    inset 0 0 0 4px rgba(255,255,255,.7),
    inset 0 0 0 5.5px rgba(176,141,58,.55);
}
.seal-stage::before{ content:""; position:absolute; inset:14px; border-radius:50%; border:1px solid rgba(201,168,76,.30); pointer-events:none; }
.seal-stage::after{ content:""; position:absolute; inset:0; border-radius:50%; pointer-events:none; background:radial-gradient(circle at 50% 18%, rgba(255,255,255,.5), transparent 42%); }
.official-seal .seal-img{ position:relative; width:63%; height:auto; filter:drop-shadow(0 8px 16px rgba(22,36,63,.22)); }
.official-seal .seal-copy{ max-width:60ch; }
.official-seal .seal-copy .kicker{ margin-bottom:14px; white-space:nowrap; }
.official-seal .seal-copy h3{ font-size:clamp(24px,3vw,34px); margin-bottom:14px; }
.official-seal .seal-copy p{ color:var(--text-soft); font-size:clamp(16px,1.5vw,18px); line-height:1.7; }

/* --- White cards keep their dark headings on navy anchors (fix §A bug) --- */
.bg-navy .feature-card h3,
.bg-navy .step h3,
.bg-navy .facility .fac-cap h3,
.bg-navy .form-card h3,
.bg-navy .future-slot h3,
.bg-navy .rt-stat .l{ color:var(--navy-deep); }

.section-head{ max-width:760px; margin:0 0 clamp(36px,5vw,56px); }
.section-head.center{ margin-left:auto; margin-right:auto; text-align:center; }
.section-head .kicker{ margin-bottom:18px; }
.section-head h2{
  font-size:clamp(30px,4.4vw,46px);
  margin:0 0 16px;
}
.section-head .lede{
  font-size:clamp(17px,1.5vw,19px);
  color:var(--text-soft); line-height:1.6; max-width:60ch;
}
.section-head.center .lede{ margin-inline:auto; }

/* Standalone lede — the ONE intro-copy scale, usable outside .section-head */
.lede{
  font-size:clamp(17px,1.5vw,19px);
  color:var(--text-soft); line-height:1.65; max-width:60ch;
}
.lede.sm{ font-size:16px; }

/* Secondary heading scales — replace ad-hoc inline clamps */
.prose h2{ font-size:clamp(26px,3.4vw,38px); margin:14px 0 18px; }
.h2-feature{ font-size:clamp(28px,4vw,42px); margin-top:16px; }

/* Editorial serif body — story prose only (About story, founder/principal
   notes, Legacy intro). Never on UI copy, cards or forms. */
.prose-serif p{ font-family:var(--font-prose); font-size:18px; line-height:1.78; }
.prose-serif p.lead{ font-family:var(--font-display); font-size:clamp(20px,2.2vw,26px); line-height:1.45; }
.note-body.prose-serif p, .prose-serif.note-body p{ font-family:var(--font-prose); font-size:17px; line-height:1.75; }

/* Thin gold rule used sparingly as an accent divider */
.gold-rule{ width:54px; height:3px; background:var(--gold); border-radius:2px; }

/* =====================================================================
   BUTTONS
   - Primary  : solid navy, white text
   - Accent   : solid gold, NAVY text (the approved gold pairing) — key CTAs
   - Ghost    : navy outline on light  /  light outline on navy
   ===================================================================== */
.btn{
  --btn-bg:var(--navy); --btn-fg:var(--white); --btn-bd:var(--navy);
  display:inline-flex; align-items:center; gap:10px;
  font-family:var(--font-ui); font-size:15px; font-weight:600;
  letter-spacing:.01em; line-height:1;
  padding:15px 26px; min-height:48px;
  border-radius:var(--r-sm);
  background:var(--btn-bg); color:var(--btn-fg);
  border:1.5px solid var(--btn-bd);
  text-decoration:none; cursor:pointer; white-space:nowrap;
  transition:background .22s ease, color .22s ease, border-color .22s ease,
             transform .22s ease, box-shadow .22s ease;
}
.btn[hidden]{ display:none; }
.btn .arrow{ transition:transform .22s ease; }
.btn:hover{ transform:translateY(-2px); box-shadow:var(--shadow-md); }
.btn:hover .arrow{ transform:translateX(4px); }
.btn:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
.btn:disabled{ opacity:.65; cursor:wait; transform:none; box-shadow:none; }

.btn:hover{ background:var(--navy-deep); border-color:var(--navy-deep); }

.btn.accent{ background:var(--gold-grad); color:var(--navy-deep); border-color:var(--gold-deep); font-weight:700; }
.btn.accent:hover{ background:var(--gold-grad-h); border-color:var(--gold-deep); color:var(--navy-deep); }

.btn.ghost{ --btn-bg:transparent; --btn-fg:var(--navy); --btn-bd:var(--rule-strong); }
.btn.ghost:hover{ background:var(--navy); color:var(--white); border-color:var(--navy); }

.on-navy .btn.ghost, .btn.ghost.on-navy{ --btn-fg:var(--white); --btn-bd:rgba(255,255,255,.4); }
.on-navy .btn.ghost:hover, .btn.ghost.on-navy:hover{ background:var(--white); color:var(--navy-deep); border-color:var(--navy-deep); }

/* Glass — frosted secondary for DARK / PHOTO surfaces only (never the gold
   primary, never light backgrounds). Solid navy fallback where blur is absent. */
.btn.glass{ --btn-bg:rgba(255,255,255,.13); --btn-fg:var(--white); --btn-bd:rgba(255,255,255,.36);
  -webkit-backdrop-filter:blur(12px) saturate(1.25); backdrop-filter:blur(12px) saturate(1.25);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.24), 0 8px 24px rgba(0,0,0,.22); }
.btn.glass:hover{ background:rgba(255,255,255,.22); color:var(--white); border-color:rgba(255,255,255,.55); }
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .btn.glass{ --btn-bg:rgba(28,42,74,.88); }
}

.btn.sm{ padding:11px 18px; min-height:44px; font-size:14px; }

/* Text link with animated gold underline */
.tlink{
  display:inline-flex; align-items:center; gap:8px;
  font-weight:600; font-size:15px; color:var(--navy);
  text-decoration:none; position:relative;
}
.tlink::after{
  content:""; position:absolute; left:0; bottom:-3px; height:2px; width:100%;
  background:var(--gold); transform:scaleX(0); transform-origin:left;
  transition:transform .25s ease;
}
.tlink:hover::after{ transform:scaleX(1); }
.tlink:hover .arrow{ transform:translateX(4px); }
.tlink .arrow{ transition:transform .22s ease; }
.tlink:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; border-radius:2px; }

/* =====================================================================
   ANNOUNCEMENT RIBBON — top-of-site, brand-forward (gold → navy → paper)
   ===================================================================== */
.oa-announce{ background:var(--navy-deep); color:var(--on-navy); border-bottom:1px solid rgba(201,168,76,.32); transition:opacity .4s ease, transform .4s cubic-bezier(.22,1,.36,1); position:relative; overflow:hidden; }
.oa-announce .ann-emblem{ height:26px; width:auto; display:inline-block; vertical-align:middle; flex:none; }
.oa-announce .wrap{ display:flex; gap:10px 16px; align-items:center; justify-content:center; min-height:42px; padding-block:9px; text-align:center; flex-wrap:wrap; }
.oa-announce .ann-star{ color:var(--gold); }
.oa-announce span{ font-size:13px; font-weight:500; letter-spacing:.01em; color:var(--on-navy); }
.oa-announce strong{ font-weight:700; color:#fff; }
.oa-announce a{ font-size:inherit; color:var(--gold); font-weight:700; text-decoration:none; white-space:nowrap; display:inline-flex; align-items:center; gap:6px; border-bottom:1.5px solid rgba(201,168,76,.5); }
.oa-announce a:hover{ border-bottom-color:var(--gold); }
@media(max-width:560px){ .oa-announce span{ font-size:12px; } .oa-announce .wrap{ gap:6px 14px; } }
/* The ribbon rotates between two messages of DIFFERENT LENGTH every 6 seconds. Left to lay
   out freely, the longer one wraps to an extra line on a phone and the strip grows 80px -> 119px,
   so the entire page below it — hero, both CTAs, everything — jumps 39px twice a minute, and the
   second hero CTA slides down behind the fixed Enquire/WhatsApp/Call bar. (It is also why a
   measurement taken before the first rotation and a screenshot taken after it disagreed: the
   page genuinely has two different layouts depending on the second you look at it.)
   Pin the height so a rotation is a crossfade, never a reflow. */
@media(max-width:760px){
  .oa-announce .wrap{ height:60px; min-height:0; padding-block:0; flex-wrap:nowrap; gap:0 10px; }
  .oa-announce span{ min-width:0; text-align:left; overflow:hidden;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
  .oa-announce a{ flex:none; }
  .oa-announce .ann-emblem{ height:22px; }
  .oa-announce .ann-star{ flex:none; }
}

/* a slow gold sheen sweeps the ribbon — draws the eye without shouting */
.oa-announce::after{ content:""; position:absolute; top:0; bottom:0; left:0; width:55%;
  pointer-events:none; z-index:1; transform:translateX(-180%) skewX(-20deg);
  background:linear-gradient(100deg, transparent 34%, rgba(255,231,165,.30) 50%, transparent 66%);
  animation:ann-shimmer 3.5s ease-in-out infinite; }
@keyframes ann-shimmer{ 0%{ transform:translateX(-180%) skewX(-20deg); }
  55%,100%{ transform:translateX(320%) skewX(-20deg); } }
@media(prefers-reduced-motion:reduce){ .oa-announce::after{ display:none; } }

/* =====================================================================
   HERITAGE STRIP — slim top bar
   ===================================================================== */
.heritage-strip{
  background:var(--navy-deep);
  color:var(--on-navy-soft);
  border-bottom:1px solid rgba(201,168,76,.35);
}
.heritage-strip .wrap{
  display:flex; align-items:center; justify-content:center; gap:14px;
  flex-wrap:wrap; min-height:38px; padding-block:8px;
  font-size:11px; letter-spacing:.18em; text-transform:uppercase; font-weight:500;
}
.heritage-strip strong{ color:var(--gold); font-weight:600; }
.heritage-strip .sep{ color:var(--gold); opacity:.7; }
/* one fact = one unbreakable flex item, so the strip wraps BETWEEN facts, never inside one */
.heritage-strip .hs-i{ white-space:nowrap; }
@media(max-width:560px){
  /* Four facts cannot sit on one phone line, so the strip always wraps — and letting flex
     decide where gave first a dangling ★ at the end of line one, then a lone orphan on
     line two. A 2x2 grid fixes the break instead of hoping for it: two facts per row at
     every phone width. The stars go, since a grid cell boundary already separates them. */
  /* Left, not centred: on Home this band sits directly under the hero copy column, and a
     centred grid there introduces a second alignment axis against the h1, lede and actions
     that all start at the 28px gutter. One shared edge for the whole navy block. */
  .heritage-strip .wrap{ display:grid; grid-template-columns:repeat(2,auto);
    justify-content:start; justify-items:start; gap:7px 22px;
    font-size:10px; letter-spacing:.12em; }
  .heritage-strip .sep{ display:none; }
}
/* The facts are nowrap, so the two columns have a hard floor: the widest pair plus the gap
   is ~299px, and a 320px viewport only offers 264px between the gutters. Below that the
   grid has to drop to one column or it pushes the page 3px wider than the viewport. */
@media(max-width:359px){
  .heritage-strip .wrap{ grid-template-columns:1fr; }
}

/* =====================================================================
   HEADER / NAV — sticky, warm, parent-facing
   ===================================================================== */
.site-header{
  position:sticky; top:0; z-index:60;
  background:rgba(14,23,38,.98);
  /* no backdrop-filter on this sticky bar — iOS Safari mis-composites fixed/sticky
     backdrop-filter layers as a stray black rectangle; the bar is opaque anyway. */
  border-bottom:1px solid var(--gold);
  box-shadow:0 2px 10px -4px rgba(0,0,0,.4);
  transition:box-shadow .25s ease, background .25s ease;
}
.site-header.scrolled{ box-shadow:0 8px 26px -10px rgba(0,0,0,.6); background:rgba(14,23,38,.99); }
.header-inner{
  max-width:var(--maxw); margin:0 auto; padding:12px 28px;
  display:flex; align-items:center; justify-content:space-between; gap:24px;
  min-height:var(--header-h);
}
.brand{ display:flex; align-items:center; gap:14px; text-decoration:none; color:inherit; }
.brand > img{ height:54px; width:auto; object-fit:contain; flex:none; }
.brand-text{ display:flex; flex-direction:column; line-height:1.05; }
.brand-name{ font-family:var(--font-display); font-weight:700; font-size:21px; color:var(--white); letter-spacing:-0.01em; }
.brand-sub{ font-size:10.5px; letter-spacing:.2em; text-transform:uppercase; color:var(--gold); font-weight:600; margin-top:3px; }

.main-nav{ display:flex; align-items:center; gap:22px; }
.main-nav a{
  font-size:15px; font-weight:500; color:var(--on-navy); text-decoration:none;
  position:relative; padding:4px 0; transition:color .2s ease; white-space:nowrap;
}
.main-nav a::after{
  content:""; position:absolute; left:0; right:0; bottom:-2px; height:2px;
  background:var(--gold); transform:scaleX(0); transform-origin:center;
  transition:transform .22s ease;
}
.main-nav a:hover{ color:var(--white); }
.main-nav a:hover::after, .main-nav a[aria-current="page"]::after{ transform:scaleX(1); }
.main-nav a[aria-current="page"]{ color:var(--white); font-weight:600; }
.header-cta{ display:flex; align-items:center; gap:14px; }

/* =====================================================================
   TOP BAR + FULL NAME LOCKUP (owner, 24 Sep 2026: "header should look like the design")
   ---------------------------------------------------------------------
   A slim navy utility bar above the sticky header on every page: the 66-years line in the
   middle, the address, the admissions number and Instagram / Facebook / YouTube on the right.
   It scrolls away; only the header below it sticks. The school name reads as the full
   three-line lockup: ORIENTAL ACADEMY / Senior Secondary School / Light to Enlighten.
   The header runs wider than the 1200px content column so the name never wraps beside the nav.
   ===================================================================== */
:root{ --tb-h:39px; }
@media(max-width:760px){ :root{ --tb-h:41px; } }
.oa-topbar{ background:var(--navy-deep); color:var(--on-navy); border-bottom:1px solid rgba(201,168,76,.3);
  font-family:var(--font-ui); font-size:12.5px; line-height:1.3; position:relative; z-index:61; }
.tb-inner{ max-width:1360px; margin:0 auto; padding:0 28px; min-height:38px; display:flex; align-items:center; gap:10px 24px; }
.tb-msg{ margin:0 auto; display:flex; align-items:center; gap:10px; min-width:0; white-space:nowrap; }
.tb-emblem{ height:22px; width:auto; flex:none; }
.tb-msg strong{ color:#fff; font-weight:600; }
.tb-msg a{ color:var(--gold); font-weight:600; text-decoration:none; border-bottom:1px solid rgba(201,168,76,.5); padding:4px 0 1px; }
.tb-msg a:hover{ border-bottom-color:var(--gold); }
.tb-util{ list-style:none; margin:0; padding:0; display:flex; align-items:center; flex:none; }
.tb-util > li{ display:flex; align-items:center; padding:0 16px; }
.tb-util > li + li{ border-left:1px solid rgba(255,255,255,.16); }
.tb-util > li:last-child{ padding-right:0; }
.tb-util a{ display:inline-flex; align-items:center; gap:7px; color:var(--on-navy-soft); text-decoration:none; white-space:nowrap; transition:color .2s ease; }
.tb-util a:hover{ color:#fff; }
.tb-util svg{ width:14px; height:14px; flex:none; color:var(--gold); }
.tb-soc{ gap:4px; }
.tb-soc a{ width:30px; height:30px; justify-content:center; border-radius:50%; }
.tb-soc a svg{ width:16px; height:16px; color:currentColor; }
.tb-soc a:hover{ background:rgba(255,255,255,.08); }
.oa-topbar a:focus-visible{ outline:2px solid var(--gold); outline-offset:2px; border-radius:3px; }
@media(max-width:1160px){ .tb-addr{ display:none !important; } }
@media(max-width:760px){
  .tb-inner{ padding:0 14px 0 18px; min-height:40px; gap:8px; }
  .tb-msg{ margin:0; gap:8px; font-size:12px; }
  .tb-yrs, .tb-tel{ display:none !important; }
  .tb-util > li{ padding:0; }
  .tb-util > li + li{ border-left:0; }
  .tb-util{ margin-left:auto; }
}
@media(max-width:520px){ .tb-cel{ display:none; } }
@media(max-width:380px){ .tb-emblem{ display:none; } .tb-msg{ font-size:11.5px; } .tb-soc a{ width:28px; } }
@media(max-width:350px){ .tb-msg a{ display:none; } }

.header-inner{ max-width:1360px; }
.brand-text{ align-items:center; line-height:1; }
.brand-name{ font-size:23px; text-transform:uppercase; letter-spacing:.012em; white-space:nowrap; line-height:1.05; }
.brand-sub{ margin-top:5px; font-size:10px; letter-spacing:.21em; font-weight:500; color:var(--on-navy-soft); white-space:nowrap; }
.brand-motto{ display:flex; align-items:center; gap:7px; margin-top:5px; font:600 9px/1 var(--font-ui);
  letter-spacing:.26em; text-transform:uppercase; color:var(--gold); white-space:nowrap; }
.brand-motto::before, .brand-motto::after{ content:""; width:16px; height:1px; background:currentColor; opacity:.55; }
body.chrome-light .brand-sub{ color:#3A4763; }
body.chrome-light .brand-motto{ color:var(--gold-dark); }
@media(min-width:1161px) and (max-width:1320px){
  .brand-name{ font-size:20px; }
  .brand-sub{ font-size:9px; letter-spacing:.18em; }
  .brand-motto{ font-size:8.5px; letter-spacing:.22em; }
  .main-nav{ gap:16px; }
  .main-nav a, .main-nav .nav-dd > summary{ font-size:14.5px; }
  .header-cta .btn.sm{ padding:10px 14px; }
}
@media(min-width:1161px) and (max-width:1250px){
  /* the last few widths before the nav folds into the menu button */
  .header-inner{ gap:16px; padding-left:20px; padding-right:20px; }
  .brand{ gap:10px; }
  .brand > img{ height:48px; }
  .brand-name{ font-size:18px; }
  .brand-sub{ font-size:8.5px; letter-spacing:.15em; }
  .brand-motto{ font-size:8px; letter-spacing:.2em; }
  .main-nav{ gap:13px; }
  .main-nav a, .main-nav .nav-dd > summary{ font-size:14px; }
}

/* Mobile nav toggle */
.nav-toggle{
  display:none; flex-direction:column; gap:5px; justify-content:center;
  width:46px; height:46px; border:1.5px solid rgba(255,255,255,.32); border-radius:var(--r-sm);
  background:transparent; cursor:pointer; padding:0;
}
.nav-toggle span{ width:20px; height:2px; background:var(--white); margin:0 auto; transition:.25s; }
.nav-toggle[aria-expanded="true"] span:nth-child(1){ transform:translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2){ opacity:0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3){ transform:translateY(-7px) rotate(-45deg); }
.nav-toggle:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }

/* Header breakpoint is 1100, not 980: between 981 and ~1150 the full horizontal nav does not
   fit beside the wordmark, so 'Oriental Academy' wrapped to two lines and 'Home' printed on
   top of 'Academy' — visible on every page at iPad width. The four header blocks and their
   min-width:1101px desktop counterpart must move together. */
@media(max-width:1160px){
  .main-nav{
    position:absolute; top:100%; left:0; right:0;
    flex-direction:column; align-items:stretch; gap:0;
    background:var(--navy-deep); border-bottom:1px solid rgba(201,168,76,.3);
    box-shadow:var(--shadow-md);
    max-height:0; overflow:hidden; transition:max-height .3s ease;
  }
  .main-nav.open{ max-height:70vh; }
  .main-nav a{ padding:15px 28px; border-top:1px solid var(--rule-navy); font-size:16px; }
  .main-nav a::after{ display:none; }
  .nav-toggle{ display:flex; }
  .header-cta .btn:not(.nav-toggle){ display:none; }
  /* drawer items settle in with a soft cascade when the menu opens (JS-gated; instant close) */
  .oa-js .main-nav > *{ opacity:0; transform:translateY(-7px); transition:opacity .26s ease, transform .26s ease; }
  .oa-js .main-nav.open > *{ opacity:1; transform:none; }
  .oa-js .main-nav.open > *:nth-child(2){ transition-delay:.03s; }
  .oa-js .main-nav.open > *:nth-child(3){ transition-delay:.06s; }
  .oa-js .main-nav.open > *:nth-child(4){ transition-delay:.09s; }
  .oa-js .main-nav.open > *:nth-child(5){ transition-delay:.12s; }
  .oa-js .main-nav.open > *:nth-child(6){ transition-delay:.15s; }
  .oa-js .main-nav.open > *:nth-child(7){ transition-delay:.18s; }
  .oa-js .main-nav.open > *:nth-child(n+8){ transition-delay:.21s; }
}

/* ============================================================
   HEADER DROPDOWNS — native <details> menus (no custom mega-menu JS).
   Desktop: click-to-open paper panel; Mobile: inline accordion in the hamburger.
   Panel is a self-contained paper card so it reads under the navy OR light header.
   ============================================================ */
.main-nav .nav-dd{ position:relative; }
.main-nav .nav-dd > summary{
  list-style:none; cursor:pointer; white-space:nowrap; display:inline-flex; align-items:center; gap:7px;
  font-size:15px; font-weight:500; color:var(--on-navy); padding:4px 0; transition:color .2s ease;
  -webkit-tap-highlight-color:transparent;
}
.main-nav .nav-dd > summary::-webkit-details-marker{ display:none; }
.main-nav .nav-dd > summary::after{
  content:""; width:7px; height:7px; border-right:2px solid currentColor; border-bottom:2px solid currentColor;
  transform:rotate(45deg) translateY(-2px); transition:transform .22s ease; opacity:.75;
}
.main-nav .nav-dd[open] > summary::after{ transform:rotate(-135deg) translateY(1px); }
.main-nav .nav-dd > summary:hover{ color:var(--white); }
.main-nav .nav-dd > summary:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; border-radius:3px; }
.main-nav .nav-dd > summary[data-current]{ color:var(--white); font-weight:600; }
body.chrome-light .main-nav .nav-dd > summary{ color:#33415C; }
body.chrome-light .main-nav .nav-dd > summary:hover,
body.chrome-light .main-nav .nav-dd > summary[data-current]{ color:var(--navy-deep); }
.main-nav .nav-dd-panel{
  position:absolute; top:calc(100% + 12px); left:50%; transform:translateX(-50%);
  min-width:250px; max-width:calc(100vw - 24px); background:var(--paper);
  border:1px solid var(--rule-strong); border-radius:var(--r-md); box-shadow:var(--shadow-lg);
  padding:8px; z-index:70; display:flex; flex-direction:column;
}
.main-nav .nav-dd-panel::before{
  content:""; position:absolute; top:-1px; left:16px; right:16px; height:2px; border-radius:2px;
  background:linear-gradient(90deg,var(--gold-dark),var(--gold) 50%,var(--gold-dark));
}
.main-nav .nav-dd-panel a{
  display:flex; align-items:center; gap:4px; padding:11px 14px; min-height:44px; border-radius:var(--r-sm);
  font-size:14.5px; font-weight:500; color:var(--navy-deep); white-space:nowrap; text-decoration:none;
  transition:background .15s ease, color .15s ease;
}
.main-nav .nav-dd-panel a::after{ display:none; }
.main-nav .nav-dd-panel a:hover, .main-nav .nav-dd-panel a:focus-visible{ background:var(--offwhite); color:var(--navy-deep); outline:none; }
.main-nav .nav-dd-panel a[aria-current="page"]{ background:var(--offwhite); color:var(--navy-deep); font-weight:700; }
.main-nav .nav-dd-ext{ color:var(--gold-dark); font-size:11px; }
@media(max-width:1160px){
  /* inline accordion inside the open hamburger menu — display:flex (NOT the desktop inline-flex)
     so the row stretches full width: the divider runs edge to edge and the chevron sits flush right */
  .main-nav .nav-dd > summary{ display:flex; width:100%; padding:15px 28px; font-size:16px; justify-content:space-between; border-top:1px solid var(--rule-navy); color:var(--on-navy); }
  body.chrome-light .main-nav .nav-dd > summary{ border-top:1px solid var(--rule); color:#33415C; }
  .main-nav .nav-dd-panel{ position:static; transform:none; min-width:0; max-width:none; background:transparent; border:0; box-shadow:none; border-radius:0; padding:0; }
  .main-nav .nav-dd-panel::before{ display:none; }
  .main-nav .nav-dd-panel a{ padding:13px 28px 13px 46px; min-height:0; border-radius:0; border-top:1px solid var(--rule-navy); color:var(--on-navy); font-size:15px; }
  body.chrome-light .main-nav .nav-dd-panel a{ border-top:1px solid var(--rule); color:#33415C; }
}
@media(max-width:560px){
  .brand img{ width:48px; height:48px; }
  .brand-name{ font-size:18px; }
  .brand-sub{ font-size:8.5px; letter-spacing:.17em; margin-top:4px; }
  .brand-motto{ display:none; }
  .header-inner{ padding:10px 18px; }
}
@media(max-width:374px){
  .header-inner{ gap:10px; padding-left:14px; padding-right:14px; }
  .brand{ gap:8px; }
  .brand img{ width:40px; height:40px; }
  .brand-name{ font-size:16px; }
  .brand-sub{ font-size:7.5px; letter-spacing:.14em; }
}
@media(max-width:340px){ .brand-name{ font-size:15px; } }

/* =====================================================================
   HERO
   ===================================================================== */
.hero{ background:linear-gradient(180deg,var(--paper) 0%, var(--offwhite) 100%); position:relative; overflow:hidden; }
.hero-inner{
  display:grid; grid-template-columns:1.05fr .95fr; gap:clamp(32px,5vw,72px);
  align-items:center;
  padding:clamp(48px,7vw,92px) 0 clamp(56px,7vw,96px);
}
.hero-copy{ max-width:560px; }
/* Timely announcement chip */
.hero h1{
  font-size:clamp(38px,5.6vw,66px);
  line-height:1.04; letter-spacing:-0.02em; margin:22px 0 0;
  color:var(--navy-deep);
}
.hero h1 em{ font-style:italic; font-weight:600; color:var(--blue); }
.hero-lede{
  font-size:clamp(17px,1.6vw,20px); color:var(--text-soft);
  line-height:1.6; margin:22px 0 0; max-width:48ch;
}
.hero-ctas{ display:flex; flex-wrap:wrap; gap:14px; margin-top:34px; }
.hero-trust{
  display:flex; flex-wrap:wrap; gap:10px 22px; margin-top:34px;
  padding-top:26px; border-top:1px solid var(--rule);
}
.hero-trust .ht{ display:flex; align-items:baseline; gap:8px; }
.hero-trust .ht b{
  font-family:var(--font-display); font-size:22px; font-weight:700; color:var(--navy-deep);
}
.hero-trust .ht span{ font-size:12.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-muted); font-weight:500; }

/* Hero image — framed warm photo with a quiet gold hairline */
.hero-figure{ position:relative; }
.hero-figure .photo-frame{
  position:relative; border-radius:var(--r-lg); overflow:hidden;
  box-shadow:var(--shadow-lg);
  border:1px solid var(--rule-strong);
}
.hero-figure .photo-frame::after{
  content:""; position:absolute; inset:10px; border:1px solid rgba(201,168,76,.55);
  border-radius:6px; pointer-events:none;
}
.hero-figure img{ width:100%; aspect-ratio:4/3.1; object-fit:cover; object-position:center 28%; }
.hero-figure figcaption{
  position:absolute; left:0; right:0; bottom:0;
  padding:34px 22px 16px;
  background:linear-gradient(0deg, rgba(22,36,63,.82), transparent);
  color:var(--on-navy); font-size:13px; letter-spacing:.02em;
}
.hero-figure figcaption .cap-year{ color:var(--gold); font-weight:600; }
/* Small crest medallion overlapping the photo */
.hero-medallion{
  position:absolute; top:-22px; left:-22px; width:84px; height:84px;
  background:var(--paper); border-radius:var(--r-pill);
  display:grid; place-items:center; box-shadow:var(--shadow-md);
  border:1px solid var(--rule);
}
.hero-medallion img{ width:62px; height:62px; object-fit:contain; }

@media(max-width:880px){
  .hero-inner{ grid-template-columns:1fr; gap:40px; padding-top:40px; }
  .hero-figure{ order:-1; max-width:560px; }
  .hero-medallion{ width:68px; height:68px; top:-16px; left:-16px; }
  .hero-medallion img{ width:50px; height:50px; }
}
@media(max-width:560px){
  .hero-figure img{ aspect-ratio:4/3.4; }
  .hero-trust{ gap:8px 18px; }
  .hero-trust .ht b{ font-size:19px; }
}

/* =====================================================================
   STAT BAND — plain trust signals on navy
   ===================================================================== */
.stat-band{ background:var(--navy); color:var(--on-navy); border-top:3px solid var(--gold); }
.stat-grid{
  display:grid; grid-template-columns:repeat(3,1fr);
}
@media(min-width:761px){ .stat-cell:nth-child(3n){ border-right:none; } }
.stat-cell{
  padding:clamp(32px,4vw,52px) 24px; text-align:center;
  border-right:1px solid var(--rule-navy);
  display:flex; flex-direction:column; gap:10px; align-items:center;
}
.stat-cell:last-child{ border-right:none; }
.stat-num{
  font-family:var(--font-display); font-weight:700;
  font-size:clamp(38px,5vw,58px); line-height:1; color:var(--white);
  letter-spacing:-0.02em;
}
.stat-num .plus{ color:var(--gold); }
.stat-num.text{ font-size:clamp(30px,3.6vw,44px); }
.stat-label{ font-size:12.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--on-navy-soft); font-weight:500; }
@media(max-width:760px){
  .stat-grid{ grid-template-columns:repeat(2,1fr); }
  /* 2-col grid: kill the right border on every right-column (even) cell — the old
     :nth-child(2) rule left cell 4 with a spurious vertical line. Row dividers run
     under rows 1 & 2 (cells 1-4), never trailing under the last row. */
  .stat-cell:nth-child(even){ border-right:none; }
  .stat-cell:nth-child(-n+4){ border-bottom:1px solid var(--rule-navy); }
  /* An odd number of stats leaves the last one alone in the left column with an empty cell
     beside it. Let it span the row and centre, and drop the divider that would trail under it. */
  .stat-grid > .stat-cell:last-child:nth-child(odd){ grid-column:1 / -1; border-bottom:none; }
}
@media(max-width:400px){ .stat-cell{ padding-inline:12px; } .stat-label{ letter-spacing:.1em; } }
/* ---- Phone: three stats in a 2-column grid always leaves the third alone. Spanning and
   centring it (the rule above) removed the empty cell but left a 2-then-1 shape where the
   last stat reads as an afterthought, with a vertical rule between the first pair and a
   horizontal one above the third. Three is not a grid on a 334px column — it is a list.
   Number column and label column, hairline between rows, aligned to the same 28px gutter
   as the hero and the heritage strip. Also SHORTER than the 2+1 it replaces. ---- */
@media(max-width:560px){
  .stat-grid{ grid-template-columns:1fr; }
  .stat-cell{ flex-direction:row; align-items:baseline; gap:16px; text-align:left;
    padding:18px 0; border-right:0; border-bottom:1px solid var(--rule-navy); }
  .stat-cell:last-child{ border-bottom:0; }
  /* undo the span/centre hack — there is only one column now */
  .stat-grid > .stat-cell:last-child:nth-child(odd){ grid-column:auto; }
  .stat-cell:nth-child(-n+4){ border-bottom:1px solid var(--rule-navy); }
  /* a fixed measure on the numeral puts every label on one shared left edge */
  /* the reserve must clear the WIDEST numeral ('1,500+'), or that row alone pushes its
     label right and the shared label edge is lost again */
  .stat-num{ font-size:34px; flex:none; min-width:8.2ch; }
  .stat-label{ letter-spacing:.1em; line-height:1.35; }
}

/* =====================================================================
   FEATURE CARDS — "Why families choose us"
   ===================================================================== */
.card-grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:24px; }
.card-grid.cols-3{ grid-template-columns:repeat(3,1fr); }
.feature-card{
  display:flex; flex-direction:column;
  background:var(--white); border:1px solid var(--rule);
  border-radius:var(--r-md); overflow:hidden;
  text-decoration:none; color:inherit;
  transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.feature-card:hover{ transform:translateY(-4px); box-shadow:var(--shadow-lg); border-color:var(--rule-strong); }
.feature-card:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
.feature-card .fc-media{ aspect-ratio:3/2; background:var(--offwhite); overflow:hidden; position:relative; }
.feature-card .fc-media img{ width:100%; height:100%; object-fit:cover; transition:transform .5s ease; }
.feature-card:hover .fc-media img{ transform:scale(1.05); }
.feature-card .fc-body{ padding:22px 22px 24px; display:flex; flex-direction:column; gap:10px; flex:1; }
.feature-card .fc-kicker{ font-size:11.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); font-weight:600; }
.feature-card h3{ font-size:22px; }
.feature-card p{ color:var(--text-soft); font-size:15.5px; line-height:1.55; }
.feature-card .fc-more{
  margin-top:auto; padding-top:8px;
  font-weight:600; font-size:14.5px; color:var(--navy);
  display:inline-flex; align-items:center; gap:8px;
}
.feature-card .fc-more .arrow{ transition:transform .22s ease; color:var(--gold-dark); }
.feature-card:hover .fc-more .arrow{ transform:translateX(4px); }
/* Photo-less card variant — premium editorial, no stock imagery */
.feature-card.plain{
  position:relative; overflow:hidden;
  padding:34px 28px 26px; gap:0;
  display:flex; flex-direction:column;
}
.feature-card.plain::before{
  content:""; position:absolute; top:0; left:0; right:0; height:4px;
  background:linear-gradient(90deg,var(--gold-dark),var(--gold) 50%,var(--gold-dark));
}
.feature-card.plain .fc-mark{
  width:56px; height:56px; border-radius:var(--r-pill);
  background:var(--navy); color:var(--gold);
  display:grid; place-items:center; flex:none;
  font-family:var(--font-display); font-weight:700; font-size:21px;
  box-shadow:inset 0 0 0 1.5px rgba(201,168,76,.55);
  margin-bottom:22px;
}
.feature-card.plain .fc-mark svg{ width:28px; height:28px; stroke:currentColor; fill:none; stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round; }
.feature-card.plain .fc-mark svg .fill{ fill:currentColor; stroke:none; }
.feature-card.plain .fc-body{ padding:0; display:flex; flex-direction:column; flex:1; gap:0; }
.feature-card.plain .fc-kicker{ margin-bottom:11px; }
.feature-card.plain h3{ font-size:23px; line-height:1.16; margin:0 0 11px; color:var(--navy-deep); }
.feature-card.plain p{ color:var(--text-soft); font-size:15.5px; line-height:1.62; }
.feature-card.plain .fc-more{
  margin-top:22px; padding-top:18px;
  border-top:1px solid var(--rule);
  font-weight:600; font-size:14.5px; color:var(--navy);
  display:inline-flex; align-items:center; justify-content:space-between; gap:8px;
}
.feature-card.plain .fc-more .arrow{ color:var(--gold-dark); }
@media(max-width:980px){ .card-grid, .card-grid.cols-3{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:540px){ .card-grid, .card-grid.cols-3{ grid-template-columns:1fr; } }

/* =====================================================================
   LEGACY WALL — "Where Afghan Street Leads" (honour roll on navy)
   Repeatable, data-driven. All names/outcomes live in the HTML.
   ===================================================================== */
.legacy-statline{
  display:flex; flex-wrap:wrap; gap:26px 56px; align-items:flex-start;
  padding-bottom:34px; margin-bottom:40px; border-bottom:1px solid rgba(201,168,76,.3);
}
.legacy-statline .ls{ display:flex; flex-direction:column; gap:14px; }
.legacy-statline .ls b{ font-family:var(--font-display); font-weight:700; font-size:clamp(38px,5vw,54px); color:var(--gold); line-height:1; letter-spacing:-0.01em; white-space:nowrap; }
.legacy-statline .ls .ls-label{ font-size:12.5px; line-height:1.3; letter-spacing:.16em; text-transform:uppercase; color:var(--on-navy-soft); font-weight:500; }
.legacy-grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:18px; }
.legacy-grid.cols-3{ grid-template-columns:repeat(3,1fr); }
.legacy-card{
  display:flex; align-items:center; gap:16px;
  padding:18px 20px; border-radius:var(--r-md);
  background:rgba(255,255,255,.045);
  border:1px solid rgba(201,168,76,.22);
  transition:transform .25s ease, border-color .25s ease, background .25s ease;
}
.legacy-card:hover{ transform:translateY(-4px); border-color:rgba(201,168,76,.58); background:rgba(255,255,255,.07); }
.legacy-avatar{
  width:62px; height:62px; border-radius:var(--r-pill); flex:none; overflow:hidden;
  display:grid; place-items:center;
  background:var(--navy-deep); color:var(--gold);
  border:1.5px solid rgba(201,168,76,.5);
}
.legacy-avatar svg{ width:28px; height:28px; fill:none; stroke:currentColor; stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round; opacity:.95; }
.legacy-avatar svg .fill{ fill:currentColor; stroke:none; }
.legacy-card{ position:relative; overflow:hidden; }
.legacy-card::before{ content:""; position:absolute; left:0; top:0; bottom:0; width:4px; background:linear-gradient(var(--gold), var(--gold-dark)); opacity:.85; }
.legacy-card .legacy-info{ padding-left:2px; }
.legacy-avatar img{ width:100%; height:100%; object-fit:cover; }
/* Wall of Fame tiering (Alumni): the verified tier (first grid) gets a fuller gold
   ring on its monogram. The "wall continues" tier stays at full opacity (the old
   .82 fade dropped its text to about 3.7:1). Restrained: a ring, not a badge. */
.legacy-grid.is-verified .legacy-avatar{ border-color:var(--gold);
  box-shadow:0 0 0 3px rgba(201,168,76,.16); }
.legacy-info{ min-width:0; }
.legacy-info .lg-name{ font-family:var(--font-display); font-weight:600; font-size:17px; color:var(--white); line-height:1.18; }
.legacy-info .lg-outcome{ font-size:14px; color:var(--on-navy-soft); margin-top:4px; line-height:1.4; }
.legacy-info .lg-outcome .role{ color:var(--gold); font-weight:600; }
.legacy-info .lg-meta{ font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-glow,#D8BE73); font-weight:600; margin-top:8px; }
.legacy-foot{ display:flex; justify-content:center; margin-top:40px; }
@media(max-width:1040px){ .legacy-grid{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:980px){ .legacy-grid.cols-3{ grid-template-columns:repeat(2,1fr); } }

/* Light-ground Legacy Wall variant (Alumni) — warm, less navy, cards pop */
.legacy-light .legacy-statline{ border-bottom-color:var(--rule-strong); }
.legacy-light .legacy-statline .ls b{ color:var(--gold-dark); }
.legacy-light .legacy-statline .ls .ls-label{ color:var(--text-muted); }
.legacy-light .legacy-card{ background:var(--white); border:1px solid var(--rule); box-shadow:var(--shadow-sm); }
.legacy-light .legacy-card:hover{ border-color:var(--gold); background:var(--white); box-shadow:var(--shadow-md); }
.legacy-light .legacy-info .lg-name{ color:var(--navy-deep); }
.legacy-light .legacy-info .lg-outcome{ color:var(--text-soft); }
.legacy-light .legacy-info .lg-outcome .role{ color:var(--gold-dark); }
.legacy-light .legacy-info .lg-meta{ color:var(--gold-dark); }
.legacy-light .legacy-avatar{ background:var(--navy-deep); color:var(--gold); border-color:rgba(201,168,76,.5); }
@media(max-width:560px){ .legacy-grid, .legacy-grid.cols-3{ grid-template-columns:1fr; } }

/* named-alumni monogram placeholder (until real portraits are added) */
.legacy-avatar .lg-mono{ font-family:var(--font-display); font-weight:600; font-size:21px; letter-spacing:.02em; color:inherit; line-height:1; }

/* Wall of Fame — text honour roll (Tier 2/3 names) */
.honour-roll{ margin-top:48px; padding-top:34px; border-top:1px solid var(--rule-strong); }
.honour-roll .hr-title{ font-family:var(--font-display); font-weight:600; font-size:clamp(22px,3vw,30px); color:var(--navy-deep); text-align:center; margin:0; }
.honour-roll .hr-note{ text-align:center; color:var(--text-muted); max-width:62ch; margin:10px auto 28px; font-size:14px; line-height:1.55; }
.honour-roll .hr-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:26px 30px; }
.honour-roll .hr-col h4{ font-family:var(--font-ui); font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); border-bottom:1px solid var(--rule); padding-bottom:9px; margin:0 0 13px; }
.honour-roll .hr-col ul{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px; }
.honour-roll .hr-col li{ font-size:14px; color:var(--text-soft); line-height:1.4; }
.honour-roll .hr-col li b{ color:var(--navy-deep); font-weight:600; }

/* =====================================================================
   RESULTS TEASER
   ===================================================================== */
.results-teaser{ background:var(--offwhite); }
.rt-grid{ display:grid; grid-template-columns:1fr 1.15fr; gap:clamp(36px,5vw,64px); align-items:center; }
.rt-stats{ display:grid; grid-template-columns:1fr 1fr; gap:20px; margin:28px 0 30px; }
.rt-stat{ background:var(--white); border:1px solid var(--rule); border-radius:var(--r-md); padding:22px 22px; }
.rt-stat .n{ font-family:var(--font-display); font-weight:700; font-size:clamp(32px,4vw,44px); color:var(--navy-deep); line-height:1; }
.rt-stat .n .pct,.rt-stat .n .plus{ color:var(--gold-dark); }
.rt-stat .l{ font-size:13px; color:var(--text-soft); margin-top:8px; line-height:1.4; }
/* Faces row */
.faces{ display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
.face{ position:relative; border-radius:var(--r-md); overflow:hidden; border:1px solid var(--rule-strong); background:var(--navy); box-shadow:var(--shadow-sm); }
.face img{ width:100%; aspect-ratio:3/3.6; object-fit:cover; object-position:center 22%; }
.face .face-meta{ position:absolute; inset:auto 0 0 0; padding:24px 12px 10px; background:linear-gradient(0deg,rgba(22,36,63,.9),transparent); color:var(--white); }
.face .face-name{ font-family:var(--font-display); font-weight:600; font-size:15px; line-height:1.1; }
.face .face-pos{ font-size:11px; color:var(--gold); letter-spacing:.06em; margin-top:3px; }
.face .face-pct{ position:absolute; top:10px; right:10px; background:var(--gold); color:var(--navy-deep); font-weight:700; font-size:12.5px; padding:3px 8px; border-radius:var(--r-sm); }
@media(max-width:880px){ .rt-grid{ grid-template-columns:1fr; gap:36px; } }
@media(max-width:420px){ .faces{ grid-template-columns:repeat(2,1fr); } }

/* =====================================================================
   PULL-QUOTE / NOTE (founder & principal)
   ===================================================================== */
.note{ }
.note-grid{ display:grid; grid-template-columns:.85fr 1.15fr; gap:clamp(36px,5vw,64px); align-items:center; }
/* The two leadership notes put the portrait in DIFFERENT columns (Principal: text then figure;
   Vice Principal and the founder note on Home: figure then text), so the same component was
   rendering a 612px-wide portrait in one section and a 452px one in the next — and the taller
   frame, centred against only two lines of text, left a column of dead cream with the caption
   badge apparently floating in it. Cap the frame and push it to the outer edge instead, so every
   leadership portrait on the site is the same size wherever it sits in the grid. */
.note-figure{ max-width:420px; width:100%; }
.note-grid > .note-figure:first-child{ justify-self:start; }
.note-grid > .note-figure:last-child{ justify-self:end; }
@media(max-width:840px){ .note-figure{ max-width:none; } .note-grid > .note-figure{ justify-self:stretch; } }
.note-figure{ position:relative; }
/* base .photo-frame — the scoped variants below still override where they apply */
.photo-frame{ position:relative; border-radius:var(--r-lg); overflow:hidden;
  box-shadow:var(--shadow-lg); border:1px solid var(--rule-strong); }
.photo-frame > img, .photo-frame > picture > img{ display:block; width:100%; height:auto; }

.note-figure .photo-frame{ border-radius:var(--r-lg); overflow:hidden; box-shadow:var(--shadow-lg); border:1px solid var(--rule-strong); position:relative; }
.note-figure .photo-frame::after{ content:""; position:absolute; inset:9px; border:1px solid rgba(201,168,76,.5); border-radius:6px; pointer-events:none; }
.note-figure img{ width:100%; aspect-ratio:4/5; object-fit:cover; object-position:center 20%; filter:grayscale(.15); }
/* Founder archival portrait carries a baked-in gold "Sh. Ved Parkash Chauhan" caption at the
   bottom-right — frame it at its true 714:985 ratio so the whole portrait + caption show uncropped. */
.note-figure img.archival-img{ aspect-ratio:auto; height:auto; object-fit:fill; }
.note-figure .note-badge{
  position:absolute; bottom:-14px; right:18px; background:var(--navy); color:var(--gold);
  font-size:11px; letter-spacing:.16em; text-transform:uppercase; font-weight:600;
  padding:8px 16px; border-radius:var(--r-sm); box-shadow:var(--shadow-md);
}
.note-quote{
  font-family:var(--font-display); font-style:italic; font-weight:500;
  font-size:clamp(24px,3vw,34px); line-height:1.32; color:var(--navy-deep);
  margin:18px 0 22px; letter-spacing:-0.01em;
}
.note-body p{ color:var(--text-soft); font-size:16.5px; line-height:1.7; margin-bottom:16px; }
.note-body p strong{ color:var(--navy-deep); font-weight:600; }
.note-sign{ margin-top:26px; padding-top:20px; border-top:1px solid var(--rule); display:flex; flex-direction:column; gap:3px; }
.note-sign .nm{ font-family:var(--font-display); font-weight:600; font-size:20px; color:var(--navy-deep); }
.note-sign .role{ font-size:13px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-soft); font-weight:500; }   /* text-soft, not text-muted: muted measured 4.49:1 on the heritage band (About) */
@media(max-width:840px){ .note-grid{ grid-template-columns:1fr; gap:48px; } .note-figure{ max-width:420px; } }

/* =====================================================================
   CTA BAND
   ===================================================================== */
.cta-band{ background:var(--navy-deep); color:var(--on-navy); position:relative; overflow:hidden; }
.cta-band::before{
  content:""; position:absolute; inset:0; pointer-events:none; opacity:.5;
  background:radial-gradient(ellipse 60% 80% at 85% 0%, rgba(201,168,76,.16), transparent 60%);
}
.cta-inner{ display:flex; align-items:center; justify-content:space-between; gap:36px; flex-wrap:wrap; position:relative; }
.cta-inner h2{ color:var(--white); font-size:clamp(28px,3.6vw,42px); max-width:18ch; }
.cta-inner .cta-sub{ color:var(--on-navy-soft); margin-top:14px; font-size:17px; max-width:46ch; }
.cta-actions{ display:flex; flex-wrap:wrap; gap:14px; }

/* =====================================================================
   CHALLENGE / ALUMNI TEASER
   ===================================================================== */
.challenge{ background:var(--offwhite); }
.challenge-grid{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(36px,5vw,64px); align-items:center; }
.challenge-figure .photo-frame{ border-radius:var(--r-lg); overflow:hidden; box-shadow:var(--shadow-lg); border:1px solid var(--rule-strong); }
.challenge-figure img{ width:100%; aspect-ratio:5/3.4; object-fit:cover; filter:sepia(.12); }
.hashtag{
  font-family:var(--font-display); font-style:italic; font-weight:600;
  font-size:clamp(20px,2.4vw,28px); color:var(--blue); margin:20px 0 26px;
}
.share-row{ display:flex; flex-wrap:wrap; gap:12px; }
.share-btn{
  display:inline-flex; align-items:center; gap:9px;
  padding:12px 18px; border-radius:var(--r-sm); border:1.5px solid var(--rule-strong);
  background:var(--white); color:var(--navy); font-weight:600; font-size:14px; text-decoration:none;
  transition:transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.share-btn:hover{ transform:translateY(-2px); box-shadow:var(--shadow-md); border-color:var(--gold); }
.share-btn:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
.share-btn svg{ width:18px; height:18px; }
@media(max-width:840px){ .challenge-grid{ grid-template-columns:1fr; gap:40px; } .challenge-figure{ order:-1; } }

/* =====================================================================
   SLIDESHOW — "Life at Oriental Academy" (reusable, data-driven via JS)
   Crossfade slides; never depends on JS to SHOW content (first slide is
   visible by default; autoplay/controls are enhancement).
   ===================================================================== */
.slideshow{ position:relative; }
.ss-stage{
  position:relative; width:100%; aspect-ratio:16/8;
  border-radius:var(--r-lg); overflow:hidden;
  background:var(--navy-deep); box-shadow:var(--shadow-lg);
  border:1px solid var(--rule-strong);
}
.ss-slide{
  position:absolute; inset:0; opacity:0; transition:opacity .9s ease;
}
.ss-slide:first-child{ opacity:1; }                 /* visible without JS */
.oa-js .ss-slide{ opacity:0; }
.oa-js .ss-slide.active{ opacity:1; }
.ss-slide.active{ opacity:1; } /* dots/arrows still work when reduced-motion skips .oa-js */
.ss-slide img{ width:100%; height:100%; object-fit:cover; object-position:center 38%; }
/* <picture> wrappers participate transparently in slide/grid layouts */
.ss-slide picture, .gallery .g-item picture, .facility .fac-media picture,
.split-media picture, .faculty-card .fac-photo picture{ display:contents; }
.facility .fac-media{ overflow:hidden; }
.facility .fac-media img{ width:100%; height:100%; object-fit:cover; }
.ss-slide .ss-cap{
  position:absolute; left:0; right:0; bottom:0;
  /* the caption is text, so it stops at the same column every other line of text obeys
     (.wrap = 1200px + 28px gutter) instead of running to within 28px of the viewport edge */
  padding:48px max(28px, calc((100% - 1200px) / 2 + 28px)) 22px;
  background:linear-gradient(0deg, rgba(15,22,40,.86), rgba(15,22,40,.2) 60%, transparent);
  color:var(--white);
}
.ss-cap .ss-tag{ display:block; font-size:11.5px; letter-spacing:.18em; text-transform:uppercase; color:var(--gold); font-weight:600; }
.ss-cap .ss-title{ display:block; font-family:var(--font-display); font-weight:600; font-size:clamp(20px,2.4vw,28px); margin-top:6px; line-height:1.2; }
/* Placeholder slide — branded "awaiting photograph" frame on navy */
.ss-slide.placeholder{
  background:radial-gradient(ellipse 80% 90% at 50% 40%, #20305422, transparent), var(--navy-deep);
  position:relative;
  display:grid; place-items:center; text-align:center; color:var(--on-navy-soft);
}
.ss-slide.placeholder::after{ content:""; position:absolute; inset:18px; border:1px solid rgba(201,168,76,.32); border-radius:8px; pointer-events:none; }
.ss-slide.placeholder::before{ content:""; position:absolute; width:240px; height:240px; right:-40px; bottom:-50px; background:url("oa-monogram-gold.svg") no-repeat center/contain; opacity:.07; pointer-events:none; }
.ss-slide.placeholder .ph-note{ position:relative; max-width:30ch; }
.ss-slide.placeholder .ph-note::before{ content:""; display:block; width:38px; height:38px; margin:0 auto 16px; background:var(--gold); -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M21 4H3a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1zM8.5 8a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zM4 18l4.5-4.5 2.5 2.5L15 12l5 5v1H4z'/%3E%3C/svg%3E") center/contain no-repeat; mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M21 4H3a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1zM8.5 8a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zM4 18l4.5-4.5 2.5 2.5L15 12l5 5v1H4z'/%3E%3C/svg%3E") center/contain no-repeat; }
.ss-slide.placeholder .ph-note .ph-k{ font-family:var(--font-ui); font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold); display:block; margin-bottom:8px; font-weight:700; }
.ss-slide.placeholder .ph-note .ph-t{ font-family:var(--font-display); font-size:clamp(20px,2.4vw,28px); color:var(--white); }

/* arrows */
.ss-arrow{
  position:absolute; top:50%; transform:translateY(-50%); z-index:3;
  width:48px; height:48px; border-radius:var(--r-pill);
  background:rgba(251,248,241,.9); color:var(--navy-deep);
  border:none; cursor:pointer; display:grid; place-items:center;
  font-size:20px; box-shadow:var(--shadow-md); transition:background .2s, transform .2s;
}
.ss-arrow:hover{ background:var(--white); transform:translateY(-50%) scale(1.06); }
.ss-arrow:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.ss-arrow.prev{ left:16px; } .ss-arrow.next{ right:16px; }
/* dots */
:root{ --ss-strip: 76px; }   /* 44px toggle + ~20px bottom offset + clearance */
.ss-dots{ display:flex; justify-content:center; align-items:center; gap:10px; margin-top:18px; }
.ss-dot{
  width:10px; height:10px; border-radius:var(--r-pill); border:none; cursor:pointer;
  background:var(--rule-strong); padding:0; transition:background .2s, transform .2s;
}
.ss-dot.active{ background:var(--gold-dark); transform:scale(1.2); }
.ss-dot:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
.ss-toggle{
  min-width:44px; height:44px; margin-left:4px; padding:0; display:grid; place-items:center;
  border:1px solid var(--rule-strong); border-radius:var(--r-pill); background:var(--paper);
  color:var(--navy-deep); font-size:11px; line-height:1; cursor:pointer;
  transition:background .2s ease, color .2s ease, border-color .2s ease;
}
.ss-toggle:hover{ background:var(--navy); color:var(--white); border-color:var(--navy); }
.ss-toggle:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
@media(max-width:640px){
  .ss-stage{ aspect-ratio:3/2; }
  .ss-arrow{ width:40px; height:40px; }
}

/* =====================================================================
   MAP / VISIT
   ===================================================================== */
.visit-grid{ display:grid; grid-template-columns:1.3fr .9fr; gap:clamp(28px,4vw,48px); align-items:stretch; }
.visit-grid>*{ min-width:0; }   /* let columns shrink below content on tiny phones (no 320px overflow) */
.map-frame{
  border-radius:var(--r-lg); overflow:hidden; border:1px solid var(--rule-strong);
  box-shadow:var(--shadow-md); min-height:340px; position:relative;
  /* Branded loading field: a navy + gold-glow placeholder so the Google embed never flashes
     blank white while it fetches (it paints over this once loaded). */
  background:radial-gradient(120% 100% at 50% 38%, rgba(201,168,76,.12), transparent 60%), var(--navy-deep);
}
.map-frame::before{ content:"Loading map\2026"; position:absolute; inset:0; z-index:0; display:flex; align-items:center; justify-content:center;
  font-family:var(--font-ui); font-size:13px; letter-spacing:.14em; text-transform:uppercase; color:rgba(230,210,150,.55); }
.map-frame iframe{ position:relative; z-index:1; width:100%; height:100%; min-height:340px; border:0; display:block; filter:saturate(.92); }
.visit-card{ background:var(--white); border:1px solid var(--rule); border-radius:var(--r-lg); padding:clamp(24px,3vw,34px); box-shadow:var(--shadow-sm); display:flex; flex-direction:column; gap:18px; }
.visit-row{ display:flex; flex-direction:column; gap:3px; padding-bottom:16px; border-bottom:1px solid var(--rule); }
.visit-row:last-of-type{ border-bottom:none; padding-bottom:0; }
.visit-row .vr-k{ font-size:11.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); font-weight:600; }
.visit-row .vr-v{ font-size:16.5px; color:var(--navy-deep); font-weight:500; overflow-wrap:anywhere; }
/* Permanent gold underline so phone/email/social read as tappable on touch
   (was navy = body text with a hover-only colour change — invisible on a phone). */
.visit-row .vr-v a{ color:var(--navy-deep); text-decoration:none;
  border-bottom:1.5px solid rgba(201,168,76,.55); padding-bottom:1px;
  transition:color .2s ease, border-color .2s ease; }
.visit-row .vr-v a:hover,.visit-row .vr-v a:focus-visible{ color:var(--gold-dark); border-bottom-color:var(--gold-dark); }
.visit-row .vr-v a:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; border-radius:2px; }
@media(max-width:780px){ .visit-grid{ grid-template-columns:1fr; } .map-frame{ min-height:280px; order:2; } }

/* =====================================================================
   FORM CARD + SUCCESS  (system component; used on Admissions/Contact/Alumni)
   ===================================================================== */
.form-card{ background:var(--white); border:1px solid var(--rule);
  /* concentric: the card's corner = field radius + card padding, so the fields sit true inside it */
  padding:24px; border-radius:calc(var(--r-sm) + 24px); box-shadow:var(--shadow-md); }
@media(min-width:761px){ .form-card{ padding:32px; border-radius:calc(var(--r-sm) + 32px); } }
.form-grid{ display:grid; grid-template-columns:1fr 1fr; gap:18px; }
.field{ display:flex; flex-direction:column; gap:7px; }
.field.full{ grid-column:1 / -1; }
.field label{ font-size:13px; font-weight:600; color:var(--navy-deep); letter-spacing:.02em; }
.field label .req{ color:var(--gold-dark); }
.field input,.field select,.field textarea{
  width:100%; max-width:100%;   /* keep every control inside the card — no horizontal overflow on mobile */
  font-family:var(--font-ui); font-size:16px; color:var(--text);   /* 16px min — iOS zooms the page on focus below this */
  padding:13px 14px; border:1.5px solid var(--rule-strong); border-radius:var(--r-sm);
  min-height:48px;   /* selects rendered 50px from the same padding — one control height */
  background:var(--paper); transition:border-color .2s ease, box-shadow .2s ease;
}
.field textarea{ resize:vertical; min-height:96px; }
.field input:focus,.field select:focus,.field textarea:focus{
  outline:none; border-color:var(--navy); box-shadow:0 0 0 3px rgba(27,42,74,.12);
}
/* Keyboard users get a real, always-visible ring (survives even if box-shadow is overridden). */
.field input:focus-visible,.field select:focus-visible,.field textarea:focus-visible{
  outline:2px solid var(--navy); outline-offset:2px;
}
.field .hp{ position:absolute; left:-9999px; }   /* honeypot */
.form-foot{ display:flex; align-items:center; justify-content:space-between; gap:18px; flex-wrap:wrap; margin-top:24px; }
.form-fine{ font-size:14px; color:var(--text-muted); max-width:42ch; }
.form-consent{ flex-basis:100%; order:1; font-size:14px; color:var(--text-muted); line-height:1.55; margin:8px 0 0; }
.form-consent a{ color:inherit; text-decoration:underline; text-underline-offset:2px; }
.form-error{
  margin:22px 0 0; padding:13px 15px; border:1px solid #D99A7D; border-left:4px solid #A84432;
  border-radius:var(--r-sm); background:#FFF4EE; color:#743125; font-size:14px; line-height:1.55;
}
.form-error:focus{ outline:3px solid rgba(168,68,50,.2); outline-offset:2px; }
/* the field the server rejected (set by oa-system.js fail(), cleared on the next keystroke) */
.field [aria-invalid="true"]{ border-color:#A84432; }
/* in-page anchor jumps clear the sticky header */
:target{ scroll-margin-top:96px; }

/* ---------- Featured video panels (About founder film · Results result-day) — poster-first, tap-to-play ---------- */
.founder-film .ff-grid{ display:grid; grid-template-columns:1fr minmax(220px,300px); gap:clamp(28px,5vw,60px); align-items:center; }
.founder-film .ff-note{ font-family:var(--font-ui); font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); margin:16px 0 0; }
.ff-player{ margin:0; }
.ff-video{ display:block; width:100%; max-width:300px; aspect-ratio:9/16; height:auto; margin-inline:auto; border-radius:18px; background:#0b1220; box-shadow:0 24px 60px rgba(11,18,32,.34); object-fit:cover; }
@media(max-width:760px){ .founder-film .ff-grid{ grid-template-columns:1fr; } }
.result-films .rf-grid{ display:flex; flex-wrap:wrap; gap:clamp(18px,3.5vw,40px); justify-content:center; align-items:flex-start; }
.result-films .rf-item{ margin:0; }
.rf-video{ display:block; height:min(62vh,520px); width:auto; max-width:100%; border-radius:16px; background:#0b1220; box-shadow:0 22px 56px rgba(0,0,0,.42); }
.rf-cap{ margin-top:12px; text-align:center; font-family:var(--font-ui); font-size:12.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--on-navy-soft); }
@media(max-width:600px){ .rf-video{ height:auto; width:100%; max-width:min(440px,94vw); } }
/* Lazy poster facade — a button shows the poster; the real <video> is injected only on tap.
   No <video> sits in the DOM during scroll, which removes the iOS Safari video-layer black-ghost
   (and saves bandwidth). A native <video> is still served to no-JS users via <noscript>. */
.vf-btn{ display:block; width:100%; margin-inline:auto; padding:0; border:0; cursor:pointer; position:relative;
  background:#0b1220 center/cover no-repeat; box-shadow:0 24px 60px rgba(11,18,32,.34); -webkit-tap-highlight-color:transparent; }
.vf-btn.vf-ff{ max-width:300px; aspect-ratio:9/16; border-radius:18px; }
.vf-btn.vf-rf{ max-width:440px; aspect-ratio:4/5; border-radius:16px; box-shadow:0 22px 56px rgba(0,0,0,.42); }
@media(max-width:600px){ .vf-btn.vf-rf{ max-width:min(440px,94vw); } }
.vf-btn::after{ content:""; position:absolute; left:50%; top:50%; width:64px; height:64px; transform:translate(-50%,-50%);
  border-radius:50%; background:rgba(11,18,32,.5); border:1px solid rgba(255,255,255,.35); transition:transform .18s ease, background .18s ease; }
.vf-btn::before{ content:""; position:absolute; left:calc(50% + 3px); top:50%; transform:translate(-50%,-50%);
  border-style:solid; border-width:11px 0 11px 19px; border-color:transparent transparent transparent #fff; z-index:1; pointer-events:none; }
.vf-btn:hover::after,.vf-btn:focus-visible::after{ transform:translate(-50%,-50%) scale(1.08); background:rgba(11,18,32,.66); }
.vf-btn:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
@media(prefers-reduced-motion:reduce){ .vf-btn::after{ transition:none; } }
/* Tap-to-play loading state: the play glyph becomes a spinning gold ring while the clip
   buffers (the poster stays under it). oa-system.js swaps in the real <video> only once it
   can actually play — so there's no black flash and no layout jump. */
.vf-btn.vf-loading{ cursor:default; pointer-events:none; }
.vf-btn.vf-loading::before{ opacity:0; }
.vf-btn.vf-loading::after{ width:54px; height:54px; background:rgba(11,18,32,.62);
  border:3px solid rgba(230,200,104,.30); border-top-color:var(--gold);
  animation:vf-spin .8s linear infinite; }
@keyframes vf-spin{ from{ transform:translate(-50%,-50%) rotate(0); }
  to{ transform:translate(-50%,-50%) rotate(360deg); } }
@media(prefers-reduced-motion:reduce){ .vf-btn.vf-loading::after{ animation-duration:1.8s; } }
.form-success{
  display:none; text-align:center; padding:clamp(32px,6vw,56px);
  background:var(--white); border:1px solid var(--rule); border-radius:var(--r-lg); box-shadow:var(--shadow-md);
}
.form-success.show{ display:block; }
.form-success .seal{ width:64px; height:64px; margin:0 auto 18px; border-radius:var(--r-pill); background:var(--navy); color:var(--gold); display:grid; place-items:center; font-size:28px; }
.form-success h3{ font-size:26px; margin-bottom:12px; }
.form-success p{ color:var(--text-soft); max-width:48ch; margin:0 auto; }
@media(max-width:620px){ .form-grid{ grid-template-columns:1fr; } }

/* =====================================================================
   FOOTER
   ===================================================================== */
.site-footer{ background:
    radial-gradient(55% 60% at 82% 6%, rgba(201,168,76,.08), transparent 70%),
    linear-gradient(180deg, var(--navy-deep) 0%, var(--navy-ink) 100%);
  color:var(--on-navy-soft); padding:clamp(48px,6vw,72px) 0 28px; border-top:3px solid var(--gold);
  position:relative; overflow:hidden; }
/* The page must RESERVE the fixed CTA bar's height, not let content sit under it. Without this
   the last thing on a page is unreachable: on Alumni the final card's caption sat 97px below
   the bar's top edge at maximum scroll, with nowhere left to scroll to. Reserving it on the
   footer (rather than on body) keeps the extra space navy, so it reads as the footer's own
   bottom margin and never as a stray band. */
@media(max-width:760px){
  .site-footer{ padding-bottom:calc(28px + 56px + env(safe-area-inset-bottom)); }
}
.site-footer::after{ content:""; position:absolute; left:-80px; bottom:-90px; width:420px; height:420px; z-index:0;
  background:url("oa-monogram-gold.svg") left bottom/contain no-repeat; opacity:.05; pointer-events:none; }
.site-footer > .wrap{ position:relative; z-index:1; }
.footer-grid{ display:grid; grid-template-columns:1.4fr 1fr 1.2fr 1fr; gap:40px; }
.footer-brand{ display:flex; flex-direction:column; gap:14px; max-width:330px; }
.fb-logos{ display:flex; align-items:center; gap:20px; }
.fb-logos .fb-mono{ height:54px; width:auto; object-fit:contain; filter:saturate(1.25) brightness(1.12); }
.fb-logos .fb-crest{ height:58px; width:auto; object-fit:contain; padding-left:20px; border-left:1px solid rgba(201,168,76,.4); filter:drop-shadow(0 3px 10px rgba(0,0,0,.3)); }
.footer-brand .fb-name{ font-family:var(--font-display); color:var(--white); font-weight:600; font-size:19px; line-height:1.25; }
.footer-brand .fb-tag{ color:var(--gold); font-style:italic; font-family:var(--font-display); font-size:16px; }
.footer-brand .fb-meta{ font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:var(--on-navy-soft); }
.footer-col h4, .footer-col .footer-h{ color:var(--white); font-family:var(--font-ui); font-size:13px; letter-spacing:.16em; text-transform:uppercase; font-weight:600; margin-bottom:16px; }
.footer-col a, .footer-col p{ display:block; color:var(--on-navy-soft); text-decoration:none; font-size:15px; margin-bottom:10px; line-height:1.5; transition:color .2s ease; }
/* Thumb floor: convert the dead 10px gap into target height — same rhythm, 44px hit box. */
.footer-col a{ padding-block:11px; margin-bottom:0; }
.footer-col a:hover{ color:var(--gold); }
.footer-col a:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.footer-bottom{ display:flex; justify-content:space-between; gap:16px; flex-wrap:wrap; margin-top:clamp(36px,5vw,52px); padding-top:22px; border-top:1px solid var(--rule-navy); font-size:13px; color:var(--on-navy-soft); }
@media(max-width:860px){ .footer-grid{ grid-template-columns:1fr 1fr; gap:32px; } }
@media(max-width:480px){ .footer-grid{ grid-template-columns:1fr; } }

/* =====================================================================
   FLOATING WHATSAPP / CALL + mobile bottom bar
   ===================================================================== */
/* Liquid-glass floating launcher — opaque navy with a layered inset bevel.
   (No backdrop-filter: on iOS Safari a fixed element with backdrop-filter mis-composites
   into a stray black rectangle elsewhere on the page. The bevels keep the glassy sheen.) */
.fab{
  position:fixed; right:20px; bottom:24px; z-index:80;
  display:inline-flex; align-items:center; gap:11px;
  padding:10px 20px 10px 11px; border-radius:var(--r-pill);
  font-family:inherit; font-weight:700; font-size:14.5px; letter-spacing:.01em;
  color:var(--gold-light); text-decoration:none; cursor:pointer;
  appearance:none; -webkit-appearance:none;
  background:linear-gradient(135deg, rgba(31,48,82,.97), rgba(19,30,54,.96));
  border:1px solid rgba(230,200,104,.34);
  text-shadow:0 1px 6px rgba(7,12,26,.5);
  box-shadow:
    inset 3px 3px .5px -3.5px rgba(255,255,255,.6),
    inset -3px -3px .5px -3.5px rgba(255,255,255,.32),
    inset 1px 1px 1px -.5px rgba(255,255,255,.45),
    inset -1px -1px 1px -.5px rgba(255,255,255,.3),
    inset 0 0 7px 6px rgba(255,255,255,.06),
    inset 0 0 2px 2px rgba(255,255,255,.04),
    0 1px 1px rgba(255,255,255,.10),
    0 12px 30px -10px rgba(7,12,26,.6);
  transition:transform .24s cubic-bezier(.22,.61,.36,1), box-shadow .24s ease, filter .2s ease, opacity .18s ease;
}
.fab svg{ width:22px; height:22px; }
.fab .fab-ic{ width:30px; height:30px; border-radius:50%; object-fit:cover; flex:none;
  box-shadow:0 2px 6px rgba(7,12,26,.45); }   /* Roshni mascot badge */
.fab:hover{ transform:translateY(-3px) scale(1.02); filter:brightness(1.07);
  box-shadow:
    inset 3px 3px .5px -3.5px rgba(255,255,255,.66),
    inset -3px -3px .5px -3.5px rgba(255,255,255,.34),
    inset 1px 1px 1px -.5px rgba(255,255,255,.5),
    inset -1px -1px 1px -.5px rgba(255,255,255,.32),
    inset 0 0 7px 6px rgba(255,255,255,.07),
    inset 0 0 2px 2px rgba(255,255,255,.05),
    0 1px 1px rgba(255,255,255,.12),
    0 20px 42px -12px rgba(7,12,26,.7); }
.fab:active{ transform:translateY(-1px) scale(.99); filter:brightness(.97); }
.fab:focus-visible{ outline:2px solid rgba(230,200,104,.75); outline-offset:3px; }
body.orx-open .fab{ opacity:0; pointer-events:none; transform:translateY(8px) scale(.9); }  /* launcher hides while chat is open */
/* Scroll-aware tuck (mobile, set by oa-roshni.js): the assistant stays out of the way at the
   top of the page and near the footer/mobile-bar CTAs, fading in once the visitor is reading. */
.fab.is-tucked{ opacity:0; pointer-events:none; transform:translateY(14px) scale(.92); }
/* lifted clear of whatever interactive element it came to rest on (see oa-roshni.js armFabTuck) */
.fab.is-lifted{ transform:translateY(calc(-1 * var(--fab-lift, 62px))); }
.fab.is-lifted:hover{ transform:translateY(calc(-3px - var(--fab-lift, 62px))) scale(1.02); }

.mobile-bar{ display:none; }
@media(max-width:760px){
  /* Roshni is DESKTOP/TABLET ONLY (owner decision, 13 Sep 2026). The phone already carries a
     persistent Enquire | WhatsApp | Call bar; a second floating interaction competed with it
     and, wherever it came to rest, sat on top of the reading column. Hidden outright rather
     than tucked — no launcher, no nudge, no dodge logic. The in-content "Ask Roshni" links
     (e.g. Academics) still open the panel on a phone; only the floating chrome is gone.
     To restore: delete this rule and re-arm armFabTuck() in oa-roshni.js. */
  .fab{ display:none !important; }
  .orx-nudge{ display:none !important; }
  .mobile-bar{
    display:grid; grid-template-columns:1fr 1fr 1fr;
    position:fixed; left:0; right:0; bottom:0; z-index:80;
    background:var(--white); border-top:1px solid var(--rule); box-shadow:0 -4px 16px -6px rgba(22,36,63,.18);
    padding-bottom:env(safe-area-inset-bottom);
  }
  .mobile-bar a{
    padding:14px 8px; text-align:center; text-decoration:none; font-weight:600; font-size:13.5px;
    color:var(--navy); border-right:1px solid var(--rule); display:flex; align-items:center; justify-content:center; gap:7px;
    min-height:54px;
  }
  .mobile-bar a:last-child{ border-right:none; }
  .mobile-bar a.primary{ background:var(--navy); color:var(--white); }
  .mobile-bar a.wa{ color:var(--navy-deep); }
  .mobile-bar svg{ width:17px; height:17px; }
  body{ padding-bottom:calc(54px + env(safe-area-inset-bottom)); }
}

/* =====================================================================
   INTERIOR PAGES — shared components
   ===================================================================== */
/* Page hero (interior) — navy band with optional photo */
.page-hero{ background:linear-gradient(180deg, var(--navy) 0%, var(--navy) 44%, var(--navy-ink) 100%);
  color:var(--on-navy); position:relative; overflow:hidden; border-top:1px solid rgba(201,168,76,.3); }
.page-hero::before{ content:""; position:absolute; left:-70px; bottom:-80px; width:380px; height:380px; z-index:0;
  background:url("oa-monogram-gold.svg") left bottom/contain no-repeat; opacity:.05; pointer-events:none; }
.page-hero > .wrap{ position:relative; z-index:1; }
.page-hero-inner{ position:relative; padding:clamp(34px,4.5vw,56px) 0 clamp(30px,4vw,48px); max-width:780px; }
.page-hero .kicker{ color:var(--gold); }
.page-hero h1{ color:var(--white); font-size:clamp(32px,4.2vw,52px); line-height:1.04; margin:18px 0 0; letter-spacing:-0.02em; }
.page-hero.has-slideshow h1{ text-shadow:0 2px 18px rgba(8,12,22,.55), 0 1px 3px rgba(8,12,22,.45); }
.page-hero h1 em{ font-style:italic; color:var(--gold); font-weight:600; }
.page-hero .ph-lede{ color:var(--on-navy-soft); font-size:clamp(17px,1.6vw,20px); line-height:1.6; margin-top:20px; max-width:60ch; }
.page-hero .nastaliq, .page-hero .devanagari{ color:var(--gold-glow,#D8BE73); }
.breadcrumb{ background:var(--offwhite); border-bottom:1px solid var(--rule); }
.breadcrumb .wrap{ display:flex; gap:10px; align-items:center; padding-block:12px; font-size:13px; color:var(--text-muted); }
.breadcrumb a{ color:var(--text-soft); text-decoration:none; }
.breadcrumb a:hover{ color:var(--gold-dark); }
.breadcrumb .sep{ color:var(--rule-strong); }

/* Prose / rich text */
.prose{ max-width:70ch; }
.prose p{ color:var(--text-soft); font-size:17px; line-height:1.75; margin-bottom:18px; }
.prose p.lead{ font-family:var(--font-display); font-style:italic; font-size:clamp(20px,2.2vw,26px); color:var(--navy-deep); line-height:1.45; margin-bottom:24px; }
.prose strong{ color:var(--navy-deep); font-weight:600; }
.prose h3{ font-size:24px; margin:28px 0 12px; }

/* Two-column content + figure */
.split{ display:grid; grid-template-columns:1fr 1fr; gap:clamp(36px,5vw,64px); align-items:center; }
.split.media-left .split-media{ order:-1; }
.split-media .photo-frame{ border-radius:var(--r-lg); overflow:hidden; box-shadow:var(--shadow-lg); border:1px solid var(--rule-strong); position:relative; }
.split-media img{ width:100%; display:block; }
@media(max-width:840px){ .split{ grid-template-columns:1fr; gap:40px; } .split.media-left .split-media{ order:0; }
  /* When the split stacks, cap the prose measure so lines don't stretch edge-to-edge on tablets. */
  .split .prose p, .split .prose-serif p{ max-width:64ch; } }

/* Numbered steps */
.steps{ display:grid; grid-template-columns:repeat(4,1fr); gap:22px; counter-reset:step; }
.step{ background:var(--white); border:1px solid var(--rule); border-radius:var(--r-md); padding:28px 24px; position:relative; }
.step .step-n{ width:46px; height:46px; border-radius:var(--r-pill); background:var(--navy); color:var(--gold); display:grid; place-items:center; font-family:var(--font-display); font-weight:700; font-size:19px; margin-bottom:16px; }
.step h3{ font-size:20px; margin-bottom:8px; }
.step p{ color:var(--text-soft); font-size:15px; line-height:1.55; }
/* gold thread between the numbered circles — single-row layout only
   (top 51px = 28px card padding + 23px circle radius; tracks those tokens) */
@media(min-width:881px){
  .step:not(:first-child)::before{ content:""; position:absolute; top:51px; left:-22px; width:22px; height:2px; background:rgba(176,141,58,.4); }
  .bg-navy .step:not(:first-child)::before{ background:rgba(201,168,76,.45); }
}
@media(max-width:880px){ .steps{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:460px){ .steps{ grid-template-columns:1fr; } }

/* Subject combination lists (Academics) — hairline rows, gold markers */
.subject-list{ list-style:none; margin:16px 0 0; padding:0; }
.subject-list li{ display:flex; align-items:baseline; gap:10px; padding:9px 0; border-bottom:1px solid var(--rule); font-size:15.5px; color:var(--text-soft); line-height:1.5; }
.subject-list li::before{ content:"·"; color:var(--gold-dark); font-weight:700; flex:none; }
.subject-list li:last-child{ border-bottom:0; }
.subject-list .opt{ color:var(--text-muted); font-size:13.5px; }

/* Timeline band (Since 1960) */
.timeline{ display:grid; grid-template-columns:repeat(4,1fr); border-top:1px solid var(--rule-navy); }
.tl-item{ padding:8px 22px; border-right:1px solid var(--rule-navy); }
.tl-item:last-child{ border-right:none; }
.tl-year{ font-family:var(--font-display); font-weight:700; font-size:clamp(34px,4vw,48px); color:var(--gold); line-height:1; }
.tl-year .plus{ color:var(--white); }
.tl-label{ font-size:13px; color:var(--on-navy-soft); margin-top:8px; line-height:1.5; }
@media(max-width:680px){ .timeline{ grid-template-columns:1fr 1fr; } .tl-item:nth-child(2){ border-right:none; } .tl-item:nth-child(-n+2){ border-bottom:1px solid var(--rule-navy); } }

/* Faculty cards */
.faculty-grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:24px; }
.faculty-card{ background:var(--white); border:1px solid var(--rule); border-radius:var(--r-md); overflow:hidden; }
.faculty-card .fac-photo{ aspect-ratio:1/1; }
.faculty-card .fac-body{ padding:18px 18px 20px; }
.faculty-card .fac-name{ font-family:var(--font-display); font-weight:600; font-size:19px; color:var(--navy-deep); }
.faculty-card .fac-dept{ font-size:13px; color:var(--gold-dark); font-weight:600; letter-spacing:.04em; margin-top:4px; }
.faculty-card .fac-years{ font-size:13.5px; color:var(--text-muted); margin-top:8px; }
@media(max-width:900px){ .faculty-grid{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:480px){ .faculty-grid{ grid-template-columns:1fr 1fr; gap:14px; } }
/* Faculty holding state (Academics) — honest department list instead of four empty
   "portrait being added" frames that read as broken scaffolding on first visit. */
.fac-holding{ max-width:760px; }
.fac-holding-lede{ color:var(--on-navy-soft); font-size:15.5px; line-height:1.65; max-width:60ch; margin:0 0 8px; }
.fac-dept-list{ list-style:none; margin:0; padding:0; display:grid; grid-template-columns:repeat(2,1fr); gap:0 36px; }
.fac-dept-list li{ display:flex; flex-direction:column; gap:3px; padding:15px 0; border-top:1px solid rgba(201,168,76,.22); }
.fac-dept-list b{ font-family:var(--font-display); font-weight:600; font-size:17px; color:var(--on-navy); letter-spacing:.005em; }
.fac-dept-list span{ font-family:var(--font-ui); font-size:11.5px; letter-spacing:.13em; text-transform:uppercase; color:var(--gold-light); }
@media(max-width:560px){ .fac-dept-list{ grid-template-columns:1fr; gap:0; } .fac-dept-list li{ padding:13px 0; } }

/* Facilities grid */
.facilities{ display:grid; grid-template-columns:repeat(3,1fr); gap:24px; }
.facility{ border-radius:var(--r-md); overflow:hidden; border:1px solid var(--rule); background:var(--white); }
.facility .fac-media{ aspect-ratio:3/2; }
.facility .fac-cap{ padding:16px 18px; display:flex; align-items:center; justify-content:space-between; gap:12px; }
.facility .fac-cap h3{ font-size:18px; }
.facility .fac-cap .num{ font-family:var(--font-display); color:var(--gold-dark); font-weight:600; }
@media(max-width:860px){ .facilities{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:520px){ .facilities{ grid-template-columns:1fr; } }

/* Gallery */
.gallery{ display:grid; grid-template-columns:repeat(12,1fr); gap:16px; }
/* Dense back-fills the holes a mixed 3/4/6/8 span sequence leaves at the end of a row (measured
   12 wasted columns on the campus wall, and worse under every filter). It is scoped to the
   campus wall on purpose: it REORDERS items visually, which is right for a photo wall and wrong
   for Legacy's timeline galleries, where the photographs are in narrative order. */
#gallery .gallery{ grid-auto-flow:dense; }
/* The portrait tier is FOUR columns wide on this wall, not three, and keeps its 3:4 frame.
   With 3 portraits, 2 squares and 14 landscapes a 3-column portrait puts the wall at 107
   columns — an odd number, so no arrangement of it can ever tile a 12-column grid and every
   layout ends with holes. Four columns makes it 108: nine exact rows, and not one photograph
   re-cropped to get there. Re-check this sum when photographs are added to campus-gallery.json
   (portrait 4 + square 4 + landscape 6, or 8 for the two wide emphasis frames). */
#gallery .gallery .span-3{ grid-column:span 4; }
.gallery .g-item{ border-radius:var(--r-md); overflow:hidden; border:1px solid var(--rule-strong); background:var(--offwhite); position:relative; }
.gallery .g-item img{ width:100%; height:100%; object-fit:cover; }
.gallery .span-6{ grid-column:span 6; aspect-ratio:16/10; }
.gallery .span-4{ grid-column:span 4; aspect-ratio:1/1; }
.gallery .span-3{ grid-column:span 3; aspect-ratio:3/4; }
.gallery .span-8{ grid-column:span 8; aspect-ratio:16/9; }
@media(max-width:760px){
  .gallery .span-6,.gallery .span-4,.gallery .span-3,.gallery .span-8{ grid-column:span 6; aspect-ratio:4/3; }
  /* span-3 is the portrait tier in the CAMPUS wall only, where the JSON assigns it by shape.
     Legacy's timeline galleries reuse .gallery with span-3 for LANDSCAPE archival prints, so
     this must stay scoped or it crops 45% off the sides of those. */
  #gallery .gallery .span-3{ aspect-ratio:3/4; }
}
/* Curated caption overlay on gallery items (and standalone figure.g-item) */
.gallery .g-cap, figure.g-item .g-cap{
  position:absolute; left:0; right:0; bottom:0; z-index:1;
  padding:34px 16px 12px;
  font-family:var(--font-ui); font-size:11.5px; letter-spacing:.16em; text-transform:uppercase; font-weight:600;
  color:var(--white); text-shadow:0 1px 6px rgba(0,0,0,.85);
  /* A fixed .74 floor measured 1.40:1 over the brightest photographs in this gallery. The
     dark tiles never showed it, so it only breaks when a bright picture is added. */
  background:linear-gradient(transparent 0%, rgba(22,36,63,.45) 38%, rgba(22,36,63,.94) 100%);
}

/* Image-slot placeholder — branded "frame awaiting a photograph" (not scaffolding) */
.img-slot{ position:relative; background:linear-gradient(150deg,var(--offwhite),#efe7d6); display:grid; place-items:center; text-align:center; color:var(--text-muted); min-height:140px; height:100%; overflow:hidden; }
.img-slot::after{ content:""; position:absolute; inset:12px; border:1px solid rgba(201,168,76,.4); border-radius:6px; pointer-events:none; }
.img-slot::before{ content:""; position:absolute; width:150px; height:150px; right:-28px; bottom:-30px; background:url("oa-monogram.svg") no-repeat center/contain; opacity:.06; pointer-events:none; }
.img-slot .is-k{ position:relative; font-family:var(--font-ui); font-size:11.5px; letter-spacing:.15em; text-transform:uppercase; color:var(--gold-dark); font-weight:700; padding:16px; max-width:26ch; line-height:1.7; }
.img-slot .is-k::before{ content:""; display:block; width:32px; height:32px; margin:0 auto 13px; background:var(--gold-dark); -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M21 4H3a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1zM8.5 8a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zM4 18l4.5-4.5 2.5 2.5L15 12l5 5v1H4z'/%3E%3C/svg%3E") center/contain no-repeat; mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M21 4H3a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1zM8.5 8a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zM4 18l4.5-4.5 2.5 2.5L15 12l5 5v1H4z'/%3E%3C/svg%3E") center/contain no-repeat; opacity:.9; }
.facility .fac-media.img-slot, .faculty-card .fac-photo.img-slot{ min-height:0; }

/* ============================================================
   ARCHIVAL ARTIFACTS — recovered historical photographs shown as
   museum pieces. Original print borders, studio stamps, paper texture
   and ageing are preserved (contain on a warm mat), never cropped.
   Modern photos keep the clean .photo-frame / cover treatment, so the
   contrast between the two eras reads as part of the story.
   ============================================================ */
.artifact-figure{ position:relative; margin:0; background:#efe7d6; padding:10px;
  border:1px solid rgba(201,168,76,.5); border-radius:var(--r-md); box-shadow:var(--shadow-lg); }
.artifact-figure img{ width:100%; display:block; border-radius:2px; }
/* the small museum label ("From the Archives" / "Early Historical Record") */
.archive-tag{ position:absolute; top:14px; left:14px; z-index:3; white-space:nowrap;
  font-family:var(--font-ui); font-size:10px; font-weight:700; letter-spacing:.15em; text-transform:uppercase;
  color:var(--gold-dark); background:rgba(251,248,241,.93); border:1px solid rgba(201,168,76,.6);
  padding:5px 9px 4px; border-radius:3px; box-shadow:0 2px 10px -6px rgba(22,36,63,.55); }
/* gallery tiles flagged as artifacts: the whole bordered scan on a warm mat (never cropped),
   label kept top-right so it clears the top-left .yr year chip */
.gallery .g-item.is-artifact{ background:#efe7d6; border-color:rgba(201,168,76,.5); padding:8px; }
.gallery .g-item.is-artifact img{ object-fit:contain; }
.gallery .g-item.is-artifact .archive-tag{ top:12px; left:auto; right:12px; }
/* then-and-now / captioned frame pairs (e.g. the About gate): frames stack, each with a year caption */
.ga-frame{ margin:0; }
.split-media .ga-frame + .ga-frame{ margin-top:20px; }
.ga-frame figcaption.cap-year{ display:block; margin-top:11px; text-align:center;
  font-family:var(--font-ui); font-size:11.5px; font-weight:600; letter-spacing:.18em; text-transform:uppercase; color:var(--gold-dark); }

/* ============================================================
   THEN/NOW TRANSITION — reusable old→new morph video ([data-thennow]).
   Asset-driven; the main gate is the first instance. Feature-width (≈1280px),
   16:9, iOS-safe (no <video> in DOM until played). Overlay caption + replay.
   ============================================================ */
.tn-intro{ max-width:66ch; margin:0 auto 34px; text-align:center; }
.thennow{ position:relative; aspect-ratio:16/9; width:100%; max-width:1280px; margin:0 auto;
  border-radius:var(--r-lg); overflow:hidden; background:#0b1220;
  box-shadow:var(--shadow-lg); border:1px solid var(--rule-strong); }
.thennow .tn-poster, .thennow .tn-video{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block; }
.thennow .tn-poster{ z-index:0; transition:opacity .4s ease; }
.thennow .tn-video{ z-index:1; }
.thennow.tn-playing .tn-poster, .thennow.tn-paused .tn-poster, .thennow.tn-ended .tn-poster{ opacity:0; }
/* overlay caption — heritage display type, revealed in the final second + held on the end frame */
.thennow .tn-overlay{ position:absolute; inset:0; z-index:2; pointer-events:none;
  display:flex; align-items:center; justify-content:center; text-align:center; padding:24px;
  font-family:var(--font-display); font-weight:600; font-size:clamp(22px,2.8vw,40px); line-height:1.12; letter-spacing:.015em;
  color:var(--gold-light);   /* brand gold, on a dark scrim — present from the start (the title of the moment) */
  text-shadow:0 1px 2px rgba(0,0,0,.62), 0 3px 16px rgba(0,0,0,.7), 0 0 46px rgba(8,12,28,.6);
  background:radial-gradient(ellipse 58% 36% at center, rgba(8,12,28,.6), rgba(8,12,28,0) 70%); }
/* play (centre) + replay (corner) controls */
.thennow .tn-play{ position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:3;
  width:76px; height:76px; border:0; border-radius:50%; cursor:pointer; -webkit-tap-highlight-color:transparent;
  background:rgba(11,18,32,.6); box-shadow:0 10px 30px -10px rgba(0,0,0,.6); transition:background .2s, transform .2s; }
.thennow .tn-play::before{ content:""; position:absolute; left:calc(50% + 3px); top:50%; transform:translate(-50%,-50%);
  border-style:solid; border-width:13px 0 13px 22px; border-color:transparent transparent transparent #fff; }
.thennow .tn-play:hover{ background:rgba(11,18,32,.78); transform:translate(-50%,-50%) scale(1.05); }
.thennow.tn-playing .tn-play, .thennow.tn-ended .tn-play{ display:none; }
.thennow .tn-replay{ position:absolute; right:16px; bottom:16px; z-index:3; cursor:pointer;
  display:inline-flex; align-items:center; gap:8px; padding:9px 16px; border-radius:var(--r-pill);
  border:1px solid rgba(201,168,76,.6); background:rgba(11,18,32,.72); color:var(--gold-light);
  font-family:var(--font-ui); font-size:12.5px; font-weight:600; letter-spacing:.04em; }
.thennow .tn-replay::before{ content:"\21bb"; font-size:15px; line-height:1; }
.thennow .tn-replay[hidden]{ display:none; }
.thennow .tn-replay:hover{ background:rgba(11,18,32,.9); }
/* buffering spinner (reuses the facade keyframe) */
.thennow.tn-loading::after{ content:""; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:4;
  width:54px; height:54px; border-radius:50%; background:rgba(11,18,32,.62);
  border:3px solid rgba(230,200,104,.30); border-top-color:var(--gold); animation:vf-spin .8s linear infinite; }
.thennow.tn-loading .tn-play{ opacity:0; }
/* the small 1960 archival document beneath the transition */
.tn-archive{ max-width:300px; margin:20px auto 0; }
.tn-archive img{ width:100%; display:block; border-radius:2px; }
@media(max-width:600px){ .thennow .tn-play{ width:62px; height:62px; } .thennow .tn-overlay{ padding:40px 16px 16px; } }
@media(prefers-reduced-motion: reduce){ .thennow .tn-poster{ transition:none; } .thennow .tn-overlay{ transition:none; } }
/* Full-bleed cinematic variant — edge-to-edge band, no card chrome (not a media card) */
.thennow.thennow--bleed{ max-width:none; width:100%; max-height:92vh; margin:clamp(30px,4vw,52px) 0 0; border-radius:0; border:0; box-shadow:none; }
.thennow .tn-poster, .thennow .tn-video{ object-position:center; }
.thennow.thennow--bleed .tn-overlay{ font-size:clamp(30px,4.2vw,66px); }
/* subtle archival label over the opening (old) frame — fades once the morph plays */
.thennow .tn-archlabel{ position:absolute; top:18px; left:18px; z-index:2;
  font-family:var(--font-ui); font-size:11px; font-weight:700; letter-spacing:.16em; text-transform:uppercase;
  color:var(--gold-light); background:rgba(11,18,32,.5); border:1px solid rgba(201,168,76,.45);
  padding:6px 11px 5px; border-radius:3px; transition:opacity .6s ease; }
.thennow.tn-playing .tn-archlabel, .thennow.tn-ended .tn-archlabel{ opacity:0; }
@media(max-width:600px){ .thennow.thennow--bleed{ aspect-ratio:4/3; } .thennow .tn-archlabel{ top:12px; left:12px; font-size:10px; } }
/* ---- Gate fallback (scroll-scrub NOT active: reduced-motion / save-data / narrow / blocked
   autoplay) — present it as an INTENTIONAL captioned still: the caption settles at the bottom,
   with no orphan centre play triangle interrupting it. The morph still autoplays where allowed. ---- */
.thennow--bleed:not(.gs-active) .tn-overlay{
  align-items:flex-end; justify-content:center; text-align:center;
  padding:0 clamp(20px,4vw,48px) clamp(20px,3.2vw,40px);
  /* firmer scrim: the old .74/.20 stops left the gold caption near 1.1:1 over the yellow wall */
  background:linear-gradient(to top, rgba(8,12,28,.82), rgba(8,12,28,.6) 55%, rgba(8,12,28,0) 85%); }
.thennow--bleed:not(.gs-active) .tn-play{        /* a quiet "watch" affordance, out of the caption */
  left:auto; top:auto; right:16px; bottom:16px; transform:none;
  width:46px; height:46px; background:rgba(11,18,32,.5); box-shadow:0 6px 18px -8px rgba(0,0,0,.6); }
.thennow--bleed:not(.gs-active) .tn-play::before{ left:calc(50% + 2px); border-width:8px 0 8px 13px; }
.thennow--bleed:not(.gs-active) .tn-play:hover{ transform:scale(1.06); background:rgba(11,18,32,.7); }
@media(prefers-reduced-motion: reduce){ .thennow--bleed:not(.gs-active):not([data-motion-always]) .tn-play{ display:none; } }  /* static still — no motion prompt */

/* The Legacy Wall's opening photograph. 21:9 is a desktop shape; on a phone it takes 43% off
   the top and bottom of a 4:3 group photograph, which is the mentors' heads and the front
   row's sashes. */
.al-strip{ width:100%; display:block; aspect-ratio:21/9; object-fit:cover; }
@media(max-width:640px){ .al-strip{ aspect-ratio:3/2; } }

/* Alumni wall */
.alumni-wall{ display:grid; grid-template-columns:repeat(3,1fr); gap:22px; }
.alum-card{ background:var(--white); border:1px solid var(--rule); border-radius:var(--r-md); padding:26px 24px; display:flex; flex-direction:column; gap:6px; }
.alum-card .al-batch{ font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); font-weight:600; }
.alum-card .al-name{ font-family:var(--font-display); font-weight:600; font-size:21px; color:var(--navy-deep); margin-top:4px; }
.alum-card .al-now{ font-size:15px; color:var(--text-soft); line-height:1.5; }
@media(max-width:860px){ .alumni-wall{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:520px){ .alumni-wall{ grid-template-columns:1fr; } }

/* At-a-glance card (definition rows) */
.glance{ background:var(--navy); color:var(--on-navy); border-radius:var(--r-lg); padding:clamp(26px,3.5vw,40px); border-top:3px solid var(--gold); }
.glance-grid{ display:grid; grid-template-columns:1fr 1fr; gap:24px 40px; }
.glance-row .g-k{ font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold); font-weight:600; }
.glance-row .g-v{ color:var(--white); font-size:17px; font-weight:500; margin-top:5px; }
.glance-row .g-v a{ color:var(--white); }
@media(max-width:560px){ .glance-grid{ grid-template-columns:1fr; gap:18px; } }

/* Fees / future slot — branded "coming soon" panel */
.future-slot{ position:relative; border:1.5px dashed var(--rule-strong); border-radius:var(--r-md); padding:clamp(28px,4vw,44px); background:linear-gradient(150deg,var(--offwhite),#efe7d6); text-align:center; overflow:hidden; }
.future-slot::before{ content:""; position:absolute; width:170px; height:170px; right:-30px; bottom:-36px; background:url("oa-monogram.svg") no-repeat center/contain; opacity:.05; pointer-events:none; }
.future-slot .fs-k{ position:relative; font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); font-weight:700; }
.future-slot h3{ position:relative; font-size:24px; margin:10px 0 8px; }
.future-slot p{ position:relative; color:var(--text-soft); max-width:52ch; margin:0 auto; }

/* Toppers grid (Results) */
.toppers-grid{ display:grid; grid-template-columns:repeat(5,1fr); gap:24px; }
.topper-card{ display:flex; flex-direction:column; gap:12px; }
.topper-card .tp-photo{ position:relative; aspect-ratio:3/3.7; border-radius:var(--r-md); overflow:hidden; background:var(--navy); border:1px solid var(--rule-strong); box-shadow:var(--shadow-sm); }
.topper-card .tp-photo img{ width:100%; height:100%; object-fit:cover; object-position:center 20%; }
/* Struck-gold honour-board figure — engraved serif numeral on a dark keyline plate,
   not a bright UI pill chip. iOS-safe (no filter/backdrop-filter). */
/* z-index:1 is load-bearing: the span is written BEFORE the <img> in the markup, and without
   an explicit stacking order the image covered the badge on every card (16 on Results, 3 on
   Home — all of them invisible, at every width). Do not remove it. */
.topper-card .tp-pct{ position:absolute; z-index:1; top:9px; right:9px;
  font-family:var(--font-display); font-weight:700; font-size:17px; line-height:1; letter-spacing:.01em;
  color:var(--gold-light); background:rgba(14,23,38,.86);
  border:1px solid rgba(201,168,76,.55); padding:5px 9px 4px; border-radius:3px;
  box-shadow:0 2px 12px -5px rgba(0,0,0,.6); }
.topper-card .tp-name{ font-family:var(--font-display); font-weight:600; font-size:18px; color:var(--navy-deep); line-height:1.15; }
.topper-card .tp-pos{ font-size:12px; letter-spacing:.08em; text-transform:uppercase; color:var(--gold-dark); font-weight:600; margin-top:2px; }
@media(max-width:1040px){ .toppers-grid{ grid-template-columns:repeat(4,1fr); } }
/* The portrait is framed head-high (object-position:center 20%), so once the card narrows to
   roughly a third of a phone screen the top-right badge lands squarely on the student's
   forehead. Below 760px move it to the bottom-left, over the shoulder — the crest watermark
   already lives bottom-right, so that corner stays the only free one. */
@media(max-width:760px){
  .topper-card .tp-pct{ top:auto; right:auto; bottom:8px; left:8px; font-size:15px; padding:4px 7px 3px; }
}

@media(max-width:760px){ .toppers-grid{ grid-template-columns:repeat(3,1fr); gap:18px; } }
@media(max-width:460px){ .toppers-grid{ grid-template-columns:repeat(2,1fr); } }
/* Home results teaser uses a fixed 3-up grid (was an inline style that ignored the breakpoints
   above and forced 3 columns down to 375px). Higher specificity keeps it 3-up on desktop/tablet
   and drops to a comfortable 2-up on phones. */
.toppers-grid.cols-3{ grid-template-columns:repeat(3,1fr); gap:16px; }
@media(max-width:560px){ .toppers-grid.cols-3{ grid-template-columns:repeat(2,1fr); gap:14px; } }
/* The Home teaser shows exactly three students, so the generic two-up above would orphan the
   third and leave a 160px hole. Three across is narrower but it is the shape the section is
   about: three faces in a row under the headline. Scoped so /Results, which runs six in this
   same class, keeps its two-up. */
@media(max-width:560px){ .results-teaser .toppers-grid.cols-3{ grid-template-columns:repeat(3,1fr); gap:10px; } }
/* Class X "Our stars" — 6 honourees. Was an inline repeat(6,1fr) whose specificity
   beat the breakpoints → six ~54px columns on a phone. Class-driven ladder instead:
   6-up desktop → 3-up tablet → 2-up phone (names stay legible at every width). */
.toppers-grid.cols-6{ grid-template-columns:repeat(6,1fr); gap:18px; }
@media(max-width:1040px){ .toppers-grid.cols-6{ grid-template-columns:repeat(3,1fr); } }
@media(max-width:460px){ .toppers-grid.cols-6{ grid-template-columns:repeat(2,1fr); gap:14px; } }

/* Data table (results, calendar) */
.data-table{ width:100%; border-collapse:collapse; background:var(--white); border:1px solid var(--rule); border-radius:var(--r-md); overflow:hidden; }
.data-table caption{ text-align:left; padding:16px 22px; font-size:11px; letter-spacing:.18em; text-transform:uppercase; color:var(--gold-dark); font-weight:600; background:var(--offwhite); border-bottom:1px solid var(--rule); }
.data-table th,.data-table td{ padding:16px 22px; border-bottom:1px solid var(--rule); text-align:left; }
.data-table th{ font-size:11px; letter-spacing:.12em; text-transform:uppercase; color:var(--text-muted); font-weight:600; background:var(--offwhite); }
.data-table tr:last-child td{ border-bottom:none; }
.data-table .num{ text-align:right; font-family:var(--font-display); font-weight:600; font-size:20px; color:var(--navy-deep); }
.data-table .range{ font-weight:600; color:var(--navy-deep); }
.data-table tbody tr{ transition:background .15s ease; }
.data-table tbody tr:hover{ background:var(--offwhite); }
/* cumulative clarifier — a quiet gold-edged note, never lost beneath the table */
.cumulative-note{ margin-top:18px; padding:12px 16px 12px 18px; text-align:left; border-left:3px solid var(--gold); background:var(--offwhite); border-radius:0 var(--r-sm) var(--r-sm) 0; color:var(--text-soft); }
/* honour-roll sheets — mounted like records in an archive (no fake files, just tone) */
.archive-sheets .g-item{ background:#efe7d6; border:1px solid rgba(201,168,76,.45); padding:8px; border-radius:var(--r-md); box-shadow:var(--shadow-sm); }
/* These are photographed A4 PORTRAIT mark-sheets. The generic .span-4 (1:1, and 4:3
   on mobile) cover-crops the bottom rows off. Mount the whole sheet in a portrait frame,
   contained on the warm mat — nothing cropped, reads as a record under glass. */
.archive-sheets .g-item.span-4{ aspect-ratio:3/4; }
.archive-sheets .g-item img{ object-fit:contain; background:#efe7d6; }
.bar{ position:relative; height:9px; background:var(--rule); border-radius:var(--r-pill); overflow:hidden; }
.bar > span{ position:absolute; inset:0 auto 0 0; background:linear-gradient(90deg,var(--gold-dark),var(--gold)); border-radius:var(--r-pill); }

/* Mini stat strip (reusable on interior pages, on paper) */
.statline{ display:grid; grid-template-columns:repeat(4,1fr); border:1px solid var(--rule); border-radius:var(--r-md); background:var(--white); overflow:hidden; }
.statline > div{ padding:26px 22px; border-right:1px solid var(--rule); }
.statline > div:last-child{ border-right:none; }
.statline .sn{ font-family:var(--font-display); font-weight:700; font-size:clamp(28px,3.4vw,40px); color:var(--navy-deep); line-height:1; }
.statline .sn .accent{ color:var(--gold-dark); }
.statline .sl{ font-size:13px; color:var(--text-soft); margin-top:8px; }
@media(max-width:720px){ .statline{ grid-template-columns:1fr 1fr; } .statline > div:nth-child(2){ border-right:none; } .statline > div:nth-child(-n+2){ border-bottom:1px solid var(--rule); } }

/* =====================================================================
   PARENT QUICK-ACTIONS — slim navy utility bar under the hero (Task 3)
   ===================================================================== */
.quick-actions{ background:var(--navy); color:var(--on-navy); border-top:3px solid var(--gold); padding:clamp(40px,6vw,72px) 0; }
.pd-head{ max-width:640px; margin:0 0 clamp(26px,3.5vw,38px); }
.pd-title{ font-family:var(--font-display); font-weight:700; color:var(--white); font-size:clamp(24px,3vw,34px); line-height:1.14; margin:14px 0 12px; }
.pd-lede{ font-family:var(--font-prose); font-size:clamp(15px,1.7vw,17px); line-height:1.6; color:var(--on-navy-soft); max-width:54ch; }
.qa-grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:16px; }
.qa-tile{
  position:relative; display:flex; flex-direction:column; gap:14px;
  padding:28px 24px 26px; text-decoration:none; color:inherit; overflow:hidden;
  background:rgba(255,255,255,.035); border:1px solid var(--rule-navy); border-radius:var(--r-lg);
  transition:background .22s ease, border-color .22s ease, transform .22s ease, box-shadow .22s ease;
}
.qa-tile::before{ content:""; position:absolute; top:0; left:0; width:100%; height:3px; background:var(--gold-grad); transform:scaleX(0); transform-origin:left; transition:transform .3s ease; }
.qa-tile:hover{ background:rgba(255,255,255,.06); border-color:rgba(201,168,76,.45); transform:translateY(-3px); box-shadow:0 14px 30px -18px rgba(0,0,0,.6); }
.qa-tile:hover::before{ transform:scaleX(1); }
.qa-tile:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.qa-ic{
  width:56px; height:56px; border-radius:var(--r-pill);
  display:grid; place-items:center; flex:none;
  background:var(--navy-deep); color:var(--gold);
  box-shadow:inset 0 0 0 1.5px rgba(201,168,76,.55);
  transition:background .25s ease, color .25s ease, box-shadow .25s ease, transform .25s ease;
}
.qa-ic svg{ width:27px; height:27px; display:block; }
.qa-ic .oa-ico{ width:27px; height:27px; vertical-align:0; }
.qa-tile:hover .qa-ic{ background:var(--gold-grad); color:var(--navy-deep); box-shadow:inset 0 0 0 1.5px var(--gold-deep); transform:translateY(-2px); }
.qa-label{ font-weight:600; font-size:16px; color:var(--white); display:flex; align-items:center; gap:8px; }
.qa-label .arrow{ color:var(--gold); transition:transform .22s ease; }
.qa-tile:hover .qa-label .arrow{ transform:translateX(4px); }
.qa-sub{ font-size:12.5px; color:var(--on-navy-soft); letter-spacing:.04em; text-transform:uppercase; }
@media(max-width:900px){ .qa-grid{ grid-template-columns:1fr 1fr; } }
@media(max-width:560px){ .qa-grid{ grid-template-columns:1fr; } .qa-tile{ padding:22px 20px 20px; } }

/* Hero tertiary links — discoverable secondary actions without crowding the hero */
.hero-links{ display:flex; flex-wrap:wrap; align-items:center; gap:8px 16px; margin-top:18px; }
.hero-links a{ position:relative; font-family:var(--font-ui); font-size:13.5px; font-weight:500; letter-spacing:.01em; color:rgba(255,255,255,.84); text-decoration:none; transition:color .18s ease; }
.hero-links a:hover{ color:var(--gold-light); text-decoration:underline; text-underline-offset:3px; }
.hero-links a:not(:first-child)::before{ content:"·"; position:absolute; left:-10px; color:rgba(255,255,255,.42); }
.hero-links a:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
@media(prefers-reduced-motion:reduce){ .qa-tile,.qa-tile::before,.qa-tile:hover{ transition:none; transform:none; } }

/* Admissions hero CTA — one primary action, lighter WhatsApp/Call beside it */
.hero-cta-cluster{ display:flex; flex-wrap:wrap; align-items:center; gap:14px 22px; margin-top:24px; }
.hero-cta-secondary{ display:inline-flex; flex-wrap:wrap; align-items:center; gap:6px 18px; }
.hero-cta-secondary a{ position:relative; font-family:var(--font-ui); font-size:14px; font-weight:600; color:rgba(255,255,255,.9); text-decoration:none; transition:color .18s ease; }
.hero-cta-secondary a:hover{ color:var(--gold-light); text-decoration:underline; text-underline-offset:3px; }
.hero-cta-secondary a:not(:first-child)::before{ content:"·"; position:absolute; left:-11px; color:rgba(255,255,255,.45); }
.hero-cta-secondary a:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }

/* About — Founder → Principal → Today continuity strip */
.founder-chain{ list-style:none; margin:8px 0 0; padding:0; display:flex; flex-wrap:wrap; align-items:stretch; justify-content:center; gap:18px 30px; }
.fc-node{ position:relative; flex:1 1 220px; max-width:300px; display:flex; flex-direction:column; align-items:center; text-align:center; gap:5px; padding:26px 22px; background:var(--white); border:1px solid var(--rule); border-radius:var(--r-lg); box-shadow:var(--shadow-sm); }
.fc-node:not(:last-child)::after{ content:"→"; position:absolute; right:-19px; top:50%; transform:translateY(-50%); color:var(--gold-dark); font-size:19px; line-height:1; }
.fc-ava{ width:84px; height:84px; border-radius:var(--r-pill); overflow:hidden; border:2px solid var(--gold); box-shadow:inset 0 0 0 3px var(--white); margin-bottom:8px; background:var(--offwhite); }
.fc-ava img{ width:100%; height:100%; object-fit:cover; object-position:center 22%; display:block; }
.fc-ava--mark{ display:grid; place-items:center; background:var(--navy-deep); }
.fc-ava--mark img{ width:46px; height:46px; object-fit:contain; object-position:center; }
.fc-era{ font-family:var(--font-ui); font-size:11.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); font-weight:700; }
.fc-name{ font-family:var(--font-display); font-weight:600; font-size:18px; color:var(--navy-deep); line-height:1.25; }
.fc-role{ font-family:var(--font-ui); font-size:13px; color:var(--text-soft); }
@media(max-width:900px){   /* raised from 680px: the branched pair is wider, so three across stopped fitting and the row wrapped with a dangling arrow */
  .founder-chain{ flex-direction:column; align-items:center; gap:30px; }
  .fc-node{ width:100%; max-width:360px; flex:none; }
  .fc-node:not(:last-child)::after{ content:"↓"; right:auto; left:50%; top:auto; bottom:-21px; transform:translateX(-50%); }
}


/* =====================================================================
   THE ORIENTAL DIFFERENCE — transformation strip (Task 2)
   ===================================================================== */
.transform-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:22px; }
.transform-grid.cols-4{ grid-template-columns:repeat(4,1fr); }
.transform-card{
  position:relative; background:var(--white); border:1px solid var(--rule); border-radius:var(--r-md);
  padding:24px 24px 20px; display:flex; flex-direction:column; gap:16px;
  cursor:pointer; transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.transform-card::before{ content:""; position:absolute; top:-1px; left:50%; transform:translateX(-50%); width:0; height:3px; background:var(--gold-grad); border-radius:0 0 3px 3px; transition:width .3s ease; }
.transform-card:hover{ transform:translateY(-4px); box-shadow:var(--shadow-md); border-color:var(--rule-strong); }
.transform-card:hover::before{ width:calc(100% - 32px); }
.transform-card:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
.tf-top{ display:flex; align-items:flex-start; gap:13px; }
.tf-ava{
  flex:none; width:46px; height:46px; border-radius:var(--r-pill);
  display:grid; place-items:center;
  background:var(--navy-deep); color:var(--gold);
  font-family:var(--font-display); font-weight:700; font-size:16px; letter-spacing:.02em;
  box-shadow:inset 0 0 0 1.5px rgba(201,168,76,.55);
}
.tf-ava.lg{ width:56px; height:56px; font-size:19px; }
.tf-id{ min-width:0; }
.tf-id .tf-name{ font-family:var(--font-display); font-weight:600; font-size:19px; color:var(--navy-deep); line-height:1.15; }
.tf-id .tf-meta{ font-size:11.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-muted); font-weight:600; margin-top:4px; }
.tf-spark{ height:74px; }
.tf-spark svg{ display:block; width:100%; height:100%; }
.tf-ends{ display:flex; align-items:baseline; justify-content:space-between; gap:10px; border-top:1px solid var(--rule); padding-top:13px; }
.tf-end{ font-size:11px; letter-spacing:.07em; text-transform:uppercase; color:var(--text-muted); font-weight:600; display:flex; align-items:baseline; gap:7px; }
.tf-end b{ font-family:var(--font-display); font-weight:700; font-size:19px; color:var(--navy); letter-spacing:0; }
.tf-end.xii b{ color:var(--gold-dark); }
.tf-ends .tf-arrow{ color:var(--gold); flex:none; }
.tf-cta{
  display:inline-flex; align-items:center; gap:7px; margin-top:2px;
  font-size:11.5px; letter-spacing:.14em; text-transform:uppercase; font-weight:700; color:var(--gold-dark);
}
.tf-cta .arrow{ transition:transform .22s ease; }
.transform-card:hover .tf-cta .arrow{ transform:translateX(4px); }
.tf-fine{ font-size:12.5px; color:var(--text-muted); margin-top:18px; }
@media(max-width:1080px){ .transform-grid.cols-4{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:860px){ .transform-grid, .transform-grid.cols-4{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:520px){ .transform-grid, .transform-grid.cols-4{ grid-template-columns:1fr; } }

/* Journey modal */
body.tj-open{ overflow:hidden; }
.tj-overlay{
  position:fixed; inset:0; z-index:200;
  background:rgba(14,23,38,.66); -webkit-backdrop-filter:blur(7px) saturate(120%); backdrop-filter:blur(7px) saturate(120%);
  display:grid; place-items:center; padding:22px;
}
.tj-modal{
  position:relative; background:var(--paper); border-radius:var(--r-lg); border-top:3px solid var(--gold);
  box-shadow:var(--shadow-lg); width:min(680px, 100%); padding:clamp(22px,3.5vw,34px);
}
.tj-close{
  position:absolute; top:14px; right:14px; width:42px; height:42px; border-radius:var(--r-pill);
  border:1px solid var(--rule-strong); background:var(--white); color:var(--navy-deep);
  font-size:24px; line-height:1; cursor:pointer; display:grid; place-items:center;
  transition:background .2s ease, color .2s ease;
}
.tj-close:hover{ background:var(--navy); color:var(--white); border-color:var(--navy); }
.tj-close:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
.tj-head{ display:flex; align-items:center; gap:15px; padding-right:48px; margin-bottom:8px; }
.tj-name{ font-family:var(--font-display); font-weight:700; font-size:clamp(20px,2.6vw,26px); color:var(--navy-deep); line-height:1.1; }
.tj-meta{ font-size:11.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-muted); font-weight:600; margin-top:4px; }
.tj-chart{ margin-top:6px; }
.tj-svg{ display:block; width:100%; height:auto; }
.tj-ylab, .tj-xlab{ font-family:var(--font-ui); font-size:11px; fill:var(--text-muted); font-weight:600; }
.tj-xlab{ font-size:11.5px; letter-spacing:.08em; text-transform:uppercase; }
.tj-vlab{ font-family:var(--font-display); font-size:15px; font-weight:700; fill:var(--navy-deep); }
.tj-note{ font-size:14px; color:var(--text-soft); line-height:1.6; border-top:1px solid var(--rule); padding-top:14px; margin-top:6px; }
/* draw-in animation states */
.tj-anim .tj-line{ transition:stroke-dashoffset 1.15s ease .25s; }
.tj-svg .tj-area{ opacity:0; }
.tj-svg .tj-dot{ opacity:0; }
.tj-svg.tj-anim .tj-area{ transition:opacity .9s ease .75s; }
.tj-svg.tj-anim .tj-dot{ transition:opacity .45s ease; }
.tj-svg.tj-in .tj-area{ opacity:1; }
.tj-svg.tj-in .tj-dot{ opacity:1; }
/* gold delta annotation (sparkline + modal chart) */
.tf-spark .td-num{ font:700 13px/1 "Inter",sans-serif; fill:#B08D3A; }
.tf-spark .td-lab{ font:700 9px/1 "Inter",sans-serif; letter-spacing:.08em; fill:#8A8576; }
.tj-svg .td-num{ font-family:var(--font-display); font-size:19px; font-weight:700; fill:#B08D3A; }
.tj-svg .td-lab{ font:600 10px/1 "Inter",sans-serif; letter-spacing:.1em; fill:#8A8576; }
.tj-svg .tj-delta{ opacity:0; }
.tj-svg.tj-anim .tj-delta{ transition:opacity .5s ease 1.2s; }  /* lands after the line draws */
.tj-svg.tj-in .tj-delta{ opacity:1; }

/* =====================================================================
   MOTION POLISH (v3 · progressive enhancement)
   ===================================================================== */
/* Bars animate their width when filled by JS on scroll-in */
.bar > span, .tf-bar > span{ transition:width 1.1s cubic-bezier(.22,.7,.27,1); }
/* Hero photo — slow Ken Burns so the image feels alive (reduced-motion safe) */
@keyframes oa-kenburns{ 0%{ transform:scale(1.002) translate(0,0); } 100%{ transform:scale(1.08) translate(-1.6%,-1.2%); } }
.oa-js .hero-figure .photo-frame img{ animation:oa-kenburns 24s ease-in-out infinite alternate; will-change:transform; }
@media (prefers-reduced-motion: reduce){ .oa-js .hero-figure .photo-frame img{ animation:none; } }
/* Sticky header condenses on scroll */
.header-inner{ transition:min-height .28s ease, padding .28s ease; }
.brand > img{ transition:height .28s ease; }
.site-header.scrolled .header-inner{ min-height:64px; padding-top:8px; padding-bottom:8px; }
.site-header.scrolled .brand > img{ height:42px; }
@media (prefers-reduced-motion: reduce){
  .bar > span, .tf-bar > span, .header-inner, .brand > img{ transition:none !important; }
}

/* --- "66 Years of Light" anniversary emblem (commemorative accent) --- */
.anniv-emblem-lg{ width:clamp(132px,17vw,184px); height:auto; margin-bottom:26px; filter:drop-shadow(0 10px 26px rgba(0,0,0,.34)); }
.anniv-band{ display:flex; align-items:center; justify-content:space-between; gap:32px; flex-wrap:wrap; margin-bottom:clamp(28px,4vw,44px); }
.anniv-band .section-head{ margin-bottom:0; }
.anniv-emblem-sm{ width:clamp(108px,13vw,150px); height:auto; flex:none; filter:drop-shadow(0 8px 22px rgba(0,0,0,.3)); }
@media(max-width:620px){ .anniv-band{ gap:18px; } .anniv-emblem-sm{ width:104px; } }

/* =====================================================================
   REVEAL ANIMATION (progressive enhancement ONLY — content is in the HTML)
   ===================================================================== */
/* A FADE-UP entrance — council-tuned: pronounced via CONFIDENT EASING + a modest
   rise, NOT via long duration (a slow reveal reads as a slow site on slow phones).
   The hidden (opacity:0) state lives ONLY inside the keyframe, reached solely via
   the .in animation, which is gated on .oa-js (JS active) — so no-JS visitors,
   reduced-motion, and the 1.6s failsafe below all resolve to fully-visible content;
   the fade never hides content from crawlers or non-animating browsers. Travel
   eases down + speeds up on phones, where motion hurts most and impresses least. */
/* kindle — light arrives: a long, even GLIDE (owner: the snappy expo curve + brightness
   filter read as "harsh"). easeOutCubic spreads the motion across the whole duration
   instead of front-loading it, and the keyframe animates ONLY opacity + transform
   (compositor-friendly — the old brightness() filter shimmered on phones). */
@keyframes oa-rise{ from{ opacity:0; transform:translateY(var(--oa-rise,20px)); } to{ opacity:1; transform:none; } }
.oa-js .reveal.in{ animation:oa-rise .85s cubic-bezier(.33,1,.68,1) both; }
.oa-js .reveal.in.d1{ animation-delay:.09s; }
.oa-js .reveal.in.d2{ animation-delay:.18s; }
.oa-js .reveal.in.d3{ animation-delay:.27s; }
.oa-js .reveal.in.d4{ animation-delay:.36s; }
@media (max-width:640px){ .oa-js .reveal{ --oa-rise:12px; } .oa-js .reveal.in{ animation-duration:.7s; } }
@media (prefers-reduced-motion: reduce){
  .oa-js .reveal.in{ animation:none !important; }
}

/* =====================================================================
   THE CREST — full-screen, scroll-synced crest assembly. A WebP frame
   sequence is drawn to a <canvas> with scroll position as the playhead.
   The band colour (#111F42, set inline) is sampled EXACTLY from the frame
   corners, so the frame's own margins blend invisibly into the field and the
   crest reads as if floating on one natural surface. The crest is capped to
   its native size so frames never upscale (stays crisp). Subtle gold hairlines
   top/bottom separate this moment from the navy bands around it. DEFAULT
   (no-JS / reduced-motion / mobile / weak / slow net) = the static poster.
   JS adds .scrub-active on capable desktops to pin the stage + enable scrub.
   ===================================================================== */
.about-crest{ position:relative; }
/* Smooth the navy stack: whichever navy band sits directly above the crest
   blends from the legacy navy into the exact crest field colour — no hard step.
   (Currently the About legacy band, which leads into the crest "time-machine".) */
.section.crest-lead{ background:linear-gradient(180deg, var(--navy) 0%, #131F45 100%); }
/* Heritage text that flanks the crest. Type matches the on-navy About style. */
.crest-aside{ max-width:560px; }
.crest-aside .eyebrow{ font-family:var(--font-ui); font-size:12.5px; font-weight:600; letter-spacing:.2em; text-transform:uppercase; color:var(--gold); margin:0 0 14px; }
.crest-aside h2{ color:#fff; font-size:clamp(23px,2.3vw,33px); line-height:1.14; margin:0 0 16px; }
.crest-aside p{ color:var(--on-navy-soft); font-size:clamp(15px,1.15vw,17px); line-height:1.7; margin:0 0 14px; }
.crest-aside p:last-child{ margin-bottom:0; }
.crest-aside p.lead{ color:var(--white); font-size:clamp(16px,1.3vw,19px); }
.crest-aside em{ color:var(--gold-light); font-style:italic; }

/* DEFAULT (no-JS / reduced-motion / mobile / weak / slow net): poster on top,
   text stacked under it, centred — a clean, complete fallback. */
.about-crest .crest-stage{
  min-height:100vh; display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:clamp(22px,4vw,40px); padding:clamp(72px,8vh,110px) 20px; overflow:hidden;
}
.about-crest .crest-poster{ order:0; width:auto; height:auto; max-width:min(1100px,92vw); max-height:62vh; margin:0; }
.about-crest .crest-aside{ text-align:center; }
.about-crest .crest-aside--left{ order:1; }
/* Symbols (order:2) read BEFORE the supporting prose (order:3): crest → meaning → context,
   so the crest's own symbols are the focus and the paragraphs support them. */
.about-crest .crest-aside--right{ order:3; }
.about-crest .crest-canvas{ display:none; }
/* P9 text density: in the static poster fallback on phones, keep the eyebrow + heading centred but
   let the long body paragraphs read left-aligned (easier to scan than 6–8 centred lines). */
@media (max-width:760px){
  .about-crest:not(.scrub-active) .crest-aside p:not(.eyebrow){ text-align:left; }
}

/* SCRUB MODE (capable desktops): pinned stage, crest FULL-SCREEN, with the
   heritage text OVERLAID on the navy margins (left & right), vertically centred.
   JS scrubs each column's opacity + slide-in with scroll. */
.about-crest.scrub-active{ height:300vh; }
.about-crest.scrub-active .crest-stage{
  position:sticky; top:0; height:100vh; min-height:0; padding:0;
  display:flex; align-items:center; justify-content:center; overflow:hidden;
}
.about-crest.scrub-active .crest-poster{ display:none; }
.about-crest.scrub-active .crest-canvas{
  display:block; width:auto; height:auto; max-width:min(1920px,100vw); max-height:100vh; margin:auto;
}
.about-crest.scrub-active .crest-aside{
  position:absolute; top:50%; z-index:3; transform:translateY(-50%);
  width:clamp(210px,21vw,360px); opacity:0; will-change:opacity,transform;
  text-shadow:0 1px 16px rgba(0,0,0,.5);   /* legible over any crest edge */
}
.about-crest.scrub-active .crest-aside--left{ left:clamp(20px,3.5vw,64px); text-align:left; }
.about-crest.scrub-active .crest-aside--right{ right:clamp(20px,3.5vw,64px); text-align:right; }
@media (max-width:1200px){ .about-crest.scrub-active .crest-aside{ width:clamp(178px,19vw,300px); } }
/* Phones & tablets (owner request): instead of the scroll-scrub, the assembly VIDEO plays once when
   the crest scrolls in, then is removed and the static poster (assembled crest) returns. The video
   takes the poster's exact slot in the stacked layout, so the heritage text below is undisturbed. */
.about-crest .crest-video{ order:0; width:auto; height:auto; max-width:min(1100px,92vw); max-height:62vh;
  margin:0; border-radius:6px; }
/* On phones, don't force a full 100vh stage (it leaves a big empty navy band above the crest) —
   let the crest + heritage text pack naturally for a tighter, intentional section. */
@media (max-width:760px){
  .about-crest .crest-stage{ min-height:auto; padding-top:clamp(44px,9vh,80px); padding-bottom:clamp(44px,9vh,80px); }
  .about-crest .crest-video,.about-crest .crest-poster{ max-height:52vh; }
}
/* P2 crest-as-artifact: a soft radial spotlight behind the crest makes it read as a presented,
   precious artifact rather than a logo on a navy slab. Scrub mode (full-screen canvas) is untouched.
   NOTE: never put `filter:` on .crest-poster — iOS Safari fails to paint a filtered transparent
   PNG/WebP, which makes the crest vanish after the mobile assembly video restores the poster. */
.about-crest:not(.scrub-active) .crest-stage{
  background:
    /* curator's top-down spotlight — the light is placed above, pooling on the crest */
    radial-gradient(ellipse 62% 78% at 50% 1%, rgba(201,168,76,.20), rgba(201,168,76,.06) 44%, transparent 76%),
    /* a soft grounding shadow at the foot, so the crest reads as an object in a vitrine */
    radial-gradient(ellipse 38% 15% at 50% 95%, rgba(0,0,0,.30), transparent 72%);
}

/* =====================================================================
   ABOUT TIMELINE — "The Light Travels" · 1960 → 2026 (Stage 0: static).
   Six stacked acts; real photos, real numbers in the HTML. Reuses the
   site's section rhythm, .kicker, .gallery and photo-frame language.
   Animation (parallax / light / count-ups) layers on in later stages.
   ===================================================================== */
.tl-act .tl-head{ max-width:800px; margin-bottom:clamp(28px,4vw,44px); }
.tl-act .tl-head h2{ font-size:clamp(27px,3.5vw,44px); line-height:1.12; margin-top:14px; }
.tl-act .tl-hindi{ font-size:clamp(16px,1.6vw,21px); margin-top:14px; color:var(--text-soft); font-style:normal; }
.tl-act.on-dark .tl-hindi{ color:var(--on-navy-soft); }
.tl-act .tl-sub{ margin-top:12px; font-size:15px; color:var(--text-soft); }
.tl-act.on-dark .tl-sub{ color:var(--on-navy-soft); }

/* "Est. 1960" — arrives whole, never a counter (storyboard §7). */
.tl-est{
  font-family:var(--font-display); font-weight:700; letter-spacing:.12em;
  color:var(--gold); font-size:clamp(20px,2.2vw,28px); display:inline-block; margin-top:18px;
}

/* Stat row inside an act (real values, plain text in Stage 0). */
.tl-stats{ display:flex; flex-wrap:wrap; gap:18px 48px; margin-top:clamp(24px,3.5vw,36px); }
.tl-stats .ts b{
  display:block; font-family:var(--font-display); font-weight:700; line-height:1;
  font-size:clamp(30px,3.6vw,46px); color:var(--navy-deep); letter-spacing:-0.01em;
}
.tl-act.on-dark .tl-stats .ts b{ color:var(--white); }
.tl-stats .ts b .plus{ color:var(--gold-dark); } .tl-act.on-dark .tl-stats .ts b .plus{ color:var(--gold); }
.tl-stats .ts span{ display:block; margin-top:8px; font-size:12.5px; letter-spacing:.15em; text-transform:uppercase; font-weight:500; color:var(--text-muted); }
.tl-act.on-dark .tl-stats .ts span{ color:var(--on-navy-soft); }

/* Closing coda — lands the arc (1960 → 2026 → ∞) so the timeline doesn't end abruptly,
   especially on mobile. No new facts; reuses the flame/∞ motif from the spine end-mark. */
.tl-coda{ margin:clamp(30px,5.5vw,48px) 0 0; text-align:center; }
.tl-coda-arc{ display:block; font-family:var(--font-display); font-weight:700; letter-spacing:.16em;
  font-size:clamp(18px,2.5vw,27px); color:var(--gold-dark); }
.tl-coda-arc i{ font-style:normal; color:var(--gold); margin:0 .22em; opacity:.65; }
.tl-coda-arc b{ font-weight:700; color:var(--gold); font-size:2.2em; line-height:0; vertical-align:-.18em;
  text-shadow:0 0 24px rgba(201,168,76,.5); }
.tl-coda-line{ display:block; margin:13px auto 0; max-width:34ch; font-family:var(--font-prose);
  font-style:italic; font-size:clamp(15px,1.5vw,18px); line-height:1.5; color:var(--text-soft); }
.tl-act.on-dark .tl-coda-arc,.bg-navy .tl-coda-arc{ color:var(--gold); } .tl-act.on-dark .tl-coda-line,.bg-navy .tl-coda-line{ color:var(--on-navy-soft); }

/* Photo captions on gallery items (year badges + captions). */
.gallery .g-item figcaption{
  position:absolute; left:0; right:0; bottom:0; padding:24px 14px 10px;
  font-size:12px; line-height:1.45; color:#F3EFE6;
  background:linear-gradient(180deg, transparent, rgba(13,20,38,.82));
}
.gallery .g-item .yr{
  position:absolute; top:10px; left:10px; z-index:2;
  font-family:var(--font-ui); font-size:11.5px; font-weight:700; letter-spacing:.14em;
  color:var(--gold); background:rgba(13,20,38,.9); padding:5px 11px; border-radius:var(--r-pill);
  border:1px solid rgba(201,168,76,.55);
}
/* Dignified "awaiting photograph" badge for the reserved third-generation slot. */
.gallery .g-item .reserved-badge{
  position:absolute; top:10px; right:10px; z-index:2;
  font-family:var(--font-ui); font-size:10.5px; font-weight:700; letter-spacing:.14em; text-transform:uppercase;
  color:var(--navy-deep); background:var(--gold); padding:4px 9px; border-radius:4px;
}

/* Act V — the constellation numbers (photo-free, navy field). */
.tl-constellation{ text-align:center; padding:clamp(20px,4vw,48px) 0; }
.tl-constellation .big{
  font-family:var(--font-display); font-weight:700; line-height:1; color:var(--white);
  font-size:clamp(64px,11vw,150px); letter-spacing:-0.02em;
}
.tl-constellation .big .plus{ color:var(--gold); }
.tl-constellation .big-label{ margin-top:10px; font-size:13px; letter-spacing:.22em; text-transform:uppercase; color:var(--gold); font-weight:600; }
.tl-constellation .second{ margin-top:clamp(22px,3.5vw,34px); font-family:var(--font-display); font-weight:700; font-size:clamp(30px,4vw,52px); color:var(--white); }
.tl-constellation .professions{ margin-top:clamp(18px,2.5vw,26px); font-size:15px; color:var(--on-navy-soft); max-width:560px; margin-left:auto; margin-right:auto; line-height:1.8; }

/* --- Static / mobile atmosphere parity. On phones, reduced-motion, or weak
   devices the timeline stays in static Stage 0 (no .tl-motion) — where the dark
   acts were FLAT navy slabs while desktop got lit scenes. Give each static dark
   act one off-axis warm light-field (the "single lamp"), alternating sides down
   the descent, and the constellation a faint star-field. Pure-CSS radials only:
   no filter, no image, no canvas — iOS-safe and free on mobile. The .tl-motion
   path keeps its own richer treatment and is never touched by these rules. --- */
.tl-track:not(.tl-motion) .tl-act.on-dark{ position:relative; }
.tl-track:not(.tl-motion) .tl-act.on-dark > .wrap{ position:relative; z-index:1; }
.tl-track:not(.tl-motion) .tl-act.on-dark::before{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background:radial-gradient(62% 54% at 79% 16%, rgba(201,168,76,.13), rgba(201,168,76,.045) 38%, transparent 68%);
}
.tl-track:not(.tl-motion) .tl-act.on-dark:nth-of-type(even)::before{
  background:radial-gradient(62% 54% at 21% 15%, rgba(201,168,76,.13), rgba(201,168,76,.045) 38%, transparent 68%);
}
@media(prefers-reduced-motion: no-preference){
  .tl-track:not(.tl-motion) .tl-act.on-dark::before{ transition:none; }
}
/* Act V — the 80,000+ student-years, as a faint constellation behind the numerals. */
.tl-track:not(.tl-motion) #act-5{ position:relative; }
.tl-track:not(.tl-motion) #act-5::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none; opacity:.55;
  background:
    radial-gradient(1.6px 1.6px at 13% 20%, rgba(230,200,104,.75), transparent 62%),
    radial-gradient(1.4px 1.4px at 83% 26%, rgba(230,200,104,.65), transparent 62%),
    radial-gradient(1.2px 1.2px at 29% 64%, rgba(230,200,104,.6), transparent 62%),
    radial-gradient(1.5px 1.5px at 70% 72%, rgba(230,200,104,.6), transparent 62%),
    radial-gradient(1.1px 1.1px at 48% 12%, rgba(230,200,104,.5), transparent 62%),
    radial-gradient(1.3px 1.3px at 92% 56%, rgba(230,200,104,.5), transparent 62%),
    radial-gradient(1.1px 1.1px at 7% 78%, rgba(230,200,104,.45), transparent 62%),
    radial-gradient(1.2px 1.2px at 60% 40%, rgba(230,200,104,.4), transparent 62%);
}

/* =====================================================================
   THE LIGHT TRAVELS — Stage 1/2 motion: the Roshni spine.
   A vertical timeline (1960 → ∞) runs the length of the six acts; a warm
   gold light-orb travels down it with scroll, lighting era markers as it
   passes, while act imagery drifts in subtle 3-speed parallax depth.
   All of this exists ONLY when JS adds .tl-motion on capable desktops —
   the static Stage 0 page is the fallback truth.
   ===================================================================== */
.tl-track{ position:relative; }
.tl-spine{ display:none; }

/* The spine is now a SERPENTINE: a full-track SVG overlay. The light weaves
   left → right → left down the decades; the gold trail reveals behind it
   (stroke-dashoffset), and era markers sit ON the curve, flipping sides. */
.tl-motion .tl-spine{
  /* z2: above the dark world + vignette, BELOW the stage layers (photos z3+,
     copy z4) — the light weaves behind the memories, never across them. */
  display:block; position:absolute; inset:0; z-index:2; pointer-events:none;
  width:auto; background:none;
}
.tl-motion .tl-spine-fill{ display:none; }   /* superseded by the SVG trail */
.tl-motion .tl-path-svg{ position:absolute; inset:0; width:100%; height:100%; overflow:visible; }
.tl-motion .tl-path-base{
  fill:none; stroke:rgba(201,168,76,.16); stroke-width:2; stroke-linecap:round;
}
.tl-motion .tl-path-lit{
  fill:none; stroke:var(--gold); stroke-width:2.5; stroke-linecap:round;
  filter:drop-shadow(0 0 6px rgba(230,200,104,.65));
}
/* The travelling light — layered halo + hot core (the only bright thing). */
.tl-motion .tl-orb{ position:absolute; left:0; top:0; width:0; height:0; opacity:0; }
.tl-motion .tl-orb::before{
  content:""; position:absolute; left:-70px; top:-70px; width:140px; height:140px;
  background:radial-gradient(circle, rgba(230,200,104,.32) 0%, rgba(201,168,76,.12) 38%, transparent 68%);
  border-radius:50%;
}
.tl-motion .tl-orb .orb-core{
  position:absolute; left:-7px; top:-7px; width:14px; height:14px; border-radius:50%;
  background:radial-gradient(circle at 42% 38%, #FFF6DC 0%, #E6C868 45%, #A9842F 100%);
  box-shadow:0 0 18px 4px rgba(230,200,104,.85), 0 0 46px 14px rgba(201,168,76,.4);
}
/* Era markers — dots on the curve that light as the orb passes. JS sets
   left/top from the path; labels flip sides on right-hand sweeps. */
.tl-motion .tl-mark{ position:absolute; left:0; top:0; transform:translate(-50%,-50%); }
.tl-motion .tl-mark.flip .lbl{ left:auto; right:22px; text-align:right; }
.tl-motion .tl-mark .dot{
  display:block; width:11px; height:11px; border-radius:50%;
  background:var(--navy-deep); border:2px solid rgba(201,168,76,.45);
  transition:background .5s ease, border-color .5s ease, box-shadow .5s ease;
}
.tl-motion .tl-mark .lbl{
  position:absolute; left:22px; top:50%; transform:translateY(-50%); white-space:nowrap;
  font-family:var(--font-ui); font-size:11px; font-weight:700;
  letter-spacing:.16em; text-transform:uppercase; color:rgba(138,133,118,.85);
  text-shadow:0 1px 6px rgba(13,20,38,.25); transition:color .5s ease;
}
.tl-motion .tl-mark.lit .dot{
  background:var(--gold); border-color:#E6C868;
  box-shadow:0 0 12px 3px rgba(230,200,104,.7);
}
.tl-motion .tl-mark.lit .lbl{ color:var(--gold-dark); }
.tl-motion .tl-act.on-dark ~ * .tl-mark.lit .lbl{ color:var(--gold); }
.tl-motion .tl-mark.end .lbl{ font-size:15px; letter-spacing:0; }
@media (max-width:1359px){ .tl-motion .tl-mark .lbl{ display:none; } }

/* Parallax depth — transforms only; assigned by JS per gallery item. */
.tl-motion .tl-act .g-item, .tl-motion .tl-act .tl-head{ will-change:transform; }

/* Time-machine handoff: leaving the crest field pours straight into the
   darkness of 1960 — Act I tops out at the crest colour, no seam. */
.tl-track .tl-act[data-era="1960"]{ background:linear-gradient(180deg, #131F45 0%, var(--navy-deep) 30%); }

/* =====================================================================
   THE HISTORY DIMENSION — pinned story scenes (motion mode only).
   Same DOM as the static Stage 0; when oa-timeline.js adds .tl-motion and
   per-act .scene classes, each act becomes a pinned 100vh stage whose
   beats (head → key photos → memory wall) are scrubbed by scroll.
   JS drives opacity/transform; CSS defines the stage and layer looks.
   ===================================================================== */
.tl-motion .tl-act.scene{ padding:0 !important; position:relative; }
.tl-motion .tl-act.scene > .wrap{
  position:sticky; top:0; height:100vh; max-width:none; width:100%;
  margin:0; padding:0; overflow:hidden;
  display:block;
  /* Sticky creates its own stacking context — lift the WHOLE stage above the
     light layer (z2) so the path/orb genuinely pass BEHIND the photographs.
     The stage itself is transparent; the act's ground stays beneath the light. */
  z-index:3;
}
/* Soft cinematic vignette + film grain on every dark scene stage. */
.tl-motion .scene-dark > .wrap::before{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:
    var(--tl-grain),
    radial-gradient(ellipse 100% 86% at 50% 44%, transparent 40%, rgba(5,9,18,.6) 100%);
  background-size:220px 220px, auto;
}
/* Daylight gets the faintest version — warm paper, barely-there grain. */
.tl-motion .scene-day > .wrap::before{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:
    var(--tl-grain-soft),
    radial-gradient(ellipse 100% 86% at 50% 44%, transparent 55%, rgba(22,36,63,.10) 100%);
  background-size:220px 220px, auto;
}
/* Faint dust motes drifting in the dark — two layered gradients, slow transform. */
.tl-motion .scene-dark > .wrap::after{
  content:""; position:absolute; inset:-12%; z-index:1; pointer-events:none; opacity:.5;
  background:
    radial-gradient(1.5px 1.5px at 18% 32%, rgba(230,200,104,.35), transparent 60%),
    radial-gradient(1px 1px at 64% 18%, rgba(230,200,104,.28), transparent 60%),
    radial-gradient(1.5px 1.5px at 82% 58%, rgba(230,200,104,.22), transparent 60%),
    radial-gradient(1px 1px at 38% 74%, rgba(230,200,104,.3), transparent 60%),
    radial-gradient(1.5px 1.5px at 52% 46%, rgba(230,200,104,.18), transparent 60%),
    radial-gradient(1px 1px at 8% 82%, rgba(230,200,104,.26), transparent 60%);
  animation:oa-dust 46s linear infinite alternate;
}
@keyframes oa-dust{ from{ transform:translate3d(-1.5%, -1%, 0); } to{ transform:translate3d(1.5%, 2%, 0); } }

/* World grounds: the tonal arc — each act's night a shade paler than the
   last, until daybreak at Act VI. Act I keeps its crest handoff. */
.tl-motion .tl-act.scene-dark{ background:linear-gradient(180deg, var(--act-sky) 0%, var(--act-mid) 52%, var(--act-floor) 100%); }
.tl-motion .tl-act.scene-dark[data-act="1"]{ background:linear-gradient(180deg, #131F45 0%, var(--act-sky) 14%, var(--act-mid) 55%, var(--act-floor) 100%); }
.tl-motion .tl-act.scene-day{ background:linear-gradient(180deg, var(--act-sky) 0%, var(--act-mid) 50%, var(--act-floor) 100%); }

/* Dark-scene typography (covers Acts II/III whose static ground is light). */
.tl-motion .scene-dark h2{ color:#fff; }
.tl-motion .scene-dark .kicker{ color:var(--gold); }
.tl-motion .scene-dark .kicker::before{ background:var(--gold); }
.tl-motion .scene-dark .tl-hindi{ color:var(--on-navy-soft); }
.tl-motion .scene-dark .tl-sub{ color:var(--on-navy-soft); }
.tl-motion .scene-dark .tl-stats .ts b{ color:var(--white); }
.tl-motion .scene-dark .tl-stats .ts b .plus{ color:var(--gold); }
.tl-motion .scene-dark .tl-stats .ts span{ color:var(--on-navy-soft); }

/* ---- Layers. JS scrubs opacity/transform; everything starts hidden. ---- */
.tl-motion .scene .tl-head,
.tl-motion .scene .gallery .g-item,
.tl-motion .scene .tl-stats,
.tl-motion .scene .tl-constellation{
  opacity:0; will-change:opacity,transform;
}
/* Beat 0 — the act's narrated opening, centre stage. */
.tl-motion .scene .tl-head{
  position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  z-index:4; margin:0; max-width:820px; width:min(86vw,820px); text-align:center;
}
.tl-motion .scene .tl-head .kicker{ justify-content:center; }
.tl-motion .scene .tl-head h2{ font-size:clamp(30px,4vw,52px); }

/* Key-photo beats — the photograph, centre stage, narrating its line.
   Every mount has the SAME height (one constant visual scale per beat) and
   shrink-wraps its photo's width — a slim consistent mat, never an empty one. */
.tl-motion .scene .gallery{ position:absolute; inset:0; display:block; z-index:3; }
.tl-motion .scene .gallery .g-item{
  position:absolute; left:50%; top:50%;
  margin:0; transform:translate(-50%,-50%);
  width:max-content; max-width:min(940px,80vw);
  aspect-ratio:auto !important;
  background:none; border:none; overflow:visible; border-radius:0;
  text-align:center;
}
.tl-motion .scene .gallery .g-item picture{
  display:block; width:max-content; max-width:100%; height:52vh;
  margin:0 auto; padding:14px;
  background:rgba(7,12,24,.42);
  border:1px solid rgba(201,168,76,.42); border-radius:var(--r-md);
  box-shadow:0 2px 6px rgba(0,0,0,.4), 0 18px 44px -12px rgba(0,0,0,.55),
             0 48px 110px -30px rgba(0,0,0,.7), 0 0 60px rgba(201,168,76,.08);
}
.tl-motion .scene-day .gallery .g-item picture{ background:rgba(255,255,255,.65); box-shadow:0 24px 60px -22px rgba(22,36,63,.35); }
.tl-motion .scene .gallery .g-item img{
  width:auto; height:100%; max-width:100%;
  object-fit:contain; margin:0; display:block;
  border:6px solid #F6F1E4; border-radius:2px;   /* archival print edge */
  box-shadow:0 6px 28px rgba(0,0,0,.35);
}
/* §6 — UNIFIED ARCHIVAL GRADE (opt-in, per image). One warm light across the whole archive so the
   true B&W prints, the faded colour prints and the modern scans read as ONE collection. Applied ONLY
   to historical photos via the .archival-img class — modern/current photos never receive it. This
   replaces the old per-act (.scene-dark) blanket grade, which wrongly sepia'd the modern Act IV photos. */
.archival-img{ filter:sepia(.22) saturate(.92) contrast(1.03) brightness(.99); }
.tl-motion .scene-day .gallery .g-item img{ filter:none; box-shadow:0 6px 24px rgba(22,36,63,.22); }
/* The narration line — the photo's story, told beneath it. */
.tl-motion .scene .gallery .g-item figcaption{
  position:static; margin-top:22px; padding:0; background:none;
  font-family:var(--font-display); font-weight:600; font-style:italic;
  font-size:clamp(19px,2vw,27px); line-height:1.55; color:#F3EFE6;
  text-shadow:0 2px 18px rgba(7,12,24,.6);
}
.tl-motion .scene .gallery .g-item figcaption::before{
  content:""; display:block; width:44px; height:2px; background:var(--gold); margin:0 auto 14px;
}
.tl-motion .scene-day .gallery .g-item figcaption{ color:var(--navy-deep); text-shadow:none; }
.tl-motion .scene .gallery .g-item .yr{ top:26px; left:28px; }

/* Memory-wall beat — the memory table (JS computes the slots, deals the
   prints in, then sweeps the light across them); every tile the same
   height, width hugging its photo. Captions exist but stay dark until
   the light lifts their print — JS scrubs their opacity. */
.tl-motion .scene .gallery .g-item.wall-item{ width:max-content; max-width:32vw; }
.tl-motion .scene .gallery .g-item.wall-item picture{ height:26vh; padding:8px; }
.tl-motion .scene .gallery .g-item.wall-item img{ border-width:4px; }
.tl-motion .scene .gallery .g-item.wall-item figcaption{
  position:absolute; top:100%; left:50%; transform:translateX(-50%);
  margin-top:16px; width:max-content; max-width:28vw;
  font-size:clamp(15px,1.5vw,20px); line-height:1.45;
  opacity:0; will-change:opacity;
}
.tl-motion .scene .gallery .g-item.wall-item figcaption::before{ width:30px; margin-bottom:9px; }

/* Stats ride the final beat, low on the stage. */
.tl-motion .scene .tl-stats{
  position:absolute; left:50%; bottom:8vh; transform:translateX(-50%);
  z-index:5; margin:0; justify-content:center; text-align:center;
}

/* Act V — the constellation OPTS OUT of the pinned 100vh stage (oa-timeline.js
   marks it skip) so its tall interactive column (number + names + spotlight +
   CTA) flows in normal order and is NEVER clipped. Deepest black so the gold
   names burn brightest; content lifted above the light layer, with the gold
   thread passing behind it — reading as the spine the 80,000+ student-years rests on. */
.tl-motion .tl-act[data-act="5"]{ position:relative;
  background:radial-gradient(125% 95% at 50% 34%, #0B1428 0%, #05080F 60%, #04060C 100%); }
.tl-motion .tl-act[data-act="5"] > .wrap{
  position:relative; z-index:3; min-height:100vh;
  padding-block:clamp(64px,13vh,150px);
  display:flex; flex-direction:column; align-items:center; justify-content:center;
}
.tl-motion .tl-act[data-act="5"] .tl-head{ margin:0 0 clamp(18px,4vh,44px); max-width:760px; }
.tl-motion .tl-act[data-act="5"] .tl-constellation{ width:min(92vw,1000px); }
/* a faint star-field behind it — cheap CSS, no JS — beneath the gold thread */
.tl-motion .tl-act[data-act="5"]::after{ content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background:
    radial-gradient(1.5px 1.5px at 12% 22%, rgba(255,247,222,.55), transparent 60%),
    radial-gradient(1.3px 1.3px at 80% 15%, rgba(230,200,104,.5), transparent 60%),
    radial-gradient(1.6px 1.6px at 66% 60%, rgba(255,247,222,.45), transparent 60%),
    radial-gradient(1.1px 1.1px at 28% 72%, rgba(230,200,104,.45), transparent 60%),
    radial-gradient(1.4px 1.4px at 90% 80%, rgba(255,247,222,.4), transparent 60%),
    radial-gradient(1px 1px at 46% 38%, rgba(230,200,104,.4), transparent 60%),
    radial-gradient(1.2px 1.2px at 7% 58%, rgba(255,247,222,.38), transparent 60%),
    radial-gradient(1px 1px at 58% 88%, rgba(230,200,104,.36), transparent 60%);
}
.tl-motion .scene.wall-dense .gallery .g-item.wall-item picture{ height:15vh; padding:5px; }

/* =====================================================================
   TIME-JUMP WARP — the portal moment between eras. While the playhead
   crosses an act boundary, gold light-streaks radiate from centre (drawn
   on a fixed canvas), the NEXT era's year stamps past huge in outlined
   Playfair, and the orb flares. All of it lives on the light layer (z2):
   behind the stages, above the world. Drawn only while warping.
   ===================================================================== */
.tl-motion .tl-warp-canvas{
  position:fixed; inset:0; width:100vw; height:100vh;
  z-index:2; pointer-events:none;
}
.tl-motion .tl-era-stamp{
  position:fixed; left:50%; top:50%; z-index:2; pointer-events:none;
  opacity:0; transform:translate(-50%,-50%);
  font-family:var(--font-display); font-weight:800; white-space:nowrap;
  font-size:clamp(90px,16vw,250px); letter-spacing:.02em; line-height:1;
  color:rgba(230,200,104,.05);
  -webkit-text-stroke:2px rgba(230,200,104,.85);
  text-shadow:0 0 60px rgba(201,168,76,.28);
  will-change:opacity,transform;
}

/* =====================================================================
   THE LIGHT TRAVELS — SHOWSTOPPER PASS. The per-act tonal arc (night
   pales into day as the decades pass), film grain, the breathing lamp,
   era watermarks, the orb's light-bleed, head-beat staggering, and a
   designed static/mobile stage (spine + era chips).
   ===================================================================== */

/* Film grain, tiled from a tiny SVG — a static texture, zero animation cost. */
.tl-track{
  --tl-grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)' opacity='.05'/%3E%3C/svg%3E");
  --tl-grain-soft:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)' opacity='.025'/%3E%3C/svg%3E");
}

/* The tonal arc: each act's sky/ground. 1960 is deepest night; the navy
   pales decade by decade; Act V is the star-field; Act VI is daybreak. */
.tl-act{ --act-sky:var(--navy-deep); --act-mid:var(--navy-deep); --act-floor:var(--navy-deep);
         --act-glow:rgba(232,196,104,.08); }
/* Wider gamut + cool→warm drift so "the light approaches" reads as colour
   temperature, not just brightness. Act I deepest cold night → Act IV warm
   pre-dawn → Act V truest black (stars burn brightest) → Act VI daybreak. */
.tl-act[data-act="1"]{ --act-sky:#0A1428; --act-mid:#101D38; --act-floor:#0C1730; --act-glow:rgba(232,196,104,.08); }
.tl-act[data-act="2"]{ --act-sky:#102038; --act-mid:#1B2D52; --act-floor:#14223D; --act-glow:rgba(234,200,112,.10); }
.tl-act[data-act="3"]{ --act-sky:#16294A; --act-mid:#2B3A66; --act-floor:#1A2A48; --act-glow:rgba(238,208,124,.12); }
.tl-act[data-act="4"]{ --act-sky:#203759; --act-mid:#3A4E74; --act-floor:#26365A; --act-glow:rgba(244,216,142,.15); }
.tl-act[data-act="5"]{ --act-sky:#05080F; --act-mid:#0A1120; --act-floor:#070D1C; --act-glow:rgba(230,200,104,.06); }
.tl-act[data-act="6"]{ --act-sky:#FFFDF6; --act-mid:#FBF8F1; --act-floor:#F5F0E8; --act-glow:rgba(255,243,214,.55); }
/* Warm bridge so Act V's black doesn't slam straight into Act VI's daybreak. */
.tl-motion .tl-act.scene-day[data-act="6"]{ background:linear-gradient(180deg, #1C1606 0%, #5A4A22 5%, #EDE3CA 12%, var(--act-sky) 26%, var(--act-mid) 60%, var(--act-floor) 100%); }

/* Pinned scenes own their choreography — the site-wide reveal entrance
   (oa-rise, animation-fill-mode:both) would otherwise hold transform:none
   over every scrubbed inline transform and shove layers off-centre.
   (oa-timeline.js also strips .reveal inside scenes; this is the backstop.) */
.tl-motion .scene .reveal.in,
.tl-motion .scene.reveal.in{ animation:none !important; }

/* The breathing lamp — a slow warm pool of light behind the active beat. */
.tl-motion .scene-dark .scene-lamp{
  position:absolute; left:50%; top:48%; width:74vw; height:74vw;
  margin:-37vw 0 0 -37vw; z-index:1; pointer-events:none; border-radius:50%;
  background:radial-gradient(circle, var(--act-glow) 0%, transparent 62%);
  animation:oa-lamp 7s ease-in-out infinite alternate;
}
@keyframes oa-lamp{ from{ transform:scale(.96); opacity:.6; } to{ transform:scale(1.06); opacity:1; } }

/* Era watermark — the decade, whisper-faint behind everything, so the
   stage is never an empty field while beats hand over. */
.tl-motion .scene .tl-watermark{
  position:absolute; left:3vw; top:50%; transform:translateY(-50%);
  z-index:1; pointer-events:none; user-select:none; white-space:nowrap;
  font-family:var(--font-display); font-weight:800; line-height:1;
  font-size:clamp(140px,23vw,340px);
  color:rgba(230,200,104,.035);
  -webkit-text-stroke:1px rgba(230,200,104,.07);
}
.tl-motion .scene-day .tl-watermark{ color:rgba(176,141,58,.05); -webkit-text-stroke:1px rgba(176,141,58,.10); }

/* The orb's light bleeds onto the world around it (z2 layer: above the
   act grounds, beneath the sticky stages — light passes behind photos). */
.tl-motion .tl-glow{
  position:absolute; left:0; top:0; width:56vw; height:56vw; margin:-28vw 0 0 -28vw;
  pointer-events:none; border-radius:50%; will-change:transform,opacity; opacity:0;
  background:radial-gradient(circle, rgba(230,200,104,.10) 0%, rgba(201,168,76,.045) 40%, transparent 66%);
}

/* Head-beat staging: kicker → headline → hindi → sub, each a breath apart.
   JS writes --beat (0→1, the beat's own clock) on the head; the children
   derive their own entrances from it. Opacity self-clamps to [0,1]. */
.tl-motion .scene .tl-head > *{
  opacity:calc((var(--beat, 1) - var(--stg, 0)) / .18);
  transform:translateY(calc(max(0, 1 - (var(--beat, 1) - var(--stg, 0)) / .18) * 14px));
}
.tl-motion .scene .tl-head .kicker{ --stg:0; }
.tl-motion .scene .tl-head h2{ --stg:.07; }
.tl-motion .scene .tl-head .tl-hindi{ --stg:.14; }
.tl-motion .scene .tl-head .tl-sub,
.tl-motion .scene .tl-head .tl-est{ --stg:.21; }

/* =====================================================================
   THE STATIC STAGE (mobile / no-JS / reduced motion / weak devices):
   the same story told on a quiet page — the tonal arc, the grain, and a
   gold spine with era chips running down the left.
   ===================================================================== */
.tl-track:not(.tl-motion) .tl-act{ position:relative; }
.tl-track:not(.tl-motion) .tl-act.on-dark{
  background:
    var(--tl-grain),
    radial-gradient(ellipse 130% 90% at 50% 36%, transparent 52%, rgba(5,9,18,.45) 100%),
    linear-gradient(180deg, var(--act-sky), var(--act-mid) 55%, var(--act-floor));
  background-size:220px 220px, auto, auto;
}
.tl-track:not(.tl-motion) .tl-act[data-act="1"]{
  background:
    var(--tl-grain),
    radial-gradient(ellipse 130% 90% at 50% 36%, transparent 52%, rgba(5,9,18,.45) 100%),
    linear-gradient(180deg, #131F45 0%, var(--act-sky) 16%, var(--act-mid) 58%, var(--act-floor) 100%);
  background-size:220px 220px, auto, auto;
}
.tl-track:not(.tl-motion) .tl-act[data-act="6"]{
  background:
    var(--tl-grain-soft),
    linear-gradient(180deg, var(--act-sky), var(--act-mid) 50%, var(--act-floor));
  background-size:220px 220px, auto;
}
/* The spine: a gold thread down the left of every act, era chip at its head. */
.tl-track:not(.tl-motion) .tl-act::before{
  content:""; position:absolute; left:clamp(16px,4vw,26px); top:0; bottom:0; width:2px;
  background:linear-gradient(180deg, rgba(201,168,76,.55), rgba(201,168,76,.12));
}
.tl-track:not(.tl-motion) .tl-act::after{
  content:attr(data-era); position:absolute; left:clamp(28px,6vw,44px); top:34px;
  font-family:var(--font-ui); font-size:11px; font-weight:700; line-height:1;
  letter-spacing:.16em; text-transform:uppercase; color:var(--gold);
  background:rgba(13,20,38,.88); border:1px solid rgba(201,168,76,.4);
  padding:6px 11px; border-radius:var(--r-pill);
}
@media (max-width:900px){
  .tl-track:not(.tl-motion) .tl-act > .wrap{ padding-left:54px; }
}
/* Lead photo of each act gets the full row on phones. */
@media (max-width:760px){
  .tl-track:not(.tl-motion) .gallery .g-item:first-child{ grid-column:span 12; aspect-ratio:16/10; }
}

/* =====================================================================
   CHROME-LIGHT — warm paper header (8 main pages; Legacy keeps dark chrome)
   ===================================================================== */
body.chrome-light .site-header{ background:rgba(251,248,241,.96); border-bottom:1px solid var(--gold); box-shadow:0 2px 10px -6px rgba(22,36,63,.18); }
body.chrome-light .site-header.scrolled{ background:rgba(251,248,241,.99); box-shadow:0 8px 26px -12px rgba(22,36,63,.28); }
body.chrome-light .brand > img{ filter:none; }
body.chrome-light .brand-name{ color:var(--navy-deep); }
body.chrome-light .brand-sub{ color:var(--gold-dark); }
body.chrome-light .main-nav a{ color:#33415C; }
body.chrome-light .main-nav a:hover{ color:var(--navy-deep); }
body.chrome-light .main-nav a[aria-current="page"]{ color:var(--navy-deep); }
body.chrome-light .nav-toggle{ border-color:rgba(27,42,74,.35); }
body.chrome-light .nav-toggle span{ background:var(--navy); }
@media(max-width:1160px){
  body.chrome-light .main-nav{ background:var(--paper); border-bottom:1px solid var(--rule-strong); box-shadow:var(--shadow-md); }
  body.chrome-light .main-nav a{ border-top:1px solid var(--rule); }
}

/* =====================================================================
   HERO-CINE — full-bleed photo slideshow hero (Home)
   ===================================================================== */
.hero-cine{ position:relative; background:var(--navy-deep); }
.hero-cine .ss-stage{ aspect-ratio:auto; height:clamp(540px,78vh,780px); border-radius:0; border:none; box-shadow:none; }
.hero-cine .ss-slide img{ object-position:center 32%; }
/* iOS Safari: force every hero slide image onto its own stable GPU layer so the
   first (eager + preloaded) slide PAINTS immediately, instead of staying blank
   until a swipe forces a repaint. Without this, slide 0 decodes behind the loader
   and never composites on WebKit. */
.hero-cine .ss-slide img,
.page-hero.has-slideshow .ss-slide img{
  -webkit-backface-visibility:hidden; backface-visibility:hidden;
  -webkit-transform:translateZ(0); transform:translateZ(0);
}
.hero-cine .ss-slide .ss-cap{ padding-bottom:56px; text-align:right; }  /* right corner — clear of the overlaid copy and in-stage dots */
@media(prefers-reduced-motion:no-preference){
  .oa-js .hero-cine .ss-slide.active img{ animation:oa-kb-drift 7s ease-out forwards; }
}
/* keyframes carry translate3d so the active slide keeps its composited layer through the zoom.
   (Named oa-kb-drift — this used to shadow the hero-figure's oa-kenburns definition above.) */
@keyframes oa-kb-drift{ from{ -webkit-transform:translate3d(0,0,0) scale(1); transform:translate3d(0,0,0) scale(1); } to{ -webkit-transform:translate3d(0,0,0) scale(1.06); transform:translate3d(0,0,0) scale(1.06); } }
/* legibility scrim: left-weighted + bottom anchor */
.hero-cine .ss-stage::after{ content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:linear-gradient(90deg, rgba(22,36,63,.94) 0%, rgba(22,36,63,.78) 44%, rgba(22,36,63,.44) 72%, rgba(22,36,63,.12) 100%),
             linear-gradient(0deg, rgba(22,36,63,.88) 0%, rgba(22,36,63,0) 40%); }
/* overlaid copy — inside .ss-stage so swipe/hover handlers keep working */
.hero-cine .hc-copy{ position:absolute; inset:0; z-index:2; display:flex; align-items:center;
  padding-bottom:var(--ss-strip); }   /* never let the CTAs reach the dots/pause strip */
.hero-cine .hc-copy .wrap{ width:100%; }
.hero-cine .hc-inner{ max-width:600px; padding-bottom:24px; }
.hero-cine .kicker{ color:var(--gold); }
.hero-cine h1{ color:var(--white); font-size:clamp(36px,4.8vw,60px); line-height:1.05; letter-spacing:-0.02em; margin:18px 0 0; text-wrap:balance; text-shadow:0 2px 18px rgba(8,12,22,.55), 0 1px 3px rgba(8,12,22,.45); }
.hero-cine h1 em{ font-style:italic; font-weight:600; color:var(--gold-light); }
.hero-cine .hc-lede{ color:var(--on-navy); font-size:clamp(16px,1.5vw,19px); line-height:1.6; margin-top:18px; max-width:46ch; text-shadow:0 1px 12px rgba(22,36,63,.4); }
/* legibility over photo — eyebrow + secondary links share the headline's soft shadow (same root cause as the h1) */
.hero-cine .kicker, .page-hero.has-slideshow .kicker, .hero-links a, .hero-cta-secondary a{ text-shadow:0 1px 11px rgba(8,12,22,.5); }
.hero-cine .hero-ctas{ display:flex; gap:14px; flex-wrap:wrap; margin-top:30px; }
/* dots: inside the stage, bottom-center */
.hero-cine .ss-dots{ position:absolute; left:0; right:0; bottom:20px; z-index:2; margin:0; }
.hero-cine .ss-dot{ background:rgba(255,255,255,.45); }
.hero-cine .ss-dot.active{ background:var(--gold); }
.hero-cine .ss-toggle{ background:rgba(251,248,241,.12); color:var(--white); border-color:rgba(255,255,255,.38); }
.hero-cine .ss-toggle:hover{ background:rgba(251,248,241,.28); border-color:rgba(255,255,255,.58); }
/* arrows: desktop only, paired bottom-right */
.hero-cine .ss-arrow{ display:none; }
@media(min-width:1161px){
  .hero-cine .ss-arrow{ display:grid; top:auto; bottom:18px; transform:none; width:44px; height:44px;
    background:rgba(251,248,241,.14); color:var(--white); border:1px solid rgba(255,255,255,.35); box-shadow:none; }
  .hero-cine .ss-arrow:hover{ background:rgba(251,248,241,.3); transform:none; }
  .hero-cine .ss-arrow.prev{ left:auto; right:76px; }
  .hero-cine .ss-arrow.next{ right:20px; }
  .hero-cine .ss-slide .ss-cap{ padding-bottom:76px; }  /* keep the caption above the corner arrows */
}
@media(max-width:640px){
  /* ---- The phone hero is a BAND, not a portrait window -------------------------------
     A 16:9 photograph inside a 390x580 portrait box keeps 38% of the frame. On the group
     photographs this hero actually runs, that removes most of the group and cuts a face at
     each edge — no object-position can rescue it, because the subject IS the full width.
     So the photograph gets a band of its own at close to its native shape (8:5 keeps ~90%
     of the frame) and the copy sits underneath it on navy, with the scrim fading one into
     the other. Costs ~80px of hero height and returns most of every photograph. */
  .hero-cine{ --hero-band:62vw; }
  .hero-cine .ss-stage{ height:auto; min-height:0; background:var(--navy-deep); }
  .hero-cine .ss-slide{ inset:0 0 auto 0; height:var(--hero-band); overflow:hidden; }   /* same ken-burns bleed as .ph-slideshow — here the SLIDE is the band */
  .hero-cine .ss-slide img{ object-position:center 42%; }
  .hero-cine .ss-stage::after{ inset:0 0 auto 0; height:var(--hero-band);
    background:linear-gradient(0deg, var(--navy-deep) 0%, rgba(22,36,63,.86) 12%, rgba(22,36,63,.40) 38%, rgba(22,36,63,.10) 72%, rgba(22,36,63,.04) 100%); }
  .hero-cine .hc-copy{ position:static; display:block;
    padding-top:calc(var(--hero-band) + 20px); padding-bottom:0; }
  /* Putting the controls in flow under the CTAs was not enough: the hero's content happens to
     total exactly one viewport on a 390x844 phone, so the last element in it lands precisely
     behind the fixed CTA bar (789-844). Anchor them to the PHOTO BAND instead — a fixed
     distance from the top of the page, so no amount of copy reflow can push them under the bar. */
  .hero-cine .ss-dots{ position:absolute; top:calc(var(--hero-band) - 54px); bottom:auto;
    left:auto; right:12px; margin:0; justify-content:flex-end; gap:16px; z-index:3; }
  .hero-cine .ss-dot{ background:rgba(255,255,255,.55); }
  .hero-cine .ss-toggle{ background:rgba(8,13,28,.5); border-color:rgba(255,255,255,.5);
    -webkit-backdrop-filter:blur(4px); backdrop-filter:blur(4px); }
  .hero-cine .hc-inner{ padding-bottom:0; max-width:none; }
  /* text-wrap:balance equalises the line lengths, which on a phone means every line stops
     short of the measure and the headline reads as pushed left with dead space down the
     right. Balance earns its keep on a wide desktop heading, not in a 374px column —
     here the lines should simply fill. */
  .hero-cine h1{ font-size:30px; line-height:1.08; margin-top:12px; text-wrap:pretty; }
  .hero-cine .hc-lede{ font-size:15.5px; line-height:1.55; margin-top:12px; }
  /* Stacked actions were 197px and 141px wide — one column, one width, so the pair reads as
     a block instead of a ragged staircase. The grid alone does that; the 320px cap that came
     with it was redundant and left the buttons ending 54px short of the headline at 430px,
     which is the dead space down the right of the hero. The column is the shared edge, so
     the actions take it, exactly like the h1 and the lede above them. */
  .hero-cine .hero-ctas{ margin-top:20px; display:grid; grid-template-columns:1fr; gap:12px; }
  .hero-cine .hero-ctas .btn{ width:100%; justify-content:center; }
  .hero-cine .hero-links{ display:none; }   /* redundant with the sticky Admission/WhatsApp/Call bar */
  .hero-cine .ss-slide .ss-cap{ display:none; }  /* captions collide with copy on phones */
  /* In the band layout the copy sits on FLAT NAVY, not on the photograph. The shadows that
     keep it legible over an image have nothing to separate here, so all they do is smear a
     dark halo around every letter and make the type read as blurry. */
  .hero-cine h1, .hero-cine .hc-lede{ text-shadow:none; }
  /* "Our results" was a filled slab the same size as the gold primary, so the pair read as
     two primaries. Glass also has nothing to frost against flat navy. A gold hairline on
     nothing subordinates it while keeping the 48px tap target. */
  .hero-cine .hero-ctas .btn.glass{ --btn-bg:transparent; --btn-bd:rgba(201,168,76,.55);
    box-shadow:none; -webkit-backdrop-filter:none; backdrop-filter:none; }
}

/* =====================================================================
   PAGE-HERO PHOTO VARIANT — slim banner with photo + navy scrim
   ===================================================================== */
.page-hero.has-photo .ph-media{ position:absolute; inset:0; z-index:0; }
.page-hero.has-photo .ph-media picture{ display:contents; }
.page-hero.has-photo .ph-media img{ width:100%; height:100%; object-fit:cover; object-position:center 35%; }
.page-hero.has-photo .ph-media::after{ content:""; position:absolute; inset:0;
  background:linear-gradient(90deg, rgba(22,36,63,.94) 0%, rgba(22,36,63,.72) 45%, rgba(22,36,63,.38) 100%); }
.page-hero.has-photo .crest-watermark{ display:none; }  /* one ornament max */
.page-hero.has-photo .page-hero-inner{ min-height:clamp(220px,30vh,320px); display:flex; flex-direction:column; justify-content:center; }
@media(max-width:640px){
  .page-hero.has-photo .ph-media::after{ background:linear-gradient(0deg, rgba(22,36,63,.94) 0%, rgba(22,36,63,.66) 100%); }
}

/* =====================================================================
   PAGE-HERO SLIDESHOW VARIANT — moving photo carousel behind the copy
   Reuses the generic [data-slideshow] engine + .ss-slide crossfade +
   oa-kenburns; copy overlaid on top. Inner pages (not Home's .hero-cine).
   ===================================================================== */
.page-hero.has-slideshow{ position:relative; overflow:hidden; }
.page-hero.has-slideshow > .wrap{ position:relative; z-index:1; pointer-events:none; }  /* copy above photos, click-through so dots/swipe/hover reach the carousel */
.page-hero.has-slideshow .crest-watermark{ display:none; }                   /* photo is the ornament */
/* THE BAND OWNS THE CLIPPING CONTEXT — do not remove this overflow.
   oa-kenburns ends at scale(1.08) translate(-1.6%,-1.2%), so a 242px-tall slide renders a
   261px image. With overflow:visible here the scaled image escaped the band by ~5px at the
   bottom, while the scrim (::after, inset:0 on THIS element) stopped at the band edge — so a
   strip of full-brightness photograph printed directly beneath an opaque-navy scrim edge and
   read as a stray image band between the hero and the next section.
   The section's own overflow:hidden cannot catch it: on phones the band is a short strip
   inside a much taller hero, so the section clips 350px too low. Same fault, same cause, on
   every .page-hero.has-slideshow page. */
.page-hero.has-slideshow .ph-slideshow{ position:absolute; inset:0; z-index:0; overflow:hidden; }
.page-hero.has-slideshow .ss-slide img{ width:100%; height:100%; object-fit:cover; object-position:center 36%; }
.page-hero.has-slideshow .ph-slideshow::after{ content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:linear-gradient(90deg, rgba(22,36,63,.94) 0%, rgba(22,36,63,.80) 46%, rgba(22,36,63,.52) 78%, rgba(22,36,63,.22) 100%),
             linear-gradient(0deg, rgba(22,36,63,.86) 0%, rgba(22,36,63,0) 42%); }
.page-hero.has-slideshow .page-hero-inner{ min-height:clamp(480px,70vh,680px); display:flex; flex-direction:column; justify-content:center; pointer-events:none; }
/* Same strip, same collision, on the inner pages. Scoped with :has() because the dots and the
   pause control are only created for a carousel with two or more slides — most inner heroes hold
   a single still and must not pay for a strip they never render. Browsers without :has() simply
   keep the old behaviour rather than getting a wrong reserve. */
.page-hero.has-slideshow:has(.ss-dot) .page-hero-inner{ padding-bottom:var(--ss-strip); }
.page-hero.has-slideshow .ss-dots{ position:absolute; left:0; right:0; bottom:18px; z-index:2; margin:0; }
.page-hero.has-slideshow .ss-dot{ background:rgba(255,255,255,.45); }
.page-hero.has-slideshow .ss-dot.active{ background:var(--gold); }
@media(prefers-reduced-motion:no-preference){
  .oa-js .page-hero.has-slideshow .ss-slide.active img{ animation:oa-kenburns 7s ease-out forwards; }
}
/* showcase pages (About, Campus) — taller, still under Home's 78vh */
.page-hero.has-slideshow.is-tall .page-hero-inner{ min-height:clamp(480px,70vh,680px); }
@media(max-width:640px){
  .page-hero.has-slideshow{ --hero-band:62vw; }
  .page-hero.has-slideshow .ph-slideshow{ inset:0 0 auto 0; height:var(--hero-band); }
  /* On a phone the copy sits BELOW the band, so the scrim's only job is to blend the photo's
     bottom edge into the navy beneath it — not to make type legible over it. Was washing out
     the whole lower half of every hero photograph. */
  .page-hero.has-slideshow .ph-slideshow::after{
    background:linear-gradient(0deg, var(--navy) 0%, rgba(22,36,63,.66) 7%, rgba(22,36,63,.24) 22%, rgba(22,36,63,.07) 48%, rgba(22,36,63,0) 78%); }
  .page-hero.has-slideshow .page-hero-inner{ min-height:0;
    padding-top:calc(var(--hero-band) + 22px); padding-bottom:8px; }
  .page-hero.has-slideshow:has(.ss-dot) .page-hero-inner{ padding-bottom:var(--ss-strip); }
  .page-hero.has-slideshow .ss-slide img{ object-position:center 42%; }
}
/* OUR STORY (About) — REVERTED to its pre-13-Sep phone hero at the owner's request (14 Sep 2026).
   The photo-band layout above (short photo strip, copy on navy below) stays on every other inner
   page; About goes back to the copy set over the full-height photograph with the original
   bottom-up scrim. Desktop was never changed. */
@media(max-width:640px){
  .page-hero.has-slideshow.about-hero .ph-slideshow{ inset:0; height:auto; }
  .page-hero.has-slideshow.about-hero .ph-slideshow::after{
    background:linear-gradient(0deg, rgba(22,36,63,.95) 0%, rgba(22,36,63,.74) 52%, rgba(22,36,63,.42) 100%); }
  .page-hero.has-slideshow.about-hero .page-hero-inner{ padding:clamp(34px,4.5vw,56px) 0 clamp(30px,4vw,48px); }
  .page-hero.has-slideshow.about-hero .ss-slide img{ object-position:center 36%; }
}

/* =====================================================================
   DESIGN ELEVATION v63 — editorial light-section components
   ===================================================================== */

/* Journey band — Pre-KG→XII stages as nodes on one connected gold line */
.journey-band{ position:relative; display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(28px,4vw,48px); }
.jb-line{ position:absolute; left:8px; right:8px; top:27px; height:2px;
  background:linear-gradient(90deg,var(--gold-dark),var(--gold) 50%,var(--gold-dark)); opacity:.55; }
.jb-line::before,.jb-line::after{ content:""; position:absolute; top:50%; width:7px; height:7px;
  background:var(--gold); transform:translateY(-50%) rotate(45deg); }
.jb-line::before{ left:-3px; }
.jb-line::after{ right:-3px; }
.jb-node{ position:relative; display:flex; flex-direction:column; align-items:center; text-align:center; }
.jb-dot{ width:56px; height:56px; border-radius:var(--r-pill); background:var(--navy); color:var(--gold);
  display:grid; place-items:center; flex:none;
  box-shadow:inset 0 0 0 1.5px rgba(201,168,76,.55), 0 0 0 6px var(--offwhite); } /* gasket = section bg */
.jb-dot svg{ width:28px; height:28px; stroke:currentColor; fill:none; stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round; }
.jb-stage{ margin-top:18px; font-size:11.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--gold-dark); font-weight:700; }
.jb-node h3{ font-size:23px; line-height:1.16; margin:10px 0; color:var(--navy-deep); }
.jb-node p{ color:var(--text-soft); font-size:15.5px; line-height:1.62; max-width:34ch; }
@media(max-width:760px){
  .journey-band{ grid-template-columns:1fr; gap:34px; }
  .jb-line{ left:27px; right:auto; top:8px; bottom:8px; width:2px; height:auto;
    background:linear-gradient(180deg,var(--gold-dark),var(--gold) 50%,var(--gold-dark)); }
  .jb-line::before{ left:50%; top:-2px; transform:translate(-50%,0) rotate(45deg); }
  .jb-line::after{ right:auto; left:50%; top:auto; bottom:-2px; transform:translate(-50%,0) rotate(45deg); }
  .jb-node{ display:grid; grid-template-columns:56px 1fr; column-gap:18px; align-items:start; text-align:left; }
  .jb-dot{ grid-row:1 / span 3; }
  .jb-stage,.jb-node h3,.jb-node p{ grid-column:2; }
  .jb-stage{ margin-top:6px; }
  .jb-node p{ max-width:none; }
}

/* Ledger — prospectus-page columns: hairline dividers, gold numerals, no boxes */
.ledger{ --lg:clamp(32px,4.5vw,60px); display:grid; grid-template-columns:repeat(3,1fr); column-gap:var(--lg); }
.ledger-col{ position:relative; }
.ledger-col + .ledger-col::before{ content:""; position:absolute; top:8px; bottom:4px;
  left:calc(var(--lg) / -2 - .5px); width:1px; background:var(--rule-strong); }
.ledger-col + .ledger-col::after{ content:""; position:absolute; top:0;
  left:calc(var(--lg) / -2 - 3.5px); width:7px; height:7px; background:var(--gold); transform:rotate(45deg); }
.ledger-num{ display:block; font-family:var(--font-display); font-weight:600; line-height:1;
  font-size:clamp(40px,4.6vw,56px); color:var(--gold-dark); opacity:.85; transition:opacity .25s ease; }
.ledger-col:hover .ledger-num{ opacity:1; }
.ledger-col h3{ font-size:clamp(24px,2.4vw,28px); color:var(--navy-deep); margin:12px 0 12px; }
.ledger-col p{ color:var(--text-soft); font-size:15.5px; line-height:1.62; }
.ledger-leads{ display:block; margin-top:16px; padding-top:14px; border-top:1px solid var(--rule);
  font-size:11.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--gold-dark); font-weight:700; line-height:1.6; }
@media(max-width:820px){
  .ledger{ grid-template-columns:1fr; row-gap:34px; }
  .ledger-col + .ledger-col::before{ left:0; right:0; top:-17px; bottom:auto; width:auto; height:1px; }
  .ledger-col + .ledger-col::after{ left:50%; top:-17px; transform:translate(-50%,-50%) rotate(45deg); }
  .ledger-num{ font-size:38px; }
}
/* values variant (About) — gold rule above the word, no numerals/icons */
.ledger.values .gold-rule{ display:block; margin-bottom:18px; }
.ledger.values h3{ margin-top:0; font-size:clamp(23px,2.2vw,26px); }

/* Light-section ambience — faint navy crest watermark (opt-in).
   NOTE: must stay a CSS mask — oa-monogram-navy.svg carries a solid bg plate. */
.section-ornate{ position:relative; overflow:hidden; }
.section-ornate > .wrap{ position:relative; z-index:1; }
/* Sized and positioned to sit WHOLE inside the section. It previously bled 110px past the right
   edge and was clipped through the middle of the mark, which reads as a rendering fault rather
   than an ornament — and at 420px it was competing with the content it sits behind. */
.section-ornate::after{ content:""; position:absolute; z-index:0; pointer-events:none;
  right:clamp(-20px,-1.4vw,0px); top:50%; transform:translateY(-50%);
  width:min(300px,24%); aspect-ratio:547/401;
  background:var(--navy);
  -webkit-mask:url("oa-monogram-gold.svg") no-repeat center/contain;
          mask:url("oa-monogram-gold.svg") no-repeat center/contain;
  opacity:.04; }
@media(max-width:760px){ .section-ornate::after{ width:48%; right:-4%; opacity:.035; } }

/* Journey cards — scroll-in choreography (JS adds .tf-live one by one) */
.oa-js [data-journey]{ opacity:0; transform:translateY(18px) scale(.955); }
.oa-js [data-journey].tf-live{ opacity:1; transform:none;
  transition:opacity .6s ease, transform .65s cubic-bezier(.22,.8,.3,1); }
.oa-js [data-journey].tf-live:hover{ transform:translateY(-4px); }  /* keep the lift after entry */
/* in-card chart rises with the card (states mirror the modal's tj-anim/tj-in) */
.tf-spark .tf-anim .tfl{ transition:stroke-dashoffset .6s ease .1s; }
.tf-spark .tf-anim .tfa{ opacity:0; }
.tf-spark .tf-anim .tfd{ opacity:0; }
.tf-spark .tf-anim .tf-delta{ opacity:0; }
.tf-spark .tf-anim.tf-in .tfa{ opacity:1; transition:opacity .45s ease .35s; }
.tf-spark .tf-anim.tf-in .tfd{ opacity:1; transition:opacity .3s ease; }      /* per-dot inline delays */
.tf-spark .tf-anim.tf-in .tf-delta{ opacity:1; transition:opacity .4s ease .6s; }

/* =====================================================================
   FOUNDER CANDLES -- shared keyframes. The About founder-lamp scene that
   defined these was retired (oa-lamp.js is archived, used by no page) and
   its .founder-lamp rules were deleted 24 Sep. The keyframes stay because
   About's ember band and /our-founder's shrine still animate with them.
   ===================================================================== */
@keyframes farshim{ from{ filter:brightness(.92); } to{ filter:brightness(1.12); } }
@keyframes cflick{
  0%  { opacity:var(--o0,.55); transform:translateY(0)    scale(1); }
  100%{ opacity:var(--o1,.9);  transform:translateY(-2px) scale(1.08); } }
/* Mobile fireflies DRIFT (not just flicker): the glow floats slowly up-and-over,
   fading in at one point and out at another, so each loop it "reappears" a little
   elsewhere. opacity:0 at both ends hides the loop reset. Transforms/opacity only;
   per-flame --dx/--dy/--dd/--ddl are seeded inline by oa-shrine.js. */
@keyframes cfloat{
  0%   { opacity:0;                       transform:translate(0,0) scale(.9); }
  18%  { opacity:var(--o1,.8);            transform:translate(calc(var(--dx,8px) * .25), calc(var(--dy,-16px) * .18)) scale(1.04); }
  50%  { opacity:var(--o0,.45);           transform:translate(calc(var(--dx,8px) * .6),  calc(var(--dy,-16px) * .55)) scale(1); }
  78%  { opacity:calc(var(--o1,.8) * .7); transform:translate(var(--dx,8px), var(--dy,-16px)) scale(1.03); }
  100% { opacity:0;                       transform:translate(calc(var(--dx,8px) * 1.25), calc(var(--dy,-16px) * 1.2)) scale(.92); }
}

/* ---- Founder scenes on TOUCH (oa-shrine.js adds .scene-mobile to [data-ember-band] /
   [data-shrine-stage]): the lit candles become drifting fireflies with the cfloat
   keyframes above (per-flame --dx/--dy/--dd/--ddl are seeded inline by oa-shrine.js),
   over a slightly warmer horizon haze. Desktop keeps the still candle
   ocean + cursor parallax; reduced-motion never gets .scene-mobile at all. ---- */
.scene-mobile .cflame.lit::before{ animation:cfloat var(--dd,9s) ease-in-out var(--ddl,0s) infinite; }
.scene-mobile .band .horizon-haze{ background:radial-gradient(ellipse 52% 58% at 50% 52%, rgba(255,195,105,.17), transparent 78%); }
@media (prefers-reduced-motion: reduce){
  .scene-mobile .cflame.lit::before{ animation:none; opacity:var(--o1,.8); transform:none; }
}

/* =====================================================================
   ARCHIVE DOORWAY -- v65 (About) . photo band teasing the Legacy page
   ===================================================================== */
.doorway{ position:relative; overflow:hidden; background:var(--navy-deep); color:var(--on-navy); }
.doorway h2{ color:var(--white); }
.dw-media{ position:absolute; inset:0; }
.dw-media img{ width:100%; height:100%; object-fit:cover; object-position:center 30%;
  filter:sepia(.38) brightness(.5) contrast(1.02); }
.dw-media::after{ content:""; position:absolute; inset:0;
  background:linear-gradient(180deg, rgba(22,36,63,.80), rgba(22,36,63,.55) 45%, rgba(22,36,63,.84)),
             radial-gradient(ellipse 90% 80% at 50% 50%, transparent 30%, rgba(11,18,33,.5) 100%); }
.doorway .wrap{ position:relative; z-index:1; }
.dw-frame{ max-width:700px; margin:0 auto; text-align:center; position:relative;
  padding:clamp(30px,5.5vw,52px) clamp(22px,4.5vw,46px); }
.dw-frame .lede{ color:var(--on-navy-soft); max-width:560px; margin:18px auto 0; }
/* gold album-corner brackets (two pseudos on the frame, two on the inner span) */
.dw-corners{ position:absolute; inset:0; pointer-events:none; }
.dw-frame::before,.dw-frame::after,.dw-corners::before,.dw-corners::after{
  content:""; position:absolute; width:26px; height:26px; pointer-events:none;
  border:0 solid rgba(201,168,76,.75); }
.dw-frame::before{ top:0; left:0; border-top-width:2px; border-left-width:2px; }
.dw-frame::after{ top:0; right:0; border-top-width:2px; border-right-width:2px; }
.dw-corners::before{ bottom:0; left:0; border-bottom-width:2px; border-left-width:2px; }
.dw-corners::after{ bottom:0; right:0; border-bottom-width:2px; border-right-width:2px; }
@media (max-width:640px){ .dw-frame{ padding:26px 16px; } }

/* =====================================================================
   SITE-WIDE GOLD CLICK-RIPPLE — warm gold pulse from the tap point.
   Spawned by oa-system.js on pointerdown; pointer-events:none, self-removes.
   ===================================================================== */
.oa-ripple{
  position:fixed; z-index:9999; pointer-events:none;
  width:20px; height:20px; margin:-10px 0 0 -10px; border-radius:50%;
  background:radial-gradient(circle, rgba(201,168,76,.45) 0%, rgba(201,168,76,.30) 45%, rgba(201,168,76,0) 72%);
  transform:scale(0); opacity:.95; will-change:transform,opacity;
  animation:oa-ripple .42s cubic-bezier(.22,.61,.36,1) forwards;
}
@keyframes oa-ripple{ to{ transform:scale(6); opacity:0; } }   /* 20px → ~120px */
@media(prefers-reduced-motion:reduce){ .oa-ripple{ display:none; } }

/* =====================================================================
   ROSHNI — admissions chat assistant (oa-roshni.js)
   Floating panel above the FAB on desktop; full sheet on phones.
   ===================================================================== */
.oa-roshni{ position:fixed; inset:0; z-index:120; pointer-events:none; }
.oa-roshni[hidden]{ display:none; }
.orx-backdrop{ position:absolute; inset:0; background:rgba(11,18,33,.24); opacity:0; pointer-events:none; transition:opacity .22s ease; }
.oa-roshni.orx-show .orx-backdrop{ opacity:1; }

.orx-panel{
  position:absolute; right:20px; bottom:92px; width:380px; max-width:calc(100vw - 32px);
  height:min(620px, calc(100vh - 140px)); display:flex; flex-direction:column; overflow:hidden;
  pointer-events:auto;
  /* liquid glass — fully transparent surface; only a blur frosts the site behind it, with a soft
     beveled edge. The solid blue header is the one opaque anchor. */
  background:transparent;
  -webkit-backdrop-filter:blur(20px) saturate(170%); backdrop-filter:blur(20px) saturate(170%);
  border:1px solid rgba(255,255,255,.35); border-radius:20px;
  box-shadow:
    0 26px 64px -18px rgba(7,12,26,.5),
    inset 1px 1px 1px -.5px rgba(255,255,255,.5),
    inset -1px -1px 1px -.5px rgba(255,255,255,.22),
    inset 0 0 0 1px rgba(201,168,76,.10);
  transform:translateY(16px) scale(.98); opacity:0; transform-origin:bottom right;
  transition:transform .24s cubic-bezier(.22,.61,.36,1), opacity .24s ease;
}
.oa-roshni.orx-show .orx-panel{ transform:translateY(0) scale(1); opacity:1; }

/* Resizable presets — clamped to the viewport so they can never overflow / look broken. */
.orx-panel.orx-s-sm{ width:332px; height:min(468px, calc(100vh - 150px)); }
.orx-panel.orx-s-md{ width:382px; height:min(600px, calc(100vh - 140px)); }
.orx-panel.orx-s-lg{ width:446px; height:min(760px, calc(100vh - 116px)); }

.orx-head{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:13px 14px;
  background:linear-gradient(135deg, rgba(22,34,60,.62), rgba(13,21,38,.5));
  -webkit-backdrop-filter:blur(14px) saturate(160%); backdrop-filter:blur(14px) saturate(160%);
  border-bottom:1px solid rgba(201,168,76,.34); }
.orx-id{ display:flex; align-items:center; gap:11px; min-width:0; }
.orx-avatar{ width:40px; height:40px; border-radius:50%; object-fit:cover; background:transparent;
  border:0; padding:0; flex:none; }   /* mascot badge already has its own gold ring */
.orx-meta{ display:flex; flex-direction:column; line-height:1.18; min-width:0; }
.orx-title{ font-family:var(--font-display); font-weight:600; font-size:17px; color:var(--white); }
.orx-sub{ font-family:var(--font-ui); font-size:11.5px; letter-spacing:.04em; color:var(--on-navy-soft); }
.orx-x{ flex:none; width:44px; height:44px; border:0; background:transparent; color:var(--on-navy-soft);
  font-size:24px; line-height:1; border-radius:8px; cursor:pointer; transition:background .15s, color .15s; }
.orx-x:hover{ background:rgba(255,255,255,.10); color:var(--white); }
.orx-tools{ display:flex; align-items:center; gap:4px; flex:none; }
.orx-size{ width:44px; height:44px; border:0; background:transparent; color:var(--on-navy-soft);
  font-size:19px; line-height:1; border-radius:8px; cursor:pointer; transition:background .15s, color .15s, opacity .15s; }
.orx-size:hover{ background:rgba(255,255,255,.10); color:var(--white); }
.orx-size:disabled{ opacity:.28; cursor:default; }
.orx-size:focus-visible,.orx-x:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }

.orx-log{ flex:1 1 auto; overflow-y:auto; padding:16px; display:flex; flex-direction:column; gap:10px;
  background:transparent; }
.orx-msg{ display:flex; }
.orx-user{ justify-content:flex-end; }
.orx-bubble{ max-width:85%; font-family:var(--font-ui); font-size:14.5px; line-height:1.5; padding:10px 13px; border-radius:14px; }
.orx-assistant .orx-bubble{ background:rgba(255,255,255,.56); -webkit-backdrop-filter:blur(9px) saturate(150%); backdrop-filter:blur(9px) saturate(150%);
  color:var(--ink); border:1px solid rgba(255,255,255,.5); border-bottom-left-radius:5px; box-shadow:0 4px 16px -9px rgba(7,12,26,.4); }
.orx-user .orx-bubble{ background:rgba(22,36,63,.52); -webkit-backdrop-filter:blur(9px) saturate(150%); backdrop-filter:blur(9px) saturate(150%);
  color:var(--on-navy); border:1px solid rgba(255,255,255,.16); border-bottom-right-radius:5px; }
.orx-bubble strong{ font-weight:700; }

.orx-dots{ display:inline-flex; gap:4px; }
.orx-dots i{ width:7px; height:7px; border-radius:50%; background:var(--gold-dark); opacity:.5; animation:orx-bounce 1.1s ease-in-out infinite; }
.orx-dots i:nth-child(2){ animation-delay:.15s; }
.orx-dots i:nth-child(3){ animation-delay:.30s; }
@keyframes orx-bounce{ 0%,60%,100%{ transform:translateY(0); opacity:.45; } 30%{ transform:translateY(-4px); opacity:1; } }

/* One compact swipeable row (never wraps to multiple lines), so the chips never crowd out the
   conversation — especially in the smallest panel size. Fades at the right to hint at more. */
.orx-chips{ display:flex; flex-wrap:nowrap; gap:7px; padding:10px 14px 0; overflow-x:auto;
  scrollbar-width:none; -webkit-overflow-scrolling:touch;
  -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent);
          mask-image:linear-gradient(90deg,#000 calc(100% - 22px),transparent); }
.orx-chips::-webkit-scrollbar{ display:none; }
.orx-chip{ flex:none; white-space:nowrap; font-family:var(--font-ui); font-size:12.5px; font-weight:500; color:var(--navy);
  background:rgba(255,255,255,.5); -webkit-backdrop-filter:blur(7px); backdrop-filter:blur(7px);
  border:1px solid rgba(201,168,76,.55); border-radius:var(--r-pill); padding:7px 12px; cursor:pointer;
  transition:background .15s, color .15s, border-color .15s; }
.orx-chip:hover{ background:var(--navy); color:var(--white); border-color:var(--navy); }

.orx-compose{ display:flex; gap:8px; align-items:center; padding:12px 14px 8px; }
.orx-input{ flex:1; font-family:var(--font-ui); font-size:16px; color:var(--ink); padding:9px 14px;   /* 16px min — iOS focus-zoom */
  border:1px solid rgba(255,255,255,.55); border-radius:var(--r-pill);
  background:rgba(255,255,255,.6); -webkit-backdrop-filter:blur(7px); backdrop-filter:blur(7px); outline:none;
  transition:border-color .15s, box-shadow .15s; }
.orx-input:focus{ border-color:var(--gold); box-shadow:0 0 0 3px rgba(201,168,76,.18); }
.orx-send{ flex:none; width:42px; height:42px; border:0; border-radius:50%; cursor:pointer; background:var(--gold-grad);
  color:var(--navy-deep); display:grid; place-items:center; transition:filter .15s, opacity .15s; }
.orx-send:hover{ filter:brightness(1.05); }
.orx-send:disabled{ opacity:.5; cursor:default; }
.orx-privacy{ font-family:var(--font-ui); font-size:10.5px; color:#8A867D; text-align:center; padding:0 14px 12px; margin:0; line-height:1.4; }

.orx-lead{ position:relative; width:100%; display:flex; flex-direction:column; gap:8px; background:var(--white);
  border:1px solid rgba(201,168,76,.5); border-radius:14px; padding:14px; }
.orx-lead-h{ font-family:var(--font-display); font-weight:600; font-size:16px; color:var(--navy-deep); margin:0; }
.orx-lead-sub{ font-family:var(--font-ui); font-size:12.5px; color:#5A6373; margin:0 0 2px; line-height:1.45; }
.orx-field{ font-family:var(--font-ui); font-size:16px; color:var(--ink); padding:8px 11px; width:100%;   /* 16px min — iOS focus-zoom */
  border:1px solid rgba(22,36,63,.18); border-radius:8px; background:var(--paper); outline:none; }
.orx-field:focus{ border-color:var(--gold); box-shadow:0 0 0 3px rgba(201,168,76,.16); }
textarea.orx-field{ resize:vertical; min-height:42px; }
.orx-hp{ position:absolute; left:-9999px; width:1px; height:1px; opacity:0; }
.orx-lead-btn{ font-family:var(--font-ui); font-weight:700; font-size:14px; color:var(--navy-deep); background:var(--gold-grad);
  border:0; border-radius:var(--r-pill); padding:11px; cursor:pointer; margin-top:2px; transition:filter .15s; }
.orx-lead-btn:hover{ filter:brightness(1.05); }
.orx-lead-btn:disabled{ opacity:.6; cursor:default; }
.orx-lead-note{ font-family:var(--font-ui); font-size:10.5px; color:#8A867D; text-align:center; margin:0; }
.orx-lead-error{ font-family:var(--font-ui); font-size:12px; line-height:1.45; color:#743125; background:#FFF4EE;
  border:1px solid #D99A7D; border-radius:8px; padding:8px 10px; margin:0; }

/* In-chat "go here" button — Roshni's navigation offer (distinct from the suggestion chips). */
.orx-nav-row{ margin-top:-2px; }
.orx-nav{ display:inline-flex; align-items:center; gap:8px; font-family:var(--font-ui); font-weight:700;
  font-size:13.5px; color:var(--navy-deep); background:var(--gold-grad); border:0; border-radius:var(--r-pill);
  padding:10px 16px; cursor:pointer; box-shadow:var(--shadow-sm); transition:filter .15s, transform .15s; }
.orx-nav:hover{ filter:brightness(1.05); transform:translateY(-1px); }
.orx-nav span{ transition:transform .15s; }
.orx-nav:hover span{ transform:translateX(3px); }
.orx-nav:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }

/* Proactive "Need help?" nudge — a small bubble by the launcher. */
.orx-nudge{ position:fixed; right:20px; bottom:84px; z-index:115; max-width:236px; cursor:pointer;
  display:flex; align-items:flex-start; gap:6px; padding:12px 12px 12px 15px;
  background:var(--paper); border:1px solid rgba(201,168,76,.5); border-radius:14px 14px 4px 14px;
  box-shadow:var(--shadow-lg); opacity:0; transform:translateY(8px) scale(.96); transform-origin:bottom right;
  transition:opacity .26s ease, transform .26s cubic-bezier(.22,.61,.36,1); }
.orx-nudge.orx-nudge-in{ opacity:1; transform:translateY(0) scale(1); }
.orx-nudge-txt{ font-family:var(--font-ui); font-size:13px; line-height:1.42; color:var(--ink); }
.orx-nudge-x{ flex:none; width:28px; height:28px; display:grid; place-items:center; padding:0; border:0; background:transparent; color:#6F6B62;
  font-size:18px; line-height:1; cursor:pointer; border-radius:8px; margin:-7px -7px -4px 0; }   /* 28x28 hit area (was 20); the negative margin keeps the bubble the same size */
.orx-nudge-x:hover{ color:var(--navy); background:rgba(11,18,32,.06); }
/* The nudge is now a plain wrapper with two sibling buttons (open + dismiss), not a
   role=button holding a button. If the open control is a <button class="orx-nudge-txt">
   it needs the browser's button chrome stripped so it reads as the bubble's text. */
.orx-nudge button.orx-nudge-txt{ appearance:none; -webkit-appearance:none; background:transparent; border:0; padding:0; margin:0;
  text-align:left; cursor:pointer; border-radius:4px; }
.orx-nudge-x:focus-visible, .orx-nudge button.orx-nudge-txt:focus-visible{ outline:3px solid var(--gold); outline-offset:2px; }

@media(max-width:560px){
  /* A compact floating glass card in the bottom-right — takes only a portion of the screen,
     the site stays visible and usable behind and beside it (non-modal). */
  .orx-backdrop{ background:transparent; pointer-events:none; }
  .orx-panel{ left:auto; right:10px; bottom:calc(78px + env(safe-area-inset-bottom)); top:auto;
    width:min(330px, 82vw); max-width:none; height:min(60svh, 500px); border-radius:20px;
    transform:translateY(16px) scale(.98); }
  .orx-panel.orx-s-sm{ width:min(290px, 78vw); height:min(46svh, 400px); }
  .orx-panel.orx-s-md{ width:min(330px, 84vw); height:min(60svh, 500px); }
  .orx-panel.orx-s-lg{ width:min(374px, 93vw); height:min(76svh, 642px); }
  .oa-roshni.orx-show .orx-panel{ transform:translateY(0) scale(1); }
}
@media(max-width:760px){ .orx-nudge{ bottom:calc(142px + env(safe-area-inset-bottom)); right:16px; } }
@media(prefers-reduced-motion:reduce){ .orx-nudge{ transition:none; } }
@media(prefers-reduced-motion:reduce){
  .orx-panel, .orx-backdrop{ transition:none; }
  .orx-dots i{ animation:none; opacity:.6; }
}

/* ===== Typographic craft (heritage polish) ===== */
h1,h2,h3,h4{ font-feature-settings:"liga" 1; text-wrap:balance; }
.note-quote{ text-wrap:balance; }
.prose p,.prose-serif p{ font-variant-numeric:oldstyle-nums; }
p,li{ text-wrap:pretty; }

.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ===== Wall of Fame — field filter ===== */
.wall-filter{display:flex;flex-wrap:wrap;gap:9px;justify-content:center;margin:32px 0 4px}
.wf-chip{font-family:var(--font-ui);font-size:13px;font-weight:600;color:var(--navy);background:var(--white);border:1px solid var(--rule-strong);border-radius:var(--r-pill);min-height:44px;padding:0 16px;display:inline-flex;align-items:center;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease,box-shadow .18s ease,transform .18s ease}
.wf-chip:hover{border-color:var(--gold-dark);background:var(--offwhite);transform:translateY(-1px)}
.wf-chip.is-active{background:var(--navy-deep);color:var(--gold);border-color:var(--navy-deep);box-shadow:0 6px 16px -8px rgba(22,36,63,.6)}
.wf-chip.is-active:hover{background:var(--navy-deep);transform:translateY(-1px)}
.wf-chip:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:2px}
@media(prefers-reduced-motion:reduce){.wf-chip,.wf-chip:hover{transition:none;transform:none}}
.legacy-card.is-hidden{display:none}

/* Campus gallery filter — reuses the .wf-chip pills */
.gallery-filter{display:flex;flex-wrap:wrap;gap:9px;justify-content:center;margin:0 0 clamp(22px,3vw,32px)}
.g-item.is-hidden{display:none}

/* On phones, the wrap-to-multiple-rows filter pills (Alumni wall + Campus gallery — up to 7 chips)
   become a single swipeable row with a right-edge fade, matching the .page-rail affordance instead
   of stacking into an awkward 2–3 row block. */
@media(max-width:560px){
  .wall-filter,.gallery-filter{flex-wrap:nowrap;overflow-x:auto;justify-content:flex-start;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:0 24px 2px 0;
    -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent);
    mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent)}
  .wall-filter::-webkit-scrollbar,.gallery-filter::-webkit-scrollbar{display:none}
  .wall-filter .wf-chip,.gallery-filter .wf-chip{flex:none;scroll-snap-align:start}
}

/* ===== Alumni lightbox ===== */
#wall .legacy-card{cursor:pointer}
#wall .legacy-card:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.oa-lb{position:fixed;inset:0;z-index:130;display:none}
.oa-lb.is-open{display:block}
.lb-backdrop{position:absolute;inset:0;background:rgba(11,18,38,.62);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);opacity:0;transition:opacity .25s ease}
.oa-lb.is-show .lb-backdrop{opacity:1}
.lb-card{position:absolute;left:50%;top:50%;transform:translate(-50%,-46%);width:min(440px,calc(100vw - 36px));
  background:linear-gradient(180deg,var(--navy) 0%,var(--navy-deep) 100%);color:var(--on-navy);border:1px solid rgba(201,168,76,.4);
  border-radius:16px;box-shadow:var(--shadow-lg);padding:32px 28px 26px;text-align:center;opacity:0;
  transition:opacity .25s ease,transform .28s cubic-bezier(.22,.61,.36,1)}
.oa-lb.is-show .lb-card{opacity:1;transform:translate(-50%,-50%)}
.lb-x{position:absolute;top:12px;right:14px;width:34px;height:34px;border:0;background:transparent;color:var(--on-navy-soft);font-size:26px;line-height:1;border-radius:8px;cursor:pointer;transition:background .15s,color .15s}
.lb-x:hover{background:rgba(255,255,255,.1);color:var(--white)}
.lb-avatar{width:86px;height:86px;border-radius:50%;margin:0 auto 16px;display:grid;place-items:center;overflow:hidden;background:var(--navy-deep);border:1.5px solid rgba(201,168,76,.55)}
.lb-avatar .lg-mono{font-family:var(--font-display);font-weight:600;font-size:31px;color:var(--gold);line-height:1}
.lb-avatar img{width:100%;height:100%;object-fit:cover}
.lb-name{font-family:var(--font-display);font-weight:600;font-size:22px;color:var(--white);line-height:1.2;margin:0}
.lb-role{font-size:14.5px;margin:8px 0 0;color:var(--on-navy-soft);line-height:1.45}
.lb-role .role{color:var(--gold);font-weight:600}
.lb-meta{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--gold-glow,#D8BE73);font-weight:600;margin:10px 0 0}
.lb-bio{font-family:var(--font-prose);font-size:15px;line-height:1.6;color:var(--on-navy);margin:16px 0 0;padding-top:16px;border-top:1px solid rgba(255,255,255,.12)}
@media(prefers-reduced-motion:reduce){.lb-backdrop,.lb-card{transition:none}}

/* ===== Gallery lightbox (click-to-enlarge) ===== */
.gallery .g-item:has(img){cursor:zoom-in}
.gallery .g-item:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.oa-glb{position:fixed;inset:0;z-index:140;display:none}
.oa-glb.is-open{display:block}
.glb-backdrop{position:absolute;inset:0;background:rgba(7,11,22,.92);opacity:0;transition:opacity .25s ease}
.oa-glb.is-show .glb-backdrop{opacity:1}
.glb-stage{position:absolute;inset:0;margin:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;padding:46px 16px;pointer-events:none}
.glb-img{max-width:min(92vw,1200px);max-height:80vh;object-fit:contain;border-radius:6px;box-shadow:0 24px 64px rgba(0,0,0,.55);opacity:0;transform:scale(.97);transition:opacity .25s ease,transform .25s ease}
.oa-glb.is-show .glb-img{opacity:1;transform:scale(1)}
.glb-cap{font-family:var(--font-ui);font-size:14px;color:rgba(243,239,230,.92);text-align:center;max-width:62ch;background:rgba(0,0,0,.35);padding:7px 15px;border-radius:var(--r-pill);margin:0}
.glb-x{position:absolute;top:16px;right:18px;z-index:2;width:42px;height:42px;border:0;border-radius:50%;background:rgba(255,255,255,.12);color:#fff;font-size:25px;line-height:1;cursor:pointer;transition:background .15s}
.glb-x:hover{background:rgba(255,255,255,.22)}
.glb-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:2;width:48px;height:48px;border:0;border-radius:50%;background:rgba(255,255,255,.12);color:#fff;font-size:28px;line-height:1;cursor:pointer;display:grid;place-items:center;transition:background .15s}
.glb-nav:hover{background:rgba(255,255,255,.22)}
.glb-prev{left:14px}
.glb-next{right:14px}
.glb-ctr{position:absolute;bottom:18px;left:0;right:0;text-align:center;z-index:2;font-family:var(--font-ui);font-size:12px;letter-spacing:.12em;color:rgba(243,239,230,.7)}
@media(prefers-reduced-motion:reduce){.glb-backdrop,.glb-img{transition:none}}

/* ===== Accessibility — skip link + focus rings ===== */
.oa-skip{position:fixed;top:-60px;left:12px;z-index:200;background:var(--navy-deep);color:var(--gold);padding:10px 16px;border-radius:8px;font-family:var(--font-ui);font-weight:600;font-size:14px;text-decoration:none;box-shadow:var(--shadow-md);transition:top .2s ease}
.oa-skip:focus{top:12px;outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:2px}
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex="0"]:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:2px;border-radius:3px}

/* footer legal links */
.footer-legal{display:flex;gap:10px;align-items:center;justify-content:center}
.footer-legal a{color:inherit;text-decoration:none;opacity:.85;border-bottom:1px solid transparent;transition:opacity .15s,border-color .15s}
.footer-legal a:hover{opacity:1;border-bottom-color:currentColor}

/* ===== Stream Finder quiz (.sfq-) — Academics page ===== */
.sfq-shell{max-width:760px;margin:38px auto 0;background:var(--white);border:1px solid var(--rule);border-radius:var(--r-lg);box-shadow:var(--shadow-md);padding:clamp(24px,4vw,44px);position:relative;overflow:hidden}
.sfq-shell::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:var(--gold-grad)}
/* static fallback (no-JS / fetch fail) */
.sfq-fallback{text-align:center;color:var(--text-soft);font-family:var(--font-prose);font-size:17px;line-height:1.6}
.sfq-fallback p{margin:0 0 14px}
.sfq-fallback-cta{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:18px}
/* intro */
.sfq-intro{text-align:center}
.sfq-eyebrow,.sfq-result-eyebrow{display:inline-block;font-family:var(--font-ui);font-weight:600;font-size:12.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--gold-dark);margin-bottom:14px}
.sfq-intro-lede{font-family:var(--font-prose);font-size:18px;line-height:1.6;color:var(--text-soft);max-width:54ch;margin:0 auto 24px}
.sfq-start{font-size:16px}
.sfq-meta{font-family:var(--font-ui);font-size:13px;color:var(--text-muted);margin:16px 0 0}
/* progress + count */
.sfq-progress{height:5px;border-radius:var(--r-pill);background:var(--rule);overflow:hidden;margin-bottom:18px}
.sfq-progress-fill{display:block;height:100%;border-radius:var(--r-pill);background:var(--gold-grad);transition:width .35s cubic-bezier(.4,0,.2,1)}
.sfq-count{font-family:var(--font-ui);font-size:12.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted);margin:0 0 10px}
/* question */
.sfq-q-text{font-family:var(--font-display);font-weight:600;font-size:clamp(22px,3vw,28px);line-height:1.25;color:var(--navy);margin:0 0 22px;text-wrap:balance;outline:none}
.sfq-options{display:grid;gap:12px}
.sfq-opt{display:flex;align-items:center;gap:14px;width:100%;text-align:left;background:var(--white);border:1.5px solid var(--rule-strong);border-radius:var(--r-md);padding:15px 18px;cursor:pointer;font-family:var(--font-ui);font-size:16px;color:var(--text);transition:border-color .15s,background .15s,box-shadow .15s,transform .15s}
.sfq-opt:hover{border-color:var(--navy);box-shadow:var(--shadow-sm)}
.sfq-opt:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.sfq-opt-mark{flex:none;width:22px;height:22px;border-radius:50%;border:2px solid var(--rule-strong);position:relative;transition:border-color .15s,background .15s}
.sfq-opt:hover .sfq-opt-mark{border-color:var(--navy)}
.sfq-opt[aria-checked="true"]{border-color:var(--navy);background:var(--navy);color:var(--white)}
.sfq-opt[aria-checked="true"] .sfq-opt-mark{border-color:var(--gold);background:var(--gold-grad)}
.sfq-opt[aria-checked="true"] .sfq-opt-mark::after{content:"";position:absolute;inset:0;margin:auto;width:7px;height:7px;border-radius:50%;background:var(--navy-deep)}
.sfq-opt-label{flex:1}
.sfq-back{margin-top:20px;background:none;border:0;padding:6px 2px;font-family:var(--font-ui);font-size:14px;color:var(--text-soft);cursor:pointer;border-bottom:1px solid transparent;transition:color .15s,border-color .15s}
.sfq-back:hover{color:var(--navy);border-bottom-color:currentColor}
.sfq-back:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
/* result */
.sfq-result{background:var(--navy);color:var(--on-navy);margin:calc(-1*clamp(24px,4vw,44px));margin-top:0;padding:clamp(28px,4vw,46px);border-radius:0 0 var(--r-lg) var(--r-lg)}
.sfq-result-eyebrow{color:var(--gold-light)}
.sfq-result-head{font-family:var(--font-display);font-weight:600;font-size:clamp(24px,3.4vw,32px);line-height:1.2;color:var(--white);margin:0 0 18px;text-wrap:balance;outline:none}
.sfq-fit{display:flex;align-items:center;gap:14px;margin:0 0 22px}
.sfq-fit-bar{flex:1;height:8px;border-radius:var(--r-pill);background:rgba(255,255,255,.14);overflow:hidden}
.sfq-fit-bar span{display:block;height:100%;border-radius:var(--r-pill);background:var(--gold-grad);transition:width .6s cubic-bezier(.4,0,.2,1)}
.sfq-fit-pct{flex:none;font-family:var(--font-ui);font-weight:600;font-size:13.5px;color:var(--gold-light)}
.sfq-why{font-family:var(--font-prose);font-size:17px;line-height:1.65;color:var(--on-navy);margin:0 0 22px}
.sfq-subjects-h{display:block;font-family:var(--font-ui);font-weight:600;font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--on-navy-soft);margin-bottom:2px}
.sfq-result .subject-list li{color:var(--on-navy-soft);border-bottom-color:var(--rule-navy)}
.sfq-result .subject-list .opt{color:var(--on-navy-soft);opacity:.8}
.sfq-note{ margin:14px 0 0; font-family:var(--font-prose); font-style:italic; font-size:13.5px;
  line-height:1.55; color:var(--on-navy-soft); max-width:56ch; }
.sfq-leads{font-family:var(--font-ui);font-weight:600;font-size:14.5px;color:var(--gold-light);margin:18px 0 0}
.sfq-alumni{font-family:var(--font-prose);font-style:italic;font-size:15.5px;line-height:1.6;color:var(--on-navy-soft);margin:14px 0 0;padding-top:16px;border-top:1px solid var(--rule-navy)}
.sfq-also{display:inline-block;font-family:var(--font-ui);font-size:13.5px;color:var(--navy-deep);background:var(--offwhite);border-radius:var(--r-pill);padding:7px 16px;margin:18px 0 0}
.sfq-ctas{display:flex;flex-wrap:wrap;gap:12px;margin:26px 0 0}
.sfq-restart{margin:18px 0 0;background:none;border:0;padding:6px 2px;font-family:var(--font-ui);font-size:14px;color:var(--on-navy-soft);cursor:pointer;border-bottom:1px solid transparent;transition:color .15s,border-color .15s}
.sfq-restart:hover{color:var(--white);border-bottom-color:currentColor}
.sfq-restart:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
/* entrance animation */
[data-anim]{animation:sfqIn .4s cubic-bezier(.2,.7,.3,1) both}
@keyframes sfqIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@media(max-width:560px){.sfq-ctas .btn{width:100%;justify-content:center}}
@media(prefers-reduced-motion:reduce){
  .sfq-progress-fill,.sfq-fit-bar span,.sfq-opt{transition:none}
  [data-anim]{animation:none}
}

/* ===== Testimonials wall (.otw-) — "From these benches", Alumni page ===== */
.otw-filter{margin-top:30px}
.otw-wall{column-count:3;column-gap:20px;margin-top:28px}
@media(max-width:980px){.otw-wall{column-count:2}}
@media(max-width:620px){.otw-wall{column-count:1}}
.otw-card{break-inside:avoid;display:inline-block;width:100%;margin:0 0 20px;background:var(--paper);border:1px solid var(--rule);border-radius:var(--r-lg);box-shadow:var(--shadow-sm);padding:24px 24px 20px;position:relative}
.otw-card.is-hidden{display:none}
.otw-card.is-featured{background:var(--white);box-shadow:var(--shadow-md)}
.otw-card.is-featured::before{content:"";position:absolute;left:0;top:18px;bottom:18px;width:3px;border-radius:3px;background:var(--gold-grad)}
.otw-mark{display:block;font-family:var(--font-display);font-weight:700;font-size:46px;line-height:.6;color:var(--gold);opacity:.55;margin-bottom:6px}
.otw-quote{font-family:var(--font-prose);font-size:16.5px;line-height:1.62;color:var(--text);margin:0 0 18px}
.otw-card.is-featured .otw-quote{font-size:17.5px;color:var(--navy-deep)}
.otw-foot{display:flex;align-items:center;gap:12px;padding-top:14px;border-top:1px solid var(--rule)}
.otw-avatar{flex:none;width:42px;height:42px;border-radius:50%;overflow:hidden;display:grid;place-items:center;background:var(--navy);box-shadow:inset 0 0 0 2px var(--gold-deep)}
.otw-photo{width:100%;height:100%;object-fit:cover}
.otw-mono{font-family:var(--font-display);font-weight:600;font-size:19px;color:var(--gold-light);line-height:1}
.otw-meta{display:flex;flex-direction:column;gap:3px;min-width:0}
.otw-name{font-family:var(--font-display);font-weight:600;font-size:16px;color:var(--navy-deep);line-height:1.1}
.otw-tags{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.otw-voice{font-family:var(--font-ui);font-size:11px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted)}
.otw-year{font-family:var(--font-ui);font-size:11px;font-weight:700;letter-spacing:.04em;color:var(--navy-deep);background:var(--gold-grad);border-radius:var(--r-pill);padding:2px 9px}
.otw-more{display:block;margin:8px auto 0;background:transparent;color:var(--gold-light);border:1px solid rgba(255,255,255,.32);border-radius:var(--r-pill);padding:11px 24px;font-family:var(--font-ui);font-weight:600;font-size:14px;cursor:pointer;transition:background .18s,color .18s,border-color .18s}
.otw-more:hover{background:var(--white);color:var(--navy-deep);border-color:var(--white)}
.otw-more:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
/* motion wall — columns drifting in alternating directions, pause on hover */
.otw-marquee{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;max-width:1120px;margin:30px auto 0;max-height:640px;overflow:hidden;-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 11%,#000 89%,transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 11%,#000 89%,transparent 100%)}
.otw-col{display:block;will-change:transform;animation:otwUp var(--dur,58s) linear infinite}
.otw-col.down{animation-name:otwDown}
.otw-marquee:hover .otw-col,.otw-marquee:focus-within .otw-col,.otw-marquee:active .otw-col{animation-play-state:paused}   /* :active so a touch visitor can hold a long quote still */
/* Pause quotes button (WCAG 2.2.2), created by oa-testimonials.js above the wall */
.otw-marquee.is-paused .otw-col{animation-play-state:paused}
.otw-controls{display:flex;justify-content:flex-end;max-width:1120px;margin:26px auto 0}
.otw-controls + .otw-marquee{margin-top:14px}
.otw-toggle{display:inline-flex;align-items:center;gap:8px;min-height:36px;padding:8px 16px;background:transparent;color:var(--gold-light);border:1px solid rgba(255,255,255,.32);border-radius:var(--r-pill);font-family:var(--font-ui);font-weight:600;font-size:13px;line-height:1;cursor:pointer;transition:background .18s,border-color .18s}
.otw-toggle:hover{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.6)}
.otw-toggle:focus-visible{outline:3px solid var(--gold);box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.otw-toggle svg{flex:none}
@media(max-width:560px){.otw-controls{justify-content:center}}
.otw-col-set .otw-card{display:block;width:100%;margin:0 0 18px}
@keyframes otwUp{from{transform:translateY(0)}to{transform:translateY(-50%)}}
@keyframes otwDown{from{transform:translateY(-50%)}to{transform:translateY(0)}}
.otw-marquee.is-static{max-height:none;overflow:visible;-webkit-mask-image:none;mask-image:none}
.otw-marquee.is-static .otw-col{animation:none}
.otw-marquee.is-static .otw-col-set[aria-hidden]{display:none}
@media(max-width:900px){.otw-marquee{grid-template-columns:repeat(2,1fr);max-height:580px}}
@media(max-width:560px){.otw-marquee{grid-template-columns:1fr;max-height:540px}}
@media(prefers-reduced-motion:reduce){
  .otw-col{animation:none}
  .otw-marquee{max-height:none;overflow:visible;-webkit-mask-image:none;mask-image:none}
  .otw-col-set[aria-hidden]{display:none}
  .otw-controls{display:none}   /* nothing moves, so nothing to pause */
}

/* --- alumni wall card variants (1960 Challenge submissions) ---------------
   .is-remembers  the form's "which teacher do you remember?" answer — shown
                  verbatim but labelled, never dressed up as a pull-quote
   .is-name       tier B: name + profession + batch, no quote
   .otw-det       long letters: first block visible, remainder behind <details>  */
.otw-role{font-family:var(--font-ui);font-size:11.5px;font-weight:600;letter-spacing:.02em;color:var(--text-muted);line-height:1.35}
.otw-quote p{margin:0 0 .7em}
.otw-quote p:last-child{margin-bottom:0}
.otw-label{display:block;font-family:var(--font-ui);font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--gold-deep);margin-bottom:10px}
.otw-card.is-remembers .otw-names{font-family:var(--font-prose);font-size:15.5px;line-height:1.6;color:var(--text-muted)}
.otw-card.is-name{padding-top:20px}
.otw-card.is-name .otw-foot{border-top:0;padding-top:0}
.otw-det{margin-top:.6em}
.otw-det>summary{cursor:pointer;font-family:var(--font-ui);font-size:12.5px;font-weight:600;letter-spacing:.03em;color:var(--gold-deep);list-style:none}
.otw-det>summary::-webkit-details-marker{display:none}
.otw-det>summary::after{content:" \203A";display:inline-block;transition:transform .18s}
.otw-det[open]>summary::after{transform:rotate(90deg)}
.otw-det>summary:hover{text-decoration:underline}
.otw-det>summary:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px;border-radius:3px}
.otw-rest{display:block;margin-top:.7em}

/* ===== Socials / Reels (.orl-) — "Our story, in motion", Home page ===== */
/* rail carries hover-zoom headroom (top/bottom padding) so the enlarged phone never clips
   against the scroll container; negative bottom margin hands the space back to the rhythm */
.orl-rail{display:flex;gap:26px;overflow-x:auto;scroll-snap-type:x mandatory;padding:28px 4px 30px;margin-top:12px;margin-bottom:-10px;-webkit-overflow-scrolling:touch;scrollbar-width:thin}
.orl-rail::-webkit-scrollbar{height:8px}
.orl-rail::-webkit-scrollbar-thumb{background:var(--rule-strong);border-radius:var(--r-pill)}
.orl-card{scroll-snap-align:center;flex:0 0 auto}
.orl-phone{width:268px;padding:11px;background:#0b0b0d;border-radius:44px;box-shadow:var(--shadow-lg);position:relative;transition:transform .3s cubic-bezier(.22,.7,.27,1),box-shadow .3s ease,opacity .3s ease}
@media (hover:hover) and (pointer:fine){
  .orl-phone:hover{transform:translateY(-8px) scale(1.05);z-index:6;
    box-shadow:0 0 0 1px rgba(201,168,76,.55),0 42px 74px -30px rgba(10,14,26,.7),0 16px 40px -18px rgba(201,168,76,.3)}
  .orl-rail:has(.orl-phone:hover) .orl-phone:not(:hover){opacity:.72}
}
@media (prefers-reduced-motion:reduce){
  .orl-phone:hover{transform:none}
  .orl-rail:has(.orl-phone:hover) .orl-phone:not(:hover){opacity:1}
}
.orl-phone::before{content:"";position:absolute;top:20px;left:50%;transform:translateX(-50%);width:80px;height:22px;background:#0b0b0d;border-radius:var(--r-pill);z-index:5}
.orl-screen{position:relative;width:100%;aspect-ratio:9/16;border-radius:32px;overflow:hidden;background:var(--navy-deep)}
.orl-video,.orl-poster-img,.orl-blank{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.orl-blank{background:radial-gradient(120% 90% at 50% 12%, var(--blue) 0%, var(--navy-deep) 70%)}
.orl-cap{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:34px 14px 14px;background:linear-gradient(transparent,rgba(0,0,0,.74));color:#fff;font-family:var(--font-ui);font-size:13px;line-height:1.45;text-align:left}
.orl-view{display:inline-block;margin-top:6px;color:var(--gold-light);font-weight:600;text-decoration:none}
.orl-view:hover{text-decoration:underline}
.orl-linktile{position:absolute;inset:0;display:block;text-decoration:none}
.orl-badge{position:absolute;top:30px;left:12px;z-index:4;color:#fff;opacity:.95;filter:drop-shadow(0 1px 3px rgba(0,0,0,.5))}
.orl-play{position:absolute;inset:0;margin:auto;width:64px;height:64px;z-index:4;display:grid;place-items:center;border:0;border-radius:50%;background:rgba(0,0,0,.42);color:#fff;cursor:pointer;backdrop-filter:blur(2px);transition:background .18s,opacity .18s}
.orl-play:hover{background:rgba(0,0,0,.6)}
.orl-play-static{pointer-events:none;width:58px;height:58px;background:rgba(0,0,0,.34)}
.orl-screen.is-playing .orl-play{opacity:0;pointer-events:none}
.orl-unmute{position:absolute;top:30px;right:12px;z-index:4;width:34px;height:34px;display:grid;place-items:center;border:0;border-radius:50%;background:rgba(0,0,0,.5);color:#fff;cursor:pointer;opacity:0;transition:opacity .18s,background .18s}
.orl-screen.is-playing .orl-unmute{opacity:1}
.orl-unmute:hover{background:rgba(0,0,0,.72)}
/* Reel loading: the cover image stays over the video until the first frame plays (no navy flash),
   with a gold wheel while it buffers. */
.orl-vposter{z-index:2;pointer-events:none;transition:opacity .35s ease}
.orl-screen.is-started .orl-vposter{opacity:0}
.orl-spin{position:absolute;inset:0;margin:auto;z-index:5;width:48px;height:48px;box-sizing:border-box;border-radius:50%;border:3px solid rgba(255,255,255,.3);border-top-color:#E7BD5A;background:rgba(0,0,0,.28);opacity:0;pointer-events:none;transition:opacity .2s ease;animation:orl-spin .8s linear infinite}
.orl-screen.is-loading .orl-spin{opacity:1}
.orl-screen.is-loading .orl-play{opacity:0;pointer-events:none}
@keyframes orl-spin{to{transform:rotate(360deg)}}
.orl-play:focus-visible,.orl-unmute:focus-visible,.orl-linktile:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.orl-follow{display:inline-flex;align-items:center;gap:9px;margin:14px auto 0;text-decoration:none}
.orl-follow-wrap{text-align:center;margin-top:22px}
/* Instagram-coloured follow button (distinct from the gold accent CTA). The yellow and
   orange stops are gone: white text sat at 1.9:1 on them. Every stop left clears 5:1. */
.btn.accent.orl-follow{
  border:0; border-radius:var(--r-pill); font-weight:700; color:#fff;
  background:linear-gradient(118deg,#c13584 0%,#962fbf 55%,#4f5bd5 100%);
  box-shadow:0 10px 28px rgba(193,53,132,.30);
  text-shadow:0 1px 2px rgba(74,12,52,.5);
}
.btn.accent.orl-follow:hover{
  background:linear-gradient(118deg,#c13584 0%,#962fbf 55%,#4f5bd5 100%);
  color:#fff; box-shadow:0 14px 34px rgba(150,47,191,.42);
}
.btn.accent.orl-follow:focus-visible{ outline:3px solid #962fbf; outline-offset:3px; }
.btn.accent.orl-follow .arrow{ color:inherit; }
/* clean follow card — the default state until real reels are added */
.orl-stage{margin-top:30px}
.orl-followcard{display:flex;align-items:center;gap:18px;max-width:560px;margin:0 auto;padding:20px 24px;background:var(--white);border:1px solid var(--rule);border-radius:var(--r-lg);box-shadow:var(--shadow-md);text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}
.orl-followcard:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg);border-color:var(--gold)}
.orl-followcard:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.orl-fc-glyph{flex:none;width:54px;height:54px;display:grid;place-items:center;border-radius:16px;color:#fff;background:linear-gradient(45deg,#F58529 0%,#DD2A7B 45%,#8134AF 75%,#515BD4 100%)}
.orl-fc-text{display:flex;flex-direction:column;gap:3px;min-width:0;text-align:left}
.orl-fc-text b{font-family:var(--font-display);font-weight:600;font-size:18px;color:var(--navy-deep);line-height:1.2}
.orl-fc-sub{font-family:var(--font-ui);font-size:14px;color:var(--text-soft);line-height:1.4}
.orl-followcard .arrow{margin-left:auto;color:var(--gold-dark);font-size:20px}
@media(max-width:520px){.orl-followcard{flex-wrap:wrap;gap:14px}.orl-followcard .arrow{margin-left:0}}
@media(max-width:760px){
  .orl-phone{width:78vw;max-width:320px;padding:0;background:none;box-shadow:none;border-radius:0}
  .orl-phone::before{display:none}
  .orl-screen{border-radius:20px;box-shadow:var(--shadow-md)}
  .orl-badge,.orl-unmute{top:12px}
}
@media(prefers-reduced-motion:reduce){
  .orl-play,.orl-unmute{transition:none}
}

/* ===== FAQ accordion (.faq) — Admissions ===== */
.faq{max-width:760px;margin:30px auto 0;display:flex;flex-direction:column;gap:12px}
.faq-item{background:var(--white);border:1px solid var(--rule);border-radius:var(--r-md);box-shadow:var(--shadow-sm);overflow:hidden}
.faq-item summary{list-style:none;cursor:pointer;padding:18px 22px;font-family:var(--font-display);font-weight:600;font-size:17px;color:var(--navy-deep);display:flex;align-items:center;justify-content:space-between;gap:16px;transition:color .15s}
.faq-item summary::-webkit-details-marker{display:none}
.faq-item summary::after{content:"+";font-family:var(--font-ui);font-weight:400;font-size:26px;line-height:1;color:var(--gold-dark);flex:none;transition:transform .2s}
.faq-item[open] summary::after{transform:rotate(45deg)}
.faq-item summary:hover{color:var(--gold-dark)}
.faq-item summary:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:-3px}
.faq-a{padding:0 22px 18px;font-family:var(--font-prose);font-size:16px;line-height:1.6;color:var(--text-soft)}
.faq-a p{margin:0}
.faq-a a{color:var(--navy-deep);font-weight:600}
@media(prefers-reduced-motion:reduce){.faq-item summary::after{transition:none}}

/* ===== Timeline chapter nav (.tl-chapters) — Legacy deep-links ===== */
.tl-chapters{padding:18px 0;border-top:1px solid var(--rule-navy);border-bottom:1px solid var(--rule-navy)}
.tl-chapters-inner{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;justify-content:center}
.tl-chapters-lbl{font-family:var(--font-ui);font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--on-navy-soft)}
.tl-chapters-links{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}
.tl-chapters-links a{font-family:var(--font-ui);font-size:13px;font-weight:600;color:var(--on-navy);background:rgba(255,255,255,.06);border:1px solid var(--rule-navy);border-radius:var(--r-pill);padding:7px 14px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}
.tl-chapters-links a:hover{background:var(--gold);color:var(--navy-deep);border-color:var(--gold)}
.tl-chapters-links a:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:2px}
.tl-act{scroll-margin-top:88px}
.tl-chapters-links a.is-active{background:var(--gold);color:var(--navy-deep);border-color:var(--gold)}
@media(max-width:760px){
  .tl-chapters-inner{flex-direction:column;gap:10px}
  /* Single scrollable row with trailing scroll-padding so the final chapter ("Today") is
     always fully reachable. No right-edge mask fade (it clipped the last chip and read as a
     broken dark blend) — matches the .page-rail clean-scroll affordance. */
  .tl-chapters-links{overflow-x:auto;flex-wrap:nowrap;max-width:100%;justify-content:flex-start;padding:0 18px 4px 16px;-webkit-overflow-scrolling:touch;scrollbar-width:none;scroll-padding:0 18px}
  .tl-chapters-links::-webkit-scrollbar{display:none}
  .tl-chapters-links a{flex:none;scroll-snap-align:start}
}

/* ===== Legacy chapter wayfinding — simple-timeline fallback + rail + mobile meter ===== */
/* "View simple timeline": pure HTML <details>, works with no JS / reduced motion. */
.tl-simple{max-width:760px;margin:14px auto 0;text-align:center}
.tl-simple>summary{display:inline-flex;align-items:center;gap:8px;cursor:pointer;list-style:none;font-family:var(--font-ui);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--on-navy-soft);background:rgba(255,255,255,.05);border:1px solid var(--rule-navy);border-radius:var(--r-pill);padding:7px 16px;transition:color .15s,border-color .15s,background .15s}
.tl-simple>summary::-webkit-details-marker{display:none}
.tl-simple>summary::after{content:"▸";color:var(--gold);transition:transform .2s}
.tl-simple[open]>summary::after{transform:rotate(90deg)}
.tl-simple>summary:hover{color:var(--gold-light);border-color:var(--gold)}
.tl-simple>summary:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:2px}
.tl-simple-list{list-style:none;margin:18px auto 4px;padding:0;display:grid;gap:8px;text-align:left;max-width:580px}
.tl-simple-list a{display:flex;gap:14px;align-items:baseline;text-decoration:none;padding:10px 15px;border:1px solid var(--rule-navy);border-radius:10px;background:rgba(255,255,255,.04);transition:background .15s,border-color .15s}
.tl-simple-list a:hover{background:rgba(230,200,104,.1);border-color:var(--gold)}
.tl-simple-list a:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:2px}
.tl-simple-list .ts-era{flex:none;width:84px;font-family:var(--font-ui);font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--gold-light);line-height:1.5}
.tl-simple-list .ts-ttl{font-family:var(--font-prose);font-size:14.5px;line-height:1.45;color:var(--on-navy)}

/* Desktop sticky dot-rail (≥1100px) — built by oa-timeline.js, shown only over the timeline. */
.tl-rail{position:fixed;right:max(14px,1.4vw);top:50%;transform:translateY(-50%);z-index:55;display:none;flex-direction:column;gap:14px;padding:14px 9px;opacity:0;transition:opacity .35s ease;pointer-events:none}
.tl-rail.is-on{opacity:1;pointer-events:auto}
.tl-rail a{position:relative;display:block;width:13px;height:13px;border-radius:50%;background:rgba(255,255,255,.22);border:1px solid rgba(255,255,255,.38);transition:background .2s,transform .2s,box-shadow .2s}
.tl-rail a::before{content:attr(data-era);position:absolute;right:24px;top:50%;transform:translateY(-50%);white-space:nowrap;font-family:var(--font-ui);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--on-navy);background:rgba(11,18,36,.92);border:1px solid var(--rule-navy);border-radius:var(--r-pill);padding:5px 11px;opacity:0;transition:opacity .2s;pointer-events:none}
.tl-rail a:hover{background:var(--gold-light);transform:scale(1.18)}
.tl-rail a:hover::before{opacity:1}
.tl-rail a:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.tl-rail a.is-active{background:var(--gold-grad);border-color:var(--gold);box-shadow:0 0 12px -1px rgba(230,200,104,.7);transform:scale(1.25)}
@media(min-width:1100px){.tl-rail{display:flex}}

/* Smaller screens: slim "Chapter N of 6" meter under the header. */
.tl-progress{position:fixed;left:0;right:0;top:var(--header-h,84px);z-index:55;display:none;align-items:center;gap:10px;padding:7px 16px;background:rgba(11,18,36,.94);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--rule-navy);transform:translateY(-120%);transition:transform .3s ease}
.tl-progress.is-on{transform:translateY(0)}
.tl-progress-label{flex:none;font-family:var(--font-ui);font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--on-navy);font-weight:600}
.tl-progress-label b{color:var(--gold-light)}
.tl-progress-track{flex:1;height:3px;border-radius:3px;background:rgba(255,255,255,.16);overflow:hidden}
.tl-progress-fill{display:block;height:100%;width:0;background:var(--gold-grad);border-radius:3px;transition:width .35s ease}
@media(max-width:1099px){.tl-progress{display:flex}}

@media(prefers-reduced-motion:reduce){
  .tl-rail,.tl-rail a,.tl-progress,.tl-progress-fill,.tl-simple>summary::after,.tl-simple-list a{transition:none}
}

/* ===== Mobile "On this page" wayfinding rail (.page-rail) + progressive disclosure (.m-collapse) ===== */
/* Mobile-only: a sticky chip strip under the header on dense interior pages (Academics/Results/Campus),
   and native <details> that collapse long reference lists on phones but stay fully open on desktop. */
.page-rail{ display:none; }
/* .m-collapse details ship with the `open` attribute, so content shows on desktop AND with no JS.
   A tiny script removes `open` only on phones; here we just hide the toggle on desktop. */
.m-collapse>summary{ display:none; }
@media(max-width:760px){
  /* Lighter, roomier chips; trailing scroll-padding so the first AND last chip (incl. Apply)
     are always fully reachable. No right-edge gradient fade — it was clipping the Apply chip
     and reading as a "broken" dark blend; clean scroll instead. */
  .page-rail{ display:flex; gap:0; align-items:center; overflow-x:auto; -webkit-overflow-scrolling:touch;
    position:sticky; top:calc(var(--header-h,84px) - 4px); z-index:50; margin:0; padding:0 18px 0 16px;
    background:var(--navy-deep); border-bottom:1px solid var(--rule-navy); scrollbar-width:none;
    scroll-snap-type:x proximity; scroll-padding-left:16px; scroll-padding-right:18px; }
  .page-rail::-webkit-scrollbar{ display:none; }
  /* A section index inside an editorial page, not five buttons. Filled-and-outlined pills were a
     third visual language on a page that already has the fixed CTA bar and the hero's own
     buttons; set as spaced small caps with hairline separators they read as wayfinding and stop
     competing with the hero. Tap target is kept at 44px via the vertical padding. */
  .page-rail a{ flex:none; scroll-snap-align:start; font-family:var(--font-ui); font-size:11.5px;
    font-weight:600; line-height:1; letter-spacing:.14em; text-transform:uppercase;
    color:rgba(255,255,255,.72); background:none; border:0; border-radius:0;
    padding:13px 0; text-decoration:none; white-space:nowrap;
    transition:color .15s ease; }
  /* A slash, not a full-height border: a border on a 44px-tall link draws a rule the whole
     height of the bar and the index reads as a segmented control again. */
  .page-rail a + a{ margin-left:0; }
  .page-rail a + a::before{ content:"/"; margin:0 10px; color:rgba(255,255,255,.28);
    font-weight:400; letter-spacing:0; }
  .page-rail a:hover,.page-rail a.is-active{ color:var(--gold); background:none; }
  .page-rail a.is-active{ font-weight:700; }
  .page-rail a:focus-visible{ outline:3px solid var(--gold); box-shadow:inset 0 0 0 6px rgba(11,18,32,.55); outline-offset:-3px; }   /* inset: the rail scrolls sideways and clipped the outer ring */
  /* The Apply chip duplicated the fixed Enquire bar two inches below it. Kept as a link, in gold,
     so it is still reachable from the index without being a second competing button. */
  .page-rail a.pr-cta{ background:none; color:var(--gold); border:0; font-weight:700; }
  .has-rail section[id]{ scroll-margin-top:140px; }   /* clear sticky header + rail when a chip jumps */

  .m-collapse{ margin:4px 0 0; }
  .m-collapse>summary{ display:inline-flex; align-items:center; gap:8px; cursor:pointer; list-style:none;
    font-family:var(--font-ui); font-size:13px; font-weight:600; letter-spacing:.03em;
    color:var(--gold-dark); background:var(--offwhite); border:1px solid var(--rule);
    border-radius:var(--r-pill); padding:10px 18px; }
  .m-collapse.on-navy>summary{ color:var(--gold-light); background:rgba(255,255,255,.06); border-color:var(--rule-navy); }
  .m-collapse>summary::-webkit-details-marker{ display:none; }
  .m-collapse>summary::after{ content:"+"; font-size:17px; line-height:1; }
  .m-collapse[open]>summary::after{ content:"\2212"; }
  .m-collapse>summary:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
  /* At 320px the cumulative table cannot shrink below ~300px, so it used to spill past the
     right edge — and body{overflow-x:clip} meant the last column could never be reached. */
  .m-collapse>.m-body{ margin-top:16px; overflow-x:auto; -webkit-overflow-scrolling:touch;
    scrollbar-width:thin; padding-bottom:6px; }
  .m-collapse>.m-body table{ min-width:300px; }
}
@media(prefers-reduced-motion:reduce){ .page-rail a,.m-collapse>summary{ transition:none; } }

/* ===== Alumni "the lights are real" (.al-) — Legacy Act V ===== */
.al-lights{margin:34px auto 0;max-width:840px;text-align:center}
.al-fallback{font-family:var(--font-prose);color:var(--on-navy-soft);max-width:62ch;margin:18px auto 0;line-height:1.6}
.al-lede{font-family:var(--font-ui);font-size:12.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--gold-light);margin:0 0 18px}
.al-sky{display:flex;flex-wrap:wrap;justify-content:center;gap:10px 12px;margin:0 auto;max-width:820px}
.al-light{display:inline-flex;align-items:center;gap:8px;transform:translateY(var(--lift,0));background:rgba(255,255,255,.05);border:1px solid var(--rule-navy);border-radius:var(--r-pill);padding:7px 14px 7px 11px;cursor:pointer;font-family:var(--font-ui);font-size:13.5px;color:var(--on-navy);transition:background .18s,border-color .18s,color .18s,box-shadow .18s}
.al-dot{width:7px;height:7px;border-radius:50%;background:var(--gold-light);box-shadow:0 0 8px 1px rgba(230,200,104,.7);flex:none;animation:alTwinkle 3.6s ease-in-out infinite}
.al-light:nth-child(3n) .al-dot{animation-delay:1.2s}
.al-light:nth-child(3n+1) .al-dot{animation-delay:2.4s}
.al-light:hover{background:rgba(230,200,104,.12);border-color:var(--gold)}
.al-light:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
.al-light.is-active{background:var(--gold-grad);color:var(--navy-deep);border-color:var(--gold);box-shadow:0 0 18px -2px rgba(230,200,104,.6);font-weight:600}
.al-light.is-active .al-dot{background:var(--navy-deep);box-shadow:none;animation:none}
.al-spot{min-height:88px;margin:24px auto 0;padding:20px;max-width:520px;background:rgba(255,255,255,.04);border:1px solid var(--rule-navy);border-radius:var(--r-lg);display:flex;flex-direction:column;gap:5px;align-items:center;justify-content:center}
.al-spot-hint{font-family:var(--font-prose);font-style:italic;font-size:16px;color:var(--on-navy-soft)}
.al-spot-name{font-family:var(--font-display);font-weight:600;font-size:21px;color:#fff;line-height:1.2}
.al-spot-role{font-family:var(--font-ui);font-size:15px;color:var(--gold-light);font-weight:600}
.al-spot-meta{font-family:var(--font-ui);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--on-navy-soft)}
.al-foot{font-family:var(--font-prose);font-style:italic;font-size:15px;color:var(--on-navy-soft);margin:20px 0 0}
@keyframes alTwinkle{0%,100%{opacity:1}50%{opacity:.45}}
.al-still .al-dot,[data-alumni-lights].al-still .al-dot{animation:none}
@media(prefers-reduced-motion:reduce){.al-dot{animation:none}}

/* ===== Light a Diya (.diya-) — the /light ritual ===== */
.diya-scene{position:relative;min-height:calc(100svh - var(--header-h,84px) - var(--tb-h,0px));display:flex;flex-direction:column;align-items:center;justify-content:center;overflow:hidden;background:radial-gradient(115% 92% at 50% 44%, #0c1525 0%, #060b17 46%, #02030a 100%);padding:clamp(48px,7vh,88px) 20px;text-align:center}
/* "Light to Enlighten": the scene starts DARK and brightens as the flame grows.
   JS drives --lit (0→1) each frame; the warm wash + glow + halo all track it. */
.diya-scene::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;opacity:var(--lit,0);transition:opacity .5s ease;
  background:
    radial-gradient(58% 48% at 50% 42%, rgba(255,172,82,.24) 0%, rgba(255,150,60,.07) 50%, transparent 74%),
    radial-gradient(135% 108% at 50% 8%, #2a3c64 0%, rgba(31,47,80,.5) 42%, transparent 72%)}
.diya-particles{position:absolute;inset:0;z-index:1;pointer-events:none}
/* Solid gradient (no backdrop-filter): a translucent+blur button over the dark diya stage
   triggers the iOS Safari black-box compositing bug — same fix already applied to .fab/.site-header. */
.diya-mute{position:absolute;top:max(14px,2vh);right:max(14px,2.5vw);z-index:4;width:40px;height:40px;border-radius:50%;border:1px solid var(--rule-navy);background:linear-gradient(135deg, rgba(31,48,82,.97), rgba(19,30,54,.96));color:var(--on-navy-soft);font-size:17px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s ease,border-color .2s ease}
.diya-mute:hover{background:linear-gradient(135deg, rgba(40,60,98,.98), rgba(26,40,70,.97));border-color:var(--gold)}
.diya-mute:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:3px}
/* Inline speaker SVGs replace the lone emoji; show one based on aria-pressed. */
.diya-mute .dm-ic{width:18px;height:18px;display:none}
.diya-mute[aria-pressed="false"] .dm-on{display:block}
.diya-mute[aria-pressed="true"] .dm-off{display:block}
.diya-inner{position:relative;z-index:2;max-width:640px;margin:0 auto}
.diya-kicker{color:var(--gold-light)}
.diya-title{font-family:var(--font-display);font-weight:600;font-size:clamp(30px,5vw,48px);line-height:1.1;color:#fff;margin:16px 0 0;text-wrap:balance;text-shadow:0 2px 40px rgba(255,180,90,.26)}
.diya-lede{font-family:var(--font-prose);font-size:clamp(16px,2vw,19px);line-height:1.62;color:var(--on-navy-soft);max-width:36ch;margin:18px auto 0;padding:0 4px}
.diya-stage{position:relative;margin:clamp(20px,3.5vh,40px) auto 0;width:min(300px,72vw);height:min(290px,52vh);display:grid;place-items:center}
.diya-glow{position:absolute;inset:-46%;border-radius:50%;background:radial-gradient(circle, rgba(255,190,98,.62) 0%, rgba(255,146,56,.2) 40%, rgba(120,150,220,.07) 62%, transparent 76%);opacity:calc(var(--lit,0)*.98);transform:scale(calc(.6 + .45*var(--lit,0)));transition:opacity .45s ease,transform .45s ease;pointer-events:none}
.diya-scene.is-stable .diya-glow{opacity:1;transform:scale(1);animation:diyaBreath 6s ease-in-out infinite alternate}
.diya-scene.is-burst .diya-glow{animation:none;opacity:1;transform:scale(1.55)}   /* payoff bloom flash */
.diya-lamp{position:relative;z-index:2;background:none;border:0;cursor:pointer;padding:6px;line-height:0;border-radius:16px}
.diya-lamp:focus-visible{outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55);outline-offset:6px}
.diya-svg{width:min(264px,57vw);height:auto;filter:drop-shadow(0 12px 30px rgba(0,0,0,.45))}
.diya-halo{opacity:var(--lit,0);transition:opacity .5s ease}
.diya-flame{opacity:0;transform-box:fill-box;transform-origin:50% 100%}
/* UNLIT: a dim resting ember (CSS-only, so it's never an empty bowl — even with no JS) */
.diya-scene:not(.is-lit) .diya-flame{opacity:.3;transform:scale(.6);filter:blur(.4px);animation:emberPulse 3.6s ease-in-out infinite}
.diya-scene:not(.is-lit) .diya-glow{opacity:.24;transform:scale(.56)}
.diya-scene:not(.is-lit) .diya-halo{opacity:.38}
/* resting lamp reads as a small light waiting, not an icon: a touch larger and warmer, still unlit */
.diya-scene:not(.is-lit) .diya-svg{filter:drop-shadow(0 12px 30px rgba(0,0,0,.45)) drop-shadow(0 0 16px rgba(255,170,80,.14))}
.diya-scene.is-stable .diya-flame{opacity:1;animation:diyaSway 3.4s ease-in-out infinite}
.diya-scene:not(.is-lit) .diya-lamp{animation:diyaNudge 2.6s ease-in-out infinite}
.diya-tap-hint{font-family:var(--font-ui);font-size:12.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--on-navy-soft);margin:8px 0 0;opacity:.85}
.diya-light-btn{margin-top:22px}
/* mobile: stop double-tap-to-zoom on the rapid tap targets (pinch-zoom stays everywhere else) */
.diya-lamp,.diya-scene .btn{touch-action:manipulation;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none}
.diya-after{margin-top:clamp(12px,2.4vh,22px);animation:diyaIn .6s ease both}
.diya-lit-title{font-family:var(--font-display);font-weight:600;font-size:clamp(23px,3.6vw,32px);color:var(--gold-light);margin:0 0 8px;text-wrap:balance}
.diya-after-sub{font-family:var(--font-prose);font-size:clamp(15px,2vw,17px);line-height:1.55;color:var(--on-navy-soft);max-width:40ch;margin:0 auto 14px}
.diya-privacy{font-family:var(--font-ui);font-size:12.5px;line-height:1.5;color:var(--on-navy-soft);opacity:.82;max-width:36ch;margin:0 auto 18px}
.diya-wish-l{display:block;font-family:var(--font-ui);font-size:13.5px;color:var(--on-navy-soft);margin:0 0 9px}
.diya-name{width:100%;max-width:480px;margin:0 auto 10px;display:block;background:rgba(255,255,255,.05);border:1px solid var(--rule-navy);border-radius:var(--r-lg);padding:12px 18px;color:#fff;font-family:var(--font-prose);font-size:16px;text-align:center}
.diya-wish{width:100%;max-width:480px;margin:0 auto;display:block;background:rgba(255,255,255,.05);border:1px solid var(--rule-navy);border-radius:var(--r-lg);padding:15px 18px;color:#fff;font-family:var(--font-prose);font-size:16px;line-height:1.5;text-align:center;resize:none;min-height:86px}
.diya-name::placeholder,.diya-wish::placeholder{color:rgba(200,208,222,.55)}
.diya-name:focus,.diya-wish:focus{outline:none;border-color:var(--gold);background:rgba(255,255,255,.08)}
.diya-leave{margin-top:18px}
.diya-count{font-family:var(--font-ui);font-size:15px;color:var(--on-navy-soft);margin:20px 0 0}
.diya-count b{font-family:var(--font-display);font-size:24px;color:var(--gold-light);font-weight:700}
.diya-share{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin:24px 0 0}
.diya-privacy-foot{font-family:var(--font-ui);font-size:12px;line-height:1.5;color:var(--on-navy-soft);opacity:.7;max-width:44ch;margin:16px auto 0}
.diya-privacy-foot a{color:var(--gold-light);text-decoration:underline;text-underline-offset:2px}

/* ---- heritage reveal: 1960 → this year → ∞ (echoes the Legacy timeline) ---- */
.diya-legacy{margin:30px auto 4px;max-width:440px;opacity:0;transform:translateY(10px);transition:opacity .7s ease,transform .7s ease}
.diya-legacy.is-shown{opacity:1;transform:none}
.diya-legacy[hidden]{display:none}
.dl-lead,.dl-tail{font-family:var(--font-display);font-weight:600;margin:0;opacity:0;filter:blur(6px);transition:opacity .6s ease,filter .6s ease}
.dl-lead{color:var(--gold-light);font-size:clamp(16px,2.4vw,21px)}
.dl-tail{color:#fff;font-size:clamp(15px,2.2vw,19px);margin-top:6px}
.diya-legacy.is-shown .dl-lead{opacity:1;filter:blur(0);transition-delay:.1s}
.diya-legacy.is-shown .dl-tail{opacity:1;filter:blur(0);transition-delay:1.45s}
.dl-line{position:relative;padding-top:8px;margin:16px 0 4px}
.dl-svg{position:absolute;top:7px;left:0;width:100%;height:2px;overflow:visible}
.dl-path{stroke:var(--gold);stroke-width:2;stroke-linecap:round;fill:none;stroke-dasharray:300;stroke-dashoffset:300;filter:drop-shadow(0 0 5px rgba(230,200,104,.55))}
.diya-legacy.is-shown .dl-path{stroke-dashoffset:0;transition:stroke-dashoffset 1.1s cubic-bezier(.4,0,.2,1) .2s}
.dl-orb{position:absolute;top:7px;left:0;width:11px;height:11px;border-radius:50%;background:radial-gradient(circle at 42% 38%,#FFF6DC 0%,#E6C868 45%,#A9842F 100%);box-shadow:0 0 14px 3px rgba(230,200,104,.8);transform:translate(-50%,-50%);opacity:0}
.diya-legacy.is-shown .dl-orb{animation:dlOrb 1.3s cubic-bezier(.4,0,.2,1) .2s forwards}
.dl-marks{position:relative;display:flex;justify-content:space-between;align-items:flex-start;margin-top:16px}
.dl-mark{position:relative;font-family:var(--font-display);font-weight:600;font-size:clamp(18px,2.7vw,25px);color:var(--on-navy);opacity:0;transform:translateY(6px);transition:opacity .5s ease,transform .5s ease}
.dl-mark::before{content:"";position:absolute;top:-15px;left:50%;transform:translateX(-50%);width:7px;height:7px;border-radius:50%;background:var(--gold);box-shadow:0 0 8px rgba(230,200,104,.7)}
.dl-m3{color:var(--gold-light);font-size:clamp(22px,3.2vw,32px);line-height:.8}
.diya-legacy.is-shown .dl-m1{opacity:1;transform:none;transition-delay:.3s}
.diya-legacy.is-shown .dl-m2{opacity:1;transform:none;transition-delay:.7s}
.diya-legacy.is-shown .dl-m3{opacity:1;transform:none;transition-delay:1.1s}
@keyframes dlOrb{0%{left:0;opacity:0}12%{opacity:1}88%{opacity:1}100%{left:100%;opacity:0}}
@keyframes emberPulse{0%,100%{opacity:.26;transform:scale(.57)}48%{opacity:.44;transform:scale(.65)}72%{opacity:.32;transform:scale(.6)}}
@media(prefers-reduced-motion:reduce){.diya-scene:not(.is-lit) .diya-flame{animation:none;opacity:.34;filter:none}}

/* ---- the ritual stays single-focus: Roshni and her nudge are hidden until the story is shown ---- */
body.diya-ritual .fab,body.diya-ritual .orx-nudge{opacity:0;visibility:hidden;pointer-events:none}
body:has(.diya-scene) .fab{transition:opacity .8s ease,visibility .8s ease}
/* once the note appears (after the catch and its ember burst), the intro folds away and the lamp
   settles a little smaller, so the note, both fields and the button sit inside one phone screen */
.diya-intro{display:grid;grid-template-rows:1fr;transition:grid-template-rows .8s cubic-bezier(.4,0,.2,1),opacity .45s ease}
.diya-intro-in{overflow:hidden;min-height:0}
.diya-stage,.diya-svg{transition:height .8s cubic-bezier(.4,0,.2,1),width .8s cubic-bezier(.4,0,.2,1),margin .8s cubic-bezier(.4,0,.2,1)}
.diya-scene{transition:padding .8s cubic-bezier(.4,0,.2,1)}
.diya-scene.is-note{padding-top:clamp(18px,3vh,40px);padding-bottom:clamp(24px,4vh,56px)}
.diya-scene.is-note .diya-intro{grid-template-rows:0fr;opacity:0}
.diya-scene.is-note .diya-stage{margin-top:0;height:min(230px,27vh)}
.diya-scene.is-note .diya-svg{width:min(210px,min(46vw,24vh))}
/* short phones (iPhone SE class, 667px and below): keep every ritual state inside one screen */
@media(max-height:760px){
  .diya-scene{padding-top:clamp(18px,3.4vh,34px);padding-bottom:clamp(18px,3.4vh,34px)}
  .diya-title{margin-top:10px}
  .diya-lede{margin-top:12px}
  .diya-stage{margin-top:clamp(10px,2vh,18px);height:min(290px,32vh)}
  .diya-svg{width:min(264px,57vw,30vh)}
  .diya-light-btn{margin-top:14px}
  .diya-scene.is-note .diya-stage{height:min(170px,20vh)}
  .diya-scene.is-note .diya-svg{width:min(160px,19vh)}
  .diya-lit-title{font-size:clamp(21px,3.2vh,28px);margin-bottom:4px}
  .diya-after-sub{margin-bottom:8px}
  .diya-privacy{margin-bottom:10px}
  .diya-wish{min-height:68px;padding-top:11px;padding-bottom:11px}
  .diya-name{padding-top:10px;padding-bottom:10px}
  .diya-leave{margin-top:12px}
  .diya-legacy{margin-top:16px}
  .diya-share{margin-top:16px;gap:10px}
}
@media(max-height:600px){
  .diya-title{font-size:28px}
  .diya-lede{font-size:15px;line-height:1.5}
  .diya-stage{height:26vh}
  .diya-svg{width:min(264px,57vw,25vh)}
  .diya-scene.is-note .diya-stage{height:12vh}
  .diya-scene.is-note .diya-svg{width:12vh}
  .diya-wish{min-height:58px}
  .diya-after-sub{font-size:14px}
  .diya-privacy{font-size:11.5px}
}
/* first-ignition hint beside the mute control; fades out on its own */
.diya-mute-hint{position:absolute;top:calc(max(14px,2vh) + 11px);right:calc(max(14px,2.5vw) + 50px);z-index:4;font-family:var(--font-ui);font-size:12px;letter-spacing:.03em;line-height:1;color:var(--on-navy-soft);background:rgba(10,18,33,.82);border:1px solid var(--rule-navy);border-radius:var(--r-pill);padding:6px 11px;white-space:nowrap;opacity:0;transform:translateX(6px);transition:opacity .45s ease,transform .45s ease;pointer-events:none}
.diya-mute-hint.is-shown{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.diya-intro,.diya-stage,.diya-svg,.diya-scene{transition:none}.diya-mute-hint{transition:none}}

/* ---- belonging milestone note ---- */
.diya-milestone{font-family:var(--font-display);color:var(--gold-light);font-size:14.5px;letter-spacing:.01em;margin:10px 0 0;animation:diyaIn .6s ease both}
.diya-milestone[hidden]{display:none}


@media(prefers-reduced-motion:reduce){
  .diya-legacy{transition:none}
  .diya-legacy .dl-lead,.diya-legacy .dl-tail,.diya-legacy .dl-mark{transition:none;opacity:1;filter:none;transform:none}
  .dl-path{stroke-dashoffset:0}
  .diya-legacy.is-shown .dl-path{transition:none}
  .diya-legacy.is-shown .dl-orb{animation:none;opacity:0}
  .diya-milestone{animation:none}
}
/* A real candle sways at the wick — rotate (with a little skew) around the base. */
@keyframes diyaSway{0%{transform:translateX(-1px) rotate(-4deg) skewX(-1.6deg) scaleY(1)}30%{transform:translateX(.6px) rotate(1.5deg) skewX(.6deg) scaleY(1.05)}55%{transform:translateX(1px) rotate(3deg) skewX(1.1deg) scaleY(.98)}80%{transform:translateX(-.4px) rotate(-2deg) skewX(-.9deg) scaleY(1.03)}100%{transform:translateX(-1px) rotate(-4deg) skewX(-1.6deg) scaleY(1)}}
@keyframes diyaBreath{from{opacity:.7;transform:scale(.94)}to{opacity:1;transform:scale(1.06)}}
@keyframes diyaNudge{0%,88%,100%{transform:translateY(0)}44%{transform:translateY(-5px)}}
@keyframes diyaIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
  .diya-scene.is-stable .diya-glow,.diya-scene.is-stable .diya-flame,.diya-scene:not(.is-lit) .diya-lamp{animation:none}
  .diya-scene.is-kindling .diya-flame,.diya-scene.is-stable .diya-flame{opacity:1;transform:none}
  .diya-after{animation:none}
}
/* diya teaser band (Home / Legacy → /light) */
/* A deliberately DARKER band that steps DOWN from the navy section above —
   a recessed top lip + a visible gold divider line = a clear seam, not a blob. */
.diya-teaser{position:relative;overflow:hidden;text-align:center;padding:clamp(56px,8vw,92px) 20px;
  background:
    radial-gradient(36% 54% at 50% 40%, rgba(255,165,75,.16) 0%, rgba(255,165,75,0) 66%),
    linear-gradient(180deg, #0a1020 0%, #0c1426 32%, #090f1f 100%);
  box-shadow:inset 0 26px 46px -28px rgba(0,0,0,.78)}
.diya-teaser::before{content:"";position:absolute;top:0;left:50%;transform:translateX(-50%);width:min(680px,82%);height:1px;background:linear-gradient(90deg,transparent,rgba(201,168,76,.6),transparent)}
.diya-teaser::after{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(120% 92% at 50% 42%, transparent 54%, rgba(4,8,16,.5) 100%)}
.diya-teaser > .wrap{position:relative;z-index:1}
.diya-teaser .dt-diya{display:block;width:62px;height:auto;margin:0 auto 12px;filter:drop-shadow(0 7px 18px rgba(0,0,0,.45))}
.diya-teaser .dt-diya .diya-halo{opacity:.9}
.diya-teaser .dt-diya .diya-flame{opacity:1;transform-box:fill-box;transform-origin:50% 100%;animation:diyaSway 3.4s ease-in-out infinite}
@media(prefers-reduced-motion:reduce){.diya-teaser .dt-diya .diya-flame{animation:none}}
.diya-teaser .kicker{color:var(--gold-light)}
.diya-teaser h2{font-family:var(--font-display);font-weight:600;font-size:clamp(22px,3.4vw,32px);color:#fff;margin:8px 0 0;text-wrap:balance}
.diya-teaser p{font-family:var(--font-prose);color:var(--on-navy-soft);max-width:48ch;margin:12px auto 0;line-height:1.6}
.diya-teaser .btn{margin-top:22px}

/* Extramarks logo tag — sits top-right on classroom photos */
.eb-frame{position:relative}
/* "This school is Extramarks enabled" — a compact CSS-typeset badge in
   Extramarks orange (white text), bottom-right of a classroom photo. Built in
   markup, not an image, so it is always crisp and correctly sized. */
.eb-wm{position:absolute;bottom:13px;right:13px;z-index:3;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:rgba(14,22,40,.4);-webkit-backdrop-filter:blur(11px) saturate(1.2);backdrop-filter:blur(11px) saturate(1.2);
  border:1px solid rgba(255,255,255,.28);border-radius:11px;padding:8px 15px;
  box-shadow:0 6px 18px rgba(0,0,0,.28), inset 0 1px 0 rgba(255,255,255,.25);
  font-family:var(--font-ui);color:#fff;line-height:1.04;text-align:center;letter-spacing:0}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.eb-wm{background:rgba(14,22,40,.82)}}
.eb-wm .eb-l1{font-size:8.5px;font-weight:600;letter-spacing:.04em;color:rgba(255,255,255,.92)}
.eb-wm .eb-l2{font-size:16px;font-weight:800;letter-spacing:.01em;text-transform:uppercase;margin:1.5px 0;color:#FF8A4D}
.eb-wm .eb-l3{font-size:11px;font-weight:500;letter-spacing:.05em;color:rgba(255,255,255,.92)}
@media(max-width:760px){.eb-wm{bottom:10px;right:10px;padding:6px 12px;border-radius:9px}.eb-wm .eb-l1{font-size:7.5px}.eb-wm .eb-l2{font-size:13.5px}.eb-wm .eb-l3{font-size:9.5px}}

/* ===================================================================
   OA MOTIF LIBRARY (Phase 3) — one navy/gold line-art system.
   Usage: <span class="oa-ico oa-i-torch" aria-hidden="true"></span>
   Paints with currentColor; size via font-size or width/height; tone
   via color:var(--gold)/var(--navy). Decorative — labels carry meaning.
   =================================================================== */
.oa-ico{ display:inline-block; width:1.25em; height:1.25em; flex:none;
  background-color:currentColor; vertical-align:-.18em;
  -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat;
  -webkit-mask-position:center; mask-position:center;
  -webkit-mask-size:contain; mask-size:contain; }
.oa-ico.gold{ color:var(--gold); } .oa-ico.navy{ color:var(--navy-deep); }
.oa-i-torch{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%202c2.2%202.6%202.2%205.2%200%207.4-2.2-2.2-2.2-4.8%200-7.4z%22%2F%3E%3Cpath%20d%3D%22M8.6%2010.4h6.8l-1.3%202.4H9.9z%22%2F%3E%3Cpath%20d%3D%22M11%2012.8%2010%2022M13%2012.8%2014%2022%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%202c2.2%202.6%202.2%205.2%200%207.4-2.2-2.2-2.2-4.8%200-7.4z%22%2F%3E%3Cpath%20d%3D%22M8.6%2010.4h6.8l-1.3%202.4H9.9z%22%2F%3E%3Cpath%20d%3D%22M11%2012.8%2010%2022M13%2012.8%2014%2022%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-book{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%206.5C9.4%205%206.4%204.8%203.5%205.8v12.3C6.4%2017.1%209.4%2017.3%2012%2018.8%22%2F%3E%3Cpath%20d%3D%22M12%206.5C14.6%205%2017.6%204.8%2020.5%205.8v12.3C17.6%2017.1%2014.6%2017.3%2012%2018.8z%22%2F%3E%3Cpath%20d%3D%22M12%206.5v12.3%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%206.5C9.4%205%206.4%204.8%203.5%205.8v12.3C6.4%2017.1%209.4%2017.3%2012%2018.8%22%2F%3E%3Cpath%20d%3D%22M12%206.5C14.6%205%2017.6%204.8%2020.5%205.8v12.3C17.6%2017.1%2014.6%2017.3%2012%2018.8z%22%2F%3E%3Cpath%20d%3D%22M12%206.5v12.3%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-flame{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%202.5c.5%203%203%204.6%204.2%206.8a5.2%205.2%200%201%201-9.3%203.1c0-2%20.9-3.3%202.1-4.4.1%201.6.9%202.4%201.8%202.6-.6-2.8-.6-5.6%201.2-8.1z%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%202.5c.5%203%203%204.6%204.2%206.8a5.2%205.2%200%201%201-9.3%203.1c0-2%20.9-3.3%202.1-4.4.1%201.6.9%202.4%201.8%202.6-.6-2.8-.6-5.6%201.2-8.1z%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-diya{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%2013.5c1.7%203%205%204.6%208.5%204.6s6.8-1.6%208.5-4.6z%22%2F%3E%3Cpath%20d%3D%22M12%2013c1.2-1.6%201.2-3%200-4.8-1.2%201.8-1.2%203.2%200%204.8z%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%2013.5c1.7%203%205%204.6%208.5%204.6s6.8-1.6%208.5-4.6z%22%2F%3E%3Cpath%20d%3D%22M12%2013c1.2-1.6%201.2-3%200-4.8-1.2%201.8-1.2%203.2%200%204.8z%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-gate{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5%2021V9a7%207%200%200%201%2014%200v12%22%2F%3E%3Cpath%20d%3D%22M5%2021h14M12%2021v-9%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5%2021V9a7%207%200%200%201%2014%200v12%22%2F%3E%3Cpath%20d%3D%22M5%2021h14M12%2021v-9%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-marker{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%2021c4-4.5%206-7.6%206-10.5a6%206%200%201%200-12%200C6%2013.4%208%2016.5%2012%2021z%22%2F%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2210.3%22%20r%3D%222.1%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%2021c4-4.5%206-7.6%206-10.5a6%206%200%201%200-12%200C6%2013.4%208%2016.5%2012%2021z%22%2F%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2210.3%22%20r%3D%222.1%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-frame{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Crect%20x%3D%224%22%20y%3D%223.5%22%20width%3D%2216%22%20height%3D%2217%22%20rx%3D%221.4%22%2F%3E%3Cpath%20d%3D%22M7%207.5h3M7%207.5v3M17%2016.5h-3M17%2016.5v-3%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Crect%20x%3D%224%22%20y%3D%223.5%22%20width%3D%2216%22%20height%3D%2217%22%20rx%3D%221.4%22%2F%3E%3Cpath%20d%3D%22M7%207.5h3M7%207.5v3M17%2016.5h-3M17%2016.5v-3%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-laurel{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M11.6%2021c-4.3-.6-7-3.8-7-8.4C8.2%2013%2010.8%2015.4%2011.6%2021z%22%2F%3E%3Cpath%20d%3D%22M12.4%2021c4.3-.6%207-3.8%207-8.4C15.8%2013%2013.2%2015.4%2012.4%2021z%22%2F%3E%3Cpath%20d%3D%22m12%203%201%202.2L15.3%206l-1.6%201.7.3%202.3L12%209l-2%201%20.3-2.3L8.7%206l2.3-.8z%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M11.6%2021c-4.3-.6-7-3.8-7-8.4C8.2%2013%2010.8%2015.4%2011.6%2021z%22%2F%3E%3Cpath%20d%3D%22M12.4%2021c4.3-.6%207-3.8%207-8.4C15.8%2013%2013.2%2015.4%2012.4%2021z%22%2F%3E%3Cpath%20d%3D%22m12%203%201%202.2L15.3%206l-1.6%201.7.3%202.3L12%209l-2%201%20.3-2.3L8.7%206l2.3-.8z%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-dot{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%203v5M12%2016v5%22%2F%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2212%22%20r%3D%223.4%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%203v5M12%2016v5%22%2F%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2212%22%20r%3D%223.4%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-crest{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%202.4c1.8%202.1%201.8%204.2%200%206-1.8-1.8-1.8-3.9%200-6z%22%2F%3E%3Cpath%20d%3D%22M4%2012.5c2.4-1%205-1%208%20.8%203-1.8%205.6-1.8%208-.8v6.7c-2.4-1-5-1-8%20.8-3-1.8-5.6-1.8-8-.8z%22%2F%3E%3Cpath%20d%3D%22M12%2013.3v6.7%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%202.4c1.8%202.1%201.8%204.2%200%206-1.8-1.8-1.8-3.9%200-6z%22%2F%3E%3Cpath%20d%3D%22M4%2012.5c2.4-1%205-1%208%20.8%203-1.8%205.6-1.8%208-.8v6.7c-2.4-1-5-1-8%20.8-3-1.8-5.6-1.8-8-.8z%22%2F%3E%3Cpath%20d%3D%22M12%2013.3v6.7%22%2F%3E%3C%2Fsvg%3E"); }
.oa-i-quill{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M20%204c-7%201.5-11%205.5-13%2010l3%203c4.5-2%208.5-6%2010-13z%22%2F%3E%3Cpath%20d%3D%22m7%2017-3%203M10.5%2010.5%2013%2013%22%2F%3E%3C%2Fsvg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M20%204c-7%201.5-11%205.5-13%2010l3%203c4.5-2%208.5-6%2010-13z%22%2F%3E%3Cpath%20d%3D%22m7%2017-3%203M10.5%2010.5%2013%2013%22%2F%3E%3C%2Fsvg%3E"); }

/* 6 NEW UTILITY ICONS (from the OA Visual Bundle) — fees · calendar · faculty ·
   campus · prospectus · visit. Converted to the in-CSS mask system (the bundle's
   only genuinely-new icons; the rest duplicate existing .oa-i-* classes). */
.oa-i-fees{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Ccircle%20cx=%2212%22%20cy=%2212%22%20r=%229%22/%3E%3Cpath%20stroke-width=%221.2%22%20d=%22M9%208h6M9%2011h6%22/%3E%3Cpath%20d=%22M9.5%208c3.2%200%204.2%203.5%200%203.5L14.5%2016%22/%3E%3C/svg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Ccircle%20cx=%2212%22%20cy=%2212%22%20r=%229%22/%3E%3Cpath%20stroke-width=%221.2%22%20d=%22M9%208h6M9%2011h6%22/%3E%3Cpath%20d=%22M9.5%208c3.2%200%204.2%203.5%200%203.5L14.5%2016%22/%3E%3C/svg%3E"); }
.oa-i-calendar{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Crect%20x=%223.5%22%20y=%225%22%20width=%2217%22%20height=%2215.5%22%20rx=%222%22/%3E%3Cline%20x1=%223.5%22%20y1=%229.5%22%20x2=%2220.5%22%20y2=%229.5%22/%3E%3Cline%20x1=%228%22%20y1=%223%22%20x2=%228%22%20y2=%226.5%22/%3E%3Cline%20x1=%2216%22%20y1=%223%22%20x2=%2216%22%20y2=%226.5%22/%3E%3Ccircle%20fill=%22%23000%22%20stroke=%22none%22%20cx=%2212%22%20cy=%2214.5%22%20r=%221.6%22/%3E%3C/svg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Crect%20x=%223.5%22%20y=%225%22%20width=%2217%22%20height=%2215.5%22%20rx=%222%22/%3E%3Cline%20x1=%223.5%22%20y1=%229.5%22%20x2=%2220.5%22%20y2=%229.5%22/%3E%3Cline%20x1=%228%22%20y1=%223%22%20x2=%228%22%20y2=%226.5%22/%3E%3Cline%20x1=%2216%22%20y1=%223%22%20x2=%2216%22%20y2=%226.5%22/%3E%3Ccircle%20fill=%22%23000%22%20stroke=%22none%22%20cx=%2212%22%20cy=%2214.5%22%20r=%221.6%22/%3E%3C/svg%3E"); }
.oa-i-faculty{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpath%20d=%22M2.5%209L12%205.2%2021.5%209%2012%2012.8Z%22/%3E%3Cpath%20d=%22M6.5%2011v4.2c0%201.5%202.7%202.8%205.5%202.8s5.5-1.3%205.5-2.8V11%22/%3E%3Cline%20x1=%2221.5%22%20y1=%229%22%20x2=%2221.5%22%20y2=%2214%22/%3E%3C/svg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpath%20d=%22M2.5%209L12%205.2%2021.5%209%2012%2012.8Z%22/%3E%3Cpath%20d=%22M6.5%2011v4.2c0%201.5%202.7%202.8%205.5%202.8s5.5-1.3%205.5-2.8V11%22/%3E%3Cline%20x1=%2221.5%22%20y1=%229%22%20x2=%2221.5%22%20y2=%2214%22/%3E%3C/svg%3E"); }
.oa-i-campus{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpath%20d=%22M3%2021V8.5L8%205.5%2013%208.5V21%22/%3E%3Cpath%20d=%22M13%2021V12h8v9%22/%3E%3Cline%20x1=%222%22%20y1=%2221%22%20x2=%2222%22%20y2=%2221%22/%3E%3Cpath%20stroke-width=%221.2%22%20d=%22M6.5%2011h3M6.5%2014.5h3M16.5%2015h2M16.5%2018h2%22/%3E%3C/svg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpath%20d=%22M3%2021V8.5L8%205.5%2013%208.5V21%22/%3E%3Cpath%20d=%22M13%2021V12h8v9%22/%3E%3Cline%20x1=%222%22%20y1=%2221%22%20x2=%2222%22%20y2=%2221%22/%3E%3Cpath%20stroke-width=%221.2%22%20d=%22M6.5%2011h3M6.5%2014.5h3M16.5%2015h2M16.5%2018h2%22/%3E%3C/svg%3E"); }
.oa-i-prospectus{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpath%20d=%22M6%203h8l4%204v14H6z%22/%3E%3Cpath%20d=%22M14%203v4h4%22/%3E%3Cline%20stroke-width=%221.2%22%20x1=%229%22%20y1=%2212.5%22%20x2=%2215%22%20y2=%2212.5%22/%3E%3Cline%20stroke-width=%221.2%22%20x1=%229%22%20y1=%2216%22%20x2=%2215%22%20y2=%2216%22/%3E%3C/svg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpath%20d=%22M6%203h8l4%204v14H6z%22/%3E%3Cpath%20d=%22M14%203v4h4%22/%3E%3Cline%20stroke-width=%221.2%22%20x1=%229%22%20y1=%2212.5%22%20x2=%2215%22%20y2=%2212.5%22/%3E%3Cline%20stroke-width=%221.2%22%20x1=%229%22%20y1=%2216%22%20x2=%2215%22%20y2=%2216%22/%3E%3C/svg%3E"); }
.oa-i-visit{ -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpolygon%20points=%2212,3%2021,12%2012,21%203,12%22/%3E%3Cpath%20d=%22M9.5%2014v-2.2a1.6%201.6%200%20011.6-1.6H15%22/%3E%3Cpath%20d=%22M13%207.5l2.5%202.5L13%2012.5%22/%3E%3C/svg%3E"); mask-image:url("data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20stroke=%22%23000%22%20stroke-width=%221.6%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cpolygon%20points=%2212,3%2021,12%2012,21%203,12%22/%3E%3Cpath%20d=%22M9.5%2014v-2.2a1.6%201.6%200%20011.6-1.6H15%22/%3E%3Cpath%20d=%22M13%207.5l2.5%202.5L13%2012.5%22/%3E%3C/svg%3E"); }

/* --- OA GLYPH: host for the gradient/decorative motifs in assets/oa-sprites.svg.
   Unlike .oa-ico (monochrome mask), this renders the real two-tone flame via
   <use>. One shared source — no inline duplication, no id collision.
   Usage: <svg class="oa-glyph" aria-hidden="true"><use href="assets/oa-sprites.svg#oa-flame"/></svg> --- */
.oa-glyph{ display:inline-block; width:1.4em; height:1.4em; flex:none; vertical-align:-.22em;
  color:var(--gold); overflow:visible; }
.oa-glyph use{ width:100%; height:100%; }

/* --- SECTION DIVIDER: the "printer's ornament" chapter break — a gold hairline
   broken at its midpoint by a small motif from the shared sprite. The single most
   repeatable authored detail. Use ONLY at major section seams, never every section.
   Markup: <div class="section-divider" role="separator" aria-hidden="true">
             <svg class="oa-glyph" aria-hidden="true"><use href="assets/oa-sprites.svg#oa-diya"/></svg>
           </div>   (add .on-navy when the seam sits on a dark ground) --- */
.section-divider{ display:flex; align-items:center; justify-content:center; gap:clamp(14px,3vw,22px);
  width:min(660px,84vw); margin:clamp(18px,4vw,40px) auto; }
.section-divider::before,.section-divider::after{ content:""; height:1px; flex:1; min-width:40px; }
.section-divider::before{ background:linear-gradient(90deg, transparent, rgba(201,168,76,.6)); }
.section-divider::after{ background:linear-gradient(90deg, rgba(201,168,76,.6), transparent); }
.section-divider .oa-glyph{ width:1.5em; height:1.5em; font-size:22px; color:var(--gold-dark); }
.section-divider.on-navy .oa-glyph{ color:var(--gold); }

/* --- NAVY LIGHT FIELD: lifts a flat navy slab into a lit hall with ONE off-axis
   warm radial (the "single lamp"). Pure CSS — no image, no canvas, no filter,
   iOS-safe, free on mobile. Opt-in per ceremonial section:
   <section class="section bg-navy lit-right"> … </section>. One lamp per section;
   never combine lit-left + lit-right; apply only to Founder/Crest/merit/ceremonial
   navy — not every navy section. (Legacy acts get their own parity treatment.) --- */
.bg-navy.lit-left,.bg-navy.lit-right{ position:relative; }
.bg-navy.lit-left > *,.bg-navy.lit-right > *{ position:relative; z-index:1; }
.bg-navy.lit-right::before,.bg-navy.lit-left::before{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background:radial-gradient(58% 52% at 80% 15%, rgba(201,168,76,.12), rgba(201,168,76,.04) 40%, transparent 70%);
}
.bg-navy.lit-left::before{
  background:radial-gradient(58% 52% at 20% 15%, rgba(201,168,76,.12), rgba(201,168,76,.04) 40%, transparent 70%);
}

/* ===================================================================
   VISUAL ART DIRECTION PASS (Phase 2 + Phase 4)
   Milestone marks · crest symbols · ceremonial Light · faculty cards.
   Heritage-calm; reuses navy/gold tokens + the OA motif library above.
   =================================================================== */

/* --- P3 Legacy milestones → archive/ledger entries (About .timeline) --- */
.timeline .tl-item{ padding:clamp(16px,2.4vw,26px) 22px; }
.tl-ic{ display:block; font-size:23px; color:var(--gold); opacity:.92; margin:0 0 12px; }
.timeline .tl-label{ max-width:22ch; }

/* --- P2 Crest symbolic callouts (Legacy .about-crest) — the crest's own
   meanings, presented like a museum caption. iOS-safe (text + mask icons,
   no filters on the crest image). Hidden in the desktop scrub overlay. --- */
.crest-symbols{ order:2; display:flex; flex-wrap:wrap; justify-content:center; align-items:flex-start;
  gap:clamp(24px,5vw,56px); margin-top:clamp(12px,2.5vw,22px); padding-top:clamp(20px,2.6vw,28px);
  width:min(680px,92vw); border-top:1px solid rgba(201,168,76,.26); }
.crest-grads{ position:absolute; width:0; height:0; overflow:hidden; }
.crest-symbol{ display:flex; flex-direction:column; align-items:center; gap:9px; text-align:center; max-width:11rem; }
/* the crest-faithful inline glyph (torch w/ flame, open book, motto ribbon) */
.crest-glyph{ display:block; width:clamp(40px,11vw,50px); height:auto; aspect-ratio:1; overflow:visible;
  filter:drop-shadow(0 2px 9px rgba(201,168,76,.20)); }
.crest-symbol b{ font-family:var(--font-ui); font-size:11.5px; font-weight:700; letter-spacing:.2em;
  text-transform:uppercase; color:var(--gold-light); }
.crest-symbol span{ font-family:var(--font-prose); font-size:13.5px; line-height:1.5; color:var(--on-navy-soft); }
.about-crest.scrub-active .crest-symbols{ display:none; }
/* Phones: the three symbols become a calm ceremonial vertical column (the focus), and the
   supporting prose below reads as secondary, not as a second essay. */
@media (max-width:600px){
  .crest-symbols{ flex-direction:column; align-items:center; gap:clamp(22px,7vw,30px); width:min(420px,92vw); }
  .crest-symbol{ max-width:20rem; gap:7px; }
  .crest-glyph{ width:46px; }
}
@media (max-width:760px){
  .about-crest .crest-aside--right{ max-width:42rem; }
  .about-crest .crest-aside--right p{ font-size:13.5px; line-height:1.66; color:var(--on-navy-soft); }
  .about-crest .crest-aside--right p.lead{ font-size:14.5px; color:var(--on-navy-soft); }
}

/* --- P4 Light ritual: ceremonial wish-field frame + a fuller after-light glow --- */
.diya-name,.diya-wish{ border-color:rgba(201,168,76,.30);
  box-shadow:inset 0 0 0 1px rgba(201,168,76,.06), 0 2px 14px -8px rgba(0,0,0,.5); }
.diya-wish-l{ position:relative; }
.diya-wish-l .oa-ico{ color:var(--gold); font-size:15px; margin-right:7px; opacity:.85; }
/* When lit, let the warmth settle a touch deeper (the metaphor: the room warms). */
.diya-scene.is-lit .diya-glow{ }
.diya-scene.is-stable.is-lit{ --lit:1; }

/* ===================================================================
   FACULTY CARD SYSTEM (Phase 4) — premium, data-safe. Only-show-provided
   fields. Photo: object-fit cover, face-centred, soft frame. Missing photo
   → crest-watermark placeholder. Dummy content lives on faculty-showcase.html
   for owner approval before any real teacher data is added.
   =================================================================== */
.fac2-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(18px,2.4vw,26px); }
.fac2{ display:flex; flex-direction:column; background:var(--white); border:1px solid var(--rule-strong);
  border-radius:var(--r-lg); overflow:hidden; box-shadow:var(--shadow-sm);
  transition:transform .2s ease, box-shadow .2s ease, border-color .2s ease; }
.fac2:hover{ transform:translateY(-3px); box-shadow:var(--shadow-md); border-color:var(--gold-dark); }
.fac2-photo{ position:relative; aspect-ratio:4/5; overflow:hidden; background:var(--navy); }
.fac2-photo img{ width:100%; height:100%; object-fit:cover; object-position:center 22%; display:block; }
/* Placeholder (no photo yet) — crest watermark on a quiet navy field. */
.fac2-photo.is-empty{ display:grid; place-items:center; background:
  radial-gradient(120% 90% at 50% 30%, rgba(201,168,76,.10), transparent 62%), var(--navy-deep); }
.fac2-photo.is-empty .oa-ico{ font-size:54px; color:rgba(201,168,76,.34); }
.fac2-photo.is-empty .fac2-soon{ position:absolute; bottom:14px; left:0; right:0; text-align:center;
  font-family:var(--font-ui); font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:rgba(230,210,150,.6); }
.fac2-body{ padding:18px 20px 20px; display:flex; flex-direction:column; gap:6px; }
.fac2-name{ font-family:var(--font-display); font-weight:600; font-size:20px; color:var(--navy-deep); line-height:1.15; }
.fac2-subj{ display:inline-flex; align-self:flex-start; align-items:center; gap:6px; margin-top:2px;
  font-family:var(--font-ui); font-size:11.5px; font-weight:700; letter-spacing:.08em; text-transform:uppercase;
  color:var(--gold-dark); background:rgba(201,168,76,.10); border:1px solid rgba(201,168,76,.3);
  border-radius:var(--r-pill); padding:4px 11px; }
.fac2-qual{ font-family:var(--font-ui); font-size:13px; color:var(--text); }
.fac2-qual b{ color:var(--navy-deep); font-weight:600; }
.fac2-exp{ font-family:var(--font-ui); font-size:12.5px; color:var(--gold-dark); font-weight:600; }
.fac2-philos{ margin:6px 0 0; font-family:var(--font-prose); font-style:italic; font-size:14px;
  line-height:1.55; color:var(--text-soft); border-top:1px solid var(--rule); padding-top:12px; }
.fac2 details{ margin-top:2px; }
.fac2 details>summary{ list-style:none; cursor:pointer; font-family:var(--font-ui); font-size:12.5px; font-weight:600;
  color:var(--gold-dark); display:inline-flex; align-items:center; gap:6px; }
.fac2 details>summary::-webkit-details-marker{ display:none; }
.fac2 details>summary::after{ content:"+"; font-weight:700; }
.fac2 details[open]>summary::after{ content:"\2212"; }
.fac2 details>summary:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; border-radius:3px; }
.fac2-more{ margin:10px 0 0; font-family:var(--font-prose); font-size:13.5px; line-height:1.6; color:var(--text-soft); }
@media(max-width:900px){ .fac2-grid{ grid-template-columns:repeat(2,1fr); } }
@media(max-width:560px){ .fac2-grid{ grid-template-columns:repeat(2,1fr); gap:12px; }
  .fac2-body{ padding:11px 12px 13px; gap:4px; }
  .fac2-name{ font-size:15px; line-height:1.12; }
  .fac2-subj{ font-size:9.5px; padding:3px 8px; }
  .fac2-qual{ font-size:11px; }
  .fac2-philos{ font-size:12px; padding-top:9px; } }

/* --- Reusable crest-watermark placeholder for any awaiting-photo slot (Campus etc.) --- */
.oa-photo-soon{ display:grid; place-items:center; position:relative;
  background:radial-gradient(120% 90% at 50% 30%, rgba(201,168,76,.09), transparent 60%), var(--navy-deep); }
.oa-photo-soon .oa-ico{ font-size:46px; color:rgba(201,168,76,.30); }

/* =====================================================================
   THROUGH THE YEARS — 3D archival gallery (through-the-years.html · oa-gallery.js)
   Default (no-JS / 2D): the static grid below shows. .tty-mode-3d hides the grid
   (kept in DOM, screen-reader reachable) and shows the WebGL stage.
   ===================================================================== */
.tty{ background:radial-gradient(120% 95% at 50% 22%, #22335A 0%, #1B2A4A 46%, #0E1726 100%);
  color:var(--on-navy); padding:clamp(28px,5vh,64px) 0 clamp(40px,7vh,80px); }
.tty-intro{ width:min(760px,92vw); margin:0 auto clamp(18px,3vh,30px); text-align:center; padding:0 18px; }
.tty-intro .kicker{ color:var(--gold); }
.tty-intro h1{ font-family:var(--font-display); font-weight:600; color:#fff; margin:.3em 0 .3em;
  font-size:clamp(26px,4.4vw,44px); line-height:1.1; letter-spacing:.01em; }
.tty-lede{ color:var(--on-navy-soft); font-size:clamp(15px,1.5vw,18px); line-height:1.6; margin:0 auto; max-width:54ch; }
.tty-core{ font-family:var(--font-display); font-style:italic; color:var(--gold-light); opacity:.95;
  font-size:clamp(15px,1.7vw,19px); letter-spacing:.06em; margin:clamp(10px,1.6vh,16px) 0 0; }

/* ---- 3D stage (hidden until JS confirms 3D) ---- */
.tty-stage{ display:none; position:relative; width:min(1320px,96vw); margin:0 auto;
  height:min(86svh,760px); border-radius:14px; overflow:hidden;
  box-shadow:0 30px 80px -28px rgba(0,0,0,.6), inset 0 0 0 1px rgba(201,168,76,.14); touch-action:none; }
/* 3D mode: the stage is the immersive full-viewport canvas under the sticky header;
   the intro floats over the top (non-blocking) and hides while a photo is focused. */
.tty.tty-mode-3d{ position:relative; padding:0; }
.tty-mode-3d .tty-stage{ display:block; width:100%; max-width:none; height:calc(100svh - 66px);
  margin:0; border-radius:0; box-shadow:none; }
/* 3D: "Lest we forget" is the centred emotional core; the photos orbit around it. The headline +
   lede drop away (kept as an sr-only H1 + the 2D fallback for SEO). A soft radial scrim gives the
   core a clear breathing zone without hiding the surrounding cloud. */
.tty-mode-3d .tty-intro{ position:absolute; top:0; left:0; right:0; width:auto; max-width:none; margin:0;
  z-index:4; pointer-events:none; text-align:center; transition:opacity .4s ease;
  padding:clamp(14px,3vh,28px) 18px 0; }
.tty-mode-3d .tty-h1{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }   /* sr-only: crawlable + screen-reader */
/* In 3D, both "Lest we forget" AND the "Through the Years" label live in WebGL at the orbit core,
   so the whole DOM intro is sr-only (kept for SEO/screen readers). */
.tty-mode-3d .tty-lede, .tty-mode-3d .tty-core, .tty-mode-3d .tty-intro .kicker{ display:none; }
.tty-mode-3d.is-focused .tty-intro,
.tty-mode-3d.is-focused .tty-hint{ opacity:0; }
.tty-canvas{ display:block; width:100%; height:100%; }
/* boot veil — the stage is pre-mounted before the 3D module arrives (no 2D-grid flash);
   a quiet line breathes over the empty navy until the first WebGL frame adds .tty-live */
.tty-mode-3d:not(.tty-live) .tty-stage{ background:radial-gradient(120% 95% at 50% 30%, #22335A 0%, #1B2A4A 52%, #0E1726 100%); }
.tty-mode-3d:not(.tty-live) .tty-stage::after{ content:"Lighting the gallery…"; position:absolute; left:0; right:0; top:50%;
  transform:translateY(-50%); text-align:center; pointer-events:none;
  font-family:var(--font-display); font-style:italic; font-size:clamp(16px,2.2vw,21px); letter-spacing:.05em;
  color:rgba(230,200,104,.8); animation:tty-breathe 2.2s ease-in-out infinite alternate; }
@keyframes tty-breathe{ from{ opacity:.45; } to{ opacity:.95; } }
.tty-mode-3d:not(.tty-live) .tty-hint{ opacity:0; }
@media (prefers-reduced-motion:reduce){ .tty-mode-3d:not(.tty-live) .tty-stage::after{ animation:none; } }
.tty-hint{ position:absolute; left:50%; bottom:16px; transform:translateX(-50%); margin:0;
  font-family:var(--font-ui); font-size:12px; letter-spacing:.16em; text-transform:uppercase;
  color:rgba(230,200,104,.8); pointer-events:none; transition:opacity .6s ease; text-shadow:0 1px 6px rgba(0,0,0,.6); }
.tty-hint.is-gone{ opacity:0; }

/* ---- focus overlay (DOM chrome over the stage; the photo itself is a WebGL mesh) ---- */
.tty-focus{ position:absolute; inset:0; z-index:6; display:grid;
  grid-template-rows:auto minmax(0,1fr) auto; align-items:stretch;
  padding:clamp(14px,3vh,30px) clamp(14px,4vw,40px); opacity:0; transition:opacity .45s ease; }
.tty-focus.is-open{ opacity:1; }
.tty-focus[hidden]{ display:none; }
.tty-focus-grid{ display:contents; }
.tty-focus-head{ text-align:center; pointer-events:none; }
.tty-year{ font-family:var(--font-display); font-weight:700; color:var(--gold-light);
  font-size:clamp(30px,6vw,58px); line-height:1; margin:0; text-shadow:0 2px 18px rgba(0,0,0,.5); }
.tty-class{ font-family:var(--font-ui); font-weight:500; color:#EEE7D6; margin:.35em 0 0;
  font-size:clamp(13px,1.7vw,17px); letter-spacing:.04em; }
.tty-note{ display:inline-block; margin-top:.5em; pointer-events:auto; font-family:var(--font-ui);
  font-size:12.5px; letter-spacing:.02em; color:var(--gold); border:1px solid rgba(201,168,76,.4);
  border-radius:var(--r-pill); padding:5px 14px; text-decoration:none; background:rgba(201,168,76,.08); }
.tty-note:hover{ background:rgba(201,168,76,.18); }
.tty-photo-zone{ min-height:0; }     /* transparent — the focused photo mesh shows through here */
.tty-focus-foot{ text-align:center; display:flex; flex-direction:column; align-items:center; min-height:0; }
.tty-roster-toggle{ pointer-events:auto; margin:0 0 10px; cursor:pointer; font-family:var(--font-ui);
  font-size:13px; letter-spacing:.08em; color:var(--gold-light); background:transparent;
  border:0; padding:8px 10px; text-transform:uppercase; }
.tty-roster-toggle:hover{ color:#fff; }
.tty-roster{ pointer-events:auto; width:min(820px,94%); max-height:34vh; overflow:auto; text-align:left;
  background:rgba(10,16,28,.5); border:1px solid rgba(201,168,76,.18); border-radius:10px;
  padding:14px 16px; -webkit-overflow-scrolling:touch; }
.tty-roster[hidden]{ display:none; }
.tty-rrow{ padding:7px 0; border-bottom:1px solid rgba(255,255,255,.06); }
.tty-rrow:last-child{ border-bottom:0; }
.tty-rlabel{ display:block; font-family:var(--font-ui); font-size:10.5px; font-weight:700; letter-spacing:.14em;
  text-transform:uppercase; color:var(--gold); margin-bottom:3px; }
.tty-rnames{ display:block; font-family:var(--font-ui); font-size:13.5px; line-height:1.65; color:#E7E2D6; }
.tty-roster.is-in .tty-rrow{ animation:tty-rowin .42s ease both; animation-delay:calc(var(--ri) * .07s); }
@keyframes tty-rowin{ from{ opacity:0; transform:translateY(8px); } to{ opacity:1; transform:none; } }
.tty-studio{ margin:10px 0 0; font-family:var(--font-ui); font-size:11px; color:rgba(230,225,213,.5); letter-spacing:.02em; }
.tty-close{ position:absolute; top:10px; right:12px; z-index:7; pointer-events:auto; width:44px; height:44px;
  border-radius:50%; border:1px solid rgba(201,168,76,.4); background:rgba(10,16,28,.55); color:#fff;
  font-size:26px; line-height:1; cursor:pointer; display:grid; place-items:center; }
.tty-close:hover{ background:rgba(201,168,76,.22); }
@media (prefers-reduced-motion:reduce){ .tty-focus,.tty-roster.is-in .tty-rrow{ transition:none; animation:none; } }

/* ---- 2D grid (the fallback AND the SEO/a11y layer) ---- */
.tty-fallback{ width:min(1280px,94vw); margin:clamp(18px,3vh,30px) auto 0; }
.tty-mode-3d .tty-fallback{ position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }   /* sr-only, still crawlable */
.tty-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:clamp(16px,2.4vw,26px); }
.tty-card{ margin:0; background:rgba(255,255,255,.03); border:1px solid rgba(201,168,76,.16); border-radius:12px; overflow:hidden; }
.tty-card-open{ display:block; width:100%; padding:0; border:0; background:transparent; cursor:pointer; text-align:left; }
.tty-card-img{ display:block; width:100%; height:auto; background:var(--navy-deep); }
.tty-card-cap{ padding:11px 14px 4px; }
.tty-card-year{ display:block; font-family:var(--font-display); font-weight:600; color:var(--gold-light); font-size:19px; }
.tty-card-class{ display:block; font-family:var(--font-ui); font-size:12.5px; color:var(--on-navy-soft); margin-top:2px; }
.tty-card-note{ margin:0; padding:0 14px 6px; }
.tty-card-note a{ font-family:var(--font-ui); font-size:12px; color:var(--gold); }
.tty-card-roster{ padding:2px 14px 14px; }
.tty-card-roster summary{ cursor:pointer; font-family:var(--font-ui); font-size:12px; letter-spacing:.06em;
  text-transform:uppercase; color:var(--gold); }
.tty-card-roster .tty-rrow{ border-bottom-color:rgba(255,255,255,.07); }
.tty-fallback-loading{ text-align:center; color:var(--on-navy-soft); font-family:var(--font-ui); padding:30px 0; }
@media (max-width:760px){
  .tty-stage{ height:min(74svh,560px); width:100%; border-radius:0; }
  .tty-roster{ max-height:42vh; width:96%; }
  .tty-grid{ grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:12px; }
}

/* ===================================================================
   FACULTY HONOUR WALL (faculty.html) — 3-layer editorial wall.
   L1 honour hero + proof chips · L2 long-service wall (anchor + mosaic)
   · L3 documented gallery + living-voice quote panel. Builds on .fac2 + .wf-chip.
   =================================================================== */
/* Portrait crop — per-card focus + zoom (CSS only; calibrated in build) */
.fac2-photo img{ object-position:var(--ox,50%) var(--oy,18%); transform:scale(var(--z,1));
  transform-origin:var(--ox,50%) var(--oy,18%); transition:transform .5s ease; }
.fac2:hover .fac2-photo img{ transform:scale(calc(var(--z,1) * 1.045)); }

/* Premium depth — gold top keyline (absolute, mobile-safe), soft shadow, hover lift, focus */
.fac2{ position:relative; box-shadow:0 6px 22px -14px rgba(22,36,63,.45); }
.fac2::before{ content:""; position:absolute; top:0; left:0; right:0; height:2px; z-index:3;
  background:linear-gradient(90deg, transparent, var(--gold), transparent); opacity:.5; }
.fac2:hover{ transform:translateY(-4px); box-shadow:0 18px 36px -18px rgba(22,36,63,.5); border-color:var(--gold-dark); }
.fac2:focus-within{ border-color:var(--gold-dark); box-shadow:0 18px 36px -18px rgba(22,36,63,.5); }

/* EXP badge — stacked navy plaque; small on gallery, larger on the wall/anchor */
.fac2-badge{ position:absolute; left:11px; top:11px; z-index:2; display:flex; flex-direction:column;
  align-items:center; line-height:1; padding:5px 8px 6px; border-radius:9px;
  background:linear-gradient(158deg, rgba(26,40,68,.97), rgba(11,18,38,.97)); border:1px solid var(--gold-deep);
  box-shadow:0 6px 16px -6px rgba(0,0,0,.6); }
.fb-exp{ font-family:var(--font-ui); font-size:10px; font-weight:700; letter-spacing:.14em; text-transform:uppercase; color:var(--gold); }
.fb-num{ font-family:var(--font-display); font-weight:700; font-size:16px; color:#fff; margin-top:2px; }
.fb-yrs{ font-family:var(--font-ui); font-size:10px; font-weight:700; letter-spacing:.12em; text-transform:uppercase; color:var(--gold-light); margin-top:2px; }
.oa-portrait .fac2-badge{ left:10px; top:10px; padding:6px 9px 7px; }
.oa-portrait .fb-num{ font-size:18px; } .oa-portrait .fb-exp{ font-size:10px; } .oa-portrait .fb-yrs{ font-size:10px; }

/* Tier eyebrow ("Long Service") */
.fac2-tier{ display:inline-flex; align-items:center; gap:8px; align-self:flex-start; margin:0 0 4px;
  font-family:var(--font-ui); font-size:10px; font-weight:700; letter-spacing:.2em; text-transform:uppercase; color:var(--gold-dark); }
.fac2-tier::before{ content:""; width:18px; height:1.5px; background:var(--gold); display:inline-block; }

/* Belief — 2-line preview + "Read belief" */
.fac2-philos{ margin:8px 0 0; }
.fac2-rm{ margin:8px 0 0; }
.fac2-rm > summary{ list-style:none; cursor:pointer; }
.fac2-rm > summary::-webkit-details-marker{ display:none; }
.fac2-rm > summary.fac2-philos{ margin:0; }
.fac2-rm:not([open]) > summary.fac2-philos{ display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.fac2-rm > summary::after{ content:"Read belief"; display:inline-block; margin-top:8px;
  font-family:var(--font-ui); font-style:normal; font-size:11.5px; font-weight:700; letter-spacing:.04em; color:var(--gold-dark); }
.fac2-rm[open] > summary::after{ content:"Show less"; }
.fac2-rm > summary:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; border-radius:3px; }

/* L1 — hero proof chips (quiet, inline; not a dashboard) */
.fac-proof{ list-style:none; display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:8px 0; margin:clamp(26px,3.4vw,40px) auto 0; padding:0; }
.fac-proof li{ font-family:var(--font-ui); font-size:clamp(14px,1.5vw,16px); letter-spacing:.01em; color:var(--on-navy-soft); position:relative; padding:0 clamp(16px,2vw,26px); }
.fac-proof li:first-child{ padding-left:0; }
.fac-proof li + li::before{ content:""; position:absolute; left:0; top:50%; transform:translateY(-50%); width:1px; height:15px; background:rgba(201,168,76,.45); }
.fac-proof b{ font-family:var(--font-display); font-weight:600; color:var(--gold-light); font-size:1em; margin-right:5px; }
@media(max-width:560px){ .fac-proof{ flex-direction:column; gap:7px; } .fac-proof li{ padding:0; } .fac-proof li + li::before{ display:none; } }

/* L2 — "KEEPERS OF THE FLAME": candlelit navy honour hall. Lit busts (background-removed
   cutouts) emerge from the dark in department constellations, igniting on scroll. Candle field +
   parallax + ignite via oa-faculty.js; reduced-motion / no-JS = fully-lit dignified static. */
.flame-hall{ background:
    radial-gradient(78% 48% at 16% 80%, rgba(201,168,76,.06), transparent 58%),
    radial-gradient(70% 44% at 86% 94%, rgba(201,168,76,.05), transparent 58%),
    radial-gradient(120% 90% at 50% -6%, #1f3052 0%, #16243F 48%, #0E1726 100%);
  color:var(--on-navy); position:relative; overflow:hidden; }
/* slow-drifting warm light so the candlelit hall feels alive, not a static print spread */
.flame-hall::after{ content:""; position:absolute; inset:-25%; z-index:0; pointer-events:none;
  background:
    radial-gradient(38% 34% at 28% 28%, rgba(201,168,76,.08), transparent 60%),
    radial-gradient(42% 38% at 76% 70%, rgba(120,150,210,.06), transparent 62%);
  animation:facDrift 38s ease-in-out infinite alternate; }
@keyframes facDrift{ from{ transform:translate3d(-2.5%,-2%,0) scale(1.06); } to{ transform:translate3d(2.5%,2%,0) scale(1.14); } }
/* The drift layer is inset:-25% of its SECTION, not of the viewport. On a phone the faculty
   index is a ~7,600px-tall two-column grid, so the animated surface is roughly 585x11,400px —
   past the mobile GPU texture limit, so the compositor hands it back to the main thread and the
   two gradients repaint every frame, the whole way down. Keep the light, drop the drift. */
@media (max-width:900px){ .flame-hall::after{ animation:none; } }
@media (prefers-reduced-motion:reduce){ .flame-hall::after{ animation:none; } }
.flame-hall .section-head h1,.flame-hall .section-head h2{ color:#fff; }
.flame-hall .section-head .lede{ color:var(--on-navy-soft); }
.flame-hall .wrap{ position:relative; z-index:1; }
.flame-hall .fac2-subj{ color:var(--gold-light); background:rgba(201,168,76,.12); border-color:rgba(201,168,76,.36); }

/* candle ambiance — JS-built spans, behind everything */
.fh-candles{ position:absolute; inset:0; z-index:0; pointer-events:none; overflow:hidden; }
.fh-candle{ position:absolute; width:var(--s,8px); height:var(--s,8px); border-radius:50%; opacity:0;
  background:radial-gradient(circle, rgba(255,226,176,.95), rgba(255,160,70,.42) 55%, transparent 72%);
  filter:blur(var(--bl,.4px)); }   /* no will-change: an opacity keyframe is composited on its own, and a pinned hint keeps 34 layers alive across a 7,600px section */
.fh-candle.lit{ opacity:var(--o,.7); }
.fh-anim .fh-candle.lit{ animation:fhflick var(--d,4s) ease-in-out var(--dl,0s) infinite; }
@keyframes fhflick{ 0%,100%{ opacity:calc(var(--o,.7)*.6); } 50%{ opacity:var(--o,.7); } }

/* department constellations */
.hall-clusters{ position:relative; max-width:1160px; margin:clamp(20px,3.2vw,40px) auto 0; }
.hall-cluster{ margin:0 0 clamp(42px,5.5vw,70px); }
.hall-cluster:last-child{ margin-bottom:0; }
.cluster-head{ display:flex; align-items:center; justify-content:center; gap:13px; margin:0 0 clamp(22px,2.8vw,34px);
  font-family:var(--font-ui); font-size:clamp(13px,1.3vw,15px); font-weight:700; letter-spacing:.2em; text-transform:uppercase; color:var(--gold-light); }
.cluster-head .oa-ico{ font-size:19px; color:var(--gold); }
.cluster-head .cluster-n{ font-family:var(--font-ui); font-weight:700; font-size:11px; color:var(--gold);
  letter-spacing:.06em; background:rgba(201,168,76,.13); border:1px solid rgba(201,168,76,.42); border-radius:var(--r-pill); padding:2px 10px; }
.cluster-head::before,.cluster-head::after{ content:""; height:1px; flex:1; max-width:90px; background:linear-gradient(90deg,transparent,rgba(201,168,76,.4)); }
.cluster-head::after{ background:linear-gradient(90deg,rgba(201,168,76,.4),transparent); }

.honour-grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:clamp(22px,2.6vw,40px) clamp(14px,2vw,26px); }

/* honour card = keyboard-operable button → honour-profile overlay */
.honour-card{ display:flex; flex-direction:column; align-items:center; text-align:center; position:relative;
  background:none; border:0; padding:6px 6px 22px; margin:0; color:inherit; font:inherit; cursor:pointer; border-radius:14px;
  transition:transform .25s ease; }
.honour-card::after{ content:"View profile →"; position:absolute; left:0; right:0; bottom:3px; text-align:center;
  font-family:var(--font-ui); font-size:10px; font-weight:600; letter-spacing:.1em; text-transform:uppercase; color:var(--gold);
  opacity:0; transform:translateY(3px); transition:opacity .25s ease, transform .25s ease; pointer-events:none; }
.honour-card:hover::after, .honour-card:focus-visible::after{ opacity:.85; transform:none; }
@media(hover:none){ .honour-card{ padding-bottom:8px; } .honour-card::after{ display:none; } }
.honour-card:hover{ transform:translateY(-4px); }
.honour-card:hover .oa-portrait::before{ opacity:1.3; }
.honour-card:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:4px; }
.honour-card .fac2-subj{ pointer-events:none; align-self:center; font-size:11px; padding:4px 11px; }

/* lit bust — transparent cutout seated on the navy, lit from behind; glow scales with tenure */
/* framed PORTRAIT CARD (owner-preferred over the floating cutout): the real photo, cover-cropped
   in a gold-keyline frame on the navy wall, with a subtle OA monogram watermark + bottom vignette. */
.oa-portrait{ position:relative; width:100%; aspect-ratio:4/5; display:block; overflow:hidden;
  border-radius:10px; background:#0b1226; box-shadow:0 16px 34px -16px rgba(0,0,0,.66); }
.oa-portrait::before{ content:""; position:absolute; inset:0; z-index:2; pointer-events:none; border-radius:inherit;
  box-shadow:inset 0 0 0 1px rgba(201,168,76,.5), inset 0 0 0 4px rgba(11,18,38,.5), inset 0 -58px 56px -34px rgba(8,12,28,.72); }
.oa-portrait::after{ content:""; position:absolute; right:9px; bottom:9px; width:32px; height:32px; z-index:3;
  background:url("oa-monogram-white.svg") center/contain no-repeat; opacity:.5; filter:drop-shadow(0 1px 3px rgba(0,0,0,.65)); pointer-events:none; }
.oa-bust{ position:relative; z-index:1; width:100%; height:100%; object-fit:cover; object-position:50% 24%;
  filter:saturate(1.03) contrast(1.02); }
/* Interactive hover — the teacher's portrait leans in a touch (scales up from its base) */
.oa-bust{ transition:transform .4s cubic-bezier(.22,.7,.27,1); transform-origin:50% 35%; }
.honour-card:hover .oa-bust, .honour-card:focus-visible .oa-bust{ transform:scale(1.06); }
.idx-thumb{ transition:transform .35s cubic-bezier(.22,.7,.27,1); transform-origin:50% 100%; }
.idx-card:hover .idx-thumb, .idx-card:focus-visible .idx-thumb{ transform:scale(1.1); }
@media (prefers-reduced-motion: reduce){ .oa-bust,.idx-thumb{ transition:none; } .honour-card:hover .oa-bust,.idx-card:hover .idx-thumb{ transform:none; } }

.hon-body{ display:flex; flex-direction:column; align-items:center; gap:6px; margin-top:14px; }
.hon-name{ font-family:var(--font-display); font-weight:600; color:#fff; font-size:clamp(18px,1.6vw,22px); line-height:1.14; text-shadow:0 1px 10px rgba(0,0,0,.45); }
.hon-yrs{ font-family:var(--font-ui); font-size:11px; font-weight:700; letter-spacing:.12em; text-transform:uppercase; color:var(--gold); }

/* ignite-on-scroll (only under .fh-anim, added by JS when motion is OK; otherwise fully visible) */
.fh-anim .honour-card{ opacity:0; transform:translateY(16px); transition:opacity .7s ease, transform .7s cubic-bezier(.22,.7,.27,1); }
.fh-anim .honour-card.is-lit{ opacity:1; transform:none; }
.fh-anim .cluster-head{ opacity:0; transition:opacity .7s ease; }
.fh-anim .hall-cluster.is-lit .cluster-head{ opacity:1; }

/* desktop "emerging" quote from the candlelight */
.hall-voice{ display:none; }
@media(min-width:1100px){
  .hall-voice{ display:block; min-height:2.7em; max-width:720px; margin:4px auto clamp(8px,1.4vw,16px); text-align:center;
    font-family:var(--font-prose); font-style:italic; font-size:clamp(16px,1.5vw,20px); line-height:1.5; color:var(--on-navy-soft);
    opacity:0; transition:opacity .9s ease; }
  .hall-voice.is-show{ opacity:.92; }
  .hall-voice b{ font-style:normal; font-weight:600; color:var(--gold-light); font-family:var(--font-display); font-size:.82em; }
}

/* L4 — "Find a teacher" lighter index/roster (navy; doubles as the keyboard / SR / no-JS list) */
.flame-index .section-head{ margin-bottom:clamp(18px,2.4vw,26px); }
.idx-roster{ display:grid; grid-template-columns:repeat(auto-fill,minmax(224px,1fr)); gap:13px; max-width:1100px; margin:clamp(20px,2.8vw,30px) auto 0; }
.idx-card{ display:flex; align-items:center; gap:13px; text-align:left; background:rgba(255,255,255,.045);
  border:1px solid rgba(201,168,76,.24); border-radius:var(--r-lg); padding:9px 14px 9px 9px; cursor:pointer; color:inherit; font:inherit;
  transition:background .18s ease, border-color .18s ease, transform .18s ease; }
.idx-card:hover{ background:rgba(201,168,76,.10); border-color:rgba(201,168,76,.5); transform:translateY(-2px); }
.idx-card:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.idx-thumb{ flex:none; width:46px; height:58px; object-fit:contain; object-position:50% 100%; filter:drop-shadow(0 0 4px rgba(255,206,138,.4)); }
.idx-meta{ display:flex; flex-direction:column; gap:1px; min-width:0; }
.idx-name{ font-family:var(--font-display); font-weight:600; font-size:15.5px; color:#fff; line-height:1.15; }
.idx-subj{ font-family:var(--font-ui); font-size:11px; color:var(--gold-light); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.idx-yrs{ font-family:var(--font-ui); font-size:11px; font-weight:600; letter-spacing:.04em; color:var(--on-navy-soft); }
.idx-card.is-hidden{ display:none; }
.idx-card.is-folded{ display:none; }
/* single candlelit hero + continuous dark ground from hero → voices → index (no flat seams) */
.flame-hero{ padding-top:clamp(54px,7.5vw,104px); }
.flame-hero .section-head{ max-width:760px; margin-inline:auto; position:relative; z-index:1; }
/* warm glow behind the hero title so it isn't floating in flat navy */
.flame-hero::before{ content:""; position:absolute; left:50%; top:0; transform:translateX(-50%); pointer-events:none; z-index:0;
  width:min(740px,94vw); height:clamp(280px,40vw,460px);
  background:radial-gradient(46% 56% at 50% 40%, rgba(244,200,105,.14), rgba(244,200,105,.04) 54%, transparent 72%); }
/* focal candle flame — radial bands of light (white-hot core → gold → amber edge),
   wrapped in a warm halo, gently breathing (slow swell + halo pulse + core flicker) */
.fh-flame{ position:relative; display:block; width:clamp(38px,4.2vw,50px); height:auto; margin:0 auto clamp(16px,1.9vw,24px); }
.fh-flame::before{ content:""; position:absolute; left:50%; top:56%; width:260%; height:260%; transform:translate(-50%,-50%);
  pointer-events:none; z-index:-1; border-radius:50%;
  background:radial-gradient(circle, rgba(255,212,138,.5) 0%, rgba(244,200,105,.24) 28%, rgba(201,168,76,.1) 48%, transparent 66%); }
.fh-flame svg{ display:block; width:100%; height:auto; overflow:visible; transform-origin:50% 90%;
  filter:drop-shadow(0 0 7px rgba(255,196,110,.55)) drop-shadow(0 2px 12px rgba(217,123,42,.4)); }
.fh-flame .fh-l-core{ transform-origin:50% 90%; }
.fh-anim .fh-flame svg{ animation:fhBreath 3.8s ease-in-out infinite; }
.fh-anim .fh-flame::before{ animation:fhHalo 3.8s ease-in-out infinite; }
.fh-anim .fh-flame .fh-l-core{ animation:fhCore 2.3s ease-in-out infinite; }
@keyframes fhBreath{ 0%,100%{ transform:scale(1) translateY(0); } 50%{ transform:scale(1.05,1.09) translateY(-1px); } }
@keyframes fhHalo{ 0%,100%{ opacity:.78; transform:translate(-50%,-50%) scale(.94); } 50%{ opacity:1; transform:translate(-50%,-50%) scale(1.08); } }
@keyframes fhCore{ 0%,100%{ opacity:.82; transform:scaleY(.92); } 45%{ opacity:1; transform:scaleY(1.08); } }
@media(prefers-reduced-motion:reduce){ .fh-flame svg, .fh-flame::before, .fh-flame .fh-l-core{ animation:none !important; } }
/* hero kicker framed with symmetric gold hairlines */
.flame-hero .section-head .kicker{ gap:14px; }
.flame-hero .section-head .kicker::before, .flame-hero .section-head .kicker::after{ content:""; display:inline-block;
  width:clamp(22px,4vw,44px); height:1px; background:linear-gradient(90deg,transparent,rgba(201,168,76,.6)); }
.flame-hero .section-head .kicker::after{ background:linear-gradient(90deg,rgba(201,168,76,.6),transparent); }
.flame-hall.flame-index{ background:linear-gradient(180deg, #26354f 0%, #1b2a44 20%, #122036 60%, #0E1726 100%); }
#voices.bg-navy{ background:radial-gradient(64% 80% at 50% 34%, #1a2840 0%, #111c30 56%, #0B1322 100%); padding-top:clamp(36px,5vw,64px); padding-bottom:clamp(36px,5vw,64px); }

/* L3 — honour-profile overlay (spotlit; reuses the lightbox a11y pattern) */
.hp-overlay{ position:fixed; inset:0; z-index:120; display:grid; place-items:center; padding:24px; }
.hp-overlay[hidden]{ display:none; }
.hp-backdrop{ position:absolute; inset:0; background:rgba(8,12,22,.82); opacity:0; transition:opacity .35s ease; }
.hp-overlay.fac-blur .hp-backdrop{ -webkit-backdrop-filter:blur(4px); backdrop-filter:blur(4px); }   /* blur applied AFTER the motion (perf) */
.hp-overlay.fac-anim:not(.is-show) .hp-card{ transform:scale(.97); }                                  /* morph start: centred scale, no up-drift */
.hp-overlay.fac-anim .hp-card{ will-change:transform,opacity; }
.hp-card{ position:relative; display:grid; grid-template-columns:auto 1fr; gap:clamp(20px,3vw,40px); width:min(720px,100%); max-height:88vh; overflow:auto;
  padding:clamp(24px,3vw,40px); background:radial-gradient(120% 100% at 30% 0%, #1f3052, #0E1726 78%); border:1px solid rgba(201,168,76,.4);
  border-radius:var(--r-lg); box-shadow:0 40px 90px -30px rgba(0,0,0,.85); transform:translateY(14px) scale(.985); opacity:0;
  transition:transform .32s cubic-bezier(.22,.7,.27,1), opacity .32s ease; }
.hp-overlay.is-show .hp-backdrop{ opacity:1; }
.hp-overlay.is-show .hp-card{ transform:none; opacity:1; }
.hp-close{ position:absolute; top:10px; right:12px; width:38px; height:38px; border-radius:50%; border:1px solid rgba(255,255,255,.3);
  background:rgba(255,255,255,.08); color:#fff; font-size:22px; line-height:1; cursor:pointer; display:grid; place-items:center; z-index:2; }
.hp-close:hover{ background:rgba(255,255,255,.18); border-color:var(--gold); }
.hp-close:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.hp-portrait{ position:relative; width:clamp(176px,24vw,228px); aspect-ratio:4/5; align-self:center; overflow:hidden; border-radius:10px; background:#0b1226; box-shadow:0 18px 40px -18px rgba(0,0,0,.7); }
.hp-portrait::before{ content:""; position:absolute; inset:0; z-index:2; pointer-events:none; border-radius:inherit;
  box-shadow:inset 0 0 0 1px rgba(201,168,76,.5), inset 0 0 0 4px rgba(11,18,38,.5); }
.hp-portrait .oa-bust{ position:relative; z-index:1; width:100%; height:100%; object-fit:cover; object-position:50% 24%; filter:saturate(1.03) contrast(1.02); }
.hp-info{ align-self:center; }
.hp-eng{ display:flex; align-items:baseline; gap:9px; }
.hp-eng b{ font-family:var(--font-display); font-weight:700; font-size:clamp(40px,6vw,58px); color:var(--gold-light); line-height:.9; }
.hp-eng span{ font-family:var(--font-ui); font-size:11px; font-weight:700; letter-spacing:.18em; text-transform:uppercase; color:var(--on-navy-soft); }
.hp-name{ font-family:var(--font-display); font-weight:600; color:#fff; font-size:clamp(26px,3.4vw,36px); margin:10px 0 4px; line-height:1.06; }
.hp-subj{ font-family:var(--font-ui); font-size:12px; font-weight:700; letter-spacing:.18em; text-transform:uppercase; color:var(--gold); margin:0; }
.hp-subj:empty{ display:none; }
.hp-qual{ font-family:var(--font-ui); font-size:13.5px; color:var(--on-navy-soft); margin:12px 0 0; }
.hp-qual:empty{ display:none; }
.hp-belief{ margin:16px 0 0; padding-top:16px; border-top:1px solid rgba(201,168,76,.28);
  font-family:var(--font-prose); font-style:italic; font-size:clamp(15px,1.7vw,18px); line-height:1.55; color:#fff; }
.hp-belief:empty{ display:none; }
.hp-belief::before{ content:"\201C"; color:var(--gold); }
.hp-belief::after{ content:"\201D"; color:var(--gold); }

/* L3b — "card morph" flyer: the clicked photo flips to the gold OA crest, then grows to the overlay
   (oa-faculty.js drives the transforms). Professional/eased — no bounce. Reduced-motion skips it. */
.hp-overlay.fac-anim .hp-backdrop{ opacity:1; }        /* backdrop fades in during the flip, before the card */
.fac-flyer{ position:fixed; z-index:121; perspective:1400px; -webkit-perspective:1400px;
  transform-origin:center center; pointer-events:none; opacity:0; visibility:hidden; will-change:transform,opacity; }
.fac-flyer.is-on{ visibility:visible; opacity:1; }
.fac-flyer-inner{ position:absolute; inset:0; transform-style:preserve-3d; -webkit-transform-style:preserve-3d; will-change:transform; }
.fac-flyer-front,.fac-flyer-back{ position:absolute; inset:0; border-radius:10px; overflow:hidden;
  backface-visibility:hidden; -webkit-backface-visibility:hidden;
  box-shadow:0 20px 44px -22px rgba(0,0,0,.6), inset 0 0 0 1px rgba(201,168,76,.5), inset 0 0 0 4px rgba(11,18,38,.5); }
.fac-flyer-front{ background-color:#0b1226; background-repeat:no-repeat; background-size:cover; background-position:50% 24%; }
.fac-flyer-back{ transform:rotateY(180deg); background:radial-gradient(120% 100% at 30% 0%, #1f3052, #0E1726 78%); }
.fac-flyer-back::before{ content:""; position:absolute; inset:0; background:url("oa-crest-solid-gold.svg") center/52% no-repeat;
  opacity:.96; filter:drop-shadow(0 0 18px rgba(201,168,76,.35)); }
/* a gold specular sheen sweeps across the card as it turns (GPU transform; clipped to the face) */
.fac-flyer-front::after,.fac-flyer-back::after{ content:""; position:absolute; top:-10%; bottom:-10%; left:-55%; width:55%; pointer-events:none; z-index:4;
  background:linear-gradient(105deg, transparent, rgba(255,248,222,.6) 50%, transparent); opacity:0; will-change:transform,opacity; }
.fac-flyer.is-flipping .fac-flyer-front::after,.fac-flyer.is-flipping .fac-flyer-back::after{ animation:fac-shine .8s cubic-bezier(.4,0,.2,1) .04s; }
@keyframes fac-shine{ 0%{ transform:translateX(0); opacity:0; } 24%{ opacity:.9; } 100%{ transform:translateX(330%); opacity:0; } }
@media (prefers-reduced-motion: reduce){ .fac-flyer{ display:none !important; } }

/* gallery meta: live count + sort */
.fac-meta{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin:0 0 clamp(18px,2.4vw,26px); font-family:var(--font-ui); font-size:13px; }
.fac-toggle{ margin-left:auto; font-family:var(--font-ui); font-size:12.5px; font-weight:600; color:var(--navy); background:var(--white);
  border:1px solid var(--rule-strong); border-radius:var(--r-pill); padding:7px 15px; cursor:pointer; display:inline-flex; align-items:center; gap:8px;
  transition:background .18s ease, border-color .18s ease, color .18s ease; }
.fac-toggle::before{ content:"+"; font-weight:700; color:var(--gold-dark); }
.fac-toggle[aria-pressed="true"]{ background:var(--navy-deep); color:var(--gold); border-color:var(--navy-deep); }
.fac-toggle[aria-pressed="true"]::before{ content:"\2212"; color:var(--gold); }
.fac-toggle:hover{ border-color:var(--gold-dark); }
.fac-toggle:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.fac-count{ font-weight:700; color:var(--navy-deep); }
.flame-index .fac-count{ color:var(--on-navy-soft); }                                  /* readable on the dark index */
.flame-index .wf-chip.is-active{ background:var(--gold); color:var(--navy-deep); border-color:var(--gold); box-shadow:0 6px 18px -8px rgba(201,168,76,.5); }
.flame-index .wf-chip.is-active:hover{ background:var(--gold-light); }
.fac-sort{ color:var(--text-soft); display:inline-flex; align-items:center; gap:6px; }
.fac-sort::before{ content:"\2195"; color:var(--gold-dark); font-weight:700; }
.fac2.is-hidden{ display:none; }
.fac2-grid:not(.show-seniors) [data-senior]{ display:none; }
.fac2-noresult{ text-align:center; color:var(--text-soft); font-family:var(--font-ui); margin:24px 0 0; }
/* progressive reveal — show first batch, then "Show all" (keeps the page from being an endless wall) */
.fac2.is-folded{ display:none; }
.fac-showall-row{ text-align:center; margin:clamp(20px,3vw,30px) 0 0; }
.fac-showall{ font-family:var(--font-ui); font-size:13px; font-weight:600; color:var(--navy-deep); background:var(--white);
  border:1px solid var(--gold-dark); border-radius:var(--r-pill); padding:10px 22px; cursor:pointer; display:inline-flex; align-items:center; gap:8px;
  transition:background .18s ease, color .18s ease; }
.fac-showall:hover{ background:var(--navy-deep); color:var(--gold); }
.fac-showall:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.fac-showall[hidden]{ display:none; }
.fac-showall .fsa-ar{ color:var(--gold-dark); font-weight:700; }
.fac-showall:hover .fsa-ar{ color:var(--gold); }

/* L3 — "Why they teach": candlelit testimony emerging from the dark (founder-shrine feel).
   Lit bust + a short pull-quote, no card/box — just a gold mark and a hairline. */
.fq-rotator{ max-width:960px; margin:6px auto 0; }
.fq-stage{ position:relative; }
.fq-item{ display:flex; gap:clamp(24px,4vw,56px); align-items:center; justify-content:center; margin:0;
  background:none; border:0; box-shadow:none; padding:0; }
.fq-portrait{ flex:none; width:clamp(170px,20vw,240px); aspect-ratio:4/5; position:relative; background:none; overflow:visible; border-radius:0; }
.fq-portrait::before{ content:""; position:absolute; left:50%; top:-4%; width:122%; height:106%; transform:translateX(-50%);
  background:radial-gradient(ellipse 50% 46% at 50% 40%, rgba(240,206,134,.34), rgba(201,168,76,.09) 44%, transparent 64%);
  filter:blur(17px); z-index:0; pointer-events:none; }
.fq-portrait img{ position:relative; z-index:1; width:100%; height:100%; object-fit:contain; object-position:50% 100%; display:block;
  filter:drop-shadow(0 0 15px rgba(255,206,138,.5)) drop-shadow(0 10px 18px rgba(0,0,0,.5)); }
.fq-text{ position:relative; max-width:30ch; }
.fq-text .otw-mark{ font-family:var(--font-display); font-weight:700; font-size:54px; line-height:.4; color:var(--gold); opacity:.6; display:block; margin-bottom:8px; }
.fq-quote{ margin:0; font-family:var(--font-display); font-weight:500; font-style:italic; font-size:clamp(22px,2.5vw,32px); line-height:1.4; color:#fff; }
.fq-cite{ display:flex; flex-wrap:wrap; align-items:center; gap:6px 12px; margin-top:18px; padding-top:14px; border-top:1px solid rgba(201,168,76,.3); }
.fq-cname{ font-family:var(--font-display); font-weight:600; font-size:16px; color:var(--gold-light); }
.fq-cmeta{ font-family:var(--font-ui); font-size:12px; letter-spacing:.04em; color:var(--on-navy-soft); }
.fq-exp{ font-family:var(--font-ui); font-size:10.5px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; color:var(--gold);
  background:rgba(201,168,76,.12); border:1px solid rgba(201,168,76,.34); border-radius:var(--r-pill); padding:3px 10px; }
.fq-rotator.is-live .fq-stage{ display:grid; }
.fq-rotator.is-live .fq-item{ grid-area:1/1; opacity:0; visibility:hidden; transform:translateY(8px);
  transition:opacity .5s ease, transform .5s ease, visibility .5s; }
.fq-rotator.is-live .fq-item.is-active{ opacity:1; visibility:visible; transform:none; }
.fq-controls{ display:flex; align-items:center; justify-content:center; gap:14px; margin-top:24px; }
.fq-arrow{ width:42px; height:42px; border-radius:50%; border:1px solid rgba(255,255,255,.36);
  background:rgba(255,255,255,.08); color:#fff; font-size:20px; line-height:1; cursor:pointer;
  display:grid; place-items:center; transition:background .2s ease, border-color .2s ease; }
.fq-arrow:hover{ background:rgba(255,255,255,.18); border-color:var(--gold); }
.fq-arrow:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:3px; }
.fq-dots{ display:flex; gap:22px; }   /* pitch 22+9 == 31; neighbouring 44px hit areas do not overlap */
.fq-dot{ position:relative; width:9px; height:9px; border-radius:50%; border:0; padding:0; cursor:pointer; background:rgba(255,255,255,.32); transition:background .2s ease, transform .2s ease; }
/* Invisible 31x44 thumb target over a 9px dot — mirrors the .ss-dot treatment. */
.fq-dot::after{ content:""; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); width:31px; height:44px; }
.fq-dot.is-active{ background:var(--gold); transform:scale(1.25); }
.fq-dot:focus-visible{ outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px; }
.fq-rotator:not(.is-live) .fq-stage{ display:grid; gap:18px; }
.fq-rotator:not(.is-live) .fq-controls{ display:none; }

@media(prefers-reduced-motion:reduce){
  .fac2-photo img,.fac2:hover .fac2-photo img,.fac-toggle{ transition:none; }
  .fq-rotator.is-live .fq-stage{ display:grid; gap:18px; }
  .fq-rotator.is-live .fq-item{ position:static; opacity:1; visibility:visible; transform:none; transition:none; }
  .fq-rotator.is-live .fq-controls{ display:none; }
  /* candlelit hall → dignified static: everything lit, no flicker/ignite/parallax/voice */
  .fh-anim .fh-candle.lit{ animation:none; }
  .fh-anim .honour-card{ opacity:1; transform:none; transition:none; }
  .fh-anim .cluster-head{ opacity:1; }
  .hall-voice{ display:none; }
  .hp-backdrop,.hp-card{ transition:none; }
}

/* responsive */
@media(max-width:900px){
  .honour-grid{ grid-template-columns:repeat(3,1fr); }
}
@media(max-width:640px){
  .honour-grid{ grid-template-columns:repeat(2,1fr); gap:26px 14px; }
  .hon-body{ margin-top:9px; }
  .hp-card{ grid-template-columns:1fr; text-align:center; gap:16px; }
  .hp-portrait{ margin:0 auto; width:min(180px,60%); }
  .hp-eng{ justify-content:center; }
}
@media(max-width:560px){
  .fac2-badge{ left:9px; top:9px; padding:5px 9px 6px; }
  .fb-num{ font-size:16px; }
  .oa-portrait .fb-num{ font-size:17px; }
  .fq-item{ flex-direction:column; text-align:center; }
  .fq-text{ max-width:34ch; margin-inline:auto; }
  .fq-text .otw-mark{ margin-inline:auto; }
  .fq-cite{ justify-content:center; }
  .idx-roster{ grid-template-columns:1fr 1fr; }
  .idx-thumb{ width:40px; height:50px; }
  .idx-name{ font-size:14px; }
  /* index filters WRAP on phones (no horizontal scroll / no page overflow) */
  #faculty .gallery-filter{ flex-wrap:wrap; overflow:visible; justify-content:center; padding:0; gap:7px; }
}
@media(max-width:440px){
  .idx-roster{ grid-template-columns:1fr; }          /* one tidy column instead of two cramped cards */
  .honour-grid{ gap:24px 12px; }
}

/* ===== Campus · "Spaces children use every day" — editorial campus zones (navy) ===== */
.zones{ display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
.zone{ position:relative; border-radius:16px; overflow:hidden; min-height:212px; isolation:isolate; background:#0c1530; }
.zone--lead{ grid-column:1 / -1; min-height:clamp(280px,38vw,430px); }
.zone > picture{ position:absolute; inset:0; z-index:0; display:block; }
.zone img{ width:100%; height:100%; object-fit:cover; display:block; transition:transform .6s cubic-bezier(.22,1,.36,1); }
.zone:hover img{ transform:scale(1.045); }
.zone::after{ content:""; position:absolute; inset:0; z-index:1; background:linear-gradient(to top, rgba(8,13,28,.92) 0%, rgba(8,13,28,.5) 40%, rgba(8,13,28,.05) 78%); }
.z-cap{ position:absolute; left:0; right:0; bottom:0; z-index:2; padding:clamp(16px,2vw,26px); color:#fff; }
.z-cap h3{ font-family:var(--font-display); font-weight:600; font-size:clamp(18px,1.9vw,23px); line-height:1.12; margin:0 0 5px; color:#fff; }
.zone--lead .z-cap h3{ font-size:clamp(24px,3vw,34px); }
.z-cap p{ font-family:var(--font-ui); font-size:13.5px; line-height:1.55; color:rgba(255,255,255,.85); margin:0; max-width:50ch; }
@media(max-width:860px){ .zones{ grid-template-columns:repeat(2,1fr); gap:12px; } .zone--lead{ grid-column:1 / -1; } }
@media(max-width:560px){
  .zones{ grid-template-columns:1fr; }
  .zone{ min-height:0; aspect-ratio:3/2; }
  .zone--lead{ aspect-ratio:16/9; }
  .zone.zone--portrait{ aspect-ratio:4/5; }
}

/* Campus gallery — progressive reveal control */
.gallery-more{ text-align:center; margin-top:clamp(22px,3vw,32px); }

/* ===== Campus · "Spaces children use every day" — campus-map identity + transitions (scoped #spaces) ===== */
#spaces.section{ position:relative; isolation:isolate; overflow:hidden;
  background:linear-gradient(180deg,#0b1430 0%,#16243f 40%,#1c2d56 100%);
  padding-top:clamp(58px,8vw,112px); padding-bottom:clamp(72px,9vw,130px); }
#spaces > .wrap{ position:relative; z-index:1; }
#spaces::before{ content:""; position:absolute; right:-5%; top:6%; width:min(540px,50%); aspect-ratio:1; z-index:0; pointer-events:none;
  background:url("oa-crest.svg") center/contain no-repeat; opacity:.05; }
#spaces::after{ content:""; position:absolute; left:0; right:0; bottom:0; height:clamp(46px,7vw,92px); z-index:0; pointer-events:none;
  background:linear-gradient(180deg, rgba(251,248,241,0), rgba(251,248,241,.13)); }
/* "enter the campus tour" cue — a thin gold path dropping into the section */
.spaces-enter{ width:1px; height:clamp(40px,6vw,74px); margin:0 auto clamp(20px,3vw,36px); position:relative; z-index:2;
  background:linear-gradient(180deg, rgba(201,168,76,0), rgba(201,168,76,.85)); }
.spaces-enter::after{ content:""; position:absolute; bottom:-3px; left:50%; width:7px; height:7px; transform:translate(-50%,0) rotate(45deg); background:var(--gold); box-shadow:0 0 12px rgba(201,168,76,.6); }
/* heading polish */
#spaces .section-head{ position:relative; z-index:2; margin-bottom:clamp(28px,4vw,48px); }
#spaces .section-head .kicker{ color:var(--gold); }
#spaces .section-head h2{ color:#fff; }
#spaces .section-head .lede{ color:rgba(255,255,255,.84); font-size:clamp(15px,1.4vw,17px); }
/* zone cards — gold keyline, depth, hover lift */
#spaces .zones{ position:relative; z-index:1; }
.zone{ box-shadow: inset 0 0 0 1px rgba(201,168,76,.16), 0 16px 38px -26px rgba(0,0,0,.72); transition:transform .3s cubic-bezier(.22,1,.36,1), box-shadow .3s ease; }
@media(hover:hover){ .zone:hover{ transform:translateY(-4px); box-shadow: inset 0 0 0 1px rgba(201,168,76,.36), 0 28px 54px -24px rgba(0,0,0,.82); } }
.zone--lead{ min-height:clamp(300px,42vw,470px); box-shadow: inset 0 0 0 1px rgba(201,168,76,.3), 0 26px 60px -28px rgba(0,0,0,.84), 0 0 76px -12px rgba(201,168,76,.22); }
.zone--lead img{ object-position:center 44%; }   /* keeps the welcome banner and the crest board in frame */
/* stronger caption gradient + readability (lead kept lighter so the classroom shows) */
.zone::after{ background:linear-gradient(to top, rgba(6,11,24,.95) 0%, rgba(6,11,24,.5) 40%, rgba(6,11,24,.05) 78%); }
/* Keeping the lead lighter so the classroom shows is right, but the h3 measured 2.44:1
   and the caption 4.21:1 on this photograph. Only the bottom stops move; the mid-tones,
   which are what let the room read through, are untouched. */
.zone--lead::after{ background:linear-gradient(to top, rgba(6,11,24,.96) 0%, rgba(6,11,24,.5) 46%, rgba(6,11,24,0) 80%); }
.z-cap h3{ text-shadow:0 1px 10px rgba(0,0,0,.55); }
.z-cap p{ color:rgba(255,255,255,.9); }
@media(max-width:560px){
  .zones > .zone{ min-width:0; }                     /* a grid item must never exceed its track */
  .zone--lead{ min-height:0; aspect-ratio:16/9; }    /* width comes from the track, height from the ratio */
}
/* subtle campus-route number chips on the supporting cards */
.z-step{ position:absolute; top:12px; left:12px; z-index:4; width:25px; height:25px; border-radius:50%; display:grid; place-items:center;
  font-family:var(--font-ui); font-size:11.5px; font-weight:700; color:var(--gold-light);
  background:rgba(8,13,28,.55); border:1px solid rgba(201,168,76,.5); -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px); }
@media(max-width:560px){ #spaces::before{ opacity:.04; width:72%; } .z-step{ width:23px; height:23px; font-size:11px; } }

/* ===== Campus hero: the photograph IS the hero (owner, 26 Sep 2026: "remove the blurred hero
   from campus ... such a beautiful photo, you wasted it"). Full bleed, sharp, full colour. The
   scrim only darkens the bottom-left, over the children's heads where the copy sits, so the smart
   board, the marigolds, the painted pots and the portrait stay bright. The copy is anchored to the
   bottom of the frame and the frame is tall enough to show nearly the whole picture. ===== */
.campus-hero .ph-slideshow .ss-slide img{ filter:none; transform:none; object-position:center 28%; }
.oa-js .page-hero.campus-hero.has-slideshow .ss-slide.active img{ animation:none; }   /* still photo, no ken-burns drift */
@media(min-width:641px){
  .page-hero.campus-hero.has-slideshow .page-hero-inner{ justify-content:flex-end; padding-bottom:clamp(36px,4.5vw,64px);
    min-height:clamp(440px, min(52vw, calc(100vh - 190px)), 760px);
    min-height:clamp(440px, min(52vw, calc(100svh - 190px)), 760px); }
  .page-hero.campus-hero.has-slideshow .ph-slideshow::after{ background:
    linear-gradient(0deg, rgba(8,13,28,.86) 0%, rgba(8,13,28,.6) 22%, rgba(8,13,28,.18) 46%, rgba(8,13,28,0) 62%),
    linear-gradient(90deg, rgba(8,13,28,.42) 0%, rgba(8,13,28,.12) 40%, rgba(8,13,28,0) 58%); }
  .page-hero.campus-hero .ph-lede{ color:rgba(255,255,255,.9); text-shadow:0 1px 12px rgba(8,12,22,.6); }
}
/* Phones: the shared photo band (copy on navy below it), made taller and left clear, centred on the
   smart board and the portrait; the scrim only blends the photo's bottom edge into the navy. */
@media(max-width:640px){
  .page-hero.campus-hero.has-slideshow{ --hero-band:72vw; }
  .page-hero.campus-hero.has-slideshow .page-hero-inner{ min-height:0; }
  .page-hero.campus-hero.has-slideshow .ss-slide img{ object-position:60% 30%; }
  .page-hero.campus-hero.has-slideshow .ph-slideshow::after{
    background:linear-gradient(0deg, var(--navy) 0%, rgba(22,36,63,.5) 7%, rgba(22,36,63,.12) 20%, rgba(22,36,63,0) 38%); }
}
/* tighten the hero -> Spaces handoff (close the empty navy gap) */
#spaces.section{ padding-top:clamp(30px,4vw,56px); }
.spaces-enter{ height:clamp(28px,4vw,54px); margin:0 auto clamp(14px,2vw,24px); }

/* Final handoff tuning — campus tour begins a little sooner; marker quieter (not a focal point) */
#spaces.section{ padding-top:clamp(24px,3.3vw,46px); }
.spaces-enter{ height:clamp(20px,2.8vw,40px); margin:0 auto clamp(10px,1.6vw,18px); background:linear-gradient(180deg, rgba(201,168,76,0), rgba(201,168,76,.55)); }
.spaces-enter::after{ width:6px; height:6px; box-shadow:none; background:rgba(201,168,76,.82); }

/* The Academics page styles live in assets/oa-academics.css (25 Sep 2026 redesign). */

/* ============================================================
   RAUSHNI — the light motion language (shared primitives)
   ------------------------------------------------------------
   One metaphor site-wide: light arrives, warms, and passes on.
   Everything below is compositor-only (opacity/transform/filter),
   one-shot on reveal, and inert without html.oa-js (which is never
   added under prefers-reduced-motion — see oa-system.js:10).
   ============================================================ */

/* —— kindle stagger: children of a revealed [data-stagger] grid light in sequence.
      JS sets --ki per child (oa-system.js); the parent's own rise is suppressed so
      the children carry the moment. Failsafe: the reveal engine's 1600ms .in sweep. */
.oa-js [data-stagger].reveal{ animation:none; opacity:1; }
.oa-js [data-stagger].reveal > *{ opacity:0; }
.oa-js [data-stagger].reveal.in > *{ animation:oa-rise .75s cubic-bezier(.33,1,.68,1) both; animation-delay:calc(var(--ki,0) * 85ms); }
@media (prefers-reduced-motion:reduce){
  [data-stagger].reveal > *{ opacity:1 !important; animation:none !important; }
}

/* —— photo-warm: prints develop. Archival photographs enter slightly darker and
      cooler, then warm to their standard treatment as light falls on them.
      Opt-in via .photo-warm on the .reveal container. Composes with the base
      .archival-img sepia (oa-system.css §archival) rather than clobbering it. */
/* Desktop only. On a phone .mw-row collapses to a column (below), so every photograph is
   full-bleed and a row's worth of these transitions lands at once — a repaint-per-frame path on
   the same page that already runs the fixed ember stage, and the exact property whose cost is
   recorded at moments.html:70 (32% dropped frames). The mobile block below gets the same
   "print develops as light arrives" read on the compositor instead, and deliberately does NOT
   touch `filter`, so .archival-img keeps its own grade throughout and the photo cannot
   colour-shift as it settles. */
@media (min-width:761px){
  .oa-js .photo-warm img{ filter:sepia(.45) saturate(.65) contrast(1.03) brightness(.78); transition:filter 1s cubic-bezier(.22,.61,.36,1) .15s; }
  .oa-js .photo-warm.in img{ filter:none; }
  .oa-js .photo-warm.in img.archival-img{ filter:sepia(.22) saturate(.92) contrast(1.03) brightness(.99); }
}
@media (max-width:760px){
  .oa-js .photo-warm img{ opacity:.5; transition:opacity .8s cubic-bezier(.22,.61,.36,1) .1s; }
  .oa-js .photo-warm.in img{ opacity:1; }
}

/* —— rule-draw: gold hairlines draw themselves in when their section kindles.
      Works on any element whose ::after is the hairline (e.g. .mw-era). */
.oa-js .rule-draw::after{ transform:scaleX(0); transform-origin:0 50%; }
.oa-js .rule-draw.in::after{ transition:transform 1.1s cubic-bezier(.22,.61,.36,1) .25s; transform:scaleX(1); }

/* —— slideshow captions: fade in after the slide settles, so two captions never
      ghost over each other mid-crossfade (visible on the Home hero's right corner). */
.oa-js .ss-slide .ss-cap{ opacity:0; transition:opacity .45s ease .35s; }
.oa-js .ss-slide.active .ss-cap{ opacity:1; }

/* —— hover grammar: photographs lift toward the light. Desktop pointers only;
      excluded inside the Legacy scrub track where inline transforms own the nodes. */
@media (hover:hover) and (pointer:fine){
  .oa-js .gallery .g-item{ transition:transform .25s ease, box-shadow .25s ease; }
  .oa-js .gallery .g-item:hover{ transform:translateY(-3px); box-shadow:var(--shadow-md); }
  .oa-js .mw-item .mw-frame{ transition:transform .25s ease, box-shadow .25s ease; }
  .oa-js .mw-item:hover .mw-frame{ transform:translateY(-4px); box-shadow:0 6px 16px rgba(0,0,0,.5), 0 44px 84px -44px rgba(0,0,0,.95); }
  .oa-js .topper-card{ transition:transform .25s ease, box-shadow .25s ease; }
  .oa-js .topper-card:hover{ transform:translateY(-3px); box-shadow:var(--shadow-md); }
  .oa-js .tl-track .gallery .g-item{ transition:none; }
  .oa-js .tl-track .gallery .g-item:hover{ transform:none; box-shadow:none; }
}

/* —— glint: a single light-sweep crosses gold buttons on hover (never loops). */
.oa-js .btn.accent{ position:relative; overflow:hidden; }
.oa-js .btn.accent::after{ content:""; position:absolute; top:0; bottom:0; left:0; width:34%; pointer-events:none;
  background:linear-gradient(90deg, transparent, rgba(255,255,255,.34), transparent);
  transform:skewX(-18deg) translateX(-160%); }
@media (hover:hover) and (pointer:fine){
  .oa-js .btn.accent:hover::after{ transition:transform .65s ease; transform:skewX(-18deg) translateX(400%); }
}

/* —— S2 · the light travels (Legacy): era markers flare as the orb ignites them,
      and the closing ∞ carries a slow living glow. */
.tl-motion .tl-mark .dot{ transition:box-shadow .6s ease; }
.tl-motion .tl-mark.lit .dot{ box-shadow:0 0 0 4px rgba(201,168,76,.16), 0 0 20px 5px rgba(255,190,90,.4); }
@keyframes oa-eternal{ 0%,100%{ text-shadow:0 0 14px rgba(255,190,90,.35); } 50%{ text-shadow:0 0 26px rgba(255,206,110,.7); } }
.oa-js .tl-coda-arc b{ animation:oa-eternal 5.5s ease-in-out infinite; }
@media (prefers-reduced-motion:reduce){
  .tl-coda-arc b{ animation:none !important; text-shadow:0 0 16px rgba(255,196,100,.45); }
}

/* ===== Chaptered justified photo wall (.mw-) =====
   Lifted verbatim from moments.html's inline <style> so Home can use the same
   approved pattern. Justification trick: .mw-item{flex:var(--ar) 1 0} makes every
   row height-match by aspect ratio. Built for a NAVY ground — use on .bg-navy only.
   moments.html keeps its inline copy; values are identical, so it simply re-declares. */
.mw-era{ display:flex; align-items:baseline; gap:14px; margin:clamp(44px,6vw,76px) 0 clamp(16px,2.4vw,26px); }
.mw-wall > .mw-era:first-child{ margin-top:clamp(28px,4vw,50px); }
.mw-era .era-yr{ font-family:var(--font-display); font-weight:600; color:var(--gold-light); font-size:clamp(19px,2vw,24px); letter-spacing:.01em; white-space:nowrap; }
.mw-era .era-t{ font-family:var(--font-ui); font-size:11px; font-weight:700; letter-spacing:.18em; text-transform:uppercase; color:var(--on-navy-soft); white-space:nowrap; }
.mw-era::after{ content:""; flex:1; height:1px; background:linear-gradient(90deg, rgba(201,168,76,.38), rgba(201,168,76,.04)); }
.mw-row{ display:flex; gap:clamp(14px,1.8vw,22px); align-items:flex-start; }
.mw-row + .mw-row{ margin-top:clamp(16px,2vw,24px); }
.mw-item{ margin:0; flex:var(--ar) 1 0; min-width:0; }
.mw-frame{ position:relative; border-radius:var(--r-md); overflow:hidden; background:#0c1424;
  border:1px solid rgba(201,168,76,.26); box-shadow:0 2px 10px rgba(0,0,0,.4), 0 30px 64px -40px rgba(0,0,0,.85); }
.mw-frame img{ display:block; width:100%; height:auto; aspect-ratio:var(--ar); }
.mw-frame::after{ content:""; position:absolute; inset:0; pointer-events:none; border-radius:inherit;
  background:radial-gradient(120% 100% at 50% 26%, transparent 58%, rgba(0,0,0,.32)); box-shadow:inset 0 1px 0 rgba(255,225,160,.08); }
.mw-cap{ margin:10px 2px 0; }
.mw-cap .mw-yr{ font-family:var(--font-ui); color:var(--gold-light); font-weight:700; font-size:10.5px; letter-spacing:.14em; text-transform:uppercase; margin-right:9px; }
.mw-cap b{ font-family:var(--font-display); font-weight:600; color:#fff; font-size:15px; letter-spacing:.01em; }
.mw-note{ display:block; font-family:var(--font-prose); color:var(--on-navy-soft); font-size:13px; line-height:1.5; margin-top:3px; max-width:56ch; }
/* prints develop across each row, left to right (pairs with the shared .photo-warm primitive) */
.oa-js .mw-row.photo-warm .mw-item:nth-child(2) img{ transition-delay:.32s; }
.oa-js .mw-row.photo-warm .mw-item:nth-child(3) img{ transition-delay:.5s; }
/* Stacked on a phone, a left-to-right stagger just makes the second and third photo look slow
   to load — they are one under the other, not beside each other. Halve it. */
@media (max-width:760px){
  .oa-js .mw-row.photo-warm .mw-item:nth-child(2) img{ transition-delay:.14s; }
  .oa-js .mw-row.photo-warm .mw-item:nth-child(3) img{ transition-delay:.24s; }
}
.mw-more{ text-align:center; margin-top:clamp(34px,5vw,56px); }
.mw-more a{ font-family:var(--font-ui); font-weight:600; font-size:14px; letter-spacing:.02em; color:var(--gold-light); text-decoration:none; }
.mw-more a:hover{ color:#fff; }
@media(max-width:760px){
  .mw-row{ flex-direction:column; gap:0; }
  .mw-row + .mw-row{ margin-top:0; }
  .mw-item{ margin:0 0 clamp(18px,4.5vw,26px); }
  .mw-era{ margin-top:clamp(30px,7vw,44px); }
}


/* ============================================================================
   Tap targets, focus contrast and label wrapping  (measured fixes)
   ---------------------------------------------------------------------------
   Backdrops were sampled in-browser and contrast computed against WCAG 1.4.11
   (3:1 for a focus indicator). --focus-ring defaults to --gold-dark, which is
   4.95:1 on --paper and 4.34:1 in the heritage zone. The components below sit
   on dark grounds where plain --gold is already 8.19:1, so they opt back in.
   ========================================================================== */

/* The slideshow dot's own backdrop IS gold when active, where a gold ring is
   1.00:1 (invisible) and gold-dark only 2.30:1 — both fail. Navy clears it. */

/* Slideshow dots were a 10x10 tap target. Keep the 10px dot, give it a
   32x44 hit area via ::after. Pitch (gap 22 + 10) == 32, so neighbouring hit
   areas tile exactly without overlapping onto the wrong dot. */
.ss-dots{ gap:22px; }
.ss-dot{ position:relative; }
.ss-dot::after{
  content:""; position:absolute; left:50%; top:50%;
  transform:translate(-50%,-50%);
  width:32px; height:44px;
}

/* The skip link measured 134x43 - one pixel under the thumb floor. */
.oa-skip{ min-height:44px; display:inline-flex; align-items:center; }

/* ---------------------------------------------------------------------------
   19 Sep 2026 — WCAG 2.5.8 Target Size (Minimum) sweep at 390px. Audited every
   page; the dots, arrows, rail and form controls already cleared 24x24. These
   five did not. Vertical padding on an INLINE link extends its hit box without
   moving the text, so none of this shifts layout. Where links stack, the line
   spacing is opened first so neighbouring hit areas meet but never overlap —
   an overlapping target is a mis-tap, which is worse than a small one.
   --------------------------------------------------------------------------- */

/* Footer "Privacy · Accessibility" measured 46x22 and 78x22 on all 9 pages. */
.footer-legal a{ padding-block:8px; }

/* Contact card values (phone, email) measured 132x22 / 268x22. The phone row
   stacks three numbers, so the line box is opened to 1.9 first: 30px hit areas
   inside 31px of line spacing. */
.visit-row .vr-v{ line-height:1.9; }
.visit-row .vr-v a{ padding-block:4px; }

/* Campus "See the full archive" was 152x17 — the smallest target on the site.
   It sits alone in a centred <p>, so it can take a full inline-block box. */
.mw-more a{ display:inline-block; padding:12px 10px; }

/* Admissions hero phone + WhatsApp links were 23px tall. Row gap goes to 12px
   so the pair cannot overlap when it wraps onto two lines. */
.hero-cta-secondary{ gap:12px 18px; }
.hero-cta-secondary a{ padding-block:5px; }

/* Alumni consent checkboxes rendered 13px wide (intrinsic size + width:auto). */
.form-card input[type="checkbox"]{ width:24px; height:24px; min-height:24px;
  flex:none; accent-color:var(--gold-dark); }

/* .btn is white-space:nowrap, which silently clipped two long CTAs off-screen
   on a 390px phone ("See the full picture on the Result...", "Download Fee
   Structure (PDF)"). Let labels wrap on small screens instead of truncating. */
@media(max-width:560px){
  .btn{ white-space:normal; }
}

/* Components that had no focus rule of their own fell back to currentColor,
   which measured 2.15:1 on paper. Same dual-tone ring as everything else. */
.brand:focus-visible, .g-item:focus-visible, .ph-slideshow:focus-visible,
.life-play:focus-visible, .life-arrow:focus-visible{
  outline:3px solid var(--gold); box-shadow:0 0 0 6px rgba(11,18,32,.55); outline-offset:2px;
}


/* ============================================================================
   Mega-menu panels
   ---------------------------------------------------------------------------
   Built on the existing <details>/<summary> disclosure, so the menu still opens
   with JavaScript disabled and keeps the focus + landmark behaviour above.
   Desktop styling is the DEFAULT (no min-width query) and the drawer overrides
   it inside max-width:980px - a min-width:981px pair would leave a fractional
   viewport (980.5px, common at browser zoom / Windows scaling) matching neither.
   Columns are a fixed count rather than auto-fill, so the panel cannot silently
   reflow to a different column count as the viewport changes.
   ========================================================================== */
.main-nav .nav-mega{
  display:grid; gap:2px; padding:10px;
  /* width:max-content is what makes the panel size to its columns. The base
     .nav-dd-panel is absolutely positioned with min-width:250px, so a grid
     using minmax(0,...) shrink-wrapped to that 250px and collapsed two columns
     to 113px each. A hard lower bound on each track plus max-content sizing
     keeps the copy on sensible line lengths. */
  width:max-content; max-width:calc(100vw - 24px);
  grid-template-columns:minmax(248px,300px);
}
.main-nav .nav-mega.nm-2{ grid-template-columns:repeat(2,minmax(232px,256px)); }
/* The panel is centre-anchored under its trigger, so a 536px two-column panel
   runs off the left edge on a narrow laptop (measured left:-22px at 981px).
   Below 1100px it becomes a single column, which fits. Harmless inside the
   drawer breakpoint too: the drawer lays the panel out with flex, where
   grid-template-columns has no effect. */
@media(max-width:1160px){
  .main-nav .nav-mega.nm-2{ grid-template-columns:minmax(248px,300px); }
}

.main-nav .nav-mega a{
  flex-direction:column; align-items:flex-start; gap:2px;
  white-space:normal; padding:10px 13px; min-height:44px; justify-content:center;
}
.main-nav .nav-mega .nm-t{
  display:inline-flex; align-items:center; gap:4px;
  font-size:14.5px; font-weight:600; line-height:1.25; color:var(--navy-deep);
}
.main-nav .nav-mega .nm-d{
  font-size:12.5px; font-weight:400; line-height:1.4; color:var(--text-soft);
}
.main-nav .nav-mega a:hover .nm-d,
.main-nav .nav-mega a:focus-visible .nm-d{ color:var(--text); }

@media(max-width:1160px){
  /* In the drawer the panel is a plain indented list on navy. */
  /* max-width:366px is a DESKTOP dropdown constraint that was never reset for the drawer, so
     submenu rows rendered 345px wide inside a 390px drawer while every top-level row ran the
     full width — the hairline dividers visibly stopped ~45px short of the right edge. */
  .main-nav .nav-mega{ display:flex; flex-direction:column; padding:0; gap:0;
    max-width:none; width:100%; }
  .main-nav .nav-mega a{
    padding:12px 28px 12px 46px; min-height:44px; border-radius:0;
    border-top:1px solid var(--rule-navy);
  }
  .main-nav .nav-mega .nm-t{ color:var(--on-navy); font-size:15px; }
  .main-nav .nav-mega .nm-d{ color:var(--on-navy-soft); font-size:12.5px; }
  body.chrome-light .main-nav .nav-mega a{ border-top:1px solid var(--rule); }
  body.chrome-light .main-nav .nav-mega .nm-t{ color:#33415C; }
  body.chrome-light .main-nav .nav-mega .nm-d{ color:var(--text-soft); }

  /* ---- DARK-DRAWER ACTIVE STATE ------------------------------------------------------
     Legacy, moments and through-the-years carry no .chrome-light, so their drawer is navy
     with light text. The base rules (:542-543) paint :hover / :focus-visible /
     [aria-current="page"] with background:var(--offwhite) and set color on the <a> — but
     .nm-t and .nm-d carry their OWN light colours, which do not inherit that navy. The
     current page's own row therefore rendered #F3EFE6 on #F5F0E8 = 1.02:1, invisible, with
     no hover needed: on Legacy "The Light Travels" was a blank cream band. :hover made it
     worse by dragging .nm-d to var(--text), dark-on-dark once the row went back to navy.
     A cream slab in a navy drawer was wrong anyway, so the active row stays navy and is
     marked with gold instead. ---------------------------------------------------------- */
  body:not(.chrome-light) .main-nav .nav-dd-panel a:hover,
  body:not(.chrome-light) .main-nav .nav-dd-panel a:focus-visible,
  body:not(.chrome-light) .main-nav .nav-dd-panel a[aria-current="page"]{
    background:rgba(201,168,76,.10); color:var(--on-navy);
    box-shadow:inset 3px 0 0 var(--gold); }
  body:not(.chrome-light) .main-nav .nav-mega a:hover .nm-t,
  body:not(.chrome-light) .main-nav .nav-mega a:focus-visible .nm-t,
  body:not(.chrome-light) .main-nav .nav-mega a[aria-current="page"] .nm-t{ color:var(--gold); }
  body:not(.chrome-light) .main-nav .nav-mega a:hover .nm-d,
  body:not(.chrome-light) .main-nav .nav-mega a:focus-visible .nm-d,
  body:not(.chrome-light) .main-nav .nav-mega a[aria-current="page"] .nm-d{ color:var(--on-navy-soft); }

  /* The drawer was max-height:70vh with overflow:hidden, so anything past 70vh
     was clipped and unreachable once a couple of sections were expanded.
     Scroll it instead, and keep the scroll from chaining to the page. */
  .main-nav.open{ max-height:78vh; overflow-y:auto; overscroll-behavior:contain;
                  -webkit-overflow-scrolling:touch; }
}


/* ---- Admissions: honest, class-by-class availability -----------------------
   Replaces a single vague "most classes are full" line. The real position is
   that Pre-KG to X almost never opens, while XI-XII has a genuine intake each
   year - which is more useful to a parent than a blanket "we are full", and
   sends the right people to the phone. Built from existing tokens; no new
   component system. */
.admit-avail{ margin:clamp(22px,3vw,30px) 0 0; border-top:1px solid var(--rule); text-align:left; }
/* The card sits in .wrap-narrow, so a label column would squeeze the copy to
   about five words a line. Stack the label instead and let the text run the
   full width of the card. */
.admit-avail-row{
  padding:clamp(15px,2.1vw,20px) 0; border-bottom:1px solid var(--rule);
}
.admit-avail-row .aa-k{
  display:block; margin-bottom:6px;
  font-size:12px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--gold-dark); font-weight:700;
}
.admit-avail-row .aa-v{ color:var(--text); font-size:16px; line-height:1.6; }
.admit-avail-row .aa-v strong{ color:var(--navy-deep); font-weight:650; }
.admit-act{ margin-top:clamp(18px,2.4vw,24px); font-size:15.5px; line-height:1.6; color:var(--text-soft); text-align:left; }
.admit-act a{ color:var(--gold-dark); font-weight:600; }



/* ---------------------------------------------------------------------------
   Founder chain — the branch
   The Principal and the Vice Principal serve at the SAME time. Listing them in
   sequence with an arrow between read as succession, one leading to the other,
   and both were labelled "Today". They are now a fork off the founder: one
   bracket, two people carrying it now, then on to the closing marker.
   ------------------------------------------------------------------------- */
.fc-pair{
  position:relative; flex:1 1 310px; max-width:370px;
  display:flex; flex-direction:column; justify-content:center; gap:14px;
}
.fc-pair:not(:last-child)::after{
  content:"\2192"; position:absolute; right:-19px; top:50%; transform:translateY(-50%);
  color:var(--gold-dark); font-size:19px; line-height:1;
}
/* the fork: a vertical bracket, with a stub reaching each of the two cards */
.fc-pair::before{
  content:""; position:absolute; left:-22px; top:25%; bottom:25%;
  width:2px; border-radius:2px; background:var(--gold-dark); opacity:.45;
}
.fc-node--sm::before{
  content:""; position:absolute; left:-22px; top:50%; width:22px; height:2px;
  border-radius:2px; background:var(--gold-dark); opacity:.45;
}
/* the founder feeds the bracket, so it loses its own arrow */
.fc-node--tofork::after{ display:none; }
/* contemporaries — never an arrow between the two paired cards */
.fc-pair .fc-node::after{ display:none; }

.fc-node--sm{
  flex:none; width:100%; max-width:none;
  flex-direction:row; align-items:center; text-align:left; gap:14px; padding:16px 18px;
}
.fc-node--sm .fc-ava{ width:58px; height:58px; margin-bottom:0; flex:none; }
.fc-node--sm .fc-name{ font-size:16px; }
.fc-txt{ display:flex; flex-direction:column; gap:3px; min-width:0; }

@media(max-width:900px){
  .fc-pair{ width:100%; max-width:360px; flex:none; }
  .fc-pair:not(:last-child)::after{
    content:"\2193"; right:auto; left:50%; top:auto; bottom:-21px; transform:translateX(-50%);
  }
  /* stacked layout: the horizontal fork would point at nothing */
  .fc-pair::before, .fc-node--sm::before{ display:none; }
  .fc-node--tofork::after{ display:block; }
}


/* ---------------------------------------------------------------------------
   "The family behind the school" — origin, continuation, conclusion
   Replaces the flat left-to-right chain. The old last card was the OA crest
   sitting in a row of people, so it read as a fourth person; the ending is now
   a typographic close instead of a card. The founder leads as the origin, the
   two who serve today sit side by side (contemporaries, not a sequence), and
   the section resolves into a statement.
   ------------------------------------------------------------------------- */

/* Centred, not two-column: the founder's own words live on Home and on
   /our-founder, so repeating them here was the third appearance. With the
   quote gone there is nothing to fill a second column, and the block now
   scales up the same shape as the two cards below it — portrait, era, name,
   role — which is what makes them read as one family rather than three
   unrelated treatments. */



.fam-close-crest{ width:52px; height:52px; opacity:.5; display:block; margin:0 auto; }   /* images are display:block globally, so text-align:center does not centre this */

@media(max-width:760px){
    }


/* The family tree carries no portraits.
   Every person named here already has a photograph earlier on this same page —
   the founder in the founder-film section, the Principal and Vice Principal in
   their notes directly above. Repeating all three turned the mobile page into
   five portraits in a row, two of them duplicates, and the founder image was
   the same photograph Home already uses. As a typographic coda the section
   summarises the line instead of re-illustrating it. */
@media(max-width:560px){
  }




/* ============================================================================
   The family behind the school — dressed in the site's own vocabulary
   ---------------------------------------------------------------------------
   The first pass stripped the portraits out (they duplicated photos already on
   this page) but left plain white boxes floating in space, which read as
   unfinished rather than restrained. This reuses what the rest of the site
   already does: the gold left-edge bar and hover lift from .legacy-card, the
   gold gradient hairlines and flame glyph of .section-divider, and the faint
   monogram watermark of .section-ornate.
   ========================================================================== */

/* the divider is the site's own, with a label beneath it */

/* same language as .legacy-card: gold spine, gold-tinted rule, lift on hover */

@media(prefers-reduced-motion:reduce){ .fam-person:hover{ transform:none; } }
@media(max-width:560px){
  }


/* ============================================================================
   The family behind the school — compact lineage chain
   ---------------------------------------------------------------------------
   The stacked version ran to ~800px for four names: founder, a divider, a pair
   of cards and a closing stanza, each separated by a clamp() gap. Read as one
   horizontal line instead, the same content sits in roughly a third of that,
   and the lineage is legible at a glance rather than scrolled through.
   Portraits stay out — every face here already appears earlier on this page.
   ========================================================================== */
.fam-chain{ margin-top:clamp(26px,3.4vw,40px); }
/* the gold spine from .legacy-card, so these read as the site's cards */
.fam-chain .fc-node{
  border:1px solid rgba(201,168,76,.28);
  box-shadow:0 10px 30px -22px rgba(11,18,32,.5);
  overflow:hidden;
  transition:transform .25s ease, border-color .25s ease, box-shadow .25s ease;
}
.fam-chain .fc-node::before{
  content:""; position:absolute; left:0; top:0; bottom:0; width:4px;
  background:linear-gradient(var(--gold), var(--gold-dark)); opacity:.9;
}
.fam-chain .fc-node:hover{
  transform:translateY(-3px); border-color:rgba(201,168,76,.6);
  box-shadow:0 18px 42px -24px rgba(11,18,32,.55);
}
/* the flame stands in for the founder's portrait */
.fam-chain .fc-flame{
  display:block; color:var(--gold-dark); margin-bottom:6px;
}
.fam-chain .fc-flame .oa-glyph{ width:1.6em; height:1.6em; font-size:23px; }
/* no avatars in this version, so the paired rows centre their own text */
.fam-chain .fc-node--sm{
  flex-direction:column; align-items:center; text-align:center; gap:3px; padding:18px 20px;
}
.fam-chain .fc-node--mark{ justify-content:center; }
.fam-chain .fc-ava--mark{
  width:54px; height:54px; margin-bottom:8px;
  background:var(--navy-deep); border:1.5px solid rgba(201,168,76,.5);
}
.fam-chain .fc-ava--mark img{ width:28px; height:28px; }

.fam-coda{
  font-family:var(--font-ui); font-size:14.5px; color:var(--text-soft);
  text-align:center; margin:clamp(24px,3vw,34px) 0 0;
}
@media(prefers-reduced-motion:reduce){ .fam-chain .fc-node:hover{ transform:none; } }

/* =====================================================================
   HOME · THEN & NOW — one horizontal frame, one photograph per slide, visitor-driven   (scoped: #then-now)
   15 Sep 2026: back to the single frame the owner preferred; slides run in then→today couples.
   EVERY slide sits whole on the navy mount, archival and modern alike, with its caption in the
   space BELOW the print. 19 Sep 2026, owner: "in before and after use the full bleed image of the
   historic image, you use different crops for present and then images ... or use uniform for both".
   He was right. The old rule gave .tn-print object-fit:contain and left modern photographs on
   object-fit:cover, so every couple was shown two different ways: the 1962-63 Class III plate sat
   whole, mount border and the "Swarn Photo Service" signature intact, while the class beside it
   was cropped top and bottom to fill 16/9. A then-and-now pair only works if the two halves are
   treated the same. Uniform contain was chosen over uniform cover because cover would have had to
   cut the printed borders and studio marks off the archival plates, which this site does not do.
   ===================================================================== */
#then-now .tn-show{ margin-top:clamp(26px,3.4vw,42px); }
#then-now .ss-stage{ aspect-ratio:16/9; background:var(--navy-deep); }
#then-now .ss-slide{ background:var(--navy-deep); }
#then-now .ss-slide img{ object-fit:contain; object-position:center; box-sizing:border-box;
  padding:clamp(12px,1.8vw,24px) clamp(12px,1.8vw,24px) clamp(78px,8vw,104px); }
#then-now .ss-cap{ background:none; }
/* THEN tags gold, TODAY tags white: the pairing reads from the label alone. */
#then-now .ss-slide:not(.tn-print) .ss-tag{ color:rgba(255,255,255,.86); }
#then-now .ss-cap .ss-title{ font-size:clamp(19px,2vw,26px); }
#then-now .tn-close{ margin-top:clamp(26px,3.2vw,40px); text-align:center;
  font-family:var(--font-display); font-size:clamp(19px,2vw,25px); color:var(--navy); }
@media(max-width:640px){
  #then-now .ss-stage{ aspect-ratio:5/4; }
  #then-now .ss-slide img{ padding:8px 8px 88px; }   /* room for a two-line title under the print */
  /* One rule, not two. Before the treatments were unified these were '.tn-print .ss-cap'
     (padding-top:10px) and '#then-now .ss-cap' (padding:34px 16px 14px); the first outranked
     the second on specificity. Now both are '#then-now .ss-cap' and the shorthand would just
     have overwritten the top value, so they are merged. 34px was clearance for a caption
     lying OVER a photograph; nothing lies over anything any more. */
  #then-now .ss-cap{ padding:10px 16px 14px; }
  #then-now .ss-cap .ss-tag{ font-size:10.5px; }
  #then-now .ss-cap .ss-title{ font-size:17px; margin-top:3px; }
  /* In-frame arrows would sit on faces at phone width, so they move to a control row under the
     frame, flanking the dots. The STAGE stops clipping and each SLIDE clips itself. */
  #then-now .tn-show{ margin-inline:-12px; }
  #then-now .ss-stage{ overflow:visible; }
  #then-now .ss-slide{ border-radius:inherit; overflow:hidden; }
  #then-now .ss-arrow{ top:auto; bottom:-60px; transform:none; width:44px; height:44px; box-shadow:none;
    background:var(--white); border:1px solid var(--rule-strong); }
  #then-now .ss-arrow:hover{ transform:none; }
  #then-now .ss-arrow.prev{ left:4px; } #then-now .ss-arrow.next{ right:4px; }
  #then-now .ss-dots{ margin-top:16px; min-height:44px; gap:12px; }   /* ten dots must fit between the two 44px arrows */
}
@media(max-width:380px){ #then-now .ss-dots{ gap:8px; } }

/* Long section intros on wide screens: heading left, intro beside it, instead of a 760px
   column of text with a third of the row left empty (owner review, 18 Sep 2026). */
@media(min-width:961px){
  /* four equal columns, no gap — the same grid the .wl-rail below uses, so the lede's left
     edge lands exactly on the rail's third cell instead of 28px short of it. */
  .section-head.split{ max-width:none; display:grid;
    grid-template-columns:repeat(4,minmax(0,1fr)); column-gap:0; align-items:start; }
  .section-head.split .kicker{ grid-column:1 / span 2; grid-row:1; padding-inline-end:clamp(36px,5vw,76px); }
  .section-head.split h2{ grid-column:1 / span 2; grid-row:2; margin-top:0; padding-inline-end:clamp(36px,5vw,76px); }
  .section-head.split .lede{ grid-column:3 / span 2; grid-row:1 / span 2; margin-top:6px; max-width:58ch; }
}

/* Two-item ledger (Vision and Mission): the three-column grid left a gaping empty third
   column, which read as an unfinished row (owner review, 18 Sep 2026). */
/* 19 Sep: capping it at 940px inside the 1200px wrap only MOVED the hole — the pair sat hard
   left with ~260px of empty paper on the right, under a centred heading. It has to be centred. */
.ledger.cols-2{ grid-template-columns:repeat(2,1fr); max-width:940px; margin-inline:auto; }
@media(max-width:760px){ .ledger.cols-2{ grid-template-columns:1fr; row-gap:clamp(22px,4vw,32px); } }


/* ---- Home founder note: the landscape archival photograph needs a wider frame than
   the portrait it replaced. Kept last in the file so it wins on source order. ---- */
.note-figure--wide{ max-width:500px; }
@media(max-width:840px){ .note-figure--wide{ max-width:460px; } }

/* ---- Campus "three wings": the ledger carries only three names, not paragraphs, so the
   default full-width 3-column grid left each name stranded at the left of a very wide
   column with ~290px of empty paper on the right. Centring the names in a narrower,
   centred grid puts them under the centred heading instead. ---- */
#wings .ledger.values{ max-width:900px; margin-inline:auto; }
#wings .ledger-col{ text-align:center; }
#wings .ledger.values .gold-rule{ margin-inline:auto; }
@media(max-width:760px){ #wings .ledger.values{ max-width:none; } }


/* =====================================================================
   19 Sep 2026 — mobile UI review follow-ups (typography / colour).
   Appended so they win on source order over the scoped rules above.
   ===================================================================== */

/* The dark-ground kicker retint is scoped to .bg-navy, and .flame-hall's stray .lede sits
   outside .section-head, so both fell back to tokens meant for LIGHT grounds:
   2.95:1 and 2.70:1 respectively. */
.flame-hall .lede{ color:var(--on-navy-soft); }

/* The lead zone's caption had no shadow while its h3 did. */
.z-cap p{ text-shadow:0 1px 8px rgba(0,0,0,.7); }

@media(max-width:560px){
  /* .16em tracking on 11.5px capitals inside a ~98px span-3 tile broke captions to 7 lines
     of ~7ch — the label stacked taller than the picture it labels. */
  .gallery .g-cap, figure.g-item .g-cap{ letter-spacing:.08em; }
  /* 1.1 leading is a display-line value; once the h1 wraps to three lines on a phone it is tight. */
  h1{ line-height:1.16; }
}

/* ---- Phone headings: .section-head h2 clamps to a 30px FLOOR, which in a 334px column is
   large enough that a long word forces its own line. "The same school, photographed more
   than six decades apart." broke to four centred lines with "photographed" and "apart."
   each alone — text-wrap:balance (set globally on h1-h4) cannot rescue a measure that tight.
   27px fits roughly four more characters per line, which is the difference between a
   one-word orphan and a whole phrase. ---- */
@media(max-width:560px){
  /* balance ALSO had to go here. It equalises line lengths, which on a four-line centred
     heading in a narrow column produced a short first line AND a one-word last line
     ("The same" / ... / "apart."). pretty fills each line greedily and only guards the
     final one, which is what a narrow measure actually needs. */
  .section-head h2{ font-size:27px; line-height:1.18; text-wrap:pretty; }
}

/* ---- Chapter rule on the moments/Campus wall (.mw-era) is a flex row:
   [year] [title] [hairline flex:1]. The title carried white-space:nowrap plus .18em
   tracking, so its min-content width WAS its full text width and it could not shrink —
   at 320px the row pushed the whole page to scrollWidth 352 (moments) and +2px (Campus).
   Letting the label wrap and easing the tracking lets the row fit; the hairline takes
   whatever is left, and vanishes rather than pushing the page wider. ---- */
@media(max-width:560px){
  .mw-era{ flex-wrap:wrap; row-gap:4px; }
  .mw-era .era-t{ white-space:normal; letter-spacing:.1em; min-width:0; }
}

/* =====================================================================
   PHONE HERO ACTION BLOCK + THE FACT REGISTER
   ---------------------------------------------------------------------
   Appended at the END of this file, so every rule wins on source order
   against the hero block at 2450-2500 and the heritage-strip block at
   403-421 without inventing specificity to do it.

   One rule governs what is scoped and what is not, because it is what
   keeps a one-screen fix from splitting a shared component in half:
   DELETIONS GO SITE-WIDE, ADDITIONS STAY LOCAL.
     - The gradient kill and the radius are written against .btn /
       .btn.accent with no page scope. `btn accent` appears 67 times
       across 19 pages; Home alone carries it again at the Admissions
       band (Home.html:540) on the SAME --navy-deep, on the same thumb
       flick. Flattening the hero and leaving a glossy slab three screens
       below would put the diagnosis and the disease in one document.
       A subtraction can never create that split, so it travels.
     - The incised keyline, the ruled secondary and the rhythm ARE scoped
       to .hero-cine. They are a composition for one screen, not a new
       component spec. book-lists.html carries twenty .btn.accent at
       phone width; an engraved rule on twenty of them is noise, not a
       plaque.

   TWO EARLIER BLOCKS ARE NOW INERT. Both lose on source order, so the
   patch is correct whether or not you remove them; removing is tidier.
   Do NOT delete by line number alone — the line above the 359px block
   closes a comment.
     (1) @media(max-width:359px){ .heritage-strip .wrap{ grid-template-columns:1fr } }
         It existed only to rescue a two-column GRID from two nowrap
         facts in a 264px column. There is no grid left, and the register
         below cannot overflow at any width — see the note on it.
     (2) inside @media(max-width:640px), the .btn.glass override that
         sets --btn-bd:rgba(201,168,76,.55). That hairline IS D2.
   ===================================================================== */

@media(max-width:640px){

  /* ---- D1 · THE GRADIENT IS DELETED, NOT SOFTENED --------------------
     --gold-grad is a three-stop vertical metal: #E6C868 lit at the top,
     #A9842F shaded at the foot. That is a lighting effect, and a
     lighting effect stretched down a 334x52 slab is the loudest 2010s
     tell on the screen. The fix is a subtraction, not a better gradient.

     It is also the only sub-AA pairing here. --navy-deep on the
     gradient's foot measures 4.44:1, under the 4.5 floor for the 16px
     label; on flat --gold it is 6.77:1 across the whole plate. So the
     deletion repairs contrast as well as art direction.

     The 1.5px --gold-deep rim goes with it — a darker gold outline round
     a gold fill is the bevel's shade side drawn by hand, and keeping it
     keeps the illusion the gradient was creating. Gold on navy is a
     6.77:1 jump; the plate does not need help being seen. This restores
     what this file's own BUTTONS header (line 286) has always declared:
     "Accent : solid gold, NAVY text (the approved gold pairing)".

     :hover is in the selector because a phone latches :hover after a
     tap. Without it, .btn.accent:hover (line 313) repaints --gold-grad-h
     on first touch and leaves it there for the rest of the session. */
  .btn.accent,
  .btn.accent:hover{
    background:var(--gold);
    background-image:none;   /* kills --gold-grad and --gold-grad-h outright */
    border:0;
    color:var(--navy-deep);
  }
  /* The glint (line 4644) is a 34%-wide white light-sweep pseudo-element
     over the same plate. Its animation is gated behind (hover:hover) and
     (pointer:fine), so it never runs on a real phone — but a <=640px
     desktop window with a mouse still sweeps white gloss across a plate
     whose entire point is that it is flat. Delete the box, not the
     animation: no specificity on the host can suppress a different box. */
  .oa-js .btn.accent::after{ display:none; }

  /* ---- D4 · RADIUS: ONE TOKEN UP -------------------------------------
     --r-sm is 4px. On a 52px full-width plate that is 7.7% of the
     height: visible enough to notice, too small to read as a decision,
     which is exactly the "unstyled rectangle" complaint. --r-md (8px) is
     15% and reads as chosen. Written against .btn rather than the hero
     so the phone never ends up with two radii on one component, and
     taken from the token set rather than invented — 0 would make these
     the only square buttons across 19 pages, which is not a fix but a
     different exception. */
  .btn{ border-radius:var(--r-md); }
}

/* A plate does not levitate, and iOS leaves :hover latched on the last
   thing tapped. .btn:hover lifts 2px on --shadow-md and .btn:hover .arrow
   shunts the arrow 4px right — after one tap both stick, so the primary
   sits permanently raised, shadowed and off-centre. That is the same
   cheapness as the gradient, arriving by accident. Scoped to (hover:none)
   so a real pointer keeps its feedback. */
@media(max-width:640px) and (hover:none){
  .btn:hover{ transform:none; box-shadow:none; }
  .btn:hover .arrow{ transform:none; }
  /* restated after, at equal specificity: the box-shadow:none above would
     otherwise take the dark separation halo with it on a tablet driving
     this page from a keyboard. */
  .btn:focus-visible{ box-shadow:0 0 0 6px rgba(11,18,32,.55); }
}

@media(max-width:640px){

  /* ---- D6 · RHYTHM: 30 / 24 / 45 -------------------------------------
     The block was 20 / 12 / 0 — one flat step twice and then nothing, so
     the lede, two controls and a fact strip read as one undifferentiated
     column. Three unequal and ascending intervals now say what belongs
     to what:
       lede -> plate            30px   a new zone begins
       plate -> ruled word      24px   subordinate sibling, held close
       word -> register         45px   and a full-bleed rule across it
     The 24px is 14px of row gap plus the secondary's own 10px of top
     padding, so 14px of that interval is genuinely dead: overshooting
     the admissions plate with a thumb cannot land on Results.
     .hc-copy is the last in-flow child on phones (.hero-links is
     display:none at line 2489, .ss-dots is absolutely positioned to the
     photo band), so its padding-bottom is what actually opens the last
     gap. Measured at 390px: plate top 631, word top 697, strip top 769. */
  .hero-cine .hero-ctas{ margin-top:30px; row-gap:14px; }
  .hero-cine .hc-copy{ padding-bottom:28px; }

  /* ---- D4 · THE PLATE, AND THE ONE ORNAMENT A PLAQUE HAS -------------
     Flat gold alone answers D1 but leaves D4 half done: a 334x52 field
     of one tone with an 8px corner is still a rectangle, just a better
     coloured one. What it is missing is the only ornament a real struck
     plate carries — an incised keyline set in from the edge.

     Two stacked insets do it: 5px of --gold (the field, invisible), then
     1px of --gold-deep. box-shadow renders an inset spread with a
     concentric inner radius, so the rule follows the 8px corner at 3px
     rather than cutting across it.

     --gold-deep was chosen by measurement, not taste. On flat --gold it
     is 1.53:1 — present, but not a second border. --gold-dark is 2.30:1
     and renders as exactly that: a dark olive frame inside the gold,
     which is the 2008 bevel D1 just deleted, arriving from the other
     direction. Rendered both at 390/2x before choosing.

     16px/700 and 52px: with the gradient and the rim gone, the fill and
     the type are what carry rank, so both go up one step.

     The label stays CENTRED, and that is a decision. The comment at line
     2469 argues for one shared 28px edge across the whole navy block,
     and the secondary and the register below both take it. A filled
     plate is an object rather than a line of type: what aligns is its
     EDGE, and its edge is on 28px. Flush-left lettering inside it would
     sit at 28+22 = 50px — a near-miss against the h1, the lede and the
     word below, which is precisely the kind of almost-lining-up the
     owner keeps catching. Centred is unmistakably its own axis.

     box-shadow is in .btn's 220ms transition and the hover lift is gone,
     so a 220ms press would be the only feedback left and it would lag.
     Re-timed to 100ms; the colour transitions keep .btn's own duration. */
  .hero-cine .hero-ctas .btn.accent{
    min-height:52px; padding:17px 22px; font-size:16px;
    box-shadow:inset 0 0 0 5px var(--gold),
               inset 0 0 0 6px var(--gold-deep);      /* the incised rule */
    transition:background .22s ease, color .22s ease,
               transform .22s ease, box-shadow .1s ease;
  }
  /* The keyline restated on :hover at (0,5,0). It beats both .btn:hover
     (0,2,0) in the block above and .btn:hover{box-shadow:var(--shadow-md)}
     at line 304, either of which would wipe the rule off a latched
     touch-hover. transform:none here as well as under (hover:none): a
     plate does not lift on a phone whatever the pointer claims to be. */
  .hero-cine .hero-ctas .btn.accent:hover{
    box-shadow:inset 0 0 0 5px var(--gold),
               inset 0 0 0 6px var(--gold-deep);
    transform:none;
  }
  /* Pressed = seated deeper. The FIELD colour does not move, so contrast
     does not move either; only the incision darkens and takes a faint
     inner shade. Darkening the fill to --gold-deep would drop the navy
     label to 4.44:1, under AA — which is the same trap D1 came out of. */
  .hero-cine .hero-ctas .btn.accent:active{
    box-shadow:inset 0 0 0 5px var(--gold),
               inset 0 0 0 6px var(--gold-dark),
               inset 0 0 14px rgba(136,103,21,.30);
  }

  /* ---- D2 + D3 · THE SECONDARY STOPS BEING A BOX ---------------------
     D2 and D3 are one defect with two symptoms. A gold hairline drawn
     round 334x48 of flat navy is a container, not a control — the eye
     reads the void before the label. And two full-width slabs of equal
     footprint read as two primaries whatever their fills are doing. Both
     end the moment there is no second box, so the box is deleted rather
     than lightened: background, border, radius, blur, shadow, padding.

     What is left is the label and a 1px gold rule under the words. That
     is not a new idiom — .ledger-leads a (line 4470) and .visit-row
     .vr-v a (line 1013) are both a link with a gold hairline under it,
     and the type is lifted off .hero-cta-secondary a (line 1632): Inter
     600, sentence case. No caps: not one .btn in this file is uppercase,
     and in this sheet tracked caps is the LABEL register (.kicker,
     .stat-label, .ss-tag) — things you read, not things you tap.

     Footprints are now 334x52 of solid fill against ~80x17 of type.
     That is a difference you can still see with the page upside down,
     which is the test fill-vs-outline was failing.

     The tap target is NOT reduced. The row keeps width:100% from line
     2488 and min-height:44px, so the hit area stays ~334x44 at 390px;
     only the paint is gone. padding:10px 0 0 puts the label at the TOP
     of that row, so the ~17px of invisible target sits BELOW the words,
     away from the admissions plate, instead of between the two controls.

     Flush left at the 28px gutter, on the same edge as the h1, the lede,
     the plate's box and the register.

     display:block, not the inherited inline-flex: a grid item is
     blockified anyway, and text-decoration painting into an anonymous
     flex item is the one case WebKit has historically got wrong. A block
     has no such doubt.

     The class stays "btn glass" because on DESKTOP this element is still
     a glass button and the desktop is out of scope. Below 640px it is a
     ruled word. That is the same responsive-override idiom the rest of
     this media query already uses. */
  .hero-cine .hero-ctas .btn.glass{
    display:block; overflow:visible;
    width:100%; min-height:44px; padding:10px 0 0;
    background:none; border:0; border-radius:0; box-shadow:none;
    -webkit-backdrop-filter:none; backdrop-filter:none;
    text-align:left;
    font-family:var(--font-ui); font-size:14px; font-weight:600; letter-spacing:.01em;
    color:var(--on-navy);                    /* 13.5:1 on --navy-deep */
    text-decoration:underline;
    text-decoration-color:var(--gold);
    text-decoration-thickness:1px;
    text-underline-offset:5px;               /* the sheet's other offsets are 2-3px */
  }
  /* Home.html's own inline <style> (lines 129-134) gives .btn.ghost and
     .btn.glass an ::after sheen — a skewed gold bar looping every 5.5s.
     Harmless behind a frosted box; across a bare ruled word it is a gold
     bar sliding through the type forever. This selector is (0,4,1) and
     outranks it. */
  .hero-cine .hero-ctas .btn.glass::after{ display:none; }
  /* .btn.glass:hover (line 326) sets background, colour and border-color
     as real properties, so it latches on iOS after a tap and would put a
     frosted panel back under the word. Pinned, with the lift killed. */
  .hero-cine .hero-ctas .btn.glass:hover{
    background:none; border:0; color:var(--on-navy);
    transform:none; box-shadow:none;
  }
  /* Press: the word and its rule brighten together. --gold-light on
     --navy-deep is 9.44:1, so contrast goes UP, not down. */
  .hero-cine .hero-ctas .btn.glass:active{
    color:var(--gold-light); text-decoration-color:var(--gold-light);
  }

  /* Every box-shadow declaration above out-specifies .btn:focus-visible
     (line 307, specificity 0,2,0) and would silently drop the dark
     separation halo that keeps the gold outline legible where it crosses
     the gold plate. Restated LAST, at (0,5,0), so the :hover pins above
     cannot beat it either — and with the keyline carried through, since
     a plain box-shadow here would erase the incision on focus.
     outline and outline-offset are deliberately untouched: the ring is
     drawn 3px OUTSIDE the plate, on navy, where gold reads 6.77:1.
     Recolouring it to navy would make it invisible. */
  .hero-cine .hero-ctas .btn.accent:focus-visible{
    box-shadow:inset 0 0 0 5px var(--gold),
               inset 0 0 0 6px var(--gold-deep),
               0 0 0 6px rgba(11,18,32,.55);
  }
  .hero-cine .hero-ctas .btn.glass:focus-visible{
    box-shadow:0 0 0 6px rgba(11,18,32,.55);
  }

  /* ---- D6 · THE BOUNDARY IS DRAWN, NOT SPACED ------------------------
     .hero-cine is background:var(--navy-deep) (line 2399) and so is
     .heritage-strip (line 390) — the identical hex. The strip never read
     as a separate band because there was never an edge between them,
     only a gap. It already closes on border-bottom:1px rgba(201,168,76,.35);
     give it the matching top edge and the band is bracketed by the same
     hairline at both ends. One existing value, no new ornament, and a
     full-bleed rule against column-width content is what says "a
     different kind of thing" in a way more whitespace cannot. */
  .heritage-strip{ border-top:1px solid rgba(201,168,76,.35); }

  /* ---- D5 · THE REGISTER: ONE AXIS, ONE INTERVAL ---------------------
     grid-template-columns:repeat(2,auto) sizes each track to the widest
     cell in it, so column 2 began wherever column 1's longest fact
     happened to stop. Measured at 390px, that put the gap between the
     ink of one fact and the start of the next at 106.6px on row 1
     ("Since 1960" is 68.4px wide) and 56.3px on row 2 ("JKBOSE
     affiliated" is 118.7px). TWO DIFFERENT HOLES, one above the other.
     That is the whole of "a table that lost its rules", and it is also
     the owner's standing complaint about things not lining up.

     No column value fixes it, because the defect is that four facts of
     four different lengths were being forced into columns at all.
     minmax(0,1fr) pins the tracks but leaves the same holes (91px and
     56px); space-between pins both gutters and opens the holes wider
     still (110px at 390, 280px at the 560 bound). So the columns go.

     Left-packed flex is the answer, and it needs nothing invented: the
     facts stay nowrap (line 402, "one fact = one unbreakable flex item")
     and the ★ separators — the house ornament, deleted on phones when
     the grid arrived — come back to do the job the cell boundary was
     doing. Every interval between facts is now identical: 9px, the star,
     9px = 29.6px, on BOTH lines, at every width. One left axis at 28px,
     one repeating interval, a natural text rag on the right. Nothing is
     left that can fail to line up.

     The break is FORCED, not hoped for. The comment at 404-407 is right
     that free flex gave a dangling ★ at the end of line one and an
     orphan on line two — and that is exactly what happens at 561-640px,
     where all four facts nearly fit one line. The MIDDLE star is made a
     zero-height flex:0 0 100% item, so it both breaks the line after
     fact two at every width and draws the hairline between the two
     entries. It is the 4th child of .wrap (facts are 1,3,5,7), it is
     already aria-hidden, and .heritage-strip appears in Home.html only.
     >>> If a fifth fact is ever added to Home.html, re-check this index.

     OVERFLOW IS NOW STRUCTURAL, NOT ARITHMETIC. flex-wrap means a row
     that does not fit wraps instead of pushing the page wider, and the
     longest single fact is 154px against the 264px a 320px viewport
     offers, so no item can overflow on its own. Measured at 320px: row 1
     runs 28 -> 280 and row 2 runs 28 -> 271.9, inside a column that ends
     at 292. That is what retires the 359px fallback. */
  .heritage-strip .wrap{
    display:flex; flex-wrap:wrap;
    justify-content:flex-start; align-items:center;
    gap:0 9px; min-height:0; padding-block:11px;
    font-size:10px; line-height:1.45; letter-spacing:.12em;
  }
  /* restated so the grid block at 411 and the 359px block at 419 can both
     be deleted without silently changing anything here. */
  .heritage-strip .hs-i{ white-space:nowrap; }
  /* The base .sep is gold at opacity .7, tuned for an 11px star on the
     desktop line. At 10px that same .7 composites to a muddy olive and
     reads as a smudge rather than an ornament — rendered .55 / .7 / 1 at
     390px/1x side by side to check. Full gold it is, which also puts the
     star on exactly the same value as .heritage-strip strong, so the
     register is gold marks punctuating ivory labels and nothing else.
     Raising it to 1 also lets the divider below inherit its opacity
     instead of restating it. */
  .heritage-strip .sep{ display:inline; opacity:1; }
  /* The MIDDLE star is the line break AND the divider: one element doing
     two jobs, no new markup. .30 over --navy-deep composites to #4C4C43
     = 1.78:1 — the register the gold hairlines on navy already use in
     this sheet (.legacy-statline at .30, .oa-announce at .32), and
     visibly stronger than the .20 at which a 1px rule disappears.
     Note the two rule WIDTHS are doing the talking: the band's own
     hairlines are full-bleed and say "a different kind of thing"; this
     one stops at the content column and says "same thing, next entry". */
  .heritage-strip .sep:nth-child(4){
    flex:0 0 100%;
    height:0; font-size:0; line-height:0; overflow:hidden;
    margin:7px 0;
    border-top:1px solid rgba(201,168,76,.30);
  }
}

/* =====================================================================
   THEN & NOW (.thennow) — two defects visible only in the ENDED state,
   which is why neither showed up in a page-load audit: at load the
   replay pill carries [hidden] and the caption is invisible.
   ===================================================================== */

/* 1 · CAPTION / REPLAY COLLISION.
   .tn-overlay is inset:0 and centres its text in the WHOLE panel, while
   .tn-replay is pinned right:16px bottom:16px. On one line they clear
   each other; "The gate, then and today." wraps to two on a phone, and
   the second line lands on the pill — measured 147x35px of overlap on
   About at 390px. Reserving the pill's lane at the foot of the overlay
   re-centres the caption in what is actually left, so it cannot reach
   the control however many lines it takes. Only the states that show
   the pill pay the cost. */
.thennow.tn-ended .tn-overlay,
.thennow.tn-paused .tn-overlay{ padding-bottom:76px; }

/* 2 · THE MISSING EDGE.
   .thennow--bleed drops the base border (1416-1418) because a full-bleed
   panel would hang its left and right edges off the viewport. True — but
   it threw away the horizontal edges with them, so the video butts
   straight into the cream below and the navy above with nothing to say
   where it ends. Put back only the two that have somewhere to sit. Gold
   hairline rather than --rule-strong, which disappears against navy. */
.thennow.thennow--bleed{
  border-block:1px solid rgba(201,168,76,.28);
  border-inline:0;
}

/* =====================================================================
   ADMISSIONS HERO SCRIM — 19 Sep 2026.
   The shared .page-hero.has-slideshow scrim runs rgba(22,36,63,.94) at the
   left and .80 at 46%, so more than half of every hero photograph sits
   under near-opaque navy. That is survivable when the photograph is only a
   texture. It was not survivable here: this hero was chosen FOR what is in
   it (a teacher across a table from two parents), and the old scrim erased
   exactly the part that carries the meaning. Lightened until the subject
   reads, and no further. The h1 and kicker already carry their own
   text-shadow (oa-system.css:1251, :2432), which is what holds legibility
   once the wash comes off.
   Academics was the other half of this rule until its hero became a framed
   plate with the copy on flat navy beside it (see "Academics hero" above).
   With no type over the photograph there is nothing for a scrim to rescue,
   so it was dropped from these selectors rather than left inert.
   ===================================================================== */
.page-hero.has-slideshow.adm-hero .ph-slideshow::after{
  background:linear-gradient(90deg, rgba(22,36,63,.93) 0%, rgba(22,36,63,.72) 40%, rgba(22,36,63,.30) 70%, rgba(22,36,63,.06) 100%),
             linear-gradient(0deg, rgba(22,36,63,.70) 0%, rgba(22,36,63,0) 40%); }
/* The kicker is 12px/600, so it needs 4.5:1 and cannot lean on its text-shadow, which WCAG
   gives no credit for. At --gold on the lightened scrim it measured 2.57:1 over this
   photograph. --gold-light plus the slightly firmer left stop above clears it, and the
   photograph is still legible, which the old .94/.80 wash did not manage. */
.page-hero.has-slideshow.adm-hero .kicker{ color:var(--gold-light); }
@media(max-width:760px){
  /* On phones the copy sits BELOW the photo band, so the wash over the
     picture itself can come almost all the way off. */
  .page-hero.has-slideshow.adm-hero .ph-slideshow::after{
    background:linear-gradient(0deg, var(--navy) 0%, rgba(22,36,63,.58) 7%, rgba(22,36,63,.18) 22%, rgba(22,36,63,.04) 48%, rgba(22,36,63,0) 78%); }
}

/* Academic journey, stage 02: the middle-school subject list is the one checkable academic
   fact in that section, so it stays, but as a list set quieter than the stage sentence above
   it rather than as a second paragraph competing with it. */
.jb-node .jb-subjects{ margin-top:10px; font-family:var(--font-ui); font-size:13px;
  line-height:1.55; color:var(--text-muted); }
.bg-navy .jb-node .jb-subjects, .on-dark .jb-node .jb-subjects{ color:var(--on-navy-soft); }

/* Senior-school pathways: the school's own 2026-27 sheet sets each stream as FIVE subject
   groups, not four subjects. Groups I to III are compulsory and stay in .path-subs; the
   elective groups are a different kind of fact and get their own quieter list, so a parent
   can see at a glance what is fixed and what is a choice. Editorial rows and hairlines, not
   cards. .path-combos carries the five permitted Humanities combinations, which genuinely
   are a numbered set and must not be flattened into one line. */
.path-choice{ list-style:none; margin:10px 0 0; padding:0; display:flex; flex-direction:column; gap:5px; }
.path-choice li{ font-family:var(--font-ui); font-size:13.5px; line-height:1.5; color:var(--on-navy-soft); }
.path-choice .pc-k{ font-size:10.5px; font-weight:700; letter-spacing:.14em; text-transform:uppercase;
  color:var(--gold); margin-right:8px; }
.path-combos{ margin:10px 0 0; padding-left:1.15em; display:flex; flex-direction:column; gap:4px; }
.path-combos li{ font-family:var(--font-ui); font-size:13.5px; line-height:1.5; color:var(--on-navy-soft); }
.path-choice em, .path-combos em{ font-style:italic; color:var(--gold-light); }

/* =====================================================================
   ADMISSION NOTICE — the once-per-visit dialog (content/admission-notice.json)
   ---------------------------------------------------------------------
   20 Sep 2026. The owner saw a rival school's landing popup (a red JPEG
   flyer in a lightbox, starburst, "Apply Now!") and asked for something
   that builds scarcity "like Rolex does with their watches".
   Rolex scarcity is understatement: no advertising of availability, no
   urgency graphics, a waiting list rather than a grab. So this is the
   opposite of the flyer it was inspired by. It is TEXT, in the house
   paper-and-navy, stating the true position once and then getting out of
   the way. Text also means it is readable by a screen reader, selectable,
   translatable and editable by the office, none of which a JPEG is.
   Scale: the panel is small and centred rather than full-bleed, and it
   waits ~2.6s rather than firing on arrival, which keeps it out of the
   worst of Google's intrusive-interstitial territory on phones.
   z-index 150 sits above the Roshni nudge (115) and panel (120) and above
   both lightboxes (130/140): it is modal and is gone before anything else
   can open. The skip link at 200 deliberately stays above it.
   ===================================================================== */
.adm-notice{ position:fixed; inset:0; z-index:150; display:grid; place-items:center;
  padding:20px; opacity:0; pointer-events:none; transition:opacity .34s ease; }
.adm-notice.on{ opacity:1; pointer-events:auto; }
.adm-notice::before{ content:""; position:absolute; inset:0; background:rgba(11,18,36,.72);
  -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px); }
.adm-card{ position:relative; width:min(460px,100%); background:var(--paper,#F1E9D5);
  border:1px solid rgba(201,168,76,.55); border-radius:var(--r-lg);
  box-shadow:0 40px 90px -36px rgba(0,0,0,.75); padding:clamp(26px,4vw,38px);
  text-align:center; transform:translateY(10px) scale(.985); transition:transform .34s ease; }
.adm-notice.on .adm-card{ transform:none; }
/* The card is given tabindex="-1" and focused by script so a screen reader starts at the
   heading. Nobody TABBED to it, so the browser default ring on the panel is noise; the
   controls inside it keep their own focus rings, which are the ones a keyboard user needs. */
.adm-card:focus{ outline:none; }
/* 92px (owner, 20 Sep: "logo is too small"). This is the full crest, carrying 'ESTD. 1960'
   and the 'LIGHT TO ENLIGHTEN' ribbon, so it needs room: below about 60px that lettering is
   mush, and at 64px the owner still read it as an afterthought. It is served from
   oa-crest-notice.png, a 420x260 cut of the 1080px master - oa-crest-header.png is only
   274 wide and would start to soften past ~91px on a 3x screen. Full opacity. */
.adm-card .adm-crest{ width:92px; height:auto; margin:0 auto 18px; display:block; }
.adm-card .adm-kicker{ display:block; font-family:var(--font-ui); font-size:11px; font-weight:700;
  letter-spacing:.17em; text-transform:uppercase; color:var(--gold-dark); }
.adm-card h2{ font-family:var(--font-display); font-size:clamp(23px,3vw,29px); line-height:1.16;
  color:var(--navy-deep); margin:12px 0 0; letter-spacing:-0.01em; }
.adm-card .adm-body{ margin:12px 0 0; font-size:15px; line-height:1.66; color:var(--text-soft); }
.adm-card .adm-note{ margin:14px 0 0; font-family:var(--font-ui); font-size:12.5px; line-height:1.6;
  color:var(--text-muted); }
.adm-card .adm-rule{ width:38px; height:1px; margin:18px auto 0; background:rgba(201,168,76,.6); }
.adm-acts{ margin-top:20px; display:flex; flex-direction:column; gap:10px; align-items:stretch; }
.adm-acts .btn{ width:100%; justify-content:center; }
.adm-later{ background:none; border:0; cursor:pointer; font-family:var(--font-ui); font-size:13px;
  color:var(--text-muted); padding:9px; border-radius:var(--r-sm); }
.adm-later:hover{ color:var(--navy-deep); }
/* The X is a real 44x44 button, not a 12px glyph: this is the control most people reach for. */
.adm-close{ position:absolute; top:6px; right:6px; width:44px; height:44px; display:grid;
  place-items:center; background:none; border:0; cursor:pointer; color:var(--text-muted);
  font-size:20px; line-height:1; border-radius:var(--r-sm); }
.adm-close:hover{ color:var(--navy-deep); }
@media(max-width:420px){ .adm-card{ padding:26px 20px 22px; } .adm-card h2{ font-size:21px; } }
@media(prefers-reduced-motion:reduce){
  .adm-notice, .adm-card{ transition:none; }
  .adm-card{ transform:none; }
}


/* =====================================================================
   ROTATING OUTCOME CARDS (Home .ax-card, Results + Alumni .ow-card)
   Slides are stacked in one grid cell so the card never changes height;
   oa-ax-rotator.js turns them over. Owner, 24 Sep 2026.
   ===================================================================== */
.ax-slides{display:grid}
.ax-slide{grid-area:1/1;opacity:0;visibility:hidden;transition:opacity .7s ease,visibility 0s linear .7s}
.ax-slide.is-active{opacity:1;visibility:visible;transition:opacity .7s ease,visibility 0s}
.ax-dots:empty{display:none}
.ax-dots{display:flex;flex-wrap:wrap;gap:4px;margin-top:14px}
.ax-dot{width:24px;height:24px;padding:0;border:0;background:none;cursor:pointer;position:relative}
.ax-dot::before{content:"";position:absolute;left:50%;top:50%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;background:rgba(232,200,122,.35);transition:background .3s,transform .3s}
.ax-dot.is-active::before{background:var(--gold-light,#e8c87a);transform:scale(1.25)}
.ax-dot:focus-visible{outline:2px solid var(--gold-light,#e8c87a);outline-offset:2px;border-radius:50%}
@media (prefers-reduced-motion:reduce){.ax-slide,.ax-slide.is-active{transition:none}}
.ow-card{ background:var(--navy); color:var(--white); border-radius:16px; padding:clamp(24px,3.4vw,40px);
  display:grid; grid-template-columns:minmax(0,1.15fr) minmax(0,1fr); gap:clamp(22px,3.6vw,48px); align-items:center;
  box-shadow:inset 0 0 0 1px rgba(201,168,76,.28), 0 24px 54px -32px rgba(10,17,40,.7); }
.bg-navy .ow-card{ background:rgba(255,255,255,.04); }
.ow-card .kicker{ margin:0 0 12px; }
.ow-inst{ display:block; font:700 clamp(32px,5vw,56px)/1.02 var(--font-display); color:var(--gold-light,#e8c87a); }
.ow-name{ display:block; margin-top:12px; font-weight:600; font-size:clamp(17px,2vw,21px); color:#fff; }
.ow-meta{ display:block; margin-top:4px; font-family:var(--font-ui); font-size:13.5px; color:rgba(255,255,255,.72); }
.ow-side p{ margin:0 0 16px; color:rgba(255,255,255,.86); font-size:clamp(15px,1.6vw,17px); line-height:1.6; }
.ow-card .tlink{ color:#fff; }
@media(max-width:760px){ .ow-card{ grid-template-columns:1fr; } }
.ow-colleges{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:clamp(12px,1.6vw,18px); margin-top:clamp(22px,3vw,32px); }
.ow-college{ background:#fff; border:1px solid var(--rule-strong); border-radius:14px; padding:clamp(16px,1.8vw,22px); }
.ow-college b{ display:block; font:600 clamp(19px,2vw,23px)/1.2 var(--font-display); color:var(--navy); }
.ow-college span{ display:block; margin-top:6px; font-family:var(--font-ui); font-size:13.5px; color:var(--text-soft); }
@media(max-width:900px){ .ow-colleges{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media(max-width:520px){ .ow-colleges{ grid-template-columns:1fr; } }

/* =====================================================================
   TYPE SYSTEM (council verdict, 25 Sep 2026): the Home page's treatment,
   made the rule for every page.
     Spectral       headings only, always upright; a gold accent is colour, never italic
     Inter          everything a parent reads or scans: ledes, body, lists, captions,
                    FAQ answers, the stream guide
     Source Serif 4 letters and real quotations only; italic only inside quotations
   Sizes follow Home: section h2 up to 54px, inner-page h1 up to 60px.
   Letters, quotes, archival captions and Hindi/Urdu text are deliberately untouched.
   ===================================================================== */
:root{
  --t-h1-inner: clamp(36px, 4.2vw, 60px);
  --t-h2: clamp(32px, 4.3vw, 54px);      /* = Home's .hs-head h2 */
  --t-h3: clamp(21px, 1.8vw, 26px);
  --t-lede: clamp(16.5px, 1.35vw, 19px);
}
:is(h1,h2,h3,h4) :is(em,i){ font-style:normal; }
.hero h1 em, .page-hero h1 em, .hero-cine h1 em{ font-style:normal; }
.faq-a{ font-family:var(--font-ui); }
.sfq-fallback, .sfq-intro-lede, .sfq-why{ font-family:var(--font-ui); }
.sfq-note{ font-family:var(--font-ui); font-style:normal; }

/* Photo heroes: the copy layer lets clicks through to the carousel behind it, which also
   switched off every link and button in the copy (Admissions, About, Alumni, Contact,
   Results). Controls take clicks again; the empty space still passes them through. */
.page-hero.has-slideshow .page-hero-inner :is(a, button, input, select, textarea, label, summary){ pointer-events:auto; }

/* Photo protection (owner, 25 Sep 2026): no long-press "Save image" callout on iPhone, no drag-out.
   Pairs with the contextmenu/dragstart guard at the end of oa-system.js. */
img, video, picture, .ss-slide, .g-item, .lg-photo, .mw-frame, .orl-screen, .thennow{ -webkit-touch-callout:none; -webkit-user-drag:none; }
img{ -webkit-user-select:none; user-select:none; }

/* Scroll progress (owner, 25 Sep 2026): a thin gold line across the very top of the window. */
.oa-progress{ position:fixed; top:0; left:0; right:0; height:3px; z-index:2000; pointer-events:none;
  transform:scaleX(0); transform-origin:0 50%; will-change:transform;
  background:linear-gradient(90deg, #B8892A 0%, #E7BD5A 55%, #F4D98E 100%);
  box-shadow:0 0 10px rgba(231,189,90,.5); }
@media print{ .oa-progress{ display:none; } }

/* =====================================================================
   PRE-LAUNCH AUDIT FIXES (25 Sep 2026). Found by a WebKit crawl of every page at 390 and
   1440 plus a visual review of each screen. Page-specific fixes live with their page.
   ===================================================================== */
/* Safari drew every <select> as a short grey native pill beside the 48px text fields
   (Admissions enquiry, Alumni, moments). Draw our own control and chevron. */
.field select{ -webkit-appearance:none; -moz-appearance:none; appearance:none; padding-right:42px; cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%231B2A4A' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 16px center; background-size:12px 8px; }
/* Stretched buttons (book lists, phone CTAs) kept their label hard against the left edge. */
.btn{ justify-content:center; }
/* The padded Privacy · Accessibility links sat lower than the copyright line. */
.footer-bottom{ align-items:center; }
/* Sessions, years and phone numbers never split across lines ("2027-" / "28"). */
.nw{ white-space:nowrap; }
/* Through the Years: the hint shrank to half the screen and wrapped to three lines on phones. */
.tty-hint{ width:max-content; max-width:calc(100% - 32px); text-align:center; }
.tty-hint .h-touch{ display:none; }
@media (hover:none){ .tty-hint .h-touch{ display:inline; } .tty-hint .h-mouse{ display:none; } }
/* Privacy and Accessibility: Inter body text (Source Serif is for letters and quotes), a small
   upright "Last updated" line, and headings that sit with their own paragraph. */
.prose-legal p.lead{ font-family:var(--font-ui); font-style:normal; font-size:14px; line-height:1.5; color:var(--text-muted); }
.prose-legal h2{ margin:clamp(34px,4vw,48px) 0 12px; }
/* Faculty: the page title had no size rule and touched the paragraph under it. */
.flame-hero .section-head h1{ font-size:var(--t-h1-inner); font-weight:600; line-height:1.08; margin:10px 0 16px; }
/* About: the founder-film heading and the Light Travels doorway fell back to the browser size. */
.founder-film .ff-copy h2{ font-size:var(--t-h2); margin-top:14px; }
.doorway .dw-frame h2{ font-size:clamp(28px,3.4vw,44px); }
/* Alumni legacy cards: the role gets its own line, so no line begins with a separator dot.
   The dot stays in the markup for the pop-up, which shows role and detail on one line. */
.legacy-info .lg-outcome .role{ display:block; }
.legacy-info .lg-outcome .lg-sep{ display:none; }
/* Alumni investiture banner cut the back row off at the forehead. */
.al-strip{ object-position:center 6%; }
/* Alumni form: a styled file picker and navy checkboxes instead of raw browser controls. */
.field input[type=file]{ padding:10px 12px; font-size:14px; }
.field input[type=file]::file-selector-button{ font:600 14px/1 var(--font-ui); color:var(--navy); background:var(--white);
  border:1.5px solid var(--navy); border-radius:var(--r-sm); padding:9px 14px; margin-right:12px; cursor:pointer; }
input[type=checkbox]{ accent-color:var(--navy); }
/* 404: fill the screen so no cream strip shows under the short footer. */
.page-404{ min-height:100vh; min-height:100dvh; display:flex; flex-direction:column; }
.page-404 main{ flex:1; display:flex; flex-direction:column; }
.page-404 main > .section{ flex:1; }
/* Faculty on phones: long subject pills wrapped to two lines and made paired cards uneven. */
@media (max-width:560px){
  .fac2-subj{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:100%; font-size:10px; letter-spacing:.06em; }
}

/* =====================================================================
   AFTER CLASS XII, WITH PHOTOGRAPHS (owner, 26 Sep 2026). Results #after-xii shows all the
   students at once (.wn-grid, photos first); the Alumni rotating card (.ow-card) now carries
   each student's photograph, or their initials on a navy plate when there is none yet.
   ===================================================================== */
.ow-id{ display:grid; grid-template-columns:auto minmax(0,1fr); gap:clamp(16px,2vw,24px); align-items:center; }
.ow-photo{ display:block; width:clamp(78px,8vw,104px); aspect-ratio:4/5; border-radius:8px; overflow:hidden;
  border:1px solid rgba(231,189,90,.45); background:#0c1424; box-shadow:0 14px 28px -18px rgba(0,0,0,.7); }
.ow-photo, .wn-photo{ position:relative; }
.ow-photo img, .wn-photo img{ position:absolute; inset:0; display:block; width:100%; height:100%; max-width:none; object-fit:cover; }
.ow-photo.ow-photo--initials, .wn-photo.wn-photo--initials{ display:grid; place-items:center; background:linear-gradient(160deg,#243a62,#0f1a2e);
  font-family:var(--font-display); font-weight:600; color:var(--gold-light,#e8c87a); letter-spacing:.04em; }
.ow-photo.ow-photo--initials{ font-size:clamp(24px,2.6vw,32px); }
.ow-id .ow-inst{ font-size:clamp(28px,4vw,48px); }
.ow-id .ow-name{ margin-top:10px; }
.wn-grid{ list-style:none; margin:clamp(26px,3vw,36px) 0 0; padding:0; display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:14px; }
.wn-card{ display:grid; grid-template-columns:72px minmax(0,1fr); gap:14px; align-items:center; padding:14px 16px 14px 14px; border-radius:12px;
  background:rgba(255,255,255,.045); box-shadow:inset 0 0 0 1px rgba(201,168,76,.24); }
.wn-photo{ display:block; width:72px; aspect-ratio:4/5; border-radius:6px; overflow:hidden; border:1px solid rgba(231,189,90,.45); background:#0c1424; }
.wn-photo.wn-photo--initials{ font-size:21px; }
.wn-t{ min-width:0; }
.wn-inst{ display:block; font:600 18px/1.2 var(--font-display); color:var(--gold-light,#e8c87a); }
.wn-name{ display:block; margin-top:5px; font:600 15px/1.3 var(--font-ui); color:#fff; }
.wn-meta{ display:block; margin-top:2px; font:400 12.5px/1.4 var(--font-ui); color:rgba(255,255,255,.7); }
.wn-more{ display:flex; justify-content:center; }
.wn-more-btn{ margin-top:18px; min-height:46px; padding:0 22px; border-radius:999px; border:1px solid rgba(231,189,90,.5); background:transparent;
  color:#fff; font:600 14.5px/1 var(--font-ui); cursor:pointer; }
.wn-more-btn:hover{ background:rgba(255,255,255,.06); }
.wn-more-btn:focus-visible{ outline:2px solid var(--gold-light,#e8c87a); outline-offset:3px; }
.wn-foot{ margin:clamp(22px,3vw,30px) 0 0; color:rgba(255,255,255,.82); font-size:15px; line-height:1.6; }
.wn-foot .tlink{ color:#fff; white-space:nowrap; }
@media(max-width:1100px){ .wn-grid{ grid-template-columns:repeat(3,minmax(0,1fr)); } }
@media(max-width:820px){ .wn-grid{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media(max-width:760px){ .wn-grid.wn-fold:not(.is-open) > li:nth-child(n+9){ display:none; } }
@media(max-width:560px){
  .wn-grid{ grid-template-columns:1fr; gap:10px; }
  .wn-card{ grid-template-columns:60px minmax(0,1fr); padding:12px; }
  .wn-photo{ width:60px; }
  .ow-id{ gap:14px; }
  .ow-photo{ width:78px; }
}
