
html,body{margin:0;padding:0;background:#080911;}
body[data-bs-theme="light"]{background:#EDF0F8;}
:root{--bg:#080911;--panel:#14172B;--panel2:#0E101F;--bd:#2A2E4E;--bd2:#1C2039;--tx:#F3F4FA;--tx2:#A7ABC6;--tx3:#5E6284;--oldNum:#9DA1BE;--oldName:#C0C4DA;--acc:#8B7CFF;--accHi:#A79BFF;--btn:#6C4AEC;--liveGrad:linear-gradient(165deg,#7B57F8,#4E28D9);--gold:#FFC94A;--goldTx:#FFD066;--grad:linear-gradient(135deg,#FFD54A,#FFA800);--onGold:#2E1D00;--winGrad:linear-gradient(165deg,#FFCE4F,#F09B00);--onWin:#4A2E00;--todayBg:rgba(255,201,74,.12);--red:#FF5470;--redBg:rgba(255,84,112,.13);--hot:#FF5470;--pill:rgba(14,15,27,.85);--pillBd:rgba(255,255,255,.09);--flashRing:rgba(255,255,255,.85);--starCard:conic-gradient(from var(--sa) at 86% -10%,rgba(255,193,64,.48),rgba(255,201,74,.16) 26%,rgba(255,201,74,.04) 44%,transparent 62%),conic-gradient(from var(--sb) at 6% 112%,rgba(255,158,42,.24),rgba(255,201,74,.06) 34%,transparent 60%),linear-gradient(160deg,#2B2112,#1D1720 58%,#171425);--goldSub:rgba(255,228,178,.9);--starPanel:rgba(0,0,0,.26);--goldBd:rgba(255,201,74,.3);--accBg:rgba(139,124,255,.13);--glowA:rgba(123,87,248,.1);--glowB:rgba(87,120,255,.06);--siri:conic-gradient(from 130deg,#57A8FF,#7C6BFF,#C86BFF,#FF6BB5,#FF9E64,#57A8FF);}
[data-light="1"],body[data-bs-theme="light"]{--bg:#EDF0F8;--panel:#FFFFFF;--panel2:#F4F6FC;--bd:#DBE0F0;--bd2:#E9ECF7;--tx:#191731;--tx2:#5D5B76;--tx3:#78768F;--oldNum:#8A889F;--oldName:#6B6982;--acc:#5B34E8;--accHi:#4E2AC9;--btn:#5B34E8;--liveGrad:linear-gradient(165deg,#6C46F5,#4523BE);--gold:#E7A100;--goldTx:#916200;--grad:linear-gradient(135deg,#FFC94A,#EE9D00);--onGold:#2E1D00;--winGrad:linear-gradient(165deg,#FFD158,#EC9A00);--onWin:#4A2E00;--todayBg:rgba(231,161,0,.12);--red:#E11D48;--redBg:rgba(225,29,72,.08);--hot:#E11D48;--pill:rgba(255,255,255,.88);--pillBd:rgba(25,23,49,.08);--flashRing:rgba(25,23,49,.8);--glowA:rgba(91,52,232,.06);--glowB:rgba(64,110,255,.07);--starCard:conic-gradient(from var(--sa) at 86% -10%,rgba(255,172,0,.42),rgba(255,201,74,.16) 28%,rgba(255,220,120,.05) 46%,transparent 62%),conic-gradient(from var(--sb) at 6% 112%,rgba(255,175,40,.24),transparent 58%),linear-gradient(160deg,#FFFAE8,#FFEFC6);--goldSub:#6E4E00;--starPanel:rgba(146,98,0,.08);--goldBd:rgba(170,115,0,.32);--accBg:rgba(91,52,232,.09);}
a{color:var(--accHi);text-decoration:none;}
a:hover{opacity:.85;}
input{outline:none;}
input::placeholder{color:var(--tx3);}
@keyframes pulseDot{0%,100%{opacity:1;}50%{opacity:.3;}}
@keyframes rise{from{opacity:0;transform:translateY(12px);}to{opacity:1;transform:none;}}
@keyframes liveRing{0%,100%{box-shadow:0 0 0 0 rgba(139,110,255,.55);}50%{box-shadow:0 0 0 7px rgba(139,110,255,0);}}
@keyframes flashCard{0%,100%{box-shadow:0 0 0 0 rgba(0,0,0,0);}35%{box-shadow:0 0 0 5px var(--flashRing);}70%{box-shadow:0 0 0 2px var(--flashRing);}}
@keyframes siriPulse{0%,100%{opacity:.42;}50%{opacity:.8;}}
@property --sa{syntax:"<angle>";initial-value:205deg;inherits:false;}
@property --sb{syntax:"<angle>";initial-value:20deg;inherits:false;}
@keyframes starSweep{0%,100%{--sa:189deg;--sb:36deg;}50%{--sa:221deg;--sb:4deg;}}
@keyframes splashWrap{0%{opacity:0;}7%{opacity:1;}86%{opacity:1;}100%{opacity:0;}}
@keyframes splashText{0%{opacity:0;transform:translateY(18px) scale(.98);filter:blur(4px);}9%{opacity:1;transform:none;filter:blur(0);}84%{opacity:1;transform:translateY(-2px);filter:blur(0);}100%{opacity:0;transform:translateY(-26px);filter:blur(3px);}}
@keyframes shimmer{0%{background-position:0% center;}100%{background-position:-220% center;}}
/* ===== GLASS SURFACES — same recipe as the live homepage topbar
   (very transparent tint + blur + hairline theme-coloured border + soft shadow),
   expressed in the v2 violet/gold palette. ===== */
:root{--glassBg:rgba(139,124,255,.20);--glassBd:rgba(167,155,255,.66);--glassSh:0 2px 6px rgba(0,0,0,.42);--navEdge:rgba(167,155,255,.66);
  /* gold that must NOT darken in light mode (star/arrow FABs) */
  --fabGold:#FFC94A;}
[data-light="1"],body[data-bs-theme="light"]{--glassBg:rgba(139,124,255,.34);--glassBd:rgba(91,52,232,.55);--glassSh:0 2px 6px rgba(25,23,49,.18);--navEdge:rgba(91,52,232,.5);
  --fabGold:#FFC94A;}
/* Top bar carries a gradient wash like the admin bar: a glow on the right (where the
   sun/moon button sits, so the celestial body "lights" the bar) over a diagonal tint.
   Transparency + blur stay exactly as they are. */
.kc-tb{background-image:
    radial-gradient(circle at 84% 16%, rgba(226,234,255,.30), transparent 50%),
    linear-gradient(135deg, rgba(139,124,255,.26), rgba(108,74,236,.16) 55%, rgba(167,155,255,.26));}
[data-light="1"] .kc-tb{background-image:
    radial-gradient(circle at 85% 20%, rgba(255,214,105,.62), transparent 52%),
    linear-gradient(135deg, rgba(120,150,255,.34), rgba(139,124,255,.26));}
.kc-glass{background-color:var(--glassBg);-webkit-backdrop-filter:blur(12px) saturate(1.4);backdrop-filter:blur(12px) saturate(1.4);
  border:0.5px solid var(--glassBd);box-shadow:var(--glassSh);transition:background-color .3s ease,color .3s ease;}
.kc-tb{border-radius:999px}
.kc-tb-btn{background:none;border:0;cursor:pointer;font-family:inherit;display:flex;align-items:center;justify-content:center;
  color:#F3F4FA;padding:0;transition:color .2s,transform .12s;}
.kc-tb-btn:hover{color:#fff}
.kc-tb-btn:active{transform:scale(.92)}
[data-light="1"] .kc-tb-btn{color:#191731}
[data-light="1"] .kc-tb-btn:hover{color:#000}
/* theme button: sun = yellow on pale yellow · moon = dark on white aura (live homepage behaviour) */
.kc-tb-theme{width:38px;height:38px;flex-shrink:0;border-radius:50%;padding:0;overflow:hidden;
  display:flex;align-items:center;justify-content:center;transition:background-color .3s,box-shadow .3s}
.kc-tb-theme svg{width:24px;height:24px;display:block}
.kc-tb-theme{box-shadow:0 2px 10px -2px rgba(0,0,0,.4)}
.kc-tb-lang{gap:5px;padding:0 11px;height:32px;border-radius:999px;font-size:12px;font-weight:800;
  border:0.5px solid var(--glassBd)}
@media(max-width:380px){.kc-tb{gap:11px !important;padding-left:9px !important}.kc-tb-lang{padding:0 9px;font-size:11px}}
/* ===== Ganesh hero — original artwork, new violet/gold palette ===== */
[data-light="1"] .kc-hero{border-color:rgba(91,52,232,.35);
  background:radial-gradient(120% 90% at 50% 0%,rgba(255,201,74,.5),transparent 62%),
             radial-gradient(100% 120% at 50% 105%,rgba(139,124,255,.35),transparent 70%),
             linear-gradient(165deg,#ffffff,#f0edff 60%,#e7e2ff)}
/* ===== bottom navigation ===== */
/* FAB: press-scale only — centring is done by a wrapper, never by transform,
   otherwise the press wipes translateX(-50%) and the button slides out from under the finger. */
.kc-fab{width:46px;height:46px;border-radius:50%;color:var(--accHi);cursor:pointer;display:flex;align-items:center;justify-content:center;
  pointer-events:auto;transition:transform .12s ease;padding:0}
.kc-fab i{font-size:19px;line-height:1}
.kc-fab.kc-gold{color:var(--fabGold) !important}
[data-light="1"] .kc-fab.kc-gold i{text-shadow:0 1px 2px rgba(120,80,0,.45)}
.kc-fab:active{transform:scale(.9)}
/* ===== favourites panel ===== */
[data-light="1"] .kc-favcard{box-shadow:0 22px 50px -22px rgba(25,23,49,.4)}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
::-webkit-scrollbar{width:0;height:0;}

@keyframes fadeIn{from{opacity:0}to{opacity:1}}
/* While a festival popup is open nothing may sit on top of it — the live
   homepage had exactly this bug (floaters covering the artwork). These live
   OUTSIDE #kc-root, so they are targeted from <body>. */
body:has(.kc-alertwrap) #kcInstallCard,
body:has(.kc-alertwrap) #kcLiveFloater,
body:has(.kc-alertwrap) #kcPhoneModal,
body:has(.kc-alertwrap) #kcIosModal,
body:has(.kc-alertwrap) .kc-fab{display:none!important}
/* admin alert popup (festival messages) */

/* ── per-game admin message (show_notification + game_notification) ────────── */
/* on the gold "star" card the accent tint would vanish — use the card's own plate */
.kc-star .kc-cardmsg{background:var(--starPanel);border-color:var(--goldBd);border-left-color:var(--onGold);color:var(--goldSub)}
.kc-star .kc-cardmsg .bi,.kc-star .kc-cardmsg b{color:var(--onGold)}

/* ── announcement slots: one shared card, a colour rail per slot so the admin's
      chosen position stays legible (the live page colour-codes them too) ─────── */

/* ── favourites: speaker, red close, auto-close countdown ──────────────────── */
[data-light="1"] .kc-favbtn.close{background:var(--red);border-color:var(--red);color:#fff}

/* ── advertising ──────────────────────────────────────────────────────────── */


/* ── push enrolment row (inside the alerts sheet) ─────────────────────────── */

/* ── floating ad bubble — clears the FABs and never covers the bottom nav ──── */

/* favourites FAB is a RED HEART — the gold ★ already means "special game" */
.kc-fab.kc-heart{color:var(--red)!important}
.kc-fab.kc-heart .bi{color:var(--red)!important}

/* result announcer FAB — muted by default, gold + pulsing while listening */
.kc-fab.kc-ann{color:var(--tx2)}
.kc-fab.kc-ann .bi{color:var(--tx2)}
.kc-fab.kc-ann[data-on] .bi{color:var(--fabGold)}
.kc-fab.kc-ann:has(.bi-volume-up-fill){box-shadow:0 0 0 2px var(--goldBd),0 6px 18px rgba(0,0,0,.35)}
.kc-fab.kc-ann:has(.bi-volume-up-fill) .bi{color:var(--fabGold);animation:pulseDot 1.6s infinite}

/* ══ LARGE SCREENS ═══════════════════════════════════════════════════════════
   Everything here sits behind min-width queries, so phones render exactly as
   before — not one property changes below 640px. Above it the board becomes a
   grid whose column count follows the viewport, and <main> widens to match.
   `align-items:start` matters: without it every card in a row would stretch to
   the height of the tallest, and an open mini-chart would inflate its whole row. */
@media (min-width:640px){
}
@media (min-width:1024px){
}
@media (min-width:1500px){
}
/* The "NOW" divider is a full-width rule in a single column; inside a grid cell
   that reads as a broken line, so above 640px it becomes a compact badge. */
@media (min-width:640px){
}
/* Wide screens have room: let the rails breathe instead of scrolling. */
@media (min-width:1024px){
  .kc-rail{flex-wrap:wrap!important;overflow-x:visible!important}
}

/* ══ TOP BLOCK ON LARGE SCREENS ══════════════════════════════════════════════
   The hero is a tall banner; on a wide screen it wasted most of the first fold
   and pushed the messages below it. Above 1024px the hero + status pills move
   into a narrow LEFT column and the admin's messages take a wider RIGHT column,
   so the fold carries content instead of empty violet. Below 1024px .kc-top and
   its two children are plain block divs — the stacked mobile order is untouched. */
@media (min-width:1024px){
  /* the hero no longer needs banner height when it is a column */
  /* messages get room to breathe rather than being squeezed under the banner */
}
@media (min-width:1500px){
}

/* ══ NOTCH / DYNAMIC ISLAND ══════════════════════════════════════════════════
   Installed as a PWA there is no browser chrome, so the page starts underneath
   the notch and it was covering the top bar. The BACKGROUND still bleeds all the
   way up (the page stays edge-to-edge, which is the look we want) — only the
   fixed top controls and the content start are pushed below the safe area.
   env() is 0 in a normal browser tab, so nothing moves outside standalone. */
.kc-fixtop{top:calc(10px + env(safe-area-inset-top,0px))!important}
#kcLiveFloater{top:calc(78px + env(safe-area-inset-top,0px))!important}
#kcInstallCard{top:calc(150px + env(safe-area-inset-top,0px))!important}

/* first-visit language chooser */
@media (min-width:640px){.kc-askgrid{grid-template-columns:1fr 1fr 1fr}.kc-askbox{max-width:560px}}

/* ══ SPLASH ══════════════════════════════════════════════════════════════════
   The wordmark was gold-on-transparent over a weak scrim: fine on the dark
   theme, nearly invisible on the light one. Now the scrim is much stronger and
   THEME-AWARE, and each theme gets its own vibrant wordmark + its own glitter
   colour. Dark = gold sparks on deep violet-black; light = magenta/violet sparks
   on a warm cream veil. */
[data-light="1"] .kc-splashbg,body[data-bs-theme="light"] .kc-splashbg{
  background:
    radial-gradient(620px 380px at 50% 44%, rgba(255,252,244,.96), rgba(255,250,238,.80) 45%, rgba(255,248,232,.38) 68%, transparent 82%),
    radial-gradient(900px 600px at 50% 44%, rgba(255,190,120,.34), transparent 70%);}

[data-light="1"] .kc-splashword,body[data-bs-theme="light"] .kc-splashword{
  /* magenta -> violet -> orange: vivid, and dark enough to read on cream */
  background-image:linear-gradient(100deg,#B3138A 0%,#E0219E 20%,#7A2BE0 42%,#E0219E 62%,#C2410C 82%,#B3138A 100%);
  filter:drop-shadow(0 2px 12px rgba(179,19,138,.30));}

[data-light="1"] .kc-splashsub,body[data-bs-theme="light"] .kc-splashsub{
  color:#7A2BE0;text-shadow:0 1px 8px rgba(255,255,255,.9);}

/* ── glitter: four-point STARS hugging the wordmark ────────────────────────
   Previously these were glowing dots sprayed over the whole viewport, which read
   as noise. Now the field is a box centred on the text, sparkles are clipped to
   a classic 4-point sparkle shape, and the radius is biased outward from the
   letters so the text looks like the source of the shine. */
[data-light="1"] .kc-glitter i,body[data-bs-theme="light"] .kc-glitter i{
  background:linear-gradient(135deg,#FFFFFF,#E0219E 50%,#7A2BE0);
  filter:drop-shadow(0 0 5px rgba(224,33,158,.75))}
@keyframes kcSpark{
  0%,100%{opacity:0;transform:translate(-50%,-50%) scale(.2) rotate(var(--r,0deg))}
  30%{opacity:1;transform:translate(-50%,-50%) scale(1) rotate(calc(var(--r,0deg) + 25deg))}
  55%{opacity:.7;transform:translate(-50%,-50%) scale(.72) rotate(calc(var(--r,0deg) + 55deg))}
}
@media(prefers-reduced-motion:reduce){.kc-glitter{display:none}}
