stillmade-sdk 0.1.40 → 0.1.42
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/.stillmade/sdk-baseline.json +19 -19
- package/AGENTS.md +6 -2
- package/FRAME_VIEWS.md +41 -0
- package/INTERFACE_DESIGN.md +100 -8
- package/MOBILE_UI.md +3 -1
- package/PASTE_TO_LLM.md +18 -13
- package/SDK.md +200 -37
- package/UI_AESTHETIC.md +93 -4
- package/examples/check-clip.stillmade.json +4 -0
- package/examples/clean-text.stillmade.json +4 -0
- package/examples/custom-interface.stillmade.json +4 -0
- package/examples/describe-image.stillmade.json +4 -0
- package/examples/foley-cue.stillmade.json +4 -0
- package/examples/generate-image.stillmade.json +4 -0
- package/examples/generate-video.stillmade.json +4 -0
- package/examples/module-word-stats/stillmade.block.json +4 -0
- package/examples/narrate-script.stillmade.json +4 -0
- package/examples/numbered-takes.stillmade.json +4 -0
- package/examples/research-topic.stillmade.json +4 -0
- package/examples/score-a-scene.stillmade.json +4 -0
- package/examples/script-draft.stillmade.json +4 -0
- package/examples/summarize-page.stillmade.json +4 -0
- package/examples/text-workflow.stillmade.json +4 -0
- package/examples/thicken-lines.stillmade.json +4 -0
- package/examples/timeline-polish.stillmade.json +4 -0
- package/examples/transcribe-audio.stillmade.json +4 -0
- package/examples/word-count.stillmade.json +4 -0
- package/package.json +1 -1
- package/packages/block-cli/dev-host/assets/host.js +208 -37
- package/packages/block-cli/dev-host/assets/index.css +1 -1
- package/packages/block-cli/ready-gate.js +4 -0
- package/packages/block-cli/templates.js +7 -7
- package/packages/block-platform/block-readiness.js +24 -2
- package/packages/block-platform/canvas.js +17 -0
- package/packages/block-platform/catalog.js +21 -6
- package/packages/block-platform/host-release-manifests.js +95 -0
- package/packages/block-platform/native-host-inventory.js +29 -4
- package/packages/block-platform/node-defaults.js +1 -0
- package/packages/block-platform/project-context.js +1 -1
- package/packages/block-platform/script-handoff.js +1 -1
- package/packages/block-platform/step-groups.js +3 -1
- package/packages/block-sdk/audio-generation-example.js +2 -2
- package/packages/block-sdk/builder-contract.js +15 -4
- package/packages/block-sdk/capability-example.js +1 -1
- package/packages/block-sdk/contracts.js +3 -1
- package/packages/block-sdk/examples.js +3 -3
- package/packages/block-sdk/image-description-example.js +1 -1
- package/packages/block-sdk/image-generation-example.js +1 -1
- package/packages/block-sdk/index.d.ts +2 -2
- package/packages/block-sdk/media-analysis-example.js +1 -1
- package/packages/block-sdk/module-example.js +1 -1
- package/packages/block-sdk/speech-example.js +1 -1
- package/packages/block-sdk/state-example.js +1 -1
- package/packages/block-sdk/timeline-proposal-example.js +1 -1
- package/packages/block-sdk/transcription-example.js +1 -1
- package/packages/block-sdk/trigger-examples.js +2 -2
- package/packages/block-sdk/video-generation-example.js +1 -1
- package/packages/block-sdk/view-design.js +119 -18
- package/packages/block-sdk/web-example.js +2 -2
- package/packages/block-sdk/workspace-navigation.js +6 -2
- package/packages/design-system/block-kit.css +33 -6
- package/packages/design-system/block-kit.html +14 -4
- package/packages/design-system/theme.css +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
@font-face{font-family:Hanken Grotesk;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/HankenGrotesk-Variable.ttf)format("truetype")}@font-face{font-family:Hanken Grotesk;font-style:italic;font-weight:100 900;font-display:swap;src:url(/fonts/HankenGrotesk-Italic-Variable.ttf)format("truetype")}:root{--cream-50:#fdfaf1;--cream-100:#f7f0db;--cream-200:#ece3c9;--cream-300:#dcd2b5;--cream-600:#4e483a;--ink-50:#f2f0ec;--ink-100:#c9c6be;--ink-300:#4a4843;--ink-400:#26241f;--ink-500:#16140f;--ink-600:#0a0a0a;--signal:#e8b23a;--signal-dim:#e8b23a26;--signal-glow:#e8b23a4d;--font-display:"Balgin", "Hanken Grotesk", ui-sans-serif, sans-serif;--font-body:"Hanken Grotesk", ui-sans-serif, sans-serif;--font-mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--font:var(--font-body);--fs-display-xl:clamp(72px, 14vw, 220px);--fs-display-l:clamp(56px, 9vw, 144px);--fs-display-m:clamp(40px, 6vw, 96px);--fs-h4:1.25rem;--fs-body:1rem;--fs-body-s:.875rem;--fs-caption:.8125rem;--fs-micro:.75rem;--tr-display:-.02em;--tr-body:-.005em;--tr-micro:.08em;--lh-display:.92;--lh-tight:1.05;--s-1:4px;--s-2:8px;--s-3:12px;--s-4:16px;--s-5:24px;--s-6:32px;--s-7:48px;--s-8:64px;--s-9:96px;--s-10:128px;--s-11:192px;--page-gutter:clamp(20px, 3vw, 48px);--page-gutter-compact:clamp(16px, 5vw, 24px);--page-section-gap:clamp(32px, 5vw, 64px);--content-readable:720px;--content-wide:1440px;--control-height:40px;--touch-target:44px;--mobile-dock-height:66px;--z-nav:30;--hover:var(--hover-wash);--r-0:0;--r-1:2px;--r-2:4px;--r-3:8px;--r-pill:999px;--radius-sm:var(--r-2);--radius:var(--r-3);--radius-lg:var(--r-3);--bw-hair:.5px;--bw-1:1px;--bw-2:2px;--ease-out:cubic-bezier(.22, 1, .36, 1);--ease-in-out:cubic-bezier(.65, 0, .35, 1);--ease-spring:cubic-bezier(.34, 1.56, .64, 1);--dur-instant:80ms;--dur-fast:.16s;--dur-base:.24s;--dur-slow:.48s;--dur-reveal:.72s}:root,[data-mode=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#101010;--bg-elev-1:#232221;--bg-elev-2:#33312f;--bg-inset:#171716;--fg:#f3eee5;--fg-muted:#bbb2a7;--fg-subtle:#f3eee594;--fg-on-accent:#191716;--border-tok:#58534d;--border-strong:#8b7e6f;--divider:#393735;--signal:#d0ae77;--signal-dim:#d0ae7726;--signal-glow:#d0ae774d;--hover-wash:#f7f0db0f;--press-wash:#f7f0db1f;--selection-bg:var(--cream-100);--selection-fg:var(--ink-600);--shadow-1:0 1px 0 #f7f0db0a inset, 0 4px 12px #00000080;--shadow-2:0 1px 0 #f7f0db0f inset, 0 16px 48px #0009;--scrim-top:linear-gradient(to bottom, #0a0a0ad9, #0a0a0a00);--scrim-bottom:linear-gradient(to top, #0a0a0ad9, #0a0a0a00);--bg-primary:var(--bg);--bg-secondary:var(--bg-elev-1);--bg-tertiary:var(--bg-elev-2);--bg-elevated:var(--bg-elev-1);--bg-hover:#403d3a;--border:var(--border-tok);--border-light:var(--border-strong);--accent:var(--fg);--accent-hover:var(--cream-50);--accent-dim:var(--hover-wash);--accent-glow:#f7f0db38;--accent-contrast:var(--bg);--editor-standout-bg:var(--fg);--editor-standout-fg:var(--bg);--text-primary:var(--fg);--text-secondary:var(--fg-muted);--text-muted:var(--fg-subtle);--success:var(--fg);--warning:var(--signal);--danger:var(--signal);--attention-warning:#e0b24f;--attention-error:#e26a5f;--attention-ok:#6bc38e;--attention-info:#7da7e8;--shadow:var(--shadow-1);--shadow-lg:var(--shadow-2)}[data-mode=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--signal:#e8b23a;--signal-dim:#e8b23a26;--signal-glow:#e8b23a4d;--bg:var(--cream-100);--bg-elev-1:var(--cream-50);--bg-elev-2:var(--cream-200);--bg-inset:var(--cream-200);--fg:var(--ink-600);--fg-muted:var(--cream-600);--fg-subtle:#0a0a0a61;--fg-on-accent:var(--cream-100);--border-tok:#0a0a0a1a;--border-strong:#0a0a0a38;--divider:#0a0a0a0f;--hover-wash:#0a0a0a0d;--press-wash:#0a0a0a1a;--selection-bg:var(--ink-600);--selection-fg:var(--cream-100);--shadow-1:0 1px 0 #ffffff80 inset, 0 4px 12px #0a0a0a0f;--shadow-2:0 1px 0 #fff9 inset, 0 16px 48px #0a0a0a1a;--scrim-top:linear-gradient(to bottom, #f7f0dbe6, #f7f0db00);--scrim-bottom:linear-gradient(to top, #f7f0dbe6, #f7f0db00);--bg-primary:var(--bg);--bg-secondary:var(--bg-elev-1);--bg-tertiary:var(--bg-elev-2);--bg-elevated:var(--bg-elev-2);--bg-hover:var(--cream-300);--border:var(--border-tok);--border-light:var(--border-strong);--accent:var(--fg);--accent-hover:var(--ink-500);--accent-dim:var(--hover-wash);--accent-glow:#0a0a0a38;--accent-contrast:var(--bg);--editor-standout-bg:var(--ink-300);--editor-standout-fg:var(--cream-100);--text-primary:var(--fg);--text-secondary:var(--fg-muted);--text-muted:var(--fg-subtle);--success:var(--fg);--warning:var(--signal);--danger:var(--signal);--attention-warning:#b98200;--attention-error:#c2453d;--attention-ok:#2e7d4f;--attention-info:#2f67b8;--shadow:var(--shadow-1);--shadow-lg:var(--shadow-2)}[data-mode=white]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#fff;--bg-elev-1:#fff;--bg-elev-2:#f5f5f5;--bg-inset:#fafafa;--fg:#0e0e0e;--fg-muted:#5c5c5c;--fg-subtle:#767676;--fg-on-accent:#fff;--border-tok:#e4e4e4;--border-strong:#c9c9c9;--divider:#ededed;--hover-wash:#0000000d;--press-wash:#00000017;--selection-bg:#0e0e0e;--selection-fg:#fff;--signal:#8e6b46;--signal-dim:#8e6b461a;--signal-glow:#8e6b4638;--shadow-1:0 1px 3px #0000000d;--shadow-2:0 12px 40px #0000001a;--scrim-top:linear-gradient(to bottom,#ffffffe6,#fff0);--scrim-bottom:linear-gradient(to top,#ffffffe6,#fff0);--bg-primary:var(--bg);--bg-secondary:var(--bg-elev-1);--bg-tertiary:var(--bg-elev-2);--bg-elevated:var(--bg-elev-1);--bg-hover:#f2f2f2;--border:var(--border-tok);--border-light:var(--border-strong);--accent:var(--fg);--accent-hover:#2a2a2a;--accent-dim:var(--hover-wash);--accent-glow:#0000001f;--accent-contrast:var(--bg);--editor-standout-bg:#24211d;--editor-standout-fg:#fff;--text-primary:var(--fg);--text-secondary:var(--fg-muted);--text-muted:var(--fg-subtle);--success:var(--fg);--warning:var(--signal);--danger:var(--signal);--attention-warning:#b98200;--attention-error:#c2453d;--attention-ok:#2e7d4f;--attention-info:#2f67b8;--shadow:var(--shadow-1);--shadow-lg:var(--shadow-2)}button[data-icon-action=true]{cursor:pointer;flex-shrink:0;line-height:1;min-width:36px!important;min-height:36px!important;box-shadow:none!important;color:var(--text-secondary,var(--fg))!important;background:0 0!important;border:0!important;border-radius:0!important;justify-content:center!important;align-items:center!important;padding:8px!important;display:inline-flex!important}button[data-icon-action=true]:hover:not(:disabled){color:var(--text-primary,var(--fg))!important}button[data-icon-action=true]:focus-visible{outline-offset:2px;outline:2px solid var(--signal)!important}button[data-icon-action=true]:disabled{cursor:not-allowed;opacity:.4!important}button[data-icon-action=true][aria-pressed=true]{text-underline-offset:5px;text-decoration:underline;color:var(--text-primary,var(--fg))!important}@media (pointer:coarse){button[data-icon-action=true]{min-width:44px!important;min-height:44px!important}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root[data-anim-theme="1"]:not([data-mode=white]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0a0d13;--bg-elev-1:#0f141c;--bg-elev-2:#1a2230;--bg-inset:#0f141c;--fg:#d8dee8;--fg-muted:#8b98ac;--fg-subtle:#64748b;--fg-on-accent:#0a0d13;--border-tok:#232d3d;--border-strong:#303d50;--divider:#1a2230;--hover-wash:#8b98ac14;--press-wash:#8b98ac29;--selection-bg:#303d50;--selection-fg:#d8dee8;--bg-primary:#0a0d13;--bg-secondary:#0f141c;--bg-tertiary:#1a2230;--bg-elevated:#1a2230;--bg-hover:#232d3d;--border:#232d3d;--border-light:#303d50;--accent:#8b98ac;--accent-hover:#b6c0ce;--accent-dim:#8b98ac1f;--accent-glow:#8b98ac40;--accent-contrast:#0a0d13;--editor-standout-bg:#d8dee8;--editor-standout-fg:#0a0d13;--text-primary:#d8dee8;--text-secondary:#8b98ac;--text-muted:#64748b;--success:#8b98ac;--warning:#b6c0ce;--danger:#b6c0ce}html,body{background:var(--bg);width:100%;height:100%;color:var(--fg);font-family:var(--font-body);letter-spacing:var(--tr-body);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-size:14px;line-height:1.6;overflow:hidden}#root{width:100%;height:100%;overflow:hidden}.sm-app-shell{height:100dvh}@keyframes sm-navmenu-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}.mobile-nav-menu{animation:.2s cubic-bezier(.22,1,.36,1) sm-navmenu-in}::selection{background:var(--selection-bg);color:var(--selection-fg)}.display,h1,h2{font-family:var(--font-display);font-style:italic;font-weight:200;line-height:var(--lh-tight);letter-spacing:var(--tr-display);margin:0}.display{line-height:var(--lh-display)}h3,h4{font-family:var(--font-body);font-weight:500;line-height:var(--lh-tight);letter-spacing:-.01em;margin:0}.eyebrow{color:var(--fg-muted);font-size:11px;font-weight:500}code,pre,.mono{font-family:var(--font-mono);font-size:.92em}.listing-identity code{font-family:inherit;font-size:inherit}button{font-family:var(--font-body);cursor:pointer;letter-spacing:var(--tr-body);border:none;outline:none}textarea,input,select{font-family:var(--font-body);outline:none}select{background-color:var(--bg-elev-1);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--r-2)}select option,select optgroup{background-color:var(--bg-elevated);color:var(--text-primary)}select option:checked{font-weight:600}.tsel-trigger{background-color:var(--bg-elev-1);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--r-2);font-family:var(--font-body);font-size:inherit;cursor:pointer;text-align:left;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;display:inline-flex}.tsel-trigger:hover{border-color:var(--border-strong)}.tsel-trigger:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.tsel-trigger:disabled{opacity:.5;cursor:default}.tsel-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tsel-caret{opacity:.7;flex:none;font-size:10px}.tsel-pop{z-index:100100;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--r-2);max-height:260px;padding:4px;overflow-y:auto;box-shadow:0 8px 28px #00000047}.tsel-opt{color:var(--text-primary);cursor:pointer;white-space:nowrap;border-radius:6px;align-items:center;gap:6px;padding:6px 8px;font-size:13px;display:flex}.tsel-opt[data-active=true]{background:var(--bg-elev-1)}.tsel-opt[aria-selected=true]{font-weight:600}.tsel-opt[aria-disabled=true]{color:var(--text-muted);cursor:default}.tsel-opt[aria-disabled=true][data-active=true]{background:0 0}.tsel-check{opacity:.8;flex:none;width:12px;font-size:11px}.tsel-opt-label{text-overflow:ellipsis;flex:auto;overflow:hidden}.tsel-note{cursor:help;width:16px;height:16px;color:var(--text-muted);border:1px solid var(--border);border-radius:999px;flex:none;justify-content:center;align-items:center;font-size:11px;display:inline-flex;position:relative}.tsel-note:hover{color:var(--text-primary);border-color:var(--border-strong)}.tsel-tip{z-index:100110;background:var(--text-primary);color:var(--bg-elevated);box-sizing:border-box;white-space:normal;pointer-events:none;border-radius:5px;max-width:min(260px,100vw - 16px);padding:4px 8px;font-size:11px;font-weight:600;box-shadow:0 2px 10px #0000004d}@media (width<=767.98px),(height<=480px) and (pointer:coarse){.tsel-opt{box-sizing:border-box;min-height:44px;font-size:14px}.tsel-note{flex:0 0 44px;width:44px;height:44px;font-size:14px}}.video-editor input,.video-editor select,.video-editor textarea{background:var(--bg-inset);width:100%;min-width:0;color:var(--fg);border:var(--bw-1) solid var(--border-strong);border-radius:var(--r-2);font-family:var(--font-body);accent-color:var(--signal);padding:7px 8px;font-size:12px}.video-editor,.mobile-editor-root{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.video-editor input,.video-editor select,.video-editor textarea,.video-editor [contenteditable=true],.mobile-editor-root input,.mobile-editor-root select,.mobile-editor-root textarea,.mobile-editor-root [contenteditable=true]{-webkit-user-select:text;user-select:text;-webkit-touch-callout:default}.video-editor input[type=range]{background:0 0;border:0;padding:0}.video-editor input[type=checkbox]{width:auto;min-width:auto}.video-editor select:focus,.video-editor input:focus,.video-editor textarea:focus{border-color:var(--signal);box-shadow:0 0 0 1px var(--signal-dim)}:focus-visible{outline:2px solid var(--signal);outline-offset:2px}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--r-pill)}::-webkit-scrollbar-thumb:hover{background:var(--fg-subtle)}.sm-hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.sm-hide-scrollbar::-webkit-scrollbar{width:0;height:0;display:none}.btn{align-items:center;gap:var(--s-2);padding:var(--s-2) var(--s-4);border-radius:var(--r-pill);letter-spacing:var(--tr-body);transition:transform var(--dur-fast) var(--ease-out), background-color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out), opacity var(--dur-fast) var(--ease-out);font-size:13px;font-weight:500;display:inline-flex}.btn:active{transform:scale(.98)}.btn-primary{background:var(--fg);color:var(--bg)}.btn-primary:hover{background:var(--fg);opacity:.86}.btn-primary:disabled{opacity:.4;cursor:not-allowed}.btn-secondary{color:var(--fg);border:var(--bw-1) solid var(--border-strong);background:0 0}.btn-secondary:hover{background:var(--hover-wash);border-color:var(--fg)}.btn-ghost{color:var(--fg-muted);background:0 0;padding:6px 10px}.btn-ghost:hover{background:var(--hover-wash);color:var(--fg)}.btn-icon{color:var(--fg-muted);border-radius:var(--r-2);transition:background-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out);background:0 0;justify-content:center;align-items:center;padding:5px;display:inline-flex}.btn-icon:hover{background:var(--hover-wash);color:var(--fg)}.btn-icon:active{transform:scale(.98)}.btn-icon:disabled{opacity:.4;cursor:not-allowed}.typing-indicator{align-items:center;gap:4px;padding:4px 0;display:flex}.typing-indicator span{border-radius:var(--r-pill);background:var(--fg-subtle);width:6px;height:6px;animation:1.2s infinite bounce}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes bounce{0%,60%,to{opacity:.4;transform:translateY(0)}30%{opacity:1;transform:translateY(-5px)}}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{0%,to{opacity:.4;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}@keyframes toastIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}button:focus-visible,[role=button]:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]):not([type=button]):not([type=submit]):not([type=reset]):is(:focus,:focus-visible),textarea:is(:focus,:focus-visible),select:is(:focus,:focus-visible),[contenteditable]:not([contenteditable=false]):is(:focus,:focus-visible){outline:none!important}@keyframes skeletonShimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.skeleton{background:linear-gradient(90deg,#ffffff08 0%,#ffffff1a 50%,#ffffff08 100%) 0 0/200% 100%;border-radius:6px;animation:1.4s ease-in-out infinite skeletonShimmer}.node-state-empty{border-style:dashed!important}.node-state-generating{box-shadow:0 0 0 2px var(--accent);position:relative}.node-state-generating:after{content:"";border-radius:inherit;pointer-events:none;will-change:opacity;animation:1.6s ease-in-out infinite nodePulse;position:absolute;inset:-2px;box-shadow:0 0 18px #f7c8328c}@keyframes nodePulse{0%,to{opacity:.36}50%{opacity:1}}.node-state-warning{position:relative;border-color:var(--attention-warning)!important}.node-state-warning:after{content:"";border-radius:inherit;pointer-events:none;box-shadow:0 0 0 1px var(--attention-warning), 0 0 14px color-mix(in srgb, var(--attention-warning) 40%, transparent);position:absolute;inset:-2px}.node-state-failed{border-top:4px solid #d04848!important}.node-state-failed:before{content:"⚠ ";color:#d04848;z-index:2;pointer-events:none;font-size:12px;font-weight:800;position:absolute;top:6px;left:8px}.react-flow__node{cursor:default}.react-flow__node.dragging,.react-flow__pane.dragging .react-flow__viewport{will-change:transform}.react-flow__node:not(.react-flow__node-sceneGroupNode):not(.react-flow__node-shotLabelNode):not(.react-flow__node-stickyNoteNode):not(.react-flow__node-transitionNode){box-shadow:1px 1px 0 var(--node-side,#d8cfb3), 2px 2px 0 var(--node-side,#d8cfb3), 3px 3px 0 var(--node-side,#d8cfb3), 4px 4px 0 var(--node-side,#d8cfb3), 5px 5px 0 var(--node-side,#d8cfb3), 6px 6px 0 var(--node-side,#d8cfb3), 7px 7px 0 var(--node-edge,#0a0a0a2e), 14px 16px 18px -4px #0a0a0a2e;border-radius:10px}[data-mode=dark] .react-flow__node:not(.react-flow__node-sceneGroupNode):not(.react-flow__node-shotLabelNode):not(.react-flow__node-stickyNoteNode):not(.react-flow__node-transitionNode){--node-side:#1f1d18;--node-edge:#f7f0db2e}.react-flow__controls{grid-template-columns:repeat(2,1fr)!important;display:grid!important}.react-flow__controls button{background:var(--bg-elev-2)!important;border-color:var(--border-tok)!important;color:var(--fg-muted)!important;fill:var(--fg-muted)!important}.react-flow__controls button:hover{background:var(--ink-300)!important}.react-flow__edge-path{stroke:var(--border-strong)}.react-flow.rf-edges-panning .react-flow__edges{display:none}.react-flow__node.node-controls-locked input,.react-flow__node.node-controls-locked textarea,.react-flow__node.node-controls-locked select,.react-flow__node.node-controls-locked button,.react-flow__node.node-controls-locked [role=button]{pointer-events:none!important}.react-flow__node.node-controls-locked{cursor:grab}.react-flow__node.node-controls-locked:active{cursor:grabbing}.react-flow__node.scene-add-available-node{filter:drop-shadow(0 0 10px #f7f0db38)}.react-flow__node.scene-add-available-node>div{outline:1px solid var(--border-strong);outline-offset:4px;border-radius:var(--r-3)}.react-flow__node.scene-add-available-node:after{content:"";border:1px dashed var(--border-strong);border-radius:var(--r-3);pointer-events:none;position:absolute;inset:-8px}.react-flow__node.node-replace-available{filter:drop-shadow(0 0 10px #f7f0db38)}.react-flow__node.node-replace-available>div{outline:1px solid var(--border-strong);outline-offset:4px;border-radius:var(--r-3)}.react-flow__node.node-replace-available:after{content:"";border:1px dashed var(--border-strong);border-radius:var(--r-3);pointer-events:none;position:absolute;inset:-8px}select option{background:var(--bg-elev-2);color:var(--fg)}.spinner{border:2px solid var(--border-tok);border-top-color:var(--fg);border-radius:var(--r-pill);width:16px;height:16px;animation:.7s linear infinite spin}.media-upload-preview:hover .media-upload-overlay{opacity:1!important}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:1ms!important;animation-duration:1ms!important}}.assets-card .assets-card-overlay{opacity:0;transition:opacity .15s}.assets-card:hover .assets-card-overlay{opacity:1}.yt-video-row{transition:background .12s,box-shadow .12s,color .12s}.yt-video-row:hover{box-shadow:inset 2px 0 0 var(--accent), inset 0 0 14px var(--accent-glow);color:var(--text-primary);background:var(--hover-wash)!important}.chat-bubble ::selection{background:var(--signal);color:#0a0a0a}.chat-bubble ::selection{background:var(--signal);color:#0a0a0a}.chat-bubble:hover .chat-bubble-copy,.chat-bubble:focus-within .chat-bubble-copy,.chat-bubble-copy:hover,.chat-bubble-copy:focus{opacity:1!important}.chat-bubble-copy:hover{background:var(--bg-elevated-2,var(--bg-elevated));color:var(--text-primary)!important}.chat-bubble-copy:active{transform:scale(.94)}.sm-brand .sm-brandmark{transform-origin:50%;transition:transform .76s cubic-bezier(.2,.8,.2,1),filter .28s}.sm-brand:hover .sm-brandmark{filter:drop-shadow(0 0 7px color-mix(in srgb, currentColor 45%, transparent));will-change:transform, filter;transform:perspective(340px)rotateY(360deg)scale(1.06)}.sm-brand .sm-word{transition:transform .3s cubic-bezier(.2,.8,.2,1);transform:translate(-4px)}.sm-brand:hover .sm-word{will-change:transform;transform:translate(-4px,-1px)}@media (prefers-reduced-motion:reduce){.sm-brand .sm-brandmark{transition:transform .24s,filter .24s}.sm-brand:hover .sm-brandmark{transform:scale(1.06)}.sm-brand:hover .sm-word{transform:translate(-4px)}}body.sm-mobile-ui input,body.sm-mobile-ui textarea,body.sm-mobile-ui select{font-size:16px!important}body.sm-mobile-ui button,body.sm-mobile-ui select,body.sm-mobile-ui [role=button]{min-height:44px}body.sm-mobile-ui select:not([multiple]):not([size]){height:max(44px,2.75em)}body.sm-mobile-ui button.btn-icon,body.sm-mobile-ui button[data-compact],body.sm-mobile-ui .no-min-tap{min-height:0}body.sm-mobile-ui .yt-video-row{min-width:560px}:where(html:has(.sm-block)){container-type:inline-size}:where(.sm-block){gap:var(--s-5,24px);min-width:0;display:grid}:where(.sm-block,.sm-block *){box-sizing:border-box}:where(.sm-block)>:where(*){min-width:0}@container (width>=720px){:where(.sm-block[data-layout=split]){grid-template-columns:minmax(0,1.6fr) minmax(260px,1fr);align-items:start}:where(.sm-block[data-layout=split])>:where(.sm-stage){grid-row:span 6}}@container (width>=860px){:where(.sm-block:not([data-layout]):has(>.sm-stage)){align-items:start;column-gap:var(--s-5,24px);row-gap:var(--s-4,16px);grid-template-columns:minmax(300px,380px) minmax(0,1fr)}:where(.sm-block:not([data-layout]):has(>.sm-stage))>:where(*){grid-column:1}:where(.sm-block:not([data-layout]):has(>.sm-stage))>:where(.sm-stage){grid-area:1/2/span 12;align-self:stretch;min-height:min(70vh,640px)}:where(.sm-block:not([data-layout]):has(>.sm-stage))>:where(.sm-stage[data-ratio]){align-self:start;min-height:0}}:where(.sm-row){align-items:center;gap:var(--s-2,8px);flex-wrap:wrap;display:flex}@container (width<=519px){:where(.sm-clamp:not([data-open])){-webkit-line-clamp:var(--sm-lines,5);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}}:where(.sm-stage){min-height:220px;padding:var(--s-3,12px);border-radius:var(--r-3,8px);background:var(--bg-inset);place-items:center;display:grid;position:relative;overflow:hidden}:where(.sm-stage[data-ratio="16:9"]){aspect-ratio:16/9;min-height:0}:where(.sm-stage[data-ratio="9:16"]){aspect-ratio:9/16;justify-self:center;width:auto;height:min(70vh,640px);min-height:0;max-height:70vh}:where(.sm-stage[data-ratio="1:1"]){aspect-ratio:1;min-height:0}:where(.sm-stage)>:where(img,video,canvas){object-fit:contain;border-radius:var(--r-2,4px);max-width:100%;max-height:100%;display:block}:where(.sm-stage[data-fill])>:where(img,video,canvas){object-fit:cover;width:100%;height:100%}:where(.sm-empty){justify-items:center;gap:var(--s-3,12px);padding:var(--s-5,24px) var(--s-4,16px);text-align:center;color:var(--fg-muted);display:grid}:where(.sm-empty)>:where(.sm-glyph){--sm-glyph-size:40px;color:var(--fg-subtle)}:where(.sm-empty)>:where(p){max-width:24ch;font-size:var(--fs-body,1rem);margin:0}:where(.sm-drop){outline:1px dashed var(--border-tok);outline-offset:-8px}:where(.sm-drop[data-over]){outline-color:var(--fg);background:var(--hover-wash)}:where(.sm-actions){align-items:center;gap:var(--s-2,8px);flex-wrap:wrap;display:flex}:where(.sm-actions)>:where(.sm-status){margin-inline-start:var(--s-2,8px)}:where(.sm-primary,.sm-quiet){justify-content:center;align-items:center;gap:var(--s-2,8px);min-height:var(--touch-target,44px);border-radius:var(--r-pill,999px);font:inherit;cursor:pointer;text-align:center;overflow-wrap:anywhere;max-width:100%;padding:10px 20px;font-weight:500;display:inline-flex}:where(.sm-primary){border:1px solid var(--fg);background:var(--fg);color:var(--bg)}:where(.sm-quiet){border:1px solid var(--border-tok);color:var(--fg);background:0 0}:where(.sm-quiet):hover{background:var(--hover-wash)}:where(.sm-icon){min-width:var(--touch-target,44px);min-height:var(--touch-target,44px);border-radius:var(--r-2,4px);color:var(--fg-muted);cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:inline-grid}:where(.sm-icon):hover{color:var(--fg);background:var(--hover-wash)}:where(.sm-icon[aria-pressed=true]){color:var(--fg);background:var(--press-wash)}:where(.sm-primary,.sm-quiet,.sm-icon):disabled{opacity:.45;cursor:default}:where(.sm-primary,.sm-quiet,.sm-icon):focus-visible{outline:2px solid var(--signal);outline-offset:3px}@container (width<=420px){:where(.sm-actions)>:where(.sm-primary){flex:100%}}:where(.sm-field){gap:6px;min-width:0;display:grid}:where(.sm-field)>:where(label,.sm-label){align-items:center;gap:var(--s-1,4px);font-size:var(--fs-body-s,.875rem);color:var(--fg-muted);min-height:24px;display:flex}:where(.sm-field) :where(input:not([type=checkbox]):not([type=radio]):not([type=range]),select,textarea){width:100%;min-height:var(--touch-target,44px);border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-1);color:var(--fg);font:inherit;padding:10px 12px}:where(.sm-field) :where(textarea){resize:vertical;min-height:96px}:where(.sm-fields){gap:var(--s-4,16px);grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));display:grid}:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list))){align-items:center;gap:6px var(--s-2,8px);flex-wrap:wrap;display:flex}:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list)))>:where(label,.sm-label){flex:0 auto}:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list)))>:where(:not(label,.sm-label)){flex:1 1 var(--sm-control,10rem);min-width:0}@container (width>=520px){:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list))){align-items:center;gap:var(--s-2,8px);grid-template-columns:minmax(5rem,9rem) minmax(0,1fr);display:grid}:where(.sm-field) :where(input:not([type=checkbox]):not([type=radio]):not([type=range]),select){min-height:36px;padding:6px 10px}:where(.sm-fields){gap:var(--s-2,8px) var(--s-4,16px)}}:where(.sm-choices){gap:var(--s-2,8px);grid-template-columns:repeat(auto-fill,minmax(var(--sm-tile,96px),1fr));border:0;min-width:0;margin:0;padding:0;display:grid}:where(.sm-choices[data-size=wide]){--sm-tile:160px}:where(.sm-choices)>:where(legend){font-size:var(--fs-body-s,.875rem);color:var(--fg-muted);margin-bottom:6px;padding:0}:where(.sm-choices)>:where(label){padding:var(--s-2,8px);border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-1);color:var(--fg-muted);font-size:max(12px,var(--fs-caption,.8125rem));text-align:center;cursor:pointer;align-content:start;justify-items:center;gap:6px;display:grid;position:relative}:where(.sm-choices)>:where(label):hover{border-color:var(--border-strong);color:var(--fg)}:where(.sm-choices) :where(input[type=radio],input[type=checkbox]){opacity:0;cursor:pointer;width:100%;height:100%;margin:0;position:absolute;inset:0}:where(.sm-choices)>:where(label:has(input:checked)){border-color:var(--fg);color:var(--fg);box-shadow:inset 0 0 0 1px var(--fg)}:where(.sm-choices)>:where(label:has(input:focus-visible)){outline:2px solid var(--signal);outline-offset:2px}:where(.sm-choices) :where(img,video,canvas,.sm-swatch){width:100%;aspect-ratio:var(--sm-tile-ratio,1);object-fit:cover;border-radius:var(--r-2,4px);background:var(--bg-inset);display:block}:where(.sm-choices) :where(.sm-glyph){--sm-glyph-size:28px;margin:10px 0 4px}:where(.sm-choices[data-ratio="16:9"]){--sm-tile-ratio:16/9}:where(.sm-choices[data-ratio="9:16"]){--sm-tile-ratio:9/16}:where(.sm-choices[data-compact])>:where(label){min-height:var(--touch-target,44px);grid-auto-flow:column;place-content:center;align-items:center;padding:6px 12px}:where(.sm-choices[data-compact]) :where(.sm-glyph){--sm-glyph-size:18px;margin:0}:where(.sm-choices) :where(audio){z-index:1;width:100%;height:32px;position:relative}:where(.sm-shape){box-sizing:border-box;width:calc(var(--sm-shape-size,32px) * min(1,var(--r,1)));aspect-ratio:var(--r,1);border:2px solid;border-radius:3px;max-width:100%;margin:4px auto;display:block}:where(.sm-choices)>:where(label:has(.sm-shape)){grid-template-rows:1fr auto;align-content:stretch}:where(.sm-choices) :where(.sm-shape){--sm-shape-size:36px;align-self:center;margin:6px auto 2px}:where(.sm-choices[data-compact]) :where(.sm-shape){--sm-shape-size:20px;margin:0}:where(.sm-choices[data-segmented]){gap:0;width:fit-content;max-width:100%;display:flex}:where(.sm-choices[data-segmented])>:where(label){min-height:36px;font-size:var(--fs-body-s,.875rem);white-space:nowrap;border-radius:0;justify-content:center;align-items:center;gap:6px;padding:4px 12px;display:inline-flex}:where(.sm-choices[data-segmented])>:where(label+label){margin-inline-start:-1px}:where(.sm-choices[data-segmented])>:where(label:first-of-type){border-start-start-radius:var(--r-pill,999px);border-end-start-radius:var(--r-pill,999px)}:where(.sm-choices[data-segmented])>:where(label:last-of-type){border-start-end-radius:var(--r-pill,999px);border-end-end-radius:var(--r-pill,999px)}:where(.sm-choices[data-segmented])>:where(label:has(input:checked)){z-index:1;background:var(--bg-elev-2);position:relative}:where(.sm-choices[data-segmented]) :where(.sm-glyph){--sm-glyph-size:16px;margin:0}:where(.sm-settings){gap:var(--s-3,12px) var(--s-4,16px);grid-template-columns:repeat(auto-fill,minmax(min(100%,11rem),1fr));align-items:start;min-width:0;display:grid}:where(.sm-settings)>:where(.sm-field){grid-template-columns:minmax(0,1fr);gap:4px}:where(.sm-settings)>:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list))){--sm-control:6rem;align-items:center;gap:4px var(--s-2,8px);flex-wrap:wrap;display:flex}:where(.sm-settings)>:where(.sm-choices)>:where(legend),:where(.sm-settings) :where(.sm-label){font-size:max(12px,var(--fs-caption,.8125rem))}@container (width<=519px){:where(.sm-choices[data-compact],.sm-choices[data-segmented]){scrollbar-width:none;flex-wrap:nowrap;width:auto;display:flex;overflow-x:auto}:where(.sm-choices[data-compact])>:where(label),:where(.sm-choices[data-segmented])>:where(label){flex:none}}:where(.sm-list){border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-1);min-width:0;margin:0;padding:0;list-style:none;display:grid;overflow:hidden}:where(.sm-list)>:where(li){align-items:center;gap:var(--s-2,8px);min-width:0;min-height:40px;padding:4px var(--s-2,8px);border-bottom:1px solid var(--divider);display:flex}:where(.sm-list)>:where(li:last-child){border-bottom:0}:where(.sm-list)>:where(li:has(>details)){padding:0;display:block}:where(.sm-list)>:where(li)>:where(details)>:where(summary){align-items:center;gap:var(--s-2,8px);min-height:40px;padding:4px var(--s-2,8px);cursor:pointer;list-style:none;display:flex}:where(.sm-list)>:where(li)>:where(details)>:where(summary)::-webkit-details-marker{display:none}:where(.sm-list)>:where(li)>:where(details[open]){background:var(--bg-inset)}:where(.sm-list)>:where(li)>:where(details)>:where(:not(summary)){padding:var(--s-2,8px) var(--s-3,12px) var(--s-3,12px)}:where(.sm-list) :where(img,video,canvas,.sm-swatch){object-fit:cover;border-radius:var(--r-2,4px);background:var(--bg-inset);flex:none;width:40px;height:26px}:where(.sm-list) :where(.sm-line){white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}:where(.sm-list) :where(small){color:var(--fg-subtle);font-size:max(12px,var(--fs-caption,.8125rem));white-space:nowrap;font-variant-numeric:tabular-nums;flex:none}:where(.sm-list)>:where(.sm-list-more){display:none}@container (width<=519px){:where(.sm-list[data-peek]:not([data-open]))>:where(li:nth-child(n+4):not(.sm-list-more)){display:none}:where(.sm-list[data-peek]:not([data-open]))>:where(.sm-list-more){color:var(--fg-muted);display:flex}}:where(.sm-gallery){gap:var(--s-2,8px);grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--sm-tile,140px)),1fr));margin:0;padding:0;list-style:none;display:grid}:where(.sm-gallery)>:where(*){border-radius:var(--r-3,8px);background:var(--bg-inset);margin:0;position:relative;overflow:hidden}:where(.sm-gallery) :where(img,video,canvas){width:100%;aspect-ratio:var(--sm-tile-ratio,1);object-fit:cover;display:block}:where(.sm-gallery) :where(figcaption){font-size:max(12px,var(--fs-caption,.8125rem));color:var(--fg-muted);padding:6px 8px}:where(.sm-gallery) :where([aria-selected=true],.is-selected){box-shadow:inset 0 0 0 2px var(--fg)}:where(.sm-gallery[data-size=small]){--sm-tile:92px;--sm-tile-ratio:3/2}:where(.sm-status){align-items:center;gap:var(--s-2,8px);min-height:24px;font-size:var(--fs-body-s,.875rem);color:var(--fg-muted);display:inline-flex}:where(.sm-status):empty{display:none}:where(.sm-status[data-state]):before{content:"";background:currentColor;border-radius:50%;flex:none;width:14px;height:14px}:where(.sm-status[data-state=loading]):before{background:0 0;border:2px solid;border-right-color:#0000;animation:.8s linear infinite sm-spin}:where(.sm-status[data-state=success]){color:var(--attention-ok,var(--fg))}:where(.sm-status[data-state=success]):before{background:0 0;border:2px solid;border-width:0 2px 2px 0;border-radius:0;width:6px;height:11px;margin:0 4px 3px;transform:rotate(45deg)}:where(.sm-status[data-state=waiting]){color:var(--attention-warning,var(--signal))}:where(.sm-status[data-state=waiting]):before{width:8px;height:8px;margin:0 3px}:where(.sm-status[data-state=error]){color:var(--attention-error,var(--signal))}:where(.sm-status[data-state=error]):before{clip-path:polygon(50% 0,100% 100%,0 100%);border-radius:0}:where(.sm-progress){border-radius:var(--r-pill,999px);background:var(--bg-elev-2);width:100%;height:4px;accent-color:var(--fg);appearance:none;border:0;overflow:hidden}:where(.sm-progress)::-webkit-progress-bar{background:var(--bg-elev-2)}:where(.sm-progress)::-webkit-progress-value{background:var(--fg)}:where(.sm-progress)::-moz-progress-bar{background:var(--fg)}:where(.sm-more){border-top:1px solid var(--divider)}:where(.sm-more)>:where(summary){align-items:center;gap:var(--s-2,8px);min-height:var(--touch-target,44px);color:var(--fg-muted);font-size:var(--fs-body-s,.875rem);cursor:pointer;padding:0;list-style:none;display:flex}:where(.sm-more)>:where(summary)::-webkit-details-marker{display:none}:where(.sm-more)>:where(summary):after{content:"";width:7px;height:7px;transition:transform var(--dur-fast,.16s) var(--ease-out,ease);border:1.5px solid;border-width:0 1.5px 1.5px 0;margin-inline-start:2px;transform:translateY(-2px)rotate(45deg)}:where(.sm-more[open])>:where(summary):after{transform:translateY(2px)rotate(-135deg)}:where(.sm-more)>:where(summary):hover{color:var(--fg)}:where(.sm-more)>:where(:not(summary)){margin-top:var(--s-2,8px)}:where(.sm-more[open]){padding-bottom:var(--s-3,12px)}:where(.sm-label){position:relative}:where(.sm-hint){vertical-align:middle;display:inline-block}:where(:not(.sm-label))>:where(.sm-hint){position:relative}:where(.sm-hint)>:where(summary){width:var(--touch-target,44px);height:var(--touch-target,44px);min-height:0;color:var(--fg-subtle);cursor:pointer;border:0;place-items:center;margin:-8px;padding:0;list-style:none;display:inline-grid}:where(.sm-hint)>:where(summary)::-webkit-details-marker{display:none}:where(.sm-hint)>:where(summary):before{content:"i";width:15px;height:15px;font:600 10px/1 var(--font-body);border:1.5px solid;border-radius:50%;place-items:center;font-style:normal;display:grid}:where(.sm-hint)>:where(summary):hover,:where(.sm-hint[open])>:where(summary){color:var(--fg)}:where(.sm-hint)>:where(:not(summary)){z-index:5;inset-inline-start:0;border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-2);width:max-content;max-width:min(280px,100cqi - 32px);color:var(--fg);font-size:var(--fs-body-s,.875rem);box-shadow:var(--shadow-1);margin:4px 0 0;padding:10px 12px;line-height:1.45;position:absolute;top:100%}:where(:not(.sm-label))>:where(.sm-hint[open]){display:block}:where(:not(.sm-label))>:where(.sm-hint)>:where(:not(summary)){width:auto;max-width:60ch;position:static}:where(.sm-glyph){--g:var(--sm-glyph-size,20px);width:var(--g);height:var(--g);color:inherit;vertical-align:middle;flex:none;display:inline-block;position:relative}:where(.sm-glyph):before,:where(.sm-glyph):after{content:"";box-sizing:border-box;position:absolute}:where(.sm-glyph[data-glyph=play]):before{clip-path:polygon(0 0,100% 50%,0 100%);background:currentColor;inset:15% 15% 15% 25%}:where(.sm-glyph[data-glyph=pause]):before{border:solid;border-width:0 calc(var(--g)*.14);inset:18% 25%}:where(.sm-glyph[data-glyph=plus]):before,:where(.sm-glyph[data-glyph=close]):before{background:linear-gradient(currentColor,currentColor) 50%/100% 2px no-repeat,linear-gradient(currentColor,currentColor) 50%/2px 100% no-repeat;inset:15%}:where(.sm-glyph[data-glyph=close]):before{transform:rotate(45deg)}:where(.sm-glyph[data-glyph=check]):before{border:2px solid;border-width:0 2px 2px 0;width:30%;height:58%;top:12%;left:36%;transform:rotate(45deg)}:where(.sm-glyph[data-glyph=chevron]):before{border:2px solid;border-width:0 2px 2px 0;width:40%;height:40%;top:22%;left:30%;transform:rotate(45deg)}:where(.sm-glyph[data-glyph=upload]):before{border:2px solid;border-top:0;border-radius:0 0 3px 3px;height:35%;bottom:10%;left:10%;right:10%}:where(.sm-glyph[data-glyph=upload]):after{clip-path:polygon(50% 0,100% 45%,60% 45%,60% 100%,40% 100%,40% 45%,0 45%);background:currentColor;height:62%;top:4%;left:25%;right:25%}:where(.sm-glyph[data-glyph=image]):before{border:2px solid;border-radius:3px;inset:12%}:where(.sm-glyph[data-glyph=image]):after{clip-path:polygon(0 100%,35% 20%,60% 65%,75% 45%,100% 100%);background:currentColor;height:34%;bottom:24%;left:22%;right:22%}:where(.sm-glyph[data-glyph=video]):before{border:2px solid;border-radius:3px;inset:22% 28% 22% 8%}:where(.sm-glyph[data-glyph=video]):after{clip-path:polygon(0 35%,100% 0,100% 100%,0 65%);background:currentColor;width:20%;top:30%;bottom:30%;right:8%}:where(.sm-glyph[data-glyph=audio]):before{background:linear-gradient(currentColor,currentColor) 0 60%/2px 40% no-repeat,linear-gradient(currentColor,currentColor) 33%/2px 80% no-repeat,linear-gradient(currentColor,currentColor) 66%/2px 100% no-repeat,linear-gradient(currentColor,currentColor) 100% 60%/2px 50% no-repeat;inset:15% 12%}:where(.sm-glyph[data-glyph=text]):before{background:linear-gradient(currentColor,currentColor) 0 0/100% 2px no-repeat,linear-gradient(currentColor,currentColor) 0/100% 2px no-repeat,linear-gradient(currentColor,currentColor) 0 100%/60% 2px no-repeat;inset:20% 12%}:where(.sm-glyph[data-glyph=spark]):before{clip-path:polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);background:currentColor;inset:8%}:where(.sm-glyph[data-glyph=info]):before{border:2px solid;border-radius:50%;inset:10%}:where(.sm-glyph[data-glyph=info]):after{background:linear-gradient(currentColor,currentColor) 0 0/2px 2px no-repeat,linear-gradient(currentColor,currentColor) 0 100%/2px 60% no-repeat;width:2px;height:46%;margin-left:-1px;top:28%;left:50%}:where(.sm-glyph[data-glyph=warning]):before{clip-path:polygon(50% 0,100% 100%,0 100%);background:currentColor;inset:8% 4% 10%}:where(.sm-glyph[data-glyph=warning]):after{background:linear-gradient(var(--bg),var(--bg)) 0 0/2px 60% no-repeat,linear-gradient(var(--bg),var(--bg)) 0 100%/2px 2px no-repeat;width:2px;height:38%;margin-left:-1px;top:38%;left:50%}:where(.sm-glyph[data-glyph=spinner]):before{border:2px solid;border-right-color:#0000;border-radius:50%;animation:.8s linear infinite sm-spin;inset:12%}:where([class*=sm-][hidden]){display:none!important}:where(.sm-sr){clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@keyframes sm-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){:where(.sm-status[data-state=loading]):before,:where(.sm-glyph[data-glyph=spinner]):before{opacity:.6;border-right-color:currentColor;animation:none}:where(.sm-more)>:where(summary):after{transition:none}}.sm-quiet{border:1px solid var(--border-tok)}html,body{background:var(--bg);color:var(--fg);margin:0}.dh-page{height:100dvh;font-family:var(--font-body);flex-direction:column;display:flex;overflow:hidden}.dh-bar{align-items:center;gap:var(--s-2,8px) var(--s-3,12px);min-height:56px;padding:var(--s-2,8px) var(--s-4,16px);border-bottom:var(--bw-1,1px) solid var(--divider);flex-wrap:wrap;flex:none;display:flex}.dh-title{align-items:baseline;gap:10px;min-width:0;display:flex}.dh-title h1{font-family:var(--font-display);letter-spacing:var(--tr-display);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:24px;font-style:italic;font-weight:200;line-height:1.1;overflow:hidden}.dh-meta{color:var(--fg-muted);font-size:12px}.dh-spacer{flex:1}.dh-picker{border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);max-width:min(340px,100%);height:32px;color:var(--fg-muted);align-items:center;gap:6px;padding:0 4px 0 10px;display:inline-flex}.dh-picker select{min-width:0;max-width:280px;height:30px;color:var(--fg);font:inherit;background:0 0;border:0;padding:0 4px;font-size:13px}.dh-picker select:focus{outline:none}.dh-seg{border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);padding:2px;display:inline-flex}.dh-seg button{width:30px;height:26px;color:var(--fg-muted);cursor:pointer;background:0 0;border:0;border-radius:3px;place-items:center;padding:0;display:inline-grid}.dh-seg button[aria-checked=true]{background:var(--fg);color:var(--bg)}.dh-glyph{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:16px;height:16px}.dh-icon{border-radius:var(--r-2);width:32px;height:32px;color:var(--fg-muted);cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:inline-grid}.dh-icon:hover,.dh-seg button:hover:not([aria-checked=true]),.dh-tabs [role=tab]:hover{background:var(--bg-elev-2);color:var(--fg)}.dh-seg button:focus-visible,.dh-icon:focus-visible,.dh-tabs [role=tab]:focus-visible,.dh-page .btn:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.dh-main{min-height:0;padding:var(--s-4,16px);flex-direction:column;flex:1;display:flex;overflow:auto}.dh-frame{flex-direction:column;flex:1;width:100%;min-width:0;margin:0 auto;display:flex;container-type:inline-size}.dh-noview{flex:1}@container (width>=760px){.dh-noview{align-content:start;column-gap:var(--s-6,24px);grid-template-rows:auto auto 1fr;grid-template-columns:minmax(260px,380px) minmax(0,1fr)}.dh-noview>:not(.dh-results){grid-column:1}.dh-noview>.dh-results{padding-top:0;padding-left:var(--s-6,24px);border-top:0;border-left:var(--bw-1,1px) solid var(--divider);grid-area:1/2/-1;align-content:start;align-self:stretch}}.dh-noview>.dh-results-empty,.dh-results-empty{place-content:center;justify-items:center;min-height:160px}.dh-results-empty p{color:var(--fg-subtle);margin:0;font-size:13px}.dh-dock{border-top:var(--bw-1,1px) solid var(--border-strong);background:var(--bg-elev-1);flex-direction:column;flex:none;max-height:75dvh;display:flex;position:relative}.dh-dock-grip{cursor:ns-resize;z-index:1;touch-action:none;height:10px;position:absolute;top:-5px;left:0;right:0}.dh-tabs{min-height:40px;padding:0 var(--s-2,8px) 0 10px;flex:none;align-items:center;gap:2px;display:flex;overflow-x:auto}.dh-tabs [role=tab]{border-radius:var(--r-2);height:28px;color:var(--fg-muted);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0 10px;font-size:13px;display:inline-flex}.dh-tabs [role=tab][aria-selected=true]{background:var(--bg);color:var(--fg);box-shadow:inset 0 0 0 var(--bw-1,1px) var(--border-tok)}.dh-alert{background:var(--attention-error);border-radius:50%;width:6px;height:6px}.dh-tabs-status{padding:0 var(--s-2,8px);color:var(--fg-muted);white-space:nowrap;margin-left:auto;font-size:12px}.dh-fold svg{transform:rotate(-90deg)}.dh-dock[data-open=true] .dh-fold svg{transform:rotate(90deg)}.dh-tabpanel{min-height:0;padding:10px var(--s-4,16px) 14px;border-top:var(--bw-1,1px) solid var(--divider);flex:1;overflow:auto}.dh-console ol{border-top:var(--bw-1,1px) solid var(--divider);margin:0;padding:0;list-style:none}.dh-calls{margin:0;padding:0;font-size:13px;list-style:none;display:grid}.dh-calls li{border-bottom:var(--bw-1,1px) solid var(--divider);flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:6px 0;display:flex}.dh-calls span{color:var(--fg-muted)}.dh-calls small{color:var(--fg-subtle);margin-left:auto}@media (width<=700px){.dh-bar{padding:var(--s-2,8px) 12px}.dh-title h1{font-size:20px}.dh-main{padding:12px}.dh-tabs-status{display:none}}.dh-problem{margin:var(--s-4,16px) var(--s-6,24px) 0;padding:var(--s-3,12px) var(--s-4,16px);border:var(--bw-1,1px) solid var(--border-strong);border-radius:var(--r-2);background:var(--bg-elev-1);white-space:pre-wrap;overflow-wrap:anywhere}.dh-noview{box-sizing:border-box;gap:var(--s-4,16px);min-height:100%;padding:var(--s-6,24px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-3);justify-items:start;display:grid}.dh-noview p{color:var(--fg-muted);margin:0}.dh-form{gap:var(--s-2,8px);width:100%;display:grid}.dh-row{align-items:center;gap:var(--s-3,12px);min-height:36px;display:flex}.dh-row label{min-width:96px;color:var(--fg-muted);font-size:13px}.dh-row input[type=text],.dh-row input[type=number]{min-width:0;height:32px;padding:0 var(--s-2,8px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);font:inherit;flex:1;font-size:13px}.dh-media{align-items:center;gap:var(--s-3,12px);min-height:36px;display:flex}.dh-media-label{min-width:96px;color:var(--fg-muted);font-size:13px}.dh-media-tile{align-items:center;gap:var(--s-2,8px);max-width:100%;min-height:32px;padding:0 var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);font-size:13px;display:inline-flex}.dh-media-tile span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.dh-results{gap:var(--s-3,12px);width:100%;padding-top:var(--s-4,16px);border-top:var(--bw-1,1px) solid var(--divider);display:grid}.dh-results h2{margin:0;font-size:14px;font-weight:600}.dh-section-head{justify-content:space-between;align-items:center;gap:var(--s-2,8px);margin-bottom:var(--s-2,8px);display:flex}.dh-section-head h2{letter-spacing:var(--tr-body);margin:0;font-size:13px;font-weight:600}.dh-input textarea{box-sizing:border-box;width:100%;padding:var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);font-family:var(--font-mono);resize:vertical;font-size:12px;line-height:1.5}.dh-input p,.dh-muted{margin:var(--s-2,8px) 0 0;color:var(--fg-muted);font-size:13px}.dh-json{max-height:240px;padding:var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);font-family:var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12px;line-height:1.5;overflow:auto}.dh-console{flex-direction:column;min-height:0;display:flex}.dh-entry{gap:var(--s-2,8px);padding:var(--s-2,8px) 0;border-bottom:var(--bw-1,1px) solid var(--divider);grid-template-columns:auto auto minmax(0,1fr);align-items:baseline;font-size:12px;display:grid}.dh-entry time{color:var(--fg-muted);font-variant-numeric:tabular-nums}.dh-kind{color:var(--fg-muted);font-size:11px}.dh-entry pre{font-family:var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.dh-error .dh-kind,.dh-error pre{color:var(--fg);font-weight:600}.dh-stand-in .dh-kind{color:var(--signal)}.dh-row select{min-width:0;height:32px;padding:0 var(--s-2,8px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);font:inherit;flex:1}.dh-slider{align-items:center;gap:var(--s-2,8px);flex:1;min-width:0;display:flex}.dh-slider input{flex:1;min-width:0}.dh-slider output{text-align:right;min-width:2.5em;color:var(--fg-muted);font-size:13px}.dh-run-problem{padding:var(--s-2,8px) var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-strong);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);margin:0}.dh-result-media{gap:var(--s-2,8px);justify-items:center;width:100%;margin:0;display:grid}.dh-result-media img,.dh-result-media video{object-fit:contain;border-radius:var(--r-3,8px);background:#000;width:auto;min-width:min(100%,320px);max-width:100%;height:auto;max-height:min(62dvh,640px);display:block}.dh-result-media audio{width:100%}.dh-result-media figcaption{max-width:100%;color:var(--fg-muted);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.dh-results .sm-data-list:has(>li>.dh-result-media){gap:var(--s-4,16px);grid-template-columns:repeat(auto-fill,minmax(min(100%,200px),1fr));margin:0;padding:0;list-style:none;display:grid}:is(.dh-results .sm-data-list:has(>li>.dh-result-media) .dh-result-media img,.dh-results .sm-data-list:has(>li>.dh-result-media) .dh-result-media video){min-width:min(100%,200px);max-height:min(56dvh,560px)}.dh-media-tile small{margin-left:var(--s-1,4px);border:var(--bw-1,1px) solid var(--border-tok);color:var(--fg-muted);border-radius:999px;padding:1px 6px;font-size:11px}.dh-media-pick{cursor:pointer;font:inherit;color:var(--fg)}.dh-media-pick:hover:not(:disabled){border-color:var(--border-strong)}.dh-media-problem{color:var(--attention-error);font-size:12px}.dh-media-empty{flex-wrap:wrap;align-items:flex-start}.dh-media-drop{padding:var(--s-5,20px) var(--s-4,16px);border:1.5px dashed var(--border-strong);border-radius:var(--r-3);background:var(--bg-elev-1);text-align:center;flex:240px;justify-items:center;gap:6px;display:grid}.dh-media-drop[data-over]{border-style:solid;border-color:var(--fg);background:var(--hover-wash)}.dh-media-drop strong{color:var(--fg);font-size:14px;font-weight:600}.dh-media-drop span{color:var(--fg-muted);font-size:13px}.dh-media-drop small{color:var(--fg-muted);font-size:12px}.dh-media-drop .dh-media-pick{margin-top:var(--s-1,4px)}.dh-switch{border-radius:var(--r-2);height:28px;color:var(--fg-muted);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:0 6px;font-size:13px;display:inline-flex}.dh-switch:hover{color:var(--fg)}.dh-switch:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.dh-switch-track{background:var(--bg-elev-2);width:32px;height:18px;box-shadow:inset 0 0 0 var(--bw-1,1px) var(--border-strong);border-radius:999px;transition:background .15s;position:relative}.dh-switch-knob{background:var(--fg-muted);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.dh-switch[aria-checked=true] .dh-switch-track{background:var(--fg)}.dh-switch[aria-checked=true] .dh-switch-knob{background:var(--bg);transform:translate(14px)}.block-zoom-control{z-index:3;border:1px solid var(--border);background:var(--bg);opacity:0;border-radius:999px;align-items:center;gap:2px;padding:2px;transition:opacity .15s;display:flex;position:absolute;top:8px;right:8px;box-shadow:0 4px 14px #00000014}.bs-sandbox-ui:hover>.block-zoom-control,.block-zoom-control:focus-within{opacity:1}.block-zoom-control button{min-width:28px;height:28px;color:var(--fg);font:500 12px var(--font-body);cursor:pointer;background:0 0;border:0;border-radius:999px;place-items:center;padding:0 8px;display:inline-grid}.block-zoom-control button:hover:not(:disabled){background:var(--hover-wash)}.block-zoom-control button:disabled{opacity:.4;cursor:default}.block-zoom-control button:focus-visible{outline:2px solid var(--signal);outline-offset:1px}.block-zoom-control .block-zoom-mode[aria-pressed=true]{color:var(--fg-muted)}@media (width<=600px),(hover:none){.block-zoom-control{display:none}}@media (prefers-reduced-motion:reduce){.block-zoom-control{transition:none}}.bd-table,.bd-document,.bd-chart,.bd-code-view,.bd-files{min-width:0;color:var(--fg);font:14px/1.6 var(--font-body);margin:0}.bd-table-scroll{border:1px solid var(--border);border-radius:var(--r-3);max-width:100%;max-height:480px;overflow:auto}.bd-table-scroll:focus-visible,.bd-code:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.bd-table table{border-collapse:collapse;width:max-content;min-width:100%;font-size:13px}.bd-table th,.bd-table td{padding:var(--s-2) var(--s-3);text-align:left;vertical-align:top;border-bottom:1px solid var(--border);overflow-wrap:break-word;min-width:64px;max-width:320px}.bd-table th{background:var(--bg-secondary);white-space:nowrap;font-weight:600;position:sticky;top:0}.bd-table td.bd-number{text-align:right;font-variant-numeric:tabular-nums}.bd-table tbody tr:last-child td{border-bottom:0}.bd-bar{align-items:center;gap:var(--s-2);margin-top:var(--s-3);color:var(--fg-muted);flex-wrap:wrap;font-size:12px;display:flex}.bd-bar>span{margin-right:auto}.bd-document{gap:var(--s-3);overflow-wrap:anywhere;display:grid}.bd-document>*{margin:0}.bd-document-title{font:200 italic 22px/1.2 var(--font-display);letter-spacing:var(--tr-display)}.bd-document h4,.bd-document h5,.bd-document h6{font-size:15px;font-weight:600}.bd-document ul,.bd-document ol{padding-left:var(--s-5)}.bd-document blockquote{padding-left:var(--s-3);border-left:2px solid var(--border-strong);color:var(--fg-muted)}.bd-document code,.bd-code{font:12px/1.6 var(--font-mono)}.bd-plain{white-space:pre-wrap}.bd-code{padding:var(--s-3);white-space:pre;border:1px solid var(--border);border-radius:var(--r-3);background:var(--bg-secondary);max-height:420px;margin:0;overflow:auto}.bd-chart svg{width:100%;height:auto;display:block}.bd-chart figcaption{color:var(--fg-muted);margin-top:var(--s-2);font-size:12px}.bd-grid{stroke:var(--border);stroke-width:1px}.bd-axis{fill:var(--fg-muted);font:11px var(--font-body)}.bd-mark{fill:var(--fg);opacity:.82}.bd-line{stroke:var(--fg);stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}.bd-files{gap:var(--s-2);padding:0;list-style:none;display:grid}.bd-file{align-items:center;gap:var(--s-2) var(--s-3);padding:var(--s-3);border:1px solid var(--border);border-radius:var(--r-3);flex-wrap:wrap;display:flex}.bd-file-name{overflow-wrap:anywhere;font-weight:600}.bd-file>.btn{margin-left:auto}.bd-muted{color:var(--fg-muted);font-size:12px}.bd-color{align-items:center;gap:var(--s-2);font:13px var(--font-mono);display:inline-flex}.bd-swatch{border-radius:var(--r-2);border:1px solid var(--border-strong);width:20px;height:20px}.bd-link{color:var(--fg);overflow-wrap:anywhere}.bd-player,.bd-input{gap:var(--s-3);display:grid}.bd-color-row{gap:var(--s-2);align-items:center;display:flex}.bd-color-row input[type=color]{border:1px solid var(--border);border-radius:var(--r-3);background:var(--bg);width:44px;min-width:44px;height:44px;padding:2px}.bd-richtext textarea{font:13px/1.6 var(--font-mono)}.bd-table-input th{white-space:nowrap}.bd-table-input th>span{margin-right:var(--s-1)}.bd-table-input td{padding:var(--s-1)}.bd-table-input td input{border-radius:var(--r-2);width:100%;min-width:96px;min-height:36px;color:var(--fg);padding:var(--s-1) var(--s-2);font:inherit;background:0 0;border:1px solid #0000}.bd-table-input td input:focus{border-color:var(--border-strong);background:var(--bg)}.bd-table-input .bd-bar input{border:1px solid var(--border);border-radius:var(--r-3);background:var(--bg);min-height:40px;color:var(--fg);padding:var(--s-2) var(--s-3);font:inherit;flex:160px}.bd-chart svg{max-width:960px}.bd-richtext .bd-bar select{width:auto;min-height:40px}.sm-data-record{grid-template-columns:minmax(72px,max-content) minmax(0,1fr);gap:4px 16px;margin:0;display:grid}.sm-data-record dt{color:var(--text-muted)}.sm-data-record dd{overflow-wrap:anywhere;min-width:0;margin:0}.sm-data-list{gap:6px;margin:0;padding-left:20px;display:grid}.sm-data-list:has(>li>.sm-data-record){gap:0;padding-left:0;list-style:none}.sm-data-list:has(>li>.sm-data-record)>li{padding:10px 0}.sm-data-list:has(>li>.sm-data-record)>li+li{border-top:1px solid var(--border)}.sm-data-none{color:var(--text-muted)}@media (width<=600px){.sm-data-record{grid-template-columns:minmax(0,1fr);gap:0}.sm-data-record dd{margin-bottom:6px}.sm-data-record dd>.sm-data-record{border-left:1px solid var(--border);padding-left:12px}}
|
|
1
|
+
@font-face{font-family:Hanken Grotesk;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/HankenGrotesk-Variable.ttf)format("truetype")}@font-face{font-family:Hanken Grotesk;font-style:italic;font-weight:100 900;font-display:swap;src:url(/fonts/HankenGrotesk-Italic-Variable.ttf)format("truetype")}:root{--cream-50:#fdfaf1;--cream-100:#f7f0db;--cream-200:#ece3c9;--cream-300:#dcd2b5;--cream-600:#4e483a;--ink-50:#f2f0ec;--ink-100:#c9c6be;--ink-300:#4a4843;--ink-400:#26241f;--ink-500:#16140f;--ink-600:#0a0a0a;--signal:#e8b23a;--signal-dim:#e8b23a26;--signal-glow:#e8b23a4d;--font-display:"Balgin", "Hanken Grotesk", ui-sans-serif, sans-serif;--font-body:"Hanken Grotesk", ui-sans-serif, sans-serif;--font-mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--font:var(--font-body);--fs-display-xl:clamp(72px, 14vw, 220px);--fs-display-l:clamp(56px, 9vw, 144px);--fs-display-m:clamp(40px, 6vw, 96px);--fs-h4:1.25rem;--fs-body:1rem;--fs-body-s:.875rem;--fs-caption:.8125rem;--fs-micro:.75rem;--tr-display:-.02em;--tr-body:-.005em;--tr-micro:.08em;--lh-display:.92;--lh-tight:1.05;--s-1:4px;--s-2:8px;--s-3:12px;--s-4:16px;--s-5:24px;--s-6:32px;--s-7:48px;--s-8:64px;--s-9:96px;--s-10:128px;--s-11:192px;--page-gutter:clamp(20px, 3vw, 48px);--page-gutter-compact:clamp(16px, 5vw, 24px);--page-section-gap:clamp(32px, 5vw, 64px);--content-readable:720px;--content-wide:1440px;--control-height:40px;--touch-target:44px;--mobile-dock-height:66px;--z-nav:30;--hover:var(--hover-wash);--r-0:0;--r-1:2px;--r-2:4px;--r-3:8px;--r-pill:999px;--radius-sm:var(--r-2);--radius:var(--r-3);--radius-lg:var(--r-3);--bw-hair:.5px;--bw-1:1px;--bw-2:2px;--ease-out:cubic-bezier(.22, 1, .36, 1);--ease-in-out:cubic-bezier(.65, 0, .35, 1);--ease-spring:cubic-bezier(.34, 1.56, .64, 1);--dur-instant:80ms;--dur-fast:.16s;--dur-base:.24s;--dur-slow:.48s;--dur-reveal:.72s}:root,[data-mode=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#101010;--bg-elev-1:#232221;--bg-elev-2:#33312f;--bg-inset:#171716;--fg:#f3eee5;--fg-muted:#bbb2a7;--fg-subtle:#f3eee594;--fg-on-accent:#191716;--border-tok:#58534d;--border-strong:#8b7e6f;--divider:#393735;--signal:#d0ae77;--signal-dim:#d0ae7726;--signal-glow:#d0ae774d;--hover-wash:#f7f0db0f;--press-wash:#f7f0db1f;--selection-bg:var(--cream-100);--selection-fg:var(--ink-600);--shadow-1:0 1px 0 #f7f0db0a inset, 0 4px 12px #00000080;--shadow-2:0 1px 0 #f7f0db0f inset, 0 16px 48px #0009;--scrim-top:linear-gradient(to bottom, #0a0a0ad9, #0a0a0a00);--scrim-bottom:linear-gradient(to top, #0a0a0ad9, #0a0a0a00);--bg-primary:var(--bg);--bg-secondary:var(--bg-elev-1);--bg-tertiary:var(--bg-elev-2);--bg-elevated:var(--bg-elev-1);--bg-hover:#403d3a;--border:var(--border-tok);--border-light:var(--border-strong);--accent:var(--fg);--accent-hover:var(--cream-50);--accent-dim:var(--hover-wash);--accent-glow:#f7f0db38;--accent-contrast:var(--bg);--editor-standout-bg:var(--fg);--editor-standout-fg:var(--bg);--text-primary:var(--fg);--text-secondary:var(--fg-muted);--text-muted:var(--fg-subtle);--success:var(--fg);--warning:var(--signal);--danger:var(--signal);--attention-warning:#e0b24f;--attention-error:#e26a5f;--attention-ok:#6bc38e;--attention-info:#7da7e8;--shadow:var(--shadow-1);--shadow-lg:var(--shadow-2)}[data-mode=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--signal:#e8b23a;--signal-dim:#e8b23a26;--signal-glow:#e8b23a4d;--bg:var(--cream-100);--bg-elev-1:var(--cream-50);--bg-elev-2:var(--cream-200);--bg-inset:var(--cream-200);--fg:var(--ink-600);--fg-muted:var(--cream-600);--fg-subtle:#0a0a0a61;--fg-on-accent:var(--cream-100);--border-tok:#0a0a0a1a;--border-strong:#0a0a0a38;--divider:#0a0a0a0f;--hover-wash:#0a0a0a0d;--press-wash:#0a0a0a1a;--selection-bg:var(--ink-600);--selection-fg:var(--cream-100);--shadow-1:0 1px 0 #ffffff80 inset, 0 4px 12px #0a0a0a0f;--shadow-2:0 1px 0 #fff9 inset, 0 16px 48px #0a0a0a1a;--scrim-top:linear-gradient(to bottom, #f7f0dbe6, #f7f0db00);--scrim-bottom:linear-gradient(to top, #f7f0dbe6, #f7f0db00);--bg-primary:var(--bg);--bg-secondary:var(--bg-elev-1);--bg-tertiary:var(--bg-elev-2);--bg-elevated:var(--bg-elev-2);--bg-hover:var(--cream-300);--border:var(--border-tok);--border-light:var(--border-strong);--accent:var(--fg);--accent-hover:var(--ink-500);--accent-dim:var(--hover-wash);--accent-glow:#0a0a0a38;--accent-contrast:var(--bg);--editor-standout-bg:var(--ink-300);--editor-standout-fg:var(--cream-100);--text-primary:var(--fg);--text-secondary:var(--fg-muted);--text-muted:var(--fg-subtle);--success:var(--fg);--warning:var(--signal);--danger:var(--signal);--attention-warning:#b98200;--attention-error:#c2453d;--attention-ok:#2e7d4f;--attention-info:#2f67b8;--shadow:var(--shadow-1);--shadow-lg:var(--shadow-2)}[data-mode=white]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#fff;--bg-elev-1:#f4f4f1;--bg-elev-2:#eaeae6;--bg-inset:#eeeeea;--fg:#0e0e0e;--fg-muted:#5c5c5c;--fg-subtle:#767676;--fg-on-accent:#fff;--border-tok:#e1e1dd;--border-strong:#c4c4bf;--divider:#e7e7e3;--hover-wash:#0000000d;--press-wash:#00000017;--selection-bg:#0e0e0e;--selection-fg:#fff;--signal:#8e6b46;--signal-dim:#8e6b461a;--signal-glow:#8e6b4638;--shadow-1:0 1px 3px #0000000d;--shadow-2:0 12px 40px #0000001a;--scrim-top:linear-gradient(to bottom,#ffffffe6,#fff0);--scrim-bottom:linear-gradient(to top,#ffffffe6,#fff0);--bg-primary:var(--bg);--bg-secondary:var(--bg-elev-1);--bg-tertiary:var(--bg-elev-2);--bg-elevated:var(--bg-elev-1);--bg-hover:#ecece8;--border:var(--border-tok);--border-light:var(--border-strong);--accent:var(--fg);--accent-hover:#2a2a2a;--accent-dim:var(--hover-wash);--accent-glow:#0000001f;--accent-contrast:var(--bg);--editor-standout-bg:#24211d;--editor-standout-fg:#fff;--text-primary:var(--fg);--text-secondary:var(--fg-muted);--text-muted:var(--fg-subtle);--success:var(--fg);--warning:var(--signal);--danger:var(--signal);--attention-warning:#b98200;--attention-error:#c2453d;--attention-ok:#2e7d4f;--attention-info:#2f67b8;--shadow:var(--shadow-1);--shadow-lg:var(--shadow-2)}button[data-icon-action=true]{cursor:pointer;flex-shrink:0;line-height:1;min-width:36px!important;min-height:36px!important;box-shadow:none!important;color:var(--text-secondary,var(--fg))!important;background:0 0!important;border:0!important;border-radius:0!important;justify-content:center!important;align-items:center!important;padding:8px!important;display:inline-flex!important}button[data-icon-action=true]:hover:not(:disabled){color:var(--text-primary,var(--fg))!important}button[data-icon-action=true]:focus-visible{outline-offset:2px;outline:2px solid var(--signal)!important}button[data-icon-action=true]:disabled{cursor:not-allowed;opacity:.4!important}button[data-icon-action=true][aria-pressed=true]{text-underline-offset:5px;text-decoration:underline;color:var(--text-primary,var(--fg))!important}@media (pointer:coarse){button[data-icon-action=true]{min-width:44px!important;min-height:44px!important}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root[data-anim-theme="1"]:not([data-mode=white]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0a0d13;--bg-elev-1:#0f141c;--bg-elev-2:#1a2230;--bg-inset:#0f141c;--fg:#d8dee8;--fg-muted:#8b98ac;--fg-subtle:#64748b;--fg-on-accent:#0a0d13;--border-tok:#232d3d;--border-strong:#303d50;--divider:#1a2230;--hover-wash:#8b98ac14;--press-wash:#8b98ac29;--selection-bg:#303d50;--selection-fg:#d8dee8;--bg-primary:#0a0d13;--bg-secondary:#0f141c;--bg-tertiary:#1a2230;--bg-elevated:#1a2230;--bg-hover:#232d3d;--border:#232d3d;--border-light:#303d50;--accent:#8b98ac;--accent-hover:#b6c0ce;--accent-dim:#8b98ac1f;--accent-glow:#8b98ac40;--accent-contrast:#0a0d13;--editor-standout-bg:#d8dee8;--editor-standout-fg:#0a0d13;--text-primary:#d8dee8;--text-secondary:#8b98ac;--text-muted:#64748b;--success:#8b98ac;--warning:#b6c0ce;--danger:#b6c0ce}html,body{background:var(--bg);width:100%;height:100%;color:var(--fg);font-family:var(--font-body);letter-spacing:var(--tr-body);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-size:14px;line-height:1.6;overflow:hidden}#root{width:100%;height:100%;overflow:hidden}.sm-app-shell{height:100dvh}@keyframes sm-navmenu-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}.mobile-nav-menu{animation:.2s cubic-bezier(.22,1,.36,1) sm-navmenu-in}::selection{background:var(--selection-bg);color:var(--selection-fg)}.display,h1,h2{font-family:var(--font-display);font-style:italic;font-weight:200;line-height:var(--lh-tight);letter-spacing:var(--tr-display);margin:0}.display{line-height:var(--lh-display)}h3,h4{font-family:var(--font-body);font-weight:500;line-height:var(--lh-tight);letter-spacing:-.01em;margin:0}.eyebrow{color:var(--fg-muted);font-size:11px;font-weight:500}code,pre,.mono{font-family:var(--font-mono);font-size:.92em}.listing-identity code{font-family:inherit;font-size:inherit}button{font-family:var(--font-body);cursor:pointer;letter-spacing:var(--tr-body);border:none;outline:none}textarea,input,select{font-family:var(--font-body);outline:none}select{background-color:var(--bg-elev-1);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--r-2)}select option,select optgroup{background-color:var(--bg-elevated);color:var(--text-primary)}select option:checked{font-weight:600}.tsel-trigger{background-color:var(--bg-elev-1);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--r-2);font-family:var(--font-body);font-size:inherit;cursor:pointer;text-align:left;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;display:inline-flex}.tsel-trigger:hover{border-color:var(--border-strong)}.tsel-trigger:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.tsel-trigger:disabled{opacity:.5;cursor:default}.tsel-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tsel-caret{opacity:.7;flex:none;font-size:10px}.tsel-pop{z-index:100100;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--r-2);max-height:260px;padding:4px;overflow-y:auto;box-shadow:0 8px 28px #00000047}.tsel-opt{color:var(--text-primary);cursor:pointer;white-space:nowrap;border-radius:6px;align-items:center;gap:6px;padding:6px 8px;font-size:13px;display:flex}.tsel-opt[data-active=true]{background:var(--bg-elev-1)}.tsel-opt[aria-selected=true]{font-weight:600}.tsel-opt[aria-disabled=true]{color:var(--text-muted);cursor:default}.tsel-opt[aria-disabled=true][data-active=true]{background:0 0}.tsel-check{opacity:.8;flex:none;width:12px;font-size:11px}.tsel-opt-label{text-overflow:ellipsis;flex:auto;overflow:hidden}.tsel-note{cursor:help;width:16px;height:16px;color:var(--text-muted);border:1px solid var(--border);border-radius:999px;flex:none;justify-content:center;align-items:center;font-size:11px;display:inline-flex;position:relative}.tsel-note:hover{color:var(--text-primary);border-color:var(--border-strong)}.tsel-tip{z-index:100110;background:var(--text-primary);color:var(--bg-elevated);box-sizing:border-box;white-space:normal;pointer-events:none;border-radius:5px;max-width:min(260px,100vw - 16px);padding:4px 8px;font-size:11px;font-weight:600;box-shadow:0 2px 10px #0000004d}@media (width<=767.98px),(height<=480px) and (pointer:coarse){.tsel-opt{box-sizing:border-box;min-height:44px;font-size:14px}.tsel-note{flex:0 0 44px;width:44px;height:44px;font-size:14px}}.video-editor input,.video-editor select,.video-editor textarea{background:var(--bg-inset);width:100%;min-width:0;color:var(--fg);border:var(--bw-1) solid var(--border-strong);border-radius:var(--r-2);font-family:var(--font-body);accent-color:var(--signal);padding:7px 8px;font-size:12px}.video-editor,.mobile-editor-root{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.video-editor input,.video-editor select,.video-editor textarea,.video-editor [contenteditable=true],.mobile-editor-root input,.mobile-editor-root select,.mobile-editor-root textarea,.mobile-editor-root [contenteditable=true]{-webkit-user-select:text;user-select:text;-webkit-touch-callout:default}.video-editor input[type=range]{background:0 0;border:0;padding:0}.video-editor input[type=checkbox]{width:auto;min-width:auto}.video-editor select:focus,.video-editor input:focus,.video-editor textarea:focus{border-color:var(--signal);box-shadow:0 0 0 1px var(--signal-dim)}:focus-visible{outline:2px solid var(--signal);outline-offset:2px}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--r-pill)}::-webkit-scrollbar-thumb:hover{background:var(--fg-subtle)}.sm-hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.sm-hide-scrollbar::-webkit-scrollbar{width:0;height:0;display:none}.btn{align-items:center;gap:var(--s-2);padding:var(--s-2) var(--s-4);border-radius:var(--r-pill);letter-spacing:var(--tr-body);transition:transform var(--dur-fast) var(--ease-out), background-color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out), opacity var(--dur-fast) var(--ease-out);font-size:13px;font-weight:500;display:inline-flex}.btn:active{transform:scale(.98)}.btn-primary{background:var(--fg);color:var(--bg)}.btn-primary:hover{background:var(--fg);opacity:.86}.btn-primary:disabled{opacity:.4;cursor:not-allowed}.btn-secondary{color:var(--fg);border:var(--bw-1) solid var(--border-strong);background:0 0}.btn-secondary:hover{background:var(--hover-wash);border-color:var(--fg)}.btn-ghost{color:var(--fg-muted);background:0 0;padding:6px 10px}.btn-ghost:hover{background:var(--hover-wash);color:var(--fg)}.btn-icon{color:var(--fg-muted);border-radius:var(--r-2);transition:background-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out);background:0 0;justify-content:center;align-items:center;padding:5px;display:inline-flex}.btn-icon:hover{background:var(--hover-wash);color:var(--fg)}.btn-icon:active{transform:scale(.98)}.btn-icon:disabled{opacity:.4;cursor:not-allowed}.typing-indicator{align-items:center;gap:4px;padding:4px 0;display:flex}.typing-indicator span{border-radius:var(--r-pill);background:var(--fg-subtle);width:6px;height:6px;animation:1.2s infinite bounce}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes bounce{0%,60%,to{opacity:.4;transform:translateY(0)}30%{opacity:1;transform:translateY(-5px)}}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{0%,to{opacity:.4;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}@keyframes toastIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}button:focus-visible,[role=button]:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]):not([type=button]):not([type=submit]):not([type=reset]):is(:focus,:focus-visible),textarea:is(:focus,:focus-visible),select:is(:focus,:focus-visible),[contenteditable]:not([contenteditable=false]):is(:focus,:focus-visible){outline:none!important}@keyframes skeletonShimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.skeleton{background:linear-gradient(90deg,#ffffff08 0%,#ffffff1a 50%,#ffffff08 100%) 0 0/200% 100%;border-radius:6px;animation:1.4s ease-in-out infinite skeletonShimmer}.node-state-empty{border-style:dashed!important}.node-state-generating{box-shadow:0 0 0 2px var(--accent);position:relative}.node-state-generating:after{content:"";border-radius:inherit;pointer-events:none;will-change:opacity;animation:1.6s ease-in-out infinite nodePulse;position:absolute;inset:-2px;box-shadow:0 0 18px #f7c8328c}@keyframes nodePulse{0%,to{opacity:.36}50%{opacity:1}}.node-state-warning{position:relative;border-color:var(--attention-warning)!important}.node-state-warning:after{content:"";border-radius:inherit;pointer-events:none;box-shadow:0 0 0 1px var(--attention-warning), 0 0 14px color-mix(in srgb, var(--attention-warning) 40%, transparent);position:absolute;inset:-2px}.node-state-failed{border-top:4px solid #d04848!important}.node-state-failed:before{content:"⚠ ";color:#d04848;z-index:2;pointer-events:none;font-size:12px;font-weight:800;position:absolute;top:6px;left:8px}.react-flow__node{cursor:default}.react-flow__node.dragging,.react-flow__pane.dragging .react-flow__viewport{will-change:transform}.react-flow__node:not(.react-flow__node-sceneGroupNode):not(.react-flow__node-shotLabelNode):not(.react-flow__node-stickyNoteNode):not(.react-flow__node-transitionNode){box-shadow:1px 1px 0 var(--node-side,#d8cfb3), 2px 2px 0 var(--node-side,#d8cfb3), 3px 3px 0 var(--node-side,#d8cfb3), 4px 4px 0 var(--node-side,#d8cfb3), 5px 5px 0 var(--node-side,#d8cfb3), 6px 6px 0 var(--node-side,#d8cfb3), 7px 7px 0 var(--node-edge,#0a0a0a2e), 14px 16px 18px -4px #0a0a0a2e;border-radius:10px}[data-mode=dark] .react-flow__node:not(.react-flow__node-sceneGroupNode):not(.react-flow__node-shotLabelNode):not(.react-flow__node-stickyNoteNode):not(.react-flow__node-transitionNode){--node-side:#1f1d18;--node-edge:#f7f0db2e}.react-flow__controls{grid-template-columns:repeat(2,1fr)!important;display:grid!important}.react-flow__controls button{background:var(--bg-elev-2)!important;border-color:var(--border-tok)!important;color:var(--fg-muted)!important;fill:var(--fg-muted)!important}.react-flow__controls button:hover{background:var(--ink-300)!important}.react-flow__edge-path{stroke:var(--border-strong)}.react-flow.rf-edges-panning .react-flow__edges{display:none}.react-flow__node.node-controls-locked input,.react-flow__node.node-controls-locked textarea,.react-flow__node.node-controls-locked select,.react-flow__node.node-controls-locked button,.react-flow__node.node-controls-locked [role=button]{pointer-events:none!important}.react-flow__node.node-controls-locked{cursor:grab}.react-flow__node.node-controls-locked:active{cursor:grabbing}.react-flow__node.scene-add-available-node{filter:drop-shadow(0 0 10px #f7f0db38)}.react-flow__node.scene-add-available-node>div{outline:1px solid var(--border-strong);outline-offset:4px;border-radius:var(--r-3)}.react-flow__node.scene-add-available-node:after{content:"";border:1px dashed var(--border-strong);border-radius:var(--r-3);pointer-events:none;position:absolute;inset:-8px}.react-flow__node.node-replace-available{filter:drop-shadow(0 0 10px #f7f0db38)}.react-flow__node.node-replace-available>div{outline:1px solid var(--border-strong);outline-offset:4px;border-radius:var(--r-3)}.react-flow__node.node-replace-available:after{content:"";border:1px dashed var(--border-strong);border-radius:var(--r-3);pointer-events:none;position:absolute;inset:-8px}select option{background:var(--bg-elev-2);color:var(--fg)}.spinner{border:2px solid var(--border-tok);border-top-color:var(--fg);border-radius:var(--r-pill);width:16px;height:16px;animation:.7s linear infinite spin}.media-upload-preview:hover .media-upload-overlay{opacity:1!important}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:1ms!important;animation-duration:1ms!important}}.assets-card .assets-card-overlay{opacity:0;transition:opacity .15s}.assets-card:hover .assets-card-overlay{opacity:1}.yt-video-row{transition:background .12s,box-shadow .12s,color .12s}.yt-video-row:hover{box-shadow:inset 2px 0 0 var(--accent), inset 0 0 14px var(--accent-glow);color:var(--text-primary);background:var(--hover-wash)!important}.chat-bubble ::selection{background:var(--signal);color:#0a0a0a}.chat-bubble ::selection{background:var(--signal);color:#0a0a0a}.chat-bubble:hover .chat-bubble-copy,.chat-bubble:focus-within .chat-bubble-copy,.chat-bubble-copy:hover,.chat-bubble-copy:focus{opacity:1!important}.chat-bubble-copy:hover{background:var(--bg-elevated-2,var(--bg-elevated));color:var(--text-primary)!important}.chat-bubble-copy:active{transform:scale(.94)}.sm-brand .sm-brandmark{transform-origin:50%;transition:transform .76s cubic-bezier(.2,.8,.2,1),filter .28s}.sm-brand:hover .sm-brandmark{filter:drop-shadow(0 0 7px color-mix(in srgb, currentColor 45%, transparent));will-change:transform, filter;transform:perspective(340px)rotateY(360deg)scale(1.06)}.sm-brand .sm-word{transition:transform .3s cubic-bezier(.2,.8,.2,1);transform:translate(-4px)}.sm-brand:hover .sm-word{will-change:transform;transform:translate(-4px,-1px)}@media (prefers-reduced-motion:reduce){.sm-brand .sm-brandmark{transition:transform .24s,filter .24s}.sm-brand:hover .sm-brandmark{transform:scale(1.06)}.sm-brand:hover .sm-word{transform:translate(-4px)}}body.sm-mobile-ui input,body.sm-mobile-ui textarea,body.sm-mobile-ui select{font-size:16px!important}body.sm-mobile-ui button,body.sm-mobile-ui select,body.sm-mobile-ui [role=button]{min-height:44px}body.sm-mobile-ui select:not([multiple]):not([size]){height:max(44px,2.75em)}body.sm-mobile-ui button.btn-icon,body.sm-mobile-ui button[data-compact],body.sm-mobile-ui .no-min-tap{min-height:0}body.sm-mobile-ui .yt-video-row{min-width:560px}:where(html:has(.sm-block)){container-type:inline-size}:where(.sm-block){gap:var(--s-5,24px);min-width:0;display:grid}:where(.sm-block,.sm-block *){box-sizing:border-box}:where(.sm-block)>:where(*){min-width:0}@container (width>=720px){:where(.sm-block[data-layout=split]){grid-template-columns:minmax(0,1.6fr) minmax(260px,1fr);align-items:start}:where(.sm-block[data-layout=split])>:where(.sm-stage){grid-row:span 6}}@container (width>=860px){:where(.sm-block:not([data-layout]):has(>.sm-stage)){align-items:start;column-gap:var(--s-5,24px);row-gap:var(--s-4,16px);grid-template-columns:minmax(300px,380px) minmax(0,1fr)}:where(.sm-block:not([data-layout]):has(>.sm-stage))>:where(*){grid-column:1}:where(.sm-block:not([data-layout]):has(>.sm-stage))>:where(.sm-stage){grid-area:1/2/span 12;align-self:stretch;min-height:min(70vh,640px)}:where(.sm-block:not([data-layout]):has(>.sm-stage))>:where(.sm-stage[data-ratio]){align-self:start;min-height:0}}:where(.sm-row){align-items:center;gap:var(--s-2,8px);flex-wrap:wrap;display:flex}@container (width<=519px){:where(.sm-clamp:not([data-open])){-webkit-line-clamp:var(--sm-lines,5);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}}:where(.sm-stage){min-height:220px;padding:var(--s-3,12px);border-radius:var(--r-3,8px);background:var(--bg-inset);place-items:center;display:grid;position:relative;overflow:hidden}:where(.sm-stage[data-ratio="16:9"]){aspect-ratio:16/9;min-height:0}:where(.sm-stage[data-ratio="9:16"]){aspect-ratio:9/16;justify-self:center;width:auto;height:min(70vh,640px);min-height:0;max-height:70vh}:where(.sm-stage[data-ratio="1:1"]){aspect-ratio:1;min-height:0}:where(.sm-stage)>:where(img,video,canvas){object-fit:contain;border-radius:var(--r-2,4px);max-width:100%;max-height:100%;display:block}:where(.sm-stage[data-fill])>:where(img,video,canvas){object-fit:cover;width:100%;height:100%}:where(.sm-empty){justify-items:center;gap:var(--s-3,12px);padding:var(--s-5,24px) var(--s-4,16px);text-align:center;color:var(--fg-muted);display:grid}:where(.sm-empty)>:where(.sm-glyph){--sm-glyph-size:40px;color:var(--fg-subtle)}:where(.sm-empty)>:where(p){max-width:24ch;font-size:var(--fs-body,1rem);margin:0}:where(.sm-drop){outline:1px dashed var(--border-tok);outline-offset:-8px}:where(.sm-drop[data-over]){outline-color:var(--fg);background:var(--hover-wash)}:where(.sm-actions){align-items:center;gap:var(--s-2,8px);flex-wrap:wrap;display:flex}:where(.sm-actions)>:where(.sm-status){margin-inline-start:var(--s-2,8px)}:where(.sm-primary,.sm-quiet){justify-content:center;align-items:center;gap:var(--s-2,8px);min-height:var(--touch-target,44px);border-radius:var(--r-pill,999px);font:inherit;cursor:pointer;text-align:center;overflow-wrap:anywhere;max-width:100%;padding:10px 20px;font-weight:500;display:inline-flex}:where(.sm-primary){border:1px solid var(--fg);background:var(--fg);color:var(--bg)}:where(.sm-quiet){border:1px solid var(--border-strong);background:var(--bg-elev-1);color:var(--fg)}:where(.sm-quiet):hover{background:var(--bg-elev-2)}:where(.sm-icon){min-width:var(--touch-target,44px);min-height:var(--touch-target,44px);border-radius:var(--r-2,4px);color:var(--fg-muted);cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:inline-grid}:where(.sm-icon):hover{color:var(--fg);background:var(--hover-wash)}:where(.sm-icon[aria-pressed=true]){color:var(--fg);background:var(--press-wash)}:where(.sm-primary,.sm-quiet,.sm-icon):disabled{opacity:.45;cursor:default}:where(.sm-primary,.sm-quiet,.sm-icon):focus-visible{outline:2px solid var(--signal);outline-offset:3px}@container (width<=420px){:where(.sm-actions)>:where(.sm-primary){flex:100%}}:where(.sm-field){gap:6px;min-width:0;display:grid}:where(.sm-field)>:where(label,.sm-label){align-items:center;gap:var(--s-1,4px);font-size:var(--fs-body-s,.875rem);color:var(--fg-muted);min-height:24px;display:flex}:where(.sm-field) :where(input:not([type=checkbox]):not([type=radio]):not([type=range]),select,textarea){width:100%;min-height:var(--touch-target,44px);border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-1);color:var(--fg);font:inherit;padding:10px 12px}:where(.sm-field) :where(textarea){resize:vertical;min-height:96px}:where(.sm-fields){gap:var(--s-4,16px);grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));display:grid}:where(.sm-block)>:where(.sm-fields,.sm-settings){padding:var(--s-3,12px) var(--s-4,16px);border:1px solid var(--border);border-radius:var(--r-3,8px);background:var(--bg-secondary)}:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list))){align-items:center;gap:6px var(--s-2,8px);flex-wrap:wrap;display:flex}:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list)))>:where(label,.sm-label){flex:0 auto}:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list)))>:where(:not(label,.sm-label)){flex:1 1 var(--sm-control,10rem);min-width:0}@container (width>=520px){:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list))){align-items:center;gap:var(--s-2,8px);grid-template-columns:minmax(5rem,9rem) minmax(0,1fr);display:grid}:where(.sm-field) :where(input:not([type=checkbox]):not([type=radio]):not([type=range]),select){min-height:36px;padding:6px 10px}:where(.sm-fields){gap:var(--s-2,8px) var(--s-4,16px)}}:where(.sm-choices){gap:var(--s-2,8px);grid-template-columns:repeat(auto-fill,minmax(var(--sm-tile,96px),1fr));border:0;min-width:0;margin:0;padding:0;display:grid}:where(.sm-choices[data-size=wide]){--sm-tile:160px}:where(.sm-choices)>:where(legend){font-size:var(--fs-body-s,.875rem);color:var(--fg-muted);margin-bottom:6px;padding:0}:where(.sm-choices)>:where(label){padding:var(--s-2,8px);border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-1);color:var(--fg-muted);font-size:max(12px,var(--fs-caption,.8125rem));text-align:center;cursor:pointer;align-content:start;justify-items:center;gap:6px;display:grid;position:relative}:where(.sm-choices)>:where(label:not(:has(input:checked,input:disabled))):hover{border-color:var(--border-strong);color:var(--fg)}:where(.sm-choices) :where(input[type=radio],input[type=checkbox]){opacity:0;cursor:pointer;width:100%;height:100%;margin:0;position:absolute;inset:0}:where(.sm-choices)>:where(label:has(input:checked)){border-color:var(--fg);background:var(--fg);color:var(--bg);box-shadow:none;--fg-muted:color-mix(in srgb,var(--bg) 78%,transparent);--fg-subtle:color-mix(in srgb,var(--bg) 64%,transparent);--text-secondary:var(--fg-muted);--text-muted:var(--fg-subtle)}:where(.sm-choices)>:where(label:has(input:focus-visible)){outline:2px solid var(--signal);outline-offset:2px}:where(.sm-choices)>:where(label:has(input:disabled)),:where(.sm-choices) :where(input:disabled){cursor:default}:where(.sm-choices)>:where(label:has(input:disabled):not(:has(input:checked))){opacity:.45}:where(.sm-choices) :where(img,video,canvas,.sm-swatch){width:100%;aspect-ratio:var(--sm-tile-ratio,1);object-fit:cover;border-radius:var(--r-2,4px);background:var(--bg-inset);display:block}:where(.sm-choices) :where(.sm-glyph){--sm-glyph-size:28px;margin:10px 0 4px}:where(.sm-choices[data-ratio="16:9"]){--sm-tile-ratio:16/9}:where(.sm-choices[data-ratio="9:16"]){--sm-tile-ratio:9/16}:where(.sm-choices[data-compact])>:where(label){min-height:var(--touch-target,44px);grid-auto-flow:column;place-content:center;align-items:center;padding:6px 12px}:where(.sm-choices[data-compact]) :where(.sm-glyph){--sm-glyph-size:18px;margin:0}:where(.sm-choices) :where(audio){z-index:1;width:100%;height:32px;position:relative}:where(.sm-shape){box-sizing:border-box;width:calc(var(--sm-shape-size,32px) * min(1,var(--r,1)));aspect-ratio:var(--r,1);border:2px solid;border-radius:3px;max-width:100%;margin:4px auto;display:block}:where(.sm-choices)>:where(label:has(.sm-shape)){grid-template-rows:1fr auto;align-content:stretch}:where(.sm-choices) :where(.sm-shape){--sm-shape-size:36px;align-self:center;margin:6px auto 2px}:where(.sm-choices[data-compact]) :where(.sm-shape){--sm-shape-size:20px;margin:0}:where(.sm-choices[data-segmented]){gap:0;width:fit-content;max-width:100%;display:flex}:where(.sm-choices[data-segmented])>:where(label){min-height:36px;font-size:var(--fs-body-s,.875rem);white-space:nowrap;border-radius:0;justify-content:center;align-items:center;gap:6px;padding:4px 12px;display:inline-flex}:where(.sm-choices[data-segmented])>:where(label+label){margin-inline-start:-1px}:where(.sm-choices[data-segmented])>:where(label:first-of-type){border-start-start-radius:var(--r-pill,999px);border-end-start-radius:var(--r-pill,999px)}:where(.sm-choices[data-segmented])>:where(label:last-of-type){border-start-end-radius:var(--r-pill,999px);border-end-end-radius:var(--r-pill,999px)}:where(.sm-choices[data-segmented])>:where(label:has(input:checked)){z-index:1;position:relative}:where(.sm-choices[data-segmented]) :where(.sm-glyph){--sm-glyph-size:16px;margin:0}:where(.sm-settings){gap:var(--s-3,12px) var(--s-4,16px);grid-template-columns:repeat(auto-fill,minmax(min(100%,11rem),1fr));align-items:start;min-width:0;display:grid}:where(.sm-settings)>:where(.sm-field){grid-template-columns:minmax(0,1fr);gap:4px}:where(.sm-settings)>:where(.sm-field:not(:has(textarea,.sm-choices,.sm-gallery,.sm-list))){--sm-control:6rem;align-items:center;gap:4px var(--s-2,8px);flex-wrap:wrap;display:flex}:where(.sm-settings)>:where(.sm-choices)>:where(legend),:where(.sm-settings) :where(.sm-label){font-size:max(12px,var(--fs-caption,.8125rem))}@container (width<=519px){:where(.sm-choices[data-compact],.sm-choices[data-segmented]){scrollbar-width:none;flex-wrap:nowrap;width:auto;display:flex;overflow-x:auto}:where(.sm-choices[data-compact])>:where(label),:where(.sm-choices[data-segmented])>:where(label){flex:none}}:where(.sm-list){border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-1);min-width:0;margin:0;padding:0;list-style:none;display:grid;overflow:hidden}:where(.sm-list)>:where(li){align-items:center;gap:var(--s-2,8px);min-width:0;min-height:40px;padding:4px var(--s-2,8px);border-bottom:1px solid var(--divider);display:flex}:where(.sm-list)>:where(li:last-child){border-bottom:0}:where(.sm-list)>:where(li:has(>details)){padding:0;display:block}:where(.sm-list)>:where(li)>:where(details)>:where(summary){align-items:center;gap:var(--s-2,8px);min-height:40px;padding:4px var(--s-2,8px);cursor:pointer;list-style:none;display:flex}:where(.sm-list)>:where(li)>:where(details)>:where(summary)::-webkit-details-marker{display:none}:where(.sm-list)>:where(li)>:where(details[open]){background:var(--bg-inset)}:where(.sm-list)>:where(li)>:where(details)>:where(:not(summary)){padding:var(--s-2,8px) var(--s-3,12px) var(--s-3,12px)}:where(.sm-list) :where(img,video,canvas,.sm-swatch){object-fit:cover;border-radius:var(--r-2,4px);background:var(--bg-inset);flex:none;width:40px;height:26px}:where(.sm-list) :where(.sm-line){white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}:where(.sm-list) :where(small){color:var(--fg-subtle);font-size:max(12px,var(--fs-caption,.8125rem));white-space:nowrap;font-variant-numeric:tabular-nums;flex:none}:where(.sm-list)>:where(.sm-list-more){display:none}@container (width<=519px){:where(.sm-list[data-peek]:not([data-open]))>:where(li:nth-child(n+4):not(.sm-list-more)){display:none}:where(.sm-list[data-peek]:not([data-open]))>:where(.sm-list-more){color:var(--fg-muted);display:flex}}:where(.sm-gallery){gap:var(--s-2,8px);grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--sm-tile,140px)),1fr));margin:0;padding:0;list-style:none;display:grid}:where(.sm-gallery)>:where(*){border-radius:var(--r-3,8px);background:var(--bg-inset);margin:0;position:relative;overflow:hidden}:where(.sm-gallery) :where(img,video,canvas){width:100%;aspect-ratio:var(--sm-tile-ratio,1);object-fit:cover;display:block}:where(.sm-gallery) :where(figcaption){font-size:max(12px,var(--fs-caption,.8125rem));color:var(--fg-muted);padding:6px 8px}:where(.sm-gallery) :where([aria-selected=true],.is-selected){box-shadow:inset 0 0 0 2px var(--fg)}:where(.sm-gallery[data-size=small]){--sm-tile:92px;--sm-tile-ratio:3/2}:where(.sm-media-off){box-sizing:border-box;width:min(100%,320px);aspect-ratio:var(--sm-photo-ratio,4/3);border:1px solid var(--border-tok);border-radius:var(--r-2,4px);background:var(--bg-inset);color:var(--fg-subtle,var(--fg-muted));vertical-align:top;place-items:center;display:inline-grid}:where(.sm-gallery) :where(.sm-media-off){width:100%;aspect-ratio:var(--sm-tile-ratio,1);border-radius:inherit;display:grid}:where(.sm-status){align-items:center;gap:var(--s-2,8px);min-height:24px;font-size:var(--fs-body-s,.875rem);color:var(--fg-muted);display:inline-flex}:where(.sm-status):empty{display:none}:where(.sm-status[data-state]):before{content:"";background:currentColor;border-radius:50%;flex:none;width:14px;height:14px}:where(.sm-status[data-state=loading]):before{background:0 0;border:2px solid;border-right-color:#0000;animation:.8s linear infinite sm-spin}:where(.sm-status[data-state=success]){color:var(--attention-ok,var(--fg))}:where(.sm-status[data-state=success]):before{background:0 0;border:2px solid;border-width:0 2px 2px 0;border-radius:0;width:6px;height:11px;margin:0 4px 3px;transform:rotate(45deg)}:where(.sm-status[data-state=waiting]){color:var(--attention-warning,var(--signal))}:where(.sm-status[data-state=waiting]):before{width:8px;height:8px;margin:0 3px}:where(.sm-status[data-state=error]){color:var(--attention-error,var(--signal))}:where(.sm-status[data-state=error]):before{clip-path:polygon(50% 0,100% 100%,0 100%);border-radius:0}:where(.sm-progress){border-radius:var(--r-pill,999px);background:var(--bg-elev-2);width:100%;height:4px;accent-color:var(--fg);appearance:none;border:0;overflow:hidden}:where(.sm-progress)::-webkit-progress-bar{background:var(--bg-elev-2)}:where(.sm-progress)::-webkit-progress-value{background:var(--fg)}:where(.sm-progress)::-moz-progress-bar{background:var(--fg)}:where(.sm-more){border-top:1px solid var(--divider)}:where(.sm-more)>:where(summary){align-items:center;gap:var(--s-2,8px);min-height:var(--touch-target,44px);color:var(--fg-muted);font-size:var(--fs-body-s,.875rem);cursor:pointer;padding:0;list-style:none;display:flex}:where(.sm-more)>:where(summary)::-webkit-details-marker{display:none}:where(.sm-more)>:where(summary):after{content:"";width:7px;height:7px;transition:transform var(--dur-fast,.16s) var(--ease-out,ease);border:1.5px solid;border-width:0 1.5px 1.5px 0;margin-inline-start:2px;transform:translateY(-2px)rotate(45deg)}:where(.sm-more[open])>:where(summary):after{transform:translateY(2px)rotate(-135deg)}:where(.sm-more)>:where(summary):hover{color:var(--fg)}:where(.sm-more)>:where(:not(summary)){margin-top:var(--s-2,8px)}:where(.sm-more[open]){padding-bottom:var(--s-3,12px)}:where(.sm-label){position:relative}:where(.sm-hint){vertical-align:middle;display:inline-block}:where(:not(.sm-label))>:where(.sm-hint){position:relative}:where(.sm-hint)>:where(summary){width:var(--touch-target,44px);height:var(--touch-target,44px);min-height:0;color:var(--fg-subtle);cursor:pointer;border:0;place-items:center;margin:-8px;padding:0;list-style:none;display:inline-grid}:where(.sm-hint)>:where(summary)::-webkit-details-marker{display:none}:where(.sm-hint)>:where(summary):before{content:"i";width:15px;height:15px;font:600 10px/1 var(--font-body);border:1.5px solid;border-radius:50%;place-items:center;font-style:normal;display:grid}:where(.sm-hint)>:where(summary):hover,:where(.sm-hint[open])>:where(summary){color:var(--fg)}:where(.sm-hint)>:where(:not(summary)){z-index:5;inset-inline-start:0;border:1px solid var(--border-tok);border-radius:var(--r-3,8px);background:var(--bg-elev-2);width:max-content;max-width:min(280px,100cqi - 32px);color:var(--fg);font-size:var(--fs-body-s,.875rem);box-shadow:var(--shadow-1);margin:4px 0 0;padding:10px 12px;line-height:1.45;position:absolute;top:100%}:where(:not(.sm-label))>:where(.sm-hint[open]){display:block}:where(:not(.sm-label))>:where(.sm-hint)>:where(:not(summary)){width:auto;max-width:60ch;position:static}:where(.sm-glyph){--g:var(--sm-glyph-size,20px);width:var(--g);height:var(--g);color:inherit;vertical-align:middle;flex:none;display:inline-block;position:relative}:where(.sm-glyph):before,:where(.sm-glyph):after{content:"";box-sizing:border-box;position:absolute}:where(.sm-glyph[data-glyph=play]):before{clip-path:polygon(0 0,100% 50%,0 100%);background:currentColor;inset:15% 15% 15% 25%}:where(.sm-glyph[data-glyph=pause]):before{border:solid;border-width:0 calc(var(--g)*.14);inset:18% 25%}:where(.sm-glyph[data-glyph=plus]):before,:where(.sm-glyph[data-glyph=close]):before{background:linear-gradient(currentColor,currentColor) 50%/100% 2px no-repeat,linear-gradient(currentColor,currentColor) 50%/2px 100% no-repeat;inset:15%}:where(.sm-glyph[data-glyph=close]):before{transform:rotate(45deg)}:where(.sm-glyph[data-glyph=check]):before{border:2px solid;border-width:0 2px 2px 0;width:30%;height:58%;top:12%;left:36%;transform:rotate(45deg)}:where(.sm-glyph[data-glyph=chevron]):before{border:2px solid;border-width:0 2px 2px 0;width:40%;height:40%;top:22%;left:30%;transform:rotate(45deg)}:where(.sm-glyph[data-glyph=upload]):before{border:2px solid;border-top:0;border-radius:0 0 3px 3px;height:35%;bottom:10%;left:10%;right:10%}:where(.sm-glyph[data-glyph=upload]):after{clip-path:polygon(50% 0,100% 45%,60% 45%,60% 100%,40% 100%,40% 45%,0 45%);background:currentColor;height:62%;top:4%;left:25%;right:25%}:where(.sm-glyph[data-glyph=image]):before{border:2px solid;border-radius:3px;inset:12%}:where(.sm-glyph[data-glyph=image]):after{clip-path:polygon(0 100%,35% 20%,60% 65%,75% 45%,100% 100%);background:currentColor;height:34%;bottom:24%;left:22%;right:22%}:where(.sm-glyph[data-glyph=image-off]):before{background:radial-gradient(circle calc(var(--g) * .09) at 35% 35%,currentColor 96%,transparent 100%);border:2px solid;border-radius:3px;inset:12%}:where(.sm-glyph[data-glyph=image-off]):after{background:currentColor;width:2px;margin-left:-1px;top:-10%;bottom:-10%;left:50%;transform:rotate(-45deg)}:where(.sm-glyph[data-glyph=video]):before{border:2px solid;border-radius:3px;inset:22% 28% 22% 8%}:where(.sm-glyph[data-glyph=video]):after{clip-path:polygon(0 35%,100% 0,100% 100%,0 65%);background:currentColor;width:20%;top:30%;bottom:30%;right:8%}:where(.sm-glyph[data-glyph=audio]):before{background:linear-gradient(currentColor,currentColor) 0 60%/2px 40% no-repeat,linear-gradient(currentColor,currentColor) 33%/2px 80% no-repeat,linear-gradient(currentColor,currentColor) 66%/2px 100% no-repeat,linear-gradient(currentColor,currentColor) 100% 60%/2px 50% no-repeat;inset:15% 12%}:where(.sm-glyph[data-glyph=text]):before{background:linear-gradient(currentColor,currentColor) 0 0/100% 2px no-repeat,linear-gradient(currentColor,currentColor) 0/100% 2px no-repeat,linear-gradient(currentColor,currentColor) 0 100%/60% 2px no-repeat;inset:20% 12%}:where(.sm-glyph[data-glyph=spark]):before{clip-path:polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);background:currentColor;inset:8%}:where(.sm-glyph[data-glyph=info]):before{border:2px solid;border-radius:50%;inset:10%}:where(.sm-glyph[data-glyph=info]):after{background:linear-gradient(currentColor,currentColor) 0 0/2px 2px no-repeat,linear-gradient(currentColor,currentColor) 0 100%/2px 60% no-repeat;width:2px;height:46%;margin-left:-1px;top:28%;left:50%}:where(.sm-glyph[data-glyph=warning]):before{clip-path:polygon(50% 0,100% 100%,0 100%);background:currentColor;inset:8% 4% 10%}:where(.sm-glyph[data-glyph=warning]):after{background:linear-gradient(var(--bg),var(--bg)) 0 0/2px 60% no-repeat,linear-gradient(var(--bg),var(--bg)) 0 100%/2px 2px no-repeat;width:2px;height:38%;margin-left:-1px;top:38%;left:50%}:where(.sm-glyph[data-glyph=spinner]):before{border:2px solid;border-right-color:#0000;border-radius:50%;animation:.8s linear infinite sm-spin;inset:12%}:where([class*=sm-][hidden]){display:none!important}:where(.sm-sr){clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@keyframes sm-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){:where(.sm-status[data-state=loading]):before,:where(.sm-glyph[data-glyph=spinner]):before{opacity:.6;border-right-color:currentColor;animation:none}:where(.sm-more)>:where(summary):after{transition:none}}.sm-quiet{border:1px solid var(--border-tok)}html,body{background:var(--bg);color:var(--fg);margin:0}.dh-page{height:100dvh;font-family:var(--font-body);flex-direction:column;display:flex;overflow:hidden}.dh-bar{align-items:center;gap:var(--s-2,8px) var(--s-3,12px);min-height:56px;padding:var(--s-2,8px) var(--s-4,16px);border-bottom:var(--bw-1,1px) solid var(--divider);flex-wrap:wrap;flex:none;display:flex}.dh-title{align-items:baseline;gap:10px;min-width:0;display:flex}.dh-title h1{font-family:var(--font-display);letter-spacing:var(--tr-display);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:24px;font-style:italic;font-weight:200;line-height:1.1;overflow:hidden}.dh-meta{color:var(--fg-muted);font-size:12px}.dh-spacer{flex:1}.dh-picker{border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);max-width:min(340px,100%);height:32px;color:var(--fg-muted);align-items:center;gap:6px;padding:0 4px 0 10px;display:inline-flex}.dh-picker select{min-width:0;max-width:280px;height:30px;color:var(--fg);font:inherit;background:0 0;border:0;padding:0 4px;font-size:13px}.dh-picker select:focus{outline:none}.dh-seg{border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);padding:2px;display:inline-flex}.dh-seg button{width:30px;height:26px;color:var(--fg-muted);cursor:pointer;background:0 0;border:0;border-radius:3px;place-items:center;padding:0;display:inline-grid}.dh-seg button[aria-checked=true]{background:var(--fg);color:var(--bg)}.dh-glyph{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:16px;height:16px}.dh-icon{border-radius:var(--r-2);width:32px;height:32px;color:var(--fg-muted);cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:inline-grid}.dh-icon:hover,.dh-seg button:hover:not([aria-checked=true]),.dh-tabs [role=tab]:hover{background:var(--bg-elev-2);color:var(--fg)}.dh-seg button:focus-visible,.dh-icon:focus-visible,.dh-tabs [role=tab]:focus-visible,.dh-page .btn:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.dh-main{min-height:0;padding:var(--s-4,16px);flex-direction:column;flex:1;display:flex;overflow:auto}.dh-frame{flex-direction:column;flex:1;width:100%;min-width:0;margin:0 auto;display:flex;container-type:inline-size}.dh-noview{flex:1}@container (width>=760px){.dh-noview{align-content:start;column-gap:var(--s-6,24px);grid-template-rows:auto auto 1fr;grid-template-columns:minmax(260px,380px) minmax(0,1fr)}.dh-noview>:not(.dh-results){grid-column:1}.dh-noview>.dh-results{padding-top:0;padding-left:var(--s-6,24px);border-top:0;border-left:var(--bw-1,1px) solid var(--divider);grid-area:1/2/-1;align-content:start;align-self:stretch}}.dh-noview>.dh-results-empty,.dh-results-empty{place-content:center;justify-items:center;min-height:160px}.dh-results-empty p{color:var(--fg-subtle);margin:0;font-size:13px}.dh-dock{border-top:var(--bw-1,1px) solid var(--border-strong);background:var(--bg-elev-1);flex-direction:column;flex:none;max-height:75dvh;display:flex;position:relative}.dh-dock-grip{cursor:ns-resize;z-index:1;touch-action:none;height:10px;position:absolute;top:-5px;left:0;right:0}.dh-tabs{min-height:40px;padding:0 var(--s-2,8px) 0 10px;flex:none;align-items:center;gap:2px;display:flex;overflow-x:auto}.dh-tabs [role=tab]{border-radius:var(--r-2);height:28px;color:var(--fg-muted);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0 10px;font-size:13px;display:inline-flex}.dh-tabs [role=tab][aria-selected=true]{background:var(--bg);color:var(--fg);box-shadow:inset 0 0 0 var(--bw-1,1px) var(--border-tok)}.dh-alert{background:var(--attention-error);border-radius:50%;width:6px;height:6px}.dh-tabs-status{padding:0 var(--s-2,8px);color:var(--fg-muted);white-space:nowrap;margin-left:auto;font-size:12px}.dh-fold svg{transform:rotate(-90deg)}.dh-dock[data-open=true] .dh-fold svg{transform:rotate(90deg)}.dh-tabpanel{min-height:0;padding:10px var(--s-4,16px) 14px;border-top:var(--bw-1,1px) solid var(--divider);flex:1;overflow:auto}.dh-console ol{border-top:var(--bw-1,1px) solid var(--divider);margin:0;padding:0;list-style:none}.dh-calls{margin:0;padding:0;font-size:13px;list-style:none;display:grid}.dh-calls li{border-bottom:var(--bw-1,1px) solid var(--divider);flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:6px 0;display:flex}.dh-calls span{color:var(--fg-muted)}.dh-calls small{color:var(--fg-subtle);margin-left:auto}@media (width<=700px){.dh-bar{padding:var(--s-2,8px) 12px}.dh-title h1{font-size:20px}.dh-main{padding:12px}.dh-tabs-status{display:none}}.dh-problem{margin:var(--s-4,16px) var(--s-6,24px) 0;padding:var(--s-3,12px) var(--s-4,16px);border:var(--bw-1,1px) solid var(--border-strong);border-radius:var(--r-2);background:var(--bg-elev-1);white-space:pre-wrap;overflow-wrap:anywhere}.dh-noview{box-sizing:border-box;gap:var(--s-4,16px);min-height:100%;padding:var(--s-6,24px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-3);justify-items:start;display:grid}.dh-noview p{color:var(--fg-muted);margin:0}.dh-form{gap:var(--s-2,8px);width:100%;display:grid}.dh-row{align-items:center;gap:var(--s-3,12px);min-height:36px;display:flex}.dh-row label{min-width:96px;color:var(--fg-muted);font-size:13px}.dh-row input[type=text],.dh-row input[type=number]{min-width:0;height:32px;padding:0 var(--s-2,8px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);font:inherit;flex:1;font-size:13px}.dh-media{align-items:center;gap:var(--s-3,12px);min-height:36px;display:flex}.dh-media-label{min-width:96px;color:var(--fg-muted);font-size:13px}.dh-media-tile{align-items:center;gap:var(--s-2,8px);max-width:100%;min-height:32px;padding:0 var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);font-size:13px;display:inline-flex}.dh-media-tile span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.dh-results{gap:var(--s-3,12px);width:100%;padding-top:var(--s-4,16px);border-top:var(--bw-1,1px) solid var(--divider);display:grid}.dh-results h2{margin:0;font-size:14px;font-weight:600}.dh-section-head{justify-content:space-between;align-items:center;gap:var(--s-2,8px);margin-bottom:var(--s-2,8px);display:flex}.dh-section-head h2{letter-spacing:var(--tr-body);margin:0;font-size:13px;font-weight:600}.dh-input textarea{box-sizing:border-box;width:100%;padding:var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);font-family:var(--font-mono);resize:vertical;font-size:12px;line-height:1.5}.dh-input p,.dh-muted{margin:var(--s-2,8px) 0 0;color:var(--fg-muted);font-size:13px}.dh-json{max-height:240px;padding:var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);font-family:var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12px;line-height:1.5;overflow:auto}.dh-console{flex-direction:column;min-height:0;display:flex}.dh-entry{gap:var(--s-2,8px);padding:var(--s-2,8px) 0;border-bottom:var(--bw-1,1px) solid var(--divider);grid-template-columns:auto auto minmax(0,1fr);align-items:baseline;font-size:12px;display:grid}.dh-entry time{color:var(--fg-muted);font-variant-numeric:tabular-nums}.dh-kind{color:var(--fg-muted);font-size:11px}.dh-entry pre{font-family:var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.dh-error .dh-kind,.dh-error pre{color:var(--fg);font-weight:600}.dh-stand-in .dh-kind{color:var(--signal)}.dh-row select{min-width:0;height:32px;padding:0 var(--s-2,8px);border:var(--bw-1,1px) solid var(--border-tok);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);font:inherit;flex:1}.dh-slider{align-items:center;gap:var(--s-2,8px);flex:1;min-width:0;display:flex}.dh-slider input{flex:1;min-width:0}.dh-slider output{text-align:right;min-width:2.5em;color:var(--fg-muted);font-size:13px}.dh-run-problem{padding:var(--s-2,8px) var(--s-3,12px);border:var(--bw-1,1px) solid var(--border-strong);border-radius:var(--r-2);background:var(--bg-elev-1);color:var(--fg);margin:0}.dh-result-media{gap:var(--s-2,8px);justify-items:center;width:100%;margin:0;display:grid}.dh-result-media img,.dh-result-media .sm-player{object-fit:contain;border-radius:var(--r-3,8px);background:#000;width:auto;min-width:min(100%,320px);max-width:100%;height:auto;max-height:min(62dvh,640px);display:block}.dh-result-media .sm-player>video{aspect-ratio:var(--dh-shape,auto)}.dh-result-media audio{width:100%}.dh-result-media figcaption{max-width:100%;color:var(--fg-muted);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.dh-results .sm-data-list:has(>li>.dh-result-media){gap:var(--s-4,16px);grid-template-columns:repeat(auto-fill,minmax(min(100%,200px),1fr));margin:0;padding:0;list-style:none;display:grid}.dh-results .sm-data-list:has(>li>.dh-result-media) .dh-result-media img{min-width:min(100%,200px);max-height:min(56dvh,560px)}.dh-results .sm-data-list:has(>li>.dh-result-media) .dh-result-media .sm-player{min-width:min(100%,200px);max-height:min(56dvh,560px)}.dh-media-tile small{margin-left:var(--s-1,4px);border:var(--bw-1,1px) solid var(--border-tok);color:var(--fg-muted);border-radius:999px;padding:1px 6px;font-size:11px}.dh-media-pick{cursor:pointer;font:inherit;color:var(--fg)}.dh-media-pick:hover:not(:disabled){border-color:var(--border-strong)}.dh-media-problem{color:var(--attention-error);font-size:12px}.dh-media-empty{flex-wrap:wrap;align-items:flex-start}.dh-media-drop{padding:var(--s-5,20px) var(--s-4,16px);border:1.5px dashed var(--border-strong);border-radius:var(--r-3);background:var(--bg-elev-1);text-align:center;flex:240px;justify-items:center;gap:6px;display:grid}.dh-media-drop[data-over]{border-style:solid;border-color:var(--fg);background:var(--hover-wash)}.dh-media-drop strong{color:var(--fg);font-size:14px;font-weight:600}.dh-media-drop span{color:var(--fg-muted);font-size:13px}.dh-media-drop small{color:var(--fg-muted);font-size:12px}.dh-media-drop .dh-media-pick{margin-top:var(--s-1,4px)}.dh-switch{border-radius:var(--r-2);height:28px;color:var(--fg-muted);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:0 6px;font-size:13px;display:inline-flex}.dh-switch:hover{color:var(--fg)}.dh-switch:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.dh-switch-track{background:var(--bg-elev-2);width:32px;height:18px;box-shadow:inset 0 0 0 var(--bw-1,1px) var(--border-strong);border-radius:999px;transition:background .15s;position:relative}.dh-switch-knob{background:var(--fg-muted);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.dh-switch[aria-checked=true] .dh-switch-track{background:var(--fg)}.dh-switch[aria-checked=true] .dh-switch-knob{background:var(--bg);transform:translate(14px)}.dh-media-tiles{gap:var(--s-2,8px);flex-wrap:wrap;flex:1;min-width:0;display:flex}.dh-date{margin:0;font-size:15px}.block-zoom-control{z-index:3;border:1px solid var(--border);background:var(--bg);opacity:0;border-radius:999px;align-items:center;gap:2px;padding:2px;transition:opacity .15s;display:flex;position:absolute;top:8px;right:8px;box-shadow:0 4px 14px #00000014}.bs-sandbox-ui:hover>.block-zoom-control,.block-zoom-control:focus-within{opacity:1}.block-zoom-control button{min-width:28px;height:28px;color:var(--fg);font:500 12px var(--font-body);cursor:pointer;background:0 0;border:0;border-radius:999px;place-items:center;padding:0 8px;display:inline-grid}.block-zoom-control button:hover:not(:disabled){background:var(--hover-wash)}.block-zoom-control button:disabled{opacity:.4;cursor:default}.block-zoom-control button:focus-visible{outline:2px solid var(--signal);outline-offset:1px}.block-zoom-control .block-zoom-mode[aria-pressed=true]{color:var(--fg-muted)}@media (width<=600px),(hover:none){.block-zoom-control{display:none}}@media (prefers-reduced-motion:reduce){.block-zoom-control{transition:none}}.bd-table,.bd-document,.bd-chart,.bd-code-view,.bd-files{min-width:0;color:var(--fg);font:14px/1.6 var(--font-body);margin:0}.bd-table-scroll{border:1px solid var(--border);border-radius:var(--r-3);max-width:100%;max-height:480px;overflow:auto}.bd-table-scroll:focus-visible,.bd-code:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.bd-table table{border-collapse:collapse;width:max-content;min-width:100%;font-size:13px}.bd-table th,.bd-table td{padding:var(--s-2) var(--s-3);text-align:left;vertical-align:top;border-bottom:1px solid var(--border);overflow-wrap:break-word;min-width:64px;max-width:320px}.bd-table th{background:var(--bg-secondary);white-space:nowrap;font-weight:600;position:sticky;top:0}.bd-table td.bd-number{text-align:right;font-variant-numeric:tabular-nums}.bd-table tbody tr:last-child td{border-bottom:0}.bd-bar{align-items:center;gap:var(--s-2);margin-top:var(--s-3);color:var(--fg-muted);flex-wrap:wrap;font-size:12px;display:flex}.bd-bar>span{margin-right:auto}.bd-document{gap:var(--s-3);overflow-wrap:anywhere;display:grid}.bd-document>*{margin:0}.bd-document-title{font:200 italic 22px/1.2 var(--font-display);letter-spacing:var(--tr-display)}.bd-document h4,.bd-document h5,.bd-document h6{font-size:15px;font-weight:600}.bd-document ul,.bd-document ol{padding-left:var(--s-5)}.bd-document blockquote{padding-left:var(--s-3);border-left:2px solid var(--border-strong);color:var(--fg-muted)}.bd-document code,.bd-code{font:12px/1.6 var(--font-mono)}.bd-plain{white-space:pre-wrap}.bd-code{padding:var(--s-3);white-space:pre;border:1px solid var(--border);border-radius:var(--r-3);background:var(--bg-secondary);max-height:420px;margin:0;overflow:auto}.bd-chart svg{width:100%;height:auto;display:block}.bd-chart figcaption{color:var(--fg-muted);margin-top:var(--s-2);font-size:12px}.bd-grid{stroke:var(--border);stroke-width:1px}.bd-axis{fill:var(--fg-muted);font:11px var(--font-body)}.bd-mark{fill:var(--fg);opacity:.82}.bd-line{stroke:var(--fg);stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}.bd-files{gap:var(--s-2);padding:0;list-style:none;display:grid}.bd-file{align-items:center;gap:var(--s-2) var(--s-3);padding:var(--s-3);border:1px solid var(--border);border-radius:var(--r-3);flex-wrap:wrap;display:flex}.bd-file-name{overflow-wrap:anywhere;font-weight:600}.bd-file>.btn{margin-left:auto}.bd-muted{color:var(--fg-muted);font-size:12px}.bd-color{align-items:center;gap:var(--s-2);font:13px var(--font-mono);display:inline-flex}.bd-swatch{border-radius:var(--r-2);border:1px solid var(--border-strong);width:20px;height:20px}.bd-link{color:var(--fg);overflow-wrap:anywhere}.bd-player,.bd-input{gap:var(--s-3);display:grid}.bd-color-row{gap:var(--s-2);align-items:center;display:flex}.bd-color-row input[type=color]{border:1px solid var(--border);border-radius:var(--r-3);background:var(--bg);width:44px;min-width:44px;height:44px;padding:2px}.bd-richtext textarea{font:13px/1.6 var(--font-mono)}.bd-table-input th{white-space:nowrap}.bd-table-input th>span{margin-right:var(--s-1)}.bd-table-input td{padding:var(--s-1)}.bd-table-input td input{border-radius:var(--r-2);width:100%;min-width:96px;min-height:36px;color:var(--fg);padding:var(--s-1) var(--s-2);font:inherit;background:0 0;border:1px solid #0000}.bd-table-input td input:focus{border-color:var(--border-strong);background:var(--bg)}.bd-table-input .bd-bar input{border:1px solid var(--border);border-radius:var(--r-3);background:var(--bg);min-height:40px;color:var(--fg);padding:var(--s-2) var(--s-3);font:inherit;flex:160px}.bd-chart svg{max-width:960px}.bd-richtext .bd-bar select{width:auto;min-height:40px}.sm-data-record{grid-template-columns:minmax(72px,max-content) minmax(0,1fr);gap:4px 16px;margin:0;display:grid}.sm-data-record dt{color:var(--text-muted)}.sm-data-record dd{overflow-wrap:anywhere;min-width:0;margin:0}.sm-data-list{gap:6px;margin:0;padding-left:20px;display:grid}.sm-data-list:has(>li>.sm-data-record){gap:0;padding-left:0;list-style:none}.sm-data-list:has(>li>.sm-data-record)>li{padding:10px 0}.sm-data-list:has(>li>.sm-data-record)>li+li{border-top:1px solid var(--border)}.sm-data-none{color:var(--text-muted)}@media (width<=600px){.sm-data-record{grid-template-columns:minmax(0,1fr);gap:0}.sm-data-record dd{margin-bottom:6px}.sm-data-record dd>.sm-data-record{border-left:1px solid var(--border);padding-left:12px}}:where(.sm-player,.sm-viewer,.sm-expand-btn){--sm-cream:var(--cream-100,#f7f0db);--sm-ink:var(--ink-600,#0a0a0a);--sm-gold:var(--signal,#e8b23a);--sm-out:var(--dur-fast,.16s);--sm-in:var(--dur-base,.24s);--sm-ease:var(--ease-out,cubic-bezier(.22,1,.36,1));--sm-spring:var(--ease-spring,cubic-bezier(.34,1.56,.64,1));--sm-display:var(--font-display,"Balgin","Hanken Grotesk",ui-sans-serif,sans-serif)}.sm-player{vertical-align:top;box-sizing:border-box;background:var(--sm-ink);max-width:100%;color:var(--sm-cream);line-height:1;font-family:var(--font-body,"Hanken Grotesk",ui-sans-serif,system-ui,sans-serif);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;outline:none;display:inline-block;position:relative;overflow:hidden}.sm-player:focus-visible{outline:2px solid var(--sm-gold);outline-offset:2px}.sm-player>video{width:auto;max-width:100%;height:auto;max-height:inherit;object-fit:contain;background:0 0;margin:0 auto;display:block}:is(.sm-player[data-fill]>video,.sm-player:fullscreen>video,.sm-player[data-stage]>video){width:100%;max-width:none;height:100%;max-height:none}.sm-player[data-fill]{display:block}.sm-player[data-idle]{cursor:none}:where(.sm-stage)>.sm-player{border-radius:var(--r-2,4px);max-width:100%;max-height:100%}.sm-player-ui{z-index:1;pointer-events:none;position:absolute;inset:0}.sm-player-shade{background:linear-gradient(#0a0a0a00,#0a0a0a8c);height:120px;max-height:100%;position:absolute;bottom:0;left:0;right:0}.sm-player-bar{pointer-events:auto;align-items:center;gap:10px;display:flex;position:absolute;bottom:12px;left:12px;right:12px}.sm-player-shade,.sm-player-bar{transition:opacity var(--sm-in) var(--sm-ease)}.sm-player[data-away] .sm-player-shade,.sm-player[data-away] .sm-player-bar,.sm-player[data-idle] .sm-player-shade,.sm-player[data-idle] .sm-player-bar{opacity:0;pointer-events:none;transition-duration:var(--sm-out)}:where(.sm-player,.sm-viewer) .sm-media-btn{appearance:none;box-sizing:border-box;border-radius:var(--r-3,8px);background:var(--sm-cream);width:44px;min-width:0;height:44px;min-height:0;color:var(--sm-ink);box-shadow:none;font:inherit;cursor:pointer;transition:transform var(--sm-out) var(--sm-spring);border:0;flex:none;place-items:center;margin:0;padding:0;line-height:1;text-decoration:none;display:grid}:where(.sm-player,.sm-viewer) .sm-media-btn svg{width:20px;height:20px;display:block}:is(.sm-player,.sm-viewer) .sm-media-btn.sm-media-btn.sm-media-btn-text{width:auto;padding:0 14px;font-size:14px;font-weight:600}@media (hover:hover){:where(.sm-player,.sm-viewer) .sm-media-btn:hover{background:var(--sm-cream);color:var(--sm-ink);transform:translateY(-1px)}}:where(.sm-player,.sm-viewer) .sm-media-btn:active{transform:scale(.94)}:is(.sm-player,.sm-viewer) .sm-media-btn.sm-media-btn:focus-visible{outline:2px solid var(--sm-gold);outline-offset:2px;border-radius:var(--r-3,8px)}:is(.sm-player,.sm-viewer) .sm-media-btn.sm-media-btn{border-radius:var(--r-3,8px);background:var(--sm-cream);min-width:0;min-height:0;color:var(--sm-ink);box-shadow:none;font:inherit;cursor:pointer;border:0;padding:0;line-height:1;text-decoration:none}:is(.sm-player,.sm-viewer) .sm-media-btn.sm-media-btn:hover{background:var(--sm-cream);color:var(--sm-ink)}.sm-player .sm-player-bar [data-control=fullscreen]{margin-left:auto}.sm-player-sound{flex:none;display:flex;position:relative}.sm-player-volume{opacity:0;pointer-events:none;transition:opacity var(--sm-out) var(--sm-ease),transform var(--sm-out) var(--sm-ease);padding-bottom:10px;position:absolute;bottom:100%;left:50%;transform:translate(-50%,6px)}.sm-player-sound:hover .sm-player-volume,.sm-player-sound:focus-within .sm-player-volume,.sm-player-volume[data-drag]{opacity:1;pointer-events:auto;transition-duration:var(--sm-in);transform:translate(-50%)}.sm-player-volume-rail{box-sizing:border-box;border-radius:var(--r-3,8px);cursor:pointer;touch-action:none;background:#0a0a0aa3;outline:none;width:44px;height:128px;padding:14px 0;position:relative}.sm-player-volume-rail:focus-visible{outline:2px solid var(--sm-gold);outline-offset:2px}.sm-player-volume-track{background:#f7f0db47;border-radius:3px;width:6px;height:100%;margin:0 auto;position:relative;overflow:visible}.sm-player-volume-level{background:var(--sm-cream);transform-origin:bottom;border-radius:3px;position:absolute;inset:0;transform:scaleY(1)}.sm-player-volume-head{pointer-events:none;position:absolute;inset:0;transform:translateY(-100%)}.sm-player-volume-knob{background:var(--sm-cream);border-radius:4px;width:16px;height:16px;margin:0 0 -8px -8px;position:absolute;bottom:0;left:50%;box-shadow:0 0 0 3px #0a0a0a59}.sm-player-volume[data-drag] .sm-player-volume-head{will-change:transform}.sm-player[data-volume-room=short] .sm-player-volume-rail{height:84px;padding:12px 0}.sm-player[data-volume-room=none] .sm-player-volume{display:none}@media (hover:none){.sm-player-volume{display:none}}.sm-player-rail{cursor:pointer;touch-action:none;outline:none;flex:auto;min-width:48px;height:24px;position:relative}.sm-player-rail:focus-visible{outline:2px solid var(--sm-gold);outline-offset:2px;border-radius:var(--r-2,4px)}.sm-player-track{height:6px;transition:transform var(--sm-out) var(--sm-ease);background:#f7f0db47;border-radius:3px;margin-top:-3px;position:absolute;top:50%;left:0;right:0;overflow:hidden}.sm-player-buffered,.sm-player-played{transform-origin:0;position:absolute;inset:0;transform:scaleX(0)}.sm-player-buffered{background:#f7f0db2e}.sm-player-played{background:var(--sm-cream)}.sm-player-head{pointer-events:none;position:absolute;inset:0;transform:translate(0)}.sm-player[data-playing] .sm-player-head,.sm-player[data-playing] .sm-player-played,.sm-player-rail[data-drag] .sm-player-head{will-change:transform}.sm-player-knob{background:var(--sm-cream);width:16px;height:16px;transition:transform var(--sm-out) var(--sm-spring);border-radius:4px;margin:-8px 0 0 -8px;position:absolute;top:50%;left:0;transform:scale(0);box-shadow:0 0 0 3px #0a0a0a59}.sm-player-rail:hover .sm-player-knob,.sm-player-rail[data-drag] .sm-player-knob,.sm-player-rail:focus-visible .sm-player-knob{transform:scale(1)}.sm-player-rail:hover .sm-player-track,.sm-player-rail[data-drag] .sm-player-track{transform:scaleY(1.34)}.sm-player-tip{border-radius:var(--r-2,4px);background:var(--sm-ink);color:var(--sm-cream);font-variant-numeric:tabular-nums;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity var(--sm-out) var(--sm-ease);border:1px solid #f7f0db24;padding:3px 7px;font-size:12px;font-weight:500;position:absolute;bottom:calc(100% + 4px);left:0}.sm-player-rail:hover .sm-player-tip,.sm-player-rail[data-drag] .sm-player-tip{opacity:1}.sm-player-time{font-family:var(--sm-display);letter-spacing:-.01em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--sm-cream);text-shadow:0 1px 8px #0a0a0a99;flex:none;font-size:22px;font-style:italic;font-weight:200;line-height:1}:where(.sm-player,.sm-viewer) .sm-media-of{opacity:.55}.sm-player[data-size] .sm-player-bar{gap:8px}.sm-player[data-size] .sm-player-total{display:none}.sm-player[data-size] .sm-player-time{font-size:18px}.sm-player:is([data-size=compact],[data-size=tiny],[data-size=micro]) .sm-player-time,.sm-player:is([data-size=tiny],[data-size=micro]) [data-control=volume],.sm-player[data-size=micro] .sm-player-bar>:not([data-control=play]):not([data-control=fullscreen]){display:none}@media (hover:none){.sm-player-rail{height:44px}}.sm-player:fullscreen{border-radius:0;width:100%;max-width:none;height:100%;max-height:none}.sm-player[data-stage=theater]{z-index:2147483000;width:auto;max-width:none;height:auto;max-height:none;padding:env(safe-area-inset-top,0px) env(safe-area-inset-right,0px) env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px);color:var(--sm-cream);background:var(--sm-ink);border:0;border-radius:0;margin:0;display:block;position:fixed;inset:0;overflow:hidden}.sm-player[data-stage=theater]::backdrop{background:var(--sm-ink)}:is(.sm-player:fullscreen .sm-player-bar,.sm-player[data-stage] .sm-player-bar){left:max(12px,env(safe-area-inset-left,0px));right:max(12px,env(safe-area-inset-right,0px));bottom:max(12px,env(safe-area-inset-bottom,0px))}.sm-expand-host{position:relative}.sm-expand-btn{z-index:2;box-sizing:border-box;border-radius:var(--r-3,8px);background:var(--sm-cream);width:44px;min-width:0;height:44px;min-height:0;color:var(--sm-ink);box-shadow:none;cursor:pointer;opacity:0;pointer-events:none;transition:opacity var(--sm-out) var(--sm-ease),transform var(--sm-out) var(--sm-spring);border:0;place-items:center;margin:0;padding:0;line-height:1;display:grid;position:absolute;bottom:12px;right:12px}.sm-expand-btn svg{width:20px;height:20px;display:block}.sm-expand-btn[data-size=small]{border-radius:6px;width:32px;height:32px;bottom:6px;right:6px}.sm-expand-btn[data-size=small] svg{width:16px;height:16px}.sm-expand-btn[data-size=small]:before{content:"";position:absolute;inset:-6px}@media (hover:hover){:hover>.sm-expand-btn{opacity:1;pointer-events:auto}.sm-expand-btn:hover{background:var(--sm-cream);color:var(--sm-ink);transform:translateY(-1px)}}.sm-expand-btn:focus-visible,.sm-expand-btn[data-show]{opacity:1;pointer-events:auto}.sm-expand-btn:active{transform:scale(.94)}.sm-expand-btn.sm-expand-btn.sm-expand-btn:focus-visible{outline:2px solid var(--sm-gold);outline-offset:2px}.sm-expand-btn.sm-expand-btn.sm-expand-btn{border-radius:var(--r-3,8px);background:var(--sm-cream);min-width:0;min-height:0;color:var(--sm-ink);box-shadow:none;font:inherit;cursor:pointer;border:0;padding:0;line-height:1}.sm-expand-btn.sm-expand-btn.sm-expand-btn[data-size=small]{border-radius:6px}.sm-expand-btn.sm-expand-btn.sm-expand-btn:hover{background:var(--sm-cream);color:var(--sm-ink)}.sm-viewer{box-sizing:border-box;background:var(--sm-ink);width:100%;max-width:none;height:100%;max-height:none;color:var(--sm-cream);font-family:var(--font-body,"Hanken Grotesk",ui-sans-serif,system-ui,sans-serif);border:0;margin:0;padding:0;position:fixed;inset:0;overflow:hidden}.sm-viewer[open]{animation:sm-viewer-in var(--sm-in) var(--sm-ease) both;grid-template-rows:minmax(0,1fr) auto;display:grid}.sm-viewer::backdrop{background:var(--ink-600,#0a0a0a)}@keyframes sm-viewer-in{0%{opacity:0}}.sm-viewer [hidden],.sm-viewer .sm-media-btn[hidden]{display:none}.sm-viewer-stage{min-width:0;min-height:0;padding:max(12px,env(safe-area-inset-top,0px)) max(12px,env(safe-area-inset-right,0px)) 12px max(12px,env(safe-area-inset-left,0px));grid-template:minmax(0,1fr)/minmax(0,1fr);place-items:center;display:grid;position:relative;overflow:hidden}.sm-viewer-media{object-fit:contain;width:100%;min-width:0;height:100%;min-height:0;display:block}.sm-viewer-stage>.sm-player{width:100%;max-width:100%;height:100%;max-height:100%}.sm-viewer-off,.sm-player-off{box-sizing:border-box;border:1px solid var(--border-tok,#58534d);border-radius:var(--r-2,4px);background:var(--bg-inset,#171716);color:var(--fg-muted,#bbb2a7);place-items:center;display:inline-grid}.sm-viewer-off{aspect-ratio:4/3;width:min(60vw,320px)}.sm-player-off{aspect-ratio:16/9;vertical-align:top;width:min(100%,320px);max-width:100%}.sm-viewer-off svg,.sm-player-off svg{width:24px;height:24px;display:block}.sm-viewer-top{top:max(12px,env(safe-area-inset-top,0px));right:max(12px,env(safe-area-inset-right,0px));z-index:2;gap:10px;display:flex;position:absolute}.sm-viewer .sm-viewer-nav{z-index:2;margin-top:-22px;position:absolute;top:50%}.sm-viewer .sm-viewer-previous{left:max(12px,env(safe-area-inset-left,0px))}.sm-viewer .sm-viewer-next{right:max(12px,env(safe-area-inset-right,0px))}.sm-viewer-foot{min-width:0;padding:12px max(12px,env(safe-area-inset-right,0px)) max(14px,env(safe-area-inset-bottom,0px)) max(12px,env(safe-area-inset-left,0px));justify-content:center;align-items:baseline;gap:12px;display:flex}.sm-viewer-count{font-family:var(--sm-display);letter-spacing:-.01em;font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:24px;font-style:italic;font-weight:200;line-height:1}.sm-viewer-name{min-width:0;color:var(--fg-muted,#bbb2a7);white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}@media (prefers-reduced-motion:reduce){.sm-player *,.sm-viewer,.sm-viewer *,.sm-expand-btn{transition:none!important;animation:none!important}}.sm-when-pickers{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:inline-flex}.sm-when-pick{min-width:0;display:inline-flex;position:relative}.sm-when-button{border:1px solid var(--border-tok);border-radius:var(--r-3);background:var(--bg-elev-1);height:36px;color:var(--fg);font:inherit;font-family:var(--font-body);font-variant-numeric:tabular-nums;white-space:nowrap;cursor:pointer;align-items:center;gap:6px;padding:0 8px 0 10px;font-size:13.5px;display:inline-flex}.sm-when-button svg{color:var(--fg-muted);flex:none}.sm-when-button svg:last-child{color:var(--fg-subtle)}.sm-when-button[aria-expanded=true]{border-color:var(--fg);box-shadow:inset 0 0 0 1px var(--fg)}.sm-when-button:disabled{cursor:default;opacity:.55}.sm-when-pop{z-index:40;border:1px solid var(--border-strong);border-radius:var(--r-3);background:var(--bg-elev-1);color:var(--fg);box-shadow:var(--shadow-lg);margin:0;padding:10px;position:absolute;top:calc(100% + 4px);left:0}.sm-when-calendar{box-sizing:border-box;gap:6px;width:260px;max-width:calc(100vw - 32px);display:grid}.sm-when-cal-head{justify-content:space-between;align-items:center;font-size:14px;display:flex}.sm-when-cal-head b{font-weight:600}.sm-when-cal-nav{gap:2px;display:inline-flex}.sm-when-cal-nav button{border-radius:var(--r-2);width:30px;height:30px;color:var(--fg-muted);cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:grid}.sm-when-cal-nav button:hover:not(:disabled){background:var(--hover-wash);color:var(--fg)}.sm-when-cal-nav button:disabled{opacity:.35;cursor:default}.sm-when-cal-grid{text-align:center;font-variant-numeric:tabular-nums;grid-template-columns:repeat(7,1fr);gap:2px;font-size:13px;display:grid}.sm-when-cal-grid i{color:var(--fg-subtle);padding:2px 0;font-size:12px;font-style:normal}.sm-when-cal-grid button{height:30px;color:var(--fg);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:50%;place-items:center;padding:0;display:grid}.sm-when-cal-grid button:hover:not(:disabled):not([aria-pressed=true]){background:var(--hover-wash)}.sm-when-cal-grid button:disabled{color:var(--fg-subtle);cursor:default}.sm-when-cal-grid button[aria-current=date]{box-shadow:inset 0 0 0 1px var(--border-strong)}.sm-when-cal-grid button[aria-pressed=true]{background:var(--fg);color:var(--bg);font-weight:600}.sm-when-clear{justify-self:start;min-height:32px;padding:4px 12px}.sm-when-times{box-sizing:border-box;outline:none;gap:1px;width:150px;max-height:240px;padding:4px;list-style:none;display:grid;overflow-y:auto}.sm-when-times li{border-radius:var(--r-2);font-variant-numeric:tabular-nums;cursor:pointer;padding:6px 10px;font-size:14px}.sm-when-times li[data-active=true]{background:var(--hover-wash)}.sm-when-times li[aria-selected=true]{font-weight:600}.sm-when-times li[aria-disabled=true]{color:var(--fg-subtle);cursor:default}.sm-when-times:focus-visible li[data-active=true]{box-shadow:inset 0 0 0 1px var(--fg)}
|
|
@@ -111,6 +111,10 @@ async function judge(path,main,{executeModules=true}={}){
|
|
|
111
111
|
const placeholder=features=>features.length===1&&features[0].id==='main'&&features[0].asks?.length===1&&features[0].asks[0]===features[0].does;
|
|
112
112
|
if(PASSING.has(readiness.status)&&manifest&&!(Array.isArray(manifest.features)&&manifest.features.length&&!placeholder(manifest.features)))
|
|
113
113
|
return {ok:false,status:'NO FEATURE MAP',failures:['Add manifest.features: one entry per separate thing the Block can do, each with id, label, does and asks (requests in a customer\'s words). StillMade search, matching and the listing read it.'],limitations:(readiness.limitations||[]).length};
|
|
114
|
+
// November 3, 2026 (owner: the rules are followed, not suggested): a Wording note does not lower readiness, but the
|
|
115
|
+
// gate does not pass until each is fixed. StillMade's own builder sends the same notes back as repairs.
|
|
116
|
+
const wording=(readiness.limitations||[]).filter(note=>note.startsWith('Wording: '));
|
|
117
|
+
if(PASSING.has(readiness.status)&&wording.length)return {ok:false,status:'WORDING NOT SETTLED',failures:[...wording.map(note=>note.slice(9)),'Fix each of these in the Block. If the person asked for exactly these words, keep them and tell the person the gate flags them.'],limitations:(readiness.limitations||[]).length};
|
|
114
118
|
return {ok:PASSING.has(readiness.status),status:readiness.status,failures:summarize(readiness),limitations:(readiness.limitations||[]).length};
|
|
115
119
|
}catch(error){
|
|
116
120
|
if(/^ready checks one Block package/.test(error.message)){
|
|
@@ -111,7 +111,7 @@ export default async function run(input, stillmade) {
|
|
|
111
111
|
return { cards: { cards: titles.map((title, index) => ({ number: index + 1, title: title.slice(0, 120) })) } };
|
|
112
112
|
}
|
|
113
113
|
`;
|
|
114
|
-
const cardsManifest=(id,name)=>manifest({id,version:'1.0.0',name,description:'Turn lines of text into numbered title cards, with a pinned card shared by everyone in the project.',runtime:'javascript',
|
|
114
|
+
const cardsManifest=(id,name)=>manifest({id,action:{label:'Make cards',running:'Making cards…'},version:'1.0.0',name,description:'Turn lines of text into numbered title cards, with a pinned card shared by everyone in the project.',runtime:'javascript',
|
|
115
115
|
inputs:{lines:{type:'text',primary:true,required:true,semantic:'plain_text',description:'One title per line.'}},
|
|
116
116
|
outputs:{cards:{type:'json',primary:true,semantic:'title_cards',description:'The numbered title cards.',schema:{cards:'object[]'}}},
|
|
117
117
|
// The required input also gets a generated control: pack --original and import refuse a required input nobody can set.
|
|
@@ -239,12 +239,12 @@ export const TEMPLATES=Object.freeze({
|
|
|
239
239
|
stateful:{description:'Number takes with memory saved between runs.',runtime:'recipe',files:fromExample(async()=>(await import('../block-sdk/state-example.js')).numberedTakes,'A Block with saved memory (manifest state).',['stillmade-block test .','stillmade-block run . --save-state memory.json','stillmade-block run . --state memory.json --save-state memory-2.json'])},
|
|
240
240
|
module:{description:'Modern JavaScript (ES modules, async, typed arrays) in a Worker.',runtime:'module',files:async options=>{const {moduleWordStats,MODULE_EXAMPLE_SOURCE}=await import('../block-sdk/module-example.js');return {'stillmade.block.json':json(moduleWordStats.manifest),'module/main.js':MODULE_EXAMPLE_SOURCE,'tests/fixtures.json':json(moduleWordStats.tests),'README.md':readme(moduleWordStats.manifest.name,'A module Block: module/main.js exports `run(input, stillmade)`. Bundle npm packages into module/main.js with any bundler.',OFFLINE,options)};}},
|
|
241
241
|
'module-wasm':{description:'A module that runs WebAssembly shipped beside its code.',runtime:'module',files:async options=>{
|
|
242
|
-
const pkg=manifest({id:'example.wasm-add',version:'1.0.0',name:'Add with WebAssembly',description:'Adds two whole numbers in WebAssembly.',runtime:'module',inputs:{a:{type:'integer',primary:true,required:true,semantic:'first_number',description:'First number.'},b:{type:'integer',required:true,semantic:'second_number',description:'Second number.'}},outputs:{sum:{type:'integer',primary:true,semantic:'sum',description:'a + b.'}},ui:[{control:'number',port:'a'},{control:'number',port:'b'}]});
|
|
242
|
+
const pkg=manifest({id:'example.wasm-add',action:{label:'Add numbers',running:'Adding numbers…'},version:'1.0.0',name:'Add with WebAssembly',description:'Adds two whole numbers in WebAssembly.',runtime:'module',inputs:{a:{type:'integer',primary:true,required:true,semantic:'first_number',description:'First number.'},b:{type:'integer',required:true,semantic:'second_number',description:'Second number.'}},outputs:{sum:{type:'integer',primary:true,semantic:'sum',description:'a + b.'}},ui:[{control:'number',port:'a'},{control:'number',port:'b'}]});
|
|
243
243
|
return {'stillmade.block.json':json(pkg),'module/main.js':`// .wasm files beside main.js are checked by SHA-256 before the module runs.\nexport default async function run(input, stillmade) {\n const { instance } = await WebAssembly.instantiate(stillmade.asset('add.wasm'));\n return { sum: instance.exports.add(input.a, input.b) };\n}\n`,'module/add.wasm':MODULE_WASM_BYTES,'tests/fixtures.json':json([{name:'Adds',input:{a:2,b:40},expected:{sum:42}}]),'README.md':readme(pkg.name,'A module Block with WebAssembly. Compile C, C++, Rust or Go to .wasm and put it in module/.',OFFLINE,options)};
|
|
244
244
|
}},
|
|
245
245
|
'module-hosted':{description:'A module that calls hosted text and image generation as tools.',runtime:'module',files:async options=>{
|
|
246
246
|
// Named for the Block being made, so its README, types and feature map do not name the example (October 27, 2026).
|
|
247
|
-
const pkg=manifest({id:'example.poster-from-idea',version:'1.0.0',name:blockName(options?.folder)||'Poster from an idea',description:'Writes an image prompt from an idea, then generates the poster.',runtime:'module',inputs:{idea:{type:'text',primary:true,required:true,semantic:'idea',description:'What the poster is about.'}},outputs:{poster:{type:'image',primary:true,semantic:'poster',description:'The generated poster.'},prompt:{type:'text',semantic:'image_prompt',description:'The prompt used.'}},permissions:{capabilities:['text.generate','image.generate']},ui:[{control:'text',port:'idea'}]});
|
|
247
|
+
const pkg=manifest({id:'example.poster-from-idea',action:{label:'Generate poster',running:'Generating poster…'},version:'1.0.0',name:blockName(options?.folder)||'Poster from an idea',description:'Writes an image prompt from an idea, then generates the poster.',runtime:'module',inputs:{idea:{type:'text',primary:true,required:true,semantic:'idea',description:'What the poster is about.'}},outputs:{poster:{type:'image',primary:true,semantic:'poster',description:'The generated poster.'},prompt:{type:'text',semantic:'image_prompt',description:'The prompt used.'}},permissions:{capabilities:['text.generate','image.generate']},ui:[{control:'text',port:'idea'}]});
|
|
248
248
|
return {'stillmade.block.json':json(pkg),'module/main.js':MODULE_HOSTED,'tests/fixtures.json':json([{name:'A poster',input:{idea:'a night market in the rain'},expected:{prompt:'Stand-in reply to: Write one vivid sentence describing a poster for: a night market in the rain',poster:{kind:'image',assetId:'mock-image-1',versionId:'v1',url:'/api/media/stillmade-mock/image-1.png',mimeType:'image/png',width:1024,height:1024,bytes:132192}}}]),'tests/mocks.json':json({hosted:{}}),'README.md':readme(pkg.name,'A module Block that uses hosted operations as tools. tests/mocks.json turns on stand-ins for offline tests and packing; record your own answers under "hosted". People approve the price of each call in StillMade; locally `--mock` uses recorded stand-ins.',HOSTED,options)};
|
|
249
249
|
}},
|
|
250
250
|
'view-react':{description:'A React interface (frame view) on a module Block, bundled with esbuild.',runtime:'module',files:async options=>{
|
|
@@ -271,25 +271,25 @@ export const TEMPLATES=Object.freeze({
|
|
|
271
271
|
'web-research':{description:'Research a topic with sources (web.research).',runtime:'capability',files:fromExample(async()=>(await import('../block-sdk/web-example.js')).webResearch,'Hosted web research.',HOSTED)},
|
|
272
272
|
'timeline-proposal':{description:'Propose Editor timeline edits the person reviews (timeline.propose).',runtime:'capability',files:fromExample(async()=>(await import('../block-sdk/timeline-proposal-example.js')).timelinePolish,'Hosted timeline proposals: the person reviews and applies them in the Editor.',HOSTED)},
|
|
273
273
|
'outside-api':{description:'Call an outside https API with the person\'s own key (net.fetch).',runtime:'module',files:async options=>{
|
|
274
|
-
const pkg=manifest({id:'example.open-issues',version:'1.0.0',name:'Open GitHub issues',description:'Lists the open issues of a GitHub repository with your own token.',runtime:'module',inputs:{repository:{type:'text',primary:true,required:true,semantic:'repository_name',description:'owner/name, such as octocat/hello-world.'}},outputs:{issues:{type:'json',primary:true,semantic:'issue_list',description:'Open issues.',schema:{issues:'object[]'}}},permissions:{network:[{origin:'https://api.github.com',auth:{scheme:'bearer',label:'GitHub personal access token',help:'https://github.com/settings/tokens'}}]},ui:[{control:'text',port:'repository'}]});
|
|
274
|
+
const pkg=manifest({id:'example.open-issues',action:{label:'Get open issues',running:'Getting open issues…'},version:'1.0.0',name:'Open GitHub issues',description:'Lists the open issues of a GitHub repository with your own token.',runtime:'module',inputs:{repository:{type:'text',primary:true,required:true,semantic:'repository_name',description:'owner/name, such as octocat/hello-world.'}},outputs:{issues:{type:'json',primary:true,semantic:'issue_list',description:'Open issues.',schema:{issues:'object[]'}}},permissions:{network:[{origin:'https://api.github.com',auth:{scheme:'bearer',label:'GitHub personal access token',help:'https://github.com/settings/tokens'}}]},ui:[{control:'text',port:'repository'}]});
|
|
275
275
|
return {'stillmade.block.json':json(pkg),'module/main.js':OUTSIDE_API,'tests/fixtures.json':json([{name:'Lists issues',input:{repository:'octocat/hello-world'},expected:{issues:{issues:[{number:7,title:'Fix the README',url:'https://github.com/octocat/hello-world/issues/7'}]}}}]),
|
|
276
276
|
'tests/mocks.json':json({network:[{method:'GET',url:'https://api.github.com/repos/octocat/hello-world/issues*',status:200,json:[{number:7,title:'Fix the README',html_url:'https://github.com/octocat/hello-world/issues/7'},{number:8,title:'A pull request',html_url:'https://github.com/octocat/hello-world/pull/8',pull_request:{}}]}]}),
|
|
277
277
|
'README.md':readme(pkg.name,'A module Block that calls an outside API. StillMade adds the person\'s own key for each declared origin; tests/mocks.json records the API\'s answers for offline tests.',HOSTED,options)};
|
|
278
278
|
}},
|
|
279
279
|
connection:{description:'Call a published OpenAPI adapter with the person\'s sign-in.',runtime:'module',files:async options=>{
|
|
280
|
-
const pkg=manifest({id:'example.notion-title',version:'1.0.0',name:'Notion page title',description:'Reads a Notion page title through the published Notion adapter.',runtime:'module',inputs:{pageId:{type:'text',primary:true,required:true,semantic:'notion_page_id',description:'The Notion page ID.'}},outputs:{title:{type:'text',primary:true,semantic:'page_title',description:'The page title.'}},permissions:{connections:['app:openapi:notion']},ui:[{control:'text',port:'pageId'}]});
|
|
280
|
+
const pkg=manifest({id:'example.notion-title',action:{label:'Get page title',running:'Getting page title…'},version:'1.0.0',name:'Notion page title',description:'Reads a Notion page title through the published Notion adapter.',runtime:'module',inputs:{pageId:{type:'text',primary:true,required:true,semantic:'notion_page_id',description:'The Notion page ID.'}},outputs:{title:{type:'text',primary:true,semantic:'page_title',description:'The page title.'}},permissions:{connections:['app:openapi:notion']},ui:[{control:'text',port:'pageId'}]});
|
|
281
281
|
return {'stillmade.block.json':json(pkg),'module/main.js':CONNECTION,'tests/fixtures.json':json([{name:'Reads a title',input:{pageId:'b1b2c3d4e5f60718293a4b5c6d7e8f90'},expected:{title:'Launch plan'}}]),
|
|
282
282
|
'tests/mocks.json':json({connections:{'app:openapi:notion/retrievePage':{object:'page',properties:{Name:{type:'title',title:[{plain_text:'Launch plan'}]}}}}}),
|
|
283
283
|
'README.md':readme(pkg.name,'A module Block that calls a published adapter. People sign in once per Block; tests/mocks.json records the adapter\'s answers for offline tests.',HOSTED,options)};
|
|
284
284
|
}},
|
|
285
285
|
storage:{description:'Remember values across runs in the project\'s Block storage.',runtime:'module',files:async options=>{
|
|
286
|
-
const pkg=manifest({id:'example.remember-settings',version:'1.0.0',name:'Remember settings',description:'Keeps a name and a run count in project storage.',runtime:'module',storage:{schemaVersion:1,scope:'project',desktop:'device-unmetered',cloud:'metered'},inputs:{name:{type:'text',primary:true,required:false,semantic:'person_name',description:'A name to remember.'}},outputs:{greeting:{type:'text',primary:true,semantic:'greeting',description:'A greeting with the run count.'}},ui:[{control:'text',port:'name'}]});
|
|
286
|
+
const pkg=manifest({id:'example.remember-settings',action:{label:'Save settings',running:'Saving settings…'},version:'1.0.0',name:'Remember settings',description:'Keeps a name and a run count in project storage.',runtime:'module',storage:{schemaVersion:1,scope:'project',desktop:'device-unmetered',cloud:'metered'},inputs:{name:{type:'text',primary:true,required:false,semantic:'person_name',description:'A name to remember.'}},outputs:{greeting:{type:'text',primary:true,semantic:'greeting',description:'A greeting with the run count.'}},ui:[{control:'text',port:'name'}]});
|
|
287
287
|
return {'stillmade.block.json':json(pkg),'module/main.js':STORAGE,'tests/fixtures.json':json([{name:'First run',input:{name:'Ada'},expected:{greeting:'Hello Ada, run 1'}}]),'tests/mocks.json':json({storage:{}}),'README.md':readme(pkg.name,'A module Block with project storage. tests/mocks.json can seed stored values under "storage".',OFFLINE,options)};
|
|
288
288
|
}},
|
|
289
289
|
'trigger-media':{description:'Runs on its own when a video is saved (media.saved trigger).',runtime:'capability',files:fromExample(async()=>(await import('../block-sdk/trigger-examples.js')).autoCaptions,'A hosted Block that declares a media.saved trigger. The project owner turns it on and approves a credit budget in the Step\'s "Runs on its own" panel.',HOSTED)},
|
|
290
290
|
'trigger-webhook':{description:'Runs when another service sends a webhook.',runtime:'javascript',files:fromExample(async()=>(await import('../block-sdk/trigger-examples.js')).orderNote,'A JavaScript Block that declares a webhook trigger. The owner turns it on and gets the address and key once.')},
|
|
291
291
|
'trigger-schedule':{description:'Runs on a schedule with the project\'s saved inputs.',runtime:'javascript',files:async options=>{
|
|
292
|
-
const pkg={manifest:manifest({id:'example.daily-checklist',version:'1.0.0',name:'Daily checklist',description:'Turns a list of chores into a numbered checklist, every day.',runtime:'javascript',inputs:{items:{type:'text',primary:true,required:true,semantic:'plain_text',description:'One chore per line.'}},outputs:{checklist:{type:'text',primary:true,semantic:'checklist',description:'The numbered checklist.'}},triggers:[{event:'schedule',everySeconds:86400,label:'Every day'}],ui:[{control:'text',port:'items'}]}),
|
|
292
|
+
const pkg={manifest:manifest({id:'example.daily-checklist',action:{label:'Make checklist',running:'Making checklist…'},version:'1.0.0',name:'Daily checklist',description:'Turns a list of chores into a numbered checklist, every day.',runtime:'javascript',inputs:{items:{type:'text',primary:true,required:true,semantic:'plain_text',description:'One chore per line.'}},outputs:{checklist:{type:'text',primary:true,semantic:'checklist',description:'The numbered checklist.'}},triggers:[{event:'schedule',everySeconds:86400,label:'Every day'}],ui:[{control:'text',port:'items'}]}),
|
|
293
293
|
code:"const items=String(input.items||'').split('\\n').map(line=>line.trim()).filter(Boolean);\nreturn {checklist:items.map((item,index)=>`${index+1}. [ ] ${item}`).join('\\n')};",
|
|
294
294
|
tests:[{name:'Two chores',input:{items:'Back up footage\nReview cuts'},expected:{checklist:'1. [ ] Back up footage\n2. [ ] Review cuts'}}]};
|
|
295
295
|
return {...packageFiles(pkg),'README.md':readme(pkg.manifest.name,'A JavaScript Block that declares a schedule trigger. The owner turns it on for a Step; it runs with the project\'s saved inputs.',OFFLINE,options)};
|
|
@@ -15,7 +15,7 @@ import {initialBlockState,validateBlockState} from '../block-sdk/state.js';
|
|
|
15
15
|
import {createUniversalResolver} from '../block-sdk/universal-resolver.js';
|
|
16
16
|
import {requiresDesktopExecution} from '../block-sdk/desktop-execution.js';
|
|
17
17
|
import {mobileActivationStatus} from '../block-sdk/platform-checks.js';
|
|
18
|
-
import {blockKitProblems,BLOCK_KIT_READINESS_RULES,unmarkedButtons} from '../block-sdk/view-design.js';
|
|
18
|
+
import {blockKitProblems,BLOCK_KIT_READINESS_RULES,unmarkedButtons,viewWordingNotes} from '../block-sdk/view-design.js';
|
|
19
19
|
import {FIRST_PARTY_SDK_PACKAGES} from '../block-sdk/first-party-packages.js';
|
|
20
20
|
import {previewProjectType} from './type-preview.js';
|
|
21
21
|
import {semanticRegistryForManifests} from '../block-sdk/package-semantics.js';
|
|
@@ -39,6 +39,26 @@ const describesImages=pkg=>pkg.capability?.operation==='image.describe'||(pkg.ma
|
|
|
39
39
|
const IMAGE_DESCRIBE_WARNING='It calls image.describe, which StillMade credits do not pay for, so it stops for anyone without their own OpenRouter key. Use media.analyze instead: StillMade credits pay for it.';
|
|
40
40
|
|
|
41
41
|
/** Derive exactly one readiness status from item states. */
|
|
42
|
+
const GENERIC_ACTIONS=/^(run|run it|submit|go|start|process|execute|do it|make it|make|create|generate|output)$/i;
|
|
43
|
+
const BARE_MEDIA_NAMES=new Set(['video','videos','image','images','photo','photos','picture','pictures','audio','sound','file','files','media','input','asset','assets']);
|
|
44
|
+
const MEDIA_PORTS=new Set(['image','image[]','video','video[]','audio','audio[]','asset','asset[]','file']);
|
|
45
|
+
/** Where a Block's screen would fall back to generic words instead of the job's ("Make it", "Drop a video here"). */
|
|
46
|
+
export function jobWordingNotes(pkg){
|
|
47
|
+
const manifest=pkg?.manifest||{},notes=[],label=manifest.action?.label;
|
|
48
|
+
const operations=pkg?.capability?.operation?[pkg.capability.operation]:(manifest.permissions?.capabilities||[]);
|
|
49
|
+
if(label&&GENERIC_ACTIONS.test(label.trim()))notes.push(`The button reads "${label}". Name what it does in the job's words in manifest.action ("Plan the tour").`);
|
|
50
|
+
// November 3, 2026 (owner: fix the underlying problem): StillMade draws the run button for every Block without its
|
|
51
|
+
// own screen, and for one that calls operations; such a Block names it, or StillMade can only guess from its name.
|
|
52
|
+
else if(!label&&(!pkg?.view||operations.length))notes.push('StillMade draws this Step\'s button and can only guess its words from the Block\'s name or output. Name what it does in the job\'s words in manifest.action ({label:"Animate photos",running:"Animating…"}).');
|
|
53
|
+
const bare=Object.entries(manifest.inputs||{}).filter(([name,port])=>MEDIA_PORTS.has(port?.type)&&BARE_MEDIA_NAMES.has(name.toLowerCase())).map(([name])=>name);
|
|
54
|
+
// Days and times are picked, never typed: a text input that holds one is a date input, which StillMade shows as a calendar.
|
|
55
|
+
const typedDates=Object.entries(manifest.inputs||{}).filter(([name,port])=>port?.type==='text'&&/(?:date|time|when|deadline|schedule)|(?:At|_at)$/.test(name)).map(([name])=>name);
|
|
56
|
+
if(typedDates.length)notes.push(`${typedDates.length===1?`The input ${typedDates[0]} is`:`The inputs ${typedDates.join(', ')} are`} text, so a day or time is typed. Make ${typedDates.length===1?'it':'each'} a date input: StillMade shows a calendar, and a list of times when it is about a time.`);
|
|
57
|
+
if(pkg?.view)notes.push(...viewWordingNotes(pkg.view));
|
|
58
|
+
if(bare.length)notes.push(`${bare.length===1?`The input ${bare[0]} is`:`The inputs ${bare.join(', ')} are`} named only by type, so the drop area reads "Drop a ${bare[0].replace(/s$/,'')} here". Name each for what the person brings (sermonVideo), unless any file of that kind does the job.`);
|
|
59
|
+
return notes;
|
|
60
|
+
}
|
|
61
|
+
|
|
42
62
|
export function readinessStatus(items){
|
|
43
63
|
const applicable=items.filter(item=>item.state!=='not-applicable');
|
|
44
64
|
if(applicable.some(item=>item.state==='failed'||item.state==='blocked'&&['A','D'].includes(item.gapClass)))return READINESS_STATUSES[3];
|
|
@@ -95,7 +115,9 @@ export async function assessBlockReadiness(pkg,{catalog=FIRST_PARTY_SDK_PACKAGES
|
|
|
95
115
|
const failed=(id,reason)=>set(id,'failed',{reason});
|
|
96
116
|
const result=async()=>{
|
|
97
117
|
const all=BUILDER_CONTRACT.definitionOfDone.map(item=>items.get(item.id)||{id:item.id,title:item.title,state:'not-verified',reason:'This check did not run.'});
|
|
98
|
-
|
|
118
|
+
// November 2, 2026 (owner): generic words are a note beside the limitations, never a refusal or a lower status.
|
|
119
|
+
const wording=String(pkg?.manifest?.id).startsWith('sm.')?[]:jobWordingNotes(pkg);
|
|
120
|
+
return {contract:{id:BUILDER_CONTRACT.id,version:BUILDER_CONTRACT.version},digest:await digest(pkg).catch(()=>null),status:readinessStatus(all),items:all,limitations:[...all.filter(item=>item.state==='not-verified').map(item=>`${item.id} ${item.title}: ${item.reason}`),...wording.map(note=>`Wording: ${note}`)],composition};
|
|
99
121
|
};
|
|
100
122
|
|
|
101
123
|
if(unsupported){
|
|
@@ -21,6 +21,15 @@ function nativeCanvasContract(node){
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
const textNodes = new Set(['textPromptNode', 'llmNode', 'imageDescriberNode']);
|
|
24
|
+
// A full-screen workspace that takes wires (Voiceover and Image Panels 1.2.0) keeps one Canvas node
|
|
25
|
+
// carrying its ports: the screen writes its results to workspaceOutputs and reads its wired inputs
|
|
26
|
+
// from the edges into this node, so wires and Flow treat it like any Block.
|
|
27
|
+
export function workspaceHostPort(node,handle,direction){
|
|
28
|
+
if(node?.type!=='workspaceHostNode')return null;
|
|
29
|
+
const contract=nativeCanvasContract(node),name=Object.entries(contract?.host.ports||{}).find(([,value])=>value===handle)?.[0];
|
|
30
|
+
const port=name&&contract.manifest[direction]?.[name];
|
|
31
|
+
return port&&handle===`${direction==='inputs'?'in':'out'}:${name}`?{...port,name}:null;
|
|
32
|
+
}
|
|
24
33
|
export function outputPort(node, handle) {
|
|
25
34
|
if(node?.type === 'productionWorkspaceNode') {
|
|
26
35
|
if(handle !== 'out:output')return null;
|
|
@@ -36,6 +45,10 @@ export function outputPort(node, handle) {
|
|
|
36
45
|
if(tool === 'sm.stock-search')return {name:'output',type:'asset[]',value:asset ? [asset] : undefined};
|
|
37
46
|
return null;
|
|
38
47
|
}
|
|
48
|
+
if (node?.type === 'workspaceHostNode') {
|
|
49
|
+
const port=workspaceHostPort(node,handle,'outputs');
|
|
50
|
+
return port ? {...port,value:node.data?.workspaceOutputs?.[port.name]} : null;
|
|
51
|
+
}
|
|
39
52
|
if (node?.type === 'programmableBlockNode') {
|
|
40
53
|
const name = String(handle || '').replace(/^out:/, '');
|
|
41
54
|
const port = node.data?.blockPackage?.manifest?.outputs?.[name];
|
|
@@ -63,6 +76,10 @@ export function canConnectBlock(source, target, connection, {semantics}={}) {
|
|
|
63
76
|
const contract=nativeCanvasContract(target);
|
|
64
77
|
return !!contract&&connection.targetHandle===contract.host.ports?.input&&!!contract.manifest.inputs.input&&compatible(output,contract.manifest.inputs.input).compatible;
|
|
65
78
|
}
|
|
79
|
+
if (target.type === 'workspaceHostNode') {
|
|
80
|
+
const port=workspaceHostPort(target,connection.targetHandle,'inputs');
|
|
81
|
+
return !!port&&compatible(output,port,{semantics}).compatible;
|
|
82
|
+
}
|
|
66
83
|
if (target.type === 'programmableBlockNode') {
|
|
67
84
|
const name = String(connection.targetHandle || '').replace(/^in:/, '');
|
|
68
85
|
const port = target.data?.blockPackage?.manifest?.inputs?.[name];
|
|
@@ -81,7 +81,8 @@ const HOST_WORKSPACE_BLOCKS = [SCRIPT_WRITER_BLOCK,...screens.map(([key,name,pha
|
|
|
81
81
|
// Its portable 2.x releases are a separate, simpler view kept for their exact pins.
|
|
82
82
|
// Its released manifest keeps its name (Video editor); it is listed as the Editor, at the same address.
|
|
83
83
|
if(key==='editor')return {...legacy,source,workspace:{phase,features},summary:{...legacy.summary,text:description},adapterStatus:'workspace',listingName:name};
|
|
84
|
-
|
|
84
|
+
// Voiceover and Image Panels 1.2.0 are their original screens with ports (November 2, 2026).
|
|
85
|
+
const version=key==='pipeline'||key==='voiceover'||key==='panel-strip'?'1.2.0':'1.1.0';
|
|
85
86
|
return {...legacy,manifest:hostReleaseManifest(legacy.manifest.id,version),source,workspace:{phase,features},summary:{...legacy.summary,text:description},adapterStatus:'workspace'};
|
|
86
87
|
})];
|
|
87
88
|
HOST_WORKSPACE_BLOCKS.splice(HOST_WORKSPACE_BLOCKS.findIndex(block=>block.manifest.id==='sm.pipeline')+1,0,VIDEO_ASSETS_BLOCK);
|
|
@@ -92,7 +93,9 @@ export const CURRENT_PORTABLE_WORKSPACE_VERSIONS=Object.freeze({'sm.chat':'2.0.3
|
|
|
92
93
|
// Workspaces whose main release stays the host one: the original Editor (1.0) is
|
|
93
94
|
// the full video editor. Its accepted portable release stays discoverable for
|
|
94
95
|
// Steps that hand the Editor a prepared timeline, which only it accepts.
|
|
95
|
-
|
|
96
|
+
// November 2, 2026 (owner): Voiceover and Image Panels are their original full screens too,
|
|
97
|
+
// at 1.2.0, which take and give wires like any Block; their portable 2.x releases keep their pins.
|
|
98
|
+
export const MAIN_HOST_WORKSPACES=new Set(['sm.editor','sm.voiceover','sm.panel-strip']);
|
|
96
99
|
export const WORKSPACE_BLOCKS=HOST_WORKSPACE_BLOCKS.map(block=>{
|
|
97
100
|
const version=CURRENT_PORTABLE_WORKSPACE_VERSIONS[block.manifest.id];
|
|
98
101
|
if(!version||MAIN_HOST_WORKSPACES.has(block.manifest.id))return block;
|
|
@@ -143,7 +146,8 @@ export const BLOCK_TOOLS=new Set(['sm.export-video','sm.export-audio','sm.export
|
|
|
143
146
|
// once, and its Only if lets through only the items wanted (October 22, 2026, owner-approved mockup): finding new
|
|
144
147
|
// items and gating on a decision are no longer Blocks of their own. Saved projects keep running them.
|
|
145
148
|
export const AUTOMATION_PARTS=new Set(['sm.new-items','sm.continue-if']);
|
|
146
|
-
|
|
149
|
+
// November 2, 2026 (owner): Voiceover is offered again ("voiceover was the original").
|
|
150
|
+
export const HIDDEN_BLOCKS=new Set(['sm.script','sm.chat','sm.thumbnail','sm.shot-plan-assistant','sm.blueprint-assistant','sm.animated-scene-assistant','sm.whiteboard-assistant','sm.final-edit','sm.edit-assistant','sm.character','sm.location','sm.style','sm.compare','sm.image-editor','sm.score','sm.research','sm.quality-audit','sm.rough-cut',...BLOCK_TOOLS,...AUTOMATION_PARTS]);
|
|
147
151
|
// Exact releases to hide (id@version) when one release of a shown Block should not be offered; none today.
|
|
148
152
|
export const HIDDEN_RELEASES=new Set([]);
|
|
149
153
|
export const isHiddenBlock=block=>HIDDEN_BLOCKS.has(block.manifest.id)||HIDDEN_RELEASES.has(`${block.manifest.id}@${block.manifest.version}`);
|
|
@@ -178,7 +182,11 @@ const oneCardEach=blocks=>[...blocks.reduce((map,block)=>{
|
|
|
178
182
|
if(!kept||(MAIN_HOST_WORKSPACES.has(id)?block.manifest.runtime==='host'&&kept.manifest.runtime!=='host':kept.manifest.runtime!=='host'&&newer(block.manifest.version,kept.manifest.version)))map.set(id,block);
|
|
179
183
|
return map;
|
|
180
184
|
},new Map()).values()];
|
|
181
|
-
|
|
185
|
+
// November 2, 2026 (owner: "idc if it's called narration, just make it look and act like voiceover"): Chat
|
|
186
|
+
// still plans a narration job with Narration, and the Step it places is Voiceover (chatAutomation.js), so
|
|
187
|
+
// people only ever see Voiceover. Saved projects and Types that pin Narration keep running it.
|
|
188
|
+
export const PLACED_AS=new Map([['stillmade.narration',{id:'sm.voiceover',version:'1.2.0',inputs:{script:'input'},outputs:{script:'spokenScript',audio:'output'}}]]);
|
|
189
|
+
export const LISTED_BLOCKS=Object.freeze(oneCardEach(DISCOVERABLE_BLOCKS.filter(isOfferedBlock).filter(block=>!PLACED_AS.has(block.manifest.id))));
|
|
182
190
|
// A folded Block's card, offered only to replace a saved Step of that Block (its "Update to" button).
|
|
183
191
|
export const FOLDED_CARDS=Object.freeze(oneCardEach(DISCOVERABLE_BLOCKS.filter(block=>FOLDED_BLOCKS.has(block.manifest.id))));
|
|
184
192
|
export const PLANNING_BLOCKS = DISCOVERABLE_BLOCKS.map(block=>DISCOVERED_AS_HOST.get(block.manifest.id)===block?newestRelease(block.manifest.id)||block:block);
|
|
@@ -212,8 +220,15 @@ const PRIOR_CURRENT_TYPES = currentBuiltinTypes('1.13.0','2.2.3',SCRIPT_WRITER_B
|
|
|
212
220
|
const PREVIOUS_PORTABLE_TYPES=currentBuiltinTypes('1.14.0','2.2.4',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.8','panel-strip':'2.3.6','board-editor':'2.2.9','animated-scene':'2.3.7','editor':'2.2.8'});
|
|
213
221
|
// 1.16.0: every built-in type ends in the original Editor (1.0), the full video editor.
|
|
214
222
|
const PORTABLE_EDITOR_TYPES=currentBuiltinTypes('1.15.0','2.2.4','2.1.4',{'voiceover':'2.1.4','shot-plan':'2.1.3','blueprint':'2.1.9','panel-strip':'2.3.7','board-editor':'2.2.10','animated-scene':'2.3.8','editor':'2.2.9'});
|
|
215
|
-
|
|
216
|
-
|
|
223
|
+
const HOST_EDITOR_TYPES=currentBuiltinTypes('1.16.0','2.2.4','2.1.4',{'voiceover':'2.1.4','shot-plan':'2.1.3','blueprint':'2.1.9','panel-strip':'2.3.7','board-editor':'2.2.10','animated-scene':'2.3.8','editor':'1.0.0'});
|
|
224
|
+
// 1.17.0 (November 2, 2026, owner): every built-in Type that narrates opens the original Voiceover screen. Image
|
|
225
|
+
// Panels takes the voice and its word timings from it over ports; Shots, White Board Motion and Animated Studio's
|
|
226
|
+
// assets read the voiceover document it writes, as they read the portable one's. Blank Canvas has no voice.
|
|
227
|
+
const narrates=type=>flows[type.legacyMode].includes('voiceover');
|
|
228
|
+
const ORIGINAL_VOICEOVER_TYPES=currentBuiltinTypes('1.17.0','2.2.4','2.1.4',{'voiceover':'1.2.0','shot-plan':'2.1.3','blueprint':'2.1.9','panel-strip':'1.2.0','board-editor':'2.2.10','animated-scene':'2.3.8','editor':'1.0.0'}).map(type=>type.legacyMode!=='imagePanel'?type:
|
|
229
|
+
{...type,connections:[{from:{stage:'stage-1',port:'output'},to:{stage:'stage-2',port:'narrationAudio'}},{from:{stage:'stage-1',port:'timing'},to:{stage:'stage-2',port:'narrationTiming'}}]});
|
|
230
|
+
export const CURRENT_BUILTIN_TYPES = [...HOST_EDITOR_TYPES.map(type=>narrates(type)?ORIGINAL_VOICEOVER_TYPES.find(next=>next.id===type.id):type),DEALER_INVENTORY_VIDEO_PROJECT_TYPE];
|
|
231
|
+
const HISTORICAL_CURRENT_TYPES=[...HOST_EDITOR_TYPES.filter(narrates),...PORTABLE_EDITOR_TYPES,...PREVIOUS_PORTABLE_TYPES,...PRIOR_CURRENT_TYPES,...SHARED_WORKSPACE_TYPES,...SHARED_CANVAS_TYPES,...SHARED_BLUEPRINT_TYPES,...PRIOR_SHARED_TYPES,...MEDIA_LIBRARY_TYPES,...EDITOR_AUDIO_TYPES,...PLAYABLE_EDITOR_TYPES,...ADVANCED_PORTABLE_TYPES,...PORTABLE_MVP_TYPES,...PRE_PROMOTION_CURRENT_TYPES,...PREVIOUS_BUILTIN_TYPES.filter(type=>flows[type.legacyMode].includes('shot-plan')),...currentBuiltinTypes('1.1.0','1.1.0','1.1.0',PRIOR_HOST_WORKSPACE_VERSIONS)];
|
|
217
232
|
export const BUILTIN_TYPES = [...CURRENT_BUILTIN_TYPES,...HISTORICAL_CURRENT_TYPES,...LEGACY_TYPES];
|
|
218
233
|
// Hidden from discovery (October 20, 2026, owner decision: keep only Guided, Image Panels, Blank
|
|
219
234
|
// Canvas and White Board Motion; the rest start again on the updated SDK). Animated Studio and the
|