:root{--ground:#F4F3EF;--surface:#FBFAF7;--panel:#EAE8E0;--line:#D9D6CC;--ink:#17201C;--ink-soft:#3A423C;--pine:#1E3A34;--pine-deep:#16302A;--gold:#A9791F;--muted:#6E736B;--good:#2F7A55;--good-bg:#E4F0E8;--warn:#A9791F;--warn-bg:#F5EAD2;--crit:#A23B2E;--crit-bg:#F2E0DC;--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;--serif:Georgia,"Iowan Old Style",serif;--mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;--radius:6px}*{box-sizing:border-box}body,html{padding:0;margin:0}body{background:var(--ground);color:var(--ink);font-family:var(--sans);font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased}a{color:var(--pine);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3{margin:0;letter-spacing:-.01em}button{font-family:inherit;cursor:pointer}:focus-visible{outline:2px solid var(--gold);outline-offset:2px}.shell{display:grid;grid-template-columns:240px 1fr;min-height:100vh}.sidebar{background:var(--pine);color:#E9EDEA;padding:26px 18px;display:flex;flex-direction:column;gap:6px;position:-webkit-sticky;position:sticky;top:0;height:100vh}.brand{font-family:var(--serif);font-size:20px;color:#FBFAF6;margin-bottom:4px;line-height:1.1}.brand small{display:block;font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:#9DB0A8;margin-top:6px}.nav{flex-direction:column;gap:2px;margin-top:22px}.nav,.nav a{display:flex}.nav a{color:#C6D0CB;padding:9px 12px;border-radius:var(--radius);font-size:14.5px;align-items:center;gap:10px}.nav a:hover{background:rgba(255,255,255,.06);text-decoration:none;color:#EEF2F0}.nav a.active{background:var(--pine-deep);color:#fff}.sidebar .foot{margin-top:auto;font-size:13px;color:#9DB0A8;border-top:1px solid rgba(255,255,255,.1);padding-top:16px}.sidebar .foot b{color:#E9EDEA;display:block;font-weight:600}.linkbtn{background:none;border:none;color:#9DB0A8;padding:0;margin-top:8px;font-size:13px;text-decoration:underline}.linkbtn:hover{color:#E9EDEA}.main{padding:34px 40px 80px;max-width:1100px}.page-head{display:flex;align-items:baseline;justify-content:space-between;gap:20px;margin-bottom:22px;flex-wrap:wrap}.page-head h1{font-family:var(--serif);font-size:30px;font-weight:600}.page-head .sub{color:var(--muted);font-size:13.5px;font-family:var(--mono)}.eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--gold)}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.card-pad{padding:20px 22px}.grid-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));grid-gap:14px;gap:14px;margin-bottom:26px}.stat{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px}.stat .k{font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.stat .v{font-size:27px;font-weight:680;margin-top:6px;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.toolbar{display:flex;gap:12px;align-items:center;margin-bottom:16px;flex-wrap:wrap}.input{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:9px 13px;font-size:14px;color:var(--ink);min-width:260px}.input:focus{border-color:var(--gold);outline:none}.select{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:9px 11px;font-size:14px}.btn{background:var(--pine);color:#fff;border:none;border-radius:var(--radius);padding:10px 18px;font-size:14.5px;font-weight:560}.btn:hover{background:var(--pine-deep)}.btn:disabled{opacity:.5;cursor:default}.btn-ghost{background:transparent;color:var(--pine);border:1px solid var(--line)}.btn-ghost:hover{background:var(--panel)}.tablewrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface)}table{border-collapse:collapse;width:100%;font-size:14px}td,th{text-align:left;padding:12px 16px;border-bottom:1px solid var(--line);vertical-align:middle}th{font-family:var(--mono);font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);font-weight:600;background:var(--panel);position:-webkit-sticky;position:sticky;top:0}tbody tr:last-child td{border-bottom:none}tbody tr{cursor:pointer}tbody tr:hover{background:#F3F1EA}td.num,th.num{text-align:right;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}td .muted{color:var(--muted)}.pill{display:inline-flex;align-items:center;font-family:var(--mono);font-size:11px;font-weight:600;letter-spacing:.03em;padding:3px 9px;border-radius:20px;text-transform:uppercase}.pill.good{background:var(--good-bg);color:var(--good)}.pill.warn{background:var(--warn-bg);color:var(--warn)}.pill.crit{background:var(--crit-bg);color:var(--crit)}.pill.neutral{background:var(--panel);color:var(--muted)}.pager{display:flex;gap:10px;align-items:center;margin-top:16px;font-size:14px;color:var(--muted)}.pager button{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:7px 12px;font-size:13.5px}.pager button:hover:not(:disabled){background:var(--panel)}.pager button:disabled{opacity:.4;cursor:default}.detail-grid{display:grid;grid-template-columns:2fr 1fr;grid-gap:22px;gap:22px;align-items:start}.kv{display:grid;grid-template-columns:130px 1fr;grid-gap:8px 16px;gap:8px 16px;font-size:14px}.kv dt{color:var(--muted);font-family:var(--mono);font-size:12px}.kv dd{margin:0}.section-title{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--gold);margin:26px 0 12px}.logbox{background:#10231E;color:#CFE0D8;border-radius:var(--radius);padding:18px 20px;line-height:1.7;max-height:460px;overflow-y:auto;white-space:pre-wrap}.back,.logbox{font-family:var(--mono);font-size:12.5px}.back{color:var(--muted);margin-bottom:14px;display:inline-block}.empty,.spinner{padding:46px;text-align:center;color:var(--muted)}.spinner{font-family:var(--mono);font-size:13px}.error-banner{background:var(--crit-bg);color:var(--crit);padding:12px 16px;border-radius:var(--radius);font-size:14px;margin-bottom:16px}.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}.login-card{width:100%;max-width:380px;background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:36px 34px}.login-logo{display:block;width:84px;height:84px;border-radius:18px;margin:0 auto 16px}.login-card .brand{color:var(--pine);font-size:26px}.login-card label{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin:18px 0 6px}.login-card .input{width:100%;min-width:0}.login-card .btn{width:100%;margin-top:24px;padding:12px}.login-section{margin-top:22px;display:flex;flex-direction:column;align-items:flex-start;gap:4px}.login-section-label{font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}.login-section .btn-ghost{width:auto;margin-top:8px;padding:8px 14px}.login-divider{display:flex;align-items:center;gap:12px;margin:24px 0 4px;color:var(--muted);font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.login-divider:after,.login-divider:before{content:"";flex:1 1;height:1px;background:var(--line)}.setup-label{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}.skill-grid{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.skill-chip{border:1px solid var(--line);background:var(--surface);color:var(--ink-soft);border-radius:20px;padding:7px 14px;font-size:13.5px}.skill-chip:hover:not(:disabled){background:var(--panel)}.skill-chip.on{background:var(--pine);color:#fff;border-color:var(--pine)}.skill-chip:disabled{opacity:.4;cursor:default}.skill-chip.has-tip{position:relative;cursor:help}.skill-chip.has-tip:after{content:attr(data-tip);bottom:calc(100% + 8px);transform:translateX(-50%) translateY(4px);width:max-content;max-width:240px;white-space:normal;text-align:left;background:var(--ink);color:#fff;font-size:12px;line-height:1.45;padding:8px 10px;border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.22);transition:opacity .14s ease,transform .14s ease}.skill-chip.has-tip:after,.skill-chip.has-tip:before{position:absolute;left:50%;opacity:0;pointer-events:none;z-index:30}.skill-chip.has-tip:before{content:"";bottom:calc(100% + 2px);transform:translateX(-50%);border:6px solid transparent;border-top:6px solid var(--ink);transition:opacity .14s ease}.skill-chip.has-tip:focus-visible:after,.skill-chip.has-tip:hover:after{opacity:1;transform:translateX(-50%) translateY(0)}.skill-chip.has-tip:focus-visible:before,.skill-chip.has-tip:hover:before{opacity:1}@media (prefers-reduced-motion:reduce){.skill-chip.has-tip:after{transition:none}}.role-preview{display:flex;gap:14px;margin-top:12px;padding:12px;background:var(--panel);border:1px solid var(--line);border-radius:12px}.role-img{width:96px;height:96px;flex:none;object-fit:cover;border-radius:10px;background:var(--surface);border:1px solid var(--line)}.role-preview-body b{display:block;font-size:15px;margin-bottom:4px}.role-preview-body p{margin:0;font-size:12.5px;color:var(--ink-soft);line-height:1.5;max-height:130px;overflow-y:auto}.role-card{display:flex;gap:18px;align-items:flex-start}.role-card .role-img{width:120px;height:120px;border-radius:12px}.role-card-body{min-width:0}.role-card-body h3{font-family:var(--serif);font-size:20px;margin:2px 0 8px}.role-card-body p{margin:0;font-size:13.5px;color:var(--ink-soft);line-height:1.55;max-height:160px;overflow-y:auto;white-space:pre-wrap}.play-grid{display:grid;grid-template-columns:1.3fr 1fr;grid-gap:24px;gap:24px;align-items:start}.board{display:grid;grid-template-columns:repeat(7,1fr);grid-gap:4px;gap:4px;background:var(--panel);padding:8px;border-radius:var(--radius);border:1px solid var(--line)}.board,.cell{position:relative}.cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;font-size:14px;background:var(--surface);border-radius:3px;color:var(--muted)}.cell.trail{box-shadow:inset 0 0 0 2px rgba(43,90,72,.28)}.cell.trail:after{content:"";position:absolute;left:50%;bottom:4px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:rgba(43,90,72,.5)}.cell.finish.trail:after,.cell.topos.trail:after{display:none}.cell.topos{background:#FBF6E6 url(/topos-back.jpg) 50%/cover no-repeat;color:var(--gold);font-weight:700;cursor:help}.cell.topos.visited{background-image:linear-gradient(rgba(43,90,72,.62),rgba(43,90,72,.62)),url(/topos-back.jpg);background-size:cover;background-position:50%;color:#fff}.cell.setup{background:#E3EAE4}.cell.finish{background:#DCE9DE}.cell.here{background:var(--pine);box-shadow:0 0 0 2px var(--gold)}.token{position:absolute;top:0;left:0;z-index:3;display:flex;align-items:center;justify-content:center;font-size:17px;pointer-events:none;border-radius:4px;background:linear-gradient(160deg,#d8ab45,#b8882f);box-shadow:0 3px 7px rgba(0,0,0,.28),inset 0 0 0 1.5px rgba(255,255,255,.55);transition:transform .42s cubic-bezier(.34,1.15,.5,1);will-change:transform}@media (prefers-reduced-motion:reduce){.token{transition:none!important}}.board-progress{display:flex;flex-wrap:wrap;gap:8px 20px;margin-bottom:12px;font-family:var(--mono);font-size:12px;color:var(--ink-soft)}.board-progress span:first-child{color:var(--pine);font-weight:600}.board-legend{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:12px;font-size:11px;color:var(--muted)}.board-legend span{display:inline-flex;align-items:center;gap:6px}.board-legend .lg{width:13px;height:13px;border-radius:3px;display:inline-block}.board-legend .lg.setup{background:#E3EAE4}.board-legend .lg.topos{background:#EDE7D6}.board-legend .lg.visited{background:#D8E4D9}.board-legend .lg.here{background:var(--pine)}.board-legend .lg.finish{background:#DCE9DE}.dpad{display:grid;grid-template-columns:repeat(3,56px);grid-gap:6px;justify-content:center;margin:4px 0 8px}.dpad button{height:46px;border:1px solid var(--line);background:var(--surface);border-radius:var(--radius);font-size:18px;color:var(--pine)}.dpad button:hover:not(:disabled){background:var(--panel)}.dpad button:disabled{opacity:.3}.dpad .mid{display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--muted)}.roll-row{display:flex;gap:10px;margin-bottom:12px;flex-wrap:wrap}.btn.btn-ghost.hint{border-color:var(--gold);box-shadow:0 0 0 2px rgba(184,142,47,.18)}.roll-result{font-family:var(--mono);font-size:14px;color:var(--ink-soft);padding:8px 0;min-height:20px;line-height:1.5}.roll-result.ok{color:var(--good)}.roll-result.fail{color:#b4553a}.roll-anim{display:flex;align-items:center;gap:9px;min-height:20px;padding:8px 0}.roll-anim .die{font-size:22px;display:inline-block;animation:die-shake .5s ease-in-out infinite}.roll-anim .coin{width:20px;height:20px;border-radius:50%;background:linear-gradient(160deg,#d8ab45,#b8882f);box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.5);animation:coin-flip .6s linear infinite}.roll-anim .coin:nth-child(2){animation-delay:.12s}.roll-anim .coin:nth-child(3){animation-delay:.24s}.roll-anim-label{font-family:var(--mono);font-size:13px;color:var(--muted)}@keyframes die-shake{0%,to{transform:rotate(-12deg) scale(1)}50%{transform:rotate(12deg) scale(1.12)}}@keyframes coin-flip{0%{transform:rotateY(0deg)}to{transform:rotateY(1turn)}}@media (prefers-reduced-motion:reduce){.roll-anim .coin,.roll-anim .die{animation:none}}.topos-card{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--gold);border-radius:var(--radius);padding:16px 18px;margin-bottom:16px}.topos-illu{display:block;width:100%;max-width:200px;margin:0 auto 14px;border-radius:10px}.topos-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}.topos-card h3{font-family:var(--serif);font-size:20px;margin:0}.topos-badge{flex:none;font-family:var(--mono);font-size:11px;padding:3px 9px;border-radius:999px;background:var(--panel);color:var(--ink-soft);white-space:nowrap}.topos-badge.coins{background:#F2ECD8;color:var(--gold)}.topos-badge.dice{background:#E6EAF2;color:#445}.topos-badge.none{background:#E3EAE4;color:var(--pine)}.topos-step{margin-top:14px;padding-top:12px;border-top:1px dashed var(--line)}.pending-msg{font-size:14px;line-height:1.5;margin:4px 0 10px}.pending-msg.ok{color:var(--good)}.pending-msg.fail{color:#b4553a}.pending-note{font-size:12.5px;color:var(--muted);margin:-4px 0 10px}.pending-hint{font-size:13px;color:var(--ink-soft);margin:6px 0 10px;line-height:1.5}.move-btn{display:inline-flex;align-items:center;gap:8px}.move-choices{display:flex;flex-wrap:wrap;gap:8px}.cell.tp-target{cursor:pointer;background-image:linear-gradient(rgba(216,171,69,.35),rgba(216,171,69,.35)),url(/topos-back.jpg);box-shadow:inset 0 0 0 2px var(--gold);animation:tp-pulse 1.1s ease-in-out infinite}@keyframes tp-pulse{0%,to{box-shadow:inset 0 0 0 2px var(--gold)}50%{box-shadow:inset 0 0 0 3px var(--gold),0 0 8px rgba(216,171,69,.6)}}@media (prefers-reduced-motion:reduce){.cell.tp-target{animation:none}}.topos-instr{margin-top:10px;padding:10px 12px;background:var(--panel);border-radius:8px;font-size:13px;color:var(--ink)}.topos-tip{margin-top:12px;padding-top:10px;border-top:1px dashed var(--line);font-size:12px}.dpad-hint,.topos-tip{color:var(--muted);line-height:1.5}.dpad-hint{text-align:center;font-size:11px;margin:0 0 14px}.topos-card p{margin:0;color:var(--ink-soft);font-size:14px;white-space:pre-wrap;max-height:220px;overflow-y:auto}.finish-banner{background:var(--good-bg);color:var(--good);border-radius:var(--radius);padding:16px 18px;font-weight:600;margin-bottom:16px;text-align:center}.stuck-hint{display:flex;align-items:center;gap:14px;flex-wrap:wrap;background:#F2ECD8;border:1px solid rgba(216,171,69,.5);border-left:3px solid var(--gold);border-radius:var(--radius);padding:14px 16px;margin-bottom:16px}.stuck-hint-text{flex:1 1;min-width:220px;font-size:13.5px;color:var(--ink);line-height:1.5}.stuck-hint-actions{display:flex;gap:8px;flex:none}.game-list{display:flex;flex-direction:column;gap:10px}.game-item{display:flex;align-items:center;gap:14px;background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--gold);border-radius:var(--radius);padding:14px 16px}.game-item.done{border-left-color:var(--good);opacity:.92}.game-item-main{flex:1 1;min-width:0}.game-item-goal{font-family:var(--serif);font-size:16px;color:var(--ink);margin-bottom:3px;overflow-wrap:anywhere}.game-item-meta{font-size:12.5px;color:var(--muted)}.game-progress{color:var(--gold);font-weight:600}.game-item .btn{flex:none}.btn-danger{color:#b4553a;border-color:rgba(180,85,58,.4)}.btn-danger:hover:not(:disabled){background:rgba(180,85,58,.08)}.game-item.abandoned{border-left-color:var(--line);opacity:.72}.collapse{margin-top:22px}.collapse>summary{cursor:pointer;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;font-family:var(--serif);font-size:15px;color:var(--ink-soft);padding:6px 0;display:flex;align-items:center;gap:8px}.collapse>summary::-webkit-details-marker{display:none}.collapse>summary:before{content:"▸";color:var(--muted);transition:transform .15s}.collapse[open]>summary:before{transform:rotate(90deg)}.chat-box{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px}.chat-messages{display:flex;flex-direction:column;gap:10px;max-height:320px;overflow-y:auto;margin-bottom:14px}.chat-hint{margin:0;color:var(--muted);font-size:13.5px}.chat-msg{max-width:78%;padding:10px 14px;border-radius:12px;font-size:14.5px;line-height:1.5;white-space:pre-wrap}.chat-msg.user{align-self:flex-end;background:var(--pine);color:#EDEFEA;border-bottom-right-radius:4px}.chat-msg.assistant{align-self:flex-start;background:var(--panel);color:var(--ink);border-bottom-left-radius:4px}.chat-typing{color:var(--muted);font-style:italic}.insights-box{background:#F3EFE3;border:1px solid #e3d9bd;border-left:3px solid var(--gold);border-radius:var(--radius);padding:18px 22px;font-size:14.5px;line-height:1.6;white-space:pre-wrap}@media print{.no-print,.sidebar{display:none!important}.shell{display:block}.main{padding:0;max-width:100%}.logbox,body{background:#fff}.logbox{max-height:none;overflow:visible;color:var(--ink);border:1px solid var(--line)}}@media (max-width:760px){.play-grid,.shell{grid-template-columns:1fr}.sidebar{position:static;height:auto;align-items:center;flex-wrap:wrap}.nav,.sidebar{flex-direction:row}.nav{margin-top:0}.sidebar .foot{margin:0 0 0 auto;border:none;padding:0}.main{padding:24px 18px 60px}.detail-grid{grid-template-columns:1fr}}