/* Layout: the projector output is the whole viewport (a black GL canvas). Controls float over it:
   a compact top bar and a bottom sheet on phones that becomes a right-hand panel on wide screens.
   Single dark theme by design: this tool is used in the dark, next to a projector. */
:root{
  --bg:#07080b;           /* stage black with a hint of blue */
  --panel:rgba(16,18,24,.93);
  --panel-solid:#14161d;
  --raised:#1d2029;
  --line:#2b2f3a;
  --fg:#ebe8e1;           /* warm off-white */
  --muted:#8f93a0;
  --accent:#ffb020;       /* lamp amber */
  --accent-fg:#1b1200;
  --accent-dim:rgba(255,176,32,.18);
  --sel:#5dd8ff;          /* selection cyan, reads against any projected color */
  --danger:#ff5f5f;
  --ok:#5fd37f;
  --font:"Barlow",system-ui,-apple-system,"Segoe UI",sans-serif;
  --font-c:"Barlow Condensed","Barlow",system-ui,sans-serif;
  --gutter-l:max(16px,env(safe-area-inset-left,0px));
  --gutter-r:max(16px,env(safe-area-inset-right,0px));
  color-scheme:dark;
}
html,body{height:100%;margin:0;background:var(--bg);color:var(--fg);font-family:var(--font);font-size:14px;overflow:hidden;overscroll-behavior:none}
*{box-sizing:border-box}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer;border:1px solid var(--line);background:var(--raised);border-radius:8px;padding:7px 11px;line-height:1.1;touch-action:manipulation}
button:hover{border-color:#3b4050}
button:focus-visible,input:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--sel);outline-offset:1px}
button.primary{background:var(--accent);color:var(--accent-fg);border-color:transparent;font-weight:600}
button.ghost{background:transparent}
button.danger{color:var(--danger)}
button.sm{padding:5px 8px;font-size:12.5px;border-radius:6px}
button.icon{width:38px;height:38px;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:10px}
button[aria-pressed="true"],button.on{background:var(--accent-dim);border-color:var(--accent);color:var(--accent)}
button:disabled{opacity:.4;cursor:default}
svg.i{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}

