:root{
  --bg:#143528; --bg2:#1a3d2e; --card:#1f4a38; --ink:#f4fff6; --muted:#a8cbb6;
  --acc:#ffb4d4; --acc2:#ffe08a; --ok:#6dffb0; --warn:#ffc56d; --danger:#ff8a8a;
  --tip-acc:#ffb4d4; --tip-bg:#1a2e26;
  --safe-b:env(safe-area-inset-bottom,0px); --safe-t:env(safe-area-inset-top,0px);
  font-family:"PingFang SC","Noto Sans SC","Segoe UI",system-ui,sans-serif;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%;background:var(--bg);color:var(--ink);overscroll-behavior:none}
body{min-height:100dvh;overflow:hidden}
#app{height:100dvh;max-width:520px;margin:0 auto;position:relative}
.screen{min-height:100%;padding:calc(12px + var(--safe-t)) 16px calc(16px + var(--safe-b))}
.hidden{display:none!important}

/* lobby */
.lob-head{display:flex;flex-direction:column;align-items:center;gap:8px;margin-bottom:18px;position:relative}
#langBtn{position:absolute;right:0;top:0}
.brand{text-align:center}
.logo{width:88px;height:88px;margin:8px auto 4px;border-radius:50%;
  background:
    radial-gradient(circle at 35% 35%,#fff6 0 18%,transparent 19%),
    radial-gradient(circle at 62% 40%,#fff8 0 10%,transparent 11%),
    radial-gradient(circle at 50% 55%,#ffb4d4 0 42%,#ffe08a 43% 58%,#6dffb0 59% 72%,#7ec8ff 73% 100%);
  box-shadow:0 8px 28px #0005,inset 0 -6px 12px #0003;position:relative}
.logo::after{content:"🍬";position:absolute;inset:0;display:grid;place-items:center;font-size:40px;filter:drop-shadow(0 2px 0 #0003)}
.brand h1{margin:0;font-size:28px;letter-spacing:.04em;background:linear-gradient(90deg,#ffe08a,#ffb4d4,#7ec8ff);-webkit-background-clip:text;background-clip:text;color:transparent}
.tag{margin:4px 0 0;color:var(--muted);font-size:13.5px}
.lob-card{background:linear-gradient(180deg,#1f4a38,#183a2c);border:1px solid #2f6a50;border-radius:20px;padding:16px;box-shadow:0 12px 32px #0004}
.field{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}
.field input,.join-row input{width:100%;padding:12px 14px;border-radius:14px;border:1.5px solid #3a7a5c;background:#0f2a20;color:var(--ink);font:inherit;font-size:16px}
.avatars{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin:14px 0}
.av{aspect-ratio:1;border-radius:50%;border:2px solid transparent;cursor:pointer;position:relative;
  background:radial-gradient(circle at 35% 30%,#fff8,#0000 40%),hsl(var(--h),70%,58%);box-shadow:inset 0 -4px 8px #0003}
.av.on{border-color:#ffe08a;box-shadow:0 0 0 3px #ffe08a55}
.av::after{content:"";position:absolute;width:28%;height:28%;left:22%;top:34%;border-radius:50%;background:#1a2a22}
.av::before{content:"";position:absolute;width:28%;height:28%;right:22%;top:34%;border-radius:50%;background:#1a2a22}
.lob-actions{display:flex;flex-direction:column;gap:10px}
.join-row{display:flex;gap:8px}
.join-row input{flex:1;text-transform:uppercase;letter-spacing:.12em;text-align:center}
.btn{appearance:none;border:0;border-radius:14px;padding:13px 16px;font:inherit;font-weight:700;font-size:16px;cursor:pointer;background:#2d6b4f;color:var(--ink);box-shadow:0 4px 0 #0e2a1c}
.btn:active{transform:translateY(2px);box-shadow:0 2px 0 #0e2a1c}
.btn.primary{background:linear-gradient(180deg,#ff9ec8,#ff6aa8);color:#3a1024;box-shadow:0 4px 0 #b83d72}
.btn.catch{background:linear-gradient(180deg,#ffe08a,#ffc107);color:#3a2a00;box-shadow:0 4px 0 #b8860b;font-size:18px;padding:14px 28px;border-radius:999px}
.btn.tap{width:72px;height:72px;border-radius:50%;background:linear-gradient(180deg,#ff9ec8,#ff6aa8);color:#3a1024;box-shadow:0 6px 0 #b83d72;font-size:20px;z-index:2}
.chip{appearance:none;border:1px solid #4a8a68;background:#1a3d2e;color:var(--ink);border-radius:999px;padding:6px 12px;font:inherit;font-size:13px;cursor:pointer}
.chip.quiet{background:#0002;border-color:#4a8a6888}
.hint{text-align:center;color:var(--muted);font-size:12.5px;margin:12px 0 0}
.lob-foot{margin-top:18px;text-align:center}
.fine{font-size:12px;color:var(--muted);margin:4px 0}.fine.muted{opacity:.7}

/* game chrome */
#game{padding:0;display:flex;flex-direction:column;height:100dvh}
.topbar{display:flex;align-items:center;gap:8px;padding:calc(8px + var(--safe-t)) 10px 8px;background:linear-gradient(180deg,#1a3d2ecc,#1a3d2e88);backdrop-filter:blur(8px);position:relative;z-index:5}
.iconbtn{appearance:none;border:0;background:#0003;color:var(--ink);width:40px;height:40px;border-radius:12px;font-size:18px;cursor:pointer}
.roomtag{flex:1;display:flex;align-items:center;gap:8px;font-weight:700;letter-spacing:.06em}
.top-right{display:flex;align-items:center;gap:4px}
.tv-bar{display:flex;gap:4px}

.wait{flex:1;padding:24px 16px;display:flex;flex-direction:column;align-items:center;gap:12px}
.wait h2{margin:0;font-size:22px}
.roster{list-style:none;padding:0;margin:0;width:100%;max-width:360px}
.roster li{display:flex;align-items:center;gap:10px;padding:10px 12px;margin:6px 0;border-radius:14px;background:#1f4a38;border:1px solid #2f6a50}
.roster .dot{width:36px;height:36px;border-radius:50%;background:hsl(var(--h),70%,58%);position:relative}
.roster .dot::before,.roster .dot::after{content:"";position:absolute;width:26%;height:26%;top:36%;border-radius:50%;background:#1a2a22}
.roster .dot::before{left:22%}.roster .dot::after{right:22%}
.roster .host{margin-left:auto;font-size:11px;color:var(--acc2);border:1px solid var(--acc2);border-radius:999px;padding:2px 8px}

.world-wrap{flex:1;position:relative;overflow:hidden;background:#1a3d2e;touch-action:none}
#world{display:block;width:100%;height:100%;image-rendering:pixelated}
.hud-near{position:absolute;left:0;right:0;bottom:calc(150px + var(--safe-b));display:flex;justify-content:center;pointer-events:none;z-index:4}
.hud-near .btn{pointer-events:auto}
.joy-zone{position:absolute;left:0;bottom:0;width:46%;height:180px;z-index:3;touch-action:none}
.joy-base{position:absolute;left:28px;bottom:calc(28px + var(--safe-b));width:110px;height:110px;border-radius:50%;background:#0004;border:2px solid #fff2;backdrop-filter:blur(4px)}
.joy-knob{position:absolute;left:50%;top:50%;width:48px;height:48px;margin:-24px 0 0 -24px;border-radius:50%;background:linear-gradient(180deg,#ffb4d4,#ff6aa8);box-shadow:0 4px 12px #0005;transition:transform .05s linear}
.toast{position:absolute;left:50%;top:18%;transform:translate(-50%,-20px);background:#0f2a20ee;border:1px solid #6dffb088;color:var(--ink);padding:10px 16px;border-radius:14px;font-size:14px;opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;z-index:6;max-width:86%;text-align:center}
.toast.show{opacity:1;transform:translate(-50%,0)}

/* catch UI */
.catch-ui{position:absolute;inset:0;z-index:20;background:#0a1a14dd;display:flex;align-items:center;justify-content:center;padding:16px}
.catch-card{background:linear-gradient(180deg,#1f4a38,#143528);border:1px solid #3a7a5c;border-radius:24px;padding:20px 16px 16px;width:min(340px,94vw);text-align:center;box-shadow:0 20px 50px #0008}
.catch-critter{width:96px;height:96px;margin:0 auto 8px;border-radius:50%;position:relative;
  background:radial-gradient(circle at 35% 30%,#fff9,#0000 42%),hsl(var(--h,340),75%,62%);
  box-shadow:0 8px 24px #0005;animation:bob 1.2s ease-in-out infinite}
.catch-critter::before,.catch-critter::after{content:"";position:absolute;width:18%;height:22%;top:38%;border-radius:50%;background:#1a2a22}
.catch-critter::before{left:26%}.catch-critter::after{right:26%}
.catch-critter .shine{position:absolute;width:22%;height:14%;left:28%;top:22%;border-radius:50%;background:#fff8}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
.catch-name{margin:0;font-size:20px;font-weight:800}
.catch-help{margin:4px 0 12px;color:var(--muted);font-size:13px;min-height:1.2em}
.ring-wrap{position:relative;width:180px;height:180px;margin:8px auto 12px;display:grid;place-items:center}
.ring{position:absolute;border-radius:50%;border:3px solid transparent;pointer-events:none}
.ring.outer{inset:0;border-color:#fff2}
.ring.sweet{inset:28px;border-color:#ffe08a;box-shadow:0 0 12px #ffe08a66}
.ring.pulse{inset:60px;border-color:#ff9ec8;transition:inset .05s linear}
.linkish{background:none;border:0;color:var(--muted);text-decoration:underline;font:inherit;cursor:pointer;margin-top:4px}

/* sheets */
.sheet{position:fixed;left:0;right:0;bottom:0;z-index:40;max-width:520px;margin:0 auto;max-height:78dvh;overflow:auto;
  background:linear-gradient(180deg,#1f4a38,#143528);border:1px solid #3a7a5c;border-bottom:0;border-radius:20px 20px 0 0;
  padding:12px 14px calc(16px + var(--safe-b));box-shadow:0 -12px 40px #0008}
.sheet-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.sheet-h b{font-size:17px}.sheet-h .x{appearance:none;border:0;background:#0003;color:var(--ink);width:36px;height:36px;border-radius:10px;cursor:pointer}
.album-list{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.al-card{background:#0f2a20;border-radius:14px;padding:10px 8px;text-align:center;border:1px solid #2f6a50}
.al-card.lock{opacity:.45;filter:grayscale(.8)}
.al-art{width:56px;height:56px;margin:0 auto 6px;border-radius:50%;background:radial-gradient(circle at 35% 30%,#fff8,#0000 40%),hsl(var(--h),70%,58%)}
.al-card .n{font-size:13px;font-weight:700}.al-card .c{font-size:11px;color:var(--muted)}
.rar{font-size:10px;letter-spacing:.05em}
.sum-body{font-size:14px}.sum-row{display:flex;justify-content:space-between;gap:8px;padding:8px 0;border-bottom:1px solid #2f6a5088}
.menu-list{display:flex;flex-direction:column;gap:8px}
.menuitem{appearance:none;border:1px solid #2f6a50;background:#0f2a20;color:var(--ink);border-radius:12px;padding:12px;font:inherit;font-size:15px;text-align:left;cursor:pointer}
.menuitem.danger{color:var(--danger);border-color:#8a3a3a}
.center{text-align:center;font-size:28px;font-weight:800;letter-spacing:.18em;margin:8px 0}
#qr{display:block;margin:8px auto 12px;background:#fff;border-radius:12px;padding:8px}

/* player nameplates drawn on canvas; CSS helpers for voice */
.tv-micon::after{content:"🎙️"}
