:root{
  --bg:#0d1117; --panel:#161b26; --panel2:#1d2434; --line:#2a3247;
  --text:#e8ecf4; --muted:#93a0b8; --accent:#5b8cff; --accent2:#ffb020;
  --good:#3fb96f; --mid:#e8c33a; --bad:#e5534b; --radius:14px;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);font:15px/1.5 -apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}
.topbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:10px 16px;background:var(--panel);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:5}
.brand{font-weight:800;font-size:19px}.brand .plus{color:var(--accent)}.brand .tag{display:block;font-weight:400;font-size:11px;color:var(--muted)}
.tabs{display:flex;gap:6px;margin-left:auto}
.tab{background:var(--panel2);color:var(--text);border:1px solid var(--line);border-radius:999px;padding:8px 16px;font-size:15px;cursor:pointer}
.tab.active{background:var(--accent);border-color:var(--accent);color:#fff}
.conn{display:flex;gap:6px;align-items:center;color:var(--muted);font-size:13px}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block}
.dot-off{background:var(--bad)}.dot-on{background:var(--good)}.dot-busy{background:var(--accent2)}
.view{display:none;padding:18px;max-width:1180px;margin:0 auto}
.view.active{display:block}
.hero{text-align:center;padding:26px 0 8px}
.hero h1{font-size:40px;margin:0 0 4px}.sub{color:var(--muted);font-size:17px;margin:0 0 18px}
.find-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:18px;display:flex;flex-wrap:wrap;gap:12px;justify-content:center;align-items:end;text-align:left}
.find-card label{display:flex;flex-direction:column;gap:5px;color:var(--muted);font-size:13px}
select,input[type=search],textarea{background:var(--panel2);color:var(--text);border:1px solid var(--line);border-radius:9px;padding:10px;font-size:15px}
.cta{background:var(--accent);color:#fff;border:0;border-radius:10px;padding:12px 22px;font-size:16px;font-weight:700;cursor:pointer}
.cta.small{padding:8px 14px;font-size:14px}
.ghost{background:transparent;color:var(--accent);border:1px solid var(--line);border-radius:9px;padding:8px 12px;cursor:pointer;margin-top:8px}
.ghost.small{padding:3px 9px;margin:0;font-size:13px}
.fine{width:100%;color:var(--muted);font-size:12.5px;margin:4px 0 0}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:18px}
@media(max-width:800px){.grid{grid-template-columns:1fr}}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:16px;margin-top:16px}
.grid .card{margin-top:0}
.card h2{margin-top:0;font-size:18px}
.badge{font-size:10.5px;padding:2px 8px;border-radius:999px;vertical-align:middle}
.badge.real{background:#12351f;color:#6fe39a;border:1px solid #245c38}
.badge.demo{background:#3a2f10;color:#ffd479;border:1px solid #6b5716}
.muted{color:var(--muted)}
.diff{margin:0;padding-left:18px}.diff li{margin:7px 0}
.live-list{display:flex;flex-direction:column;gap:6px;max-height:300px;overflow:auto}
.live-list.tall{max-height:560px}
.room-btn{display:flex;justify-content:space-between;gap:10px;text-align:left;background:var(--panel2);border:1px solid var(--line);color:var(--text);border-radius:9px;padding:9px 12px;cursor:pointer;font-size:14px}
.room-btn:hover{border-color:var(--accent)}
.room-btn .fmt{color:var(--accent2);font-size:12px;white-space:nowrap}
.page-h{font-size:26px}
/* battle */
.battle-head{display:flex;flex-wrap:wrap;gap:12px;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:10px 14px}
.chip{background:var(--panel2);border:1px solid var(--line);border-radius:999px;padding:2px 10px;font-size:12.5px}
.battle-layout{display:grid;grid-template-columns:1.6fr 1fr;gap:16px;margin-top:16px}
@media(max-width:900px){.battle-layout{grid-template-columns:1fr}}
.stage{background:linear-gradient(180deg,#1a2f26,#12241c 60%,#0f1c15);border:1px solid var(--line);border-radius:var(--radius);padding:16px;min-height:380px;display:flex;flex-direction:column;justify-content:space-between}
.side{display:flex;align-items:center;gap:14px}
.opp-side{justify-content:flex-end}
.sprite-wrap img{width:150px;height:150px;object-fit:contain;image-rendering:auto;filter:drop-shadow(0 10px 10px rgba(0,0,0,.5))}
.sprite-wrap.me img{transform:scaleX(1)}
.mon-card{background:rgba(13,17,23,.82);border:1px solid var(--line);border-radius:12px;padding:10px 12px;min-width:230px}
.mon-card .nm{font-weight:800}
.type{display:inline-block;font-size:11px;font-weight:700;color:#fff;border-radius:6px;padding:1px 7px;margin-left:5px;text-transform:uppercase}
.hpbar{height:11px;background:#2a3247;border-radius:99px;overflow:hidden;margin:6px 0 3px}
.hpfill{height:100%;border-radius:99px;transition:width .6s ease}
.bench{display:flex;gap:5px}
.bench img{width:34px;height:34px;object-fit:contain;background:rgba(13,17,23,.6);border:1px solid var(--line);border-radius:8px;padding:2px}
.bench .fainted{opacity:.28;filter:grayscale(1)}
.battle-side{display:flex;flex-direction:column;gap:16px;min-height:0}
.calc,.log-wrap{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px}
.calc h3,.log-wrap h3{margin:0 0 6px;font-size:14px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}
.log{overflow:auto;max-height:300px;font-size:13.5px}
.log.tall{max-height:420px}
.log .turn-h{color:var(--accent2);font-weight:800;margin:9px 0 3px}
.log .dmg{color:#ff9d94}.log .heal{color:#7fe0a2}.log .sys{color:var(--muted)}
.controls{margin-top:16px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:14px}
.move-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
@media(max-width:600px){.move-grid{grid-template-columns:1fr}}
.move-btn{text-align:left;border:0;border-radius:12px;padding:12px 14px;color:#fff;cursor:pointer;font-size:15px}
.move-btn:disabled{opacity:.4;cursor:default}
.move-btn .mn{font-weight:800;font-size:16px}
.move-btn .mm{display:block;font-size:12.5px;opacity:.92}
.move-btn .calc-line{display:block;font-size:12.5px;font-weight:700;background:rgba(0,0,0,.28);border-radius:6px;padding:2px 7px;margin-top:5px}
.switch-row{display:flex;gap:8px;align-items:center;margin-top:12px;flex-wrap:wrap}
.switch-btns{display:flex;gap:8px;flex-wrap:wrap}
.switch-btn{display:flex;align-items:center;gap:7px;background:var(--panel2);color:var(--text);border:1px solid var(--line);border-radius:10px;padding:6px 10px;cursor:pointer}
.switch-btn:disabled{opacity:.4;cursor:default}
.switch-btn img{width:30px;height:30px;object-fit:contain}
.battle-msg{min-height:22px;font-weight:600}
/* builder */
.builder-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}
.slot{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:14px}
.slot h3{margin:0 0 8px;display:flex;align-items:center;gap:9px}
.slot img{width:44px;height:44px;object-fit:contain}
.slot label{display:block;color:var(--muted);font-size:12px;margin-top:8px}
.slot input[type=text]{width:100%;background:var(--panel2);color:var(--text);border:1px solid var(--line);border-radius:8px;padding:7px;font-size:14px}
.slot input[type=range]{width:100%}
textarea{width:100%;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px;margin-bottom:10px}
/* live */
.live-layout{display:grid;grid-template-columns:1fr 1.4fr;gap:16px}
@media(max-width:900px){.live-layout{grid-template-columns:1fr}}
#room-filter{width:100%;margin-bottom:10px}
.spec-stage{display:flex;align-items:center;justify-content:space-around;background:linear-gradient(180deg,#1a2f26,#12241c);border-radius:12px;padding:10px;margin-bottom:12px}
.spec-mon{text-align:center;font-weight:700}
.spec-mon img{width:110px;height:110px;object-fit:contain}
.vs{font-weight:900;color:var(--accent2);font-size:22px}
.raw{font-family:ui-monospace,Menlo,monospace;font-size:11px;white-space:pre-wrap;word-break:break-all;max-height:220px;overflow:auto;background:#0a0e14;border:1px solid var(--line);border-radius:9px;padding:9px;margin-top:8px}
.raw-toggle{color:var(--muted);font-size:13px}
footer{color:var(--muted);font-size:12.5px;text-align:center;padding:20px}
code{background:var(--panel2);padding:1px 5px;border-radius:5px}

/* ===== battle animations (v1.1) — CSS transforms on the animated GIF sprites ===== */
.sprite-wrap{position:relative}
@keyframes lungeMe{0%{transform:translate(0,0)}35%{transform:translate(30px,-22px) scale(1.04)}100%{transform:translate(0,0)}}
@keyframes lungeOpp{0%{transform:translate(0,0)}35%{transform:translate(-30px,22px) scale(1.04)}100%{transform:translate(0,0)}}
@keyframes specLunge{0%{transform:translateY(0)}35%{transform:translateY(-8px) scale(1.07)}100%{transform:translateY(0)}}
@keyframes hitShake{0%{transform:translateX(0);filter:brightness(1)}15%{transform:translateX(-9px);filter:brightness(2.2) saturate(.3)}30%{transform:translateX(8px);filter:brightness(1.6)}45%{transform:translateX(-6px)}60%{transform:translateX(5px);filter:brightness(1.3)}100%{transform:translateX(0);filter:brightness(1)}}
@keyframes faintDrop{0%{transform:translateY(0);opacity:1}100%{transform:translateY(30px);opacity:0;filter:grayscale(1)}}
@keyframes enterIn{0%{transform:scale(.25) translateY(14px);opacity:0}60%{transform:scale(1.06) translateY(-3px);opacity:1}100%{transform:scale(1) translateY(0);opacity:1}}
@keyframes boostPulse{0%{filter:drop-shadow(0 0 0 rgba(255,176,32,0));transform:translateY(0)}40%{filter:drop-shadow(0 0 18px rgba(255,176,32,.95));transform:translateY(-7px)}100%{filter:drop-shadow(0 0 0 rgba(255,176,32,0));transform:translateY(0)}}
@keyframes statusPulse{0%{filter:drop-shadow(0 0 0 rgba(163,62,161,0))}40%{filter:drop-shadow(0 0 18px rgba(163,62,161,.95))}100%{filter:drop-shadow(0 0 0 rgba(163,62,161,0))}}
@keyframes healPulse{0%{filter:drop-shadow(0 0 0 rgba(63,185,111,0))}40%{filter:drop-shadow(0 0 18px rgba(63,185,111,.95))}100%{filter:drop-shadow(0 0 0 rgba(63,185,111,0))}}
.sprite-wrap.me.a-lunge img{animation:lungeMe .38s ease}
.sprite-wrap.opp.a-lunge img{animation:lungeOpp .38s ease}
.spec-mon.a-lunge img{animation:specLunge .38s ease}
.a-hit img{animation:hitShake .45s ease}
.a-faint img{animation:faintDrop .8s ease forwards}
.a-enter img{animation:enterIn .5s ease}
.a-boost img{animation:boostPulse .55s ease}
.a-status img{animation:statusPulse .55s ease}
.a-heal img{animation:healPulse .55s ease}
@keyframes sandShift{0%{background-position:0 0}100%{background-position:220px 0}}
.stage.sand{background-image:repeating-linear-gradient(115deg,rgba(226,191,101,.07) 0 14px,transparent 14px 42px),linear-gradient(180deg,#2a2a1e,#241f14 60%,#1c150c);animation:sandShift 1.6s linear infinite}
.anim-ctl{display:flex;gap:6px;align-items:center;color:var(--muted);font-size:13px}
.anim-ctl select{padding:5px 8px;font-size:13px}
@media (prefers-reduced-motion: reduce){.a-hit img,.a-faint img,.a-enter img,.a-boost img,.a-status img,.a-heal img,.sprite-wrap.a-lunge img,.spec-mon.a-lunge img{animation:none}}

/* ===== Juice Pack (v1.2): particles, damage numbers, shake, chip HP ===== */
.stage{position:relative;overflow:hidden}
#fx-canvas{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:4}
.side{position:relative;z-index:2}
.dmg-float{position:absolute;z-index:6;pointer-events:none;font-weight:900;font-size:24px;color:#fff;text-shadow:0 2px 8px rgba(0,0,0,.75),0 0 2px #000;transform:translate(-50%,-50%);animation:floatUp .95s ease-out forwards;white-space:nowrap}
.dmg-float.big{font-size:34px;color:#ffd479}
.dmg-float.super{color:#ff9d5c}
.dmg-float.heal{color:#7fe0a2;font-size:20px}
.dmg-float .eff-tag{display:block;font-size:12px;letter-spacing:.08em;color:#ffb020;text-align:center}
@keyframes floatUp{0%{opacity:0;transform:translate(-50%,-30%) scale(.7)}18%{opacity:1;transform:translate(-50%,-60%) scale(1.12)}100%{opacity:0;transform:translate(-50%,-190%) scale(1)}}
@keyframes screenShake{0%,100%{transform:translate(0,0)}15%{transform:translate(-7px,3px)}30%{transform:translate(6px,-3px)}45%{transform:translate(-5px,-2px)}60%{transform:translate(4px,2px)}75%{transform:translate(-2px,1px)}}
.stage.shake{animation:screenShake .4s ease}
.stage.impact{filter:brightness(1.35) saturate(1.2)}
.hpbar{position:relative}
.hpchip{position:absolute;top:0;left:0;height:100%;background:rgba(255,235,200,.85);border-radius:99px;transition:width .9s ease .45s;z-index:0}
.hpfill{position:relative;z-index:1}
.spec-stage{position:relative;overflow:hidden}

/* ===== mobile pass ===== */
button,select,input,textarea{touch-action:manipulation;-webkit-tap-highlight-color:transparent}
@media(max-width:640px){
  .view{padding:12px 10px calc(12px + env(safe-area-inset-bottom))}
  .topbar{padding:8px 10px;gap:8px}
  .brand{font-size:17px}.brand .tag{display:none}
  .tabs{order:3;width:100%;overflow-x:auto;padding-bottom:2px}
  .tab{flex:1;padding:8px 6px;font-size:14px;white-space:nowrap}
  .hero h1{font-size:29px}.sub{font-size:15px}
  .find-card{flex-direction:column;align-items:stretch}
  .find-card .cta{width:100%;padding:14px}
  .stage{min-height:330px;padding:10px}
  .sprite-wrap img{width:104px;height:104px}
  .mon-card{min-width:0;flex:1;padding:8px 9px;font-size:13.5px}
  .bench img{width:27px;height:27px}
  .side{gap:8px}
  .controls{position:sticky;bottom:0;z-index:3;border-radius:14px 14px 0 0;box-shadow:0 -6px 18px rgba(0,0,0,.45)}
  .move-btn{padding:11px}
  .log{max-height:220px}
  .spec-mon img{width:84px;height:84px}
  .battle-head{gap:8px;font-size:13.5px}
  .dmg-float{font-size:19px}.dmg-float.big{font-size:26px}
}

/* ===== mobile battle fix (Mark screenshot 2026-10-19): field + moves on ONE screen ===== */
@media(max-width:640px){
  #view-battle.active{display:flex;flex-direction:column}
  #view-battle .battle-layout{display:contents}
  #view-battle .battle-head{order:1;padding:8px 10px;font-size:13px}
  #view-battle .stage{order:2;margin-top:10px;min-height:0;padding:8px 10px}
  #view-battle .controls{order:3;position:static;margin-top:10px;padding:10px;box-shadow:none;border-radius:var(--radius)}
  #view-battle .battle-side{order:4;margin-top:10px}
  #view-battle .calc{display:none} /* calc ranges already printed on the move buttons */
  #view-battle .log{max-height:120px}
  #view-battle .sprite-wrap img{width:82px;height:82px}
  #view-battle .mon-card{font-size:12.5px;padding:7px 8px}
  #view-battle .bench img{width:23px;height:23px}
  #view-battle .move-grid{grid-template-columns:1fr 1fr;gap:8px}
  #view-battle .move-btn{padding:9px 10px}
  #view-battle .move-btn .mn{font-size:14.5px}
  #view-battle .move-btn .mm{font-size:11px}
  #view-battle .move-btn .calc-line{font-size:11px;padding:2px 5px}
  #view-battle .switch-row{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px}
  #view-battle .switch-btns{flex-wrap:nowrap}
  #view-battle .switch-btn{white-space:nowrap;padding:5px 8px;font-size:13px}
  #view-battle .battle-msg{min-height:18px;font-size:13.5px;margin:6px 0 0}
}

/* ===== move templates (v1.3) ===== */
@keyframes spinOnce{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
.a-spin img{animation:spinOnce .7s ease}
.slash-mark{position:absolute;z-index:6;pointer-events:none;width:96px;height:15px;background:linear-gradient(90deg,transparent,#ffffff 45%,#ffffff 55%,transparent);clip-path:polygon(0 42%,100% 0,100% 58%,0 100%);filter:drop-shadow(0 0 6px rgba(255,255,255,.8));animation:slashIn .32s ease-out forwards}
@keyframes slashIn{0%{opacity:0;transform:scaleX(.3) rotate(var(--r,0deg))}25%{opacity:1}100%{opacity:0;transform:scaleX(1.2) rotate(var(--r,0deg)) translateX(14px)}}
.sword{position:absolute;z-index:6;pointer-events:none;animation:swordRise .85s ease-out forwards;filter:drop-shadow(0 0 7px rgba(255,220,130,.75))}
@keyframes swordRise{0%{opacity:0;transform:translateY(30px) rotate(-16deg)}30%{opacity:1}100%{opacity:0;transform:translateY(-52px) rotate(12deg)}}
