/* ============================================================
   WAVE ANIMATION STUDIO — Global Design System (2026)
   Dark, cinematic, Caribbean. Gold / Red / Green on deep ink.
   Dark is the only theme: the light palette, the nav toggle and the
   Account Settings → Appearance control were all retired. Every color
   here still routes through the :root tokens below, so retheming stays
   a one-block change. <html> carries a static data-theme="dark" for
   anything keying off it; nothing reads it to choose a palette.
   ============================================================ */
:root{
  --ink:#050505;
  --ink-2:#0a0a0a;
  --ink-3:#101010;
  --panel:#0d0d0d;
  --overlay-rgb:255,255,255;   /* thin tint used for hairline surfaces (rgba(var(--overlay-rgb),alpha)) */
  --surface-rgb:16,19,28;      /* solid-ish floating chrome: dropdown menus, toasts, scrolled nav, chat */
  --line:rgba(var(--overlay-rgb),.1);
  --text:#e8ecf4;
  --muted:#9aa3b5;
  --gold:#e3b322;
  --red:#e0303a;
  --green:#00b356;
  --gold-soft:rgba(227,179,34,.14);
  --red-soft:rgba(224,48,58,.14);
  --green-soft:rgba(0,179,86,.14);
  --grad:linear-gradient(100deg,var(--gold),var(--red) 50%,var(--green));
  --font-display:"Space Grotesk","Outfit",sans-serif;
  --font-body:"Outfit",system-ui,sans-serif;
  --r-lg:22px; --r-md:14px;
  --shadow:0 24px 60px -24px rgba(0,0,0,.7);
  --ease:cubic-bezier(.22,.9,.28,1);
  --glow-gold:rgba(227,179,34,.55);
  --glow-red:rgba(224,48,58,.5);
  --glow-green:rgba(0,179,86,.5);
  --grid-line:rgba(var(--overlay-rgb),.055);
  --green-dark:#08281a;
  --manga-frame:rgba(242,236,223,.85); /* manga panel/spread/cover ink border */
  --footer-scrim:rgba(0,0,0,.5);
  color-scheme:dark;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  background:var(--ink);color:var(--text);
  font-family:var(--font-body);font-size:17px;line-height:1.65;
  overflow-x:hidden;overflow-y:auto;-webkit-font-smoothing:antialiased;
}
::selection{background:var(--gold);color:#100c02}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
button{font:inherit;cursor:pointer}
h1,h2,h3,h4{font-family:var(--font-display);line-height:1.08;letter-spacing:-.02em;font-weight:700}
.wrap{width:min(1180px,92vw);margin-inline:auto}
.grad-text{background:var(--grad);background-size:220% auto;-webkit-background-clip:text;background-clip:text;color:transparent;
  animation:gradientFlow 6s ease-in-out infinite}
@keyframes gradientFlow{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}

/* ---------- ambient background: cyber grid (injected by main.js) ---------- */
.cyber-grid{position:fixed;inset:0;z-index:-3;pointer-events:none;opacity:.5;
  background-image:linear-gradient(var(--grid-line) 1px,transparent 1px),
    linear-gradient(90deg,var(--grid-line) 1px,transparent 1px);
  background-size:54px 54px;
  -webkit-mask-image:radial-gradient(ellipse 85% 65% at 50% 0%,#000 35%,transparent 82%);
  mask-image:radial-gradient(ellipse 85% 65% at 50% 0%,#000 35%,transparent 82%);
  animation:gridDrift 24s linear infinite}
@keyframes gridDrift{to{background-position:54px 54px,54px 54px}}
@media(prefers-reduced-motion:reduce){.cyber-grid{animation:none}}

/* ---------- ambient background ---------- */
.bg-orbs{position:fixed;inset:0;z-index:-2;overflow:hidden;pointer-events:none}
.orb{position:absolute;border-radius:50%;filter:blur(110px);opacity:.14;animation:drift 26s var(--ease) infinite alternate}
.orb.g{background:#8a6d0e;width:44vw;height:44vw;top:-14vw;left:-10vw}
.orb.r{background:#7c1218;width:36vw;height:36vw;top:30vh;right:-12vw;animation-delay:-8s}
.orb.e{background:#064d2a;width:40vw;height:40vw;bottom:-16vw;left:22vw;animation-delay:-16s}
@keyframes drift{
  0%{transform:translate(0,0) scale(1)}
  50%{transform:translate(6vw,-4vh) scale(1.12)}
  100%{transform:translate(-4vw,5vh) scale(.94)}
}
.grain{position:fixed;inset:-100%;z-index:-1;pointer-events:none;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  animation:grain 7s steps(8) infinite}
@keyframes grain{0%{transform:translate(0,0)}25%{transform:translate(-4%,3%)}50%{transform:translate(3%,-2%)}75%{transform:translate(-2%,-4%)}100%{transform:translate(4%,2%)}}

/* ---------- loader / wave reveal ----------
   Every value the editor's Site → Loading screen panel can change is a custom
   property or a :root[data-loader-*] hook, so applyTheme() in js/site-overrides.js
   restyles the intro without touching its markup. Each fallback below is the
   coded default: an untouched setting keeps tracking this stylesheet. */
#loader{position:fixed;inset:0;z-index:1000;background:var(--loader-bg,var(--ink));display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:var(--loader-gap,18px);padding:8vh 6vw;transition:visibility 0s 1.6s}

/* Repeat-in-session page loads skip the full branded loader — see js/main.js —
   but still hold the page invisible for at most ~700ms (or until the current,
   non-cached site-overrides content is confirmed applied, if sooner) so a
   visitor never sees a flash of last-visit's stale cached content before the
   real thing lands. */
body.wave-veil{opacity:0}
/* 260px is the full/final size the pulseGrow animation below lands on, not
   its starting size — the mark itself grows into it over the intro. Kept as
   the biggest it gets (not larger) so the wave-curtain reveal that follows
   still reads as a wipe rather than a jump-cut into the oversized decorative
   wordmark behind the hero (index.html .float-swirl, 840px). */
#loader img{width:var(--loader-logo-size,260px);max-width:70vw;animation:pulseGrow 5.1s var(--ease) forwards}
#loader .l-name{font-family:var(--font-display);font-size:var(--loader-name-size,1.5rem);letter-spacing:.34em;text-transform:uppercase;font-weight:700;color:var(--loader-fg,var(--text))}
#loader .l-tag{color:var(--loader-fg,var(--muted));font-size:var(--loader-tag-size,.85rem);letter-spacing:.24em;text-transform:uppercase}
/* Development notice from management. A hairline-ruled memo card rather than
   a third tagline: sentence case and a rule above it break the run of
   uppercase letter-spaced lines, so the eye reads it as a statement. It
   fades in after the mark and wordmark have landed. */
#loader .l-note{max-width:var(--loader-note-width,46ch);margin-top:6px;padding-top:16px;
  border-top:1px solid var(--loader-note-line,rgba(227,179,34,.28));
  display:flex;flex-direction:column;align-items:inherit;gap:6px;
  opacity:0;animation:lNoteIn .8s var(--ease) .5s forwards}
#loader .l-note p{color:var(--loader-fg,var(--muted));font-size:var(--loader-note-size,.86rem);
  line-height:1.65;letter-spacing:.01em}
#loader .l-note b{color:var(--loader-fg,var(--text));font-weight:600}
#loader .l-sign{font-family:var(--font-display);font-size:calc(var(--loader-note-size,.86rem) * .82);
  letter-spacing:.2em;text-transform:uppercase;color:var(--gold)}
@keyframes lNoteIn{to{opacity:1}}
:root[data-loader-note="off"] #loader .l-note{display:none}
@keyframes pulse{0%,100%{transform:scale(1);filter:drop-shadow(0 0 0 rgba(227,179,34,0))}50%{transform:scale(1.06);filter:drop-shadow(0 0 26px rgba(227,179,34,.5))}}
/* Logo grows from smallest to biggest in one slow, steady pass — never
   shrinking back down mid-intro. js/main.js sets this animation's duration
   to match the loader's actual hold time (holdMs), so scale(1) — full size,
   the 260px --loader-logo-size — lands right as the wave-curtain reveal
   rises in below it: the mark grows until it meets the red/gold/green swell.
   The brief plateaus read as a slow pulse/heartbeat without ever dipping
   back down, unlike the old in-place pulse keyframe above. */
@keyframes pulseGrow{
  0%{transform:scale(.3);filter:drop-shadow(0 0 0 rgba(227,179,34,0))}
  8%{transform:scale(.3)}
  26%{transform:scale(.5);filter:drop-shadow(0 0 8px rgba(227,179,34,.2))}
  30%{transform:scale(.5)}
  50%{transform:scale(.68);filter:drop-shadow(0 0 14px rgba(227,179,34,.28))}
  54%{transform:scale(.68)}
  74%{transform:scale(.85);filter:drop-shadow(0 0 20px rgba(227,179,34,.36))}
  78%{transform:scale(.85)}
  100%{transform:scale(1);filter:drop-shadow(0 0 26px rgba(227,179,34,.45))}
}
#loader .l-wave{position:absolute;inset:0;pointer-events:none}
#loader.reveal .l-inner{animation:fadeUp .5s forwards}
@keyframes fadeUp{to{opacity:0;transform:translateY(-24px)}}
body.revealing #loader{clip-path:circle(150% at 50% 100%);animation:waveOpen 1.3s var(--ease) forwards}
@keyframes waveOpen{from{clip-path:circle(150% at 50% 100%)}to{clip-path:circle(0% at 50% 100%)}}
body.revealed #loader{display:none}
#loader .l-inner{display:flex;flex-direction:column;align-items:center;gap:var(--loader-gap,18px);text-align:center;max-width:100%}
#loader svg.swell{position:absolute;bottom:-2px;left:0;width:100%;height:34vh;opacity:0}
body.revealing #loader svg.swell{opacity:1;animation:swell 1.3s var(--ease) forwards}
@keyframes swell{from{transform:translateY(100%)}to{transform:translateY(-10%)}}

/* Layout — where the mark and wordmark sit on the screen. */
:root[data-loader-layout="top"] #loader{justify-content:flex-start}
:root[data-loader-layout="bottom"] #loader{justify-content:flex-end}
:root[data-loader-layout="left"] #loader{align-items:flex-start}
:root[data-loader-layout="left"] #loader .l-inner{align-items:flex-start;text-align:left}
:root[data-loader-layout="right"] #loader{align-items:flex-end}
:root[data-loader-layout="right"] #loader .l-inner{align-items:flex-end;text-align:right}
/* Logo beside the words rather than above them. The three are flat siblings,
   so a two-column grid — mark spanning both rows, name over tagline — is what
   pairs them up; either line can still be hidden and its row just collapses. */
:root[data-loader-stack="row"] #loader .l-inner{display:grid;grid-template-columns:auto minmax(0,1fr);
  grid-template-areas:"logo name" "logo tag" "note note";align-items:center;justify-items:start;
  column-gap:var(--loader-gap,18px);row-gap:6px;text-align:left}
:root[data-loader-stack="row"] #loader img{grid-area:logo}
:root[data-loader-stack="row"] #loader .l-name{grid-area:name;align-self:end}
:root[data-loader-stack="row"] #loader .l-tag{grid-area:tag;align-self:start}
/* The memo runs the full width under both columns rather than squeezing into
   the wordmark's column, where 46ch would wrap to a sliver. */
:root[data-loader-stack="row"] #loader .l-note{grid-area:note;align-items:flex-start;text-align:left}

/* Hide either line without deleting it — the text stays editable on the page. */
:root[data-loader-name="off"] #loader .l-name{display:none}
:root[data-loader-tag="off"] #loader .l-tag{display:none}
:root[data-loader-swell="off"] #loader svg.swell{display:none}

/* Logo motion. */
:root[data-loader-anim="none"] #loader img{animation:none}
:root[data-loader-anim="spin"] #loader img{animation:lspin 3.6s linear infinite}
:root[data-loader-anim="float"] #loader img{animation:lfloat 3s var(--ease) infinite}
:root[data-loader-anim="breathe"] #loader img{animation:lbreathe 4s var(--ease) infinite}
@keyframes lspin{to{transform:rotate(360deg)}}
@keyframes lfloat{0%,100%{transform:translateY(-8px)}50%{transform:translateY(8px)}}
@keyframes lbreathe{0%,100%{opacity:.45}50%{opacity:1}}
@media (prefers-reduced-motion:reduce){
  #loader img{animation:none!important}
}

/* ---------- nav ---------- */
header.nav{position:fixed;top:0;left:0;right:0;z-index:600;transition:.35s var(--ease)}
header.nav .n-inner{display:flex;align-items:center;gap:26px;width:min(1320px,94vw);margin:14px auto;
  padding:10px 22px;border-radius:100px;border:1px solid transparent}
header.nav.scrolled .n-inner{background:rgba(var(--surface-rgb),.72);backdrop-filter:blur(18px);border-color:var(--line);box-shadow:var(--shadow)}
.n-logo{display:flex;align-items:center;gap:10px;font-family:var(--font-display);font-weight:700;letter-spacing:.08em}
/* max-* as well as width: a replacement mark authored at its own size (the
   current one is set to 90x73) must not be able to grow the bar or push the
   links off it. */
/* The scale(2) is sizing, not motion: the mark is authored small and rests
   doubled. The logo is a plain click-through link — no hover or press
   animation. */
.n-logo img{width:auto;height:44px;max-width:360px;max-height:44px;object-fit:contain;transform:scale(2);transform-origin:left center}
.n-logo span{font-size:1.02rem}.n-logo small{display:block;font-size:.58rem;letter-spacing:.42em;color:var(--muted);font-weight:500}
nav.n-links{display:flex;gap:2px;margin:0 auto;align-items:center;justify-content:center}
nav.n-links>a{padding:8px 12px;border-radius:100px;font-size:.76rem;letter-spacing:.12em;text-transform:uppercase;font-weight:600;color:var(--muted);transition:.25s}
nav.n-links>a:hover,nav.n-links>a.active{color:var(--text);background:rgba(var(--overlay-rgb),.07);text-shadow:0 0 16px var(--glow-gold)}
nav.n-links>a.active{color:var(--gold)}
.n-drop{position:relative}
.n-drop>a::after{content:" ▾";font-size:.7em;opacity:.7}
/* ...unless it is empty. Home carries the studio's own tools and shows them to
   signed-in accounts only; signed out it has to look and behave exactly like
   the plain link it has always been. A caret that opens nothing is the same
   bug as a button that does nothing, just smaller. See updateAuthUI. */
.n-drop.is-flat>a::after{content:none}
.n-drop.is-flat::after{content:none}
.n-drop.is-flat .n-menu{display:none!important}
/* Invisible hover bridge across the 10px visual gap between the "Academy"
   link and its .n-menu below it (.n-menu sits at top:calc(100% + 10px), not
   flush against .n-drop). Without this, moving the mouse straight down from
   the link toward a submenu item crosses a strip that belongs to neither
   element, :hover is lost mid-travel, .n-menu starts hiding, and the click
   that was meant for e.g. "Courses" lands on whatever's underneath instead
   (often back on the "Academy" link/page) — this is what was reported as
   "clicking Courses in the dropdown sends me back to Academy". The bridge
   is a same-width, same-position invisible strip that keeps .n-drop:hover
   (and so .n-menu's visibility) continuous through that gap. */
.n-drop::after{content:"";position:absolute;left:50%;transform:translateX(-50%);top:100%;height:10px;width:210px}
.n-menu{position:absolute;top:calc(100% + 10px);left:50%;transform:translate(-50%,8px);min-width:210px;
  background:rgba(var(--surface-rgb),.95);backdrop-filter:blur(20px);border:1px solid var(--line);border-radius:16px;
  padding:8px;opacity:0;visibility:hidden;transition:.25s var(--ease);box-shadow:var(--shadow)}
.n-drop:hover .n-menu{opacity:1;visibility:visible;transform:translate(-50%,0)}
.n-menu a{display:block;padding:9px 14px;border-radius:10px;font-size:.9rem;color:var(--text)}
.n-menu a:hover{background:rgba(var(--overlay-rgb),.08);color:var(--text)}
.n-cta{display:flex;gap:10px;align-items:center}

/* nav icons */
.n-ico{width:38px;height:38px;border-radius:50%;display:grid;place-items:center;border:1px solid transparent;
  color:var(--muted);background:none;font-size:1rem;transition:.25s;position:relative;text-decoration:none}
.n-ico:hover{color:var(--gold);border-color:var(--line)}
.n-ico .cnt{position:absolute;top:-2px;right:-2px;background:var(--red);color:#fff;font-size:.6rem;font-weight:800;
  min-width:16px;height:16px;border-radius:100px;display:grid;place-items:center;padding:0 4px}

/* Notification Center (see js/notifications.js) — click-toggled dropdown,
   mirrors the .n-menu / #authContainer pattern above but with its own
   class so it never inherits hover-open behaviour. */
.notif-wrap{position:relative;display:flex;align-items:center}
.notif-panel{position:absolute;top:calc(100% + 10px);right:0;width:min(360px,86vw);max-height:70vh;overflow-y:auto;
  background:rgba(var(--surface-rgb),.97);backdrop-filter:blur(20px);border:1px solid var(--line);border-radius:16px;
  padding:6px;opacity:0;visibility:hidden;transform:translateY(8px);transition:.25s var(--ease);box-shadow:var(--shadow);
  pointer-events:none;z-index:120}
.notif-wrap.open .notif-panel{opacity:1;visibility:visible;transform:translateY(0);pointer-events:auto}
.notif-panel-head{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 8px;gap:10px}
.notif-panel-head b{font-size:.9rem}
.notif-panel-head button{background:none;border:0;color:var(--gold);font-size:.76rem;font-weight:600;cursor:pointer;padding:2px}
.notif-panel-head button:hover{text-decoration:underline}
.notif-panel-list{display:flex;flex-direction:column;gap:2px}
.notif-item{display:block;padding:10px 12px;border-radius:10px;color:var(--muted);position:relative}
.notif-item:hover{background:rgba(var(--overlay-rgb),.06);color:var(--text)}
.notif-item b{display:block;color:var(--text);font-size:.86rem;margin-bottom:2px}
.notif-item p{font-size:.8rem;line-height:1.4;margin:0}
.notif-item .notif-when{display:block;font-size:.7rem;color:var(--muted);margin-top:4px}
.notif-item.unread::before{content:"";position:absolute;left:2px;top:14px;width:6px;height:6px;border-radius:50%;background:var(--gold)}
.notif-item.unread{padding-left:20px}
.notif-empty{color:var(--muted);font-size:.85rem;padding:16px 12px;text-align:center}

/* animated surf button */
.surf-btn{display:inline-flex;align-items:center;gap:9px;position:relative;overflow:hidden}
.surf-btn svg{display:inline-block;animation:surfSwitch 3s ease-in-out infinite}
.surf-btn .frame{transition:opacity .8s ease-in-out}
.surf-btn .frame1{opacity:1}
.surf-btn .frame2{opacity:0}
@keyframes surfSwitch{
  0%{transform:translateX(0)}
  25%{transform:translateX(-2px)}
  50%{opacity:1;transform:translateX(0)}
  50.1%{opacity:0}
  75%{transform:translateX(2px)}
  100%{transform:translateX(0)}
}
.surf-btn:hover svg{animation-play-state:running;filter:drop-shadow(0 0 8px var(--gold))}
.surf-btn:hover .frame1{opacity:0}
.surf-btn:hover .frame2{opacity:1}

/* three-state authentication button */
.auth-btn{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;
  border-radius:50%;border:2px solid var(--gold);background:var(--gold);
  color:var(--gold);cursor:pointer;transition:.4s cubic-bezier(.22,.9,.28,1);
  position:relative;text-decoration:none;overflow:hidden;
  box-shadow:0 0 0 0 rgba(227,179,34,.3)}

.auth-btn:hover{background:var(--gold);transform:scale(1.05);box-shadow:0 0 16px rgba(227,179,34,.5)}
.auth-btn:active{transform:scale(0.95)}

/* solid-gold backdrop so a failed/slow image load never shows a bare/broken icon */
.auth-icon{display:block;position:relative;width:100%;height:100%;border-radius:50%;overflow:hidden;
  background:var(--gold);transition:.6s cubic-bezier(.22,.9,.28,1)}
.auth-fallback-icon{position:absolute;inset:0;z-index:0;display:grid;place-items:center;color:#151002;font-size:1.3rem}

.auth-state{position:absolute;inset:0;z-index:1;width:100%;height:100%;object-fit:cover;background:var(--gold);transition:opacity .5s ease-in-out}
.auth-state.state-1{opacity:1}
.auth-state.state-2{opacity:0}
.auth-state.state-3{opacity:0}

/* hover state: show Surf2 */
.auth-btn:hover .auth-state.state-1{opacity:0}
.auth-btn:hover .auth-state.state-2{opacity:1}
.auth-btn:hover .auth-state.state-3{opacity:0}

/* click state: show Wave3 */
.auth-btn.clicked .auth-state.state-1{opacity:0}
.auth-btn.clicked .auth-state.state-2{opacity:0}
.auth-btn.clicked .auth-state.state-3{opacity:1}

/* auth-lock: hold on the Wave3 (Login) icon — on the login/signup page, or permanently once signed in — ignore hover swap */
.auth-btn.auth-lock .auth-state.state-1,
.auth-btn.auth-lock:hover .auth-state.state-1,
.auth-btn.auth-lock .auth-state.state-2,
.auth-btn.auth-lock:hover .auth-state.state-2{opacity:0}
.auth-btn.auth-lock .auth-state.state-3,
.auth-btn.auth-lock:hover .auth-state.state-3{opacity:1}

/* remove dropdown arrow for auth button - icons only */
/* #authContainer must establish its own positioning context — without
   position:relative here, the absolutely-positioned .n-menu falls through
   to header.nav (the nearest positioned ancestor, since it's position:fixed)
   and centers itself under the whole 1320px nav bar instead of the icon,
   which is what put the Sign Out menu in the middle of the page. Anchored
   from the right edge of the icon (not centered) so it never overhangs the
   viewport edge on narrow screens either. */
#authContainer{position:relative}
#authContainer .n-menu{position:absolute;top:calc(100% + 10px);right:0;left:auto;transform:translateY(8px);min-width:210px;
  background:rgba(var(--surface-rgb),.95);backdrop-filter:blur(20px);border:1px solid var(--line);border-radius:16px;
  padding:8px;opacity:0;visibility:hidden;transition:.25s var(--ease);box-shadow:var(--shadow);pointer-events:none}

/* Sign Out dropdown only opens on click (toggled via .menu-open), never
   floats open just from being logged in or hovering. */
#authContainer.menu-open .n-menu{opacity:1;visibility:visible;transform:translateY(0);pointer-events:auto}

/* in-place flip animation for auth click state */
@keyframes authFlip{
  0%{transform:rotateY(0deg) scale(1)}
  50%{transform:rotateY(90deg) scale(1.04)}
  100%{transform:rotateY(360deg) scale(1)}
}

.auth-btn.clicked .auth-icon{animation:authFlip .7s cubic-bezier(.22,.9,.28,1);transform-style:preserve-3d}

/* ripple effect on click */
.auth-ripple{position:absolute;border-radius:50%;background:rgba(227,179,34,.5);
  animation:authRipple .8s cubic-bezier(.22,.9,.28,1) forwards;pointer-events:none}

@keyframes authRipple{
  0%{width:0;height:0;opacity:1}
  100%{width:100%;height:100%;opacity:0}
}

.burger{display:none;background:none;border:0;color:var(--text);font-size:1.5rem;padding:6px 10px;cursor:pointer;transition:.25s}
.burger:hover{color:var(--gold)}
.burger i{transition:transform .3s var(--ease)}

/* responsive nav adjustments */
@media(max-width:1024px){
  header.nav .n-inner{gap:16px;padding:10px 16px;margin:12px auto}
  nav.n-links>a{padding:6px 10px;font-size:.7rem}
  .n-logo span{font-size:.95rem}
}

/* .n-drawer wraps nav.n-links + .n-cta (see js/main.js). Above the
   breakpoint it must be invisible to layout — display:contents keeps both
   children participating directly in .n-inner's flex row exactly as if
   the wrapper weren't there, so desktop spacing is untouched. */
.n-drawer{display:contents}

/* ONE collapse point for the whole nav — links, search, cart and the
   account icon all move into the single burger-toggled panel together
   here, instead of the old two-tier scheme (links at 900px, icons pinned
   as a separate floating cluster from 768px, then folded in again below
   720px). That overlap was itself a source of elements fighting for the
   same screen space at in-between widths. The burger stays put at the
   right edge of the bar at every width below this. */
@media(max-width:900px){
  header.nav .n-inner{gap:12px;width:94vw;padding:10px 14px;border-radius:22px;margin:10px auto}
  .n-logo span{display:none}
  .burger{display:block;color:var(--gold);margin-left:auto}

  .n-drawer{display:block;position:fixed;top:80px;right:16px;left:16px;
    max-width:340px;margin-left:auto;
    background:rgba(var(--surface-rgb),.98);backdrop-filter:blur(16px);
    border:1px solid var(--line);border-radius:18px;box-shadow:var(--shadow);
    max-height:calc(100vh - 100px);overflow-y:auto;
    opacity:0;visibility:hidden;transform:translateY(-8px);transition:.25s var(--ease);
    z-index:605}
  .n-drawer.open{opacity:1;visibility:visible;transform:translateY(0)}

  nav.n-links{display:flex;flex-direction:column;gap:0;margin:0;padding:8px}
  nav.n-links>a{padding:13px 14px;border-radius:10px;font-size:.9rem;width:100%}
  nav.n-links>a:hover,nav.n-links>a.active{background:rgba(var(--overlay-rgb),.08);color:var(--gold)}
  /* Submenus are always expanded in the mobile drawer (not an
     accordion) — every nav option, including sub-menu items, must be
     visible without an extra tap, and the drawer already scrolls
     (.n-drawer max-height + overflow-y:auto above) so there's no space
     cost to showing them all flat. */
  .n-drop{width:100%}
  /* A dropdown's own top link is a grandchild of nav.n-links, so none of the
     nav.n-links>a sizing above reaches it. Left alone it rendered as bare
     body text next to full-size drawer rows. Same padding, same size, same
     hit area — a menu option should not be a different thing depending on
     whether it happens to own a submenu. */
  .n-drop>a{display:flex;justify-content:space-between;align-items:center;width:100%;
    padding:13px 14px;border-radius:10px;font-size:.9rem;letter-spacing:.12em;
    text-transform:uppercase;font-weight:600;color:var(--muted)}
  .n-drop>a::after{content:none}

  /* WHY THE TEXT VANISHED WHEN YOU TAPPED AN OPTION
     Touching a drawer row makes the browser select the label's text, and
     ::selection paints gold-on-near-black over it. Against this panel that
     reads as the word blanking out — and on a long press Android/iOS add
     their own dark tap-highlight on top, which finished the job. The rows
     are buttons, not prose: nothing in here is ever meant to be selected or
     long-pressed into a callout, so turn all three off and give the press
     an explicit, visible state of its own instead. */
  .n-drawer a,.n-drawer button,.burger{
    -webkit-user-select:none;user-select:none;
    -webkit-tap-highlight-color:transparent;
    -webkit-touch-callout:none}
  nav.n-links>a:active,.n-drop>a:active,.n-menu a:active{
    color:var(--gold);background:rgba(227,179,34,.14)}
  /* :hover sticks after a tap on touch devices, so the tapped row would stay
     lit long after the drawer closed. Pin the lit state to :active and to the
     page you are actually on. */
  @media (hover:none){
    nav.n-links>a:hover:not(.active),.n-menu a:hover{background:none;color:var(--muted)}
    .n-menu a:hover{color:var(--text)}
  }
  .n-menu{position:static;display:block;min-width:auto;top:auto;left:auto;transform:none;opacity:1;visibility:visible;
    background:rgba(var(--overlay-rgb),.04);border:none;box-shadow:none;border-radius:0;margin:0;padding:4px 0 4px 10px}
  .n-menu a{padding:9px 16px;border:none;font-size:.85rem;color:var(--text)}
  nav.n-links .drawer-only{display:block!important}

  .n-cta{flex-direction:row;justify-content:center;gap:10px;padding:12px;border-top:1px solid var(--line)}
  #authContainer{position:static}
  #authContainer .n-menu{position:static;display:none;min-width:auto;margin-top:8px;opacity:1;visibility:visible;transform:none}
  #authContainer.menu-open .n-menu{display:block}
}

@media(max-width:520px){
  header.nav .n-inner{gap:8px;padding:10px 10px}
  .burger{font-size:1.3rem;padding:4px 8px}
  .n-drawer{right:10px;left:10px;max-width:none;top:74px}
}

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;text-align:center;gap:9px;padding:13px 26px;border-radius:100px;font-weight:600;
  font-size:.95rem;border:1px solid var(--line);color:var(--text);background:rgba(var(--overlay-rgb),.05);
  transition:.3s var(--ease);position:relative;overflow:hidden}
.btn:hover{transform:translateY(-2px);background:rgba(var(--overlay-rgb),.1)}
.btn::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(120deg,transparent 35%,rgba(var(--overlay-rgb),.35) 50%,transparent 65%);
  transform:translateX(-130%);transition:transform .7s var(--ease)}
