@volter/sdk 0.0.0-stage → 0.5.203
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/LICENSE +202 -0
- package/NOTICE +20 -0
- package/README.md +38 -3
- package/package.json +510 -4
- package/src/account.ts +210 -0
- package/src/chrome.ts +88 -0
- package/src/client.ts +1646 -0
- package/src/commands.ts +66 -0
- package/src/contributions.ts +619 -0
- package/src/css-numeric-style.ts +97 -0
- package/src/document-probe.ts +282 -0
- package/src/editor-view.ts +225 -0
- package/src/extension.ts +40 -0
- package/src/generations.ts +178 -0
- package/src/host.ts +1157 -0
- package/src/http-transport.browser.ts +14 -0
- package/src/http-transport.node.ts +19 -0
- package/src/index.ts +131 -0
- package/src/kit/CapabilityCoverageSection.tsx +185 -0
- package/src/kit/account-client.ts +333 -0
- package/src/kit/action-registry.ts +317 -0
- package/src/kit/active-product.ts +76 -0
- package/src/kit/active-project.ts +155 -0
- package/src/kit/adapter-editor-config.ts +25 -0
- package/src/kit/adapter-module.ts +7 -0
- package/src/kit/adapter-observation.ts +49 -0
- package/src/kit/animation/animation-clock.ts +479 -0
- package/src/kit/animation/stage-transport.ts +385 -0
- package/src/kit/api/assets.ts +365 -0
- package/src/kit/api/project-open.ts +355 -0
- package/src/kit/api/project-source.ts +180 -0
- package/src/kit/api/project-state.ts +110 -0
- package/src/kit/api/relay.ts +270 -0
- package/src/kit/api/themes.ts +45 -0
- package/src/kit/api-asset-library-wire.ts +45 -0
- package/src/kit/api-base.ts +10 -0
- package/src/kit/api-build.ts +99 -0
- package/src/kit/api-git-wire.ts +56 -0
- package/src/kit/api-logs.ts +92 -0
- package/src/kit/api-project-identity.ts +74 -0
- package/src/kit/api-settings.ts +36 -0
- package/src/kit/api-worktrees.ts +205 -0
- package/src/kit/asset-capabilities.ts +344 -0
- package/src/kit/asset-compare-core.ts +171 -0
- package/src/kit/asset-editor-context.tsx +101 -0
- package/src/kit/asset-events.ts +96 -0
- package/src/kit/asset-inspector-actions.ts +87 -0
- package/src/kit/asset-selection-viewer-registry.ts +113 -0
- package/src/kit/asset-selection.ts +146 -0
- package/src/kit/asset-thumbnails.ts +25 -0
- package/src/kit/asset-viewers.ts +115 -0
- package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/kit/asset-workflow/asset-ledger.ts +156 -0
- package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/kit/asset-workflow/asset-types.ts +142 -0
- package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
- package/src/kit/asset-workflow/audio-waveform.ts +22 -0
- package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/kit/asset-workflow/image-view-scale.ts +31 -0
- package/src/kit/asset-workflow/import-contract.ts +124 -0
- package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
- package/src/kit/asset-workflow/project-content.ts +288 -0
- package/src/kit/asset-workflow/project-source-index.ts +545 -0
- package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
- package/src/kit/authoring/active-adapter.ts +200 -0
- package/src/kit/authoring/active-systems.ts +422 -0
- package/src/kit/authoring/adapter-key.ts +18 -0
- package/src/kit/authoring/authoring-asset-url.ts +27 -0
- package/src/kit/authoring/bootstrap-state.ts +49 -0
- package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
- package/src/kit/authoring/canvas-scene-guides.ts +84 -0
- package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
- package/src/kit/authoring/consumer-actions.ts +531 -0
- package/src/kit/authoring/design-time-layers.ts +852 -0
- package/src/kit/authoring/design-time-mount-registry.ts +244 -0
- package/src/kit/authoring/edit-mode-authoring.ts +637 -0
- package/src/kit/authoring/empty-project-authoring.ts +22 -0
- package/src/kit/authoring/instance-source-menu.ts +135 -0
- package/src/kit/authoring/layered-pick.ts +185 -0
- package/src/kit/authoring/mounted-root-subjects.ts +146 -0
- package/src/kit/authoring/no-authoring-adapter.ts +59 -0
- package/src/kit/authoring/object3d-document-persistence.ts +122 -0
- package/src/kit/authoring/panel-authoring.ts +121 -0
- package/src/kit/authoring/project-authoring-session.ts +105 -0
- package/src/kit/authoring/provenance.ts +99 -0
- package/src/kit/authoring/react-canvas-navigation.ts +259 -0
- package/src/kit/authoring/react-design-canvas-style.ts +20 -0
- package/src/kit/authoring/react-story-board.ts +917 -0
- package/src/kit/authoring/selection-scope.ts +195 -0
- package/src/kit/authoring/shell-document-ops.ts +169 -0
- package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
- package/src/kit/authoring/story-board-presentation.ts +111 -0
- package/src/kit/authoring/three-root.ts +67 -0
- package/src/kit/authoring/viewport-tool-context.ts +73 -0
- package/src/kit/authoring/viewport-tool-owner.ts +38 -0
- package/src/kit/authoring/world-session-state.ts +101 -0
- package/src/kit/authoring-seam-evidence.ts +300 -0
- package/src/kit/availability-tick.ts +66 -0
- package/src/kit/bitmap-label.ts +120 -0
- package/src/kit/boot-routing.ts +392 -0
- package/src/kit/breakpoint-state.ts +43 -0
- package/src/kit/build-identity.ts +16 -0
- package/src/kit/bytes-codec.ts +62 -0
- package/src/kit/cancellation-reason.ts +58 -0
- package/src/kit/canvas-frames.ts +88 -0
- package/src/kit/capture-camera-pose.ts +77 -0
- package/src/kit/capture-size.ts +88 -0
- package/src/kit/chrome-registry.ts +159 -0
- package/src/kit/chrome-slot-registry.ts +91 -0
- package/src/kit/collaboration-client.ts +264 -0
- package/src/kit/collaboration-presence.ts +41 -0
- package/src/kit/command-dispatch.ts +19 -0
- package/src/kit/command-listener.ts +2182 -0
- package/src/kit/command-registry.ts +71 -0
- package/src/kit/component-board-registry.ts +205 -0
- package/src/kit/component-states-registry.ts +199 -0
- package/src/kit/components/AlignToolbar.tsx +204 -0
- package/src/kit/components/ApplicationMenus.tsx +372 -0
- package/src/kit/components/AssetEditorShell.tsx +216 -0
- package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
- package/src/kit/components/BoardRulers.tsx +354 -0
- package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
- package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
- package/src/kit/components/ChromeSlot.tsx +20 -0
- package/src/kit/components/CodeView.tsx +470 -0
- package/src/kit/components/CompactInspectorShell.tsx +39 -0
- package/src/kit/components/ConsolePanel.tsx +273 -0
- package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
- package/src/kit/components/InspectionProjection.tsx +932 -0
- package/src/kit/components/Inspector.tsx +270 -0
- package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
- package/src/kit/components/InspectorFieldsSection.tsx +290 -0
- package/src/kit/components/InspectorStoriesSection.tsx +92 -0
- package/src/kit/components/InspectorToolSection.tsx +96 -0
- package/src/kit/components/InspectorTransformSection.tsx +245 -0
- package/src/kit/components/LightExplorerPanel.tsx +433 -0
- package/src/kit/components/MediaProperties.tsx +145 -0
- package/src/kit/components/ProjectHeader.tsx +328 -0
- package/src/kit/components/ReactCanvasControls.tsx +358 -0
- package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
- package/src/kit/components/RootTextEditor.tsx +79 -0
- package/src/kit/components/SaveStatus.tsx +70 -0
- package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
- package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
- package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
- package/src/kit/components/ToolHost.tsx +380 -0
- package/src/kit/components/Toolbar.tsx +811 -0
- package/src/kit/components/TransientHint.tsx +44 -0
- package/src/kit/components/VersionControlSection.tsx +470 -0
- package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
- package/src/kit/components/VolterLogo.tsx +18 -0
- package/src/kit/components/WorktreeSwitcher.tsx +712 -0
- package/src/kit/components/account-documents.tsx +1162 -0
- package/src/kit/components/asset-documents.tsx +794 -0
- package/src/kit/components/asset-editor-persistence.ts +216 -0
- package/src/kit/components/asset-selection-section.tsx +545 -0
- package/src/kit/components/asset-thumbnails.tsx +307 -0
- package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
- package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
- package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
- package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/kit/components/asset-viewers/shader-source.ts +144 -0
- package/src/kit/components/board-guides.ts +150 -0
- package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
- package/src/kit/components/canvas-temporary-pivot.ts +34 -0
- package/src/kit/components/core-utilities.tsx +94 -0
- package/src/kit/components/inspector-preview-section.tsx +223 -0
- package/src/kit/components/inspector-revert-label.ts +20 -0
- package/src/kit/components/inspector-selection.ts +42 -0
- package/src/kit/components/inspector-stories-gating.ts +171 -0
- package/src/kit/components/inspector-transform-subject.ts +11 -0
- package/src/kit/components/inspector-transform.ts +88 -0
- package/src/kit/components/kind-documents.tsx +544 -0
- package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
- package/src/kit/components/project-tool-documents.tsx +402 -0
- package/src/kit/components/scene-documents.tsx +221 -0
- package/src/kit/components/status-contributions.tsx +407 -0
- package/src/kit/components/tool-documents.tsx +302 -0
- package/src/kit/components/tool-schema-form.tsx +262 -0
- package/src/kit/components/use-after-paint.ts +41 -0
- package/src/kit/components/use-project-image-assets.ts +86 -0
- package/src/kit/components/workspace-history.ts +32 -0
- package/src/kit/components/world-documents.tsx +570 -0
- package/src/kit/components/world-overlay-gestures.ts +1939 -0
- package/src/kit/composite-screenshot.ts +2238 -0
- package/src/kit/content-entry-source-registry.ts +184 -0
- package/src/kit/contribution-surfaces.ts +48 -0
- package/src/kit/coverage/canvas-reveal.ts +192 -0
- package/src/kit/coverage/design-time-surfaces.ts +101 -0
- package/src/kit/coverage/ontology-invariants.ts +466 -0
- package/src/kit/coverage/session-vitals.ts +503 -0
- package/src/kit/crash-null-boundary.ts +36 -0
- package/src/kit/creation-site-edit.ts +1491 -0
- package/src/kit/creation-site-registry.ts +160 -0
- package/src/kit/delegate-harness-registry.ts +134 -0
- package/src/kit/document-areas.ts +70 -0
- package/src/kit/document-context-registry.ts +193 -0
- package/src/kit/document-open-registry.ts +200 -0
- package/src/kit/document-play-extension.ts +221 -0
- package/src/kit/document-preview-source.ts +20 -0
- package/src/kit/document-renderer-session.ts +138 -0
- package/src/kit/document-stage-sessions.ts +26 -0
- package/src/kit/document-viewports.ts +120 -0
- package/src/kit/editor-api.ts +46 -0
- package/src/kit/editor-chrome-capture.ts +136 -0
- package/src/kit/editor-commands.ts +176 -0
- package/src/kit/editor-console.ts +580 -0
- package/src/kit/editor-current-view.ts +56 -0
- package/src/kit/editor-document-probe.ts +1166 -0
- package/src/kit/editor-git-client.ts +115 -0
- package/src/kit/editor-hotkeys.ts +728 -0
- package/src/kit/editor-lease-view.ts +39 -0
- package/src/kit/editor-lease.ts +415 -0
- package/src/kit/editor-mode.ts +19 -0
- package/src/kit/editor-notifications.ts +140 -0
- package/src/kit/editor-presence.ts +563 -0
- package/src/kit/editor-presentation-activity.ts +58 -0
- package/src/kit/editor-presentation-notice.ts +42 -0
- package/src/kit/editor-runtime.tsx +147 -0
- package/src/kit/editor-server-response.ts +86 -0
- package/src/kit/editor-session-attribution.ts +85 -0
- package/src/kit/editor-session-mode.ts +54 -0
- package/src/kit/editor-state-facets.ts +74 -0
- package/src/kit/editor-view-presentation.ts +777 -0
- package/src/kit/environment-images.ts +58 -0
- package/src/kit/eyedropper-session.ts +60 -0
- package/src/kit/files/file-provider.ts +62 -0
- package/src/kit/files/project-files.ts +270 -0
- package/src/kit/finders/index.ts +137 -0
- package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/kit/frame/frame-parts.ts +30 -0
- package/src/kit/framed-document-capture.ts +34 -0
- package/src/kit/game-globals-prelude.ts +143 -0
- package/src/kit/game-surface-defaults.ts +33 -0
- package/src/kit/gameplay-dom-recording.ts +318 -0
- package/src/kit/gameplay-export-state.ts +14 -0
- package/src/kit/gameplay-replay.ts +417 -0
- package/src/kit/gameplay-session-time.ts +9 -0
- package/src/kit/gameplay-sessions.ts +204 -0
- package/src/kit/hierarchy-component-marks.ts +298 -0
- package/src/kit/hierarchy-internals.ts +197 -0
- package/src/kit/hierarchy-kind-icon.ts +217 -0
- package/src/kit/hierarchy-menu-registry.ts +67 -0
- package/src/kit/hierarchy-node-rows.ts +307 -0
- package/src/kit/hierarchy-panel-view.ts +280 -0
- package/src/kit/hierarchy-projection.ts +76 -0
- package/src/kit/hierarchy-row-media.ts +45 -0
- package/src/kit/hierarchy-row-model.ts +308 -0
- package/src/kit/hierarchy-rows.ts +11 -0
- package/src/kit/hierarchy-walk.ts +86 -0
- package/src/kit/history/editor-session.ts +25 -0
- package/src/kit/history/history-commands.ts +147 -0
- package/src/kit/history/history-delegate.ts +187 -0
- package/src/kit/history/history-limit-notices.ts +43 -0
- package/src/kit/history/history-service.ts +1189 -0
- package/src/kit/history/persistence-coordinator.ts +35 -0
- package/src/kit/history/project-file-history.ts +386 -0
- package/src/kit/history/project-root-history-backends.ts +139 -0
- package/src/kit/history/resource-registry.ts +209 -0
- package/src/kit/history/snapshot-store.ts +103 -0
- package/src/kit/history/source-history-backend.ts +546 -0
- package/src/kit/history-types.ts +124 -0
- package/src/kit/hmr-registration-group.ts +67 -0
- package/src/kit/hmr-stable-react-context.ts +23 -0
- package/src/kit/hotkeys.ts +190 -0
- package/src/kit/inference-diagnostics.ts +69 -0
- package/src/kit/initial-project.ts +80 -0
- package/src/kit/inspection/active-subject.ts +571 -0
- package/src/kit/inspection/active-surface.ts +142 -0
- package/src/kit/inspection/compose-subject.ts +1055 -0
- package/src/kit/inspection/compose.ts +7 -0
- package/src/kit/inspection/display.ts +171 -0
- package/src/kit/inspection/document-subject.ts +109 -0
- package/src/kit/inspection/game-subject.ts +85 -0
- package/src/kit/inspection/null-subject.ts +119 -0
- package/src/kit/inspection/serialize.ts +357 -0
- package/src/kit/inspection/use-active-inspection.ts +180 -0
- package/src/kit/inspection-model.ts +542 -0
- package/src/kit/inspection-node-media.ts +58 -0
- package/src/kit/inspector-presentation.ts +203 -0
- package/src/kit/inspector-property-grouping.ts +64 -0
- package/src/kit/inspector-section-registry.ts +221 -0
- package/src/kit/instance-source-actions.ts +163 -0
- package/src/kit/js-heap.ts +71 -0
- package/src/kit/key-actions.ts +91 -0
- package/src/kit/keymap-presets.ts +428 -0
- package/src/kit/layout-policy.ts +31 -0
- package/src/kit/light-explorer-model.ts +134 -0
- package/src/kit/live-canvas-frame.ts +55 -0
- package/src/kit/live-document.ts +296 -0
- package/src/kit/live-gesture-lock.ts +50 -0
- package/src/kit/live-seam-evidence.ts +11 -0
- package/src/kit/live-session-registry.ts +220 -0
- package/src/kit/live-transition.ts +391 -0
- package/src/kit/manifest-project.ts +107 -0
- package/src/kit/module-fetch-diagnosis.ts +192 -0
- package/src/kit/mount-failure-report.ts +154 -0
- package/src/kit/native-selection-style.ts +497 -0
- package/src/kit/object3d-document-write-policy.ts +137 -0
- package/src/kit/packaged-runtime.ts +108 -0
- package/src/kit/palettes/maya.palette.json +57 -0
- package/src/kit/palettes/substance.palette.json +57 -0
- package/src/kit/performance-profiler.ts +367 -0
- package/src/kit/performance-sources.ts +69 -0
- package/src/kit/photograph-notice.ts +141 -0
- package/src/kit/play-boot-phase.ts +166 -0
- package/src/kit/play-camera-flight.ts +35 -0
- package/src/kit/png-encode.worker.ts +26 -0
- package/src/kit/presentation-surface.ts +248 -0
- package/src/kit/product-command.ts +90 -0
- package/src/kit/project-adapter.ts +1140 -0
- package/src/kit/project-asset-refresh.ts +23 -0
- package/src/kit/project-asset-roots.ts +68 -0
- package/src/kit/project-local-state.ts +151 -0
- package/src/kit/project-manager.ts +243 -0
- package/src/kit/project-module-changes.ts +201 -0
- package/src/kit/project-module-split.ts +270 -0
- package/src/kit/project-play-layers.ts +25 -0
- package/src/kit/project-provenance.ts +115 -0
- package/src/kit/project-ready.ts +42 -0
- package/src/kit/project-shape.ts +68 -0
- package/src/kit/project-tools.ts +107 -0
- package/src/kit/projection-types.ts +44 -0
- package/src/kit/readiness.ts +113 -0
- package/src/kit/renderer-resource-counts.ts +27 -0
- package/src/kit/reported-play-state.ts +90 -0
- package/src/kit/resolve-contributed-command.ts +14 -0
- package/src/kit/resolve-relative-specifier.ts +33 -0
- package/src/kit/retained-document-states.ts +91 -0
- package/src/kit/scene-document-plan.ts +320 -0
- package/src/kit/scene-live-open.ts +210 -0
- package/src/kit/scoped-game-css.ts +152 -0
- package/src/kit/served-url.ts +5 -0
- package/src/kit/session-close.ts +17 -0
- package/src/kit/session-tombstone.ts +127 -0
- package/src/kit/settings/settings-provider.ts +82 -0
- package/src/kit/settings-store.ts +348 -0
- package/src/kit/shell-document-state.ts +27 -0
- package/src/kit/shell-store-door.ts +45 -0
- package/src/kit/shell-store.ts +722 -0
- package/src/kit/source-conflict.ts +122 -0
- package/src/kit/stage-context.ts +377 -0
- package/src/kit/stage-invalidation.ts +25 -0
- package/src/kit/stage-store-registry.ts +69 -0
- package/src/kit/startup-failure.ts +80 -0
- package/src/kit/state-report-deferral.ts +73 -0
- package/src/kit/storage/host-files-storage.ts +97 -0
- package/src/kit/storage/http-storage.ts +174 -0
- package/src/kit/storage/index.ts +75 -0
- package/src/kit/storage/mem-storage.ts +158 -0
- package/src/kit/storage/path-lock.ts +44 -0
- package/src/kit/storage/paths.ts +26 -0
- package/src/kit/storage-types.ts +127 -0
- package/src/kit/stories/StoryPreviewMount.tsx +306 -0
- package/src/kit/stories/compose-project-stories.ts +255 -0
- package/src/kit/stories/prefabs-finder.ts +54 -0
- package/src/kit/stories/prefabs-from-stories.ts +182 -0
- package/src/kit/stories/project-story-regions.ts +24 -0
- package/src/kit/stories/story-capture.ts +579 -0
- package/src/kit/stories/story-declared-medium.ts +126 -0
- package/src/kit/stories/story-discovery.ts +176 -0
- package/src/kit/stories/story-dom-runtime.ts +78 -0
- package/src/kit/stories/story-grouping.ts +111 -0
- package/src/kit/stories/story-mount-turn.ts +27 -0
- package/src/kit/stories/story-presentation.ts +215 -0
- package/src/kit/stories/story-preview-component.ts +7 -0
- package/src/kit/stories/story-registry.ts +530 -0
- package/src/kit/stories-scope.ts +35 -0
- package/src/kit/story-document-openers.ts +36 -0
- package/src/kit/story-thumbnails.ts +47 -0
- package/src/kit/surface-keyboard.ts +101 -0
- package/src/kit/surface-state.ts +135 -0
- package/src/kit/system-seam-evidence.ts +72 -0
- package/src/kit/tab-census.ts +202 -0
- package/src/kit/tab-lifecycle-client.ts +227 -0
- package/src/kit/theme-library.ts +897 -0
- package/src/kit/theme-preference.ts +429 -0
- package/src/kit/three-viewport-presentation.ts +23 -0
- package/src/kit/tool-contribution-play.ts +74 -0
- package/src/kit/tool-loader.ts +1918 -0
- package/src/kit/transform-mode-request.ts +66 -0
- package/src/kit/transient-hint.ts +78 -0
- package/src/kit/transport-strip.tsx +174 -0
- package/src/kit/ui-source/adapter-region-includes.ts +238 -0
- package/src/kit/ui-source/file-region-resolver.ts +302 -0
- package/src/kit/ui-source/inspect.ts +775 -0
- package/src/kit/ui-source/source-write-backend.ts +605 -0
- package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
- package/src/kit/user-local-state.ts +105 -0
- package/src/kit/viewport-activation-timings.ts +840 -0
- package/src/kit/viewport-editor-controls.ts +22 -0
- package/src/kit/viewport-presentation.ts +668 -0
- package/src/kit/viewport-surface-status.tsx +55 -0
- package/src/kit/wait-until.ts +37 -0
- package/src/kit/worker-call-metrics.ts +166 -0
- package/src/kit/workspace-areas.ts +191 -0
- package/src/kit/workspace-aux-commands.ts +11 -0
- package/src/kit/workspace-available-documents.ts +142 -0
- package/src/kit/workspace-core-utilities.ts +31 -0
- package/src/kit/workspace-document-ids.ts +59 -0
- package/src/kit/workspace-document-registry.ts +624 -0
- package/src/kit/workspace-document-restore.ts +146 -0
- package/src/kit/workspace-host-commands.ts +141 -0
- package/src/kit/workspace-persistence-gate.ts +40 -0
- package/src/kit/workspace-play-utilities.ts +44 -0
- package/src/kit/workspace-presets.ts +446 -0
- package/src/kit/workspace-regions.ts +276 -0
- package/src/kit/workspace-static-panels.ts +73 -0
- package/src/kit/workspace-status-registry.ts +121 -0
- package/src/kit/workspace-storage.ts +35 -0
- package/src/kit/workspace-style.ts +226 -0
- package/src/kit/workspace-utility-commands.ts +74 -0
- package/src/kit/workspace-utility-registry.ts +263 -0
- package/src/kit/world-adoption-event.ts +23 -0
- package/src/kit/world-adoption.ts +115 -0
- package/src/kit/world-canvas-viewport-state.ts +35 -0
- package/src/kit/world-document-routing.ts +104 -0
- package/src/kit/world-pan-state.ts +198 -0
- package/src/kit/write-pipe.ts +173 -0
- package/src/layout-arrangements.ts +5 -0
- package/src/layouts.tsx +108 -0
- package/src/looks.ts +16 -0
- package/src/project/output-roots.ts +73 -0
- package/src/project/tab-census.ts +155 -0
- package/src/project-tool-catalog.ts +104 -0
- package/src/selection.tsx +107 -0
- package/src/services.ts +18 -0
- package/src/session/build-report.ts +22 -0
- package/src/session/collaboration-types.ts +262 -0
- package/src/session/command-table.ts +327 -0
- package/src/session/discovery.ts +100 -0
- package/src/session/editor-brand.ts +48 -0
- package/src/session/editor-compatibility.ts +317 -0
- package/src/session/editor-control-lifecycle.ts +68 -0
- package/src/session/editor-control-protocol.ts +5 -0
- package/src/session/entrypoint-selection-readers.ts +66 -0
- package/src/session/entrypoint-selection-source.ts +120 -0
- package/src/session/game-css-scope.ts +30 -0
- package/src/session/hosted-attachment.ts +225 -0
- package/src/session/limited-view.ts +82 -0
- package/src/session/product-create.ts +24 -0
- package/src/session/product-locator.ts +478 -0
- package/src/session/project-module-url.ts +242 -0
- package/src/session/project-serving.ts +164 -0
- package/src/session/project-upgrade.ts +403 -0
- package/src/session/registry-format.ts +210 -0
- package/src/session/relative-path-guard.ts +56 -0
- package/src/session/scoped-game-css.ts +461 -0
- package/src/session/source-glob.ts +15 -0
- package/src/session/tool-contribution-convention.ts +123 -0
- package/src/session/workbench-locator.ts +712 -0
- package/src/session.ts +41 -0
- package/src/share.ts +160 -0
- package/src/source-analysis.ts +28 -0
- package/src/source-authoring.ts +439 -0
- package/src/tools/errors.ts +91 -0
- package/src/tools/provider-execution.ts +70 -0
- package/src/tools/registry.ts +341 -0
- package/src/tools/types.ts +159 -0
- package/src/transport.ts +100 -0
- package/src/types.ts +1693 -0
- package/src/views.ts +164 -0
- package/src/widgets/design-system.ts +93 -0
- package/src/widgets/editor-appearance.ts +151 -0
- package/src/widgets/editor-material.ts +83 -0
- package/src/widgets/icon-set-registry.ts +105 -0
- package/src/widgets/index.ts +71 -0
- package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
- package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
- package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
- package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
- package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
- package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
- package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
- package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
- package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
- package/src/widgets/inspector-widgets/color-utils.ts +201 -0
- package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
- package/src/widgets/inspector-widgets/index.ts +25 -0
- package/src/widgets/inspector-widgets/shared.tsx +140 -0
- package/src/widgets/interactive-edit-scope.ts +33 -0
- package/src/widgets/patterns/Dialog.tsx +140 -0
- package/src/widgets/patterns/Fields.tsx +44 -0
- package/src/widgets/patterns/List.tsx +25 -0
- package/src/widgets/patterns/StateSurface.tsx +40 -0
- package/src/widgets/patterns/Surfaces.tsx +122 -0
- package/src/widgets/patterns/Tabs.tsx +80 -0
- package/src/widgets/patterns/Toolbar.tsx +72 -0
- package/src/widgets/patterns/Tree.tsx +72 -0
- package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
- package/src/widgets/primitives/Button.tsx +62 -0
- package/src/widgets/primitives/ColorInput.tsx +78 -0
- package/src/widgets/primitives/DraftTextInput.tsx +63 -0
- package/src/widgets/primitives/EditorIcon.tsx +157 -0
- package/src/widgets/primitives/FormControls.tsx +88 -0
- package/src/widgets/primitives/HoverPreview.tsx +96 -0
- package/src/widgets/primitives/JsonInput.tsx +113 -0
- package/src/widgets/primitives/Layout.tsx +100 -0
- package/src/widgets/primitives/Menu.tsx +161 -0
- package/src/widgets/primitives/NumberInput.tsx +169 -0
- package/src/widgets/primitives/Panel.tsx +80 -0
- package/src/widgets/primitives/SectionHeader.tsx +77 -0
- package/src/widgets/primitives/Text.tsx +54 -0
- package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
- package/src/widgets/primitives/Tooltip.tsx +204 -0
- package/src/widgets/primitives/Vec3Input.tsx +70 -0
- package/src/widgets/primitives/banner-tones.ts +32 -0
- package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
- package/src/widgets/primitives/editor-icons.ts +254 -0
- package/src/widgets/primitives/panel-header-styles.ts +42 -0
- package/src/widgets/theme.ts +2841 -0
- package/src/widgets/z-index.ts +25 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE STAGE TRANSPORT — one position on a stage's facts, and the one holder
|
|
3
|
+
* of the content-time door (WORK.md §The stage transport and the animation
|
|
4
|
+
* door; owner ruling 2026-09-20).
|
|
5
|
+
*
|
|
6
|
+
* OWNERSHIP, STATED ONCE. The OWNER is the stage: `StageHost` constructs one
|
|
7
|
+
* transport beside the stage store it already owns, registers it under the
|
|
8
|
+
* document id, and disposes it when that document unmounts. The SHARERS are
|
|
9
|
+
* subjects (a world attaches what it can show at a time) and looks (the
|
|
10
|
+
* transport strip, Blender's Timeline) — both hold a handle and neither may
|
|
11
|
+
* end it. The ONE TEARDOWN PATH is the owning document's unmount; a subject
|
|
12
|
+
* detaching or a look unmounting never disposes the transport, because a
|
|
13
|
+
* stage outlives every look drawn over it. This is the rule the game-scoped
|
|
14
|
+
* clock destroyed by per-root teardown was missing.
|
|
15
|
+
*
|
|
16
|
+
* THE CONTENT-TIME POLICY IT INHERITS, quoted from `StageHost.tsx` where it
|
|
17
|
+
* was already written: on every stage PRESENTATION time (orbit, dressing,
|
|
18
|
+
* helpers) always advances, and CONTENT time advances ONLY through the one
|
|
19
|
+
* `advanceContent` door, and only while a human holds an explicit transport.
|
|
20
|
+
* This class IS that human's hand: `tick` returns the seconds it advanced and
|
|
21
|
+
* the host passes exactly that to `advanceContent`, so a stage with no
|
|
22
|
+
* transport demand still publishes a content clock that stood still
|
|
23
|
+
* (`coverage/design-time-surfaces.ts`).
|
|
24
|
+
*
|
|
25
|
+
* IT IS NOT THE SIM CLOCK. `core/sim-clock.ts` is the game's own time and
|
|
26
|
+
* this transport is INERT whenever it runs — `driver` reads the stage store's
|
|
27
|
+
* `playState`, and every write verb refuses by name while a world is driving.
|
|
28
|
+
*
|
|
29
|
+
* NO SECOND CLOCK, AND NO PRIVATE ONE. The time arithmetic is the engine's
|
|
30
|
+
* `AnimationClock` (ranges, loop laps, exact frame seeking); this class adds
|
|
31
|
+
* the subject registry, the driver gate and the settle debounce, and nothing
|
|
32
|
+
* else. `scripts/validate-import-bans.mjs`'s `private-clocks` row is the
|
|
33
|
+
* tripwire against a `requestAnimationFrame`/`performance.now` growing back
|
|
34
|
+
* in here or in a look.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import type {
|
|
38
|
+
StageTransportSnapshot,
|
|
39
|
+
TransportPlaybackState,
|
|
40
|
+
TransportSubject,
|
|
41
|
+
} from '@volter/sdk/host';
|
|
42
|
+
import { AnimationClock } from './animation-clock';
|
|
43
|
+
import type { ShellStore } from '@volter/sdk/kit/shell-store';
|
|
44
|
+
|
|
45
|
+
/** The range a transport reports with nothing attached — a real, inert
|
|
46
|
+
* domain, so a look never has to special-case `null` arithmetic. */
|
|
47
|
+
const EMPTY_RANGE = { start: 0, end: 0, fps: 30, loop: false } as const;
|
|
48
|
+
|
|
49
|
+
/** Scrub-end: the first quiet interval after a `seek` while not playing.
|
|
50
|
+
* Long enough that a slider drag's frames coalesce into ONE settle, short
|
|
51
|
+
* enough that releasing the mouse writes the bookmark without a visible wait. */
|
|
52
|
+
const SETTLE_QUIET_MS = 150;
|
|
53
|
+
|
|
54
|
+
export class StageTransport {
|
|
55
|
+
private readonly clock = new AnimationClock();
|
|
56
|
+
private readonly subjects: TransportSubject[] = [];
|
|
57
|
+
private activeId: string | null = null;
|
|
58
|
+
private readonly listeners = new Set<() => void>();
|
|
59
|
+
private readonly settleListeners = new Set<(seconds: number) => void>();
|
|
60
|
+
private settleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
61
|
+
private disposed = false;
|
|
62
|
+
/**
|
|
63
|
+
* The last snapshot handed out, held until something changes.
|
|
64
|
+
* `useSyncExternalStore` compares snapshots by IDENTITY and re-renders
|
|
65
|
+
* forever if `getSnapshot` mints a fresh object each call, so the cache is
|
|
66
|
+
* not an optimization — it is what makes this class usable from React at
|
|
67
|
+
* all. `notify()` is the one invalidator, which is also the one place a
|
|
68
|
+
* change is announced, so the two cannot drift apart.
|
|
69
|
+
*/
|
|
70
|
+
private cachedSnapshot: StageTransportSnapshot | null = null;
|
|
71
|
+
|
|
72
|
+
private readonly stopStoreWatch: () => void;
|
|
73
|
+
|
|
74
|
+
constructor(private readonly store: ShellStore) {
|
|
75
|
+
// `driver` reads the store, and the store changes WITHOUT any call on this
|
|
76
|
+
// class (entering Play is a store event). A snapshot cached across that
|
|
77
|
+
// would report `driver: 'editor'` while the world is already driving, so
|
|
78
|
+
// the strip would draw live controls over a running game. Invalidate here.
|
|
79
|
+
this.stopStoreWatch = store.subscribe(() => this.notify());
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------- subjects
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Attach a subject. The FIRST attach becomes active — a stage that just
|
|
86
|
+
* mounted one thing is immediately scrubbable with no further call. Returns
|
|
87
|
+
* the detach; detaching the active subject promotes whatever remains.
|
|
88
|
+
*/
|
|
89
|
+
attach(subject: TransportSubject): () => void {
|
|
90
|
+
this.subjects.push(subject);
|
|
91
|
+
if (this.activeId === null) this.setActiveSubject(subject.id);
|
|
92
|
+
else {
|
|
93
|
+
// A later subject shows the transport's time from its first frame too;
|
|
94
|
+
// unsampled, a skinned character stands in its bind pose until the
|
|
95
|
+
// playhead next moves.
|
|
96
|
+
subject.seek(this.clock.time);
|
|
97
|
+
this.notify();
|
|
98
|
+
}
|
|
99
|
+
return () => {
|
|
100
|
+
const at = this.subjects.indexOf(subject);
|
|
101
|
+
if (at < 0) return;
|
|
102
|
+
this.subjects.splice(at, 1);
|
|
103
|
+
if (this.activeId !== subject.id) {
|
|
104
|
+
this.notify();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this.activeId = null;
|
|
108
|
+
const next = this.subjects[0];
|
|
109
|
+
if (next) this.setActiveSubject(next.id);
|
|
110
|
+
else {
|
|
111
|
+
this.clock.setRange({ start: EMPTY_RANGE.start, end: EMPTY_RANGE.end, loop: false });
|
|
112
|
+
this.notify();
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Make `id` active: take ITS range, and clamp the current time into it —
|
|
118
|
+
* switching subjects moves the playhead as little as the new domain allows. */
|
|
119
|
+
setActiveSubject(id: string): void {
|
|
120
|
+
const subject = this.subjects.find((s) => s.id === id);
|
|
121
|
+
if (!subject) return;
|
|
122
|
+
this.activeId = id;
|
|
123
|
+
const range = subject.range();
|
|
124
|
+
this.clock.setRange({ start: range.start, end: range.end });
|
|
125
|
+
// `setRange` only emits when it had to clamp, so re-assert the position
|
|
126
|
+
// unconditionally: every subject must be showing the transport's time,
|
|
127
|
+
// including the one that just became active inside an unchanged range.
|
|
128
|
+
this.applyTime(this.clock.time);
|
|
129
|
+
this.notify();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private get active(): TransportSubject | null {
|
|
133
|
+
return this.subjects.find((s) => s.id === this.activeId) ?? null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private fps(): number {
|
|
137
|
+
return this.active?.range().fps ?? EMPTY_RANGE.fps;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ------------------------------------------------------------------ driver
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Who is advancing time. Reads the stage store this transport was built
|
|
144
|
+
* with and nothing else: for a Model document that store is always
|
|
145
|
+
* `'stopped'`, and for the Scene/Game document Play sets it.
|
|
146
|
+
*/
|
|
147
|
+
private get driver(): 'editor' | 'world' {
|
|
148
|
+
return this.store.playState === 'stopped' ? 'editor' : 'world';
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Refuse BY NAME, so a caller reads what to do rather than that it failed. */
|
|
152
|
+
private assertEditorDrives(): void {
|
|
153
|
+
if (this.driver === 'world') {
|
|
154
|
+
throw new Error('transport: the world is driving time (Play); pause the game to scrub');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// --------------------------------------------------------------- transport
|
|
159
|
+
|
|
160
|
+
play(direction: 'forward' | 'reverse' = 'forward'): void {
|
|
161
|
+
this.assertEditorDrives();
|
|
162
|
+
if (!this.active) return;
|
|
163
|
+
this.cancelSettle();
|
|
164
|
+
this.clock.play(direction);
|
|
165
|
+
this.notify();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
pause(): void {
|
|
169
|
+
this.assertEditorDrives();
|
|
170
|
+
this.clock.pause();
|
|
171
|
+
this.cancelSettle();
|
|
172
|
+
this.settle();
|
|
173
|
+
this.notify();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** `stop()` = `pause()` then home to the range's start. */
|
|
177
|
+
stop(): void {
|
|
178
|
+
this.assertEditorDrives();
|
|
179
|
+
this.clock.pause();
|
|
180
|
+
this.cancelSettle();
|
|
181
|
+
this.applyTime(this.clock.seek(this.clock.range.start).currentTime);
|
|
182
|
+
this.clock.stop();
|
|
183
|
+
this.settle();
|
|
184
|
+
this.notify();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
seek(seconds: number): void {
|
|
188
|
+
this.assertEditorDrives();
|
|
189
|
+
this.applyTime(this.clock.seek(seconds).currentTime);
|
|
190
|
+
// A seek WHILE PLAYING never settles — only a scrub does, and a scrub is
|
|
191
|
+
// by definition not playback.
|
|
192
|
+
if (this.clock.playbackState !== 'playing') this.scheduleSettle();
|
|
193
|
+
this.notify();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Frames are the LOOK's unit, never the seam's: one conversion, here. */
|
|
197
|
+
seekFrame(frame: number): void {
|
|
198
|
+
this.seek(frame / this.fps());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
setLoop(loop: boolean): void {
|
|
202
|
+
this.clock.setRange({ loop });
|
|
203
|
+
this.notify();
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
setTimeScale(scale: number): void {
|
|
207
|
+
this.clock.timeScale = scale;
|
|
208
|
+
this.notify();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Called by the stage host's frame callback with that frame's dt. Inert
|
|
213
|
+
* unless PLAYING and the editor drives. Returns the seconds advanced — the
|
|
214
|
+
* host adds exactly this to `host.contentSeconds` through `advanceContent`,
|
|
215
|
+
* which is what keeps the Edit-static vitals row honest.
|
|
216
|
+
*/
|
|
217
|
+
tick(dt: number): number {
|
|
218
|
+
if (this.disposed || this.driver === 'world') return 0;
|
|
219
|
+
if (this.clock.playbackState !== 'playing') return 0;
|
|
220
|
+
const before = this.clock.time;
|
|
221
|
+
const crossing = this.clock.advance(dt);
|
|
222
|
+
if (!crossing) return 0;
|
|
223
|
+
this.applyTime(crossing.currentTime);
|
|
224
|
+
this.notify();
|
|
225
|
+
// Across a loop wrap `currentTime - before` is negative (and meaningless
|
|
226
|
+
// as an elapsed duration), so report the magnitude the clock was asked
|
|
227
|
+
// to move: that is what actually elapsed on this stage's content clock.
|
|
228
|
+
return crossing.looped ? Math.abs(dt) * this.clock.timeScale : crossing.currentTime - before;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Hand the crossing's time to EVERY attached subject, the active one first.
|
|
233
|
+
* Every subject, not just the active one: a stage showing two things at one
|
|
234
|
+
* position must not leave the inactive one frozen at whenever it was last
|
|
235
|
+
* looked at. The active one leads so the thing a person is watching is the
|
|
236
|
+
* first to update within a frame.
|
|
237
|
+
*/
|
|
238
|
+
private applyTime(seconds: number): void {
|
|
239
|
+
const active = this.active;
|
|
240
|
+
if (active) active.seek(seconds);
|
|
241
|
+
for (const subject of this.subjects) {
|
|
242
|
+
if (subject !== active) subject.seek(seconds);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ----------------------------------------------------------------- settled
|
|
247
|
+
|
|
248
|
+
onSettled(listener: (seconds: number) => void): () => void {
|
|
249
|
+
this.settleListeners.add(listener);
|
|
250
|
+
return () => {
|
|
251
|
+
this.settleListeners.delete(listener);
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
private scheduleSettle(): void {
|
|
256
|
+
this.cancelSettle();
|
|
257
|
+
this.settleTimer = setTimeout(() => {
|
|
258
|
+
this.settleTimer = null;
|
|
259
|
+
this.settle();
|
|
260
|
+
}, SETTLE_QUIET_MS);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
private cancelSettle(): void {
|
|
264
|
+
if (this.settleTimer === null) return;
|
|
265
|
+
clearTimeout(this.settleTimer);
|
|
266
|
+
this.settleTimer = null;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private settle(): void {
|
|
270
|
+
if (this.disposed) return;
|
|
271
|
+
const at = this.clock.time;
|
|
272
|
+
for (const listener of [...this.settleListeners]) listener(at);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// ---------------------------------------------------------------- readback
|
|
276
|
+
|
|
277
|
+
snapshot(): StageTransportSnapshot {
|
|
278
|
+
const cached = this.cachedSnapshot;
|
|
279
|
+
if (cached) return cached;
|
|
280
|
+
const range = this.active?.range() ?? EMPTY_RANGE;
|
|
281
|
+
const next: StageTransportSnapshot = {
|
|
282
|
+
time: this.clock.time,
|
|
283
|
+
range: {
|
|
284
|
+
start: this.clock.range.start,
|
|
285
|
+
end: this.clock.range.end,
|
|
286
|
+
fps: range.fps,
|
|
287
|
+
loop: this.clock.range.loop,
|
|
288
|
+
},
|
|
289
|
+
playbackState: this.clock.playbackState as TransportPlaybackState,
|
|
290
|
+
timeScale: this.clock.timeScale,
|
|
291
|
+
activeSubject: this.activeId,
|
|
292
|
+
subjects: this.subjects.map((s) => ({ id: s.id, label: s.label })),
|
|
293
|
+
driver: this.driver,
|
|
294
|
+
};
|
|
295
|
+
this.cachedSnapshot = next;
|
|
296
|
+
return next;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* The ACTIVE subject's clips, or `null` when it has none.
|
|
301
|
+
*
|
|
302
|
+
* Deliberately not on the snapshot: `StageTransportSnapshot` is the shape a
|
|
303
|
+
* CONTRIBUTION sees through the SDK, and a clip list is a three-world
|
|
304
|
+
* detail (Blender omits `clips` entirely — an action IS the subject there).
|
|
305
|
+
* The editor's own strip reaches it through the class it already imports.
|
|
306
|
+
*/
|
|
307
|
+
activeClips(): readonly { id: string; label: string }[] | null {
|
|
308
|
+
const active = this.active;
|
|
309
|
+
const clips = active?.clips?.();
|
|
310
|
+
return clips && clips.length > 1 ? clips : null;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
setActiveClip(id: string): void {
|
|
314
|
+
this.assertEditorDrives();
|
|
315
|
+
this.active?.setClip?.(id);
|
|
316
|
+
// The new clip's duration is a new range, and the playhead clamps into it.
|
|
317
|
+
const range = this.active?.range();
|
|
318
|
+
if (range) this.clock.setRange({ start: range.start, end: range.end });
|
|
319
|
+
this.applyTime(this.clock.time);
|
|
320
|
+
this.notify();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
subscribe(listener: () => void): () => void {
|
|
324
|
+
this.listeners.add(listener);
|
|
325
|
+
return () => {
|
|
326
|
+
this.listeners.delete(listener);
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
private notify(): void {
|
|
331
|
+
this.cachedSnapshot = null;
|
|
332
|
+
for (const listener of [...this.listeners]) listener();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
dispose(): void {
|
|
336
|
+
this.disposed = true;
|
|
337
|
+
this.stopStoreWatch();
|
|
338
|
+
this.cancelSettle();
|
|
339
|
+
this.clock.stop();
|
|
340
|
+
this.subjects.length = 0;
|
|
341
|
+
this.activeId = null;
|
|
342
|
+
this.listeners.clear();
|
|
343
|
+
this.settleListeners.clear();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* WHICH TRANSPORT A STAGE RUNS ON — deliberately the same shape as
|
|
349
|
+
* `stage-store-registry.ts`, for the same objects and the same reason: a
|
|
350
|
+
* panel or contribution holding only a document id must be able to reach the
|
|
351
|
+
* stage's transport without the stage handing it down through props.
|
|
352
|
+
*/
|
|
353
|
+
const transports = new Map<string, StageTransport>();
|
|
354
|
+
const registryListeners = new Set<() => void>();
|
|
355
|
+
|
|
356
|
+
function notifyRegistry(): void {
|
|
357
|
+
for (const listener of [...registryListeners]) listener();
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/** A mounted stage declares its transport. Re-registering the same document
|
|
361
|
+
* replaces it; the returned unregister drops it. */
|
|
362
|
+
export function registerStageTransport(documentId: string, transport: StageTransport): () => void {
|
|
363
|
+
transports.set(documentId, transport);
|
|
364
|
+
notifyRegistry();
|
|
365
|
+
return () => {
|
|
366
|
+
if (transports.get(documentId) !== transport) return;
|
|
367
|
+
transports.delete(documentId);
|
|
368
|
+
notifyRegistry();
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/** That document's transport, or `null` for a document with no stage of its
|
|
373
|
+
* own (a tool tab, a text document). */
|
|
374
|
+
export function stageTransport(documentId: string | null): StageTransport | null {
|
|
375
|
+
return documentId === null ? null : (transports.get(documentId) ?? null);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/** `useSyncExternalStore` shape — a stage mounting or unmounting changes what
|
|
379
|
+
* `stageTransport()` answers. */
|
|
380
|
+
export function subscribeStageTransports(listener: () => void): () => void {
|
|
381
|
+
registryListeners.add(listener);
|
|
382
|
+
return () => {
|
|
383
|
+
registryListeners.delete(listener);
|
|
384
|
+
};
|
|
385
|
+
}
|