:root{--bg: #14110f;--surface: #1d1916;--surface-2: #272220;--border: #3a322d;--text: #ece5dc;--muted: #9b8f84;--accent: #c8952f;--accent-text: #14110f;--danger: #d2645a;--ok: #7fa86a;--discord: #5865f2;color-scheme:dark;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;color:var(--text);background:var(--bg)}*{box-sizing:border-box}body{margin:0;min-height:100dvh;background:radial-gradient(ellipse at top,#241d18 0%,transparent 60%),var(--bg)}h1,h2{margin:0;font-weight:600}.auth-shell{min-height:100dvh;display:grid;place-items:center;padding:1.5rem}.auth-card{width:100%;max-width:22rem;background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:2rem}.brand{font-size:1.75rem;letter-spacing:.02em;color:var(--accent)}.brand-sm{font-size:1.15rem}.brand-sub{color:var(--muted);font-size:.875rem;margin:.35rem 0 1.5rem}.stack{display:flex;flex-direction:column;gap:.85rem}.row{display:flex;gap:.5rem}.row input{flex:1}.field{display:flex;flex-direction:column;gap:.3rem;font-size:.8rem;color:var(--muted)}input{width:100%;padding:.6rem .7rem;background:var(--surface-2);border:1px solid var(--border);border-radius:7px;color:var(--text);font-size:.95rem;font-family:inherit}input:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-color:transparent}.btn{padding:.6rem .9rem;border:1px solid transparent;border-radius:7px;font-size:.9rem;font-family:inherit;font-weight:500;cursor:pointer;white-space:nowrap}.btn:disabled{opacity:.55;cursor:default}.btn-primary{background:var(--accent);color:var(--accent-text)}.btn-primary:hover:not(:disabled){filter:brightness(1.1)}.btn-ghost{background:transparent;border-color:var(--border);color:var(--muted)}.btn-ghost:hover{color:var(--text)}.btn-discord{width:100%;background:var(--discord);color:#fff}.link{background:none;border:none;padding:0;color:var(--accent);font:inherit;cursor:pointer;text-decoration:underline}.divider{display:flex;align-items:center;gap:.75rem;margin:1.25rem 0;color:var(--muted);font-size:.75rem}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--border)}.switch{margin:1.25rem 0 0;font-size:.85rem;color:var(--muted);text-align:center}.msg{margin:0;font-size:.85rem;padding:.5rem .65rem;border-radius:6px}.msg-error{color:var(--danger);background:color-mix(in srgb,var(--danger) 12%,transparent)}.msg-ok{color:var(--ok);background:color-mix(in srgb,var(--ok) 12%,transparent)}.msg-warn{color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.dc-warnings{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem}.dc-drop{border:1px dashed var(--border);border-radius:8px;padding:1rem;cursor:pointer;text-align:center}.dc-drop:hover{border-color:var(--accent)}.muted{color:var(--muted);font-size:.875rem}.app-shell{min-height:100dvh}.topbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.85rem 1.25rem;border-bottom:1px solid var(--border);background:var(--surface)}.topbar-right{display:flex;align-items:center;gap:.85rem}.content{max-width:46rem;margin:0 auto;padding:1.75rem 1.25rem;display:flex;flex-direction:column;gap:1.25rem}.panel{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:1.25rem}.panel h2{font-size:1rem;margin-bottom:.85rem}.campaign-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}.campaign-item{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.75rem .9rem;background:var(--surface-2);border:1px solid var(--border);border-radius:8px}.campaign-item p{margin:.2rem 0 0}.badge{font-size:.7rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:.2rem .5rem;border-radius:999px}.badge-dm{background:var(--accent);color:var(--accent-text)}.badge-player{background:var(--surface);border:1px solid var(--border);color:var(--muted)}.topbar-left{display:flex;align-items:center;gap:.85rem}.back{text-decoration:none;font-size:.85rem}a.campaign-item{text-decoration:none;color:inherit}a.campaign-item:hover{border-color:var(--accent)}.row-top{margin-top:.85rem}.invite-result{margin-top:.85rem;display:flex;flex-direction:column;gap:.5rem}.invite-result input{font-family:ui-monospace,monospace;font-size:.8rem}.roster{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4rem}.roster-item{display:flex;align-items:center;justify-content:space-between;padding:.55rem .75rem;background:var(--surface-2);border-radius:7px}.character-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(9.5rem,1fr));gap:.85rem}.character-card{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.85rem;background:var(--surface-2);border:1px solid var(--border);border-radius:9px;text-align:center}.portrait{width:5rem;height:5rem;border-radius:50%;object-fit:cover;border:2px solid var(--border)}.portrait-empty{display:grid;place-items:center;background:var(--surface);color:var(--accent);font-size:1.75rem;font-weight:600}.character-name{font-size:.95rem;overflow-wrap:anywhere}.character-actions .btn{padding:.3rem .5rem;font-size:.75rem}.btn-ghost.danger:hover{color:var(--danger);border-color:var(--danger)}.character-form{margin-top:1.25rem;padding-top:1.25rem;border-top:1px solid var(--border)}.character-form h3{margin:0;font-size:.9rem;font-weight:600}input[type=file]{padding:.45rem;font-size:.8rem}.play-shell{height:100dvh;display:flex;flex-direction:column}.play-body{flex:1;display:flex;min-height:0}.board{flex:1;position:relative;min-width:0;background:#0d0b0a}.centred{position:absolute;inset:0;display:grid;place-items:center;margin:0;text-align:center;padding:1rem}.viewport{position:absolute;inset:0;overflow:hidden}.viewport-surface{position:absolute;inset:0;cursor:grab;touch-action:none}.viewport-surface:active{cursor:grabbing}.map-layer{position:absolute;top:0;left:0;transform-origin:0 0;will-change:transform}.map-layer img{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.map-placeholder{width:100%;height:100%;background:var(--surface-2)}.grid-overlay{position:absolute;inset:0;pointer-events:none;background-image:linear-gradient(to right,rgba(255,255,255,.22) 1px,transparent 1px),linear-gradient(to bottom,rgba(255,255,255,.22) 1px,transparent 1px)}.bestiary-list{list-style:none;margin:0;padding:0;max-height:14rem;overflow-y:auto;border:1px solid var(--border, #2c2e35);border-radius:8px}.bestiary-row{display:flex;justify-content:space-between;align-items:baseline;gap:.5rem;width:100%;padding:.35rem .6rem;background:none;border:0;color:inherit;text-align:left;cursor:pointer;font:inherit}.bestiary-row:hover,.bestiary-row:focus-visible{background:var(--surface-2, #22242b)}.bestiary-meta{color:var(--muted, #8b8d96);font-size:.75rem;white-space:nowrap;font-variant-numeric:tabular-nums}.bestiary-icon{flex-shrink:0;font-size:1.4rem;line-height:1}.bestiary-chosen{justify-content:space-between;align-items:center;gap:.5rem}.bestiary-licence,.source-credits{font-size:.7rem;line-height:1.4}.source-list{list-style:none;margin:.35rem 0 0;padding:0;display:flex;flex-direction:column;gap:.25rem;max-height:12rem;overflow-y:auto;color:var(--muted, #8b8d96)}.statblock{border:1px solid var(--border, #2c2e35);border-radius:8px;overflow:hidden}.sb-toggle{width:100%;text-align:left;border:0;border-radius:0}.sb-body{padding:.5rem .65rem;font-size:.8rem;line-height:1.45;border-top:1px solid var(--border, #2c2e35);max-height:22rem;overflow-y:auto}.sb-art{display:block;width:100%;max-height:20rem;object-fit:contain;border-radius:6px;margin-bottom:.5rem;background:var(--surface-2, #22242b)}.sb-art-icon{height:6rem;display:grid;place-items:center;font-size:4rem}.sb-line{margin:0 0 .35rem}.sb-abilities{display:grid;grid-template-columns:repeat(6,1fr);gap:.25rem;margin:.5rem 0;text-align:center}.sb-ability{display:flex;flex-direction:column;background:var(--surface-2, #22242b);border-radius:5px;padding:.25rem 0;font-size:.72rem}.sb-ability-label{color:var(--muted, #8b8d96);font-weight:600}.sb-meta p,.sb-section p{margin:0 0 .35rem}.sb-section h4{margin:.6rem 0 .3rem;font-size:.8rem;color:var(--accent, #c8952f);border-bottom:1px solid var(--border, #2c2e35);padding-bottom:.15rem}.template-layer{position:absolute;inset:0;pointer-events:none;overflow:visible}.template circle,.template polygon{fill:currentColor;fill-opacity:.22;stroke:currentColor;stroke-opacity:.9;pointer-events:stroke}.template-layer-static,.template-layer-static circle,.template-layer-static polygon{pointer-events:none}.template-inactive circle,.template-inactive polygon{pointer-events:none}.template-editable circle,.template-editable polygon{cursor:move;pointer-events:all}.template-selected circle,.template-selected polygon{fill-opacity:.32;stroke-dasharray:6 4}.template-hidden circle,.template-hidden polygon{fill-opacity:.08;stroke-opacity:.5;stroke-dasharray:4 4}.template-handle{fill:var(--surface, #17181c);fill-opacity:1;stroke:currentColor;stroke-opacity:1;cursor:grab}circle.template-handle{pointer-events:all}.template-readout{fill:var(--text, #e8e6e3);paint-order:stroke;stroke:#000000bf;stroke-width:3px;pointer-events:none;-webkit-user-select:none;user-select:none}.layer-toggles{display:flex;flex-direction:column;gap:.4rem}.wizard-overlay{position:fixed;inset:0;z-index:20;display:grid;place-items:center;padding:1rem;background:#0009}.wizard-card{width:100%;max-width:30rem;max-height:90dvh;display:flex;flex-direction:column;background:var(--surface, #17181c);border:1px solid var(--border, #2c2e35);border-radius:12px;overflow:hidden}.wizard-steps{display:flex;flex-wrap:wrap;gap:.25rem;padding:.75rem 1rem;border-bottom:1px solid var(--border, #2c2e35);font-size:.72rem}.wizard-step{color:var(--muted, #8b8d96);padding:.1rem .4rem;border-radius:999px}.wizard-step.on{background:var(--accent, #c8952f);color:var(--accent-text, #14110f);font-weight:600}.wizard-step.done{color:var(--ok, #7fa86a)}.wizard-body{padding:1rem;overflow-y:auto;flex:1}.wizard-nav{display:flex;justify-content:space-between;padding:.75rem 1rem;border-top:1px solid var(--border, #2c2e35)}.sheet-shell{min-height:100dvh}.sheet-rollbar{gap:.75rem}.sheet-save{font-size:.75rem;min-width:3.5rem}.roll-banner{padding:.6rem 1.25rem;background:var(--surface-2, #22242b);border-bottom:1px solid var(--border, #2c2e35);font-variant-numeric:tabular-nums}.roll-banner.crit{background:color-mix(in srgb,var(--ok, #7fa86a) 22%,transparent)}.roll-banner.fumble{background:color-mix(in srgb,var(--danger, #d2645a) 22%,transparent)}.sheet-body{display:grid;grid-template-columns:1fr 18rem;gap:1rem;padding:1rem;max-width:68rem;margin:0 auto}@media(max-width:52rem){.sheet-body{grid-template-columns:1fr}}.sheet-main{display:flex;flex-direction:column;gap:1rem}.sheet-id-fields{display:flex;flex-wrap:wrap;gap:.75rem;align-items:flex-end}.sheet-narrow{max-width:6rem}.stat-tiles{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.75rem}.stat-tile{flex:1;min-width:4.5rem;display:flex;flex-direction:column;align-items:center;gap:.15rem;padding:.5rem;background:var(--surface-2, #22242b);border:1px solid var(--border, #2c2e35);border-radius:8px}.stat-roll{cursor:pointer;font:inherit;color:inherit}.stat-roll:hover{border-color:var(--accent, #c8952f)}.stat-label{font-size:.68rem;color:var(--muted, #8b8d96);text-transform:uppercase;letter-spacing:.03em}.stat-value{font-size:1.2rem;font-weight:600;font-variant-numeric:tabular-nums}.sheet-hp{display:flex;align-items:flex-end;gap:.5rem}.sheet-hp-sep{padding-bottom:.5rem;color:var(--muted, #8b8d96)}.sheet-columns{display:grid;grid-template-columns:1fr 1fr;gap:1rem}@media(max-width:40rem){.sheet-columns{grid-template-columns:1fr}}.ability-row,.skill-row{display:flex;align-items:center;gap:.4rem;padding:.2rem 0}.ability-name{flex:1;font-size:.85rem}.ability-score{width:3rem;text-align:center}.save-prof{margin:0}.skill-name{flex:1;font-size:.82rem}.skill-prof{background:none;border:0;color:var(--accent, #c8952f);cursor:pointer;font-size:.9rem;padding:0 .2rem}.pill{min-width:2.4rem;padding:.15rem .45rem;border:1px solid var(--border, #2c2e35);border-radius:999px;background:var(--surface-2, #22242b);color:var(--text, #e8e6e3);cursor:pointer;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}.pill:hover{border-color:var(--accent, #c8952f)}.gear-list{list-style:none;margin:.5rem 0;padding:0;display:flex;flex-direction:column;gap:.3rem}.gear-row{display:flex;align-items:center;gap:.5rem}.gear-effect{flex:1;font-size:.72rem}.gear-add{display:flex;flex-wrap:wrap;gap:.35rem;align-items:center}.gear-add input,.gear-add select{width:auto}.gear-value{width:4rem}.sheet-log{align-self:start;position:sticky;top:1rem;max-height:calc(100dvh - 2rem);overflow-y:auto}.roll-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.roll-entry{display:flex;align-items:baseline;gap:.5rem}.roll-total{font-weight:700;font-variant-numeric:tabular-nums;min-width:1.6rem;text-align:right}.roll-label{flex:1;font-size:.82rem}.roll-detail{font-size:.7rem;white-space:nowrap}.builder-pickers{display:flex;flex-wrap:wrap;gap:.75rem}.builder-pickers .field{min-width:9rem}.slot-grid{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.75rem}.slot-cell{display:flex;align-items:center;gap:.3rem;padding:.25rem .4rem;background:var(--surface-2, #22242b);border-radius:6px}.slot-lvl{font-size:.7rem;font-weight:600;color:var(--muted, #8b8d96)}.slot-max{width:2.6rem;padding:.15rem .3rem}.slot-pips{display:inline-flex;gap:.15rem}.slot-pip{width:.85rem;height:.85rem;border-radius:50%;border:1px solid var(--accent, #c8952f);background:transparent;cursor:pointer;padding:0}.slot-pip.on{background:var(--accent, #c8952f)}.spell-group h4{margin:.6rem 0 .3rem;font-size:.8rem;color:var(--accent, #c8952f);border-bottom:1px solid var(--border, #2c2e35);padding-bottom:.15rem}.spell-row{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap;padding:.15rem 0}.spell-name{flex:1;text-align:left;background:none;border:0;color:var(--text, #e8e6e3);cursor:pointer;font:inherit;font-size:.85rem}.spell-name:hover{color:var(--accent, #c8952f)}.spell-detail{flex-basis:100%;font-size:.8rem;line-height:1.45;padding:.35rem .5rem;background:var(--surface-2, #22242b);border-radius:6px}.spell-detail p{margin:0 0 .4rem}.drop-zone{border:2px dashed var(--border, #2c2e35);border-radius:10px;padding:1.25rem 1rem;text-align:center;color:var(--muted, #8b8d96);font-size:.85rem;cursor:pointer}.drop-zone:hover,.drop-zone.dragging{border-color:var(--accent, #c8952f);color:var(--text, #e8e6e3);background:color-mix(in srgb,var(--accent, #c8952f) 8%,transparent)}.upload-queue{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.upload-item{display:flex;align-items:center;gap:.4rem}.upload-item input{flex:1}.upload-status{font-size:.75rem;min-width:1.2rem;text-align:center;color:var(--muted, #8b8d96)}.upload-done .upload-status{color:var(--ok, #7fa86a)}.upload-error .upload-status{color:var(--danger, #d2645a);min-width:auto;font-size:.7rem}.map-built-base{background:radial-gradient(circle at 30% 30%,#35442c 0%,transparent 60%),#2f3d28}.mapobject-layer{position:absolute;inset:0;pointer-events:none;overflow:visible}.mapobject-prop{-webkit-user-select:none;user-select:none;paint-order:stroke}.mapobject-surface{position:absolute;cursor:crosshair;touch-action:none}.mapobject-surface.mapobject-erasing{cursor:cell}.builder-heading{margin:0 0 .35rem;font-size:.75rem}.builder-tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:.35rem}.builder-tile{height:2.2rem;border:2px solid transparent;border-radius:6px;cursor:pointer;display:flex;align-items:flex-end;justify-content:center;padding:.15rem}.builder-tile.on{border-color:var(--accent, #c8952f)}.builder-tile-label{font-size:.65rem;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.9)}.builder-props{display:grid;grid-template-columns:repeat(6,1fr);gap:.3rem}.builder-prop{aspect-ratio:1;font-size:1.3rem;line-height:1;background:var(--surface-2, #22242b);border:2px solid transparent;border-radius:6px;cursor:pointer;display:grid;place-items:center}.builder-prop.on{border-color:var(--accent, #c8952f)}.annotation-layer{position:absolute;inset:0;pointer-events:none;overflow:visible}.annotation-pen{fill:none;stroke-linejoin:round;stroke-linecap:round}.annotation-live{opacity:.7;stroke-dasharray:2 6}.annotation-marker circle{stroke:#0009}.annotation-label{fill:var(--text, #e8e6e3);paint-order:stroke;stroke:#000000bf;stroke-width:3px;-webkit-user-select:none;user-select:none}.annotation-erasing .annotation-pen,.annotation-erasing .annotation-marker{pointer-events:auto;cursor:pointer}.annotation-surface{position:absolute;touch-action:none}.annotation-pen{cursor:crosshair}.annotation-marker{cursor:copy}.annotation-hint{position:absolute;top:.5rem;left:.5rem;padding:.2rem .5rem;border-radius:6px;background:color-mix(in srgb,var(--surface, #17181c) 85%,transparent);font-size:.75rem;pointer-events:none}.template-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.25rem}.template-row{display:flex;align-items:baseline;gap:.5rem;width:100%;padding:.35rem .5rem;background:none;border:1px solid transparent;border-radius:6px;color:inherit;text-align:left;cursor:pointer;font:inherit}.template-row:hover{background:var(--surface-2, #22242b)}.template-row.on{border-color:var(--accent, #c8952f);background:var(--surface-2, #22242b)}.template-swatch{flex-shrink:0;width:.7rem;height:.7rem;border-radius:50%;align-self:center}.template-row-name{flex:1}.template-row-meta{color:var(--muted, #8b8d96);font-size:.75rem;white-space:nowrap}.table-shell{position:fixed;inset:0;background:#000;overflow:hidden;cursor:none}.table-shell .centred{display:flex;align-items:center;justify-content:center;height:100%;font-size:1.5rem}.table-status{position:absolute;z-index:2;top:1rem;left:1rem;display:flex;align-items:center;gap:.5rem;padding:.4rem .8rem;border-radius:999px;background:color-mix(in srgb,var(--surface, #17181c) 85%,transparent);border:1px solid var(--border, #2c2e35);font-size:.9rem}.viewport-static{cursor:none}.fog-canvas{position:absolute;pointer-events:none;image-rendering:crisp-edges;image-rendering:pixelated}.fog-surface{position:absolute;cursor:crosshair;touch-action:none}.fog-marquee{position:absolute;border-style:dashed;border-color:var(--accent, #c8952f);background:color-mix(in srgb,var(--accent, #c8952f) 12%,transparent)}.fog-marquee-hide{border-color:#7aa2ff;background:color-mix(in srgb,#7aa2ff 12%,transparent)}.fog-outline{position:absolute;inset:0;overflow:visible;pointer-events:none}.fog-outline polygon{fill:color-mix(in srgb,var(--accent, #c8952f) 12%,transparent);stroke:var(--accent, #c8952f)}.fog-outline circle{fill:var(--surface, #17181c);stroke:var(--accent, #c8952f)}.fog-outline circle.fog-vertex-first{fill:var(--accent, #c8952f)}.fog-outline-hide polygon{fill:color-mix(in srgb,#7aa2ff 12%,transparent);stroke:#7aa2ff}.fog-outline-hide circle{stroke:#7aa2ff}.fog-outline-hide circle.fog-vertex-first{fill:#7aa2ff}.fog-tools{display:flex;flex-wrap:wrap;gap:.35rem}.fog-tools .btn.on{border-color:var(--accent, #c8952f);color:var(--accent, #c8952f)}.viewport-controls{position:absolute;right:.75rem;bottom:.75rem;display:flex;align-items:center;gap:.35rem;padding:.35rem;background:color-mix(in srgb,var(--surface) 85%,transparent);border:1px solid var(--border);border-radius:8px}.viewport-controls .btn{padding:.3rem .55rem}.zoom-readout{font-size:.75rem;color:var(--muted);min-width:3rem;text-align:right;font-variant-numeric:tabular-nums}.dm-panel{width:20rem;flex-shrink:0;overflow-y:auto;padding:1rem;background:var(--surface);border-left:1px solid var(--border);display:flex;flex-direction:column;gap:1.5rem}.dm-panel h2{font-size:.9rem;margin-bottom:.6rem}.map-list{list-style:none;margin:0 0 .6rem;padding:0;display:flex;flex-direction:column;gap:.3rem}.map-choice{width:100%;text-align:left;padding:.5rem .65rem;background:var(--surface-2);border:1px solid var(--border);border-radius:7px;color:var(--text);font:inherit;font-size:.85rem;cursor:pointer}.map-choice:hover{border-color:var(--accent)}.map-choice.open{border-color:var(--accent);background:var(--surface)}.scene-row{display:flex;gap:.3rem;align-items:stretch}.scene-row .map-choice{display:flex;align-items:center;justify-content:space-between;gap:.5rem;width:auto;flex:1;min-width:0}.scene-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.scene-flag{flex-shrink:0;font-size:.65rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:.1rem .35rem;border-radius:999px;background:var(--accent);color:var(--accent-text)}.scene-show{flex-shrink:0;padding:.5rem .6rem;font-size:.75rem}.prep-banner{position:absolute;top:.75rem;left:50%;transform:translate(-50%);z-index:5;display:flex;align-items:center;gap:.75rem;max-width:calc(100% - 1.5rem);padding:.5rem .75rem;font-size:.85rem;color:var(--text);background:color-mix(in srgb,var(--surface) 92%,transparent);border:1px solid var(--accent);border-radius:8px;box-shadow:0 4px 16px #00000073}.prep-banner .btn{padding:.3rem .6rem;font-size:.78rem}.prep-show{flex-shrink:0}.calibrate-row{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.toggle{display:flex;align-items:center;gap:.35rem;font-size:.85rem;color:var(--muted);cursor:pointer}.toggle input{width:auto}.live-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}.live-live{background:var(--ok)}.live-connecting{background:var(--accent)}.live-error{background:var(--danger)}.token{position:absolute;display:grid;place-items:center;border-radius:50%;border:2px solid var(--accent);background:color-mix(in srgb,var(--surface) 80%,transparent);overflow:visible;-webkit-user-select:none;user-select:none;touch-action:none;box-shadow:0 2px 8px #00000080}.token img{width:100%;height:100%;border-radius:50%;object-fit:cover;pointer-events:none}.token-initial{font-weight:700;font-size:calc(1rem / var(--token-scale, 1) * .5);pointer-events:none;text-transform:uppercase}.token-icon{font-size:calc(1rem / var(--token-scale, 1) * .95);line-height:1;pointer-events:none;-webkit-user-select:none;user-select:none}.token-draggable{cursor:grab}.token-draggable:active{cursor:grabbing}.token-hidden{opacity:.45;border-style:dashed}.token-selected{outline:calc(2px * var(--token-scale, 1)) solid var(--text);outline-offset:calc(2px * var(--token-scale, 1))}.token-label{position:absolute;top:100%;left:50%;transform:translate(-50%,2px) scale(var(--token-scale, 1));transform-origin:top center;white-space:nowrap;font-size:.75rem;padding:.1rem .35rem;border-radius:4px;background:color-mix(in srgb,var(--bg) 80%,transparent);color:var(--text);pointer-events:none}.token-conditions{position:absolute;bottom:100%;left:50%;transform:translate(-50%,-2px) scale(var(--token-scale, 1));transform-origin:bottom center;display:flex;gap:.15rem;pointer-events:none}.token-condition{font-size:.6rem;font-weight:700;letter-spacing:.02em;padding:.05rem .2rem;border-radius:3px;background:var(--danger, #d2645a);color:#fff}.token-statuses{position:absolute;top:100%;left:50%;transform:translate(-50%,2px) scale(var(--token-scale, 1));transform-origin:top center;display:flex;flex-wrap:wrap;justify-content:center;gap:.15rem;max-width:8rem;pointer-events:none}.token-status{font-size:.6rem;font-weight:700;letter-spacing:.02em;padding:.05rem .25rem;border-radius:3px;background:var(--accent, #c8952f);color:var(--accent-text, #14110f);white-space:nowrap}.condition-chips{display:flex;flex-wrap:wrap;gap:.3rem;margin-bottom:.35rem}.condition-chip{font-size:.72rem;padding:.15rem .4rem;border-radius:999px;border:1px solid var(--danger, #d2645a);background:color-mix(in srgb,var(--danger, #d2645a) 15%,transparent);color:var(--text, #e8e6e3);cursor:pointer}.token-heading{margin:0;font-size:.85rem;font-weight:600}.token-add{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--border)}select{width:100%;padding:.5rem;background:var(--surface-2);border:1px solid var(--border);border-radius:7px;color:var(--text);font:inherit;font-size:.9rem}.swatches{display:flex;gap:.35rem}.swatch{width:1.5rem;height:1.5rem;border-radius:50%;border:2px solid transparent;cursor:pointer;padding:0}.swatch-on{border-color:var(--text)}@media(max-width:46rem){.dm-panel{position:absolute;right:0;top:0;bottom:0;z-index:10;box-shadow:-8px 0 24px #0006}}.panel-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin-bottom:.85rem}.panel-head h2{margin-bottom:0}.character-rows{list-style:none;margin:.85rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}.character-row{display:flex;align-items:center;justify-content:space-between;gap:.85rem;padding:.6rem .75rem;background:var(--surface-2);border:1px solid var(--border);border-radius:8px;flex-wrap:wrap}.character-row-main{display:flex;flex-direction:column;gap:.15rem;text-decoration:none;color:inherit;min-width:0}.character-row-main:hover strong{color:var(--accent)}.character-row-actions{display:flex;align-items:center;gap:.5rem}.character-row-actions select{width:auto;min-width:9rem}.chat-bubble{position:fixed;z-index:40;width:3.25rem;height:3.25rem;transition:left .18s ease,top .18s ease}.chat-bubble.dragging{transition:none}.chat-fab{position:absolute;inset:0;width:100%;height:100%;border-radius:50%;border:1px solid var(--border);background:var(--accent);color:var(--accent-text);font-size:1.35rem;cursor:grab;touch-action:none;box-shadow:0 8px 24px -8px #000000a6}.chat-fab:hover{filter:brightness(1.06)}.chat-fab:active{cursor:grabbing}.chat-badge{position:absolute;top:-3px;right:-3px;min-width:1.15rem;height:1.15rem;padding:0 .25rem;border-radius:999px;background:var(--danger);color:#fff;font-size:.7rem;font-weight:700;display:grid;place-items:center}.chat-panel{position:absolute;width:min(20rem,calc(100vw - 2rem));height:min(28rem,calc(100dvh - 6rem));background:var(--surface);border:1px solid var(--border);border-radius:12px;box-shadow:0 18px 48px -18px #000c;display:flex;flex-direction:column;overflow:hidden}.chat-bubble.above .chat-panel,.dice-roller.above .dice-panel{bottom:calc(100% + .6rem)}.chat-bubble.below .chat-panel,.dice-roller.below .dice-panel{top:calc(100% + .6rem)}.chat-bubble.right .chat-panel,.dice-roller.right .dice-panel{right:0}.chat-bubble.left .chat-panel,.dice-roller.left .dice-panel{left:0}.chat-head{display:flex;align-items:center;justify-content:space-between;padding:.6rem .8rem;border-bottom:1px solid var(--border);background:var(--surface-2)}.chat-x{background:none;border:none;color:var(--muted);cursor:pointer;font-size:.9rem}.chat-channels{display:flex;gap:.3rem;padding:.5rem .6rem;overflow-x:auto;border-bottom:1px solid var(--border)}.chat-channel{position:relative;white-space:nowrap;padding:.3rem .6rem;border-radius:999px;border:1px solid var(--border);background:var(--surface-2);color:var(--muted);font-size:.78rem;cursor:pointer;display:inline-flex;align-items:center;gap:.3rem}.chat-channel.on{background:var(--accent);color:var(--accent-text);border-color:transparent}.chat-tag{font-size:.6rem;font-weight:700;letter-spacing:.04em;padding:.05rem .3rem;border-radius:4px;background:color-mix(in srgb,var(--accent) 30%,transparent);color:var(--text)}.chat-channel.on .chat-tag{background:#0000002e;color:inherit}.chat-dot{width:.5rem;height:.5rem;border-radius:50%;background:var(--danger)}.chat-messages{flex:1;overflow-y:auto;padding:.65rem .7rem;display:flex;flex-direction:column;gap:.4rem}.chat-empty{margin:auto 0;text-align:center}.chat-msg{max-width:82%;align-self:flex-start;display:flex;flex-direction:column;gap:.1rem;padding:.4rem .6rem;border-radius:12px 12px 12px 3px;background:var(--surface-2);border:1px solid var(--border);font-size:.85rem;word-break:break-word}.chat-msg.mine{align-self:flex-end;border-radius:12px 12px 3px;background:color-mix(in srgb,var(--accent) 22%,var(--surface-2));border-color:color-mix(in srgb,var(--accent) 35%,var(--border))}.chat-msg-meta{display:flex;align-items:baseline;gap:.4rem}.chat-msg-who{font-size:.68rem;color:var(--muted);font-weight:600}.chat-msg-time{font-size:.62rem;color:var(--muted);opacity:.7}.chat-msg.roll{background:color-mix(in srgb,var(--accent) 14%,var(--surface-2));border-color:color-mix(in srgb,var(--accent) 30%,var(--border));font-variant-numeric:tabular-nums}.chat-msg.mine.roll{background:color-mix(in srgb,var(--accent) 26%,var(--surface-2))}.chat-input-row{display:flex;gap:.4rem;padding:.6rem;border-top:1px solid var(--border)}.chat-notice{margin:0;padding:.25rem .7rem 0;font-size:.72rem}.chat-input-row textarea{flex:1;padding:.5rem .6rem;background:var(--surface-2);border:1px solid var(--border);border-radius:7px;color:var(--text);font:inherit;font-size:.9rem;resize:none;min-height:2.25rem;max-height:6rem;line-height:1.3}.chat-input-row textarea:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-color:transparent}.chat-kind{font-size:.55rem;font-weight:700;letter-spacing:.05em;padding:.03rem .28rem;border-radius:4px;background:color-mix(in srgb,var(--muted) 22%,transparent);color:var(--muted)}.chat-msg.ic{border-left:2px solid color-mix(in srgb,var(--accent) 60%,transparent)}.chat-msg.ic .chat-msg-body{font-style:italic}.chat-msg.ic .chat-kind{background:color-mix(in srgb,var(--accent) 26%,transparent);color:var(--text)}.chat-del{background:none;border:none;padding:0;color:var(--muted);cursor:pointer;font-size:.62rem;opacity:0}.chat-msg:hover .chat-del{opacity:.75}.chat-del:hover{color:var(--danger);opacity:1}.chat-compose-tools{display:flex;align-items:center;gap:.5rem;padding:.4rem .7rem 0}.chat-mode{font-size:.62rem;font-weight:700;letter-spacing:.05em;padding:.15rem .45rem;border-radius:999px;border:1px solid var(--border);background:var(--surface-2);color:var(--muted);cursor:pointer}.chat-mode.ic{background:color-mix(in srgb,var(--accent) 22%,transparent);border-color:color-mix(in srgb,var(--accent) 40%,transparent);color:var(--text)}.dice-roller{position:fixed;z-index:40;width:3.25rem;height:3.25rem;transition:left .18s ease,top .18s ease}.dice-roller.dragging{transition:none}.dice-fab{position:absolute;inset:0;width:100%;height:100%;border-radius:50%;border:1px solid var(--border);background:var(--surface-2);color:var(--text);font-size:1.4rem;cursor:grab;touch-action:none;box-shadow:0 8px 24px -8px #000000a6}.dice-fab:hover{filter:brightness(1.1);border-color:var(--accent)}.dice-fab:active{cursor:grabbing}.dice-panel{position:absolute;width:min(17rem,calc(100vw - 2rem));background:var(--surface);border:1px solid var(--border);border-radius:12px;box-shadow:0 18px 48px -18px #000c;display:flex;flex-direction:column;gap:.55rem;padding-bottom:.7rem;overflow:hidden}.dice-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.4rem;padding:.6rem .7rem 0}.dice-btn{position:relative;padding:.45rem 0;border-radius:8px;border:1px solid var(--border);background:var(--surface-2);color:var(--text);font-size:.8rem;font-weight:600;cursor:pointer}.dice-btn:hover{border-color:var(--accent)}.dice-count{position:absolute;top:-6px;right:-6px;min-width:1.1rem;height:1.1rem;border-radius:999px;background:var(--accent);color:var(--accent-text);font-size:.66rem;font-weight:700;display:grid;place-items:center}.dice-expr{display:flex;flex-wrap:wrap;gap:.3rem;padding:0 .7rem;min-height:1.4rem;align-items:center}.dice-chip{padding:.15rem .45rem;border-radius:999px;border:1px solid color-mix(in srgb,var(--accent) 40%,var(--border));background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--text);font-size:.72rem;cursor:pointer}.dice-mod{display:flex;align-items:center;gap:.5rem;padding:0 .7rem}.dice-step{width:1.6rem;height:1.6rem;border-radius:6px;border:1px solid var(--border);background:var(--surface-2);color:var(--text);cursor:pointer;font-size:1rem;line-height:1}.dice-mod-val{font-variant-numeric:tabular-nums;min-width:2rem;text-align:center;font-weight:600}.dice-share{padding:0 .7rem;font-size:.8rem}.dice-actions{display:flex;gap:.5rem;padding:.2rem .7rem 0}.dice-actions .btn{flex:1}.dice-result{margin:.1rem .7rem 0;padding:.45rem .55rem;border-radius:8px;background:color-mix(in srgb,var(--accent) 14%,var(--surface-2));border:1px solid color-mix(in srgb,var(--accent) 30%,var(--border));font-size:.8rem;font-variant-numeric:tabular-nums;word-break:break-word}.tpl-create{margin-bottom:1rem}.tpl-effects{gap:.4rem}.tpl-effect{display:flex;gap:.35rem;align-items:center;flex-wrap:wrap}.tpl-effect select,.tpl-effect input{width:auto;flex:1;min-width:4.5rem}.tpl-num{max-width:4rem;flex:0 0 auto}.tpl-narrow{max-width:5rem}.tpl-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}.tpl-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap;padding:.6rem .75rem;background:var(--surface-2);border:1px solid var(--border);border-radius:8px}.tpl-row-main{display:flex;flex-direction:column;gap:.15rem;min-width:0}.tpl-row-actions{display:flex;align-items:center;gap:.5rem}.tpl-row-actions select{width:auto;min-width:8rem}.conditions{margin:.5rem 0 .85rem}.cond-head{display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:.4rem}.cond-toggles{display:flex;flex-wrap:wrap;gap:.4rem}.cond-toggle{display:inline-flex;align-items:center;gap:.35rem;padding:.25rem .6rem;border-radius:999px;border:1px solid var(--border);background:var(--surface-2);color:var(--muted);font-size:.8rem;cursor:pointer}.cond-toggle.on{background:color-mix(in srgb,var(--accent) 20%,transparent);border-color:color-mix(in srgb,var(--accent) 45%,transparent);color:var(--text)}.gear-cond{min-width:6rem}.tpl-kind{width:auto;flex:0 0 8rem}.tpl-image-row{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap}.tpl-upload{cursor:pointer}.tpl-thumb{width:2.75rem;height:2.75rem;object-fit:cover;border-radius:8px;border:1px solid var(--border);flex:0 0 auto}.tpl-desc{font-style:italic}.gear-thumb{width:2rem;height:2rem;object-fit:cover;border-radius:6px;border:1px solid var(--border);flex:0 0 auto}.gear-desc{flex-basis:100%;font-style:italic}.statuses{margin:.5rem 0 .85rem}.status-list{list-style:none;margin:.4rem 0 0;padding:0;display:flex;flex-direction:column;gap:.4rem}.status-row{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;padding:.4rem .6rem;background:var(--surface-2);border:1px solid var(--border);border-radius:8px}.status-desc{flex-basis:100%;font-style:italic}.card-statuses{display:flex;flex-wrap:wrap;gap:.25rem;justify-content:center}.card-status{font-size:.62rem;font-weight:600;padding:.1rem .4rem;border-radius:999px;background:color-mix(in srgb,var(--accent) 20%,transparent);border:1px solid color-mix(in srgb,var(--accent) 40%,transparent);color:var(--text)}
