:root{--bg:#0b0912;--panel:#161226ee;--ink:#f3eefc;--mute:#9a90b8;--acc:#ff4fd8;--acc2:#38f2c1;--gold:#ffd23f;--line:#2f2650}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%;margin:0;background:var(--bg);color:var(--ink);font:16px/1.45 system-ui,Segoe UI,Roboto,sans-serif;overflow:hidden;overscroll-behavior:none;touch-action:manipulation}
body{display:flex;flex-direction:column}
[hidden]{display:none!important}
button{font:inherit;cursor:pointer;color:var(--ink);background:#2a2142;border:1px solid var(--line);border-radius:12px;padding:12px 18px;min-height:44px}
button:hover{background:#3a2d5c}
button:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:3px solid var(--acc2);outline-offset:2px}
button.primary{background:linear-gradient(90deg,var(--acc),#a855f7);color:#14001a;font-weight:800;border:0}
button:disabled{opacity:.4;cursor:not-allowed}
kbd{background:#000;border:1px solid var(--line);border-bottom-width:3px;border-radius:5px;padding:0 6px;font-size:.85em}

/* ---- the always-visible countdown banner ---- */
#cdBanner{flex:0 0 auto;display:flex;flex-wrap:wrap;gap:4px 14px;align-items:center;justify-content:center;padding:6px 12px calc(6px);padding-top:max(6px,env(safe-area-inset-top));background:linear-gradient(90deg,#3b0764,#9d174d);border-bottom:2px solid var(--gold);z-index:50;text-align:center}
#cdBanner .cdLabel{font-weight:800;letter-spacing:.06em;font-size:13px}
#cdBanner .cdBig{font:800 clamp(18px,3.6vw,28px) ui-monospace,Consolas,monospace;color:var(--gold);text-shadow:0 0 12px #ffd23f88}
#cdMsg{font-size:12px;color:#fde7ff;opacity:.9;flex:1 1 260px;min-width:0}
#cdBanner.over{animation:pulse 1s infinite}
@keyframes pulse{50%{filter:brightness(1.5)}}

#stage{position:relative;flex:1 1 auto;min-height:0;display:flex;align-items:center;justify-content:center;background:#000}
#game{display:block;background:#000;max-width:100%;max-height:100%}

.screen{position:absolute;inset:0;overflow:auto;display:flex;align-items:center;justify-content:center;padding:14px;background:rgba(8,4,18,.74);backdrop-filter:blur(3px);z-index:20}
.panel{width:min(520px,100%);background:var(--panel);border:1px solid var(--line);border-radius:20px;padding:22px;box-shadow:0 20px 60px #000a;margin:auto}
.panel.wide{width:min(900px,100%)}
h1{font-size:clamp(28px,6vw,48px);margin:.1em 0;line-height:1.05;letter-spacing:-.02em}
h1 span{display:block;background:linear-gradient(90deg,var(--acc),var(--acc2));-webkit-background-clip:text;background-clip:text;color:transparent}
h2{margin:0 0 10px}h3{margin:12px 0 4px;color:var(--acc2)}
.eyebrow{color:var(--mute);margin:0;text-transform:uppercase;letter-spacing:.14em;font-size:12px}
.big{font-size:18px}.foot,.hint,.muted{color:var(--mute);font-size:13px}
.whisper{color:#1b1432;font-size:11px;margin:10px 0 0;transition:color .3s;user-select:text}
.whisper:hover,.whisper::selection{color:var(--gold)}
.whisper .cd::selection{color:#000;background:var(--gold)}
.menu{display:flex;flex-direction:column;gap:8px;margin:14px 0}
.menu.row{flex-direction:row;flex-wrap:wrap}
.menu.row>*{flex:1 1 140px}
label{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:10px 0}
label.chk{justify-content:flex-start}
input[type=range]{flex:1;accent-color:var(--acc);min-width:90px;min-height:44px}
input[type=text],input[type=search],input:not([type]){background:#0b0912;color:var(--ink);border:1px solid var(--line);border-radius:10px;padding:10px;flex:1;min-width:0}
select{background:#0b0912;color:var(--ink);border:1px solid var(--line);border-radius:10px;padding:8px;width:100%;min-height:44px}
.cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:6px 20px}
details{margin:8px 0}summary{cursor:pointer;color:var(--acc2)}

.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:12px 0}
.card{display:flex;flex-direction:column;gap:4px;text-align:left;border:2px solid var(--line);padding:12px}
.card.sel{border-color:var(--c,var(--acc));box-shadow:0 0 0 2px var(--c,var(--acc)) inset}
.card .av{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;font-weight:800;color:#111}
.card .perk{font-size:12px;color:var(--mute)}.card small{color:var(--mute)}

/* ---- in-game overlays ---- */
#bubble,#toast{position:absolute;left:50%;transform:translateX(-50%);padding:8px 14px;border-radius:999px;background:#000b;border:1px solid var(--line);font-size:14px;opacity:0;transition:opacity .25s;pointer-events:none;z-index:15;max-width:90%;text-align:center}
#bubble{bottom:90px}#toast{top:56px;z-index:60}
#bubble.on,#toast.on{opacity:1}
#hudBtns{position:absolute;right:calc(8px + env(safe-area-inset-right));top:calc(8px + env(safe-area-inset-top));display:none;gap:6px;z-index:12}
body.playing #hudBtns{display:flex}
#hudBtns button{padding:6px 10px;min-height:44px;min-width:44px;background:#000a}
#touch{position:absolute;inset:auto 0 0 0;display:none;justify-content:space-between;align-items:flex-end;padding:0 calc(18px + env(safe-area-inset-right)) calc(18px + env(safe-area-inset-bottom)) calc(18px + env(safe-area-inset-left));pointer-events:none;z-index:12}
body.playing.touch #touch{display:flex}
#touch .pad,#touch .acts{display:flex;gap:14px;pointer-events:auto}
#touch button{width:76px;height:76px;border-radius:50%;font-size:22px;font-weight:800;background:#ffffff1f;border:2px solid #ffffff55;color:#fff;touch-action:none;user-select:none;-webkit-user-select:none;padding:0}
#touch button.on{background:#ff4fd899}
#touch .a{background:#38f2c133}#touch .b{background:#ff4fd833;font-size:15px}
#rotate{display:none;position:absolute;top:50%;left:0;right:0;text-align:center;z-index:11;pointer-events:none;color:var(--mute)}
@media (orientation:portrait) and (pointer:coarse){body.playing #rotate{display:block}}

#dlg{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);width:min(760px,calc(100% - 20px));display:flex;gap:12px;align-items:center;background:#120a22f2;border:2px solid var(--acc);border-radius:18px;padding:14px;z-index:40}
#dlgPic{flex:0 0 52px;height:52px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:22px;color:#111}
.dlgBody{flex:1;min-width:0}.dlgBody p{margin:2px 0 0}
#dlgName{letter-spacing:.04em}
body.talking .screen:not(#party){background:rgba(8,4,18,.2)}

/* ---- DJ booth ---- */
#dj{align-items:flex-start;background:rgba(8,4,18,.93)}
.djwrap{width:min(1100px,100%);margin:0 auto}
.djhead{display:flex;justify-content:space-between;align-items:center}
.djgrid{display:grid;grid-template-columns:1fr 200px 1fr;gap:12px}
@media (max-width:820px){.djgrid{grid-template-columns:1fr}}
.deck,.mixer,.spot{background:#161226;border:1px solid var(--line);border-radius:16px;padding:12px}
.deck h3,.mixer h3{margin:0 0 6px}
.ttl{font-size:13px;color:var(--mute);margin:6px 0;min-height:1.4em}
.wave{width:100%;height:70px;background:#000;border-radius:8px;display:block}
.platter{display:flex;align-items:center;gap:12px;margin:8px 0}
.disc{width:64px;height:64px;border-radius:50%;background:repeating-radial-gradient(#111 0 3px,#222 3px 6px);border:3px solid var(--acc);position:relative}
.disc::after{content:"";position:absolute;left:50%;top:4px;width:3px;height:16px;background:#fff;transform:translateX(-50%)}
.bpm{font:700 20px ui-monospace,Consolas,monospace;color:var(--gold)}
.btns{display:flex;flex-wrap:wrap;gap:6px}.btns button{flex:1 1 70px;padding:8px}
.btns button.on{background:var(--acc2);color:#000}
.mixer{display:flex;flex-direction:column;align-items:stretch;gap:6px}
.cakewrap{text-align:center}.cake{font-size:56px;animation:bob 1.2s infinite alternate ease-in-out}
@keyframes bob{to{transform:translateY(-8px) rotate(4deg)}}
.xfl{flex-direction:column;align-items:stretch}.xfs{display:flex;justify-content:space-between;color:var(--mute);margin-top:-6px}
.big{ }
.mixer .big{background:linear-gradient(90deg,#f43f5e,var(--gold));color:#14001a;font-weight:800;border:0}
.spot{margin-top:12px}.spot .row{display:flex;gap:8px;margin:8px 0}

#confetti{position:absolute;inset:0;overflow:hidden;pointer-events:none}
#confetti i{position:absolute;top:-10px;width:8px;height:12px;animation:fall linear forwards}
@keyframes fall{to{transform:translateY(110vh) rotate(720deg)}}
#party .panel{position:relative;overflow:hidden;text-align:center}

@media (max-height:520px){.panel{padding:12px}.menu{gap:5px;margin:8px 0}button{padding:8px 14px;min-height:38px}h1{font-size:28px}#cdMsg{display:none}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* ======== v0.2: set list, cards, workshop, dev mode, Cake·AI ======== */
.devonly{display:none!important}
body.dev .devonly{display:block!important}
body.dev .menu.row .devonly{display:block!important}
button.on{background:var(--acc2);color:#000}
button.locked{opacity:.65}
button.mini{padding:6px 12px;min-height:34px;font-size:13px}
label.col{flex-direction:column;align-items:stretch}
label.inl{margin:0}
textarea,.mono{width:100%;background:#0b0912;color:var(--ink);border:1px solid var(--line);border-radius:10px;padding:10px;font:inherit;resize:vertical}
.mono{font:13px/1.45 ui-monospace,Consolas,monospace}
code{background:#000;padding:0 5px;border-radius:4px;color:var(--acc2)}

/* set list */
.slots{display:flex;flex-direction:column;gap:8px;margin:12px 0}
.slot{display:flex;align-items:center;gap:12px;background:#0b0912;border:1px solid var(--line);border-left:5px solid var(--c);border-radius:12px;padding:10px 12px}
.slot .av{flex:0 0 40px;height:40px;border-radius:50%;display:grid;place-items:center;font-weight:800;color:#111}
.slot .si{flex:1;min-width:0;display:flex;flex-direction:column}
.slot .si small{color:var(--mute)}
.slot .chip{font-size:12px;border:1px solid var(--line);border-radius:999px;padding:2px 10px;white-space:nowrap}
.slot.live{box-shadow:0 0 0 2px #ff4d6d inset;background:#2a0f1c}.slot.live .chip{background:#ff4d6d;color:#fff;border:0}
.slot.next .chip{background:var(--gold);color:#111;border:0}.slot.done{opacity:.55}

/* birthday card */
.tabs{display:flex;gap:8px;margin-bottom:10px}.tabs button.sel{background:var(--acc);color:#14001a;font-weight:800}
.cardwrap{position:relative;perspective:1400px;min-height:360px}
.cover{--c:var(--acc);position:absolute;inset:0;z-index:2;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;border-radius:14px;background:linear-gradient(135deg,var(--c),#3b0764);cursor:pointer;transform-origin:left center;transition:transform .8s ease;backface-visibility:hidden;box-shadow:0 10px 40px #0008;padding:12px}
.cover .coverart{font-size:84px;line-height:1}.cover .coverart img{max-width:min(380px,80%);border-radius:12px;border:6px solid #fff;box-shadow:0 6px 20px #0008;transform:rotate(-2deg)}
.cwrap-open .cover,.cardwrap.open .cover{transform:rotateY(-170deg);pointer-events:none;z-index:0}
.inside{position:relative;min-height:360px;background:#fff8ec;border-radius:14px;padding:16px;color:#2b2233;overflow:auto;max-height:55vh}
.notes{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:14px}
.note{background:#fffbe0;border:1px solid #e8d98a;border-radius:6px;padding:10px;transform:rotate(var(--r,0));box-shadow:0 3px 8px #0003;font-family:"Segoe Print","Bradley Hand","Comic Sans MS",cursive}
.note .ne{font-size:22px}.note .nm{margin:4px 0;word-break:break-word;color:#2b2233}.note .nn{color:#6b4e00;font-size:13px}
.emoji{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}.emoji button{font-size:22px;padding:6px 10px;min-height:44px}.emoji button.sel{background:var(--acc2)}

/* workshop */
.wgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px;margin:12px 0}
.wcard{background:#0b0912;border:1px solid var(--line);border-radius:14px;padding:12px;display:flex;flex-direction:column;gap:4px}
.wcard .chip{align-self:flex-start;font-size:12px;border:1px solid var(--line);border-radius:999px;padding:1px 8px;color:var(--mute)}
.wcard.live .chip{background:var(--acc2);color:#000;border:0}.wcard.testing .chip{background:var(--gold);color:#000;border:0}
.microhost{display:flex;flex-direction:column;align-items:center;gap:10px;min-height:340px;margin-top:8px}
.sandbox{width:100%;max-width:520px;height:360px;border:1px solid var(--line);border-radius:12px;background:#111;margin-top:10px;display:block}

/* developer mode */
#devHud{position:absolute;left:8px;top:70px;z-index:13;pointer-events:none;background:rgba(0,0,0,.72);border:1px solid var(--line);border-radius:8px;padding:6px 8px;font:11px/1.35 ui-monospace,Consolas,monospace;max-width:min(360px,60vw)}
#devHud b{color:var(--mute);font-weight:600}
.devgroup{border-top:1px solid var(--line);padding-top:6px}
.devpre{background:#000;border-radius:8px;padding:10px;max-height:240px;overflow:auto;font-size:12px;white-space:pre-wrap}

/* Cake·AI */
.chat{background:#0b0912;border:1px solid var(--line);border-radius:12px;padding:10px;max-height:150px;overflow:auto;display:flex;flex-direction:column;gap:8px;margin-bottom:8px}
.bub{max-width:88%;padding:8px 12px;border-radius:14px;display:flex;flex-direction:column;font-size:14px}
.bub b{font-size:11px;opacity:.8}
.bub.me{align-self:flex-end;background:#6d28d9}.bub.ai{align-self:flex-start;background:#1f2937}
.bar{height:12px;border-radius:99px;background:#000;overflow:hidden;border:1px solid var(--line)}
.bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--acc),var(--acc2));transition:width .08s linear}
.bar i.err{background:#ef4444}
.ckstage{position:relative;max-width:800px;margin:10px auto;touch-action:none}
#ckCanvas{display:block;width:100%;height:auto;border-radius:14px;box-shadow:0 12px 40px #000a;touch-action:none;cursor:none;background:#d9d4c7}
#ckCursor{display:none;position:absolute;pointer-events:none;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);mix-blend-mode:difference}
#ckNozzle{display:none;position:absolute;pointer-events:none;font-size:30px;transform:translate(-4px,-92%) rotate(-20deg);filter:drop-shadow(0 3px 3px #0008)}
.palette{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:6px 0}
.sw{width:40px;height:40px;border-radius:50%;border:3px solid #fff4;padding:0;min-height:40px}.sw.sel{border-color:#fff;box-shadow:0 0 0 3px var(--acc)}

/* ======== always-visible music bar + panel ======== */
#musicBar{flex:0 0 auto;display:flex;align-items:center;gap:6px;padding:3px 10px;background:#120a22;border-bottom:1px solid var(--line);z-index:49;font-size:13px}
#musicBar button{padding:2px 9px;min-height:32px;min-width:32px;border-radius:9px;font-size:14px}
#musicBar .now{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink)}
#musicBar .chip{font-size:10px;letter-spacing:.08em;border-radius:999px;padding:1px 8px;border:1px solid var(--line);color:var(--mute)}
#musicBar .chip.stopiffy{background:var(--acc2);color:#000;border:0;font-weight:700}
#mbVol{flex:0 0 90px;min-width:60px;min-height:0;height:20px}
#mbMore{white-space:nowrap}
#musicPanel{position:fixed;right:8px;top:calc(env(safe-area-inset-top) + 74px);width:min(420px,calc(100vw - 16px));max-height:min(75vh,640px);overflow:auto;background:#161226;border:1px solid var(--acc);border-radius:16px;padding:12px;z-index:90;box-shadow:0 20px 60px #000c}
.mpHead{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.mpHead button{padding:2px 10px;min-height:32px}
.seg{display:flex;gap:6px}.seg button{flex:1}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}.chips button{padding:4px 10px;min-height:34px;font-size:13px}
.mpRow{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:8px 0}.mpRow input[type=search]{flex:1;min-width:120px}
#mpList{display:flex;flex-direction:column;gap:4px;max-height:280px;overflow:auto;margin:6px 0}
.mpTrack{display:flex;flex-direction:column;align-items:flex-start;text-align:left;padding:6px 10px;min-height:44px;border-radius:10px}
.mpTrack small{color:var(--mute)}.mpTrack.now{border-color:var(--acc2);background:#1e1a3a}
@media (max-width:560px){#mbVol,#mbMute{display:none}#mbSrc{display:none}#mbMore{font-size:0}#mbMore::before{content:"🎚";font-size:16px}}

/* up-aim button for touch (boss + flying enemies) */
#touch .u{font-size:26px;background:#60a5fa33}

/* ======== PARTY MODE (body.party, switched on by the party clock) ======== */
.partyonly{display:none!important}
body.party .partyonly,body.dev .partyonly{display:flex!important}
#fxLayer{position:fixed;inset:0;pointer-events:none;overflow:hidden;z-index:45}
.emo{position:absolute;top:-8%;animation:emoFall 4s linear forwards;filter:drop-shadow(0 2px 3px #0006)}
@keyframes emoFall{0%{transform:translateY(0) rotate(0)}100%{transform:translateY(115vh) rotate(540deg)}}
.balloon{position:absolute;bottom:-12%;animation:balloonUp 9s ease-in forwards;opacity:.9;filter:drop-shadow(0 3px 4px #0006)}
@keyframes balloonUp{0%{transform:translate(0,0) rotate(-6deg)}50%{transform:translate(28px,-55vh) rotate(8deg)}100%{transform:translate(-18px,-125vh) rotate(-6deg)}}
#partyLaunch{position:fixed;inset:0;z-index:95;display:grid;place-items:center;background:radial-gradient(circle at 50% 40%,#5b0a8caa,#0b0912ee);animation:plIn .5s ease-out}
#partyLaunch[hidden]{display:none}
@keyframes plIn{from{opacity:0;transform:scale(1.15)}to{opacity:1;transform:none}}
.plBox{text-align:center;padding:24px;max-width:92vw}
.plBox h2{font-size:clamp(30px,8vw,72px);margin:.1em 0;line-height:1;background:linear-gradient(90deg,#ff4fd8,#ffd23f,#38f2c1,#60a5fa,#ff4fd8);background-size:300% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:rainbow 2.5s linear infinite}
.plEmoji{font-size:clamp(34px,9vw,72px);animation:wobble 1s ease-in-out infinite}
.plBox p{font-size:clamp(16px,3.4vw,24px);margin:.3em 0}.plNote{color:var(--mute)}
@keyframes rainbow{to{background-position:300% 0}}
@keyframes wobble{0%,100%{transform:rotate(-5deg) scale(1)}50%{transform:rotate(5deg) scale(1.12)}}
@keyframes hueSpin{to{filter:hue-rotate(360deg)}}
body.party:not(.fx-off) #cdBanner{background:linear-gradient(90deg,#be185d,#7c3aed,#0891b2,#16a34a,#ca8a04,#be185d);background-size:300% 100%;animation:rainbow 9s linear infinite;box-shadow:0 0 calc(10px + 26px * var(--beat,0)) rgba(255,79,216,.8)}
body.party:not(.fx-off) #cdBanner .cdBig{text-shadow:0 0 calc(8px + 22px * var(--beat,0)) #fff}
body.party:not(.fx-off) #musicBar{box-shadow:inset 0 -2px calc(2px + 10px * var(--beat,0)) rgba(56,242,193,.7)}
body.party:not(.fx-off) h1 span{background:linear-gradient(90deg,#ff4fd8,#ffd23f,#38f2c1,#60a5fa,#ff4fd8);background-size:300% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:rainbow 4s linear infinite}
body.party.fx-wild h1{display:inline-block;animation:wobble 2.4s ease-in-out infinite}
body.party.fx-wild #title .menu button:hover{animation:wobble .4s ease-in-out infinite}
body.party.fx-wild .panel{transform:scale(calc(1 + 0.004 * var(--beat,0)))}
body.party.fx-wild #game{filter:saturate(1.25) contrast(1.04)}
body.party.fx-wild .slot.live{animation:wobble 1.4s ease-in-out infinite}
body.party.fx-off *{animation-play-state:running}