.btn:hover::before{transform:translateX(130%)}
.btn.gold{background:var(--gold);color:#151002;border-color:transparent}
.btn.gold:hover{box-shadow:0 12px 34px -8px rgba(227,179,34,.55)}
.btn.green{background:var(--green);color:#02150b;border-color:transparent}
.btn.green:hover{box-shadow:0 12px 34px -8px rgba(0,179,86,.55)}
.btn.red{background:var(--red);color:#fff;border-color:transparent}
.btn.red:hover{box-shadow:0 12px 34px -8px rgba(224,48,58,.55)}
.btn.ghost{background:transparent}
.btn.sm{padding:9px 18px;font-size:.85rem}

/* ---------- hero ---------- */
.hero{position:relative;min-height:92vh;display:flex;align-items:center;padding:110px 0 70px;overflow:hidden}
.hero.short{min-height:58vh;padding:110px 0 50px}
#particles{position:absolute;inset:0;z-index:0;pointer-events:none}
.hero .wrap{position:relative;z-index:2}
.kicker{display:inline-flex;align-items:center;gap:10px;padding:7px 16px;border-radius:100px;
  border:1px solid var(--line);background:rgba(var(--overlay-rgb),.04);font-size:.8rem;letter-spacing:.18em;
  text-transform:uppercase;color:var(--muted);margin-bottom:18px}
.kicker i{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 12px var(--green);animation:blink 2s infinite}
@keyframes blink{50%{opacity:.35}}
.hero h1{font-size:clamp(2.6rem,6.4vw,5.2rem);margin-bottom:18px}
.hero p.lead{max-width:600px;color:var(--muted);font-size:1.14rem;margin-bottom:26px}
.hero-actions{display:flex;gap:14px;flex-wrap:wrap}
.hero-wave{position:absolute;bottom:-2px;left:0;width:100%;z-index:1;opacity:.6}

/* floating swirl decorations */
.float-swirl{position:absolute;pointer-events:none;opacity:.16;animation:floaty 9s var(--ease) infinite alternate;z-index:0}
@keyframes floaty{from{transform:translateY(-14px) rotate(-4deg)}to{transform:translateY(16px) rotate(6deg)}}

/* ---------- sections ---------- */
section{padding:64px 0;position:relative}
/* ---------- the fold ----------
   The gap between a hero and the first section under it used to be typed
   into that section's style attribute, one page at a time. It had drifted to
   nine different answers across the site — 0, 10px, 20px, 30px, 34px, 82px,
   98px, 118px, 123px — so the rhythm changed every time a visitor moved
   between pages, and any new page inherited whichever number happened to be
   copied. One rule sets it now; the inline overrides are gone.

   :not(.hero) because a hero is itself a section — blackgoat.html runs two
   back to back and the second one keeps its own generous padding.

   index.html is deliberately exempt. Its hero is full height and hands off
   into a bespoke opening sequence that is signed off as it stands. */
.hero + section:not(.hero){padding-top:46px}
body[data-page="home"] .hero + section:not(.hero){padding-top:64px}
.sec-head{max-width:720px;margin-bottom:38px}
.sec-head.center{margin-inline:auto;text-align:center}
.sec-head .kicker{margin-bottom:16px}
.sec-head h2{font-size:clamp(2rem,4.4vw,3.2rem);margin-bottom:14px}
.sec-head p{color:var(--muted);font-size:1.06rem}

/* reveal-on-scroll */
.rv{opacity:0;transform:translateY(34px);transition:opacity .8s var(--ease),transform .8s var(--ease)}
.rv.in{opacity:1;transform:none}
.rv.d1{transition-delay:.1s}.rv.d2{transition-delay:.2s}.rv.d3{transition-delay:.3s}.rv.d4{transition-delay:.4s}

/* "No items yet" placeholder cards — was copy-pasted inline as
   `padding:64px 24px` or `padding:48px 24px` across academy/careers/clubs/
   courses/job-detail/blackgoat/manja; one shared class instead of N inline
   duplicates so the spacing only ever needs changing in one place. */
.empty-state{padding:48px 24px;text-align:center;color:var(--muted)}

/* Sign-in-required gate cards — was copy-pasted inline as
   `max-width:560px;text-align:center;padding:44px 30px` across admin/
   clubadmin/hr/editor. */
.gate-panel{max-width:560px;margin:0 auto;text-align:center;padding:36px 28px}

/* ---------- cards & grids ---------- */
.grid{display:grid;gap:22px}
.g2{grid-template-columns:repeat(2,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}
.g5{grid-template-columns:repeat(5,1fr)}

/* ---------- page split-grid layouts ----------
   Formerly inline "display:grid;grid-template-columns:...;gap:...;
   align-items:..." written directly on a page's .wrap. Centralized here so
   every ratio/gap lives in one place, the mobile collapse below can target
   them by a stable list instead of matching leftover inline-style text, and
   the live editor can't shadow them with a one-off inline override. IDs are
   unchanged so existing page scripts and media queries keep working. */
#agrid{display:grid;grid-template-columns:1fr 1fr;gap:56px}
#bookgrid{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:center}
#loregrid{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:center}
#pilotGrid{display:grid;grid-template-columns:1fr 1fr;gap:50px;align-items:center}
#internBookGrid{display:grid;grid-template-columns:1fr 1fr;gap:50px;align-items:center}
#bookHeroGrid{display:grid;grid-template-columns:1.1fr .9fr;gap:40px;align-items:center}
#bookDetailGrid{display:grid;grid-template-columns:1.15fr .85fr;gap:40px;align-items:start}
#kGrid{display:grid;grid-template-columns:.95fr 1.05fr;gap:30px;align-items:start}
#permGrid{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:start}
#cgrid{display:grid;grid-template-columns:.85fr 1.15fr;gap:50px;align-items:start}
#cGrid{display:grid;grid-template-columns:1.15fr .85fr;gap:40px;align-items:start}
#jdGrid{display:grid;grid-template-columns:1.15fr .85fr;gap:40px;align-items:start}
#lGrid{display:grid;grid-template-columns:250px 1fr;gap:36px;align-items:start}
#lgrid{display:grid;grid-template-columns:1fr 460px;gap:60px;align-items:center}
#pgrid{display:grid;grid-template-columns:1.1fr .9fr;gap:50px;align-items:start}
#sgrid{display:grid;grid-template-columns:.9fr 1.1fr;gap:50px;align-items:start}
#dashMainGrid{display:grid;grid-template-columns:1fr 1.25fr 1fr;gap:22px;align-items:start}
.clubs-layout{display:grid;grid-template-columns:1fr auto;gap:40px;align-items:center}
/* display:flex + height:100% is the root fix for cards "drifting" out of
   alignment inside a grid row: a plain block .card only takes its own
   content's height, so a card with less text sits shorter than its
   siblings and its top-aligned icon/heading no longer lines up across the
   row. Flex + full height keeps every card in a row the same height, and
   the icon/heading/body order still reads top-to-bottom for regular divs
   and <a class="card"> alike (anchors get blockified as grid children, but
   never picked up flex layout of their own without this). */
.card{background:linear-gradient(160deg,rgba(var(--overlay-rgb),.05),rgba(var(--overlay-rgb),.015));
  border:1px solid var(--line);border-radius:var(--r-lg);padding:30px;position:relative;overflow:hidden;
  transition:.4s var(--ease);display:flex;flex-direction:column;height:100%;box-sizing:border-box}
.card:hover{transform:translateY(-6px);border-color:rgba(var(--overlay-rgb),.18);box-shadow:var(--shadow)}
.card .icon{width:52px;height:52px;border-radius:14px;display:grid;place-items:center;font-size:1.4rem;margin-bottom:18px}
.icon.gold{background:var(--gold-soft);color:var(--gold)}
.icon.red{background:var(--red-soft);color:var(--red)}
.icon.green{background:var(--green-soft);color:var(--green)}
.card h3{font-size:1.25rem;margin-bottom:10px}
.card p{color:var(--muted);font-size:.96rem}
.card .top-line{position:absolute;top:0;left:0;right:0;height:3px;background:var(--grad);opacity:0;transition:.4s}
.card:hover .top-line{opacity:1}
.tag{display:inline-block;padding:4px 12px;border-radius:100px;font-size:.72rem;letter-spacing:.08em;
  text-transform:uppercase;font-weight:600;margin-bottom:14px}
.tag.gold{background:var(--gold-soft);color:var(--gold)}
.tag.red{background:var(--red-soft);color:var(--red)}
.tag.green{background:var(--green-soft);color:var(--green)}
.tag.dim{background:rgba(var(--overlay-rgb),.07);color:var(--muted)}

/* project poster cards */
.poster{border-radius:var(--r-lg);overflow:hidden;position:relative;min-height:420px;display:flex;
  align-items:flex-end;border:1px solid var(--line);transition:.5s var(--ease);cursor:pointer}
.poster:hover{transform:translateY(-8px) scale(1.01);box-shadow:var(--shadow)}
.poster .p-bg{position:absolute;inset:0;transition:transform 1.2s var(--ease)}
.poster:hover .p-bg{transform:scale(1.07)}
.poster .p-body{position:relative;z-index:2;padding:30px;width:100%;
  background:linear-gradient(to top,rgba(4,6,10,.94) 20%,transparent)}
.poster h3{font-size:1.6rem;margin-bottom:8px}
.poster p{color:var(--muted);font-size:.94rem;max-width:420px}

/* stats */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;text-align:center}
/* Column flex + centered content so a stat with an empty <b> (a label-only
   entry like "Made in Jamaica", with no number/short-word to headline) still
   sits centered in the row instead of floating to the top once its empty
   block collapses to zero height. */
.stat{display:flex;flex-direction:column;justify-content:center;min-height:100%}
.stat b{font-family:var(--font-display);font-size:clamp(1.9rem,3.6vw,2.8rem);display:block}
.stat b:empty{display:none}
.stat span{color:var(--muted);font-size:.86rem;letter-spacing:.08em;text-transform:uppercase}

/* Admin CMS list widgets — cap visible rows at ~7, scroll for the rest,
   instead of letting a panel grow unbounded as content accumulates. */
.admin-scroll-list{max-height:560px;overflow-y:auto;padding-right:6px}

/* Drag-and-drop reorderable admin list rows — Production Pipeline phases/
   milestones (js/pipeline-admin.js) and the Project Gallery (js/admin.js
   initGalleryPanel). Rows are plain draggable="true" cards; this only
   supplies the "being dragged" feedback state. */
.drag-row-dragging{opacity:.4}

/* Shared Media Library picker widget (js/media-picker.js) — used by
   js/products-admin.js (store.html) and js/manja-admin.js (manja.html). */
.mp-primary-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:14px}
.mp-primary-box{width:120px;height:120px;border-radius:14px;overflow:hidden;flex:none;background:rgba(var(--overlay-rgb),.04);
  border:1px solid var(--line);display:grid;place-items:center}
.mp-primary-box img{width:100%;height:100%;object-fit:cover}
.mp-primary-actions{display:flex;gap:8px;flex-wrap:wrap}
.mp-empty{color:var(--muted);font-size:.78rem;text-align:center;padding:0 8px}
.mp-gallery-label{color:var(--muted);font-size:.82rem;margin-bottom:8px}
.mp-gallery-list{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:12px;min-height:8px}
.mp-empty-text{color:var(--muted);font-size:.82rem}
.mp-thumb{position:relative;width:76px;height:76px;border-radius:10px;overflow:hidden;border:1px solid var(--line);
  cursor:grab;flex:none}
.mp-thumb img{width:100%;height:100%;object-fit:cover;pointer-events:none}
.mp-thumb.mp-dragging{opacity:.4}
.mp-thumb-remove{position:absolute;top:2px;right:2px;width:20px;height:20px;border-radius:50%;border:0;
  background:rgba(4,6,10,.75);color:#fff;font-size:.9rem;line-height:1;cursor:pointer;display:grid;place-items:center}

/* Above the admin media-transform overlay (99010 in js/media-transform.js),
   which opens this picker as its own "replace file" step — at the old 970 it
   opened behind the very tool that asked for it. Nothing in this stylesheet
   sits higher than 1000, so raising it changes no other stacking. */
.mp-modal-overlay{position:fixed;inset:0;z-index:99100;display:none;place-items:center;background:rgba(4,6,10,.82);
  backdrop-filter:blur(8px);padding:24px}
.mp-modal-overlay.open{display:grid}
.mp-modal-panel{width:min(720px,94vw);max-height:82vh;display:flex;flex-direction:column;background:var(--ink-3);
  border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow);overflow:hidden}
.mp-modal-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--line)}
.mp-modal-close{background:none;border:0;color:var(--muted);font-size:1.4rem;line-height:1;cursor:pointer;padding:2px 6px}
.mp-grid{flex:1;overflow-y:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:10px;padding:18px 20px}
.mp-tile{position:relative;aspect-ratio:1/1;border-radius:10px;overflow:hidden;border:2px solid transparent;cursor:pointer;
  box-shadow:inset 0 0 0 1px rgba(var(--overlay-rgb),.12);background:var(--ink-2)}