#stage{position:fixed;inset:0;background:#000;touch-action:none;-webkit-user-select:none;user-select:none}
#gl{position:absolute;inset:0;width:100%;height:100%;display:block}
#overlay{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible}
#overlay polygon{fill:rgba(93,216,255,.04);stroke:rgba(255,255,255,.55);stroke-width:1.2;vector-effect:non-scaling-stroke}
#overlay polygon.sel{stroke:var(--sel);stroke-width:2;fill:rgba(93,216,255,.08)}
#overlay polygon.hidden-s{stroke-dasharray:4 4;opacity:.5}
#overlay polyline.mask{fill:rgba(255,176,32,.12);stroke:var(--accent);stroke-width:1.5;stroke-dasharray:5 3}
#overlay circle.mpt{fill:var(--accent);stroke:#000;stroke-width:1}
#overlay text{fill:#fff;font:600 11px var(--font-c);letter-spacing:.06em;paint-order:stroke;stroke:rgba(0,0,0,.8);stroke-width:3px;text-transform:uppercase}
#handles{position:absolute;inset:0;pointer-events:none}
.handle{position:absolute;width:44px;height:44px;margin:-22px 0 0 -22px;pointer-events:auto;display:flex;align-items:center;justify-content:center;cursor:grab;touch-action:none}
.handle::before{content:"";width:18px;height:18px;border-radius:50%;background:var(--sel);border:2px solid #000;box-shadow:0 0 0 2px rgba(255,255,255,.7)}
.handle.active::before{background:var(--accent);transform:scale(1.25)}
.handle span{position:absolute;top:-2px;right:-2px;font:700 10px var(--font-c);color:#000;background:#fff;border-radius:8px;padding:0 4px}
body.play #overlay,body.play #handles,body.play #topbar,body.play #sheet{display:none}
body.play #playExit{display:block}

#topbar{position:fixed;top:env(safe-area-inset-top,0px);left:0;right:0;z-index:5;display:flex;align-items:center;gap:8px;padding:8px var(--gutter-r) 8px var(--gutter-l);pointer-events:none}
#topbar>*{pointer-events:auto}
.brand{display:flex;align-items:center;gap:8px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:6px 10px 6px 8px;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}
.brand .mark{width:22px;height:22px;border-radius:6px;background:linear-gradient(135deg,var(--accent),#ff5a2c);display:grid;place-items:center;color:#1a0d00;font:700 13px var(--font-c)}
.brand b{font:600 15px var(--font-c);letter-spacing:.04em;text-transform:uppercase}
.brand small{color:var(--muted);font-size:12px;max-width:34vw;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.spacer{flex:1}
.tb{display:flex;gap:6px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:4px;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}
.tb button{border-color:transparent;background:transparent}
.tb button.primary{background:var(--accent)}

#playExit{display:none;position:fixed;top:env(safe-area-inset-top,0px);right:var(--gutter-r);z-index:9;background:rgba(0,0,0,.35);color:rgba(255,255,255,.35);border:1px solid rgba(255,255,255,.15);font:600 12px var(--font-c);letter-spacing:.08em;text-transform:uppercase;padding:8px 12px;border-radius:999px;margin-top:8px;opacity:0;transition:opacity .25s}
#playExit.show{opacity:1}

#sheet{position:fixed;left:0;right:0;bottom:0;z-index:6;background:var(--panel);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-top:1px solid var(--line);border-radius:18px 18px 0 0;display:flex;flex-direction:column;max-height:min(62vh,560px);height:46vh;transition:height .22s ease;padding-bottom:env(safe-area-inset-bottom,0px)}
#sheet.collapsed{height:54px}
#sheet.collapsed .panel{display:none}
.grip{height:14px;display:grid;place-items:center;cursor:ns-resize;touch-action:none}
.grip i{width:42px;height:4px;border-radius:2px;background:#3a3f4c}
.tabs{display:flex;gap:2px;padding:0 var(--gutter-r) 6px var(--gutter-l);overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tabs button{flex:1 0 auto;background:transparent;border:0;border-bottom:2px solid transparent;border-radius:0;padding:6px 7px;font:600 13px var(--font-c);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.tabs button.on{color:var(--accent);border-bottom-color:var(--accent);background:transparent}
.panel{flex:1;min-height:0;overflow-y:auto;padding:4px var(--gutter-r) 14px var(--gutter-l);-webkit-overflow-scrolling:touch}
.panel>section{display:none}
.panel>section.on{display:block}

.row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:8px 0}
.row.tight{margin:4px 0}
.row>label{color:var(--muted);font:600 12px var(--font-c);letter-spacing:.07em;text-transform:uppercase;min-width:66px}
.grow{flex:1;min-width:0}
.field{display:flex;align-items:center;gap:10px;margin:7px 0}
.field>label{flex:0 0 92px;color:var(--muted);font:600 12px var(--font-c);letter-spacing:.07em;text-transform:uppercase}
.field input[type=range]{flex:1;min-width:0;accent-color:var(--accent);height:28px}
.field output{flex:0 0 46px;text-align:right;font-variant-numeric:tabular-nums;color:var(--muted);font-size:12.5px}
.field select,.field input[type=text],.field input[type=number]{flex:1;min-width:0;background:var(--raised);border:1px solid var(--line);border-radius:8px;padding:7px 9px}
input[type=search]{-webkit-appearance:none;appearance:none;font:inherit}
input[type=color]{width:40px;height:30px;padding:0;border:1px solid var(--line);border-radius:6px;background:var(--raised)}
textarea{width:100%;min-height:84px;background:var(--raised);border:1px solid var(--line);border-radius:8px;padding:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;resize:vertical}
.hint{color:var(--muted);font-size:12.5px;line-height:1.45;margin:6px 0}
.hint b{color:var(--fg);font-weight:500}
h4{font:600 12px var(--font-c);letter-spacing:.09em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px}
h4:first-child{margin-top:6px}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.chips button{border-radius:999px;padding:6px 11px;font-size:13px}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.seg button{border:0;border-radius:0;background:transparent;padding:6px 10px}
.seg button.on{background:var(--accent-dim);color:var(--accent)}
.seg button+button{border-left:1px solid var(--line)}

.list{display:flex;flex-direction:column;gap:4px}
.item{display:flex;align-items:center;gap:8px;padding:7px 8px;border:1px solid transparent;border-radius:10px;background:rgba(255,255,255,.03)}
.item.sel{border-color:var(--sel);background:rgba(93,216,255,.07)}
.item .sw{width:26px;height:26px;border-radius:6px;flex:0 0 auto;border:1px solid rgba(255,255,255,.12)}
.item .nm{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500}
.item .nm small{display:block;color:var(--muted);font-weight:400;font-size:12px}
.item button.sm{padding:4px 7px}
.vis-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:8px;margin:6px 0 10px}
.vis{position:relative;aspect-ratio:16/10;max-width:100%;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#000;cursor:pointer;padding:0}
.vis canvas{width:100%;height:100%;display:block}
.vis span small{display:block;font-weight:400;opacity:.7;letter-spacing:0;text-transform:none}
.vis span{position:absolute;left:0;right:0;bottom:0;padding:3px 6px;font:600 11px var(--font-c);letter-spacing:.05em;text-transform:uppercase;background:linear-gradient(transparent,rgba(0,0,0,.85));text-align:left}
.vis.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.scene{display:flex;align-items:center;gap:8px;padding:8px;border-radius:10px;border:1px solid var(--line);margin-bottom:6px}
.scene.on{border-color:var(--accent);background:var(--accent-dim)}
.scene .nm{flex:1;min-width:0;font-weight:500}
.scene .nm small{color:var(--muted);display:block;font-size:12px;font-weight:400}
.nudge{display:grid;grid-template-columns:repeat(3,36px);grid-template-rows:repeat(3,36px);gap:3px}
.nudge button{padding:0}
.nudge .c{grid-column:2;grid-row:2;background:transparent;border-color:transparent;color:var(--muted);font-size:11px}
.kv{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;font-size:13px}
.kv b{font-weight:500;color:var(--muted)}
#toast{position:fixed;left:50%;bottom:calc(env(safe-area-inset-bottom,0px) + 70px);transform:translateX(-50%);z-index:20;background:#fff;color:#000;padding:9px 14px;border-radius:10px;font-weight:500;font-size:13px;opacity:0;transition:opacity .2s;pointer-events:none;max-width:calc(100vw - 32px);text-align:center}
#toast.show{opacity:1}
.empty{border:1px dashed var(--line);border-radius:12px;padding:16px;text-align:center;color:var(--muted);line-height:1.5}
.empty b{color:var(--fg);font-weight:500}
.warn{color:var(--accent);font-size:12.5px}

@media (min-width:900px){
  #sheet{left:auto;right:0;top:0;bottom:0;width:360px;height:auto;max-height:none;border-radius:0;border-top:0;border-left:1px solid var(--line);padding-top:calc(env(safe-area-inset-top,0px) + 64px)}
  #sheet.collapsed{height:auto;width:0;border:0;overflow:hidden}
  .grip{display:none}
  #topbar{right:360px;transition:right .22s}
  body.sheet-collapsed #topbar{right:0}
  .tabs{padding-left:12px;padding-right:12px}
  .panel{padding-left:14px;padding-right:14px}
}
@media (max-width:560px){
  .brand b{display:none}
  .brand small{max-width:30vw}
  .brand{padding:6px 8px}
  .tb{gap:2px;padding:3px}
  .tb button.icon{width:34px;height:34px}
  .tabs button{padding:6px 6px;font-size:12.5px;letter-spacing:.05em}
}
@media (prefers-reduced-motion:reduce){*{transition:none!important}}
