@volter/editor-core 0.5.57
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/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
import {
|
|
2
|
+
registerAvailableWorkspaceDocument,
|
|
3
|
+
unregisterAvailableWorkspaceDocument,
|
|
4
|
+
} from '../workspace-available-documents';
|
|
5
|
+
/**
|
|
6
|
+
* Edit-time center documents for a project, beside the native Three.js scene
|
|
7
|
+
* document. Runtime composition belongs to the Game document (which exists
|
|
8
|
+
* only while a runtime does); authoring pins the project-level component
|
|
9
|
+
* boards — one per registered medium, each installed and closed here on its
|
|
10
|
+
* own package's verdict (`component-board-registry.ts`). This module names no
|
|
11
|
+
* board and no medium.
|
|
12
|
+
*
|
|
13
|
+
* THE SCENE VIEWPORT IS FOR THE SCENE (owner, 2026-08-10). Every edit-time
|
|
14
|
+
* subject presents through a document of its own; nothing composites over the
|
|
15
|
+
* viewport while editing.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
19
|
+
import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
|
|
20
|
+
import { getActiveAuthoring } from '../authoring/active-adapter';
|
|
21
|
+
import { authoringAdapterKey } from '../authoring/adapter-key';
|
|
22
|
+
import type { CompositeAuthoringAdapter } from '../authoring/composite-authoring-adapter';
|
|
23
|
+
import {
|
|
24
|
+
type DesignTimeRootDescriptor,
|
|
25
|
+
designTimeRootDescriptors,
|
|
26
|
+
mountDesignTimeLayers,
|
|
27
|
+
} from '../authoring/design-time-layers';
|
|
28
|
+
import { INVALID_MANIFEST_SURFACE } from '../authoring/edit-mode-authoring';
|
|
29
|
+
import {
|
|
30
|
+
getMountFailureReports,
|
|
31
|
+
subscribeToMountFailures,
|
|
32
|
+
} from '../authoring/mount-failure-report';
|
|
33
|
+
import {
|
|
34
|
+
installCanvasSceneNavigation,
|
|
35
|
+
installReactCanvasNavigation,
|
|
36
|
+
} from '../authoring/react-canvas-navigation';
|
|
37
|
+
import {
|
|
38
|
+
REACT_DESIGN_CANVAS_COLOR,
|
|
39
|
+
REACT_DESIGN_CANVAS_DOT,
|
|
40
|
+
} from '../authoring/react-design-canvas-style';
|
|
41
|
+
import { resolveViewportToolContext } from '../authoring/viewport-tool-context';
|
|
42
|
+
import {
|
|
43
|
+
createRootViewController,
|
|
44
|
+
getRootPan,
|
|
45
|
+
sharedRootViewController,
|
|
46
|
+
subscribeRootPan,
|
|
47
|
+
} from '../authoring/world-pan-state';
|
|
48
|
+
import {
|
|
49
|
+
type ComponentBoard,
|
|
50
|
+
componentBoardForDocument,
|
|
51
|
+
componentBoardForMedium,
|
|
52
|
+
componentBoards,
|
|
53
|
+
subscribeComponentBoards,
|
|
54
|
+
} from '../component-board-registry';
|
|
55
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
56
|
+
import { setActiveScope } from '../hotkeys';
|
|
57
|
+
import { readinessFacet, subscribeRootReadiness } from '../readiness';
|
|
58
|
+
import { explainSurface } from '../surface-state';
|
|
59
|
+
import { recordViewportFirstFrame } from '../viewport-activation-timings';
|
|
60
|
+
import {
|
|
61
|
+
CANVAS_SCENE_DOCUMENT_ID,
|
|
62
|
+
GAME_DOCUMENT_ID,
|
|
63
|
+
SCENE_DOCUMENT_ID,
|
|
64
|
+
} from '../workspace-document-ids';
|
|
65
|
+
import {
|
|
66
|
+
activateWorkspaceDocument,
|
|
67
|
+
activeWorkspaceDocumentId,
|
|
68
|
+
closeWorkspaceDocument,
|
|
69
|
+
openWorkspaceDocuments,
|
|
70
|
+
registerWorkspaceDocumentSelection,
|
|
71
|
+
type WorkspaceDocumentContentProps,
|
|
72
|
+
} from '../workspace-document-registry';
|
|
73
|
+
import {
|
|
74
|
+
registerRootDocumentGap,
|
|
75
|
+
registerRootDocumentRoute,
|
|
76
|
+
registerWorkspaceDocumentGap,
|
|
77
|
+
} from '../world-document-routing';
|
|
78
|
+
import { BoardRulers } from './BoardRulers';
|
|
79
|
+
import {
|
|
80
|
+
CANVAS_SCENE_BACKGROUND,
|
|
81
|
+
CanvasSceneBackdrop,
|
|
82
|
+
CanvasSceneControls,
|
|
83
|
+
} from './CanvasSceneViewport';
|
|
84
|
+
import { ReactCanvasControls } from './ReactCanvasControls';
|
|
85
|
+
import { RootSelectionOverlay } from './RootSelectionOverlay';
|
|
86
|
+
import { SurfaceStateOverlay } from './SurfaceStateOverlay';
|
|
87
|
+
|
|
88
|
+
/** The canvas root's world document reads `Scene`, exactly like a three
|
|
89
|
+
* project's — THE SCENE VIEWPORT IS FOR THE SCENE, and a 2D world is a scene
|
|
90
|
+
* (owner, 2026-08-15: "why don't we have a 'scene'? it's a 2d scene of
|
|
91
|
+
* course"). A project has one medium's scene or the other, never both. */
|
|
92
|
+
const CANVAS_SCENE_TITLE = 'Scene';
|
|
93
|
+
|
|
94
|
+
export function RootDocumentContent({
|
|
95
|
+
active,
|
|
96
|
+
composite,
|
|
97
|
+
descriptor,
|
|
98
|
+
documentId,
|
|
99
|
+
store,
|
|
100
|
+
}: WorkspaceDocumentContentProps & {
|
|
101
|
+
composite: CompositeAuthoringAdapter;
|
|
102
|
+
descriptor: DesignTimeRootDescriptor;
|
|
103
|
+
store: EditorShellStore;
|
|
104
|
+
}) {
|
|
105
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
106
|
+
const disposeMountRef = useRef<(() => void) | null>(null);
|
|
107
|
+
const [canvasSceneView] = useState(createRootViewController);
|
|
108
|
+
const isCanvasScene = descriptor.kind === 'canvas';
|
|
109
|
+
const documentView = isCanvasScene ? canvasSceneView : sharedRootViewController;
|
|
110
|
+
useSyncExternalStore(store.subscribe, store.getSnapshot);
|
|
111
|
+
const rootReadiness = useSyncExternalStore(subscribeRootReadiness, readinessFacet);
|
|
112
|
+
const mountFailures = useSyncExternalStore(subscribeToMountFailures, getMountFailureReports);
|
|
113
|
+
// The layer's own adapter, for a board that has no composite child to carry
|
|
114
|
+
// it — either a rootless board, or Dev (whose runtime root is deliberately
|
|
115
|
+
// not an authoring child). A board's presence is its package's verdict, not
|
|
116
|
+
// a fact about roots. The composite child stays the authority whenever
|
|
117
|
+
// there IS one.
|
|
118
|
+
const [mountedAdapter, setMountedAdapter] = useState<AuthoringAdapter | null>(null);
|
|
119
|
+
const documentAdapter =
|
|
120
|
+
composite.childAdapters().find((child) => child.worldId === descriptor.worldId)?.adapter ??
|
|
121
|
+
mountedAdapter ??
|
|
122
|
+
undefined;
|
|
123
|
+
const isBabylonScene = isCanvasScene && documentAdapter?.provenance?.label === 'babylon';
|
|
124
|
+
const nativeRoots = documentAdapter?.hierarchy.roots() ?? [];
|
|
125
|
+
const emptyRootIds = new Set(
|
|
126
|
+
documentAdapter?.rects?.emptyContainers?.().map((entry) => entry.id) ?? [],
|
|
127
|
+
);
|
|
128
|
+
const hasRenderableContent = nativeRoots.some((root) => !emptyRootIds.has(root.id));
|
|
129
|
+
const rootExplanation = explainSurface({
|
|
130
|
+
surface: isCanvasScene ? 'Scene' : descriptor.kind === 'dom' ? 'UI' : 'World',
|
|
131
|
+
rootIds: [descriptor.worldId],
|
|
132
|
+
// While the game PLAYS, this document's design mount is deliberately
|
|
133
|
+
// suspended — the wait is not progress and says so (surface-state.ts).
|
|
134
|
+
playSuspended:
|
|
135
|
+
store.playState !== 'stopped' &&
|
|
136
|
+
(!documentAdapter || documentAdapter.provenance?.source === 'boundary'),
|
|
137
|
+
phase:
|
|
138
|
+
!documentAdapter || documentAdapter.provenance?.source === 'boundary' ? 'loading' : 'ready',
|
|
139
|
+
content:
|
|
140
|
+
!documentAdapter || documentAdapter.provenance?.source === 'boundary'
|
|
141
|
+
? 'unknown'
|
|
142
|
+
: hasRenderableContent
|
|
143
|
+
? 'present'
|
|
144
|
+
: 'empty',
|
|
145
|
+
readiness: rootReadiness,
|
|
146
|
+
failures: mountFailures,
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// A world document owns the shared Hierarchy/Inspector context while it is
|
|
150
|
+
// the visible center subject. Publish only this document's child: the Game
|
|
151
|
+
// document is the composition-wide surface, while an authored root document
|
|
152
|
+
// must not leak sibling roots into its panels. The node id is read live from
|
|
153
|
+
// the same selection provider the canvas updates.
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
if (!documentAdapter) return;
|
|
156
|
+
return registerWorkspaceDocumentSelection(documentId, () => ({
|
|
157
|
+
adapter: documentAdapter,
|
|
158
|
+
nodeId: [...store.selectedEntityIds].find((id) => documentAdapter.hierarchy.node(id)) ?? null,
|
|
159
|
+
}));
|
|
160
|
+
}, [composite, documentAdapter, documentId, store]);
|
|
161
|
+
|
|
162
|
+
useEffect(() => {
|
|
163
|
+
const container = containerRef.current;
|
|
164
|
+
if (!container) return;
|
|
165
|
+
if (isBabylonScene) return;
|
|
166
|
+
return isCanvasScene
|
|
167
|
+
? installCanvasSceneNavigation(container, documentView)
|
|
168
|
+
: installReactCanvasNavigation(container, documentView);
|
|
169
|
+
}, [documentView, isBabylonScene, isCanvasScene]);
|
|
170
|
+
|
|
171
|
+
// An open document stays mounted. Defer the relatively expensive Pixi/React
|
|
172
|
+
// mount until the world is first visited, then retain it across tab changes
|
|
173
|
+
// so hierarchy identity, story selection, and source editing remain stable.
|
|
174
|
+
useEffect(() => {
|
|
175
|
+
if (!active) return;
|
|
176
|
+
const alreadyMounted = Boolean(disposeMountRef.current);
|
|
177
|
+
if (!alreadyMounted && containerRef.current) {
|
|
178
|
+
disposeMountRef.current = mountDesignTimeLayers(
|
|
179
|
+
containerRef.current,
|
|
180
|
+
composite,
|
|
181
|
+
store,
|
|
182
|
+
[descriptor],
|
|
183
|
+
(_worldId, adapter) => setMountedAdapter(adapter),
|
|
184
|
+
isCanvasScene ? { canvasSceneView } : undefined,
|
|
185
|
+
documentId,
|
|
186
|
+
);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Switch-back of a retained board: the next two frames are the first
|
|
190
|
+
// painted frames after the tab is in front. No remount, no WebGL.
|
|
191
|
+
let frames = 0;
|
|
192
|
+
let raf = 0;
|
|
193
|
+
const paint = (): void => {
|
|
194
|
+
frames += 1;
|
|
195
|
+
if (frames < 2) {
|
|
196
|
+
raf = requestAnimationFrame(paint);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
recordViewportFirstFrame(documentId);
|
|
200
|
+
};
|
|
201
|
+
raf = requestAnimationFrame(paint);
|
|
202
|
+
return () => cancelAnimationFrame(raf);
|
|
203
|
+
}, [active, canvasSceneView, composite, descriptor, documentId, isCanvasScene, store]);
|
|
204
|
+
|
|
205
|
+
// A MOUNTED LAYER'S STALENESS IS ITS MEDIUM'S STATEMENT, NOT THIS
|
|
206
|
+
// COMPONENT'S. This effect used to remount the whole stack whenever the
|
|
207
|
+
// project's story MEMBERSHIP changed (a story saved from the editor's own
|
|
208
|
+
// header, a hand-edited `.stories.tsx`), so a new frame appeared without an
|
|
209
|
+
// F5 — blind-walk beat 9. It was a rule about one medium spelled in a
|
|
210
|
+
// component that mounts two: a canvas world's `<Application>` was torn down
|
|
211
|
+
// and rebuilt every time an unrelated dom story was saved. It lives with
|
|
212
|
+
// the dom mount now, as `DesignTimeMount.reprojectWhen`
|
|
213
|
+
// (`@vgai/dom`'s `reprojectWhenStoriesRepublish`), which the stack binds per
|
|
214
|
+
// medium and applies only to that medium's candidates
|
|
215
|
+
// (`design-time-layers.ts:717-742`) — and which re-projects rather than
|
|
216
|
+
// remounting, so the board no longer blinks through empty on the way.
|
|
217
|
+
|
|
218
|
+
useEffect(
|
|
219
|
+
() => () => {
|
|
220
|
+
disposeMountRef.current?.();
|
|
221
|
+
disposeMountRef.current = null;
|
|
222
|
+
},
|
|
223
|
+
[],
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
const selectedContext = resolveViewportToolContext(
|
|
227
|
+
getActiveAuthoring(store),
|
|
228
|
+
store.selectedEntityIds,
|
|
229
|
+
);
|
|
230
|
+
const context =
|
|
231
|
+
selectedContext?.worldId === descriptor.worldId
|
|
232
|
+
? selectedContext
|
|
233
|
+
: documentAdapter?.rects
|
|
234
|
+
? { worldId: descriptor.worldId, kind: 'dom' as const, adapter: documentAdapter }
|
|
235
|
+
: null;
|
|
236
|
+
return (
|
|
237
|
+
<div
|
|
238
|
+
ref={containerRef}
|
|
239
|
+
data-testid={`world-document:${descriptor.worldId}`}
|
|
240
|
+
data-vgai-backdrop-color={
|
|
241
|
+
active
|
|
242
|
+
? isBabylonScene
|
|
243
|
+
? '#111827'
|
|
244
|
+
: isCanvasScene
|
|
245
|
+
? CANVAS_SCENE_BACKGROUND
|
|
246
|
+
: REACT_DESIGN_CANVAS_COLOR
|
|
247
|
+
: undefined
|
|
248
|
+
}
|
|
249
|
+
data-vgai-backdrop-policy={active ? 'dark-frost' : undefined}
|
|
250
|
+
onPointerDown={() => setActiveScope('viewport')}
|
|
251
|
+
style={{
|
|
252
|
+
// DOM component documents are Storybook/Figma-style boards. A Canvas
|
|
253
|
+
// root is instead a native 2D Scene with its own editor camera; both
|
|
254
|
+
// remain independent center documents rather than runtime layers.
|
|
255
|
+
position: 'absolute',
|
|
256
|
+
inset: 0,
|
|
257
|
+
overflow: 'hidden',
|
|
258
|
+
pointerEvents: 'auto',
|
|
259
|
+
backgroundColor: isBabylonScene
|
|
260
|
+
? '#111827'
|
|
261
|
+
: isCanvasScene
|
|
262
|
+
? CANVAS_SCENE_BACKGROUND
|
|
263
|
+
: REACT_DESIGN_CANVAS_COLOR,
|
|
264
|
+
touchAction: 'none',
|
|
265
|
+
}}
|
|
266
|
+
>
|
|
267
|
+
{isBabylonScene ? null : isCanvasScene ? (
|
|
268
|
+
<CanvasSceneBackdrop view={canvasSceneView} />
|
|
269
|
+
) : (
|
|
270
|
+
<ReactDesignCanvasBackdrop />
|
|
271
|
+
)}
|
|
272
|
+
<RootSelectionOverlay
|
|
273
|
+
key={`selection:${authoringAdapterKey(documentAdapter)}`}
|
|
274
|
+
{...(documentAdapter ? { adapter: documentAdapter } : {})}
|
|
275
|
+
{...(isCanvasScene && !isBabylonScene
|
|
276
|
+
? { view: canvasSceneView, transformModeAware: true }
|
|
277
|
+
: {})}
|
|
278
|
+
/>
|
|
279
|
+
<SurfaceStateOverlay
|
|
280
|
+
explanation={rootExplanation}
|
|
281
|
+
testId={`world-surface-status:${descriptor.worldId}`}
|
|
282
|
+
style={{ zIndex: 20 }}
|
|
283
|
+
/>
|
|
284
|
+
{isBabylonScene ? null : isCanvasScene ? (
|
|
285
|
+
<CanvasSceneControls
|
|
286
|
+
key={`controls:${authoringAdapterKey(documentAdapter)}`}
|
|
287
|
+
active={active}
|
|
288
|
+
{...(documentAdapter ? { adapter: documentAdapter } : {})}
|
|
289
|
+
containerRef={containerRef}
|
|
290
|
+
view={canvasSceneView}
|
|
291
|
+
/>
|
|
292
|
+
) : (
|
|
293
|
+
<>
|
|
294
|
+
<BoardRulers docId={descriptor.worldId} containerRef={containerRef} />
|
|
295
|
+
<ReactCanvasControls containerRef={containerRef} context={context} />
|
|
296
|
+
</>
|
|
297
|
+
)}
|
|
298
|
+
</div>
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** Infinite editor canvas behind React story frames. The dot origin follows
|
|
303
|
+
* the same world transform, making pan/zoom legible without implying that the
|
|
304
|
+
* runtime React layer owns any background at all. */
|
|
305
|
+
function ReactDesignCanvasBackdrop() {
|
|
306
|
+
const view = useSyncExternalStore(subscribeRootPan, getRootPan);
|
|
307
|
+
const spacing = Math.max(8, 24 * view.zoom);
|
|
308
|
+
const dotRadius = Math.max(0.7, Math.min(1.4, view.zoom));
|
|
309
|
+
return (
|
|
310
|
+
<div
|
|
311
|
+
data-testid="react-design-canvas-backdrop"
|
|
312
|
+
aria-hidden="true"
|
|
313
|
+
style={{
|
|
314
|
+
position: 'absolute',
|
|
315
|
+
inset: 0,
|
|
316
|
+
pointerEvents: 'none',
|
|
317
|
+
backgroundColor: REACT_DESIGN_CANVAS_COLOR,
|
|
318
|
+
backgroundImage: `radial-gradient(circle, ${REACT_DESIGN_CANVAS_DOT} ${dotRadius}px, transparent ${dotRadius}px)`,
|
|
319
|
+
backgroundPosition: `${view.x}px ${view.y}px`,
|
|
320
|
+
backgroundSize: `${spacing}px ${spacing}px`,
|
|
321
|
+
}}
|
|
322
|
+
/>
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/** Install the project's pinned center documents and map the three root to the
|
|
327
|
+
* native scene document. Returns the project/rebuild disposer; it closes only
|
|
328
|
+
* the documents installed by this call.
|
|
329
|
+
*
|
|
330
|
+
* ## A BOARD'S EXISTENCE IS ITS OWN PACKAGE'S VERDICT
|
|
331
|
+
*
|
|
332
|
+
* No board is decided here. A package registers one
|
|
333
|
+
* (`component-board-registry.ts`) and answers `presence()` for it; this
|
|
334
|
+
* installs and closes the registered set as those verdicts move, and asks the
|
|
335
|
+
* board itself why it is absent. Three statements used to be made here that
|
|
336
|
+
* are not the host's to make — that a project's boards are `dom`/`three`/
|
|
337
|
+
* `canvas`, that a board exists because the project has stories of that
|
|
338
|
+
* medium, and that "no board yet" is told from "no board ever" by a story
|
|
339
|
+
* DISCOVERY flag. The first is the registered set; the second is
|
|
340
|
+
* `presence()`; the third is `presence()` returning `null`.
|
|
341
|
+
*
|
|
342
|
+
* Everything else here is still root-derived where it is genuinely about a
|
|
343
|
+
* root: the `Scene` document and the document routes. A root whose own
|
|
344
|
+
* design surface IS a board — no separate document of its own — is routed at
|
|
345
|
+
* that board by matching the root descriptor's `kind` against the registered
|
|
346
|
+
* `medium`; the host compares two values it was handed and spells neither. */
|
|
347
|
+
/**
|
|
348
|
+
* The live session's composite + store, published while root documents are
|
|
349
|
+
* installed — how a document hosted OUTSIDE this module's own closures (the
|
|
350
|
+
* pasteboard asset document, which any `.tsx` in the project can turn out to
|
|
351
|
+
* be) reaches the same {@link RootDocumentContent} machinery the boards use.
|
|
352
|
+
* Null between sessions; a host that finds it null says so instead of
|
|
353
|
+
* mounting nothing.
|
|
354
|
+
*/
|
|
355
|
+
let rootDocumentHost: {
|
|
356
|
+
readonly store: EditorShellStore;
|
|
357
|
+
readonly composite: CompositeAuthoringAdapter;
|
|
358
|
+
} | null = null;
|
|
359
|
+
|
|
360
|
+
export function activeRootDocumentHost(): {
|
|
361
|
+
readonly store: EditorShellStore;
|
|
362
|
+
readonly composite: CompositeAuthoringAdapter;
|
|
363
|
+
} | null {
|
|
364
|
+
return rootDocumentHost;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
export function installRootDocuments(
|
|
368
|
+
store: EditorShellStore,
|
|
369
|
+
composite: CompositeAuthoringAdapter,
|
|
370
|
+
): () => void {
|
|
371
|
+
rootDocumentHost = { store, composite };
|
|
372
|
+
const previouslyActive = activeWorkspaceDocumentId();
|
|
373
|
+
const hasThreeRoot = composite
|
|
374
|
+
.childAdapters()
|
|
375
|
+
.some((child) => child.role === 'world' && child.kind === 'three');
|
|
376
|
+
// An UNPARSEABLE manifest installs one placeholder root and no three world.
|
|
377
|
+
// Closing the Scene document on it unmounted `the world root's stage` — the edit-mode
|
|
378
|
+
// rebuild OWNER — so the editor sat gutted ("No authoring adapter", no
|
|
379
|
+
// tabs, no canvas) and the manifest becoming valid again could remount
|
|
380
|
+
// nothing: measured 60 s after the fix, still gutted, only a second Play or
|
|
381
|
+
// a reload recovered (Opus verification, 2026-09-01). The project still
|
|
382
|
+
// declares a three root; its scene document stays, and the rebuild the
|
|
383
|
+
// recovery queues has an owner to drain into.
|
|
384
|
+
const manifestInvalid = composite
|
|
385
|
+
.childAdapters()
|
|
386
|
+
.some((child) => child.kind === INVALID_MANIFEST_SURFACE);
|
|
387
|
+
if (!hasThreeRoot && !manifestInvalid) {
|
|
388
|
+
closeWorkspaceDocument(SCENE_DOCUMENT_ID, { discardDirty: true });
|
|
389
|
+
}
|
|
390
|
+
const installedIds = new Set<string>();
|
|
391
|
+
const unregisterRoutes: Array<() => void> = [];
|
|
392
|
+
let disposed = false;
|
|
393
|
+
|
|
394
|
+
for (const child of composite.childAdapters()) {
|
|
395
|
+
if (child.role === 'world' && child.kind === 'three') {
|
|
396
|
+
unregisterRoutes.push(registerRootDocumentRoute(child.worldId, SCENE_DOCUMENT_ID));
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const designTimeRoots = designTimeRootDescriptors(composite);
|
|
401
|
+
|
|
402
|
+
// THE CANVAS ROOT'S SCENE. A three project's scene is `the world root's stage`
|
|
403
|
+
// (`SCENE_DOCUMENT_ID`, owned by `syncCenterDocuments`); a canvas project's
|
|
404
|
+
// scene is this document, and a project has one or the other. Unlike the
|
|
405
|
+
// boards, it is ROOT-derived and not story-derived: it is a document OF that
|
|
406
|
+
// root's world, not a gallery of components.
|
|
407
|
+
const canvasRoot = designTimeRoots.find((root) => root.kind === 'canvas');
|
|
408
|
+
if (canvasRoot) {
|
|
409
|
+
unregisterRoutes.push(registerRootDocumentRoute(canvasRoot.worldId, CANVAS_SCENE_DOCUMENT_ID));
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// A ROOT WHOSE DESIGN SURFACE IS A BOARD. A dom root has no document of its
|
|
413
|
+
// own: its surface is the project's UI board, so `activateRootDocument(id)`
|
|
414
|
+
// must reach that board and say why when it cannot. The pairing is the
|
|
415
|
+
// descriptor's `kind` against a registered `medium` — the host matches two
|
|
416
|
+
// values it was handed and names neither — and a root already routed at a
|
|
417
|
+
// Scene above keeps that route, because a world root's own document always
|
|
418
|
+
// wins over a gallery of its components.
|
|
419
|
+
//
|
|
420
|
+
// It is reconciled rather than registered once, for the reason every one of
|
|
421
|
+
// these registries has: the contribution pass that loads the packages is
|
|
422
|
+
// deferred behind the first viewport frame, so at project open NOTHING is
|
|
423
|
+
// registered yet.
|
|
424
|
+
const routedRoots = new Set(
|
|
425
|
+
[
|
|
426
|
+
...composite
|
|
427
|
+
.childAdapters()
|
|
428
|
+
.filter((child) => child.role === 'world' && child.kind === 'three'),
|
|
429
|
+
...(canvasRoot ? [canvasRoot] : []),
|
|
430
|
+
].map((root) => root.worldId),
|
|
431
|
+
);
|
|
432
|
+
const boardRoutes = new Map<string, () => void>();
|
|
433
|
+
function reconcileBoardRoutes(): void {
|
|
434
|
+
for (const root of designTimeRoots) {
|
|
435
|
+
if (routedRoots.has(root.worldId) || boardRoutes.has(root.worldId)) continue;
|
|
436
|
+
const board = componentBoardForMedium(root.kind);
|
|
437
|
+
if (!board) continue;
|
|
438
|
+
const stopRoute = registerRootDocumentRoute(root.worldId, board.documentId);
|
|
439
|
+
// ...and the honest answer for the case that route CANNOT reach. A board
|
|
440
|
+
// exists only on its own package's verdict, so a root can route at a
|
|
441
|
+
// document that will never open in THIS project. Without this the ask
|
|
442
|
+
// waits out the whole registration window and then reports the generic
|
|
443
|
+
// "world document is not registered", which reads as a missing ROOT —
|
|
444
|
+
// the root is right there in the manifest, and the thing that is missing
|
|
445
|
+
// is its board. Live thunk, and `presence() === null` is what keeps it
|
|
446
|
+
// silent during boot: no verdict is never a No.
|
|
447
|
+
const stopGap = registerRootDocumentGap(root.worldId, () =>
|
|
448
|
+
board.presence() === 'absent'
|
|
449
|
+
? `Root "${root.worldId}" has no document of its own: its design surface is the ` +
|
|
450
|
+
`project's ${board.title} board (${board.documentId}). ${board.absentReason()}`
|
|
451
|
+
: null,
|
|
452
|
+
);
|
|
453
|
+
boardRoutes.set(root.worldId, () => {
|
|
454
|
+
stopGap();
|
|
455
|
+
stopRoute();
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// THE SAME GAP, asked the other way. `openWorkspaceView` names a DOCUMENT
|
|
461
|
+
// rather than a root, and `activateWorkspaceDocument`'s `false` carries the
|
|
462
|
+
// identical ambiguity plus one a root cannot have: the id may name nothing at
|
|
463
|
+
// all. Both were paid for with the full 10 s registration window and then a
|
|
464
|
+
// generic "not available" — long after the asking side gave up (MEASURED on
|
|
465
|
+
// this project: a bogus id timed out the relay at 5.6 s and left a
|
|
466
|
+
// `play-stall` error behind). This owner installs the project's workspace
|
|
467
|
+
// documents, so it is the one that can say why a document is absent — and
|
|
468
|
+
// for a BOARD it asks the board, which is the only party that knows.
|
|
469
|
+
unregisterRoutes.push(
|
|
470
|
+
registerWorkspaceDocumentGap((documentId) => {
|
|
471
|
+
const open = openWorkspaceDocuments();
|
|
472
|
+
if (open.some((document) => document.descriptor.id === documentId)) return null;
|
|
473
|
+
const board = componentBoardForDocument(documentId);
|
|
474
|
+
if (board) return board.presence() === 'absent' ? board.absentReason() : null;
|
|
475
|
+
return (
|
|
476
|
+
`No workspace document is named "${documentId}". Open in this session: ` +
|
|
477
|
+
`${open.map((document) => document.descriptor.id).join(', ') || '(none)'}. A component ` +
|
|
478
|
+
'board is present only when the package that owns its medium says this project has one, ' +
|
|
479
|
+
'so a board id can be absent for this project and present for another.'
|
|
480
|
+
);
|
|
481
|
+
}),
|
|
482
|
+
);
|
|
483
|
+
|
|
484
|
+
function openCanvasScene(descriptor: DesignTimeRootDescriptor): void {
|
|
485
|
+
const Content = (props: WorkspaceDocumentContentProps) => (
|
|
486
|
+
<RootDocumentContent {...props} composite={composite} descriptor={descriptor} store={store} />
|
|
487
|
+
);
|
|
488
|
+
registerAvailableWorkspaceDocument(
|
|
489
|
+
{
|
|
490
|
+
id: CANVAS_SCENE_DOCUMENT_ID,
|
|
491
|
+
title: CANVAS_SCENE_TITLE,
|
|
492
|
+
kind: 'world',
|
|
493
|
+
workspaceRole: 'authored-subject',
|
|
494
|
+
provenance: {
|
|
495
|
+
rootId: descriptor.worldId,
|
|
496
|
+
...(descriptor.path ? { sourcePath: descriptor.path } : {}),
|
|
497
|
+
},
|
|
498
|
+
Content,
|
|
499
|
+
presentation: () => ({ kind: 'world', id: descriptor.worldId }),
|
|
500
|
+
onActivate: () => store.setActiveViewportTab('edit'),
|
|
501
|
+
},
|
|
502
|
+
{ category: 'scene', default: !hasThreeRoot, rootId: descriptor.worldId },
|
|
503
|
+
);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/** Reserve the id BEFORE installing, so a second reconcile arriving while an
|
|
507
|
+
* asynchronous install is in flight does not start a second one; un-reserve
|
|
508
|
+
* if it fails, so the next verdict retries. Saying WHAT failed is the
|
|
509
|
+
* board's own job — only it knows what it was loading. */
|
|
510
|
+
function installBoard(board: ComponentBoard): void {
|
|
511
|
+
installedIds.add(board.documentId);
|
|
512
|
+
const unreserve = (): void => {
|
|
513
|
+
installedIds.delete(board.documentId);
|
|
514
|
+
};
|
|
515
|
+
try {
|
|
516
|
+
void Promise.resolve(board.install({ store, composite })).catch(unreserve);
|
|
517
|
+
} catch {
|
|
518
|
+
unreserve();
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/** Bring the registered component boards in line with their own verdicts.
|
|
523
|
+
* Idempotent: `openWorkspaceDocument` is a no-op for a document already
|
|
524
|
+
* open, and `closeWorkspaceDocument` for one that is not.
|
|
525
|
+
*
|
|
526
|
+
* A board NEVER steals focus, which is why `install` is documented to open
|
|
527
|
+
* without activating: presence is answered ASYNCHRONOUSLY, so a board that
|
|
528
|
+
* arrives late would otherwise yank the author off whatever they were
|
|
529
|
+
* looking at (measured: the canvas root's `Scene` opened, then a board
|
|
530
|
+
* landed a second later and took the tab). The tail of this function still
|
|
531
|
+
* chooses the opening document. */
|
|
532
|
+
function reconcileBoards(): void {
|
|
533
|
+
if (disposed) return;
|
|
534
|
+
reconcileBoardRoutes();
|
|
535
|
+
for (const board of componentBoards()) {
|
|
536
|
+
const wanted = board.presence();
|
|
537
|
+
// `null` is "no verdict yet": neither install nor close. A census that
|
|
538
|
+
// has not run must not take a board away, and a board that has never
|
|
539
|
+
// been installed must not be conjured by silence.
|
|
540
|
+
if (wanted === null) continue;
|
|
541
|
+
const installed = installedIds.has(board.documentId);
|
|
542
|
+
if ((wanted === 'present') === installed) continue;
|
|
543
|
+
if (wanted === 'present') installBoard(board);
|
|
544
|
+
else {
|
|
545
|
+
unregisterAvailableWorkspaceDocument(board.documentId);
|
|
546
|
+
installedIds.delete(board.documentId);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// The canvas Scene is installed once, from the manifest — it does not
|
|
552
|
+
// participate in `reconcileBoards`' verdicts, because a world root's
|
|
553
|
+
// existence is not a question a board's package answers.
|
|
554
|
+
if (canvasRoot) {
|
|
555
|
+
openCanvasScene(canvasRoot);
|
|
556
|
+
installedIds.add(CANVAS_SCENE_DOCUMENT_ID);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
reconcileBoards();
|
|
560
|
+
const unsubscribePresence = subscribeComponentBoards(reconcileBoards);
|
|
561
|
+
|
|
562
|
+
const firstInstalled = canvasRoot ? CANVAS_SCENE_DOCUMENT_ID : [...installedIds][0];
|
|
563
|
+
if (
|
|
564
|
+
!hasThreeRoot &&
|
|
565
|
+
firstInstalled !== undefined &&
|
|
566
|
+
(previouslyActive === null ||
|
|
567
|
+
previouslyActive === SCENE_DOCUMENT_ID ||
|
|
568
|
+
previouslyActive === GAME_DOCUMENT_ID)
|
|
569
|
+
) {
|
|
570
|
+
activateWorkspaceDocument(firstInstalled);
|
|
571
|
+
} else if (previouslyActive) {
|
|
572
|
+
activateWorkspaceDocument(previouslyActive);
|
|
573
|
+
} else if (hasThreeRoot) {
|
|
574
|
+
activateWorkspaceDocument(SCENE_DOCUMENT_ID);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
return () => {
|
|
578
|
+
disposed = true;
|
|
579
|
+
if (rootDocumentHost?.store === store) rootDocumentHost = null;
|
|
580
|
+
unsubscribePresence();
|
|
581
|
+
for (const unregister of unregisterRoutes) unregister();
|
|
582
|
+
for (const unregister of boardRoutes.values()) unregister();
|
|
583
|
+
boardRoutes.clear();
|
|
584
|
+
for (const id of installedIds) unregisterAvailableWorkspaceDocument(id);
|
|
585
|
+
};
|
|
586
|
+
}
|