.mp-tile img,.mp-tile video{width:100%;height:100%;object-fit:cover;display:block;background:var(--ink-2)}
.mp-tile.mp-selected{border-color:var(--gold)}
.mp-tile-check{position:absolute;top:6px;right:6px;width:20px;height:20px;border-radius:50%;background:var(--gold);
  color:#100c02;font-size:.72rem;font-weight:800;display:none;place-items:center}
.mp-tile.mp-selected .mp-tile-check{display:grid}
.mp-modal-foot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:14px 20px;border-top:1px solid var(--line)}
/* Source switcher + search: the library holds both uploads and the art the
   repo already ships, and past a few dozen items scrolling for one is worse
   than typing its name. */
.mp-modal-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:12px 20px;border-bottom:1px solid var(--line)}
.mp-src{display:flex;gap:6px}
.mp-src button{padding:6px 12px;border-radius:100px;border:1px solid var(--line);background:transparent;
  color:var(--muted);font:600 .78rem/1 var(--font-body);cursor:pointer}
.mp-src button.on{background:var(--gold-soft);border-color:var(--gold);color:var(--gold)}
.mp-search{flex:1;min-width:140px;padding:7px 12px;border-radius:100px;border:1px solid var(--line);
  background:rgba(var(--overlay-rgb),.04);color:var(--text);font:inherit;font-size:.82rem}
/* Videos and vectors can't be told apart from a still at thumbnail size. */
.mp-tile-kind{position:absolute;left:6px;bottom:6px;padding:2px 7px;border-radius:100px;background:rgba(0,0,0,.72);
  color:#e8ecf4;font-size:.62rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase}
/* Half the library is pale logo art, so the caption needs a floor of its own
   rather than a gradient that only reads over dark thumbnails. */
.mp-tile-name{position:absolute;inset:auto 0 0 0;padding:16px 6px 5px;font-size:.62rem;line-height:1.25;
  color:#e8ecf4;background:linear-gradient(transparent,rgba(0,0,0,.55) 40%,rgba(0,0,0,.92));word-break:break-all;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mp-tile.is-vector img{object-fit:contain;padding:14%;background:rgba(var(--overlay-rgb),.05)}
.mp-upload-label{color:var(--gold);font-size:.86rem;font-weight:600;cursor:pointer}

.mp-lightbox-overlay{position:fixed;inset:0;z-index:975;display:none;place-items:center;background:rgba(4,6,10,.92)}
.mp-lightbox-overlay.open{display:grid}
.mp-lightbox-img{max-width:88vw;max-height:82vh;border-radius:12px;object-fit:contain}
.mp-lightbox-close{position:absolute;top:20px;right:26px;background:none;border:0;color:#fff;font-size:2rem;cursor:pointer}
.mp-lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);background:rgba(var(--overlay-rgb),.08);border:1px solid var(--line);
  color:#fff;font-size:1.6rem;width:48px;height:48px;border-radius:50%;cursor:pointer}
.mp-lightbox-prev{left:20px}
.mp-lightbox-next{right:20px}

/* ---------- first-time contributor onboarding (js/onboarding.js) ---------- */
.onb-overlay{position:fixed;inset:0;z-index:980;display:none;place-items:center;padding:24px;
  background:rgba(4,6,10,.86);backdrop-filter:blur(10px)}
.onb-overlay.show{display:grid}
.onb-panel{width:min(640px,96vw);max-height:90vh;display:flex;flex-direction:column;
  background:var(--ink-3);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow);overflow:hidden;
  animation:onbIn .28s var(--ease)}
@keyframes onbIn{from{opacity:0;transform:translateY(14px) scale(.98)}to{opacity:1;transform:none}}
.onb-head{display:flex;gap:16px;align-items:flex-start;padding:20px 22px;border-bottom:1px solid var(--line);
  background:linear-gradient(160deg,rgba(227,179,34,.06),transparent)}
.onb-head .onb-mark{width:44px;flex:none;margin-top:2px}
.onb-head h2{font-size:1.15rem;margin:0}
.onb-sub{color:var(--muted);font-size:.86rem;margin:4px 0 0;line-height:1.5}
.onb-body{flex:1;overflow-y:auto;padding:8px 22px 4px}
.onb-sec{padding:14px 0;border-bottom:1px solid var(--line)}
.onb-sec h3{font-size:.98rem;margin:0 0 6px}
.onb-sec p{color:var(--muted);font-size:.86rem;line-height:1.6;margin:0 0 10px}
.onb-check{display:flex;gap:9px;align-items:flex-start;font-size:.86rem;cursor:pointer;color:var(--text)}
.onb-check input{margin-top:3px;flex:none;width:16px;height:16px;accent-color:var(--gold)}
.onb-fineprint{color:var(--muted);font-size:.78rem;line-height:1.6;margin:14px 0 4px}
.onb-fineprint a{color:var(--gold)}
.onb-sign{display:grid;grid-template-columns:1fr 160px;gap:12px;margin:14px 0 20px}
.onb-sign label{display:flex;flex-direction:column;gap:5px;font-size:.8rem;color:var(--muted)}
.onb-sign input{background:var(--panel);color:var(--text);border:1px solid var(--line);border-radius:10px;
  padding:9px 11px;font-family:var(--font-body);font-size:.9rem}
.onb-sign #onbSignature{font-family:var(--font-display);font-size:1.05rem;letter-spacing:.01em}
.onb-foot{display:flex;justify-content:flex-end;gap:10px;padding:14px 22px;border-top:1px solid var(--line);
  background:rgba(var(--overlay-rgb),.02)}
@media(max-width:520px){.onb-sign{grid-template-columns:1fr}}

/* HR Admin permanent contact bar (hr.html) — pinned to the bottom of the
   viewport so the hr@ / admin@ split is always in reach. */
.hr-contactbar{position:sticky;bottom:0;z-index:500;background:rgba(var(--surface-rgb),.94);
  backdrop-filter:blur(12px);border-top:1px solid var(--line)}
.hr-contactbar[hidden]{display:none}
.hr-contactbar .wrap{display:flex;flex-wrap:wrap;gap:8px 28px;align-items:center;justify-content:center;
  padding:11px 20px;font-size:.82rem;color:var(--muted)}
.hr-contactbar a{color:var(--gold)}
.hr-contactbar .ic{vertical-align:-2px;margin-right:5px}
@media(max-width:560px){.hr-contactbar .wrap{flex-direction:column;gap:4px}}

/* marquee */
.marquee{overflow:hidden;border-block:1px solid var(--line);padding:20px 0;background:rgba(var(--overlay-rgb),.02)}
.marquee .track{display:flex;gap:56px;width:max-content;animation:mq 30s linear infinite;font-family:var(--font-display);
  font-size:1.2rem;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);white-space:nowrap}
.marquee .track b{color:var(--text)}
@keyframes mq{to{transform:translateX(-50%)}}

/* pricing */
.plan{display:flex;flex-direction:column}
.plan.featured{border-color:var(--gold);background:linear-gradient(170deg,rgba(227,179,34,.1),rgba(var(--overlay-rgb),.02));transform:scale(1.03)}
.plan .price{font-family:var(--font-display);font-size:2.6rem;margin:8px 0 2px}
.plan .price small{font-size:1rem;color:var(--muted);font-weight:400}
.plan ul{list-style:none;margin:16px 0 20px;display:grid;gap:11px;flex:1}
.plan ul li{padding-left:28px;position:relative;color:var(--muted);font-size:.95rem}
.plan ul li::before{content:"✓";position:absolute;left:0;top:0;width:19px;height:19px;border-radius:50%;
  background:var(--green-soft);color:var(--green);font-size:.7rem;display:grid;place-items:center}
.plan.featured ul li::before{background:var(--gold-soft);color:var(--gold)}

/* forms */
.form{display:grid;gap:16px}
.form label{font-size:.8rem;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);display:grid;gap:8px;font-weight:600}
.form input,.form select,.form textarea{width:100%;padding:13px 16px;border-radius:12px;border:1px solid var(--line);
  background:rgba(var(--overlay-rgb),.035);color:var(--text);font:inherit;transition:border-color .2s,background .2s,box-shadow .2s}
.form input:hover,.form select:hover,.form textarea:hover{border-color:rgba(var(--overlay-rgb),.22)}
.form input:focus,.form select:focus,.form textarea:focus{outline:none;border-color:var(--gold);
  background:rgba(227,179,34,.06);box-shadow:0 0 0 3px var(--gold-soft)}
