:root{--ink:#120e0b;--bg:#14110d;--panel:#1b1712;--parchment:#efe4c8;--parchment-bright:#f3e9d2;--text:#e8dcc0;--text-muted:#c3b491;--gold:#c8902e;--gold-frame:#a9812f;--gold-light:#ffe08a;--blood:#9b2f22;--ember:#e0603f;--frost:#a6e4ec;--teal:#3f8496;--violet:#b49ae0;--dusk:#2a2230;--border:#4a3c2a;--border-soft:#6b5a3e;--font-display:"Cinzel", serif;--font-body:"EB Garamond", Georgia, serif}body{background:var(--bg);margin:0}a{color:var(--ember)}a:hover{color:var(--gold-light)}.app{background:radial-gradient(120% 90% at 50% 0%, #241e17 0%, var(--bg) 70%);min-height:100vh;font-family:var(--font-body);color:var(--text)}.btn{font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;cursor:pointer;border:1px solid;border-radius:2px;padding:12px 20px;font-size:15px;font-weight:600}.btn--sm{padding:10px 18px;font-size:14px}.btn--primary{background:var(--blood);color:var(--parchment);border-color:var(--ember)}.btn--ghost{background:var(--panel);color:var(--gold);border-color:var(--border-soft)}.button-row{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.button-row--tight{gap:14px}.dm{flex-direction:column;gap:22px;max-width:1760px;margin:0 auto;padding:24px 22px 48px;display:flex}.dm-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:18px;display:flex}.dm-heading{flex-direction:column;gap:6px;display:flex}.eyebrow{font-family:var(--font-display);letter-spacing:.2em;text-transform:uppercase;color:var(--gold);font-size:14px}.dm-title{font-family:var(--font-display);letter-spacing:.03em;color:var(--parchment-bright);margin:0;font-size:36px;font-weight:700;line-height:1.1}.dm-body{flex-wrap:wrap;align-items:flex-start;gap:34px;display:flex}.map-col{flex-direction:column;flex:760px;gap:12px;min-width:0;display:flex}.map-frame{border:1px solid var(--gold-frame);position:relative}.map-canvas{width:100%;height:auto;image-rendering:pixelated;background:var(--ink);cursor:pointer;display:block}.map-status{font-family:var(--font-display);color:var(--text-muted);flex-wrap:wrap;align-items:center;gap:10px 24px;font-size:16px;display:flex}.map-status__hover{color:var(--gold-light);min-width:220px}.sidebar{flex-direction:column;flex:0 400px;gap:30px;min-width:300px;display:flex}.panel{background:var(--panel);border:1px solid;flex-direction:column;padding:20px 22px;display:flex}.panel--fog{border-color:var(--teal);gap:14px}.panel--rooms{border-color:var(--gold-frame);padding:16px 22px}.panel--detail{border-color:var(--blood);background:#22130f;gap:12px}.panel-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.panel-label{font-family:var(--font-display);letter-spacing:.24em;text-transform:uppercase;font-size:13px}.panel-label--fog{color:var(--frost)}.panel-label--rooms{color:var(--gold);padding-bottom:8px}.panel-count{font-family:var(--font-display);color:var(--text-muted);font-size:15px}.fog-actions{flex-wrap:wrap;gap:12px;display:flex}.btn-fog{border:1px solid var(--border);color:var(--parchment);font-family:var(--font-display);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;border-radius:2px;flex:1;padding:10px 12px;font-size:14px;font-weight:600}.btn-fog--reveal{background:#2c5866}.btn-fog--hide{background:var(--dusk)}.room-row{border-top:1px dashed #3a2f22;align-items:center;gap:10px;padding:4px 0;display:flex}.room-select{cursor:pointer;text-align:left;min-width:0;font-family:var(--font-display);color:var(--parchment);background:0 0;border:none;flex:1;align-items:center;gap:12px;padding:6px 0;font-size:16px;display:flex}.room-num{background:var(--blood);min-width:18px;height:22px;color:var(--parchment);font-family:var(--font-display);border:1px solid var(--border);flex:none;justify-content:center;align-items:center;padding:0 5px;font-size:13px;font-weight:700;display:flex}.room-num--lg{min-width:22px;height:28px;padding:0 6px;font-size:16px}.room-name{text-overflow:ellipsis;overflow:hidden}.room-marker{color:var(--gold-light)}.room-toggle{border:1px solid var(--border);width:96px;font-family:var(--font-display);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;border-radius:2px;flex:none;padding:6px 0;font-size:13px;font-weight:700}.room-toggle--open{background:var(--gold);color:var(--ink)}.room-toggle--closed{background:var(--dusk);color:var(--violet)}.detail-head{align-items:center;gap:12px;display:flex}.detail-name{font-family:var(--font-display);color:var(--parchment);font-size:21px;font-weight:600}.detail-tag{font-family:var(--font-display);letter-spacing:.16em;text-transform:uppercase;color:var(--gold);font-size:12px}.detail-read,.detail-dm{font-size:18px;line-height:1.5}.detail-read{color:var(--text-muted);font-style:italic}.detail-dm{color:var(--text)}.stage{box-sizing:border-box;background:#0b0908;flex-direction:column;justify-content:center;align-items:center;gap:14px;min-height:100vh;padding:14px;display:flex}.player-bar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;width:100%;max-width:1600px;display:flex}.player-title{font-family:var(--font-display);letter-spacing:.04em;color:var(--parchment-bright);font-size:24px;font-weight:700}.player-canvas{width:auto;max-width:100%;height:auto;max-height:calc(100vh - 100px);image-rendering:pixelated;background:var(--ink);box-shadow:0 0 0 1px var(--gold-frame), 0 24px 60px #0009;display:block}.stage--fullscreen .player-canvas{max-height:100vh;box-shadow:none}.token-layer{pointer-events:none;position:absolute;inset:0;overflow:hidden}.token{aspect-ratio:1;box-sizing:border-box;background:var(--ink);box-shadow:0 3px 8px #000000a6, 0 0 0 2px var(--ink);touch-action:none;pointer-events:auto;z-index:2;border:2px solid;border-radius:50%;transition:left .18s,top .18s,transform .12s;position:absolute;overflow:hidden;transform:translate(-50%,-50%)scale(1);container-type:inline-size}.token--dragging{box-shadow:0 10px 22px #000000b3, 0 0 0 2px var(--ink);z-index:6;transition:transform .12s;transform:translate(-50%,-50%)scale(1.12)}.token-face{object-fit:cover;pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;display:block;transform:scale(1.08)}.token-face--fallback{font-family:var(--font-display);color:var(--ink);justify-content:center;align-items:center;font-size:15px;font-weight:700;display:flex;transform:none}.token .token-face--fallback{font-size:55cqw}.player-map{max-width:100%;line-height:0;position:relative}.panel--party{border-color:var(--border);gap:2px;padding:16px 22px}.panel-head--party{padding-bottom:8px}.panel-head--party .panel-label--rooms{padding-bottom:0}.link-btn{cursor:pointer;font-family:var(--font-display);letter-spacing:.12em;text-transform:uppercase;color:#8a7b5e;background:0 0;border:none;padding:0;font-size:12px}.party-row{border-top:1px dashed #3a2f22;align-items:center;gap:12px;padding:7px 0;display:flex}.party-avatar{box-sizing:border-box;border:2px solid;border-radius:50%;flex:0 0 38px;width:38px;height:38px;display:block;overflow:hidden}.party-avatar .token-face{pointer-events:auto}.party-info{flex-direction:column;gap:1px;min-width:0;display:flex}.party-name{font-family:var(--font-display);color:var(--parchment);font-size:15px;font-weight:600}.party-where{color:var(--text-muted);font-size:15px;font-style:italic}.conn{letter-spacing:.08em;margin-left:auto;font-size:14px}.conn:before{content:"●";margin-right:6px}.conn--open{color:#7fb04e}.conn--connecting{color:var(--gold)}.conn--closed{color:var(--ember)}.conn-notice{z-index:10;border:1px solid var(--ember);color:var(--parchment);line-height:1.2;font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;background:#120e0bd9;padding:8px 14px;font-size:13px;position:absolute;top:16px;right:16px}.token--foe{z-index:3;box-shadow:0 4px 12px #000000b3, 0 0 0 2px var(--ink), 0 0 20px #9b2f2299;border-width:3px;border-radius:22%}.token--hidden{opacity:.6;border-style:dashed}.token--dragging.token--foe{z-index:6;box-shadow:0 10px 22px #000000b3, 0 0 0 2px var(--ink)}.token-face--positioned{transform:none}.token-badge{background:var(--blood);min-width:18px;height:18px;color:var(--parchment);font-family:var(--font-display);border:1px solid var(--ink);box-sizing:border-box;pointer-events:none;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:12px;font-weight:700;line-height:1;display:flex;position:absolute;bottom:6%;right:6%}.panel--enemies{border-color:var(--blood);background:#22130f;gap:2px;padding:16px 22px}.panel-label--enemies{color:var(--ember);padding-bottom:8px}.enemy-type{border-top:1px dashed #3a2f22;flex-direction:column;gap:4px;padding:10px 0 6px;display:flex}.enemy-head{align-items:center;gap:12px;display:flex}.enemy-avatar{box-sizing:border-box;cursor:zoom-in;background:var(--ink);border:2px solid;border-radius:22%;flex:0 0 46px;width:46px;height:46px;padding:0;display:block;overflow:hidden}.enemy-avatar img{object-fit:cover;width:100%;height:100%;display:block}.enemy-info{flex:1}.btn-add{background:var(--panel);color:var(--ember);font-family:var(--font-display);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;border:1px solid var(--blood);border-radius:2px;padding:7px 12px;font-size:12px;font-weight:700}.enemy-row{align-items:center;gap:8px;padding:3px 0 3px 58px;display:flex}.enemy-label{min-width:0;color:var(--text-muted);flex:1;font-size:15px}.enemy-toggle{width:86px;font-family:var(--font-display);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;border:1px solid;border-radius:2px;padding:5px 0;font-size:11px;font-weight:700}.enemy-toggle--shown{background:var(--blood);color:var(--parchment);border-color:var(--ember)}.enemy-toggle--hidden{background:var(--dusk);color:var(--violet);border-color:#4a3c5a}.enemy-remove{color:#8a7b5e;cursor:pointer;background:0 0;border:1px solid #3a2f22;border-radius:2px;width:28px;height:28px;font-size:18px;line-height:1}.modal{z-index:50;box-sizing:border-box;cursor:zoom-out;background:#080605e6;justify-content:center;align-items:center;padding:28px;display:flex;position:fixed;inset:0}.modal-body{cursor:default;flex-direction:column;gap:16px;max-width:min(1280px,100%);display:flex}.modal-img{object-fit:contain;border:1px solid var(--gold-frame);max-width:100%;max-height:calc(100vh - 170px);display:block;box-shadow:0 30px 80px #000000b3}.modal-foot{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;display:flex}.modal-caption{flex-direction:column;gap:2px;display:flex}.modal-name{font-family:var(--font-display);color:var(--parchment-bright);font-size:26px;font-weight:700}.modal-sub{color:var(--text-muted);font-size:18px;font-style:italic}.btn--modal{padding:11px 18px;font-size:14px}.modal-actions{gap:12px;display:flex}
