/* ── Arcana Table · cel-shaded cartoon UI ─────────────────────────────────── */
:root{
  --ink:#2E2233;          /* outline ink */
  --bg:#1C1426;           /* room */
  --panel:#2A2038;        /* card */
  --panel-2:#342945;      /* raised */
  --paper:#F4E9D0;        /* parchment text ground */
  --text:#F2ECDF;
  --muted:#B9AECB;
  --red:#D9534F;
  --gold:#F2C14E;
  --green:#79B255;
  --blue:#4E7BD0;
  --purple:#7A4FBF;
  --radius:14px;
  --outline:3px solid var(--ink);
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html,body{height:100%}
body{
  margin:0;background:var(--bg);color:var(--text);
  font:600 15px/1.45 "Nunito",system-ui,sans-serif;
  display:flex;flex-direction:column;overflow:hidden;
}
b{font-weight:800}
button,input,select{font:inherit;color:inherit}

/* header */
#topbar{
  display:flex;align-items:center;gap:18px;padding:10px 16px;
  background:var(--panel);border-bottom:var(--outline);
}
.brand{font:800 22px/1 "Baloo 2",cursive;color:var(--gold);white-space:nowrap;
  text-shadow:2px 2px 0 var(--ink)}
.scene{flex:1;min-width:0}
#scene-title{font:700 18px/1.15 "Baloo 2",cursive}
#scene-mood{color:var(--muted);font-size:13px;font-style:italic;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.status{display:flex;flex-direction:column;align-items:flex-end;gap:4px}
.boosts{color:var(--gold);font-size:13px;font-weight:800;min-height:1em}
.badge{font-size:12.5px;font-weight:800;padding:5px 12px;border-radius:999px;border:2.5px solid var(--ink)}
.badge.on{background:var(--green);color:#15240F}
.badge.off{background:var(--panel-2);color:var(--muted)}
.badge .hint{display:inline-block;min-width:16px;height:16px;padding:0 6px;border-radius:999px;background:var(--purple);color:#fff;
  text-align:center;line-height:16px;font-size:10.5px;cursor:help;margin-left:5px;vertical-align:1px}

#combat-strip{
  background:var(--red);color:#fff;border-bottom:var(--outline);
  padding:6px 16px;font-weight:800;display:flex;align-items:center;gap:12px;
}
.mini{margin-left:auto;background:var(--ink);border:0;border-radius:8px;padding:4px 12px;cursor:pointer;font-weight:800}
.mini:hover{background:#000}

/* layout */
main{flex:1;display:flex;min-height:0}
#board-wrap{flex:1;position:relative;min-width:0;padding:14px}
#board{display:block;width:100%;height:100%;border-radius:var(--radius);
  border:var(--outline);box-shadow:0 8px 0 rgba(0,0,0,.35)}
#side{
  width:340px;min-width:300px;display:flex;flex-direction:column;
  background:var(--panel);border-left:var(--outline);
}

/* tabs */
.tabs{display:flex;gap:6px;padding:10px 10px 0}
.tab{
  flex:1;background:var(--panel-2);border:2.5px solid var(--ink);border-bottom:0;
  border-radius:12px 12px 0 0;padding:8px 4px;cursor:pointer;font-weight:800;font-size:13.5px;color:var(--muted);
}
.tab.active{background:var(--paper);color:var(--ink)}
.tabpane{flex:1;min-height:0;overflow-y:auto;background:var(--paper);color:var(--ink);
  margin:0 10px;border:2.5px solid var(--ink);border-top:0;border-radius:0 0 12px 12px;padding:10px}