.form input::placeholder,.form textarea::placeholder{color:rgba(154,163,181,.55)}
.form input:disabled,.form select:disabled,.form textarea:disabled{opacity:.5;cursor:not-allowed}
.form textarea{min-height:130px;resize:vertical;line-height:1.5}
/* native select gets a custom gold caret so it matches the dark theme */
.form select{appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:40px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23e3b322' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 15px center}
select option{background:var(--green-dark);color:var(--text)}
/* checkboxes / radios pick up the brand accent */
.form input[type=checkbox],.form input[type=radio],input[type=checkbox],input[type=radio]{accent-color:var(--gold)}
.form input[type=checkbox],.form input[type=radio]{width:auto;box-shadow:none}
/* file input: style the browse button to match .btn */
.form input[type=file]{padding:9px 12px;cursor:pointer}
.form input[type=file]::file-selector-button{font:inherit;font-weight:600;margin-right:12px;padding:8px 16px;
  border-radius:100px;border:0;background:var(--gold-soft);color:var(--gold);cursor:pointer;transition:.2s}
.form input[type=file]::file-selector-button:hover{background:var(--gold);color:#151002}
/* color input: trim the native chrome */
.form input[type=color]{padding:4px;height:44px;cursor:pointer}
.form .row{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media (max-width:560px){.form .row{grid-template-columns:1fr}}
.dropzone{border:2px dashed var(--line);border-radius:16px;padding:34px;text-align:center;color:var(--muted);
  transition:.3s;cursor:pointer;font-size:.94rem}
.dropzone:hover{border-color:var(--gold);color:var(--gold);background:var(--gold-soft)}

/* tables / dash */
.panel{background:linear-gradient(160deg,rgba(var(--overlay-rgb),.045),rgba(var(--overlay-rgb),.012));border:1px solid var(--line);
  border-radius:var(--r-lg);padding:26px}
.table{width:100%;border-collapse:collapse;font-size:.93rem}
.table th{color:var(--muted);text-transform:uppercase;font-size:.72rem;letter-spacing:.1em;text-align:left;padding:12px 14px;border-bottom:1px solid var(--line)}
.table td{padding:14px;border-bottom:1px solid var(--line)}
.table tr:last-child td{border-bottom:0}
.pill{padding:4px 12px;border-radius:100px;font-size:.74rem;font-weight:600}
.pill.ok{background:var(--green-soft);color:var(--green)}
.pill.warn{background:var(--gold-soft);color:var(--gold)}
.pill.no{background:var(--red-soft);color:var(--red)}
.bar{height:8px;border-radius:100px;background:rgba(var(--overlay-rgb),.08);overflow:hidden}
.bar i{display:block;height:100%;border-radius:100px;background:var(--grad);transition:width 1.4s var(--ease)}

/* store */
.filters{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:34px;align-items:center}
.chip{padding:9px 20px;border-radius:100px;border:1px solid var(--line);background:rgba(var(--overlay-rgb),.03);
  color:var(--muted);font-size:.88rem;transition:.25s}
.chip:hover{color:var(--text)}
.chip.on{background:var(--gold);color:#151002;border-color:transparent;font-weight:600}
.search{flex:1;min-width:220px;display:flex;align-items:center;gap:10px;padding:10px 18px;border-radius:100px;
  border:1px solid var(--line);background:rgba(var(--overlay-rgb),.04)}
.search input{background:none;border:0;color:var(--text);font:inherit;width:100%;outline:none}
.product .ph{height:220px;border-radius:14px;margin-bottom:18px;display:grid;place-items:center;font-size:3rem;position:relative;overflow:hidden}
.product .ph::after{content:"";position:absolute;inset:0;background:linear-gradient(120deg,transparent 30%,rgba(var(--overlay-rgb),.14) 50%,transparent 70%);transform:translateX(-110%);transition:transform .9s var(--ease)}
.product:hover .ph::after{transform:translateX(110%)}
.product .prc{display:flex;justify-content:space-between;align-items:center;margin-top:14px}
.product .prc b{font-family:var(--font-display);font-size:1.15rem}
.wish{background:none;border:0;font-size:1.2rem;color:var(--muted);transition:.25s}
.wish.on,.wish:hover{color:var(--red);transform:scale(1.2)}

/* admin control room — section rail + embedded editor window */
.admin-rail{position:sticky;top:70px;z-index:6;display:flex;gap:10px;flex-wrap:wrap;padding:12px;
  border-radius:100px;border:1px solid var(--line);background:rgba(var(--surface-rgb),.82);backdrop-filter:blur(14px)}
.admin-rail .chip{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:var(--font-body)}
.admin-rail .chip i{font-size:.95em;display:inline-flex}
.admin-rail .chip i svg{width:1em;height:1em}
@media (max-width:720px){.admin-rail{top:60px;border-radius:var(--r-md)}}

/* accordion */
.acc{border:1px solid var(--line);border-radius:var(--r-md);margin-bottom:12px;overflow:hidden;background:rgba(var(--overlay-rgb),.02)}
.acc summary{padding:18px 22px;cursor:pointer;font-weight:600;list-style:none;display:flex;justify-content:space-between;align-items:center}
.acc summary::after{content:"+";font-size:1.3rem;color:var(--gold);transition:.3s}
.acc[open] summary::after{transform:rotate(45deg)}
.acc .acc-body{padding:0 22px 20px;color:var(--muted);font-size:.96rem}

/* Admin CMS — per-page settings groups. Each front-end page's admin panels
   (e.g. every tool that edits blackgoat.html) are collapsed into one of
   these by default instead of all showing fully expanded at once, so
   picking a Control Room tab shows a short list of page names rather than
   a long stack of open panels — click a page open to see/edit its tools,
   collapse it again when done. Reuses the same open/close chevron language
   as .acc above, just a bigger summary row since it's grouping whole panels
   instead of one form. */
.admin-page-group{border:1px solid var(--line);border-radius:var(--r-md);margin-bottom:14px;overflow:hidden;background:rgba(var(--overlay-rgb),.02)}
.admin-page-group>summary{padding:18px 22px;cursor:pointer;font-weight:700;font-size:1.02rem;list-style:none;
  display:flex;justify-content:space-between;align-items:center;gap:10px}
.admin-page-group>summary span{display:flex;align-items:center;gap:10px}
.admin-page-group>summary i{width:18px;height:18px;flex:none}
.admin-page-group>summary::after{content:"+";font-size:1.3rem;color:var(--gold);transition:.3s;flex:none}
.admin-page-group[open]>summary::after{transform:rotate(45deg)}
.admin-page-group[open]>summary{border-bottom:1px solid var(--line)}
.admin-page-group .admin-page-body{padding:22px;display:grid;gap:22px}
.admin-page-group .admin-page-body .panel{margin:0}

/* Page admin console — the single tabbed console embedded at the bottom of
   a front-end page (manja/store/blackgoat/taskpays/careers/internships/
   course/hr/clubadmin), replacing the old stack of always-visible panels.
   One console per page; its settings groups become tabs. */
.page-console{border:1px solid var(--line);border-radius:var(--r-lg);background:rgba(var(--overlay-rgb),.02);
  padding:24px;margin-top:10px}
.page-console-head{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:18px}
.page-console-head h3{font-size:1.15rem;display:flex;align-items:center;gap:10px}
.page-console-tabs{display:flex;gap:8px;flex-wrap:wrap;border-bottom:1px solid var(--line);padding-bottom:16px;margin-bottom:20px}
.page-console-tab{padding:9px 18px;border-radius:100px;border:1px solid var(--line);background:rgba(var(--overlay-rgb),.03);
  color:var(--muted);font-size:.88rem;font-weight:600;transition:.25s;cursor:pointer;display:inline-flex;align-items:center;gap:7px}
.page-console-tab:hover{color:var(--text)}
.page-console-tab.on{background:var(--gold);color:#151002;border-color:transparent}
.page-console-panel[hidden]{display:none}

/* Colour swatch — pairs any `select[data-swatch]` (whose <option>s carry
   data-hex) with a live dot showing the currently selected colour, so admins
   see the actual colour instead of just a token name like "gold". */
.swatch-field{display:flex;align-items:center;gap:10px}
.swatch-field select{flex:1}
.color-swatch-dot{width:26px;height:26px;border-radius:50%;border:2px solid var(--line);flex:none;
  box-shadow:inset 0 0 0 2px rgba(0,0,0,.15);transition:.2s}

/* Field + live preview — pairs a text/textarea input with a small rendered
   preview of the element it feeds, so admins see the result without
   navigating to the live page. */
.field-preview-wrap{display:grid;gap:6px}
.field-preview{border:1px dashed var(--line);border-radius:var(--r-md);padding:10px 14px;font-size:.9rem;
  color:var(--text);background:rgba(var(--overlay-rgb),.02);min-height:1.4em}
.field-preview::before{content:"Preview";display:block;font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;
  color:var(--muted);margin-bottom:4px}
.field-preview:empty::after{content:"—";color:var(--muted)}

/* toast + cart */
#toast{position:fixed;bottom:26px;left:50%;transform:translate(-50%,80px);background:rgba(var(--surface-rgb),.95);
  /* Top of the stack. A toast is the confirmation for whatever is in front of
     the user, so at 900 it was invisible behind any modal that reports through
     it — including the admin media tools, which say "Saved" this way. */
  border:1px solid var(--line);backdrop-filter:blur(14px);padding:14px 26px;border-radius:100px;z-index:99200;
  transition:.4s var(--ease);opacity:0;font-size:.94rem;box-shadow:var(--shadow)}
#toast.show{transform:translate(-50%,0);opacity:1}
#toast b{color:var(--gold)}

/* search modal */
#searchModal{position:fixed;inset:0;display:none;z-index:999;opacity:0;transition:.3s var(--ease)}
#searchModal.open{display:flex;opacity:1}
#searchModal.open .search-overlay{animation:fadeIn .3s var(--ease)}
#searchModal.open .search-panel{animation:slideDown .3s var(--ease)}
.search-overlay{position:fixed;inset:0;background:rgba(4,6,10,.7);backdrop-filter:blur(8px);cursor:pointer}
.search-panel{position:fixed;top:0;left:0;right:0;margin:60px auto 0;max-width:620px;background:var(--ink);border:1px solid var(--line);border-radius:20px;box-shadow:var(--shadow);z-index:1000;max-height:70vh;overflow-y:auto;display:flex;flex-direction:column}
.search-header{display:flex;align-items:center;gap:12px;padding:20px 24px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--ink)}
.search-input{flex:1;background:transparent;border:none;font-size:1.1rem;color:var(--text);outline:none;font-family:inherit;caret-color:var(--gold)}
.search-input::placeholder{color:var(--muted)}
.search-close{width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:transparent;cursor:pointer;display:grid;place-items:center;color:var(--text);transition:.2s;flex-shrink:0}
.search-close:hover{color:var(--gold);border-color:var(--gold)}
.search-results{flex:1;overflow-y:auto;padding:12px 0}
.result-item{display:block;padding:16px 24px;text-decoration:none;color:var(--text);border-bottom:1px solid rgba(var(--overlay-rgb),.04);transition:.2s}
.result-item:hover{background:rgba(var(--overlay-rgb),.05);color:var(--gold)}
.result-title{font-weight:500;margin-bottom:4px}
.result-desc{font-size:.88rem;color:var(--muted)}
.no-results{padding:32px 24px;text-align:center;color:var(--muted)}
.search-suggestions{padding:24px;border-top:1px solid var(--line);background:rgba(var(--overlay-rgb),.02)}
.sugg-label{font-size:.85rem;color:var(--muted);font-weight:500;margin-bottom:12px;text-transform:uppercase;letter-spacing:1px}
.sugg-item{display:inline-block;padding:8px 14px;background:rgba(227,179,34,.1);border:1px solid rgba(227,179,34,.2);border-radius:12px;color:var(--text);text-decoration:none;margin-right:8px;margin-bottom:8px;font-size:.9rem;transition:.2s}
.sugg-item:hover{background:rgba(227,179,34,.2);border-color:var(--gold);color:var(--gold)}
/* search: "All / People" filter row and the People block — kept as a
   visually distinct section (its own background tint and rule lines) so a
   person is never interleaved with a page or product result. */
.search-kind-row{display:flex;gap:8px;padding:10px 24px;border-bottom:1px solid var(--line)}
.search-kind-row .tag{margin:0;border:none;cursor:pointer}
#searchModal.people-only #searchResults{display:none}
.search-people{border-bottom:1px solid var(--line);background:rgba(var(--overlay-rgb),.025)}
.search-people:empty{display:none;border-bottom:none}
.people-label{display:flex;align-items:center;gap:6px;padding:14px 24px 6px;font-size:.72rem;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}
.people-label i{width:13px;height:13px}
.person-item{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 24px}
.person-name{font-weight:500;color:var(--text)}
.person-meta{font-size:.85rem;color:var(--muted);margin-top:2px}
.person-side{display:flex;align-items:center;gap:8px;flex-shrink:0}
.person-dept{font-size:.78rem;color:var(--muted);white-space:nowrap}
.search-people #peopleMoreBtn{margin:2px 24px 14px}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes slideDown{from{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}
@media(max-width:768px){.search-panel{max-width:90vw;margin-top:50px}.search-header{padding:16px 18px}.search-input{font-size:1rem}.search-results,.search-suggestions{padding:16px}.search-kind-row{padding:10px 18px}.people-label,.person-item{padding-left:18px;padding-right:18px}}

/* celebration overlay */
/* Newsletter prompt modal (index.html "Subscribe to the Wave") — same
   fixed-overlay pattern as #celebrate below, but content-rich (video, fun
   facts, FAQ) rather than a one-shot celebration card, so it scrolls on
   short viewports instead of being fixed-height. */
#newsletterModal{position:fixed;inset:0;z-index:950;display:none;place-items:center;
  background:rgba(4,6,10,.86);backdrop-filter:blur(8px);padding:20px;overflow-y:auto}
#newsletterModal.show{display:grid}
#newsletterModal .nl-card{position:relative;width:min(560px,100%);max-height:90vh;overflow-y:auto;
  border-radius:22px;background:var(--ink-3);border:1px solid var(--line);animation:pop .4s var(--ease);margin:auto}
.nl-close{position:absolute;top:10px;right:14px;z-index:2;background:none;border:0;color:#fff;
  font-size:1.6rem;line-height:1;cursor:pointer;opacity:.8}
.nl-close:hover{opacity:1}
.nl-video{position:relative;aspect-ratio:16/9;background:#000;border-radius:22px 22px 0 0;overflow:hidden}
.nl-video iframe{width:100%;height:100%;border:0}
.nl-body{padding:26px 28px 28px}
.nl-body h3{margin:6px 0 10px;font-size:1.2rem}
.nl-facts{margin:16px 0;padding:14px 16px;border:1px dashed var(--line);border-radius:12px}
.nl-facts ul{margin:8px 0 0;padding-left:18px;color:var(--muted);font-size:.86rem;line-height:1.6}
.nl-faq{border-top:1px solid var(--line);padding:10px 0;font-size:.86rem}
.nl-faq summary{cursor:pointer;font-weight:600}
.nl-faq p{color:var(--muted);margin-top:8px}
#celebrate{position:fixed;inset:0;z-index:950;display:none;place-items:center;background:rgba(4,6,10,.86);backdrop-filter:blur(8px)}
#celebrate.show{display:grid}
#celebrate .c-card{text-align:center;padding:40px 28px;border-radius:28px;background:var(--ink-3);border:1px solid var(--line);position:relative;overflow:hidden;animation:pop .6s var(--ease)}
@keyframes pop{from{transform:scale(.8);opacity:0}}
#celebrate img{width:110px;margin:0 auto 18px;animation:pulse 2s infinite}
#confetti{position:absolute;inset:0;pointer-events:none}

/* "View All" circular button — large triangular arrow (no shaft) floating behind the label */
.view-all-circle{position:relative;overflow:hidden;flex-direction:column;align-items:center;justify-content:center;line-height:1.15;text-align:center}
.view-all-circle .va-arrow{position:absolute;left:50%;top:50%;z-index:0;pointer-events:none;
  width:0;height:0;border-top:32px solid transparent;border-bottom:32px solid transparent;
  border-left:46px solid rgba(21,16,2,.32);transform:translate(-34%,-50%)}
.view-all-circle .va-label{position:relative;z-index:1}

/* footer illustration */
.footer-illustration{width:100%;margin:0 auto;display:block;opacity:.9}
.footer-illustration svg{width:100%;height:auto;display:block}

/* footer — every section centered, always (not just below the old 720px
   breakpoint). footer, .f-grid, .f-bottom and .f-legal are pure layout
   containers: they must never carry position/transform themselves (see the
   NO_DRAG_SEL guard in js/site-overrides.js applyStyleMap) — that's what let
   a stray drag/resize in the editor pin the whole footer off-center and
   left-locked, inconsistently, on whichever page it happened to be saved
   against. Centering here is real box layout (width + margin-inline:auto),
   not a leftover no-op. */
footer{border-top:1px solid var(--line);padding:48px 0 0;background:linear-gradient(to bottom,transparent,var(--footer-scrim));text-align:center}
.f-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:36px;margin-bottom:32px;width:100%;text-align:center;justify-items:center}
.f-grid h4{font-size:.82rem;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);margin-bottom:18px}
.f-grid a{display:block;padding:5px 0;color:var(--muted);font-size:.94rem;transition:.25s}
.f-grid a:hover{color:var(--gold);transform:translateX(4px)}
.f-brand{display:flex;flex-direction:column;align-items:center}
.f-brand p{color:var(--muted);font-size:.94rem;max-width:300px;margin-top:14px;text-align:center}
.f-brand .footer-brand-logo{width:180px;height:auto;padding:0;margin:0 auto 10px}
/* The footer's inner column centers like every other .wrap on the site —
   width is what actually makes margin-inline:auto do anything; without it
   a block element has no spare room to center into (this was previously
   missing, which made the rule a silent no-op). */
.f-grid,.f-bottom,.f-legal{width:100%;max-width:100%;margin-inline:auto}
.socials{display:flex;gap:10px;margin-top:20px;justify-content:center}
.socials a{width:42px;height:42px;border-radius:50%;border:1px solid var(--line);display:grid;place-items:center;
  font-size:1rem;transition:.3s;padding:0}
