@hugpy/video-intelligence-ui 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/index-C_av7KDW.js +4190 -0
- package/dist/assets/index-DMoT8G1q.css +1 -0
- package/dist/index.html +2 -2
- package/entry.tsx +6 -27
- package/package.json +3 -2
- package/src/config.ts +11 -27
- package/src/demo/demoFetch.ts +0 -9
- package/src/nav/Navbar.tsx +3 -3
- package/src/session.ts +8 -43
- package/src/stations/GenerateStation.tsx +8 -5
- package/src/stations/SharePanel.tsx +4 -4
- package/src/stations/ToksPanel.tsx +1 -2
- package/src/stations/WorkbenchSidebar.tsx +8 -261
- package/src/stations/ops/CharacterGroupsPanel.tsx +75 -83
- package/src/stations/studio/IdentitiesStation.tsx +66 -75
- package/src/stations/studio/StudioGenerateMode.tsx +3 -2
- package/src/stations/studio/StudioGenerateTab.tsx +258 -188
- package/src/stations/studio/StudioMovieComposer.tsx +320 -57
- package/src/stations/studio/StudioPlane.tsx +3 -1
- package/src/stations/studio/StudioViewer.tsx +6 -11
- package/src/stations/studio/studioShared.tsx +14 -2
- package/src/stations/studio/useIdentityCreateJob.ts +26 -21
- package/src/stations/studio/useReconstruction.ts +11 -5
- package/src/video/PromptAssistButtons.tsx +5 -6
- package/src/video/jobStream.ts +119 -0
- package/src/video/jobTracker.ts +67 -76
- package/src/video/modelsFeed.ts +105 -0
- package/src/video/studioOracle.ts +48 -0
- package/src/video/useMediaJobs.ts +17 -3
- package/src/video/useModels.ts +12 -53
- package/src/video/useMovieSessions.ts +15 -6
- package/src/video/useOperatorHistory.ts +11 -101
- package/src/video/usePromptAssist.ts +6 -3
- package/src/video/useToks.ts +14 -6
- package/src/video/watchVideoJob.ts +43 -0
- package/dist/assets/index-DuT1AMLn.css +0 -1
- package/dist/assets/index-_13ZiBDP.js +0 -4191
- package/src/video/useWorkerCalls.ts +0 -165
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.vi-script{display:flex;flex-direction:column;gap:1.25rem}.vi-script-panel{border:1px solid var(--vi-border);border-radius:8px;background:var(--vi-surface-raised);padding:.85rem 1rem 1rem}.vi-script-panel>h3{margin:0 0 .6rem;font-family:var(--vi-mono);font-size:.82rem;letter-spacing:.04em;text-transform:uppercase;color:var(--vi-text-dim);display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap}.vi-script-panel>h3 .vi-script-sub{text-transform:none;letter-spacing:0;font-size:.75rem;color:var(--vi-text-dim);opacity:.85}.vi-script-row{display:flex;gap:.6rem;flex-wrap:wrap;align-items:center}.vi-script-row+.vi-script-row{margin-top:.5rem}.vi-script-grow{flex:1 1 14rem;min-width:8rem}.vi-script-kv{display:grid;grid-template-columns:minmax(7rem,max-content) 1fr;gap:.25rem .9rem;font-size:.8rem}.vi-script-kv dt{font-family:var(--vi-mono);color:var(--vi-text-dim)}.vi-script-kv dd{margin:0;word-break:break-word}.vi-script-digest{font-family:var(--vi-mono);font-size:.72rem;color:var(--vi-text-dim);word-break:break-all}.vi-script-table{width:100%;border-collapse:collapse;font-size:.78rem}.vi-script-table th,.vi-script-table td{border-bottom:1px solid var(--vi-border);padding:.35rem .5rem;text-align:left;vertical-align:top}.vi-script-table th{font-family:var(--vi-mono);font-weight:500;color:var(--vi-text-dim);font-size:.72rem;text-transform:uppercase;letter-spacing:.03em}.vi-script-table tr.vi-script-excluded td{opacity:.55;text-decoration-color:var(--vi-text-dim)}.vi-script-tag{display:inline-block;font-family:var(--vi-mono);font-size:.68rem;border:1px solid var(--vi-border);border-radius:999px;padding:.05rem .5rem;color:var(--vi-text-dim);white-space:nowrap}.vi-script-tag-on{border-color:var(--vi-accent);color:var(--vi-accent)}.vi-script-tag-off{border-color:#6b4a4a;color:#ff8a8a}.vi-script-json{width:100%;min-height:12rem;font-family:var(--vi-mono);font-size:.75rem;line-height:1.45;background:var(--vi-surface);color:var(--vi-text);border:1px solid var(--vi-border);border-radius:6px;padding:.6rem;resize:vertical}.vi-script-json:disabled{opacity:.7}.vi-script-pre{font-family:var(--vi-mono);font-size:.72rem;white-space:pre-wrap;word-break:break-word;margin:.4rem 0 0;color:#ff8a8a}.vi-script-raw{font-family:var(--vi-mono);font-size:.7rem;white-space:pre-wrap;word-break:break-word;max-height:14rem;overflow:auto;background:var(--vi-surface);border:1px solid var(--vi-border);border-radius:6px;padding:.5rem;color:var(--vi-text-dim)}.vi-script-note{font-size:.76rem;color:var(--vi-text-dim);margin:.4rem 0 0}.vi-script-limits{margin:.4rem 0 0;padding-left:1.1rem;font-size:.76rem;color:var(--vi-text-dim)}.vi-script-fanout{display:flex;flex-direction:column;align-items:stretch}.vi-script-parent{border:1px solid var(--vi-accent);border-radius:8px;padding:.6rem .8rem;background:var(--vi-surface);align-self:center;max-width:46rem;text-align:center}.vi-script-parent h4{margin:0 0 .3rem;font-family:var(--vi-mono);font-size:.8rem;color:var(--vi-accent)}.vi-script-stem{width:1px;height:1.1rem;background:var(--vi-border);align-self:center}.vi-script-children{display:grid;grid-template-columns:repeat(auto-fill,minmax(19rem,1fr));gap:.9rem;border-top:1px solid var(--vi-border);padding-top:1.1rem;position:relative}.vi-script-seg{border:1px solid var(--vi-border);border-radius:8px;background:var(--vi-surface);padding:.7rem .8rem .8rem;position:relative;display:flex;flex-direction:column;gap:.45rem}.vi-script-seg:before{content:"";position:absolute;top:-1.1rem;left:50%;width:1px;height:1.1rem;background:var(--vi-border)}.vi-script-seg-busy{border-color:var(--vi-accent)}.vi-script-seg-head{display:flex;justify-content:space-between;align-items:baseline;gap:.5rem;font-family:var(--vi-mono);font-size:.8rem}.vi-script-seg-prompt{font-size:.76rem;line-height:1.45;max-height:9rem;overflow:auto;white-space:pre-wrap;color:var(--vi-text);margin:0}.vi-script-attempts{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem;font-family:var(--vi-mono);font-size:.7rem}.vi-script-attempts li{border-left:2px solid var(--vi-border);padding-left:.5rem;color:var(--vi-text-dim)}.vi-script-attempts li.vi-script-attempt-ok{border-left-color:#7fd88f}.vi-script-attempts li.vi-script-attempt-gap{border-left-color:#d8a04a}.vi-script-gap{border:1px solid #6b5a3a;border-radius:6px;padding:.45rem .6rem;font-size:.72rem;color:#e8c98a;background:#d8a04a0f}.vi-script-gap strong{font-family:var(--vi-mono);display:block;margin-bottom:.2rem}.vi-script-runs{display:flex;gap:.4rem;flex-wrap:wrap}.vi-script-runbtn{text-align:left;max-width:22rem}.vi-script-confirm{border:1px solid var(--vi-accent);border-radius:8px;padding:.7rem .9rem;background:var(--vi-surface);font-size:.8rem;display:flex;flex-direction:column;gap:.5rem}@media (max-width: 720px){.vi-script-children,.vi-script-kv{grid-template-columns:1fr}}.vi-template-steps{margin:.5rem 0 0;padding-left:1.5rem;display:flex;flex-direction:column;gap:.6rem}.vi-template-step-head{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap}.vi-template-step-head>select{max-width:24rem}.vi-template-step-desc{margin:.15rem 0 0;font-size:.85em;opacity:.75}.vi-oracle{display:flex;flex-direction:column;gap:1.1rem}.vi-oracle-panel{border:1px solid var(--vi-border);border-radius:8px;background:var(--vi-surface-raised);padding:.85rem 1rem 1rem;min-width:0}.vi-oracle-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));gap:.75rem;margin-bottom:.75rem}.vi-oracle-field{display:flex;flex-direction:column;gap:.3rem;min-width:0;color:var(--vi-text-dim);font-size:.76rem}.vi-oracle-wide{grid-column:1 / -1}.vi-oracle-field input,.vi-oracle-field textarea,.vi-oracle-field select{width:100%;box-sizing:border-box;padding:.48rem .58rem;border:1px solid var(--vi-border);border-radius:6px;background:var(--vi-surface);color:var(--vi-text);font:inherit}.vi-oracle-field textarea{resize:vertical}.vi-oracle-panel>h3{margin:0 0 .6rem;font-family:var(--vi-mono);font-size:.82rem;letter-spacing:.04em;text-transform:uppercase;color:var(--vi-text-dim);display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap}.vi-oracle-panel>h3 .vi-oracle-sub{text-transform:none;letter-spacing:0;font-size:.75rem;color:var(--vi-text-dim);opacity:.85}.vi-oracle-panel>h4{margin:.8rem 0 .4rem;font-family:var(--vi-mono);font-size:.74rem;letter-spacing:.03em;text-transform:uppercase;color:var(--vi-text-dim)}.vi-oracle-row{display:flex;gap:.6rem;flex-wrap:wrap;align-items:center}.vi-oracle-row+.vi-oracle-row{margin-top:.5rem}.vi-oracle-grow{flex:1 1 14rem;min-width:8rem}.vi-oracle-kv{display:grid;grid-template-columns:minmax(7rem,max-content) 1fr;gap:.25rem .9rem;margin:0;font-size:.78rem}.vi-oracle-kv dt{color:var(--vi-text-dim);font-family:var(--vi-mono);font-size:.7rem}.vi-oracle-kv dd{margin:0;word-break:break-word}.vi-oracle-kv code,.vi-oracle-table code,.vi-oracle-digest{font-family:var(--vi-mono);font-size:.7rem;color:var(--vi-text-dim)}.vi-oracle-tag{display:inline-block;font-family:var(--vi-mono);font-size:.66rem;border:1px solid var(--vi-border);border-radius:999px;padding:.05rem .5rem;color:var(--vi-text-dim);white-space:nowrap;vertical-align:middle}.vi-oracle-tag-info{border-color:var(--vi-border)}.vi-oracle-tag-warn{border-color:#8a7a3a;color:#f2d16b}.vi-oracle-tag-alarm{border-color:#6b4a4a;color:#ff8a8a}.vi-oracle-tag-ok{border-color:#3f6b4a;color:#7fd88f}.vi-oracle-tag-accent{border-color:var(--vi-accent);color:var(--vi-accent)}.vi-oracle-state{font-family:var(--vi-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.05em;color:var(--vi-text-dim)}.vi-oracle-state-running,.vi-oracle-state-leased,.vi-oracle-state-pending,.vi-oracle-state-awaiting_approval,.vi-oracle-state-paused{color:var(--vi-accent)}.vi-oracle-state-succeeded,.vi-oracle-state-completed{color:#7fd88f}.vi-oracle-state-failed,.vi-oracle-state-rejected,.vi-oracle-state-cancelled{color:#ff8a8a}.vi-oracle-stale{border:1px solid #8a7a3a;background:#f2d16b14;color:#f2d16b;border-radius:6px;padding:.45rem .7rem;font-size:.78rem;margin:.5rem 0}.vi-oracle-findings{list-style:none;margin:.4rem 0 0;padding:0;display:flex;flex-direction:column;gap:.35rem}.vi-oracle-finding{border:1px solid var(--vi-border);border-radius:6px;padding:.45rem .6rem;font-size:.78rem;background:var(--vi-surface)}.vi-oracle-finding-alarm{border-color:#6b4a4a}.vi-oracle-finding-warn{border-color:#8a7a3a}.vi-oracle-finding-head{display:flex;gap:.5rem;align-items:baseline;flex-wrap:wrap}.vi-oracle-finding-action{margin:.25rem 0 0;color:var(--vi-text-dim);font-size:.74rem}.vi-oracle-table{width:100%;border-collapse:collapse;font-size:.76rem}.vi-oracle-table th,.vi-oracle-table td{text-align:left;padding:.3rem .5rem;border-bottom:1px solid var(--vi-border);vertical-align:top;word-break:break-word}.vi-oracle-table th{font-family:var(--vi-mono);font-size:.66rem;text-transform:uppercase;letter-spacing:.04em;color:var(--vi-text-dim);font-weight:400}.vi-oracle-table tr.is-selected td{background:#8ab4ff14}.vi-oracle-table tr.is-clickable{cursor:pointer}.vi-oracle-table tr.is-clickable:hover td{background:#ffffff08}.vi-oracle-split{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media (min-width: 62rem){.vi-oracle-split.has-drawer{grid-template-columns:minmax(0,1fr) minmax(20rem,26rem)}}.vi-oracle-drawer{border:1px solid var(--vi-accent);border-radius:8px;background:var(--vi-surface-raised);padding:.85rem 1rem 1rem;min-width:0;align-self:start;position:sticky;top:.5rem;max-height:calc(100dvh - 8rem);overflow:auto}.vi-oracle-drawer>h3{margin:0 0 .6rem;font-family:var(--vi-mono);font-size:.82rem;letter-spacing:.04em;text-transform:uppercase;color:var(--vi-text);display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap}.vi-oracle-drawer>h3 .vi-oracle-close{margin-left:auto}.vi-oracle-drawer>h4{margin:.9rem 0 .35rem;font-family:var(--vi-mono);font-size:.72rem;letter-spacing:.03em;text-transform:uppercase;color:var(--vi-text-dim)}.vi-oracle-candidates{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.vi-oracle-candidate{border:1px solid var(--vi-border);border-radius:6px;padding:.4rem .55rem;font-size:.76rem;background:var(--vi-surface)}.vi-oracle-candidate.is-selected{border-color:var(--vi-accent)}.vi-oracle-candidate.is-rejected{opacity:.8}.vi-oracle-candidate-head{display:flex;gap:.5rem;align-items:baseline;flex-wrap:wrap}.vi-oracle-candidate-head code{font-family:var(--vi-mono);font-size:.74rem;color:var(--vi-text)}.vi-oracle-reasons{margin:.25rem 0 0;padding-left:1rem;color:var(--vi-text-dim);font-size:.72rem}.vi-oracle-steps{margin:.25rem 0 0;padding-left:1.2rem;font-family:var(--vi-mono);font-size:.68rem;color:var(--vi-text-dim)}.vi-oracle-meter{display:flex;align-items:center;gap:.5rem;font-size:.74rem}.vi-oracle-meter-track{flex:1 1 6rem;height:.35rem;border-radius:999px;background:var(--vi-border);overflow:hidden}.vi-oracle-meter-fill{height:100%;background:var(--vi-accent)}.vi-oracle-raw{font-family:var(--vi-mono);font-size:.68rem;white-space:pre-wrap;word-break:break-word;max-height:18rem;overflow:auto;background:var(--vi-surface);border:1px solid var(--vi-border);border-radius:6px;padding:.5rem;color:var(--vi-text-dim);margin:.3rem 0 0}.vi-oracle-raw-toggle{font-size:.72rem;color:var(--vi-text-dim);cursor:pointer;margin-top:.4rem}.vi-oracle-raw-toggle summary{font-family:var(--vi-mono)}.vi-oracle-note{font-size:.76rem;color:var(--vi-text-dim);margin:.4rem 0 0}.vi-oracle-gap{border:1px dashed #6b4a4a;border-radius:6px;padding:.45rem .7rem;font-size:.76rem;color:#ff8a8a;margin:.4rem 0 0}.vi-oracle-limits{margin:.4rem 0 0;padding-left:1.1rem;font-size:.76rem;color:var(--vi-text-dim)}.vi-oracle-tabs{display:flex;gap:.3rem;border-bottom:1px solid var(--vi-border);margin-bottom:.8rem}.vi-oracle-tab{background:none;border:0;border-bottom:2px solid transparent;color:var(--vi-text-dim);font-family:var(--vi-mono);font-size:.74rem;letter-spacing:.03em;text-transform:uppercase;padding:.4rem .7rem;cursor:pointer}.vi-oracle-tab[aria-selected=true]{color:var(--vi-text);border-bottom-color:var(--vi-accent)}.vi-oracle-runs{display:flex;gap:.4rem;flex-wrap:wrap}.vi-oracle-runs .vi-btn{font-family:var(--vi-mono);font-size:.7rem}.brandmark{color:var(--text-primary, #f4f4f5);font-family:Fira Code,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:700;font-size:14px;white-space:nowrap;display:inline-flex;align-items:center;gap:9px;text-decoration:none;cursor:pointer}.brandmark:hover{color:var(--link, #a7c7ff)}.brandmark-img{height:34px;width:auto;align-self:center;mix-blend-mode:screen;filter:brightness(1.6) saturate(1.2)}.brandmark-text{display:inline-flex;flex-direction:column;align-items:center;text-align:center;gap:4px}.brandmark-word{font-size:16px;line-height:1;letter-spacing:.92em;margin-right:-.92em}.brandmark-rule{height:1px;width:100%;background:currentColor;opacity:.35}.brandmark-sub{color:var(--text-tertiary, #8e8e93);font-weight:500;font-size:11px;letter-spacing:.08em;line-height:1}@media (max-width: 640px){.brandmark-rule,.brandmark-sub{display:none}.brandmark-img{height:22px}.brandmark-word{letter-spacing:.12em;margin-right:0}}.hugpy-navbar{--main-surface-primary: #050505;--text-primary: #f4f4f5;--text-secondary: #c7c7cc;--text-tertiary: #8e8e93;--border-light: rgba(255, 255, 255, .09);--border-medium: rgba(255, 255, 255, .14);--link: #a7c7ff;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:16px;padding:14px 28px;border-bottom:1px solid var(--border-light);background:#0b0d13d9;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);flex-shrink:0}.hugpy-navbar-brand{display:flex;align-items:center;gap:10px;justify-self:start;flex:none}.hugpy-navbar-links{display:flex;align-items:center;gap:22px;font-size:13px;justify-self:stretch;justify-content:flex-start;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.hugpy-navbar-links::-webkit-scrollbar{display:none}.hugpy-navbar-links a{color:var(--text-tertiary);text-decoration:none;white-space:nowrap}.hugpy-navbar-links a:hover{color:var(--text-primary)}.hugpy-navbar-links a.is-current{color:var(--text-primary);font-weight:600}.hugpy-navbar-side{display:flex;align-items:center;gap:12px;justify-self:end;min-width:0}.hugpy-navbar-action{-webkit-appearance:none;-moz-appearance:none;appearance:none;font:inherit;font-size:13px;cursor:pointer;color:var(--text-tertiary);background:transparent;border:1px solid var(--border-light);border-radius:var(--radius, 6px);padding:3px 10px;white-space:nowrap}.hugpy-navbar-action:hover{color:var(--text-primary);border-color:var(--border-medium)}@media (max-width: 640px){.hugpy-navbar{padding:12px 14px;gap:12px}.hugpy-navbar-links{gap:16px}}.vi-header-stack{flex-shrink:0;z-index:30}.vi-demo-banner{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;padding:8px 16px;font-size:13px;line-height:1.4;color:var(--text-secondary, #c7c7cc);background:linear-gradient(180deg,#14171f,#0b0d13);border-bottom:1px solid var(--border-light, rgba(255, 255, 255, .09));box-shadow:0 2px 10px #00000059}.vi-demo-badge{flex:0 0 auto;font-weight:700;font-size:11px;letter-spacing:.12em;padding:2px 8px;border-radius:5px;color:#050505;background:#7cc4ff}.vi-demo-text{flex:1 1 280px;min-width:200px;color:var(--text-tertiary, #8e8e93)}.vi-demo-text strong{color:var(--text-primary, #f2f2f4)}.vi-demo-cmd{flex:0 1 auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;padding:3px 10px;border-radius:6px;cursor:pointer;color:#a8d2ff;background:#7cc4ff14;border:1px solid rgba(124,196,255,.25);white-space:nowrap}.vi-demo-cmd:hover{background:#7cc4ff29}.vi-demo-link{flex:0 0 auto;color:#7cc4ff;text-decoration:none;font-weight:600}.vi-demo-link:hover{text-decoration:underline}#hugpy-help-widget,#hugpy-help-widget *{box-sizing:border-box}#hugpy-help-widget{position:fixed;right:18px;bottom:18px;z-index:2147483000;font-family:system-ui,-apple-system,Segoe UI,sans-serif;font-size:13px;line-height:1.5;color:#e6e6e6}#hugpy-help-widget .hgh-fab{display:inline-flex;align-items:center;gap:7px;border:1px solid rgba(255,255,255,.16);border-radius:999px;background:#14161a;color:#f2f2f2;cursor:pointer;padding:9px 15px;font:inherit;font-weight:500;box-shadow:0 6px 22px #0000006b}#hugpy-help-widget .hgh-fab:hover{background:#1d2026;border-color:#ffffff4d}#hugpy-help-widget .hgh-fab-dot{width:7px;height:7px;border-radius:50%;background:#34d399}#hugpy-help-widget .hgh-panel{width:min(380px,calc(100vw - 24px));height:min(520px,calc(100vh - 96px));display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.14);border-radius:14px;background:#101216;box-shadow:0 18px 48px #0000008c;overflow:hidden}#hugpy-help-widget .hgh-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid rgba(255,255,255,.1);background:#14171c}#hugpy-help-widget .hgh-title{font-weight:600;color:#fff}#hugpy-help-widget .hgh-sub{color:#8b93a1;font-size:11px}#hugpy-help-widget .hgh-x{margin-left:auto;background:none;border:0;color:#8b93a1;cursor:pointer;font:inherit;font-size:17px;line-height:1;padding:2px 4px}#hugpy-help-widget .hgh-x:hover{color:#fff}#hugpy-help-widget .hgh-tabs{display:flex;gap:4px;padding:8px 10px 0;border-bottom:1px solid rgba(255,255,255,.08)}#hugpy-help-widget .hgh-tab{border:0;background:none;color:#8b93a1;cursor:pointer;font:inherit;padding:6px 10px;border-radius:7px 7px 0 0}#hugpy-help-widget .hgh-tab:hover{color:#dfe3ea}#hugpy-help-widget .hgh-tab[aria-selected=true]{color:#fff;background:#191d24;box-shadow:inset 0 -2px #4b8cff}#hugpy-help-widget .hgh-body{flex:1 1 auto;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:9px}#hugpy-help-widget .hgh-foot{border-top:1px solid rgba(255,255,255,.1);padding:9px 10px;display:flex;flex-direction:column;gap:7px;background:#14171c}#hugpy-help-widget .hgh-msg{padding:8px 10px;border-radius:10px;white-space:pre-wrap;word-break:break-word;max-width:92%}#hugpy-help-widget .hgh-msg.user{align-self:flex-end;background:#24303f;color:#eaf1ff}#hugpy-help-widget .hgh-msg.keeper{align-self:flex-start;background:#191d24;color:#dfe3ea}#hugpy-help-widget .hgh-msg.err{align-self:stretch;background:#2c1618;color:#ffbdbd;border:1px solid #5b2429}#hugpy-help-widget .hgh-msg.ok{align-self:stretch;background:#14251c;color:#b6f0cf;border:1px solid #235437}#hugpy-help-widget .hgh-hint{color:#79818f;font-size:11px}#hugpy-help-widget textarea,#hugpy-help-widget input[type=text]{width:100%;resize:vertical;font:inherit;color:#e9edf3;background:#0c0e12;border:1px solid rgba(255,255,255,.14);border-radius:8px;padding:7px 9px}#hugpy-help-widget textarea:focus,#hugpy-help-widget input:focus{outline:none;border-color:#4b8cff}#hugpy-help-widget .hgh-row{display:flex;align-items:center;gap:8px}#hugpy-help-widget .hgh-btn{border:1px solid rgba(255,255,255,.16);border-radius:8px;background:#4b8cff;border-color:#4b8cff;color:#06111f;font:inherit;font-weight:600;cursor:pointer;padding:7px 12px}#hugpy-help-widget .hgh-btn:hover:not(:disabled){background:#66a0ff}#hugpy-help-widget .hgh-btn:disabled{opacity:.5;cursor:default}#hugpy-help-widget .hgh-btn.ghost{background:transparent;color:#cfd6e2;border-color:#ffffff2e}#hugpy-help-widget .hgh-btn.ghost:hover:not(:disabled){background:#ffffff0f}#hugpy-help-widget .hgh-check{display:flex;align-items:center;gap:6px;color:#9aa3b2;font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none}#hugpy-help-widget .hgh-check input{accent-color:#4b8cff;margin:0}#hugpy-help-widget .hgh-label{color:#9aa3b2;font-size:11px}#hugpy-help-widget .hgh-note{color:#9aa3b2;font-size:11px;background:#191d24;border:1px dashed rgba(255,255,255,.14);border-radius:8px;padding:7px 9px}#hugpy-help-widget a{color:#7fb0ff}#hugpy-help-widget .hgh-ctx{color:#79818f;font-size:11px;font-family:ui-monospace,SFMono-Regular,monospace;white-space:pre-wrap;word-break:break-all;max-height:96px;overflow-y:auto}@media (max-width: 480px){#hugpy-help-widget{right:10px;bottom:10px}#hugpy-help-widget .hgh-panel{height:min(70vh,calc(100vh - 80px))}}/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.visible\!{visibility:visible!important}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.static\!{position:static!important}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{inset-block:0}.left-0{left:0}.z-30{z-index:30}.z-40{z-index:40}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.grow{flex-grow:1}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition\!{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-all{-webkit-user-select:all;user-select:all}@media not all and (min-width:48rem){.max-md\:fixed{position:fixed}}@media (min-width:48rem){.md\:hidden{display:none}}}:root{--vi-surface:#050505;--vi-surface-raised:#101012;--vi-border:#26262a;--vi-text:#e8e6e1;--vi-text-dim:#9b988f;--vi-accent:#8ab4ff;--vi-mono:"IBM Plex Mono", ui-monospace, monospace;--vi-serif:"Newsreader", Georgia, serif}html,body{background:var(--vi-surface);color:var(--vi-text);margin:0;overflow-x:hidden}#root{background:var(--vi-surface);min-height:100dvh;overflow-x:hidden}.vi-shell{height:100dvh;font-family:var(--vi-serif);flex-direction:column;display:flex}.vi-header{border-bottom:1px solid var(--vi-border);flex-wrap:wrap;align-items:baseline;gap:1rem 2rem;padding:1rem 1.5rem;display:flex}.vi-brand{font-family:var(--vi-mono);align-items:baseline;gap:.6rem;display:flex}.vi-brand-home{color:var(--vi-accent);font-weight:500;text-decoration:none}.vi-brand-arm{color:var(--vi-text);letter-spacing:.04em}.vi-brand-stage{color:var(--vi-text-dim);border:1px solid var(--vi-border);border-radius:999px;padding:.1rem .6rem;font-size:.75rem}.vi-tabs{font-family:var(--vi-mono);gap:.25rem;margin-left:auto;font-size:.85rem;display:flex}.vi-tab{color:var(--vi-text-dim);border:1px solid #0000;border-radius:6px;padding:.35rem .8rem;text-decoration:none}.vi-tab:hover{color:var(--vi-text)}.vi-tab-active{color:var(--vi-text);background:var(--vi-surface-raised);border-color:var(--vi-border)}.vi-main{flex:1;justify-content:center;min-height:0;padding:1.25rem 1.5rem;display:flex;overflow:hidden}.station-card{width:100%;max-width:44rem}.station-phase{font-family:var(--vi-mono);color:var(--vi-accent);letter-spacing:.06em;text-transform:uppercase;font-size:.75rem}.station-card h2{margin:.4rem 0 .5rem;font-size:2rem;font-weight:500}.station-blurb{color:var(--vi-text-dim);margin:0 0 1.5rem;font-size:1.05rem;line-height:1.5}.station-planned{border-top:1px solid var(--vi-border);margin:0;padding:0;list-style:none}.station-planned li{border-bottom:1px solid var(--vi-border);color:var(--vi-text);padding:.7rem .2rem;font-size:.95rem}.station-planned li:before{content:"○ ";color:var(--vi-text-dim);font-family:var(--vi-mono)}.station-foot{color:var(--vi-text-dim);margin-top:1.25rem;font-size:.85rem}.station-foot code{font-family:var(--vi-mono);color:var(--vi-text);font-size:.8rem}.station-wide{max-width:68rem}.vi-btn{font-family:var(--vi-mono);border:1px solid var(--vi-border);background:var(--vi-surface-raised);color:var(--vi-text);cursor:pointer;border-radius:6px;padding:.4rem .9rem;font-size:.85rem;line-height:1.2}.vi-btn:hover{border-color:var(--vi-accent)}.vi-btn:disabled{opacity:.45;cursor:not-allowed;border-color:var(--vi-border)}.vi-btn-accent{color:var(--vi-surface);background:var(--vi-accent);border-color:var(--vi-accent);font-weight:500}.vi-btn-accent:hover{filter:brightness(1.08)}.vi-btn-ghost{color:var(--vi-text-dim);background:0 0}.vi-btn-ghost:hover{color:var(--vi-text)}.vi-btn-sm{padding:.2rem .55rem;font-size:.75rem}.vi-crop-source-bar{flex-wrap:wrap;align-items:center;gap:.75rem 1rem;margin-bottom:1rem;display:flex}.vi-file-label{align-items:center;display:inline-flex}.vi-file-input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.vi-crop-status,.vi-crop-meta{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.8rem}.vi-crop-meta code{font-family:var(--vi-mono);color:var(--vi-text)}.vi-error{color:#ff8a8a;font-family:var(--vi-mono);margin:.5rem 0;font-size:.85rem}.vi-crop-warn{color:var(--vi-text-dim);font-family:var(--vi-mono);font-size:.85rem}.vi-dropzone{box-sizing:border-box;border:2px dashed var(--vi-border);background:var(--vi-surface-raised);width:100%;min-height:22rem;color:var(--vi-text-dim);font-family:var(--vi-mono);text-align:center;cursor:pointer;border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:.5rem;padding:1.5rem;transition:border-color .14s,background .14s,transform .14s;display:flex}.vi-dropzone:hover,.vi-dropzone--active{border-color:var(--vi-accent);background:#8ab4ff14;transform:translateY(-1px)}.vi-dropzone:focus-visible{outline:2px solid var(--vi-accent);outline-offset:2px}.vi-dropzone--busy{cursor:progress;opacity:.7}.vi-dropzone--compact{min-height:9rem;padding:1rem}.vi-dropzone-title{color:var(--vi-text);font-size:.95rem}.vi-dropzone-hint{color:var(--vi-text-dim);max-width:28rem;font-size:.75rem;line-height:1.4}.vi-input-required{border:2px solid var(--vi-accent);box-sizing:border-box;background:#8ab4ff14;border-radius:8px;padding:1rem 1.1rem}.vi-input-callout{color:var(--vi-accent);margin:0 0 .5rem;font-size:.9rem;font-weight:600}.vi-dropzone--required{border-style:solid;border-color:var(--vi-accent);background:#8ab4ff14}.vi-crop-editor{flex-wrap:wrap;align-items:flex-start;gap:1.5rem;display:flex}.vi-crop-canvas{border:1px solid var(--vi-border);background:#000;flex:22rem;min-width:16rem;max-width:100%;line-height:0;display:inline-block;position:relative}.vi-crop-img{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;max-width:100%;height:auto;display:block}.vi-crop-img--blank{background:#000;width:100%;min-height:12rem}.vi-crop-overlay{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden}.vi-crop-box{box-sizing:border-box;border:1px solid var(--vi-accent);cursor:move;touch-action:none;background:#8ab4ff1f;position:absolute;box-shadow:0 0 0 100vmax #00000073}.vi-crop-box-active{background:#8ab4ff33}.vi-crop-handle{background:var(--vi-accent);border:1px solid var(--vi-surface);touch-action:none;border-radius:2px;width:12px;height:12px;position:absolute}.vi-crop-handle-nw{cursor:nwse-resize;top:-6px;left:-6px}.vi-crop-handle-ne{cursor:nesw-resize;top:-6px;right:-6px}.vi-crop-handle-sw{cursor:nesw-resize;bottom:-6px;left:-6px}.vi-crop-handle-se{cursor:nwse-resize;bottom:-6px;right:-6px}.vi-crop-controls{min-width:14rem;font-family:var(--vi-mono);flex-direction:column;flex:18rem;gap:1rem;display:flex}.vi-crop-presets{flex-wrap:wrap;align-items:center;gap:.4rem;display:flex}.vi-crop-lock{color:var(--vi-text-dim);align-items:center;gap:.35rem;margin-left:.25rem;font-size:.8rem;display:inline-flex}.vi-crop-fields{flex-wrap:wrap;align-items:flex-end;gap:.5rem;display:flex}.vi-crop-field{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;flex-direction:column;gap:.2rem;font-size:.72rem;display:flex}.vi-crop-field input{width:4.5rem;font-family:var(--vi-mono);color:var(--vi-text);background:var(--vi-surface-raised);border:1px solid var(--vi-border);border-radius:4px;padding:.3rem .4rem;font-size:.85rem}.vi-crop-native{color:var(--vi-text-dim);padding-bottom:.4rem;font-size:.75rem}.vi-region-list{border-top:1px solid var(--vi-border);margin:0;padding:0;list-style:none}.vi-region-item{border-bottom:1px solid var(--vi-border);align-items:center;gap:.6rem;padding:.45rem .1rem;font-size:.82rem;display:flex}.vi-region-idx{color:var(--vi-accent);font-family:var(--vi-mono);font-size:.78rem}.vi-region-dims{font-family:var(--vi-mono);color:var(--vi-text);margin-right:auto;font-size:.78rem}.vi-crop-run{flex-wrap:wrap;align-items:center;gap:.75rem 1rem;margin:1.25rem 0;display:flex}.vi-crop-hint,.vi-crop-actions{font-family:var(--vi-mono)}.vi-crop-hint{color:var(--vi-text-dim);font-size:.78rem}.vi-result-grid{border-top:1px solid var(--vi-border);grid-template-columns:repeat(auto-fill,minmax(13rem,1fr));gap:1rem;margin-top:1rem;padding-top:1.25rem;display:grid}.vi-result-card{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:6px;margin:0;overflow:hidden}.vi-result-head{border-bottom:1px solid var(--vi-border);font-family:var(--vi-mono);align-items:center;gap:.5rem;padding:.5rem .6rem;display:flex}.vi-status{text-transform:uppercase;letter-spacing:.05em;color:var(--vi-text-dim);margin-right:auto;font-size:.72rem}.vi-status-running,.vi-status-claimed,.vi-status-queued,.vi-status-pending,.vi-status-processing,.vi-status-streaming{color:var(--vi-accent)}.vi-status-done{color:#7fd88f}.vi-status-failed{color:#ff8a8a}.vi-result-body{justify-content:center;align-items:center;min-height:8rem;padding:.5rem;display:flex}.vi-result-img{max-width:100%;height:auto;display:block}.vi-result-pending{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.8rem}.vi-frames-layout{flex-wrap:wrap;align-items:flex-start;gap:1.5rem;display:flex}.vi-frames-rail{min-width:15rem;font-family:var(--vi-mono);border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:6px;flex-direction:column;flex:0 0 17rem;gap:1rem;padding:1rem;display:flex}.vi-knob{flex-direction:column;gap:.3rem;display:flex}.vi-knob>label,.vi-knob-label-row>label{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;font-size:.72rem}.vi-knob-row{flex-wrap:wrap;gap:.6rem;display:flex}.vi-knob-row>.vi-knob{flex:5.5rem;min-width:0}.vi-knob-label-row{justify-content:space-between;align-items:center;gap:.35rem;display:flex}.vi-knob-info{flex-shrink:0;display:inline-flex;position:relative}.vi-knob-info-btn{all:unset;cursor:pointer;color:var(--vi-text-dim);border-radius:3px;padding:.05rem .2rem;font-size:.8rem;line-height:1}.vi-knob-info-btn:focus-visible{color:var(--vi-accent);outline:1px solid var(--vi-accent);outline-offset:1px}.vi-knob-info-pop{z-index:5;width:max-content;max-width:11rem;font-size:.72rem;line-height:1.35;font-family:var(--vi-mono);color:var(--vi-text);background:var(--vi-surface);border:1px solid var(--vi-border);border-radius:4px;padding:.4rem .55rem;display:none;position:absolute;top:1.3rem;right:0;box-shadow:0 4px 12px #0006}.vi-knob-info:focus-within .vi-knob-info-pop,.vi-knob-info-open .vi-knob-info-pop{display:block}@media (hover:hover){.vi-knob-info-btn:hover{color:var(--vi-accent);outline:1px solid var(--vi-accent);outline-offset:1px}.vi-knob-info:hover .vi-knob-info-pop{display:block}}.vi-knob-input,.vi-knob-select{box-sizing:border-box;width:100%;font-family:var(--vi-mono);color:var(--vi-text);background:var(--vi-surface);border:1px solid var(--vi-border);border-radius:4px;padding:.35rem .45rem;font-size:.85rem}.vi-knob-input:focus,.vi-knob-select:focus{border-color:var(--vi-accent);outline:none}.vi-knob-input-sm{width:5.5rem}.vi-knob-input-compact{width:auto;max-width:9rem}.vi-knob-hint{color:var(--vi-text-dim);font-size:.72rem;line-height:1.35}.vi-knob-range{color:var(--vi-accent)}.vi-knob-flag{color:#ffcf8a;font-size:.72rem;line-height:1.35}.vi-knob-auto{color:var(--vi-accent);margin-top:.15rem;font-size:.72rem;line-height:1.35;display:block}.vi-knob-check{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;align-items:center;gap:.4rem;font-size:.72rem;display:inline-flex}.vi-knob-window{gap:.6rem;display:flex}.vi-knob-sub{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;flex-direction:column;gap:.2rem;font-size:.68rem;display:flex}.vi-frames-run{flex-wrap:wrap;align-items:center;gap:.6rem;display:flex}.vi-frames-main{flex:24rem;min-width:18rem}.vi-frames-toolbar{flex-wrap:wrap;align-items:center;gap:.5rem 1rem;margin-bottom:.9rem;display:flex}.vi-frames-summary{font-family:var(--vi-mono);color:var(--vi-text-dim);margin-right:auto;font-size:.8rem}.vi-frames-actions{flex-wrap:wrap;gap:.4rem;display:flex}.vi-frames-grid{scrollbar-width:thin;gap:.6rem;padding-bottom:.4rem;display:flex;overflow-x:auto}.vi-frame-cell{border:1px solid var(--vi-border);cursor:pointer;background:#000;border-radius:4px;flex:0 0 9rem;margin:0;padding:0;line-height:0;display:block;position:relative;overflow:hidden}.vi-frame-cell:hover{border-color:var(--vi-accent)}.vi-frame-cell-selected{border-color:var(--vi-accent);box-shadow:0 0 0 2px var(--vi-accent) inset}.vi-frame-img{aspect-ratio:16/9;object-fit:cover;width:100%;height:auto;display:block}.vi-frame-tag{font-family:var(--vi-mono);color:var(--vi-text);background:#0009;border-radius:3px;padding:.05rem .3rem;font-size:.65rem;line-height:1.2;position:absolute;top:.25rem;left:.25rem}.vi-frame-check{font-family:var(--vi-mono);color:var(--vi-surface);background:var(--vi-accent);border-radius:50%;justify-content:center;align-items:center;width:1.1rem;height:1.1rem;font-size:.7rem;line-height:1;display:flex;position:absolute;top:.25rem;right:.25rem}.vi-frame-saved{font-family:var(--vi-mono);color:#7fd88f;text-transform:uppercase;letter-spacing:.04em;background:#0009;border-radius:3px;padding:.05rem .3rem;font-size:.6rem;line-height:1.2;position:absolute;bottom:.25rem;left:.25rem}.vi-pager{justify-content:center;align-items:center;gap:.75rem;margin-top:1rem;display:flex}.vi-pager-label{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.78rem}.vi-gen-preview{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:6px;justify-content:center;align-items:center;min-height:14rem;margin-bottom:1.25rem;padding:1rem;display:flex}.vi-gen-result{flex-direction:column;align-items:center;gap:.6rem;margin:0;display:flex}.vi-gen-note{font-family:var(--vi-mono);color:#7fd88f;text-align:center;font-size:.72rem}.vi-gen-saved{color:var(--vi-text-dim)}.vi-gen-saved code{color:#7fd88f}.vi-gen-preview-pending{width:100%;font-family:var(--vi-mono);text-align:center;flex-direction:column;align-items:center;gap:.75rem;font-size:.9rem;display:flex}.vi-section-tabs{flex-direction:column;gap:1.1rem;min-width:0;display:flex}.vi-section-tablist{max-width:100%}.vi-section-tabpanel{min-width:0}.vi-section-tabpanel[hidden]{display:none}.vi-section-tabpanel:focus-visible,.vi-section-region:focus-visible{outline:2px solid var(--vi-accent);outline-offset:3px;border-radius:4px}.vi-section-region{min-width:0}.vi-section-region--work{flex-direction:column;gap:1rem;min-width:0;display:flex}.vi-section-addfile{min-width:0}.vi-addbar{flex-wrap:wrap;align-items:center;gap:.5rem .75rem;min-width:0;display:flex}.vi-addbar-name{font-family:var(--vi-mono);color:var(--vi-text);text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;font-size:.8rem;overflow:hidden}.vi-station-components{flex-direction:column;gap:1rem;min-width:0;display:flex}.vi-character-tools{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:8px;flex-direction:column;gap:.5rem;padding:.75rem;display:flex}.vi-character-tools-head{flex-direction:column;gap:.15rem;display:flex}.vi-station-footer,.vi-run-bar{border-top:1px solid var(--vi-border);z-index:5;background:var(--vi-surface);flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:1rem 1.5rem;padding:1rem 0;display:flex;position:sticky;bottom:0}.vi-station-footer-main{flex-direction:column;flex:20rem;gap:.75rem;min-width:0;display:flex}.vi-station-footer-run{flex-direction:column;flex:none;align-items:stretch;gap:.6rem;min-width:12rem;display:flex}.vi-station-footer.vi-studio-run{flex-direction:row;align-items:flex-start;gap:1rem 1.5rem;min-width:0}@media (min-width:62rem){.vi-section-tablist{display:none}.vi-section-tabs--beside{grid-template-columns:minmax(0,1fr) 17rem;align-items:start;gap:1.25rem 1.5rem;display:grid}.vi-section-tabs--stacked{flex-direction:column;display:flex}}@media (max-width:62rem){.vi-section-tablist{-webkit-overflow-scrolling:touch;overflow-x:auto}.vi-station-footer-run{width:100%;min-width:0}}.vi-gen-mode{border:1px solid var(--vi-border);border-radius:6px;gap:0;margin:0 0 1rem;display:inline-flex;overflow:hidden}.vi-gen-mode-btn{font-family:var(--vi-mono);background:var(--vi-surface-raised);color:var(--vi-text-dim);cursor:pointer;border:0;padding:.35rem 1.1rem;font-size:.8rem;line-height:1.2}.vi-gen-mode-btn+.vi-gen-mode-btn{border-left:1px solid var(--vi-border)}.vi-gen-mode-btn:hover{color:var(--vi-text)}.vi-gen-mode-btn-active{background:var(--vi-accent);color:var(--vi-surface);font-weight:500}.vi-scene-result{align-items:stretch;width:100%}.vi-scene-frame-cell{border:1px solid var(--vi-border);background:#000;border-radius:4px;flex:0 0 9rem;margin:0;padding:0;line-height:0;display:block;position:relative;overflow:hidden}.vi-scene-frame-img{aspect-ratio:16/9;object-fit:cover;width:100%;height:auto;display:block}.vi-scene-result{min-width:0;max-width:100%}.vi-scene-frames{overscroll-behavior-x:contain;flex-wrap:nowrap}.vi-frame-dl{width:1.3rem;height:1.3rem;font-family:var(--vi-mono);color:var(--vi-text);border:1px solid var(--vi-border);opacity:0;background:#000000a6;border-radius:4px;justify-content:center;align-items:center;font-size:.85rem;line-height:1;text-decoration:none;transition:opacity .12s;display:flex;position:absolute;top:.25rem;right:.25rem}.vi-scene-frame-cell:hover .vi-frame-dl,.vi-frame-dl:focus-visible{opacity:1}.vi-frame-dl:hover{border-color:var(--vi-accent);color:var(--vi-accent)}.vi-scene-clip{flex-direction:column;align-items:center;gap:.5rem;width:100%;display:flex}.vi-scene-clip .vi-btn{text-decoration:none}.vi-video-clip{justify-content:center;width:100%;display:flex}.vi-video-player{background:#000;border-radius:6px;width:100%;min-width:10rem;max-height:30rem}.vi-gen-composer{flex-direction:column;gap:.9rem;min-width:0;display:flex}.vi-gen-add-bar{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.vi-gen-req{border:1px solid var(--vi-border);background:var(--vi-surface);border-radius:6px;flex-wrap:wrap;align-items:center;gap:.6rem;padding:.5rem .7rem;display:flex}.vi-gen-req-line{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.78rem;line-height:1.4}.vi-gen-req-missing{border-color:var(--vi-accent)}.vi-gen-req-missing .vi-gen-req-line{color:var(--vi-text)}.vi-gen-add-run{align-items:center;gap:.5rem;margin-left:auto;display:flex}.vi-gen-run-notes{flex-direction:column;gap:.4rem;display:flex}.vi-gen-run-notes .vi-error{margin:0}.vi-gen-empty{font-family:var(--vi-mono);color:var(--vi-text-dim);border:1px dashed var(--vi-border);border-radius:6px;margin:0;padding:.9rem;font-size:.78rem;line-height:1.4}.vi-prompt-assist{border-bottom:1px solid var(--vi-border);flex-wrap:wrap;align-items:center;gap:.4rem .5rem;padding-bottom:.35rem;display:flex}.vi-prompt-assist-lead{font-family:var(--vi-mono);letter-spacing:.04em;text-transform:uppercase;color:var(--vi-text-dim);margin-right:.15rem;font-size:.7rem}.vi-prompt-assist-error{font-family:var(--vi-mono);color:#ff8a8a;align-items:center;gap:.35rem;font-size:.78rem;display:inline-flex}.vi-prompt-assist-dismiss{color:inherit;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:0 .25rem;font-size:.85rem;line-height:1;display:inline-flex}.vi-prompt-assist-dismiss:hover{color:var(--vi-text)}.vi-gen-picker{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:6px;flex-direction:column;gap:.75rem;padding:.9rem;display:flex}.vi-gen-video-upload{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}.vi-gen-picker-grid{scrollbar-width:thin;gap:.6rem;padding-bottom:.4rem;display:flex;overflow-x:auto}.vi-gen-pick-cell{border:1px solid var(--vi-border);background:var(--vi-surface);cursor:pointer;text-align:left;border-radius:4px;flex-direction:column;flex:0 0 8rem;gap:.3rem;margin:0;padding:.35rem;display:flex}.vi-gen-pick-cell:hover{border-color:var(--vi-accent)}.vi-gen-pick-thumb{aspect-ratio:16/9;object-fit:cover;border-radius:3px;width:100%;height:auto;display:block}.vi-gen-pick-videoicon{aspect-ratio:16/9;color:var(--vi-accent);background:#000;border-radius:3px;justify-content:center;align-items:center;font-size:1.4rem;display:flex}.vi-gen-pick-meta{font-family:var(--vi-mono);color:var(--vi-text-dim);word-break:break-word;font-size:.65rem;line-height:1.3}.vi-gen-pick-meta code{color:var(--vi-text)}.vi-gen-parts{flex-direction:column;gap:.6rem;margin:0;padding:0;list-style:none;display:flex}.vi-gen-part{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:6px;flex-direction:column;gap:.5rem;padding:.6rem .7rem;display:flex}.vi-gen-part-head{align-items:center;gap:.5rem;display:flex}.vi-gen-badge{font-family:var(--vi-mono);text-transform:uppercase;letter-spacing:.05em;border:1px solid var(--vi-border);color:var(--vi-text-dim);border-radius:3px;padding:.1rem .4rem;font-size:.65rem}.vi-gen-badge-text{color:var(--vi-accent);border-color:var(--vi-accent)}.vi-gen-badge-image{color:#7fd88f;border-color:#7fd88f}.vi-gen-badge-video{color:#ffcf8a;border-color:#ffcf8a}.vi-gen-part-idx{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.72rem}.vi-gen-part-actions{gap:.3rem;margin-left:auto;display:flex}.vi-gen-part-text{box-sizing:border-box;resize:vertical;width:100%;font-family:var(--vi-serif);color:var(--vi-text);background:var(--vi-surface);border:1px solid var(--vi-border);border-radius:4px;padding:.45rem .5rem;font-size:.95rem;line-height:1.4}.vi-gen-part-text:focus{border-color:var(--vi-accent);outline:none}.vi-gen-part-media{align-items:center;gap:.75rem;display:flex}.vi-gen-part-attach{flex-wrap:wrap;gap:.5rem;display:flex}.vi-gen-part-thumb{aspect-ratio:16/9;object-fit:cover;border:1px solid var(--vi-border);background:#000;border-radius:4px;flex:none;width:6rem;height:auto}.vi-gen-part-videoicon{aspect-ratio:16/9;border:1px solid var(--vi-border);width:6rem;color:var(--vi-accent);background:#000;border-radius:4px;flex:none;justify-content:center;align-items:center;font-size:1.4rem;display:flex}.vi-gen-part-meta{font-family:var(--vi-mono);color:var(--vi-text-dim);word-break:break-word;font-size:.72rem;line-height:1.4}.vi-gen-part-meta code{color:var(--vi-text)}.vi-gen-part-identity{border-top:1px dashed var(--vi-border);flex-direction:column;gap:.4rem;padding-top:.5rem;display:flex}.vi-gen-part-identity-row{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.vi-gen-identity-chip{font-family:var(--vi-mono);border:1px solid var(--vi-accent);color:var(--vi-accent);border-radius:3px;align-items:center;gap:.3rem;padding:.15rem .45rem;font-size:.7rem;display:inline-flex}.vi-gen-identity-chip-icon{font-size:.8rem;line-height:1}.vi-gen-identity-note{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.68rem;line-height:1.4}.vi-gen-identity-picker{flex-wrap:wrap;gap:.4rem;max-height:7.5rem;display:flex;overflow-y:auto}.vi-gen-identity-option{background:var(--vi-surface);border:1px solid var(--vi-border);color:var(--vi-text);cursor:pointer;border-radius:4px;align-items:center;gap:.35rem;padding:.25rem .4rem .25rem .25rem;font-size:.75rem;display:flex}.vi-gen-identity-option:hover:not(:disabled){border-color:var(--vi-accent)}.vi-gen-identity-option:disabled{opacity:.5;cursor:default}.vi-gen-identity-option-thumb{object-fit:cover;background:#000;border-radius:3px;flex:none;width:1.6rem;height:1.6rem}.vi-gen-identity-option-thumb-empty{color:#ffcf8a;justify-content:center;align-items:center;font-size:.85rem;display:flex}.vi-gen-identity-option-name{text-overflow:ellipsis;white-space:nowrap;max-width:7rem;overflow:hidden}.vi-gen-identity-views-head{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.vi-gen-identity-views{flex-wrap:nowrap;gap:.4rem;padding-bottom:.25rem;display:flex;overflow-x:auto}.vi-gen-identity-view{border:1px solid var(--vi-border);cursor:pointer;background:0 0;border-radius:4px;flex-direction:column;flex:none;align-items:center;gap:.25rem;padding:.3rem;display:flex}.vi-gen-identity-view:hover:not(:disabled),.vi-gen-identity-view:focus-visible{border-color:var(--vi-accent)}.vi-gen-identity-view:disabled{opacity:.5;cursor:default}.vi-gen-identity-view-thumb{object-fit:cover;background:#000;border-radius:3px;width:3.4rem;height:3.4rem;display:block}.vi-gen-identity-view-label{font-family:var(--vi-mono);color:var(--vi-text-dim);white-space:nowrap;text-overflow:ellipsis;max-width:5.2rem;font-size:.65rem;overflow:hidden}.vi-gen-identity-chip-view{font-family:var(--vi-mono);opacity:.75;margin-left:.3rem;font-size:.65rem}.vi-gen-parts-foot{margin-top:.6rem}.vi-gen-badge.vi-movie-badge{color:var(--vi-accent);border-color:var(--vi-accent)}.vi-movie-window{flex-wrap:wrap;align-items:flex-end}.vi-movie-window-span{font-family:var(--vi-mono);color:var(--vi-text-dim);padding-bottom:.35rem;font-size:.7rem}.vi-movie-timeline{flex-direction:column;gap:.7rem;display:flex}.vi-movie-timeline-foot{flex-wrap:wrap;align-items:center;gap:.7rem;display:flex}.vi-movie-summary{font-family:var(--vi-mono);color:var(--vi-accent);font-size:.75rem}.vi-movie-current{flex-direction:column;gap:.5rem;width:100%;margin-top:.5rem;display:flex}.vi-movie-seg-strip{overscroll-behavior-x:contain;flex-wrap:nowrap;gap:.5rem;width:100%;margin-top:.6rem;padding-bottom:.3rem;display:flex;overflow-x:auto}.vi-movie-seg{border:1px solid var(--vi-border);border-left:3px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:4px;flex-direction:column;flex:0 0 11rem;gap:.3rem;padding:.5rem .6rem;display:flex}.vi-movie-seg-idx{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.68rem}.vi-movie-seg-label{font-family:var(--vi-serif);color:var(--vi-text);font-size:.82rem;line-height:1.3}.vi-movie-seg-meta{font-family:var(--vi-mono);color:var(--vi-text-dim);align-items:center;gap:.4rem;font-size:.68rem;display:flex}.vi-movie-seg-status{text-transform:uppercase;letter-spacing:.04em}.vi-movie-seg-attempt{color:var(--vi-text-dim)}.vi-movie-score{text-align:center;color:#7fd88f;min-width:1.6rem;font-family:var(--vi-mono);border:1px solid #7fd88f;border-radius:3px;margin-left:auto;padding:.05rem .35rem;font-size:.72rem}.vi-movie-score.vi-movie-score-none{border-color:var(--vi-border);color:var(--vi-text-dim)}.vi-movie-seg-done{border-left-color:#7fd88f}.vi-movie-seg-generating,.vi-movie-seg-scoring,.vi-movie-seg-resumed{border-left-color:var(--vi-accent)}.vi-movie-seg-skipped{border-left-color:#ffcf8a}.vi-movie-seg-pending{border-left-color:var(--vi-border)}.vi-director-body{border-left:2px solid var(--vi-border);flex-direction:column;gap:.9rem;margin-top:.6rem;padding-left:.7rem;display:flex}.vi-audio-stage{border:1px solid var(--vi-border);background:#000;flex:22rem;min-width:16rem;position:relative}.vi-audio-canvas{width:100%;height:128px;display:block}.vi-audio-overlay{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden}.vi-audio-region{box-sizing:border-box;border-left:1px solid var(--vi-accent);border-right:1px solid var(--vi-accent);cursor:move;touch-action:none;background:#8ab4ff24;position:absolute;top:0;bottom:0;box-shadow:0 0 0 100vmax #00000073}.vi-audio-region-active{background:#8ab4ff38}.vi-audio-handle{background:var(--vi-accent);opacity:.85;touch-action:none;width:10px;position:absolute;top:0;bottom:0}.vi-audio-handle-start{cursor:ew-resize;left:-5px}.vi-audio-handle-end{cursor:ew-resize;right:-5px}.vi-audio-playhead{pointer-events:none;background:#ffcf8a;width:1px;position:absolute;top:0;bottom:0}.vi-audio-note{font-family:var(--vi-mono);color:var(--vi-text-dim);background:#0000008c;border-radius:3px;padding:.1rem .4rem;font-size:.72rem;position:absolute;bottom:.4rem;left:.5rem}.vi-audio-note-warn{color:#ffcf8a}.vi-audio-clip{flex-direction:column;align-items:center;gap:.4rem;width:100%;display:flex}.vi-audio-player{width:100%;min-width:10rem}.vi-studio{grid-template-columns:17rem minmax(0,1fr);grid-template-areas:"rail stage""prompt prompt";align-items:start;gap:1.25rem 1.5rem;min-height:0;display:grid}@media (max-width:62rem){.vi-studio{grid-template-columns:1fr;grid-template-areas:"rail""stage""prompt"}}.vi-studio__rail{grid-area:rail}.vi-studio-stage{flex-direction:column;grid-area:stage;gap:1rem;min-width:0;display:flex}.vi-studio-preview{border:1px solid var(--vi-border);text-align:center;background:#000;border-radius:8px;justify-content:center;align-items:center;min-height:22rem;padding:.75rem;display:flex;overflow:hidden}.vi-studio-preview img{object-fit:contain;max-width:100%;height:auto;max-height:30rem;display:block}.vi-studio-strip{min-width:0}.vi-studio-prompt{border-top:1px solid var(--vi-border);flex-wrap:wrap;grid-area:prompt;align-items:flex-start;gap:1rem 1.5rem;padding-top:1.1rem;display:flex}.vi-studio-prompt-main{flex-direction:column;flex:22rem;gap:.75rem;min-width:0;display:flex}.vi-studio-run{flex-direction:column;flex:none;align-items:stretch;gap:.6rem;min-width:12rem;display:flex}.vi-workbench{grid-template-columns:18rem minmax(0,1fr);align-items:stretch;gap:1.5rem;width:100%;max-width:96rem;height:100%;min-height:0;display:grid}.vi-workbench-main{flex-direction:column;min-width:0;height:100%;min-height:0;display:flex}.vi-workbench-body{flex:1;min-width:0;min-height:0;overflow-y:auto}.vi-hamburger{border:1px solid var(--vi-border);background:var(--vi-surface-raised);color:var(--vi-text);cursor:pointer;border-radius:6px;flex:none;justify-content:center;align-items:center;margin-right:.4rem;padding:.3rem .5rem;line-height:0;display:none}.vi-hamburger:hover{border-color:var(--vi-accent)}.vi-scrim{display:none}.vi-workbench-sidebar{border:1px solid var(--vi-border);background:var(--vi-surface-raised);scrollbar-width:thin;border-radius:8px;height:100%;min-height:0;padding:1rem;overflow:auto}.vi-subtabs{border-bottom:1px solid var(--vi-border);font-family:var(--vi-mono);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:.25rem;margin-bottom:.9rem;padding-bottom:.6rem;font-size:.85rem;display:flex}.vi-subtab{color:var(--vi-text-dim);border:1px solid #0000;border-radius:6px;padding:.35rem .8rem;text-decoration:none}.vi-subtab:hover{color:var(--vi-text)}.vi-subtab-active{color:var(--vi-text);background:var(--vi-surface);border-color:var(--vi-border)}.vi-lib{font-family:var(--vi-mono);flex-direction:column;gap:.9rem;display:flex}.vi-lib-header{border-bottom:1px solid var(--vi-border);align-items:center;gap:.5rem;padding-bottom:.6rem;display:flex}.vi-lib-title{font-family:var(--vi-serif);margin:0;font-size:1.05rem;font-weight:500}.vi-lib-count{color:var(--vi-text-dim);border:1px solid var(--vi-border);border-radius:999px;padding:.05rem .5rem;font-size:.72rem}.vi-lib-header .vi-btn{margin-left:auto}.vi-lib-empty{color:var(--vi-text-dim);border:1px dashed var(--vi-border);border-radius:6px;margin:0;padding:.9rem;font-size:.78rem;line-height:1.45}.vi-lib-list{flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;display:flex}.vi-lib-item{border:1px solid var(--vi-border);background:var(--vi-surface);border-radius:6px;flex-direction:column;gap:.5rem;padding:.6rem .7rem;display:flex}.vi-lib-top{align-items:center;gap:.5rem;display:flex}.vi-lib-badge{text-transform:uppercase;letter-spacing:.05em;border:1px solid var(--vi-border);color:var(--vi-accent);border-radius:3px;flex:none;padding:.1rem .4rem;font-size:.62rem}.vi-lib-name{color:var(--vi-text-dim);text-overflow:ellipsis;white-space:nowrap;font-size:.72rem;overflow:hidden}.vi-lib-thumb{border:1px solid var(--vi-border);background:#000;border-radius:4px;overflow:hidden}.vi-lib-thumb img,.vi-lib-thumb video{object-fit:contain;max-width:100%;height:auto;display:block}.vi-lib-placeholder{aspect-ratio:16/9;border:1px solid var(--vi-border);color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;background:#000;border-radius:4px;justify-content:center;align-items:center;font-size:.75rem;display:flex}.vi-lib-meta{color:var(--vi-text-dim);word-break:break-word;flex-wrap:wrap;gap:.5rem;font-size:.68rem;line-height:1.3;display:flex}.vi-lib-meta code{color:var(--vi-text)}.vi-lib-actions{flex-wrap:wrap;align-items:center;gap:.4rem;display:flex}.vi-lib-hint{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.04em;font-size:.62rem}.vi-lib-error{color:#ff8a8a;margin:0;font-size:.68rem;line-height:1.35}.vi-studio-src-selected{flex-wrap:wrap;align-items:center;gap:.6rem;display:flex}.vi-studio-src-row{border:1px solid var(--vi-border);background:var(--vi-surface);border-radius:6px;align-items:flex-start;gap:.6rem;margin-bottom:.4rem;padding:.4rem;display:flex}.vi-studio-src-thumb{border:1px solid var(--vi-border);background:#000;border-radius:4px;flex:none;width:104px;padding:0;position:relative;overflow:hidden}.vi-studio-src-thumb video{object-fit:cover;width:100%;height:58px;display:block}button.vi-studio-src-thumb{cursor:pointer;color:inherit}.vi-studio-src-thumb--playing{width:220px;max-width:100%}.vi-studio-src-thumb--playing video{object-fit:contain;height:auto}.vi-studio-src-play{color:#fff;pointer-events:none;background:#00000047;justify-content:center;align-items:center;font-size:1.3rem;display:flex;position:absolute;top:0;right:0;bottom:0;left:0}.vi-studio-src-thumb.vi-lib-placeholder{aspect-ratio:auto;height:58px}.vi-studio-src-body{flex-direction:column;flex:auto;gap:.35rem;min-width:0;display:flex}.vi-studio-src-meta{color:var(--vi-text-dim);font-variant-numeric:tabular-nums;word-break:break-word;flex-wrap:wrap;gap:.5rem;font-size:.72rem;line-height:1.3;display:flex}.vi-studio-src-meta code{color:var(--vi-text)}.vi-studio-src-actions{flex-wrap:wrap;gap:.35rem;display:flex}.vi-proc{font-family:var(--vi-mono);border-bottom:1px solid var(--vi-border);flex-direction:column;gap:.6rem;margin-bottom:.3rem;padding-bottom:.9rem;display:flex}.vi-proc-header{align-items:center;gap:.5rem;display:flex}.vi-proc-title{font-family:var(--vi-serif);margin:0;font-size:1.05rem;font-weight:500}.vi-proc-count{color:var(--vi-text-dim);border:1px solid var(--vi-border);border-radius:999px;padding:.05rem .5rem;font-size:.72rem}.vi-proc-header .vi-btn{margin-left:auto}.vi-proc-list{flex-direction:column;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.vi-proc-item{border:1px solid var(--vi-border);background:var(--vi-surface);border-radius:6px;flex-direction:column;gap:.35rem;padding:.5rem .6rem;display:flex}.vi-proc-link{color:inherit;flex-direction:column;gap:.25rem;text-decoration:none;display:flex}.vi-proc-link:hover .vi-proc-station{color:var(--vi-accent)}.vi-proc-top{align-items:center;gap:.45rem;display:flex}.vi-proc-station{color:var(--vi-text);font-size:.74rem}.vi-proc-top .vi-status{margin-right:0}.vi-proc-progress{color:var(--vi-text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:.68rem}.vi-proc-elapsed{color:var(--vi-text-dim);font-variant-numeric:tabular-nums;margin-left:auto;font-size:.7rem}.vi-proc-label{color:var(--vi-text-dim);text-overflow:ellipsis;white-space:nowrap;font-size:.68rem;overflow:hidden}.vi-proc-msg{color:var(--vi-text-dim);flex-wrap:wrap;align-items:center;gap:.4rem;font-size:.68rem;line-height:1.35;display:flex}.vi-proc-err{color:#ff8a8a}.vi-proc-btn{flex:none}.vi-proc-spinner{border:2px solid var(--vi-border);border-top-color:var(--vi-accent);border-radius:50%;flex:none;width:.72rem;height:.72rem;animation:.7s linear infinite vi-proc-spin}.vi-proc-dot{border:2px solid var(--vi-border);border-radius:50%;flex:none;width:.72rem;height:.72rem}@keyframes vi-proc-spin{to{transform:rotate(360deg)}}.vi-proc-toggle{width:1.1rem;height:1.1rem;color:var(--vi-text-dim);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.vi-proc-toggle:hover .vi-proc-caret{color:var(--vi-accent)}.vi-proc-caret{font-size:.7rem;line-height:1}.vi-proc-stall-dot{background:#ffcf8a;border-radius:50%;flex:none;width:.72rem;height:.72rem;animation:1.6s ease-in-out infinite vi-proc-stall-pulse}.vi-proc-stall-badge{text-transform:uppercase;letter-spacing:.05em;color:#ffcf8a;border:1px solid #ffcf8a;border-radius:999px;padding:.02rem .4rem;font-size:.62rem}@keyframes vi-proc-stall-pulse{0%,to{opacity:1}50%{opacity:.35}}.vi-proc-detail{border-top:1px solid var(--vi-border);flex-direction:column;gap:.45rem;padding:.5rem 0 .15rem;display:flex}.vi-proc-progbar-row{align-items:center;gap:.5rem;display:flex}.vi-proc-progbar{background:var(--vi-surface-raised);border:1px solid var(--vi-border);border-radius:999px;flex:auto;height:.4rem;position:relative;overflow:hidden}.vi-proc-progbar-fill{background:var(--vi-accent);width:0;height:100%;transition:width .4s;display:block}.vi-proc-progbar-indeterminate .vi-proc-progbar-fill{width:35%;animation:1.3s ease-in-out infinite vi-proc-indeterminate}.vi-proc-progbar-stalled .vi-proc-progbar-fill{background:#ffcf8a;animation:none}.vi-proc-progbar-stalled.vi-proc-progbar-indeterminate .vi-proc-progbar-fill{opacity:.5;width:100%}@keyframes vi-proc-indeterminate{0%{transform:translate(-120%)}to{transform:translate(320%)}}.vi-proc-stage{color:var(--vi-text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:.66rem}.vi-proc-detail-msg{color:var(--vi-text);word-break:break-word;margin:0;font-size:.68rem;line-height:1.35}.vi-proc-detail-meta{align-items:center;gap:.4rem;display:flex}.vi-proc-lastmove{color:var(--vi-text-dim);font-variant-numeric:tabular-nums;font-size:.66rem}.vi-proc-lastmove-stalled{color:#ffcf8a}.vi-proc-log{background:var(--vi-surface-raised);border:1px solid var(--vi-border);max-height:9rem;font-family:var(--vi-mono);color:var(--vi-text-dim);white-space:pre-wrap;word-break:break-word;border-radius:4px;margin:0;padding:.4rem .5rem;font-size:.64rem;line-height:1.4;overflow:auto}.vi-proc-log-empty{color:var(--vi-text-dim);margin:0;font-size:.66rem;font-style:italic}@media (max-width:62rem){.vi-workbench{grid-template-columns:1fr}.vi-hamburger{display:inline-flex}.vi-workbench-sidebar{z-index:40;border-radius:0;width:min(20rem,85vw);height:100dvh;transition:transform .16s;position:fixed;top:0;left:0;overflow:auto;transform:translate(-100%);box-shadow:0 0 2.5rem #0009}.vi-workbench.is-open .vi-workbench-sidebar{transform:translate(0)}.vi-scrim{z-index:35;background:#00000073;border:0;display:block;position:fixed;top:0;right:0;bottom:0;left:0}}.vi-side-tabs{width:100%;margin:0 0 .9rem;display:flex}.vi-side-tabs .vi-gen-mode-btn{flex:1 1 0;justify-content:center;align-items:center;gap:.4rem;min-width:0;padding:.4rem .6rem;display:inline-flex}.vi-side-tab-badge{border:1px solid;border-radius:999px;flex:none;padding:.1rem .35rem;font-size:.62rem;line-height:1}.vi-proc{border-bottom:0;margin-bottom:0;padding-bottom:0}.vi-lib-group{border:1px solid var(--vi-border);background:var(--vi-surface);border-radius:6px;flex-direction:column;gap:.5rem;padding:.6rem .7rem;display:flex}.vi-lib-group-toggle{width:100%;color:inherit;font-family:var(--vi-mono);cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:.5rem;padding:0;display:flex}.vi-lib-group-caret{color:var(--vi-text-dim);flex:none;font-size:.7rem}.vi-lib-group-toggle:hover .vi-lib-group-caret{color:var(--vi-accent)}.vi-lib-group-model{min-width:0;color:var(--vi-text);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:.72rem;overflow:hidden}.vi-lib-group-toggle .vi-lib-count{flex:none;margin-left:auto}.vi-lib-group-head{align-items:flex-start;gap:.5rem;display:flex}.vi-lib-group-thumb{border:1px solid var(--vi-border);background:#000;border-radius:4px;flex:none;width:48px;height:48px;overflow:hidden}.vi-lib-group-thumb img,.vi-lib-group-thumb video{object-fit:cover;width:100%;height:100%;display:block}.vi-lib-group-prompt{min-width:0;color:var(--vi-text-dim);-webkit-line-clamp:2;-webkit-box-orient:vertical;flex:auto;margin:0;font-size:.7rem;line-height:1.4;display:-webkit-box;overflow:hidden}.vi-lib-group-list{border-left:1px solid var(--vi-border);margin-top:.2rem;padding-left:.6rem}.vi-comfy{flex-direction:column;gap:.75rem;height:100%;min-height:0;display:flex}.vi-comfy-head{flex:none}.vi-comfy-head h2{margin:.3rem 0 .4rem;font-size:1.6rem;font-weight:500}.vi-comfy-head .station-blurb{margin:0;font-size:.9rem}.vi-comfy-head code{font-family:var(--vi-mono);color:var(--vi-text);font-size:.82em}.vi-comfy-bar{flex-wrap:wrap;flex:none;align-items:flex-end;gap:.6rem .75rem;display:flex}.vi-comfy-field{flex-direction:column;flex:20rem;gap:.25rem;min-width:0;display:flex}.vi-id-settings>.vi-comfy-field,.vi-id-settings>div{flex:none}.vi-id-settings-disclosure[open]{flex-direction:column;gap:.4rem;display:flex}.vi-id-settings-disclosure>summary{margin-bottom:.2rem}.vi-comfy-label{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;font-size:.72rem}.vi-comfy-input{width:100%}.vi-comfy-input[aria-invalid=true]{border-color:#ff8a8a}.vi-comfy-bar-actions{align-items:center;gap:.5rem;display:flex}.vi-comfy-open-disabled{opacity:.45;cursor:not-allowed;text-decoration:none}.vi-comfy-warn{color:#ffcf8a;font-family:var(--vi-mono);background:#ffcf8a14;border:1px solid #6b5626;border-radius:6px;flex:none;margin:0;padding:.55rem .7rem;font-size:.8rem;line-height:1.45}.vi-comfy-warn code{color:#ffe3b8}.vi-comfy-frame{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:8px;flex:auto;min-height:24rem;overflow:hidden}.vi-comfy-iframe{background:#fff;border:0;width:100%;height:100%;min-height:24rem;display:block}.vi-comfy-empty{border:2px dashed var(--vi-border);background:var(--vi-surface-raised);min-height:22rem;color:var(--vi-text-dim);font-family:var(--vi-mono);text-align:center;border-radius:8px;flex-direction:column;flex:auto;justify-content:center;align-items:center;gap:.4rem;padding:1.5rem;display:flex}.vi-comfy-empty-title{color:var(--vi-text);margin:0;font-size:1rem}.vi-comfy-empty-sub{max-width:32rem;margin:0;font-size:.82rem;line-height:1.5}.vi-comfy-empty code{color:var(--vi-text)}.vi-comfy-hint{color:var(--vi-text-dim);font-family:var(--vi-mono);flex:none;margin:0;font-size:.75rem;line-height:1.45}.vi-comfy-hint code{color:var(--vi-text)}.vi-studio-plane{flex-direction:column;gap:1rem;min-width:0;display:flex}.vi-studio-plane-eyebrow{font-family:var(--vi-mono);color:var(--vi-accent);letter-spacing:.06em;text-transform:uppercase;margin:0 0 .6rem;font-size:.75rem;display:block}.vi-studio-plane-eyebrow-sub{color:var(--vi-text-dim);letter-spacing:normal;text-transform:none;font-size:.72rem}.vi-studio-plane-sep{border-top:1px solid var(--vi-border);margin-top:.25rem;padding-top:1.25rem}.vi-studio-viewer{border:1px solid var(--vi-border);background:#000;border-radius:8px;justify-content:center;align-items:center;min-height:22rem;padding:.75rem;display:flex;overflow:hidden}.vi-studio-viewer video{border-radius:.35rem;max-width:100%;height:auto;max-height:30rem;display:block}.vi-studio-workbench{flex-direction:column;gap:1.1rem;min-width:0;display:flex}.vi-studio-workflow{border-bottom:1px solid var(--vi-border);grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem;padding-bottom:.7rem;display:grid}.vi-studio-workflow button{text-align:left;border:1px solid var(--vi-border);background:var(--vi-surface-raised);min-width:0;color:var(--vi-text-dim);cursor:pointer;border-radius:8px;flex-direction:column;gap:.25rem;padding:.65rem .75rem;display:flex}.vi-studio-workflow button:hover,.vi-studio-workflow button:focus-visible{border-color:var(--vi-accent);color:var(--vi-text)}.vi-studio-workflow-step{color:var(--vi-text);font-family:var(--vi-mono);font-size:.76rem;font-weight:600}.vi-studio-workflow-target{min-width:0;scroll-margin-top:1rem}.vi-studio-bin-empty{border:1px dashed var(--vi-border);color:var(--vi-text-dim);border-radius:8px;margin:0;padding:.7rem .85rem;font-size:.78rem}@media (max-width:35rem){.vi-studio-workflow{grid-template-columns:1fr}}@media (min-width:62rem){.vi-studio-workbench{max-width:62rem}}.vi-studio-workbench__sidebar{flex-direction:column;gap:.75rem;min-width:0;display:flex}.vi-studio-workbench__generator{flex-direction:column;gap:1.1rem;min-width:0;display:flex}.vi-studio-tabpanel{min-width:0}.vi-studio-tablist{-webkit-overflow-scrolling:touch;max-width:100%;overflow-x:auto}.vi-studio-settings-host{min-width:0}.vi-studio-composer{flex-direction:column;gap:.6rem;min-width:0;display:flex}.vi-side-settings{flex-direction:column;gap:.75rem;min-width:0;padding:.25rem 0 .5rem;display:flex}.vi-side-settings .vi-studio-knobs{grid-template-columns:repeat(2,minmax(0,1fr))}.vi-proc-extra:not(:empty){border-top:1px solid var(--vi-border,#80808040);margin-top:.5rem;padding-top:.5rem}.vi-studio-required-callout{color:var(--vi-accent,#d98a2b);background:var(--vi-accent-soft,#d98a2b1f);border:1px solid var(--vi-accent,#d98a2b80);border-radius:.4rem;margin:0;padding:.5rem .7rem;font-size:.82rem;line-height:1.4}.vi-studio-templates{min-width:0}.vi-studio-card-grid{flex-wrap:wrap;gap:.5rem;min-width:0;display:flex}.vi-knob-headline{font-family:var(--vi-mono);color:var(--vi-text);margin:0 0 .5rem;font-size:.85rem}.vi-knob-subhead{font-family:var(--vi-mono);color:var(--vi-text);margin:.9rem 0 .4rem;font-size:.8rem}.vi-knob-headline-sub{color:var(--vi-text-dim);font-size:.75rem;font-weight:400}.vi-studio-knobs{grid-template-columns:repeat(auto-fit,minmax(8.5rem,1fr));align-items:start;gap:.85rem 1rem;min-width:0;display:grid}.vi-studio-knob-wide{grid-column:1/-1;min-width:0}.vi-studio-shape,.vi-goal-composer{min-width:0}.vi-goal-composer-field{min-width:0;position:relative}.vi-goal-composer-input{box-sizing:border-box;resize:vertical;width:100%}.vi-goal-composer-toolbar{flex-wrap:wrap;gap:.35rem;margin-top:.35rem;display:flex}.vi-goal-composer-chips{flex-wrap:wrap;gap:.4rem;margin-top:.4rem;display:flex}.vi-goal-composer-chip{border:1px solid var(--vi-border);background:var(--vi-surface-raised);color:var(--vi-text-dim);border-radius:4px;align-items:center;gap:.3rem;max-width:100%;padding:.15rem .35rem;font-size:.72rem;display:inline-flex}.vi-goal-composer-chip-thumb{object-fit:cover;background:#000;border-radius:3px;width:1.6rem;height:1.6rem}.vi-goal-composer-chip-label{text-overflow:ellipsis;white-space:nowrap;max-width:8rem;overflow:hidden}.vi-goal-composer-chip-x{color:var(--vi-text-dim);cursor:pointer;background:0 0;border:0;padding:0 .15rem;font-size:.8rem;line-height:1}.vi-goal-composer-chip-x:hover{color:var(--vi-text)}.vi-studio-active{min-width:0}.vi-studio-active-list{flex-direction:column;gap:.5rem;margin:.5rem 0 0;padding:0;list-style:none;display:flex}.vi-studio-active-row{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:6px;flex-wrap:wrap;align-items:center;gap:.4rem .6rem;min-width:0;padding:.5rem .6rem;display:flex}.vi-studio-active-head{align-items:center;gap:.4rem;min-width:0;display:flex}.vi-studio-active-id{font-family:var(--vi-mono);color:var(--vi-text);font-size:.8rem}.vi-studio-active-meta{font-family:var(--vi-mono);color:var(--vi-text-dim);font-variant-numeric:tabular-nums;gap:.4rem;margin-right:auto;font-size:.72rem;display:flex}.vi-job-progress{flex-basis:100%;order:2;align-items:center;gap:.5rem;width:100%;min-width:0;display:flex}.vi-job-progress-track{background:var(--vi-border);border-radius:999px;flex:auto;height:4px;overflow:hidden}.vi-job-progress-fill{background:var(--vi-accent,#d08b3c);border-radius:999px;height:100%;transition:width .4s linear}.vi-job-progress-label{font-family:var(--vi-mono);color:var(--vi-text-dim);font-variant-numeric:tabular-nums;flex:none;font-size:.7rem}.vi-job-latest{width:100%;min-width:0;font-family:var(--vi-mono);color:var(--vi-text-dim);word-break:break-word;flex-basis:100%;order:2;margin:.15rem 0 0;font-size:.72rem}.vi-job-filter{margin:0 0 .5rem;display:block}.vi-studio-active-row>.vi-btn{order:1}.vi-timeline-panel{border-top:1px solid var(--vi-border);flex-basis:100%;order:2;width:100%;min-width:0;margin-top:.35rem;padding-top:.45rem}.vi-timeline-toggle{cursor:pointer;color:var(--vi-text-dim);background:0 0;border:none;padding:0 .15rem;font-size:.8rem;line-height:1}.vi-timeline-toggle:hover{color:var(--vi-text)}.vi-timeline-caret{width:.7rem;display:inline-block}.vi-timeline-stall-badge{text-transform:uppercase;letter-spacing:.05em;color:#ffcf8a;border:1px solid #ffcf8a;border-radius:999px;padding:.02rem .4rem;font-size:.62rem}.vi-timeline{flex-direction:column;gap:.5rem;font-size:.8rem;display:flex}.vi-timeline-empty{color:var(--vi-text-dim);margin:0;font-size:.78rem}.vi-timeline-failure{color:#ff8a8a;background:#ff5a5a1a;border:1px solid #ff8a8a80;border-radius:.4rem;padding:.4rem .55rem;line-height:1.4}.vi-timeline-retry{color:var(--vi-text-dim);font-weight:400}.vi-timeline-failmsg{color:var(--vi-text);word-break:break-word;font-family:var(--vi-mono);margin-top:.2rem;font-size:.74rem}.vi-timeline-current{background:#8ab4ff1a;border-radius:.4rem;flex-wrap:wrap;align-items:baseline;gap:.35rem .5rem;padding:.3rem .5rem;display:flex}.vi-timeline-current-stalled{background:#ffcf8a1f}.vi-timeline-current-label{text-transform:uppercase;letter-spacing:.06em;color:var(--vi-accent);font-size:.6rem}.vi-timeline-current-stalled .vi-timeline-current-label{color:#ffcf8a}.vi-timeline-current-text{color:var(--vi-text);font-weight:500}.vi-timeline-stall{color:#ffcf8a;font-size:.72rem}.vi-timeline-move{color:var(--vi-text-dim);font-size:.72rem}.vi-timeline-list{flex-direction:column;gap:.3rem;margin:0;padding:0;list-style:none;display:flex}.vi-timeline-item{align-items:baseline;gap:.5rem;min-width:0;display:flex}.vi-timeline-mark{text-align:center;flex:none;width:1rem;font-size:.7rem;line-height:1.3}.vi-timeline-mark-done{color:var(--vi-accent);opacity:.7}.vi-timeline-mark-current{color:var(--vi-accent);animation:1.4s ease-in-out infinite vi-timeline-pulse}.vi-timeline-mark-stalled{color:#ffcf8a;animation:none}.vi-timeline-mark-fail{color:#ff8a8a}@keyframes vi-timeline-pulse{0%,to{opacity:1}50%{opacity:.35}}.vi-timeline-body{flex-direction:column;flex:auto;min-width:0;display:flex}.vi-timeline-stage{color:var(--vi-text);text-transform:capitalize}.vi-timeline-count{color:var(--vi-text-dim);font-variant-numeric:tabular-nums}.vi-timeline-detail{color:var(--vi-text-dim);word-break:break-word;font-size:.74rem;font-family:var(--vi-mono)}.vi-timeline-time{color:var(--vi-text-dim);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:.68rem}.vi-placement{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.72rem}.vi-placement-external{color:var(--vi-accent,#d08b3c);font-weight:600}.vi-status-awaiting_capacity{color:var(--vi-accent,#d08b3c);background:#d08b3c29;border:1px solid #d08b3c66}.vi-studio-viewer-wrap{min-width:0}.vi-studio-item-strip{flex-direction:column;gap:.6rem;margin:.8rem 0;display:flex}.vi-studio-item{border:1px solid var(--vi-border);background:var(--vi-surface-raised);border-radius:8px;overflow:hidden}.vi-studio-item-body{align-items:flex-start;gap:.8rem;padding:.6rem;display:flex}.vi-studio-item-media{border:1px solid var(--vi-border);background:#000;border-radius:6px;flex:none;width:140px;max-width:40%;overflow:hidden}.vi-studio-item-img{object-fit:cover;width:100%;height:84px;display:block}.vi-studio-item-audio{width:100%;padding:.3rem;display:block}.vi-studio-item-meta{flex-direction:column;flex:auto;gap:.5rem;min-width:0;display:flex}.vi-studio-item-prov{color:var(--vi-text-dim);flex-wrap:wrap;align-items:center;gap:.4rem;font-size:.82rem;display:flex}.vi-studio-item-prov-origin{color:var(--vi-text);font-weight:600}.vi-studio-item-prov-kind{font-family:var(--vi-mono);border:1px solid var(--vi-border);border-radius:999px;padding:.05rem .35rem;font-size:.72rem}.vi-studio-item-prov-parent{font-family:var(--vi-mono);text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-size:.72rem;overflow:hidden}.vi-studio-item-ops{flex-wrap:wrap;gap:.4rem;display:flex}.vi-studio-item-drawer{border-top:1px solid var(--vi-border);background:var(--vi-surface);padding:.6rem}.vi-studio-item-drawer-head{justify-content:space-between;align-items:center;gap:.6rem;margin-bottom:.5rem;display:flex}.vi-studio-item-drawer-title{color:var(--vi-text);font-weight:600}.vi-turntable-stage{cursor:grab}.vi-turntable-stage:active{cursor:grabbing}.vi-turntable-stage:focus-visible{outline:2px solid var(--vi-accent);outline-offset:2px}.vi-turntable-scrub{accent-color:var(--vi-accent)}.vi-side-toolbar{border-bottom:1px solid var(--vi-border);flex-wrap:wrap;gap:.5rem;margin-bottom:.9rem;padding-bottom:.9rem;display:flex}.vi-console-toggle,.vi-share-toggle,.vi-comfy-toggle,.vi-active-toggle{letter-spacing:.01em;flex:auto;justify-content:center;align-items:center;gap:.4rem;width:auto;min-width:0;display:inline-flex}.vi-console-scrim{z-index:90;cursor:pointer;background:#0000008c;border:0;position:fixed;top:0;right:0;bottom:0;left:0}.vi-console-panel{z-index:100;background:var(--vi-surface-raised);border-left:1px solid var(--vi-border);flex-direction:column;height:100dvh;transition:width .16s;display:flex;position:fixed;top:0;right:0;box-shadow:0 0 3rem #0009}.vi-console-panel-half{width:min(70vw,84rem);min-width:min(22rem,100vw)}.vi-console-panel-full{width:100vw}.vi-console-panel-bar{border-bottom:1px solid var(--vi-border);font-family:var(--vi-mono);flex-wrap:wrap;flex:none;justify-content:space-between;align-items:center;gap:.5rem .6rem;padding:.6rem .8rem;display:flex}.vi-drawer-tabs{flex:none;margin:0}.vi-console-panel-title{font-family:var(--vi-serif);color:var(--vi-text);font-weight:500}.vi-console-panel-actions{align-items:center;gap:.4rem;display:flex}.vi-drawer-tabpanel{flex-direction:column;flex:auto;min-height:0;display:flex}.vi-drawer-tabpanel[hidden]{display:none}.vi-console-iframe{background:#fff;border:0;flex:auto;width:100%;height:100%;display:block}@media (max-width:62rem){.vi-console-panel-half,.vi-console-panel-full{width:100vw}}.vi-share-scrim{z-index:90;cursor:pointer;background:#0000008c;border:0;position:fixed;top:0;right:0;bottom:0;left:0}.vi-share-panel{z-index:100;background:var(--vi-surface-raised);border:1px solid var(--vi-border);border-radius:.5rem;flex-direction:column;width:min(34rem,92vw);max-height:88dvh;display:flex;position:fixed;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%);box-shadow:0 0 3rem #0009}.vi-share-bar{border-bottom:1px solid var(--vi-border);justify-content:space-between;align-items:center;gap:.6rem;padding:.8rem 1rem;display:flex}.vi-share-title{font-family:var(--vi-serif);color:var(--vi-text);font-size:1.05rem}.vi-share-body{flex-direction:column;gap:.9rem;padding:1rem;display:flex}.vi-share-hint{color:var(--vi-text-dim);margin:0;font-size:.85rem;line-height:1.45}.vi-share-form{flex-wrap:wrap;align-items:flex-end;gap:.6rem;display:flex}.vi-share-field{color:var(--vi-text-dim);flex-direction:column;flex:10rem;gap:.25rem;font-size:.78rem;display:flex}.vi-share-field input,.vi-share-field select{background:var(--vi-surface);color:var(--vi-text);border:1px solid var(--vi-border);font-family:var(--vi-mono);border-radius:.35rem;padding:.4rem .5rem;font-size:.85rem}.vi-share-error{color:#ff9b9b;margin:0;font-size:.85rem}.vi-share-minted{border:1px solid var(--vi-accent);background:#8ab4ff0f;border-radius:.4rem;padding:.7rem}.vi-share-minted-note{color:var(--vi-accent);margin:0 0 .5rem;font-size:.8rem}.vi-share-minted-row{gap:.5rem;display:flex}.vi-share-link{background:var(--vi-surface);min-width:0;color:var(--vi-text);border:1px solid var(--vi-border);font-family:var(--vi-mono);border-radius:.35rem;flex:auto;padding:.4rem .5rem;font-size:.8rem}.vi-share-list-title{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.06em;margin:0 0 .4rem;font-size:.8rem}.vi-share-list ul{flex-direction:column;gap:.4rem;margin:0;padding:0;list-style:none;display:flex}.vi-share-list-item{align-items:center;gap:.5rem;font-size:.82rem;display:flex}.vi-share-item-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--vi-text);flex:auto;overflow:hidden}.vi-share-item-prefix{font-family:var(--vi-mono);color:var(--vi-text-dim);font-size:.75rem}.vi-share-item-exp{color:var(--vi-text-dim);font-size:.75rem}.vi-share-item-exp-dead{color:#ff9b9b}.vi-assistlog{border:1px solid var(--vi-border);background:var(--vi-surface-raised);font-family:var(--vi-mono);color:var(--vi-text);border-radius:8px;margin-top:14px;font-size:12px}.vi-assistlog-toolbar{border-bottom:1px solid var(--vi-border);align-items:center;gap:8px;padding:7px 10px;display:flex}.vi-assistlog-collapse{color:var(--vi-text);font-family:var(--vi-mono);letter-spacing:.04em;text-transform:uppercase;cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.vi-assistlog-spacer{flex:auto}.vi-assistlog-dot{background:var(--vi-text-dim);border-radius:50%;width:8px;height:8px}.vi-assistlog-dot--live{background:#6ee7a8}.vi-assistlog-dot--connecting{background:#ffd479}.vi-assistlog-dot--disconnected{background:#ff9b9b}.vi-assistlog-conn{color:var(--vi-text-dim)}.vi-assistlog-filter{background:var(--vi-surface);border:1px solid var(--vi-border);color:var(--vi-text);font-family:var(--vi-mono);border-radius:5px;min-width:180px;padding:3px 7px;font-size:12px}.vi-assistlog-reconnect,.vi-assistlog-count{color:var(--vi-text-dim);font-family:var(--vi-mono);background:0 0;border:none;font-size:12px}.vi-assistlog-reconnect{cursor:pointer;text-decoration:underline}.vi-assistlog-error,.vi-assistlog-empty{color:var(--vi-text-dim);padding:10px}.vi-assistlog-error{color:#ff9b9b}.vi-assistlog-list{max-height:340px;overflow-y:auto}.vi-assistlog-row{border-bottom:1px solid var(--vi-border)}.vi-assistlog-row:last-child{border-bottom:none}.vi-assistlog-head{width:100%;color:var(--vi-text);font-family:var(--vi-mono);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:flex}.vi-assistlog-head:hover{background:#ffffff08}.vi-assistlog-caret{color:var(--vi-text-dim);width:10px}.vi-assistlog-time{color:var(--vi-text-dim)}.vi-assistlog-model{color:var(--vi-accent);white-space:nowrap;text-overflow:ellipsis;max-width:260px;overflow:hidden}.vi-assistlog-mode{color:var(--vi-text-dim)}.vi-assistlog-chip{color:#ffd479;border:1px solid #5a4a20;border-radius:4px;padding:0 5px;font-size:11px}.vi-assistlog-elapsed{color:var(--vi-text-dim)}.vi-assistlog-badge{letter-spacing:.03em;text-transform:uppercase;border:1px solid var(--vi-border);color:var(--vi-text-dim);border-radius:4px;padding:1px 7px;font-size:11px}.vi-assistlog-badge--ok{color:#052e18;background:#6ee7a8;border-color:#6ee7a8}.vi-assistlog-badge--warn{color:#3a2c05;background:#ffd479;border-color:#ffd479}.vi-assistlog-badge--err{color:#2e0606;background:#ff9b9b;border-color:#ff9b9b}.vi-assistlog-errline{color:#ff9b9b;white-space:nowrap;text-overflow:ellipsis;padding:0 10px 6px 28px;overflow:hidden}.vi-assistlog-detail{flex-direction:column;gap:8px;padding:4px 10px 12px 28px;display:flex}.vi-assistlog-field{flex-direction:column;gap:3px;display:flex}.vi-assistlog-label{color:var(--vi-text-dim);letter-spacing:.04em;text-transform:uppercase;font-size:11px}.vi-assistlog-raw,.vi-assistlog-text,.vi-assistlog-reasoning,.vi-assistlog-errbox{background:var(--vi-surface);border:1px solid var(--vi-border);white-space:pre-wrap;word-break:break-word;max-height:300px;font-family:var(--vi-mono);border-radius:5px;margin:0;padding:7px 9px;font-size:12px;line-height:1.5;overflow-y:auto}.vi-assistlog-raw{color:var(--vi-text)}.vi-assistlog-text{color:#6ee7a8}.vi-assistlog-reasoning{color:var(--vi-text-dim)}.vi-assistlog-errbox{color:#ff9b9b}.vi-gen-tester{border-top:1px solid var(--vi-border);flex-direction:column;gap:.6rem;margin-top:.8rem;padding-top:.8rem;display:flex}.vi-gen-tester-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.vi-gen-tester-rows{flex-direction:column;gap:.6rem;margin:0;padding:0;list-style:none;display:flex}.vi-knob-row>.vi-knob.vi-gen-tester-neg,.vi-knob-strip-line>.vi-gen-tester-neg{flex:100%}.vi-knob-strip{flex-direction:column;gap:.3rem;display:flex}.vi-knob-strip-line{flex-wrap:wrap;align-items:center;gap:.35rem .8rem;display:flex}.vi-knob-mini-group{align-items:center;gap:.3rem;min-width:0;display:inline-flex}.vi-knob-mini-label{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;font-size:.72rem}.vi-knob-input.vi-knob-mini{box-sizing:content-box;text-align:center;width:5ch;padding:.2rem .3rem;font-size:.8rem}.vi-knob-input.vi-knob-mini-seed{text-align:left;width:7ch}.vi-knob-mini-x{color:var(--vi-text-dim);font-size:.75rem}.vi-knob-select-mini{width:auto;max-width:16rem;padding:.2rem .3rem;font-size:.8rem}.vi-knob-input.vi-knob-mini-neg{flex:8rem;width:auto;min-width:0;padding:.2rem .3rem;font-size:.8rem}.vi-knob-strip-flags{flex-direction:column;gap:.15rem;display:flex}.vi-carry-tick{width:.75rem;height:.75rem;accent-color:var(--vi-accent);cursor:pointer;flex:none;margin:0}.vi-carry-tick:not(:checked){opacity:.5}.vi-carry-tick-label{color:var(--vi-text-dim);text-transform:uppercase;letter-spacing:.05em;cursor:pointer;align-items:center;gap:.3rem;font-size:.72rem;display:inline-flex}.vi-gen-negative-wrap{flex-direction:column;gap:.25rem;display:flex}.vi-gen-tester-result .vi-result-img{object-fit:contain;width:auto;max-height:14rem}.vi-gen-tester-actions{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.vi-comfy-panel-url{flex:18rem;align-items:center;gap:.4rem;min-width:0;display:flex}.vi-comfy-panel-url-label{color:var(--vi-text-dim);white-space:nowrap;font-size:.78rem}.vi-comfy-panel-url .vi-comfy-input{flex:auto;min-width:0}.vi-comfy-panel-msg{flex:none;margin:0;padding:.5rem .8rem}.vi-comfy-panel-empty{text-align:center;flex-direction:column;flex:auto;justify-content:center;align-items:center;gap:.4rem;padding:2rem 1rem;display:flex}.vi-active-panel-body{flex:auto;min-height:0;padding:.9rem;overflow-y:auto}.vi-active-panel-body .station-card{box-shadow:none;background:0 0;border:0;margin:0}.vi-toks-header{justify-content:space-between;align-items:baseline;gap:.75rem;display:flex}.vi-toks-cadence{font-family:var(--vi-mono);align-items:center;gap:.4rem;font-size:.78rem;display:inline-flex}.vi-toks-heading{text-transform:uppercase;letter-spacing:.04em;color:var(--vi-text-dim);margin:1rem 0 .4rem;font-size:.82rem}.vi-toks-row{flex-wrap:wrap;align-items:center;gap:.5rem;font-size:.82rem;display:flex}.vi-toks-tok{font-family:var(--vi-mono);color:var(--vi-text);font-weight:600}.vi-toks-model{font-family:var(--vi-mono);color:var(--vi-text);text-overflow:ellipsis;white-space:nowrap;max-width:16ch;overflow:hidden}.vi-toks-worker{text-overflow:ellipsis;white-space:nowrap;max-width:14ch;overflow:hidden}.vi-toks-ago{margin-left:auto}.vi-toks-rank{min-width:2.2ch}.vi-toks-strip{flex-wrap:wrap;gap:.5rem;display:flex}.vi-toks-worker-card{border:1px solid var(--vi-border);background:var(--vi-surface);border-radius:6px;min-width:9rem;padding:.4rem .6rem}.vi-toks-worker-name{font-size:.8rem;font-weight:600}.vi-toks-worker-nums{margin-top:.15rem}.vi-toks-worker-model{font-family:var(--vi-mono);text-overflow:ellipsis;white-space:nowrap;margin-top:.15rem;overflow:hidden}.vi-btn.vi-btn-tester{color:#b9b0ff;background:#7a6cff1a;border:1px solid #7a6cff}.vi-btn.vi-btn-tester:hover:not(:disabled){color:#d8d2ff;background:#7a6cff38}.vi-btn.vi-btn-tester:disabled{opacity:.55}.vi-prompt-toolbar{flex-wrap:wrap;align-items:center;gap:.6rem;margin-bottom:.6rem;display:flex}.vi-prompt-toolbar-count{max-width:8.5rem}.vi-prompt-toolbar-selectall{align-items:center;gap:.35rem;display:flex}.vi-prompt-tabs{align-items:center;gap:.3rem;display:flex}.vi-prompt-tab{font-family:var(--vi-mono);letter-spacing:.04em;text-transform:uppercase;color:var(--vi-text-dim);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;padding:.15rem .4rem;font-size:.72rem}.vi-prompt-tab[aria-selected=true]{color:var(--vi-accent);border-bottom-color:var(--vi-accent)}.vi-prompt-tab:disabled{opacity:.45;cursor:not-allowed}.vi-prompt-tab-dot{background:var(--vi-accent);vertical-align:middle;border-radius:50%;width:6px;height:6px;margin-left:.3rem;display:inline-block}.vi-prompt-tab-std{align-items:center;gap:.35rem;margin-left:auto;display:flex}.vi-prompt-card-assist{flex-wrap:wrap;align-items:center;gap:.4rem .75rem;display:flex}.vi-prompt-card-assist>.vi-prompt-assist{border-bottom:none;padding-bottom:0}.vi-prompt-card-settings{border-top:1px dashed var(--vi-border);padding-top:.3rem}.vi-prompt-card-settings-summary{cursor:pointer;font-family:var(--vi-mono);letter-spacing:.04em;color:var(--vi-text-dim);font-size:.72rem;list-style:none}.vi-prompt-card-settings-summary::-webkit-details-marker{display:none}.vi-prompt-card-settings-summary:before{content:"▸ "}.vi-prompt-card-settings[open]>.vi-prompt-card-settings-summary:before{content:"▾ "}.vi-prompt-card-settings-body{flex-wrap:wrap;align-items:flex-start;gap:.75rem;padding-top:.4rem;display:flex}.vi-about-expander{border:1px solid var(--vi-border);border-radius:.4rem;margin-bottom:.6rem;padding:.35rem .55rem}.vi-about-summary{cursor:pointer;font-family:var(--vi-mono);letter-spacing:.04em;text-transform:uppercase;color:var(--vi-text-dim);font-size:.72rem;list-style:none}.vi-about-summary::-webkit-details-marker{display:none}.vi-about-summary:before{content:"▸ "}.vi-about-expander[open]>.vi-about-summary:before{content:"▾ "}.vi-about-body{color:var(--vi-text-dim);flex-direction:column;gap:.3rem;padding-top:.4rem;font-size:.8rem;line-height:1.4;display:flex}.vi-about-body p{margin:0}.vi-lib-group{margin:.35rem 0}.vi-lib-group-head{align-items:center;gap:.35rem;font-size:.85rem;display:flex}.vi-lib-count{opacity:.65;font-size:.8em}.vi-prompt-assist>select.vi-select-sm{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:8rem;max-width:24rem;overflow:hidden}.vi-prompt-assist>button{flex:none}.vi-sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;position:absolute!important}.vi-prompt-toolbar-group{flex-direction:column;align-items:stretch;gap:.45rem}.vi-prompt-toolbar-line{flex-wrap:wrap;align-items:center;gap:.6rem;display:flex}.vi-prompt-toolbar-range{align-items:center;gap:.3rem;display:inline-flex}.vi-prompt-toolbar-range-input{width:3.6rem;padding:.15rem .35rem}.vi-prompt-toolbar-neg,.vi-prompt-toolbar-std{align-items:center;gap:.35rem;display:inline-flex}.vi-toggle{min-width:2.6rem;font-family:var(--vi-mono);text-transform:uppercase;letter-spacing:.04em;font-size:.7rem}.vi-toggle-on,.vi-btn-on{color:var(--vi-accent);border-color:var(--vi-accent)}.vi-gen-inline-attach{border:1px dashed var(--vi-border);border-radius:6px;flex-direction:column;gap:.5rem;margin:.35rem 0 .5rem;padding:.5rem .6rem;display:flex}.vi-gen-part-media-block{flex-direction:column;gap:.4rem;display:flex}.vi-gen-part-pullframe{flex-wrap:wrap;align-items:center;gap:.4rem;display:flex}.vi-gen-pull-input{width:4.5rem;padding:.15rem .35rem}.vi-gen-part-assist-row{flex-wrap:wrap;align-items:center;gap:.4rem .75rem;display:flex}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
package/dist/index.html
CHANGED
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
overflow-x: hidden;
|
|
50
50
|
}
|
|
51
51
|
</style>
|
|
52
|
-
<script type="module" crossorigin src="/video/assets/index-
|
|
53
|
-
<link rel="stylesheet" crossorigin href="/video/assets/index-
|
|
52
|
+
<script type="module" crossorigin src="/video/assets/index-C_av7KDW.js"></script>
|
|
53
|
+
<link rel="stylesheet" crossorigin href="/video/assets/index-DMoT8G1q.css">
|
|
54
54
|
</head>
|
|
55
55
|
<body>
|
|
56
56
|
<div id="root"></div>
|
package/entry.tsx
CHANGED
|
@@ -6,13 +6,12 @@ import { createRoot } from "react-dom/client";
|
|
|
6
6
|
import { BrowserRouter } from "react-router-dom";
|
|
7
7
|
import { StationShell } from "./src/stations/StationShell";
|
|
8
8
|
import { hugpyConfig } from "./src/config";
|
|
9
|
-
import { startSessionMetering } from "./src/session";
|
|
10
9
|
import { initShare } from "./src/share";
|
|
11
10
|
import { installVideoDemo } from "./src/demo";
|
|
12
11
|
// Sitewide floating Help button. ONE shared framework-free DOM module mounted
|
|
13
12
|
// identically by all four surfaces (main SPA + media/video/fleet arms) — see
|
|
14
13
|
// ../ui_shared/help/helpWidget.js for why it isn't a copied React component.
|
|
15
|
-
import { mountHelpWidget } from "
|
|
14
|
+
import { mountHelpWidget } from "@hugpy/ui-shared/help/helpWidget.js";
|
|
16
15
|
import "./src/style/app.css";
|
|
17
16
|
|
|
18
17
|
// k9: lift a `?share=<key>` share-link credential out of the URL (stash + strip)
|
|
@@ -24,31 +23,11 @@ initShare();
|
|
|
24
23
|
// anything below can touch the network. No-op outside demo mode.
|
|
25
24
|
installVideoDemo();
|
|
26
25
|
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
// /version reports an integer `api` contract version. Fire-and-forget on boot —
|
|
33
|
-
// never block or delay rendering, and swallow any fetch/parse error.
|
|
34
|
-
const EXPECTED_API_CONTRACT = 1;
|
|
35
|
-
void (async () => {
|
|
36
|
-
try {
|
|
37
|
-
const res = await fetch(`${hugpyConfig.apiBase}/version`, {
|
|
38
|
-
credentials: hugpyConfig.withCredentials ? "include" : "same-origin",
|
|
39
|
-
});
|
|
40
|
-
if (!res.ok) return;
|
|
41
|
-
const body = (await res.json()) as { api?: unknown };
|
|
42
|
-
const api = body?.api;
|
|
43
|
-
if (api !== EXPECTED_API_CONTRACT) {
|
|
44
|
-
console.warn(
|
|
45
|
-
`hugpy API contract mismatch (got ${String(api)}, expected ${EXPECTED_API_CONTRACT})`,
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
} catch {
|
|
49
|
-
// swallow: never let the contract check disrupt boot.
|
|
50
|
-
}
|
|
51
|
-
})();
|
|
26
|
+
// Session ping (/session/ping) and the boot /version contract probe were dropped
|
|
27
|
+
// (2026-10-05): neither route has a backend in this build, so both only produced
|
|
28
|
+
// a repeating 404 and a one-shot 404. The page is action-driven now — it contacts
|
|
29
|
+
// the server on a real read (a seed) or a pushed event, never on a timer or a boot
|
|
30
|
+
// liveness poke.
|
|
52
31
|
|
|
53
32
|
const el = document.getElementById("root");
|
|
54
33
|
if (!el) throw new Error("video-intelligence: #root not found");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hugpy/video-intelligence-ui",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Hugpy video-intelligence console: image crop, audio crop, frames/models and generate stations over the hugpy-video job bus; a standalone Vite + Tailwind v4 arm served at /video",
|
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
"react-dom": "^18.3.1",
|
|
40
40
|
"react-router-dom": "^7.16.0",
|
|
41
41
|
"three": "^0.185.1",
|
|
42
|
-
"zod": "^3.23.8"
|
|
42
|
+
"zod": "^3.23.8",
|
|
43
|
+
"@hugpy/ui-shared": "^0.3.1"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@tailwindcss/vite": "^4.0.0",
|
package/src/config.ts
CHANGED
|
@@ -149,6 +149,8 @@ export const hugpyConfig = {
|
|
|
149
149
|
*/
|
|
150
150
|
studioI2VEnqueueUrl:
|
|
151
151
|
read("VITE_HUGPY_STUDIO_I2V_URL") ?? `${apiBase}/video/studio/i2v`,
|
|
152
|
+
studioPlanUrl:
|
|
153
|
+
read("VITE_HUGPY_STUDIO_PLAN_URL") ?? `${apiBase}/video/studio/plan`,
|
|
152
154
|
/**
|
|
153
155
|
* Enqueue a STUDIO MOVIE (Studio Movie composer, slice B2/B3) — POST an ordered
|
|
154
156
|
* goal timeline {resolution:{width,height,fps}, seed, vram_budget_gb, negative_prompt,
|
|
@@ -202,13 +204,19 @@ export const hugpyConfig = {
|
|
|
202
204
|
* (?all=1 appends recent terminal rows; ?limit=N, default 50) → { jobs: [{ job_id,
|
|
203
205
|
* name, status, created, updated, principal, progress:{…|phase:"awaiting_capacity",
|
|
204
206
|
* reason, held_since, overtaken}|null, placement?:{source:"reservation"|"template",
|
|
205
|
-
* host, worker_id, gpu, process, reserved_bytes} }] }.
|
|
206
|
-
*
|
|
207
|
-
* media CATALOG projection and carries PLACEMENT — WHERE each in-flight render
|
|
207
|
+
* host, worker_id, gpu, process, reserved_bytes} }] }. This is the media
|
|
208
|
+
* CATALOG projection and carries PLACEMENT — WHERE each in-flight render
|
|
208
209
|
* physically executes (ae · cuda:0 · P-studio). Declared here so the Active
|
|
209
210
|
* Processes surface never derives the path inline.
|
|
210
211
|
*/
|
|
211
212
|
mediaJobsUrl: read("VITE_HUGPY_MEDIA_JOBS_URL") ?? `${apiBase}/video/jobs`,
|
|
213
|
+
/**
|
|
214
|
+
* SSE: every media-bus job row the moment a worker reports a transition — the
|
|
215
|
+
* push that replaced the /video/jobs poll loops. The page seeds ONCE from
|
|
216
|
+
* mediaJobsUrl, then listens here; see video/jobStream.ts. 404-tolerant: if the
|
|
217
|
+
* stream is absent the page keeps the one-time seed and never falls back to a poll.
|
|
218
|
+
*/
|
|
219
|
+
jobsStreamUrl: read("VITE_HUGPY_JOBS_STREAM_URL") ?? `${apiBase}/video/jobs/stream`,
|
|
212
220
|
/**
|
|
213
221
|
* LIVE tok/s telemetry for the generate workbench's Toks panel. Two endpoints,
|
|
214
222
|
* both same-origin `/api`, polled together every 2s by `useToks`:
|
|
@@ -362,19 +370,6 @@ export const hugpyConfig = {
|
|
|
362
370
|
modelsUrl: read("VITE_HUGPY_MODELS_URL") ?? `${apiBase}/v1/models`,
|
|
363
371
|
/** Task defaults — GET → { defaults: { "text-to-image": <id>, ... }, tasks:[...] }. */
|
|
364
372
|
promptTasksUrl: read("VITE_HUGPY_PROMPT_TASKS_URL") ?? `${apiBase}/prompt/tasks`,
|
|
365
|
-
/**
|
|
366
|
-
* The AUTHORITATIVE unified feed of EVERY in-flight worker call across ALL
|
|
367
|
-
* transports (web / v1 / discord / cli / media) — GET → { jobs: [{ id, kind,
|
|
368
|
-
* status, transport, model, model_name, worker, principal, elapsed, tokens,
|
|
369
|
-
* error, ... }] }. Unlike the per-session jobTracker (which only knows jobs THIS
|
|
370
|
-
* browser enqueued) this shows fleet-wide work — identity reconstructions
|
|
371
|
-
* (kind:"identity_reconstruction", transport:"media"), studio renders, and any
|
|
372
|
-
* call from another station/transport. The Active Processes panel polls it,
|
|
373
|
-
* keeps the in-flight rows (pending/processing/streaming, minus `download`
|
|
374
|
-
* provisioning), and merges them with the tracker rows. Declared here so the
|
|
375
|
-
* panel never derives the path inline.
|
|
376
|
-
*/
|
|
377
|
-
llmJobsUrl: read("VITE_HUGPY_LLM_JOBS_URL") ?? `${apiBase}/llm/jobs`,
|
|
378
373
|
/**
|
|
379
374
|
* k9 VIDEO-SHARE links — GET → { keys:[{id,label,prefix,created_at,expires_at,
|
|
380
375
|
* expired,revoked,last_used}] } (OPERATOR-ONLY; a share/anon session gets 401,
|
|
@@ -464,17 +459,6 @@ export function llmChatCancelUrl(id: string): string {
|
|
|
464
459
|
return `${apiBase}/llm/chat/cancel/${encodeURIComponent(id)}`;
|
|
465
460
|
}
|
|
466
461
|
|
|
467
|
-
/**
|
|
468
|
-
* HARD-CANCEL a job by id on the unified feed: POST → {cancelled, status}. Unlike
|
|
469
|
-
* the transport-specific routes above, this is the ONE cancel the fleet-wide
|
|
470
|
-
* `/llm/jobs` Active-Processes rows hit regardless of which transport launched the
|
|
471
|
-
* job — the backend fans it out to the right bus. Per-id like `jobCancelUrl` —
|
|
472
|
-
* derived from apiBase, the one module permitted to hold URL literals.
|
|
473
|
-
*/
|
|
474
|
-
export function llmJobCancelUrl(id: string): string {
|
|
475
|
-
return `${apiBase}/llm/jobs/${encodeURIComponent(id)}/cancel`;
|
|
476
|
-
}
|
|
477
|
-
|
|
478
462
|
/**
|
|
479
463
|
* Apply (pre-warm) a curated Generate-station preset by id: POST → on success
|
|
480
464
|
* {ok:true, worker:{name,id}, model_key, mode, defaults{...}, warming}; on failure
|
package/src/demo/demoFetch.ts
CHANGED
|
@@ -199,15 +199,6 @@ async function route(
|
|
|
199
199
|
if (path === "/v1/models") return jsonResponse(fx.V1_MODELS);
|
|
200
200
|
if (path === "/prompt/tasks") return jsonResponse(fx.PROMPT_TASKS);
|
|
201
201
|
|
|
202
|
-
// Unified in-flight worker feed (Active Processes poller, useWorkerCalls.ts,
|
|
203
|
-
// ~2s cadence). The brochure runs nothing, so the honest envelope is an empty
|
|
204
|
-
// in-flight list — { jobs: [] } is exactly the shape parseJobs() projects, and
|
|
205
|
-
// an empty list keeps the panel truthful (no fabricated running render). Routed
|
|
206
|
-
// (not gated) so the poll simply never reaches the wire in canned mode.
|
|
207
|
-
if (path === "/llm/jobs" && method === "GET") {
|
|
208
|
-
return jsonResponse({ jobs: [] });
|
|
209
|
-
}
|
|
210
|
-
|
|
211
202
|
// Bus-wide MEDIA JOBS listing (Active Processes media poller, useMediaJobs.ts,
|
|
212
203
|
// ~2s cadence, GET bare /video/jobs — no id, so the job-poll regex below never
|
|
213
204
|
// matches it). Same honest empty in-flight list as /llm/jobs. Must sit ABOVE
|
package/src/nav/Navbar.tsx
CHANGED
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import React from "react";
|
|
23
23
|
import type { ReactNode } from "react";
|
|
24
|
-
import { makeUseArms } from "
|
|
24
|
+
import { makeUseArms } from "@hugpy/ui-shared/arms";
|
|
25
25
|
import BrandMark from "./BrandMark";
|
|
26
26
|
import { hugpyConfig } from "../config";
|
|
27
27
|
// The link SET + order come from the ONE shared manifest so this arm can never
|
|
28
28
|
// drift from the rest of the site. Rendering stays local (runtime siteBase,
|
|
29
29
|
// current-marking). Plain .js, imported via allowJs with no .d.ts.
|
|
30
|
-
import { buildNavItems } from "
|
|
31
|
-
import "
|
|
30
|
+
import { buildNavItems } from "@hugpy/ui-shared/navbar/links.js";
|
|
31
|
+
import "@hugpy/ui-shared/navbar/navbar.css";
|
|
32
32
|
import "./Navbar.css";
|
|
33
33
|
|
|
34
34
|
// Origin-relative on a hugpy origin; the public hugpy site (siteUrl) otherwise.
|
package/src/session.ts
CHANGED
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
// wipe them immediately. A server-side 1h sweep is the safety net for missed
|
|
8
8
|
// beacons. Disabled entirely in canned demo mode (no backend is contacted, and
|
|
9
9
|
// sendBeacon bypasses the demo fetch shim).
|
|
10
|
-
import { hugpyConfig } from "./config";
|
|
11
|
-
import { isCanned } from "./demo/mode";
|
|
12
|
-
|
|
13
10
|
const SID_KEY = "hugpy.video.sid";
|
|
14
|
-
const HEARTBEAT_MS = 60_000;
|
|
15
11
|
|
|
16
12
|
function makeSid(): string {
|
|
17
13
|
try {
|
|
@@ -42,44 +38,13 @@ export function getSessionId(): string {
|
|
|
42
38
|
}
|
|
43
39
|
}
|
|
44
40
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Session metering was removed (2026-10-05). It heartbeat /session/ping every 60s
|
|
43
|
+
* and beaconed /session/end on close, but neither route has a backend in this
|
|
44
|
+
* build (the ping 404'd on a timer). The per-tab session id below still tags
|
|
45
|
+
* uploads; the server's own sweep is the upload-lifecycle backstop. Kept as an
|
|
46
|
+
* exported no-op so any caller/import stays valid without reintroducing a poll.
|
|
47
|
+
*/
|
|
48
48
|
export function startSessionMetering(): void {
|
|
49
|
-
|
|
50
|
-
if (isCanned()) return;
|
|
51
|
-
started = true;
|
|
52
|
-
|
|
53
|
-
const sid = getSessionId();
|
|
54
|
-
const base = hugpyConfig.apiBase.replace(/\/$/, "");
|
|
55
|
-
const q = `sid=${encodeURIComponent(sid)}`;
|
|
56
|
-
|
|
57
|
-
// Heartbeat — a "simple" POST (query param, no custom header / JSON) so it never
|
|
58
|
-
// triggers a CORS preflight in cross-origin deploys. Failures are ignored.
|
|
59
|
-
const ping = () => {
|
|
60
|
-
try {
|
|
61
|
-
void fetch(`${base}/session/ping?${q}`, {
|
|
62
|
-
method: "POST",
|
|
63
|
-
credentials: hugpyConfig.withCredentials ? "include" : "same-origin",
|
|
64
|
-
keepalive: true,
|
|
65
|
-
}).catch(() => {});
|
|
66
|
-
} catch {
|
|
67
|
-
/* ignore */
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
ping(); // announce on load
|
|
72
|
-
window.setInterval(ping, HEARTBEAT_MS);
|
|
73
|
-
|
|
74
|
-
// Tab close → wipe now (best-effort). Skip bfcache navigations (persisted),
|
|
75
|
-
// which may be restored; the heartbeat resumes if so, and the 1h sweep is the
|
|
76
|
-
// backstop either way.
|
|
77
|
-
window.addEventListener("pagehide", (e) => {
|
|
78
|
-
if ((e as PageTransitionEvent).persisted) return;
|
|
79
|
-
try {
|
|
80
|
-
navigator.sendBeacon?.(`${base}/session/end?${q}`);
|
|
81
|
-
} catch {
|
|
82
|
-
/* ignore */
|
|
83
|
-
}
|
|
84
|
-
});
|
|
49
|
+
/* intentionally empty — no session ping, no tab-close beacon (no backend) */
|
|
85
50
|
}
|
|
@@ -1456,10 +1456,10 @@ export function GenerateStation({ spec }: { spec: StationSpec }) {
|
|
|
1456
1456
|
// This part's OWN assist model (falls back to the shared pick / fleet default).
|
|
1457
1457
|
const model = p.assistModel ?? assist.assistModel ?? null;
|
|
1458
1458
|
const context = opts.media ? { media: opts.media } : undefined;
|
|
1459
|
-
let newText =
|
|
1459
|
+
let newText = "";
|
|
1460
1460
|
await assist.runAssist(
|
|
1461
1461
|
mode,
|
|
1462
|
-
p.text,
|
|
1462
|
+
mode === "generate" ? "" : p.text,
|
|
1463
1463
|
(t) => {
|
|
1464
1464
|
newText = t;
|
|
1465
1465
|
editText(p.key, t);
|
|
@@ -3793,7 +3793,7 @@ export function GenerateStation({ spec }: { spec: StationSpec }) {
|
|
|
3793
3793
|
// apply (replace the primary text part). On ANY failure the hook surfaces .error
|
|
3794
3794
|
// inline and never calls apply, so the existing prompt stays intact.
|
|
3795
3795
|
function runAssist(assistMode: "detail" | "generate"): void {
|
|
3796
|
-
void assist.runAssist(assistMode, assembledPrompt, applyAssistedPrompt);
|
|
3796
|
+
void assist.runAssist(assistMode, assistMode === "generate" ? "" : assembledPrompt, applyAssistedPrompt);
|
|
3797
3797
|
}
|
|
3798
3798
|
|
|
3799
3799
|
useEffect(() => {
|
|
@@ -4010,7 +4010,10 @@ export function GenerateStation({ spec }: { spec: StationSpec }) {
|
|
|
4010
4010
|
SectionTabs + Options-rail + Run-row layout. The surface is LOCKED to the
|
|
4011
4011
|
matching sub-mode: Clip → "clip", Cinema → "movie" (the StudioMovieComposer). */}
|
|
4012
4012
|
{isStudioSurface && (
|
|
4013
|
-
<StudioGenerateMode
|
|
4013
|
+
<StudioGenerateMode
|
|
4014
|
+
lockedSurfaceMode={mode === "cinema" ? "movie" : "clip"}
|
|
4015
|
+
onSelectSurfaceMode={(next) => setMode(next === "movie" ? "cinema" : "clip")}
|
|
4016
|
+
/>
|
|
4014
4017
|
)}
|
|
4015
4018
|
|
|
4016
4019
|
{!isStudioSurface && (
|
|
@@ -5270,7 +5273,7 @@ export function GenerateStation({ spec }: { spec: StationSpec }) {
|
|
|
5270
5273
|
onGenerate={() =>
|
|
5271
5274
|
void (async () => {
|
|
5272
5275
|
let fresh = "";
|
|
5273
|
-
await assist.runAssist("generate",
|
|
5276
|
+
await assist.runAssist("generate", "", (p) => {
|
|
5274
5277
|
fresh = p;
|
|
5275
5278
|
editGoal(g.id, "prompt", p);
|
|
5276
5279
|
});
|
|
@@ -80,10 +80,10 @@ export function SharePanel() {
|
|
|
80
80
|
}
|
|
81
81
|
}, []);
|
|
82
82
|
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
// The mount probe of GET /keys/video-share was dropped (2026-10-05): that route
|
|
84
|
+
// has no backend in this build, so the probe only 404'd. `authed` therefore
|
|
85
|
+
// stays null and the Share affordance renders nothing — the same outcome the
|
|
86
|
+
// 401/403 branch produced, with no request. refresh() still backs mint/revoke.
|
|
87
87
|
|
|
88
88
|
const mint = useCallback(async () => {
|
|
89
89
|
setMinting(true);
|
|
@@ -18,7 +18,6 @@ import {
|
|
|
18
18
|
useToks,
|
|
19
19
|
rollupByWorker,
|
|
20
20
|
tokAgo,
|
|
21
|
-
TOKS_POLL_MS,
|
|
22
21
|
type TokEntry,
|
|
23
22
|
type TokGroup,
|
|
24
23
|
} from "../video/useToks";
|
|
@@ -153,7 +152,7 @@ export function ToksStation() {
|
|
|
153
152
|
className={`vi-assistlog-dot ${live ? "vi-assistlog-dot--live" : "vi-assistlog-dot--disconnected"}`}
|
|
154
153
|
aria-hidden
|
|
155
154
|
/>
|
|
156
|
-
{live ? "live" : "paused"} ·
|
|
155
|
+
{live ? "live" : "paused"} · on activity
|
|
157
156
|
</span>
|
|
158
157
|
</div>
|
|
159
158
|
<p className="vi-knob-hint">
|