:root{--bg: #0b1120;--panel: #131d34;--panel-border: #314269;--text: #e5e9f5;--muted: #a8b3d1;--accent: #3fb4ff;--accent-2: #b5f0ff;--danger: #ff6f91;--ok: #73ffa6;--app-height: 100vh}@supports (height: 100dvh){:root{--app-height: 100dvh}}*{box-sizing:border-box}body{margin:0;color:var(--text);font:14px/1.4 IBM Plex Sans,Segoe UI,sans-serif;background:radial-gradient(circle at 15% 20%,#18243f,transparent 35%),radial-gradient(circle at 70% 70%,#172447,transparent 45%),var(--bg);overflow:hidden}#app{position:relative;height:var(--app-height);display:grid;grid-template-columns:330px minmax(0,1fr);overflow:hidden;isolation:isolate}.controls-host{min-width:0;min-height:0}#app.controls-collapsed{grid-template-columns:0 minmax(0,1fr)}#app.controls-collapsed .controls-host{border-right:0;overflow:hidden}.controls{position:relative;z-index:20;border-right:1px solid var(--panel-border);background:linear-gradient(180deg,#121a2d,#0f172a 40%);padding:16px;height:var(--app-height);overflow-y:auto;overflow-x:hidden}.viewer{position:relative;min-width:0;min-height:0;height:var(--app-height);z-index:1}canvas{width:100%;height:100%;display:block;touch-action:none;cursor:grab}canvas:active{cursor:grabbing}section{margin-bottom:14px;border:1px solid var(--panel-border);border-radius:8px;padding:10px;background:#16213abf}h1{margin:0 0 12px;font-size:18px}h2{margin:0 0 8px;color:var(--accent-2);font-size:13px;text-transform:uppercase;letter-spacing:.06em}label{display:block;margin-bottom:8px;color:var(--muted)}.control-title{display:inline-flex;align-items:center;margin-right:auto}.control-header{display:flex;align-items:center;width:100%}.param-random{display:inline-flex;align-items:center;margin-left:8px}.param-value{margin-right:2px;color:var(--accent-2);font-size:12px}.param-random input[type=checkbox]{margin-right:0}input[type=range],input[type=number],input[type=text],select,button:not(.hint){width:100%;margin-top:3px;border:1px solid var(--panel-border);border-radius:6px;background:#121a2f;color:var(--text);padding:6px}input[type=checkbox]{width:auto;margin-right:6px;accent-color:var(--accent)}button:not(.hint){cursor:pointer;background:linear-gradient(180deg,#1e3a65,#163157)}button:not(.hint):hover{filter:brightness(1.1)}.row{display:grid;grid-template-columns:1fr 1fr;gap:8px}.metrics{position:absolute;left:12px;top:54px;background:#060a14b3;border:1px solid var(--panel-border);border-radius:8px;padding:8px 10px;font-size:12px;z-index:35}.metrics.collapsed{display:none}.metrics-content{margin-top:2px}button.metrics-dismiss{position:absolute;right:4px;top:4px;width:22px;height:22px;min-width:22px;margin-top:0;padding:0;display:inline-flex;align-items:center;justify-content:center}button.viewer-float-btn{position:absolute;z-index:1;width:34px;height:34px;min-width:34px;padding:0;display:inline-flex;align-items:center;justify-content:center}#panelToggle{left:12px;top:12px}.controls-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:25;border:0;padding:0;background:#050a148c;opacity:0;pointer-events:none;transition:opacity .18s ease}#app.controls-open .controls-backdrop{opacity:1;pointer-events:auto}button.random-fab{right:12px;bottom:62px;width:48px;height:48px;min-width:48px;border-radius:999px;opacity:.82;background:radial-gradient(circle at 30% 20%,#2e7bd0,#184879 65%);border-color:#82beffb3;box-shadow:0 8px 24px #080e2080}button.random-fab .icon{width:20px;height:20px}button.random-fab:hover{opacity:1}button.random-fab.cta-pulse,#pbShuffle.cta-pulse{animation:random-cta-pulse 2.2s cubic-bezier(.22,1,.36,1) infinite}button.reset-view-btn{right:12px;top:12px;width:auto;min-width:48px;height:32px;padding:0 10px;border-radius:999px;font-size:12px;letter-spacing:.02em;opacity:.92;pointer-events:auto}button.metrics-info-btn{left:12px;top:54px;display:none;opacity:.55;background:#0c14268c;border-color:#8caadc73}button.metrics-info-btn.visible{display:inline-flex}.metrics-info-btn:hover{opacity:.85}.playbar{position:absolute;left:12px;right:12px;bottom:12px;border:1px solid var(--panel-border);border-radius:10px;padding:8px 10px;background:#080c16d1;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);z-index:1}.playbar-row{display:flex;gap:8px;align-items:center;margin-bottom:6px}.playbar button{width:auto;margin-top:0;display:inline-flex;align-items:center;gap:6px;min-height:34px;min-width:34px;padding:6px 10px;cursor:pointer;position:relative;z-index:1;pointer-events:auto}.playbar button>*{pointer-events:none}#pbCollapse{margin-left:0;width:38px;height:30px;min-width:38px;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:22px;line-height:1}#pbStepLabel{margin-left:auto}.icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px}.icon svg{width:100%;height:100%;pointer-events:none}#pbPlay .icon{width:19px;height:19px}.playbar button.active{border-color:var(--accent);box-shadow:inset 0 0 0 1px #3fb4ff59}#pbShuffle .icon{width:18px;height:18px}.playbar input[type=range]{margin-top:0}.playbar.collapsed{border:0;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;padding:0;left:auto;right:12px;bottom:12px}.playbar.collapsed input[type=range],.playbar.collapsed #pbStepLabel{display:none}.playbar.collapsed .playbar-row{margin-bottom:0;justify-content:flex-end;gap:6px}.playbar.collapsed button:not(#pbCollapse){width:42px;min-width:42px;height:42px;padding:0;justify-content:center;background:linear-gradient(180deg,#1e3a65,#163157);box-shadow:0 10px 24px #080e2047}.playbar.collapsed #pbPlay{display:none}.playbar.collapsed button:not(#pbCollapse) span:not(.icon){display:none}.playbar.collapsed #pbCollapse{opacity:.8;width:42px;height:42px;min-width:42px;background:linear-gradient(180deg,#1e3a65,#163157);box-shadow:0 10px 24px #080e2047}.small{color:var(--muted);font-size:12px}@keyframes random-cta-pulse{0%,to{transform:scale(1);opacity:.82;box-shadow:0 8px 24px #080e2080}35%{transform:scale(1.08);opacity:1;box-shadow:0 12px 28px #080e2094}60%{transform:scale(.985);opacity:.92}}.hint{display:inline-flex;align-items:center;justify-content:center;margin-left:6px;width:15px;height:15px;border-radius:50%;border:1px solid var(--panel-border);color:var(--accent-2);background:#0f1a31;font-size:10px;cursor:help;padding:0;line-height:1}.hint svg{width:12px;height:12px}.tooltip-float{position:fixed;z-index:9999;left:0;top:0;width:240px;background:#080d18fa;border:1px solid var(--panel-border);border-radius:8px;color:#d5def2;font-size:11px;line-height:1.35;padding:7px 8px;opacity:0;transform:translateY(3px);pointer-events:none;transition:opacity .12s ease,transform .12s ease}.tooltip-float.open{opacity:1;transform:translateY(0)}@media(max-width:980px){#app,#app.controls-collapsed,#app.controls-open{grid-template-columns:1fr;grid-template-rows:1fr}.controls-host{grid-column:1;grid-row:1;position:fixed;inset:0 auto 0 0;width:min(88vw,360px);max-width:calc(100vw - 56px);z-index:40;transform:translate(-100%);transition:transform .22s ease;pointer-events:none}#app.controls-open .controls-host{transform:translate(0);pointer-events:auto}#app.controls-collapsed .controls-host{transform:translate(calc(-100% - 24px));overflow:hidden;pointer-events:none}.controls{height:var(--app-height);border-right:1px solid var(--panel-border);border-bottom:0;box-shadow:18px 0 40px #040a1875;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding-bottom:calc(112px + env(safe-area-inset-bottom))}.controls section:last-child{margin-bottom:calc(36px + env(safe-area-inset-bottom))}.viewer{grid-column:1;grid-row:1;width:100%;height:var(--app-height);overflow:hidden}.playbar{position:fixed;left:10px;right:10px;bottom:max(10px,env(safe-area-inset-bottom))}.playbar-row{flex-wrap:wrap}#pbStepLabel{width:100%;margin-left:0;order:10}button.random-fab{position:fixed;right:10px;bottom:calc(max(10px,env(safe-area-inset-bottom)) + 52px)}button.reset-view-btn{position:fixed;right:10px;top:max(10px,env(safe-area-inset-top))}#panelToggle{position:fixed;left:10px;top:max(10px,env(safe-area-inset-top))}.metrics{top:calc(max(10px,env(safe-area-inset-top)) + 42px);left:10px}.playbar.collapsed{left:auto;right:10px;bottom:max(10px,env(safe-area-inset-bottom))}.playbar.collapsed .playbar-row{flex-wrap:nowrap}}