.socials a{color:var(--text)}
.socials a svg{width:20px;height:20px}
.socials a.instagram:hover{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff}
.socials a.youtube:hover{background:#FF0000;color:#fff}
.socials a.tiktok:hover{background:#000;color:#25F4EE}
.socials a.x:hover{background:#000;color:#fff}
.socials a.linkedin:hover{background:#0A66C2;color:#fff}
.socials a:hover{transform:translateY(-4px)}
.f-bottom{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap;padding-top:26px;border-top:1px solid var(--line);
  color:var(--muted);font-size:.85rem;text-align:center}
.f-bottom>span{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:12px}

/* Footer alignment, driven by config/theme.footerAlign (see
   js/site-overrides.js applyTheme). Center is the coded default; this is
   the only other option. */
:root[data-footer-align="left"] footer{text-align:left}
:root[data-footer-align="left"] .f-grid{text-align:left;justify-items:start}
:root[data-footer-align="left"] .f-brand{align-items:flex-start}
:root[data-footer-align="left"] .f-brand p{text-align:left;margin-inline:0}
:root[data-footer-align="left"] .socials{justify-content:flex-start}
:root[data-footer-align="left"] .f-bottom{align-items:flex-start;text-align:left}
:root[data-footer-align="left"] .f-bottom>span{justify-content:flex-start}
:root[data-footer-align="left"] .f-legal{justify-content:flex-start}
@media(max-width:720px){
  /* Small screens stay centered regardless of the desktop setting — a
     left-aligned multi-column footer has nothing left to align against
     once everything's stacked to one column anyway. */
  :root[data-footer-align="left"] footer,
  :root[data-footer-align="left"] .f-grid,
  :root[data-footer-align="left"] .f-brand,
  :root[data-footer-align="left"] .f-bottom,
  :root[data-footer-align="left"] .f-legal{text-align:center;align-items:center;justify-items:center;justify-content:center}
  :root[data-footer-align="left"] .f-brand p{margin-inline:auto}
}

/* breadcrumbish page hero note — manga chapter-tag treatment (paper label,
   ink border, slight tilt) so every sub-page hero shares the Manja identity */
.page-note{display:inline-block;background:#f2ecdf;color:#0c0a06;font-size:.78rem;font-weight:700;
  letter-spacing:.18em;text-transform:uppercase;padding:5px 14px;border-radius:3px;
  border:1.5px solid #0c0a06;box-shadow:3px 3px 0 rgba(0,0,0,.5);transform:rotate(-1.2deg);margin-bottom:10px}
.page-note a{color:inherit}

/* live badge */
.live-frame{border-radius:var(--r-lg);border:1px solid var(--line);overflow:hidden;background:#000;aspect-ratio:16/9;position:relative}
.live-frame iframe{width:100%;height:100%;border:0}
.live-badge{position:absolute;top:16px;left:16px;z-index:3;display:flex;align-items:center;gap:8px;
  background:rgba(0,0,0,.65);backdrop-filter:blur(8px);padding:7px 16px;border-radius:100px;font-size:.8rem;font-weight:700;letter-spacing:.1em}
.live-badge i{width:9px;height:9px;border-radius:50%;background:var(--red);box-shadow:0 0 12px var(--red);animation:blink 1.4s infinite}

/* elements that should only render while a stream is actually live (toggled by main.js) */
[data-live-only]{display:none}
[data-live-only].is-live{display:inline-flex}
.live-badge[data-live-only].is-live{display:flex}

/* timeline */
.timeline{position:relative;padding-left:34px}
.timeline::before{content:"";position:absolute;left:8px;top:6px;bottom:6px;width:2px;background:linear-gradient(var(--gold),var(--red),var(--green))}
.t-item{position:relative;padding-bottom:34px}
.t-item::before{content:"";position:absolute;left:-32px;top:6px;width:14px;height:14px;border-radius:50%;background:var(--ink);border:3px solid var(--gold)}
.t-item:nth-child(2)::before{border-color:var(--red)}
.t-item:nth-child(3)::before{border-color:var(--green)}
.t-item:nth-child(4)::before{border-color:var(--gold)}
.t-item:nth-child(5)::before{border-color:var(--red)}
.t-item h4{margin-bottom:6px}.t-item p{color:var(--muted);font-size:.95rem}
.t-item .when{font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:var(--gold)}

/* responsive */
@media(max-width:1020px){
  .g4{grid-template-columns:repeat(2,1fr)}
  .g5{grid-template-columns:repeat(3,1fr)}
  .g3{grid-template-columns:repeat(2,1fr)}
  .f-grid{grid-template-columns:1fr 1fr}
  .f-bottom{justify-content:center;text-align:center}
  .stats{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:720px){
  .g2,.g3,.g4,.g5{grid-template-columns:1fr}
  .form .row{grid-template-columns:1fr}
  .plan.featured{transform:none}
  .hero{padding-top:120px}
  .f-grid{grid-template-columns:1fr;text-align:center}
  .f-brand p{max-width:none}
  .socials{justify-content:center}
  .f-bottom{justify-content:center;text-align:center}
  .f-brand .footer-brand-logo{width:80px;height:auto;padding:0;margin:0 auto 10px}
}
/* ============================================================
   BENTO LAYOUT (2026 redesign — per art direction mockup)
   ============================================================ */
.bento-wrap{width:min(1380px,95vw);margin-inline:auto}
.homepage-bento{padding:24px;margin:-1px auto}
.bento{display:grid;grid-template-columns:1fr 396px;gap:16px;align-items:start}
.b-col{display:grid;gap:16px}
.b-card{background:var(--panel);border:1px solid var(--line);border-radius:20px;padding:26px;position:relative;overflow:hidden;transition:.35s var(--ease)}
.b-card:hover{border-color:rgba(var(--overlay-rgb),.22)}
.b-label{font-size:.72rem;letter-spacing:.2em;text-transform:uppercase;font-weight:700;margin-bottom:14px;display:flex;align-items:center;gap:10px}
.b-label.gold{color:var(--gold)}.b-label.green{color:var(--green)}.b-label.red{color:var(--red)}
.b-label .va{margin-left:auto}
.va{font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;font-weight:700;color:var(--muted);
  border:1px solid var(--line);border-radius:100px;padding:6px 14px;transition:.25s;white-space:nowrap}
.va:hover{color:var(--text);border-color:var(--gold)}
.live-blink{animation:liveBlink 1.6s ease-in-out infinite}
@keyframes liveBlink{0%,100%{opacity:1}50%{opacity:.35}}

/* club chat member badges — color is derived server-side (subscriptionTier /
   hasOneTimePurchase), never client-set, so these are trustworthy signals */
.chat-badge{font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;font-weight:700;
  border-radius:100px;padding:2px 9px;margin-left:6px;display:inline-block}
.chat-badge.advanced{background:rgba(227,179,34,.18);color:var(--gold);border:1px solid var(--gold)}
.chat-badge.basic{background:rgba(0,179,86,.16);color:var(--green);border:1px solid var(--green)}
.chat-badge.supporter{background:rgba(var(--overlay-rgb),.08);color:var(--muted);border:1px solid var(--line)}

/* hero card */
.hero-card{min-height:520px;display:flex;align-items:center;padding:56px 54px;border-radius:22px;
  background:
    radial-gradient(60% 90% at 82% 30%,rgba(224,110,20,.28),transparent 60%),
    radial-gradient(45% 70% at 90% 85%,rgba(0,179,86,.16),transparent 60%),
    radial-gradient(50% 70% at 10% 90%,rgba(224,48,58,.12),transparent 65%),
    linear-gradient(150deg,#131008,#0a0705 45%,#050505);
  border:1px solid var(--line)}
.hero-card .hc-body{position:relative;z-index:3;max-width:560px}
.hero-card h1{font-size:clamp(2.3rem,4.6vw,4rem);text-transform:uppercase;letter-spacing:.01em;line-height:1.04}
.hero-card h1 span{display:inline-block;animation:kineticIn .9s var(--ease) both}
.hero-card h1 .w-gold{color:var(--gold);text-shadow:0 0 34px var(--glow-gold);animation-delay:.08s}
.hero-card h1 .w-red{color:var(--red);text-shadow:0 0 34px var(--glow-red);animation-delay:.22s}
.hero-card h1 .w-green{color:var(--green);text-shadow:0 0 34px var(--glow-green);animation-delay:.36s}
@keyframes kineticIn{from{opacity:0;transform:translateY(16px);filter:blur(8px)}to{opacity:1;transform:none;filter:blur(0)}}
@media(prefers-reduced-motion:reduce){.hero-card h1 span{animation:none}}
.hero-card p.lead{margin:20px 0 30px;font-size:1.08rem}
.hero-skyline{position:absolute;inset:auto 0 0 0;height:46%;z-index:1;opacity:.5;pointer-events:none}
.hero-streaks{position:absolute;inset:0;z-index:2;pointer-events:none;mix-blend-mode:screen}
.scroll-cue{position:absolute;right:34px;bottom:30px;z-index:3;display:flex;flex-direction:column;align-items:center;gap:8px;
  color:var(--muted);font-size:.62rem;letter-spacing:.2em;text-transform:uppercase}
.scroll-cue i{width:38px;height:38px;border:1px solid var(--line);border-radius:50%;display:grid;place-items:center;
  font-style:normal;animation:bob 2s var(--ease) infinite}
@keyframes bob{50%{transform:translateY(6px)}}

/* quick links strip */
.quick-strip{display:grid;grid-template-columns:repeat(7,1fr);gap:0;background:var(--panel);
  border:1px solid var(--line);border-radius:18px;overflow:hidden}
.quick-strip a{padding:20px 10px;text-align:center;border-right:1px solid var(--line);transition:.3s;display:grid;gap:6px;justify-items:center}
.quick-strip a:last-child{border-right:0}
.quick-strip a:hover{background:rgba(227,179,34,.07);transform:translateY(-2px)}
.quick-strip .qi{width:44px;height:44px;border:1px solid var(--gold);border-radius:12px;display:grid;place-items:center;
  color:var(--gold);font-size:1.15rem}
.quick-strip .qi-shell{width:26px;height:26px;object-fit:contain}
.quick-strip b{font-size:.7rem;letter-spacing:.12em;text-transform:uppercase}
.quick-strip small{color:var(--muted);font-size:.66rem}

/* mini poster tiles (courses/clubs) */
.tile-row{display:grid;gap:12px}
.tile{border-radius:14px;overflow:hidden;position:relative;min-height:150px;border:1px solid var(--line);
  display:flex;align-items:flex-end;transition:.35s var(--ease);cursor:pointer}
.tile:hover{transform:translateY(-4px);border-color:rgba(var(--overlay-rgb),.3)}
.tile .t-art{position:absolute;inset:0;display:grid;place-items:center;font-size:2.4rem}
.tile .t-cap{position:relative;z-index:2;width:100%;padding:10px 12px;font-size:.76rem;font-weight:600;line-height:1.3;
  background:linear-gradient(to top,rgba(0,0,0,.78),transparent);text-shadow:0 1px 6px rgba(0,0,0,.7);text-transform:capitalize}
.tile .t-tag{position:absolute;top:10px;left:10px;z-index:2;font-size:.58rem;letter-spacing:.12em;font-weight:800;
  padding:3px 9px;border-radius:5px;text-transform:uppercase}
.t-tag.free{background:var(--green);color:#02150b}
.t-tag.basic{background:var(--gold);color:#151002}
.t-tag.adv{background:var(--red);color:#fff}
.tile-glow{border-color:var(--gold);box-shadow:0 0 26px var(--glow-gold)}

/* production roadmap — a color-coded pipeline flowchart (Development /
   Pre-Production / Shot Production / Post-Production, per the studio's own
   pipeline diagrams) instead of a loose auto-scrolling row: a legend, then
   connected nodes with arrow connectors between each, then dark stat tiles
   for overall status. */
.phase-legend{display:flex;flex-wrap:wrap;gap:10px 22px;margin-bottom:22px}
.phase-legend .lg-item{display:flex;align-items:center;gap:8px;font-size:.72rem;letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
.phase-legend .lg-dot{width:10px;height:10px;border-radius:3px;flex:none}

.phase-flow{display:flex;flex-wrap:wrap;align-items:stretch;justify-content:center;gap:0;row-gap:26px}
.phase-node{flex:1 1 168px;max-width:210px;border-radius:16px;border:1px solid var(--line);
  background:linear-gradient(160deg,rgba(var(--overlay-rgb),.05),rgba(var(--overlay-rgb),.015));padding:20px 18px;
  display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center;position:relative}
.phase-node .cat-tag{display:inline-flex;align-items:center;font-size:.6rem;font-weight:800;
  letter-spacing:.1em;text-transform:uppercase;padding:3px 10px;border-radius:100px;color:#050505}
.phase-node .step-no{position:absolute;top:-11px;left:-11px;width:26px;height:26px;border-radius:50%;
  background:var(--panel);border:1px solid var(--line);color:var(--muted);font-size:.72rem;font-weight:800;
  display:grid;place-items:center;font-family:var(--font-display)}
/* The count line under a phase's name, when the board is the source: "14 of
   20 done", or "No work yet". The admin panel writes free prose into the same
   field, so it is clipped to one line rather than allowed to stretch the card. */
.phase-node .phase-count{font-size:.68rem;letter-spacing:.06em;color:var(--muted);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.phase-node.current{border-color:var(--gold);box-shadow:0 0 22px var(--glow-gold)}
.phase-node.current .step-no{background:var(--gold);border-color:var(--gold);color:#151002}
.phase-node.complete .step-no{background:var(--green);border-color:var(--green);color:#02150b}
.phase-node h3{font-size:.96rem}
.phase-node .bar{width:100%;height:5px}
/* arrow connector between nodes, echoing the flowchart references */
.phase-connector{flex:0 0 34px;display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:1.3rem;align-self:center}
@media(max-width:760px){
  .phase-flow{flex-direction:column;align-items:stretch}
  .phase-node{max-width:none}
  .phase-connector{align-self:center;transform:rotate(90deg);flex-basis:20px}
}

.phase-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;margin-top:28px}
.phase-stat{padding:18px 20px;border:1px solid var(--line);border-radius:14px;background:rgba(var(--overlay-rgb),.02)}
.phase-stat .ps-label{font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);
  padding-bottom:8px;margin-bottom:10px;border-bottom:2px solid var(--stat-accent,var(--gold))}
.phase-stat b{display:block;font-family:var(--font-display);font-size:1.4rem}
.phase-stat .bar{margin-top:8px;height:6px}

/* WALK THE PATH diagram — circular icon nodes chained by arrows, grouped
   into rows (Pre-Production / Post-Production stack full width; the 2D and
   3D Production paths sit side by side since they run in parallel). Each
   group's --wp-color custom property (set inline per node/arrow from
   js/walkthrough.js) is the same Development/Pre-Production/Shot Production/
   Post-Production category color the phase tracker above and the
   internships.html phase tiles use — one legend, one meaning, everywhere. */
.walk-path-panel{margin-top:24px;padding-top:24px;border-top:1px solid var(--line)}
/* Status bar — plain-language readout of the same `current` pointer that
   lights up a node below, so the "where are we" answer doesn't require
   hunting through the diagram for the one glowing circle. */
.wp-status-bar{display:flex;align-items:center;justify-content:center;gap:10px;
  margin-bottom:22px;padding:10px 18px;border-radius:100px;border:1px solid var(--line);
  background:rgba(var(--overlay-rgb),.03);font-size:.84rem;color:var(--muted)}
.wp-status-bar b{color:var(--text)}
.wp-status-dot{width:9px;height:9px;border-radius:50%;flex:none;background:var(--gold);
  box-shadow:0 0 10px var(--glow-gold);animation:wpStatusPulse 1.8s ease-in-out infinite}
.wp-status-dot.off{background:var(--muted);box-shadow:none;animation:none}
@keyframes wpStatusPulse{0%,100%{opacity:1}50%{opacity:.4}}
#pipelineSummary>summary{list-style:none}
#pipelineSummary>summary::-webkit-details-marker{display:none}
#pipelineSummary[open]>summary .btn{display:none}
.wp-container{display:flex;align-items:stretch;gap:24px}
.wp-container .wp-groups{flex:1;min-width:0}
/* Stretches to match the main flow's height automatically via flex
   align-items:stretch on .wp-container — no fixed height needed, so it
   always spans "top to bottom" no matter how many phases are above it. */
.wp-editorial-lane{flex:0 0 200px;display:flex;flex-direction:column;gap:16px;
  padding:0 0 0 24px;border-left:2px dashed var(--line);position:relative}
.wp-editorial-lane:empty{display:none}
/* No top padding (unlike the old 20px) — "Editorial" needs to start flush
   with the top of the lane so its title lines up with "Development"'s
   title in the main flow, both being the first thing in equal-height,
   top-stretched columns (.wp-container align-items:stretch). */
.wp-editorial-lane .wp-group-title{justify-content:flex-start;text-align:left;margin-bottom:16px}
/* The lane's height is stretched to match the main flow (see .wp-container
   align-items:stretch above), but that only reaches .wp-editorial-lane
   itself — .wp-group and .wp-row don't inherit it for free, so without
   these two rules the "stretch to the bottom" comment above is a no-op and
   the stages just stack with their own gap. flex:1/min-height:0 on .wp-group
   passes the full lane height down to .wp-row; justify-content:space-between
   (not center) on .wp-row then puts the first stage level with Development
   at the very top, the last stage level with Post-Production's own row at
   the bottom, and the stages in between (Assembly Cut / Editorial Review /
   Picture Lock) spaced out equally across that same height. */
.wp-editorial-lane .wp-group{display:flex;flex-direction:column;flex:1;min-height:0}
.wp-editorial-lane .wp-row{flex-direction:column;align-items:flex-start;gap:22px;flex:1;justify-content:space-between}
.wp-editorial-lane .wp-node{flex:none;align-items:flex-start;text-align:left;flex-direction:row;flex-wrap:wrap;gap:14px}
/* In the editorial lane the circle+label sit in a row, not stacked — the
   task dropdown needs to force onto its own line below both rather than
   sit beside them as a third row item. */
.wp-editorial-lane .wp-tasks-drop{flex-basis:100%}
.wp-editorial-lane .wp-tip{display:none}
/* every phase in the main flow feeds continuously into Editorial */
.wp-editorial-lane::before{content:"";position:absolute;left:-2px;top:0;bottom:0;width:2px;
  background:linear-gradient(var(--gold),transparent 92%)}
/* Taken out of flow (absolute, pinned below the lane) rather than a normal
   trailing sibling of .wp-group — as a normal-flow sibling it consumed its
   own slice of the lane's stretched height, which left .wp-group (and so
   the last stage inside it) short of the exact bottom edge that's supposed
   to line up with Post-Production's row. Absolute removes it from that
   height math entirely, so .wp-group's flex:1 can claim the full lane
   height and the last stage actually reaches the bottom. */
.wp-editorial-note{position:absolute;left:0;right:0;top:100%;margin-top:8px;font-size:.74rem;color:var(--muted)}
@media (max-width:860px){
  .wp-container{flex-direction:column}
  .wp-editorial-lane{border-left:none;border-top:2px dashed var(--line);padding:20px 0 0}
  .wp-editorial-lane::before{left:0;right:0;top:-2px;bottom:auto;width:auto;height:2px;
    background:linear-gradient(90deg,var(--gold),transparent 92%)}
  .wp-editorial-lane .wp-row{flex-direction:row;flex-wrap:wrap}
}
.wp-groups{display:flex;flex-direction:column;align-items:center;gap:18px}
.wp-group{width:100%}
.wp-group-title{display:flex;align-items:center;justify-content:center;gap:8px;
  font-family:var(--font-display);font-size:.86rem;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--text);margin-bottom:16px}
.wp-group-title i{width:20px;height:20px}
/* The 2D and 3D Production paths run in parallel — a subtle tinted panel
   (instead of just a dashed outline) reads as "one production stage, two
   tracks" at a glance rather than two unrelated dashed boxes. */
.wp-parallel{display:grid;grid-template-columns:1fr;gap:30px;width:100%;
  padding:22px;border:1px dashed var(--line);border-radius:18px;background:rgba(var(--overlay-rgb),.02)}
.wp-parallel>.wp-group{padding:0 4px}
@media(min-width:820px){.wp-parallel>.wp-group:first-child{border-right:1px dashed var(--line);padding-right:26px}}
.wp-flow-arrow{display:flex;justify-content:center;color:var(--muted)}
.wp-flow-arrow i{width:20px;height:20px}
/* align-items:center (not flex-start) — the row can hold elements of very
   different heights (a plain node vs. the taller .wp-cycle loop-back
   cluster), and centering them on the cross-axis is what keeps a shorter
   neighbor (and the arrow beside it) vertically centered against a taller
   one instead of pinned to the top. */
.wp-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:0;row-gap:26px}
/* A stage that breaks the row (see js/walkthrough.js rowSegmentsHTML) is
   followed by a down arrow instead of continuing horizontally — same look
   as the arrow between whole groups. */
.wp-row-break{display:flex;justify-content:center;width:100%;color:var(--muted);opacity:.7;margin:2px 0}
.wp-row-break i{width:20px;height:20px}
/* Concept & Script / Storyboard / Manja loop on each other before the group
   moves on — drawn as their own dashed cluster instead of a straight line,
   so the diagram reads "these iterate" rather than one clean handoff. */
.wp-cycle{border:1px dashed var(--wp-color,var(--red));border-radius:20px;padding:16px 20px 10px;
  display:flex;flex-direction:column;align-items:center;gap:6px}
.wp-cycle-row{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:center;gap:0;row-gap:20px}
.wp-cycle-loop{display:flex;align-items:center;gap:6px;font-size:.72rem;font-weight:600;
  letter-spacing:.04em;text-transform:uppercase;color:var(--wp-color,var(--muted));opacity:.85}
.wp-cycle-loop i{width:14px;height:14px}
@media(max-width:900px){.wp-cycle-row{flex-direction:column;align-items:center}}
.wp-node{position:relative;flex:0 1 118px;display:flex;flex-direction:column;align-items:center;
  gap:12px;text-align:center;cursor:pointer}
/* Task count badge on a circle (e.g. "1/2") — only appears when the stage
   actually has tasks (js/walkthrough.js step.tasks), a quick "there's more
   here" signal before you click. */
.wp-tasks-count{position:absolute;top:-4px;right:-4px;background:var(--ink);border:1px solid var(--line);
  border-radius:100px;font-size:.58rem;font-weight:700;padding:1px 5px;color:var(--text);line-height:1.4}
/* Click (or Enter/Space) a circle to open this — a per-stage task
   breakdown, admin-managed via js/walkthrough-admin.js's Tasks editor.
   Toggled by .tasks-open on the parent .wp-node (see wireTaskToggles). */
.wp-tasks-drop{display:none;width:220px;margin-top:10px;padding:10px 12px;border:1px solid var(--line);
  border-radius:10px;background:var(--panel,#111);text-align:left;box-shadow:0 12px 30px rgba(0,0,0,.35)}
.wp-node.tasks-open .wp-tasks-drop{display:block}
.wp-tasks-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}
.wp-tasks-list li{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:.78rem}
.wp-tasks-empty{margin:0;color:var(--muted);font-size:.78rem}
/* One shared size for every circle on this diagram — main flow AND the
   Editorial lane (which no longer overrides it) — so nothing reads as a
   different "tier" of stage. Cut to roughly a third of the previous 104px
   (2/3 smaller) per direct feedback that the circles were too dominant;
   the icon fill below is a bigger share of the circle than before (was
   ~54%, now ~78%) so shrinking the circle doesn't shrink the glyph in step.
   Color comes from --wp-color (set per node from js/walkthrough.js) unless
   this node is the lit-up "current" stage, which always overrides to gold. */
.wp-circle{position:relative;width:36px;height:36px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:linear-gradient(160deg,var(--wp-color,var(--red)),var(--wp-color,var(--red)));
  box-shadow:0 4px 12px rgba(0,0,0,.35);transition:transform .2s var(--ease),box-shadow .2s var(--ease)}
/* .wp-circle i sizes the icon's own box; the nested svg.ic below is what
   actually needs width:100%/height:100% to fill it — .ic{width:1em} alone
   only fills the icon's inherited text size (a few px), which is why the
   glyph used to look tiny and lost inside a much bigger circle. */
.wp-circle i{width:28px;height:28px;color:#fff;stroke-width:1.6}
.wp-circle i .ic{width:100%;height:100%}
.wp-node:hover .wp-circle,.wp-node:focus-visible .wp-circle{transform:translateY(-3px) scale(1.05);
  box-shadow:0 10px 26px rgba(0,0,0,.45)}
/* Final Output's dancing star — a small, deliberately playful flourish on
   the one stage that closes out the whole pipeline. Opt-in per step via
   step.danceIcon (js/walkthrough.js), not tied to the icon name, so any
   future stage can reuse the same wiggle. */
.wp-circle.wp-dance i{animation:wpDanceStar 1.6s ease-in-out infinite}
@keyframes wpDanceStar{
  0%,100%{transform:rotate(-12deg) translateY(0)}
  25%{transform:rotate(10deg) translateY(-5px)}
  50%{transform:rotate(-8deg) translateY(0)}
  75%{transform:rotate(14deg) translateY(-4px)}
}
.wp-label{font-size:.8rem;font-weight:600;line-height:1.3;max-width:120px}
.wp-arrow{color:var(--wp-color,var(--red))}
/* Current-stage light — always gold regardless of the group's category
   color, plus a soft pulsing halo behind the icon, so "where we are" reads
   at a glance even among a dozen differently-colored nodes. */
.wp-node.current .wp-circle{background:linear-gradient(160deg,var(--gold),#8a6a10);
  box-shadow:0 0 0 2px var(--ink),0 0 0 4px var(--gold),0 6px 16px var(--glow-gold)}
.wp-node.current .wp-label{color:var(--gold);font-weight:700}
.wp-pulse{position:absolute;inset:-4px;border-radius:50%;border:2px solid var(--gold);
  pointer-events:none;animation:wpNodePulse 1.8s var(--ease) infinite}
@keyframes wpNodePulse{0%{transform:scale(.85);opacity:.9}100%{transform:scale(1.35);opacity:0}}
.wp-tip{position:absolute;top:calc(100% + 8px);left:50%;transform:translateX(-50%) translateY(-4px);
  width:200px;padding:10px 12px;border-radius:10px;background:var(--panel,#111);border:1px solid var(--line);
  color:var(--muted);font-size:.74rem;line-height:1.5;text-align:left;opacity:0;pointer-events:none;
  transition:opacity .15s var(--ease),transform .15s var(--ease);z-index:5;box-shadow:0 12px 30px rgba(0,0,0,.35)}
.wp-node:hover .wp-tip,.wp-node:focus-visible .wp-tip{opacity:1;transform:translateX(-50%) translateY(0)}
/* .wp-row now centers on the cross-axis (align-items:center above), so the
   arrow no longer needs a hand-tuned margin-top guess to line up with the
   circle — it's simply vertically centered against whatever it sits beside. */
.wp-arrow{flex:0 0 30px;display:flex;align-items:center;justify-content:center;opacity:.7}
.wp-arrow i{width:20px;height:20px}
@media(min-width:820px){
  .wp-parallel{grid-template-columns:1fr 1fr}
  .wp-parallel .wp-group-title{justify-content:flex-start}
  .wp-parallel .wp-row{justify-content:flex-start}
}
@media(max-width:640px){
  .wp-row{flex-direction:column;align-items:center}
  .wp-arrow{transform:rotate(90deg)}
  .wp-tip{position:static;transform:none;width:100%;max-width:220px;opacity:1;margin-top:-4px;box-shadow:none;pointer-events:auto}
}

/* project gallery slideshow */
.gallery-slideshow{max-width:900px;margin:0 auto}
.gs-frame{position:relative;border-radius:18px;overflow:hidden;aspect-ratio:16/9;background:rgba(var(--overlay-rgb),.03);border:1px solid var(--line)}
.gs-track{display:flex;height:100%;transition:transform .6s var(--ease)}
.gs-slide{flex:0 0 100%;position:relative}
.gs-slide img{width:100%;height:100%;object-fit:cover;display:block}
.gs-caption{position:absolute;bottom:0;left:0;right:0;padding:16px 20px;background:linear-gradient(to top,rgba(0,0,0,.72),transparent);font-size:.9rem;text-shadow:0 1px 6px rgba(0,0,0,.7)}
.gs-dots{display:flex;gap:8px;justify-content:center;margin-top:14px}
.gs-dot{width:8px;height:8px;border-radius:50%;background:rgba(var(--overlay-rgb),.25);cursor:pointer;transition:.25s;border:0;padding:0}
.gs-dot.on{background:var(--gold);width:22px;border-radius:100px}

/* floating admin toolbar — jump-to-panel, not inline editing */
.admin-toolbar{position:fixed;bottom:20px;right:20px;z-index:900;display:flex;align-items:center;gap:12px;
  background:var(--ink-3);border:1px solid var(--gold);border-radius:100px;padding:10px 18px;
  font-size:.82rem;box-shadow:0 10px 30px rgba(0,0,0,.4)}
.admin-toolbar span{color:var(--muted)}
.admin-toolbar a{color:var(--gold);font-weight:600;white-space:nowrap}
@media(max-width:600px){.admin-toolbar{left:16px;right:16px;bottom:16px;justify-content:space-between}}

/* cert banner */
.cert-banner{display:flex;align-items:center;gap:26px;border-radius:18px;padding:24px 30px;
  background:linear-gradient(100deg,#1a1040,#2a1560 60%,#12102a);border:1px solid rgba(140,110,255,.3)}
.cert-banner .cb-icon{font-size:2.6rem;filter:drop-shadow(0 0 18px rgba(160,130,255,.6))}
.cert-banner h3{color:#cabdff;font-size:1.05rem;letter-spacing:.06em;text-transform:uppercase}
.cert-banner p{color:#9d94c9;font-size:.88rem;margin-top:4px}

/* upcoming list */
.up-list{display:grid}
.up-item{display:flex;gap:14px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line);transition:.25s}
.up-item:last-child{border-bottom:0}
.up-item:hover{padding-left:6px}
.up-item .thumb{width:64px;height:44px;border-radius:8px;flex:none;display:grid;place-items:center;font-size:1.2rem;border:1px solid var(--line)}
.up-item b{font-size:.86rem;display:block;line-height:1.35}
.up-item small{color:var(--muted);font-size:.74rem}
.up-item .go{margin-left:auto;color:var(--muted)}
/* ---------- live / closed tags on the Upcoming & Latest widget ----------
   Drawn only for rows an admin has given start/end times to — see
   announcementState() in js/announcements.js. A row without times gets no
   tag at all, which is what keeps the two that ARE live from being lost in
   a column of status pills.

   The green pulses so "on right now" is legible from across the room; the
   red does not, because "this has passed" is not news. Both carry a word,
   not just a colour — the state has to survive being read by someone who
   cannot tell the two hues apart, and it has a title attribute for anyone
   on a screen reader. */
.up-tag{display:inline-block;vertical-align:.08em;margin-left:8px;padding:2px 8px;border-radius:100px;
  font-size:.58rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;line-height:1.5}
.up-tag.live{color:#02150b;background:var(--green);box-shadow:0 0 0 0 rgba(0,178,89,.55);
  animation:upTagPulse 1.6s ease-out infinite}
.up-tag.closed{color:#fff;background:var(--red);opacity:.82}
.up-item.is-closed .thumb,.up-item.is-closed b{opacity:.62}
@keyframes upTagPulse{
  0%  {box-shadow:0 0 0 0 rgba(0,178,89,.55);filter:brightness(1)}
  55% {box-shadow:0 0 0 7px rgba(0,178,89,0);filter:brightness(1.22)}
  100%{box-shadow:0 0 0 0 rgba(0,178,89,0);filter:brightness(1)}
}
@media (prefers-reduced-motion:reduce){
  .up-tag.live{animation:none;box-shadow:0 0 0 3px rgba(0,178,89,.25)}
}

/* right rail cards */
.feat-card{padding:0;min-height:300px;display:flex;align-items:flex-end;
  background:radial-gradient(70% 60% at 80% 20%,rgba(224,48,58,.3),transparent 60%),
             radial-gradient(50% 50% at 20% 80%,rgba(30,120,220,.14),transparent),
             linear-gradient(160deg,#160b0c,#050505)}
.feat-card .fc-body{padding:26px;width:100%;background:linear-gradient(to top,rgba(0,0,0,.76),transparent);text-shadow:0 1px 8px rgba(0,0,0,.65)}
.feat-card h3{font-family:var(--font-display);font-size:2rem;letter-spacing:.04em;text-transform:uppercase}
.dots{display:flex;gap:7px;margin-top:16px}
.dots i{width:9px;height:9px;border-radius:50%}
.dots i:nth-child(1){background:var(--green)}.dots i:nth-child(2){background:var(--gold)}.dots i:nth-child(3){background:var(--red)}

.twitch-btn{background:#7b3ff2;color:#fff;border-color:transparent}
.twitch-btn:hover{box-shadow:0 12px 30px -8px rgba(123,63,242,.6)}

.connect-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;text-align:center}
.connect-grid a{display:grid;gap:7px;justify-items:center;padding:10px 4px;border-radius:12px;transition:.25s}
.connect-grid a:hover{background:rgba(var(--overlay-rgb),.06);transform:translateY(-3px)}
.connect-grid .ci{width:42px;height:42px;border-radius:50%;display:grid;place-items:center;font-size:1.1rem;border:1px solid var(--line)}
.connect-grid small{font-size:.62rem;color:var(--muted)}

.shop-card{background:radial-gradient(70% 60% at 75% 35%,rgba(227,179,34,.14),transparent 65%),linear-gradient(160deg,#12100a,#050505)}
.shop-visual{display:flex;gap:10px;margin:18px 0;align-items:stretch}
.shop-visual span{flex:1;border-radius:12px;border:1px solid var(--line);display:grid;place-items:center;font-size:1.9rem;min-height:88px}

/* duo action cards */
.duo{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.action-card{min-height:210px;display:flex;flex-direction:column;justify-content:flex-end;
  background:radial-gradient(70% 80% at 85% 15%,rgba(227,179,34,.12),transparent 60%),linear-gradient(160deg,#10100e,#050505)}
.action-card h3{text-transform:uppercase;letter-spacing:.04em;font-size:1.3rem}
.action-card p{color:var(--muted);font-size:.9rem;margin:8px 0 18px}

/* bottom feature strip */
.feat-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:0;background:var(--panel);border:1px solid var(--line);border-radius:18px;overflow:hidden}
.feat-strip>div{padding:26px 24px;border-right:1px solid var(--line);display:flex;gap:16px;align-items:center}
.feat-strip>div:last-child{border-right:0}
.feat-strip .fi{font-size:1.7rem;flex:none}
.feat-strip b{font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;display:block;margin-bottom:3px}
.feat-strip p{color:var(--muted);font-size:.8rem;line-height:1.45}

/* nav extras */
.n-ico{width:38px;height:38px;border-radius:50%;display:grid;place-items:center;border:1px solid transparent;
  color:var(--muted);background:none;font-size:1rem;transition:.25s;position:relative;text-decoration:none}
.n-ico:hover{color:var(--text);border-color:var(--line)}
.n-ico .cnt{position:absolute;top:-2px;right:-2px;background:var(--red);color:#fff;font-size:.6rem;font-weight:800;
  min-width:16px;height:16px;border-radius:100px;display:grid;place-items:center;padding:0 4px}

/* animated surf button */
.surf-btn{display:inline-flex;align-items:center;gap:9px;position:relative}
.surf-btn svg{display:inline-block;animation:surfSwitch 3s ease-in-out infinite}
.surf-btn .frame{transition:opacity .8s ease-in-out}
.surf-btn .frame1{opacity:1}
.surf-btn .frame2{opacity:0}
@keyframes surfSwitch{
  0%{transform:translateX(0)}
  25%{transform:translateX(-2px)}
  50%{opacity:1;transform:translateX(0)}
  50.1%{opacity:0}
  75%{transform:translateX(2px)}
  100%{transform:translateX(0)}
}
.surf-btn:hover svg{animation-play-state:running;filter:drop-shadow(0 0 8px var(--gold))}
.surf-btn:hover .frame1{opacity:0}
.surf-btn:hover .frame2{opacity:1}

@media(max-width:1100px){
  .bento{grid-template-columns:1fr}
  .quick-strip{grid-template-columns:repeat(4,1fr)}
  .quick-strip a:nth-child(4n){border-right:0}
  .quick-strip a{border-bottom:1px solid var(--line)}
}
@media(max-width:720px){
  .quick-strip{grid-template-columns:repeat(2,1fr)}
  .duo{grid-template-columns:1fr}
  .feat-strip{grid-template-columns:1fr 1fr}
  .feat-strip>div{border-bottom:1px solid var(--line)}
  .hero-card{padding:40px 26px;min-height:440px}
  .connect-grid{grid-template-columns:repeat(3,1fr)}
}

/* ---------- icon system ---------- */
.ic{width:1em;height:1em;display:inline-block;vertical-align:-0.12em;flex:none}
i[data-i]{display:inline-flex;align-items:center;justify-content:center;font-style:normal;line-height:1}
.ic-img{object-fit:contain}
.icon .ic,.qi .ic{width:1.2em;height:1.2em}
.t-art .ic,.thumb .ic,.ph .ic,.fi .ic,.shop-visual .ic{opacity:.9}

/* SHELL token image used in place of the generic icon glyph wherever the
   SHELL currency/token itself is being shown (not just any coin/reward
   icon). Always the gold art now that dark is the only theme — it used to
   swap to a black token under the light palette. See taskpays.html. */
.shell-ic{width:1em;height:1em;display:inline-block;vertical-align:-0.12em;object-fit:contain;flex:none}

/* ---------- illustration art layers ---------- */
.hc-art{position:absolute;top:0;right:0;bottom:0;left:auto;width:70%;height:100%;object-fit:cover;object-position:right center;z-index:0;opacity:.95;
  -webkit-mask-image:linear-gradient(to left,#000 55%,rgba(0,0,0,.45) 78%,transparent 100%);
  mask-image:linear-gradient(to left,#000 55%,rgba(0,0,0,.45) 78%,transparent 100%)}
/* SCRIM WEIGHT — lowered site-wide on 2026-08-24.
   These gradients exist to hold a headline off the art, and they had drifted
   into hiding it: the hero card's left edge was effectively opaque black and
   the action card's bottom two-thirds were a flat slab. Every stop below is
   pulled back far enough that the picture reads through it while the type
   still lands on a floor of its own. If a future headline needs more, add
   the weight to that headline (text-shadow) rather than back into the scrim
   — a darker scrim costs every card on the page, a shadow costs one line. */
.hc-scrim{position:absolute;inset:0;z-index:1;background:linear-gradient(90deg,rgba(5,5,5,.68) 0%,rgba(5,5,5,.28) 38%,transparent 62%)}
.hero-card .hero-skyline{display:none}
.fc-art{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:top;opacity:.9}
.card-art{width:calc(100% + 52px);margin:-26px -26px 20px;height:150px;object-fit:cover;object-position:center 30%;
  border-bottom:1px solid var(--line);opacity:.9}
.action-card{position:relative}
.action-card>*{position:relative;z-index:2}
.ac-art{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 25%;opacity:.55;z-index:0}
.ac-scrim{position:absolute;inset:0;z-index:1;background:linear-gradient(to top,rgba(5,5,5,.78) 30%,rgba(5,5,5,.1))}
.page-art{position:absolute;right:0;top:0;height:100%;width:56%;object-fit:cover;z-index:0;opacity:.5;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 45%);mask-image:linear-gradient(90deg,transparent,#000 45%)}
@media(max-width:720px){.page-art{width:100%;opacity:.25;mask-image:none;-webkit-mask-image:none}.card-art{height:110px}}
/* The .5 above was set against dark painted stills. The animation that now
   fills this slot on several pages is lit for screen, not for sitting behind
   type — pale sand, grey model-sheet backdrops — and at .5 it flattens the
   hero into a light slab and drags the headline's contrast down with it.
   Video gets its own opacity and a brightness knock-down; stills keep .5. */
video.page-art{opacity:.32;filter:brightness(.62) contrast(1.04) saturate(1.12)}
@media(max-width:720px){video.page-art{opacity:.16}}

/* .card-art is sized for .b-card's 26px padding; .card pads 30px, so the
   bento version bleeds wrong inside a .card. Same idea, matching numbers.
   .card already clips with overflow:hidden, so the corner radius holds. */
.card-media{width:calc(100% + 60px);margin:-30px -30px 20px;height:190px;object-fit:cover;
  border-bottom:1px solid var(--line);background:var(--ink-2);opacity:.92}
/* Two frames of the same shot shown side by side — a value study next to its
   colour pass. The 1px gap is the hairline: the grid background shows through. */
.study-pair{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line);
  width:calc(100% + 60px);margin:-30px -30px 20px;border-bottom:1px solid var(--line)}
.study-pair img{width:100%;height:190px;object-fit:cover;display:block}
/* .card's padding steps down at 900 and 700; the bleed has to step with it,
   or the media overhangs the border box and gets silently cropped. */
@media(max-width:900px){
  .card-media,.study-pair{width:calc(100% + 40px);margin:-20px -20px 20px}
  .card-media,.study-pair img{height:160px}
}
@media(max-width:700px){
  .card-media,.study-pair{width:calc(100% + 32px);margin:-16px -16px 16px}
  .card-media,.study-pair img{height:140px}
}

/* ---------- fluid/adaptive sizing ---------- */
html{font-size:clamp(14px,.9vw + 9px,17px)}
.bento-wrap{width:min(1380px,95vw)}
.hero-card{min-height:clamp(380px,55vh,560px)}
/* A tile row pinned to exactly --tiles columns, so it stays ONE row instead of
   wrapping like the auto-fit rows below. Used by the homepage Academy widget,
   whose last cell is the "see more" CTA — a second row would push that CTA
   away from the courses it belongs to. Narrow screens still wrap, since one
   row of five on a phone is unreadable. */
.tile-row.one-row{grid-template-columns:repeat(var(--tiles,4),minmax(0,1fr))}
.tile-more{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  text-align:center;padding:14px;border-radius:14px;min-height:150px;border:1px dashed var(--gold);
  background:var(--gold-soft);color:var(--gold);font-weight:600;font-size:.9rem;transition:.25s var(--ease)}
.tile-more:hover{background:rgba(227,179,34,.2);transform:translateY(-3px)}
.tile-more .tm-arrow{font-size:1.5rem;line-height:1}
.tile-more small{display:block;color:var(--muted);font-weight:400;font-size:.74rem}
@media(max-width:900px){.tile-row.one-row{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:520px){.tile-row.one-row{grid-template-columns:1fr}}
.tiles-3{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
.tiles-5{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
@media(max-width:900px){
  .duo{grid-template-columns:1fr}
  .stats{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:520px){
  .quick-strip{grid-template-columns:1fr 1fr}
  .feat-strip{grid-template-columns:1fr}
  .feat-strip>div{border-right:0}
  .hero-actions .btn{width:100%;justify-content:center}
  .n-inner{gap:12px}
}

/* page-specific responsive refinements */
@media(max-width:1000px){
  #cGrid{grid-template-columns:1fr !important;gap:24px !important}
  #bookgrid{grid-template-columns:1fr !important;gap:28px !important}
  #pgrid{grid-template-columns:1fr !important;gap:28px !important}
}

@media(max-width:760px){
  #cMeta{gap:8px !important}
  #cMeta .tag{font-size:.7rem}
  #coursesAdminEmbed .panel{padding:18px}
}

/* portfolio queue bar */
.queue-bar{margin-top:14px;padding:12px 14px;border:1px solid var(--line);border-radius:12px;
  background:linear-gradient(160deg,rgba(var(--overlay-rgb),.04),rgba(var(--overlay-rgb),.015));display:grid;gap:8px}
.queue-bar-head{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
.queue-bar-head b{font-size:.85rem;letter-spacing:.04em;text-transform:uppercase}
.queue-bar-head span{font-size:.82rem;color:var(--gold);font-weight:600}
.queue-bar p{margin:0;color:var(--muted);font-size:.8rem;line-height:1.4}

@media(max-width:720px){
  .hc-art{width:100%;opacity:.5;-webkit-mask-image:linear-gradient(to left,#000 30%,transparent 95%);mask-image:linear-gradient(to left,#000 30%,transparent 95%)}
  .clubs-layout{grid-template-columns:1fr !important;gap:20px !important}
  .clubs-layout > div:last-child{min-width:auto !important;height:auto !important;width:100% !important}
  .clubs-layout > div:last-child .btn{width:100% !important;height:auto !important;border-radius:14px !important;padding:12px 24px !important}
}

/* Ensure course items stay in one horizontal row */
.grid.g5{flex-wrap:nowrap !important;min-width:min-content}
.grid.g5 .card{flex-shrink:0}

/* ---------- landing painting: Jamaica + creatives, dissolving left ---------- */
.hero-card .hc-art{filter:saturate(1.18) contrast(1.06)}
.hc-art-b{width:58%;height:64%;top:auto;bottom:0;right:0;object-position:center 30%;opacity:.9;z-index:0;
  filter:saturate(1.15) contrast(1.05);
  -webkit-mask-image:linear-gradient(to left,#000 42%,rgba(0,0,0,.4) 72%,transparent),linear-gradient(to top,#000 45%,rgba(0,0,0,.35) 78%,transparent);
  -webkit-mask-composite:source-in;
  mask-image:linear-gradient(to left,#000 42%,rgba(0,0,0,.4) 72%,transparent),linear-gradient(to top,#000 45%,rgba(0,0,0,.35) 78%,transparent);
  mask-composite:intersect;
  mix-blend-mode:screen}
@media(max-width:720px){.hc-art-b{width:100%;height:50%;opacity:.55}}

/* footer legal links */
.f-legal{display:flex;gap:8px 26px;flex-wrap:wrap;justify-content:center;padding:18px 0;border-top:1px solid var(--line)}
.f-legal a{color:var(--muted);font-size:.84rem;text-decoration:underline;text-underline-offset:3px;transition:.25s}
.f-legal a:hover{color:var(--gold)}

/* ---------- futuristic pass: no visible barriers (borders off) ---------- */
.b-card,.card,.panel,.tile,.quick-strip,.feat-strip,.poster,.live-frame,.acc,.plan,
.search,.chip,.form input,.form select,.form textarea,.dropzone,.n-menu,.connect-grid .ci,
.socials a,.up-item .thumb,.shop-visual span,.hero-card{border-color:transparent!important}
.b-card,.card,.panel,.tile,.poster{box-shadow:0 18px 50px -30px rgba(0,0,0,.9)}
.b-card:hover,.card:hover{border-color:transparent!important;box-shadow:0 24px 60px -28px rgba(0,0,0,.95)}
.quick-strip a,.feat-strip>div{border-color:rgba(var(--overlay-rgb),.05)!important}
.card-art{border-bottom:0}

/* ---------- pointer spotlight glow (JS sets --mx/--my on mousemove) ---------- */
.b-card,.card,.tile,.poster,.plan,.panel{position:relative;overflow:hidden;--mx:50%;--my:50%}
.b-card::after,.card::after,.tile::after,.poster::after,.plan::after,.panel::after{
  content:"";position:absolute;inset:0;z-index:1;opacity:0;pointer-events:none;
  transition:opacity .5s var(--ease);
  background:radial-gradient(280px circle at var(--mx) var(--my),rgba(227,179,34,.14),transparent 72%)}
.b-card:hover::after,.card:hover::after,.tile:hover::after,.poster:hover::after,.plan:hover::after,.panel:hover::after{opacity:1}
@media(hover:none){.b-card::after,.card::after,.tile::after,.poster::after,.plan::after,.panel::after{display:none}}

/* ---------- animated energy top-line (bento cards) ---------- */
.b-card:not(.hero-card)::before{content:"";position:absolute;top:0;left:0;right:0;height:2px;z-index:2;
  background:var(--grad);background-size:200% auto;opacity:0;transition:opacity .45s var(--ease);
  animation:gradientFlow 4s linear infinite}
.b-card:not(.hero-card):hover::before{opacity:.85}
.card .top-line{background:var(--grad);background-size:200% auto;animation:gradientFlow 4s linear infinite}

/* ---------- hero-card holographic scanline sweep ---------- */
.hero-card::before{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;mix-blend-mode:screen;
  background:linear-gradient(to bottom,transparent 0%,rgba(227,179,34,.08) 48%,rgba(0,179,86,.05) 52%,transparent 100%);
  background-size:100% 240%;animation:scanSweep 7s linear infinite}
@keyframes scanSweep{0%{background-position:0 -140%}100%{background-position:0 240%}}
@media(prefers-reduced-motion:reduce){.hero-card::before,.b-card:not(.hero-card)::before,.card .top-line{animation:none}}

/* ---------- landing → home page scroll reveal ---------- */
#landing{position:fixed;inset:0;z-index:50;overflow:hidden;transform-origin:50% 40%;will-change:opacity,transform}
#landing .hero-card{width:100%;height:100%;min-height:100vh;min-height:100dvh;border-radius:0;margin:0}
#landingSpacer{height:100vh;height:100dvh}
.bento-wrap{position:relative;z-index:60;background:var(--ink)}
@media(prefers-reduced-motion:reduce){#landing{transition:none}}

/* ---------- live stream notification banner ---------- */
.live-banner{position:fixed;top:78px;left:50%;transform:translateX(-50%);z-index:650;display:flex;align-items:center;
  background:linear-gradient(100deg,rgba(var(--surface-rgb),.96),rgba(var(--surface-rgb),.9));backdrop-filter:blur(14px);
  border-radius:100px;box-shadow:0 14px 40px -12px rgba(224,48,58,.5);overflow:hidden;
  animation:bannerIn .6s var(--ease)}

/* ---------- club live chat ---------- */
.club-chat-container{
  position:fixed;bottom:20px;right:20px;width:360px;max-width:90vw;
  background:rgba(var(--surface-rgb),.98);backdrop-filter:blur(20px);
  border:1px solid var(--line);border-radius:16px;
  display:flex;flex-direction:column;
  box-shadow:0 20px 60px rgba(0,0,0,.7);
  z-index:999;animation:chatSlideIn .4s var(--ease);
  max-height:600px
}

@keyframes chatSlideIn{
  from{transform:translateY(40px) scale(.9);opacity:0}
  to{transform:translateY(0) scale(1);opacity:1}
}

.chat-header{
  padding:16px;border-bottom:1px solid var(--line);
  display:flex;justify-content:space-between;align-items:center;
  gap:12px
}

.chat-header h3{
  margin:0;font-size:.95rem;font-weight:600;color:var(--text)
}

.chat-close{
  background:none;border:none;color:var(--muted);
  font-size:1.5rem;cursor:pointer;padding:0;width:24px;height:24px;
  display:flex;align-items:center;justify-content:center;
  transition:.2s;opacity:.7
}

.chat-close:hover{opacity:1;color:var(--text)}

.chat-messages{
  flex:1;overflow-y:auto;padding:12px;
  display:flex;flex-direction:column;gap:8px
}

.chat-loading{
  text-align:center;color:var(--muted);font-size:.85rem;
  padding:20px;opacity:.7
}

.chat-empty{
  text-align:center;color:var(--muted);font-size:.85rem;
  padding:20px;opacity:.6
}

.chat-message{
  padding:10px 12px;border-radius:10px;
  background:rgba(var(--overlay-rgb),.04);font-size:.85rem;
  display:flex;flex-direction:column;gap:4px
}

.chat-message.own{
  background:rgba(227,179,34,.15);margin-left:20px
}

.chat-message.other{
  background:rgba(var(--overlay-rgb),.04);margin-right:0
}

.chat-message-header{
  display:flex;justify-content:space-between;align-items:center;
  gap:8px;font-size:.75rem
}

.chat-sender{
  color:var(--gold);font-weight:600
}

.chat-time{
  color:var(--muted);opacity:.7
}

.chat-message-content{
  color:var(--text);word-break:break-word;line-height:1.4;
  white-space:pre-wrap;word-wrap:break-word
}

.chat-message-actions{
  display:flex;gap:6px;margin-top:6px;font-size:.75rem
}

.chat-btn-sm{
  padding:4px 8px;background:rgba(227,179,34,.2);
  color:var(--gold);border:none;border-radius:4px;
  font-size:.75rem;cursor:pointer;transition:.2s;
  opacity:.8
}

.chat-btn-sm:hover{opacity:1;background:rgba(227,179,34,.3)}

.chat-input-area{
  padding:12px;border-top:1px solid var(--line);
  display:flex;flex-direction:column;gap:10px
}

.chat-user-info{
  font-size:.8rem;color:var(--muted)
}

.chat-user-name{
  display:block;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap
}

.chat-form{
  display:flex;flex-direction:column;gap:8px
}

.chat-input{
  width:100%;padding:8px 12px;
  background:rgba(var(--overlay-rgb),.04);border:1px solid var(--line);
  border-radius:8px;color:var(--text);font-family:inherit;
  font-size:.85rem;resize:none;transition:.2s;
  max-height:120px
}

.chat-input:focus{
  outline:none;border-color:var(--gold);
  background:rgba(227,179,34,.1)
}

.chat-form-actions{
  display:flex;justify-content:space-between;align-items:center;
  gap:8px
}

.char-count{
  font-size:.75rem;color:var(--muted);opacity:.7
}

/* Responsive chat */
@media(max-width:480px){
  .club-chat-container{
    position:fixed;inset:0;width:100%;max-width:100%;
    max-height:100%;border-radius:0;bottom:0;right:0;
    animation:chatSlideInMobile .4s var(--ease)
  }

  @keyframes chatSlideInMobile{
    from{transform:translateY(100%);opacity:0}
    to{transform:translateY(0);opacity:1}
  }

  .chat-messages{
    padding:8px
  }
}
@keyframes bannerIn{from{opacity:0;transform:translate(-50%,-16px)}}
.live-banner a{display:flex;align-items:center;gap:10px;padding:10px 20px;font-size:.84rem;color:var(--text)}
.live-banner b{color:var(--red);letter-spacing:.14em;font-size:.74rem}
.live-banner span{color:var(--muted)}
.live-banner em{font-style:normal;color:var(--gold);font-weight:700}
.live-banner .lb-dot{width:9px;height:9px;border-radius:50%;background:var(--red);box-shadow:0 0 14px var(--red);animation:blink 1.2s infinite}
.live-banner button{background:none;border:0;color:var(--muted);font-size:1.1rem;padding:0 14px 0 4px}
@media(max-width:720px){.live-banner{top:auto;bottom:14px;width:94vw}.live-banner span{display:none}}

/* ---------- Dashboard: loading / empty / error widget states ---------- */
.dash-loading{text-align:center;color:var(--muted);font-size:.88rem;padding:22px 10px;opacity:.7}
.dash-empty{text-align:center;padding:22px 10px}
.dash-empty p{color:var(--muted);font-size:.9rem;margin-bottom:14px}
.dash-error{text-align:center;color:var(--red);font-size:.85rem;padding:18px 10px;opacity:.85}

/* ---------- First-time username lock overlay (dashboard.html) ---------- */
.userlock-overlay{position:fixed;inset:0;z-index:900;background:rgba(4,6,10,.82);backdrop-filter:blur(10px);
  display:flex;align-items:center;justify-content:center;padding:20px}
.userlock-panel{position:relative;max-width:440px;width:100%;
  background:linear-gradient(160deg,rgba(var(--overlay-rgb),.05),rgba(var(--overlay-rgb),.015)) , var(--ink);
  border:1px solid var(--line);border-radius:24px;box-shadow:var(--shadow);
  padding:40px 32px 32px;text-align:center;animation:slideDown .35s var(--ease);overflow:hidden}
.userlock-panel::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:var(--grad)}
.userlock-badge{width:58px;height:58px;margin:0 auto 18px;border-radius:50%;display:grid;place-items:center;
  background:var(--grad);box-shadow:0 12px 30px -8px rgba(227,179,34,.5)}
.userlock-badge .ic{width:26px;height:26px;stroke:#0b0b0b}
.userlock-panel h3{margin-bottom:8px;font-size:1.5rem}
.userlock-panel p{color:var(--muted);font-size:.92rem;margin-bottom:26px;line-height:1.55}
.userlock-input-row{display:flex;flex-direction:column;gap:7px;text-align:left;margin-bottom:20px}
.userlock-input-row>label{font-size:.76rem;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:600}
.userlock-input-wrap{position:relative;display:flex;align-items:center}
.userlock-at{position:absolute;left:16px;color:var(--muted);font-weight:600;pointer-events:none;font-size:1rem}
.userlock-input-wrap input{width:100%;padding:14px 58px 14px 34px;border-radius:14px;border:1px solid var(--line);
  background:rgba(var(--overlay-rgb),.03);color:var(--text);font-size:1rem;font-family:inherit;transition:.2s var(--ease)}
.userlock-input-wrap input:focus{outline:none;border-color:var(--gold);background:rgba(227,179,34,.06)}
.userlock-count{position:absolute;right:14px;font-size:.7rem;color:var(--muted);opacity:.7;pointer-events:none}
.userlock-hint{font-size:.76rem;color:var(--muted);opacity:.7;line-height:1.4;margin-top:2px}
.userlock-status{font-size:.85rem;min-height:1.3em;text-align:left;display:flex;align-items:center;gap:6px;font-weight:600;transition:.2s}
.userlock-status.ok{color:var(--green)}
.userlock-status.no{color:var(--red)}
.userlock-status.checking{color:var(--muted);font-weight:400}
#usernameLockContinue{transition:.2s var(--ease)}
#usernameLockContinue:disabled{opacity:.4;cursor:not-allowed}
[data-username-locked="true"] #nLinks a:not([data-allow-locked]){pointer-events:none;opacity:.35}
[data-username-locked="true"] .dash-widgets{display:none}

/* ============================================================
   MANGA / MANJA ART DIRECTION LAYER
   Screentone halftones, speed-line bursts, ink panel frames,
   speech bubbles & action bursts — referencing classic manga
   spreads, tuned for the dark gold/red/green theme.
   ============================================================ */
:root{
  --ink-paper:#f2ecdf;          /* manga paper white */
  --ink-stroke:#0c0a06;         /* deep ink for text on paper */
  --tone-dot:rgba(var(--overlay-rgb),.22);
}

/* ---- screentone (halftone dot) overlay — opt-in utility ---- */
.manga-tone{position:relative}
.manga-tone::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background-image:radial-gradient(circle,var(--tone-dot) 1px,transparent 1.4px);
  background-size:9px 9px;opacity:.35;
  -webkit-mask-image:radial-gradient(120% 120% at 100% 0%,#000 0%,transparent 62%);
  mask-image:radial-gradient(120% 120% at 100% 0%,#000 0%,transparent 62%)}
.manga-tone.tone-bl::before{-webkit-mask-image:radial-gradient(120% 120% at 0% 100%,#000 0%,transparent 62%);
  mask-image:radial-gradient(120% 120% at 0% 100%,#000 0%,transparent 62%)}
.manga-tone.tone-full::before{-webkit-mask-image:none;mask-image:none;opacity:.14}

/* ---- radial speed-line burst (action lines) ---- */
.manga-speed{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;
  background:repeating-conic-gradient(from 0deg at 78% 38%,rgba(var(--overlay-rgb),.09) 0deg .6deg,transparent .6deg 4.2deg);
  -webkit-mask-image:radial-gradient(75% 75% at 78% 38%,transparent 18%,#000 48%,transparent 78%);
  mask-image:radial-gradient(75% 75% at 78% 38%,transparent 18%,#000 48%,transparent 78%)}
.manga-speed.gold{background:repeating-conic-gradient(from 0deg at 78% 38%,rgba(227,179,34,.14) 0deg .6deg,transparent .6deg 4.2deg)}
.manga-speed.center{background:repeating-conic-gradient(from 0deg at 50% 50%,rgba(var(--overlay-rgb),.08) 0deg .6deg,transparent .6deg 4.2deg);
  -webkit-mask-image:radial-gradient(70% 70% at 50% 50%,transparent 22%,#000 52%,transparent 80%);
  mask-image:radial-gradient(70% 70% at 50% 50%,transparent 22%,#000 52%,transparent 80%)}

/* subtle automatic action-lines on every page hero — one shared accent
   so all sub-pages inherit the manga energy without per-page markup */
.hero::after{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:repeating-conic-gradient(from 0deg at 82% 30%,rgba(var(--overlay-rgb),.05) 0deg .5deg,transparent .5deg 4.6deg);
  -webkit-mask-image:radial-gradient(70% 80% at 82% 30%,transparent 16%,#000 46%,transparent 76%);
  mask-image:radial-gradient(70% 80% at 82% 30%,transparent 16%,#000 46%,transparent 76%)}

/* ---- ink panel frame (manga panel card) ---- */
.manga-panel{border:2px solid var(--manga-frame)!important;border-radius:6px!important;
  box-shadow:7px 7px 0 rgba(0,0,0,.6),0 0 0 1px rgba(0,0,0,.9)!important;
  background:linear-gradient(160deg,rgba(var(--overlay-rgb),.06),rgba(var(--overlay-rgb),.02))}
.manga-panel:hover{border-color:var(--gold)!important;
  box-shadow:9px 9px 0 rgba(0,0,0,.65),0 0 26px -6px var(--glow-gold)!important;
  transform:translate(-2px,-4px)}
.grid .manga-panel:nth-child(odd){transform:rotate(-.5deg)}
.grid .manga-panel:nth-child(even){transform:rotate(.5deg)}
.grid .manga-panel:nth-child(odd):hover{transform:rotate(-.5deg) translate(-2px,-4px)}
.grid .manga-panel:nth-child(even):hover{transform:rotate(.5deg) translate(-2px,-4px)}

/* ---- speech-bubble kicker ---- */
.kicker.manga-bubble{background:var(--ink-paper);color:var(--ink-stroke);border:2px solid var(--ink-stroke);
  border-radius:100px;font-weight:700;position:relative;box-shadow:3px 3px 0 rgba(0,0,0,.5)}
.kicker.manga-bubble i{background:var(--red);box-shadow:0 0 10px var(--red)}
.kicker.manga-bubble::after{content:"";position:absolute;left:26px;bottom:-9px;width:14px;height:14px;
  background:var(--ink-paper);border-right:2px solid var(--ink-stroke);border-bottom:2px solid var(--ink-stroke);
  transform:rotate(45deg) skew(12deg,12deg)}

/* ---- SFX display text (ink-outlined manga lettering) ---- */
.manga-sfx{font-family:var(--font-display);font-weight:700;text-transform:uppercase;letter-spacing:.01em;
  -webkit-text-stroke:2px var(--ink-stroke);
  text-shadow:4px 4px 0 rgba(0,0,0,.75),-1px -1px 0 rgba(var(--overlay-rgb),.12)}

/* ---- action-burst badge (starburst) ---- */
.manga-bang{display:inline-grid;place-items:center;padding:18px 22px;background:var(--gold);color:var(--ink-stroke);
  font-family:var(--font-display);font-weight:700;font-size:.78rem;letter-spacing:.06em;text-transform:uppercase;
  clip-path:polygon(50% 0%,61% 12%,77% 5%,80% 22%,97% 22%,90% 38%,100% 50%,90% 62%,97% 78%,80% 78%,77% 95%,61% 88%,50% 100%,39% 88%,23% 95%,20% 78%,3% 78%,10% 62%,0% 50%,10% 38%,3% 22%,20% 22%,23% 5%,39% 12%);
  text-align:center;line-height:1.05;transform:rotate(-8deg)}
.manga-bang.red{background:var(--red);color:#fff}
.manga-bang.green{background:var(--green);color:#02150b}

/* ---- decorative manga spread (hero collage of tilted panels) ---- */
.manga-spread{position:absolute;right:-2%;top:50%;transform:translateY(-50%) rotate(3deg);z-index:0;
  width:min(560px,46vw);aspect-ratio:16/11;pointer-events:none;opacity:.9;
  display:grid;grid-template-columns:1.3fr 1fr .8fr;grid-template-rows:1fr 1.2fr;gap:10px;
  -webkit-mask-image:linear-gradient(to left,#000 55%,transparent 100%);
  mask-image:linear-gradient(to left,#000 55%,transparent 100%)}
.manga-spread i{display:block;border:2px solid var(--manga-frame);border-radius:4px;position:relative;overflow:hidden;
  background:linear-gradient(160deg,rgba(var(--overlay-rgb),.05),rgba(0,0,0,.4));box-shadow:5px 5px 0 rgba(0,0,0,.5)}
.manga-spread i:nth-child(1){transform:rotate(-2deg);
  background-image:radial-gradient(circle,var(--tone-dot) 1px,transparent 1.4px);background-size:8px 8px}
.manga-spread i:nth-child(2){grid-row:span 2;transform:rotate(1.4deg);
  background:repeating-conic-gradient(from 0deg at 50% 42%,rgba(var(--overlay-rgb),.13) 0deg .8deg,transparent .8deg 5deg)}
.manga-spread i:nth-child(3){transform:rotate(-1deg);
  background:repeating-linear-gradient(115deg,rgba(var(--overlay-rgb),.11) 0 2px,transparent 2px 9px)}
.manga-spread i:nth-child(4){transform:rotate(1.8deg);
  background-image:radial-gradient(circle,rgba(227,179,34,.3) 1px,transparent 1.4px);background-size:7px 7px}
.manga-spread i:nth-child(5){transform:rotate(-2.4deg);
  background:repeating-conic-gradient(from 0deg at 80% 20%,rgba(224,48,58,.16) 0deg .7deg,transparent .7deg 4.6deg)}
.manga-spread em{position:absolute;font-style:normal;font-family:var(--font-display);font-weight:700;
  color:var(--manga-frame);font-size:1.5rem;letter-spacing:.08em;transform:rotate(-6deg)}
@media(max-width:900px){.manga-spread{opacity:.35;width:74vw;right:-18%}}

/* ---- ink brush underline for section titles (opt-in) ---- */
.ink-underline{position:relative;display:inline-block}
.ink-underline::after{content:"";position:absolute;left:0;right:-6px;bottom:-8px;height:10px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 300 20' preserveAspectRatio='none'%3E%3Cpath d='M2 14 Q70 4 150 10 T298 8' stroke='%23e3b322' stroke-width='5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center/100% 100%;
  opacity:.85}

/* ---- manga chapter cover (placeholder art for chapters w/o images) ---- */
.manga-cover{position:relative;overflow:hidden;border:2px solid var(--manga-frame);border-radius:4px}
.manga-cover .mc-speed{position:absolute;inset:0;
  background:repeating-conic-gradient(from 0deg at 50% 58%,rgba(var(--overlay-rgb),.14) 0deg .8deg,transparent .8deg 5.2deg);
  -webkit-mask-image:radial-gradient(80% 80% at 50% 58%,transparent 12%,#000 46%,transparent 88%);
  mask-image:radial-gradient(80% 80% at 50% 58%,transparent 12%,#000 46%,transparent 88%)}
.manga-cover .mc-tone{position:absolute;inset:0;
  background-image:radial-gradient(circle,var(--tone-dot) 1px,transparent 1.4px);background-size:8px 8px;
  -webkit-mask-image:radial-gradient(130% 130% at 0% 0%,#000 0%,transparent 55%);
  mask-image:radial-gradient(130% 130% at 0% 0%,#000 0%,transparent 55%)}
.manga-cover .mc-num{position:relative;z-index:2;font-family:var(--font-display);font-weight:700;font-size:3.6rem;
  color:var(--ink-paper);-webkit-text-stroke:2px var(--ink-stroke);text-shadow:4px 4px 0 rgba(0,0,0,.7)}
.manga-cover .mc-label{position:relative;z-index:2;font-size:.72rem;letter-spacing:.34em;color:var(--ink-paper);
  text-transform:uppercase;font-weight:700;opacity:.85}
.manga-cover .mc-corner{position:absolute;top:8px;right:8px;z-index:2;font-size:.6rem;font-weight:800;
  letter-spacing:.1em;background:var(--ink-paper);color:var(--ink-stroke);padding:3px 8px;border-radius:3px;
  border:1.5px solid var(--ink-stroke);transform:rotate(3deg);text-transform:uppercase}

/* .rv.in{transform:none} outranks single-class rules — restore the
   intended tilts once the reveal finishes */
.page-note.rv.in{transform:rotate(-1.2deg)}
.manga-bang.rv.in{transform:rotate(-8deg)}

@media(prefers-reduced-motion:reduce){.grid .manga-panel:nth-child(n){transform:none}}

/* ---- always-dark cinematic / art surfaces ----
   These cards paint their own fixed dark background (cinematic key-art,
   brand gradients) rather than inheriting page chrome. Since the light
   theme was retired these values match :root exactly, so the block is a
   no-op today — it is kept as the local contract for these surfaces, so
   that re-pointing the root palette can never leave text stranded on art
   that does not follow it. .on-dark is the opt-in hook for one-off cards
   that hardcode a dark gradient inline (e.g. the "making of" book cards). */
.hero-card,.feat-card,.action-card,.shop-card,.on-dark{
  --text:#e8ecf4;
  --muted:#9aa3b5;
  --overlay-rgb:255,255,255;
  --line:rgba(255,255,255,.1);
  color:var(--text)
}

/* ============================================================
   MOBILE HARDENING (site-wide)
   Final-pass overrides to prevent horizontal overflow and cramped
   layouts on phones, especially on pages using inline two-column
   grid styles.
   ============================================================ */
@media (max-width:900px){
  section{padding:48px 0}
  .hero{min-height:auto;padding:96px 0 48px}
  .hero.short{min-height:auto;padding:92px 0 40px}
  .hero p.lead{font-size:1rem;margin-bottom:20px}
  .sec-head{margin-bottom:26px}
  .sec-head p{font-size:.95rem}
  .panel,.card,.b-card{padding:20px}
  .product .ph{height:180px}

  /* Split-grid layouts used across pages — see "page split-grid layouts"
     above. Every one of them collapses to a single column here so none can
     be missed (and none can silently skip collapsing) the way a couple did
     back when this list only matched leftover inline-style text. */
  #agrid,
  #loregrid,
  #pilotGrid,
  #permGrid,
  #bookgrid,
  #pgrid,
  #sgrid,
  #cgrid,
  #kGrid,
  #cGrid,
  #jdGrid,
  #lGrid,
  #internBookGrid,
  #bookHeroGrid,
  #bookDetailGrid,
  .clubs-layout,
  #lgrid,
  #dashMainGrid{
    grid-template-columns:1fr !important;
    gap:22px !important;
  }
}

@media (max-width:700px){
  html{font-size:15px}
  .wrap{width:min(1180px,94vw)}
  .hero h1{font-size:clamp(2rem,9vw,3rem)}
  .kicker{font-size:.72rem;letter-spacing:.14em;padding:6px 12px}
  .hero-actions{gap:10px}
  .hero-actions .btn{width:100%;justify-content:center}
  .btn{padding:11px 18px;font-size:.9rem}
  .panel,.card,.b-card{padding:16px;border-radius:16px}
  .table{font-size:.85rem;display:block;overflow-x:auto;-webkit-overflow-scrolling:touch}
  .table th,.table td{white-space:nowrap}
  #toast{left:12px;right:12px;bottom:12px;transform:translateY(80px);padding:12px 14px;border-radius:12px;text-align:center}
  #toast.show{transform:translateY(0)}
  .search{min-width:0}
  .club-chat-container{width:100%;max-width:100%;right:0;left:0;bottom:0;border-radius:14px 14px 0 0}
}