/* story log */
#story-log{display:flex;flex-direction:column;gap:8px}
.entry{display:flex;gap:8px;font-size:14px;line-height:1.4}
.entry .ic{flex:0 0 auto}
.entry.narrate{font-style:italic}
.entry.roll b,.entry.combat b{color:#7A1F2B}
.entry.challenge{background:#EAD9A8;border:2px solid var(--ink);border-radius:10px;padding:6px 8px;font-weight:800}
.entry.loot{color:#6B4E12;font-weight:800}
.entry.scene{font:700 15px "Baloo 2",cursive;border-top:2px dashed #B8A77E;padding-top:8px}

/* the table: spoken turns */
.say{border-radius:12px;padding:8px 11px;font-size:14.5px;line-height:1.45;border:2.5px solid var(--ink)}
/* the speaker label only — not bold words inside the DM's own prose */
.say > b:first-child{display:block;font:700 11px "Baloo 2",cursive;letter-spacing:.09em;text-transform:uppercase;opacity:.65;margin-bottom:2px}
.say strong{font-weight:800;color:#8A3A12}
.say em{font-style:italic}
.say.dm{background:#FFF6E2;box-shadow:2px 2px 0 rgba(46,34,51,.2)}
.say.you{background:#DCE8FA;margin-left:22px}
.say.sys{background:transparent;border:2px dashed #B8A77E;color:#6B5E76;font-size:13px;font-style:italic;text-align:center}
.say.thinking{opacity:.85}
.dots{display:inline-flex;gap:4px;padding:3px 0}
.dots i{width:7px;height:7px;border-radius:50%;background:var(--ink);opacity:.35;animation:blink 1.1s infinite}
.dots i:nth-child(2){animation-delay:.18s}
.dots i:nth-child(3){animation-delay:.36s}
@keyframes blink{0%,60%,100%{opacity:.25;transform:translateY(0)}30%{opacity:.9;transform:translateY(-3px)}}

/* say something */
#say-row{display:flex;gap:6px;padding:10px}
#say-row input{flex:1;border-radius:10px;padding:9px 12px;font-size:14.5px}
#say-row input:disabled{background:#E8E1D2;color:#7A6E80}
#say-row .btn{padding:8px 14px}
#say-row .btn:disabled{opacity:.5;cursor:default}
#say-row .mic{background:var(--panel-2);color:var(--paper);padding:8px 12px}
#say-row .mic.on{background:var(--red);color:#fff;animation:pulse 1.1s infinite}
@keyframes pulse{50%{box-shadow:0 3px 0 var(--ink),0 0 0 7px rgba(217,83,79,.28)}}
#voice-row{display:flex;align-items:center;gap:10px;padding:0 10px 8px;font-size:12.5px;color:var(--muted)}
.vtoggle{display:flex;align-items:center;gap:6px;font-weight:800;cursor:pointer}
.vtoggle input{width:16px;height:16px;flex:0 0 auto;margin:0;accent-color:var(--gold)}
.vhint{font-weight:400;opacity:.75}
.vmute{margin-left:auto;background:none;border:0;font-size:16px;cursor:pointer;opacity:.85}
.vmute.off{opacity:.4}
.say.heard{background:#DCE8FA;margin-left:22px;opacity:.7;font-style:italic}
#agent-sub{font-weight:400;opacity:.7;text-transform:none;letter-spacing:0}

/* party */
.pc-card{border:2.5px solid var(--ink);border-radius:12px;background:#fff;box-shadow:3px 3px 0 rgba(46,34,51,.25);
  padding:10px;margin-bottom:10px}
.pc-head{display:flex;justify-content:space-between;font-size:15px}
.hp-row{display:flex;align-items:center;gap:8px;margin:6px 0;font-size:13px;font-weight:800}
.hp-bar{flex:1;height:12px;border:2px solid var(--ink);border-radius:8px;background:#E7DFF0;overflow:hidden}
.hp-bar div{height:100%;background:var(--green)}
.conds{display:flex;gap:4px;flex-wrap:wrap;margin:4px 0}
.cond{background:var(--purple);color:#fff;font-size:11px;font-weight:800;border-radius:999px;padding:2px 8px;border:2px solid var(--ink)}
.inv{font-size:12.5px;color:#5C5165}
.loot-card,.others{border:2px dashed #A8935F;border-radius:10px;padding:8px;font-size:13px;margin-bottom:8px;color:#4A3B22}
#fitness-panel{border:2.5px solid var(--ink);border-radius:12px;background:#FFE9C9;padding:10px;font-size:13.5px}
.fit-row{margin:4px 0}
.fit-row span{font:800 16px "Baloo 2",cursive;color:#8A3A12}
.fit-ex{display:flex;justify-content:space-between;border-top:1px dashed #C9A97A;padding-top:3px;margin-top:3px}

/* DM panel */
.dm-hint{font-size:12.5px;font-style:italic;color:#6B5E76;margin:2px 0 10px}
.dm-group{margin-bottom:12px}
.dm-group label{display:block;font:700 13px "Baloo 2",cursive;margin-bottom:4px}
.dm-group.heroic{background:#FFE9C9;border:2px dashed #C9852A;border-radius:10px;padding:8px}
.row{display:flex;gap:6px;align-items:center}
.row.check{font-size:13px;gap:8px;margin-bottom:8px}
input,select{
  background:#fff;border:2.5px solid var(--ink);border-radius:8px;padding:6px 8px;min-width:0;flex:1;color:var(--ink);
}
/* flex:0 is 0 0 0% — it collapsed every checkbox in the app to nothing. */
input[type=checkbox]{flex:0 0 auto;width:18px;height:18px;padding:0;accent-color:var(--gold)}
.btn{
  background:var(--gold);color:var(--ink);border:2.5px solid var(--ink);border-radius:10px;
  padding:6px 12px;font-weight:800;cursor:pointer;box-shadow:0 3px 0 var(--ink);flex:0 0 auto;
}
.btn:active{transform:translateY(2px);box-shadow:0 1px 0 var(--ink)}
.btn.wide{width:100%}
.btn.danger{background:var(--red);color:#fff}
.btn.ghost{background:transparent;color:var(--paper);border-color:var(--paper);box-shadow:none}
.btn.big{font-size:18px;padding:12px 20px}

/* agent log */
#agent-section{border-top:var(--outline);max-height:180px;display:flex;flex-direction:column}
.agent-head{font:700 13px "Baloo 2",cursive;padding:6px 12px;color:var(--muted)}
#agent-log{overflow-y:auto;padding:0 10px 10px;display:flex;flex-direction:column;gap:4px}
.acall{display:flex;gap:6px;align-items:baseline;font-size:12px;color:var(--muted)}
.acall code{color:var(--text);font-weight:700}
.acall .chip{width:16px;text-align:center;font-weight:800}
.acall.ok .chip{color:var(--green)}
.acall.error .chip,.acall.denied .chip{color:var(--red)}
.acall.awaiting-approval .chip{color:var(--gold)}
.anote{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acall.idle{font-style:italic}

/* approvals */
#approvals{position:absolute;left:24px;bottom:24px;display:flex;flex-direction:column;gap:8px;max-width:70%}
.approval{
  background:var(--paper);color:var(--ink);border:var(--outline);border-radius:12px;
  padding:10px 12px;display:flex;gap:10px;align-items:center;font-size:14px;
  box-shadow:0 5px 0 rgba(0,0,0,.4);animation:pop .18s ease-out;
}
.approval .ok{background:var(--green)}
.approval .no{background:var(--red);color:#fff}
.approval button{border:2.5px solid var(--ink);border-radius:8px;padding:4px 10px;font-weight:800;cursor:pointer}

/* dice overlay */
.dice-overlay{
  position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:rgba(18,11,26,.72);z-index:50;pointer-events:none;
}
.die-label{font:700 20px "Baloo 2",cursive;color:var(--paper);margin-bottom:10px;text-shadow:2px 2px 0 var(--ink)}
.die{
  width:130px;height:130px;display:flex;align-items:center;justify-content:center;
  background:var(--red);color:#fff;font:800 52px "Baloo 2",cursive;
  clip-path:polygon(50% 0%, 93% 25%, 93% 75%, 50% 100%, 7% 75%, 7% 25%);
  filter:drop-shadow(4px 6px 0 rgba(0,0,0,.5));
  animation:wobble .9s ease-in-out;
}
.dice-overlay.nat20 .die{background:var(--gold);color:var(--ink)}
.dice-overlay.nat1 .die{background:#3E3A4A}
.die-total{font:800 30px "Baloo 2",cursive;color:var(--gold);margin-top:12px;text-shadow:2px 2px 0 var(--ink)}
.die-boosts{color:#8BE0D6;font-weight:800;margin-top:4px}
.spark{position:absolute;left:50%;top:45%;color:var(--gold);font-size:26px;
  animation:spark 1.4s ease-out forwards}
@keyframes spark{to{transform:translate(calc(var(--dx)*240px),calc(var(--dy)*240px)) rotate(360deg);opacity:0}}
@keyframes wobble{0%{transform:rotate(-14deg) scale(.6)}50%{transform:rotate(10deg) scale(1.12)}100%{transform:rotate(0) scale(1)}}
@keyframes pop{from{transform:scale(.85);opacity:0}}

/* Heroic Effort modal */
.chal-backdrop{position:fixed;inset:0;background:rgba(18,11,26,.8);display:flex;align-items:center;justify-content:center;z-index:60}
.chal-card{
  background:var(--paper);color:var(--ink);border:4px solid var(--ink);border-radius:20px;
  box-shadow:0 10px 0 rgba(0,0,0,.5);padding:26px 30px;text-align:center;max-width:440px;width:92%;
  animation:pop .2s ease-out;
}
.chal-eyebrow{font:800 14px "Baloo 2",cursive;letter-spacing:.12em;color:#8A3A12}
.chal-title{font:800 40px/1.05 "Baloo 2",cursive;margin:8px 0 2px}
.chal-reward{font:800 19px "Baloo 2",cursive;color:#7A1F2B}
.chal-reason{font-style:italic;color:#5C5165;min-height:1.2em}
.chal-row{display:flex;gap:12px;align-items:center;justify-content:center;margin-top:14px;flex-wrap:wrap}
.chal-row .btn.ghost{color:var(--ink);border-color:var(--ink)}
.rep-ring{
  position:relative;width:190px;height:190px;border-radius:50%;cursor:pointer;border:4px solid var(--ink);
  background:conic-gradient(var(--green) var(--pct,0%), #E2D6BC 0);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  box-shadow:0 6px 0 rgba(0,0,0,.35);user-select:none;
}
.rep-ring:active{transform:scale(.96)}
.ring-fill{display:none}
.ring-count{font:800 34px "Baloo 2",cursive;background:var(--paper);border-radius:999px;padding:6px 16px;border:3px solid var(--ink)}
.ring-hint{font-size:11px;font-weight:800;color:#5C5165;letter-spacing:.06em}
.chal-time{font:800 22px "Baloo 2",cursive;color:#8A3A12;min-width:60px}

/* responsive */
@media (max-width: 860px){
  main{flex-direction:column;overflow-y:auto}
  body{overflow:auto}
  #board-wrap{height:52vh;flex:none}
  /* the panel takes the rest of the screen rather than leaving dead space */
  #side{width:auto;min-width:0;border-left:0;border-top:var(--outline);flex:1;min-height:0}
  .tabpane{flex:1;min-height:140px;max-height:none}
}

/* ── first run ────────────────────────────────────────────────────────────── */
.intro-backdrop{
  position:fixed;inset:0;z-index:80;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 50% 40%, rgba(60,40,80,.55), rgba(12,8,18,.95) 70%);
  padding:20px;overflow-y:auto;
}
.intro-card{
  background:var(--paper);color:var(--ink);border:4px solid var(--ink);border-radius:20px;
  box-shadow:0 12px 0 rgba(0,0,0,.5);padding:30px 34px;max-width:620px;width:100%;
  animation:pop .22s ease-out;
}
.intro-eyebrow{font:800 12.5px "Baloo 2",cursive;letter-spacing:.16em;text-transform:uppercase;color:#8A3A12}
.intro-title{font:800 46px/1.05 "Baloo 2",cursive;margin:6px 0 10px;text-shadow:3px 3px 0 rgba(46,34,51,.18)}
.intro-lede{font-size:17px;line-height:1.5;color:#4A4050;margin:0 0 16px}
.intro-points{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:11px}
.intro-points li{font-size:14.5px;line-height:1.45;color:#4A4050;border-left:4px solid var(--gold);padding-left:11px}
.intro-points b{color:var(--ink)}
.intro-points code{background:#E7DCC4;border-radius:5px;padding:1px 5px;font:600 12.5px ui-monospace,monospace}
.intro-card .btn.big{width:100%;font-size:19px;padding:14px}
.intro-quiet{display:flex;align-items:center;justify-content:center;gap:7px;margin-top:12px;font-size:13px;color:#6B5E76;cursor:pointer}
.intro-quiet input{width:16px;height:16px;flex:0 0 auto;margin:0;accent-color:var(--gold)}

/* starter prompts — a judge should never face a blank box */
#starters{display:flex;flex-wrap:wrap;gap:6px;padding:0 10px 8px}
.starter{
  background:var(--panel-2);color:var(--muted);border:2px solid var(--ink);border-radius:999px;
  padding:5px 11px;font-size:12.5px;font-weight:700;cursor:pointer;
}
.starter:hover{background:var(--gold);color:var(--ink)}

/* ── phone ────────────────────────────────────────────────────────────────── */
@media (max-width: 560px){
  #topbar{gap:10px;padding:8px 10px;flex-wrap:nowrap}
  .brand{font-size:17px}
  .brand b{display:none}                 /* the die alone carries it at this size */
  .scene{min-width:0}
  #scene-title{font-size:14.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #scene-mood{display:none}              /* flavour loses to legibility on a phone */
  .badge{font-size:10.5px;padding:4px 8px;white-space:nowrap}
  .badge .hint{display:none}
  #board-wrap{height:38vh;padding:8px}
  .tabpane{min-height:120px}
  .tab{font-size:12.5px;padding:7px 2px}
  #say-row{padding:8px}
  #say-row input{font-size:16px}         /* <16px makes iOS zoom on focus */
  #agent-section{max-height:110px}
  .intro-card{padding:22px 20px}
  .intro-title{font-size:34px}
  .intro-lede{font-size:15px}
  .intro-points li{font-size:13.5px}
}

/* ── accessibility ────────────────────────────────────────────────────────── */
:focus-visible{outline:3px solid var(--gold);outline-offset:2px;border-radius:6px}
.tabpane:focus{outline:none}

/* Respect a stated preference for less motion. The board still reads — the
   torch stops guttering, tokens stop breathing, nothing pulses or shakes. */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.001ms!important;animation-iteration-count:1!important;
    transition-duration:.001ms!important;scroll-behavior:auto!important;
  }
}
.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* ── the quest ─────────────────────────────────────────────────────────────
   A five-beat rail under the header. A judge should be able to answer "what
   am I doing and how far in am I?" without reading a word of the story log. */
.quest-rail{
  display:flex;flex-wrap:wrap;align-items:center;row-gap:6px;padding:8px 14px;
  background:var(--panel);border-bottom:var(--outline);font-size:12px
}
.quest-rail[hidden]{display:none}
.qr-name{
  display:flex;align-items:center;gap:7px;padding-right:12px;margin-right:4px;
  font:800 12.5px "Baloo 2",cursive;color:var(--gold);white-space:nowrap
}
.qr-beats{display:flex;flex:1 1 320px;gap:5px;min-width:0}
.qr-beat{
  flex:1;min-width:0;border-radius:8px;padding:5px 9px;border:2px solid var(--ink);
  background:var(--panel-2);color:var(--muted);font-weight:800;font-size:11.5px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.55
}
.qr-beat .n{opacity:.65;margin-right:5px}
.qr-beat.done{background:#2E4A38;color:#BFE3C8;opacity:.9}
.qr-beat.now{background:var(--gold);color:var(--ink);opacity:1;box-shadow:0 3px 0 var(--ink)}
.qr-beat.now.final{background:#D9534F;color:#fff}
.qr-objective{
  flex:0 0 100%;color:#CDBFE0;font-weight:600;font-size:12px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis
}
.qr-objective b{color:var(--gold)}

/* ── a hero is down ────────────────────────────────────────────────────────── */
/* sits UNDER the Heroic Effort modal (z-index 60): when the DM offers reps to
   revive someone, the rep ring must never end up behind this. */
.downed-banner{
  position:fixed;inset:0;z-index:55;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 50% 45%, rgba(120,20,20,.30), rgba(8,4,10,.86) 72%);
  pointer-events:none;animation:fadein .25s ease-out
}
@keyframes fadein{from{opacity:0}}
.downed-inner{
  pointer-events:auto;text-align:center;max-width:520px;padding:26px 30px;
  background:rgba(20,10,16,.94);border:4px solid #D9534F;border-radius:18px;
  box-shadow:0 12px 0 rgba(0,0,0,.5)
}
.downed-eyebrow{font:800 13px "Baloo 2",cursive;letter-spacing:.2em;color:#F2C14E;margin-bottom:10px}
.downed-who{font:800 34px/1.1 "Baloo 2",cursive;color:#FFE9E7;text-shadow:3px 3px 0 #2E2233}
.downed-copy{margin:10px 0 14px;color:#E0CFD6;font-size:14.5px;line-height:1.5}
.downed-saves{display:flex;gap:7px;justify-content:center;flex-wrap:wrap}
.pip{
  width:16px;height:16px;border-radius:50%;border:2.5px solid var(--ink);background:#3A2A38;
  display:inline-block
}
.pip.ok{background:#6FBF7A}
.pip.bad{background:#D9534F}
.pip-label{font-size:11.5px;font-weight:800;color:#B9AECB;align-self:center;margin-right:4px}

/* ── the run is over ───────────────────────────────────────────────────────── */
.ending-backdrop{
  position:fixed;inset:0;z-index:85;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 50% 40%, rgba(60,40,80,.6), rgba(10,6,14,.96) 70%);
  padding:20px;overflow-y:auto
}
.ending-card{
  background:var(--paper);color:var(--ink);border:4px solid var(--ink);border-radius:20px;
  box-shadow:0 14px 0 rgba(0,0,0,.45);max-width:560px;width:100%;padding:34px 34px 30px;text-align:center
}
.ending-eyebrow{font:800 13px "Baloo 2",cursive;letter-spacing:.2em;color:#8A3A12;margin-bottom:10px}
.ending-title{font:800 52px/1 "Baloo 2",cursive;margin:0 0 10px}
.ending-sub{margin:0 0 20px;font-size:16px;color:#5B4F66;line-height:1.5}
.ending-stats{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-bottom:24px}
.estat{
  background:#FFF6E2;border:2.5px solid var(--ink);border-radius:12px;padding:9px 14px;min-width:96px
}
.estat b{display:block;font:800 24px "Baloo 2",cursive;color:#8A3A12}
.estat span{font-size:11.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#7A6E80}

@media (max-width: 560px){
  .quest-rail{padding:0 8px 6px}
  .qr-name{display:none}
  .qr-beat{padding:4px 6px;font-size:0}          /* numbers only on a phone */
  .qr-beat .n{font-size:11.5px;margin:0}
  .qr-objective{font-size:11.5px}
  .downed-who{font-size:26px}
  .ending-title{font-size:36px}
}
