@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,328 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Divider,
|
|
3
|
+
EditorIcon,
|
|
4
|
+
editorIcons,
|
|
5
|
+
Inline,
|
|
6
|
+
Menu,
|
|
7
|
+
MenuItem,
|
|
8
|
+
MenuSeparator,
|
|
9
|
+
MenuTrigger,
|
|
10
|
+
Text,
|
|
11
|
+
} from '@volter/editor-sdk/widgets';
|
|
12
|
+
import {
|
|
13
|
+
type ReactNode,
|
|
14
|
+
useEffect,
|
|
15
|
+
useReducer,
|
|
16
|
+
useRef,
|
|
17
|
+
useState,
|
|
18
|
+
useSyncExternalStore,
|
|
19
|
+
} from 'react';
|
|
20
|
+
import { activeProduct } from '../active-product';
|
|
21
|
+
import { BUNDLED_EDITOR_VERSION } from '../build-identity';
|
|
22
|
+
import {
|
|
23
|
+
contributedChromeVersion,
|
|
24
|
+
contributedHeaderItems,
|
|
25
|
+
subscribeContributedChrome,
|
|
26
|
+
} from '../chrome-registry';
|
|
27
|
+
import { revealInFinder } from '../editor-api';
|
|
28
|
+
import { getCurrentProject, onProjectChange } from '../project-manager';
|
|
29
|
+
import {
|
|
30
|
+
activeEditorWorkspace,
|
|
31
|
+
editorWorkspaces,
|
|
32
|
+
editorWorkspacesVersion,
|
|
33
|
+
setEditorWorkspace,
|
|
34
|
+
subscribeEditorWorkspace,
|
|
35
|
+
subscribeEditorWorkspaces,
|
|
36
|
+
workspaceApplies,
|
|
37
|
+
} from '../workspace-presets';
|
|
38
|
+
import {
|
|
39
|
+
activeChromeRegions,
|
|
40
|
+
chromeRegionsVersion,
|
|
41
|
+
subscribeChromeRegions,
|
|
42
|
+
} from '../workspace-regions';
|
|
43
|
+
import { ApplicationMenus } from './ApplicationMenus';
|
|
44
|
+
import { ChromeSlot } from './ChromeSlot';
|
|
45
|
+
import { WorktreeSwitcher } from './WorktreeSwitcher';
|
|
46
|
+
|
|
47
|
+
export function ProjectHeader({
|
|
48
|
+
transport,
|
|
49
|
+
}: {
|
|
50
|
+
/** Controlled production transport for bounded hosts; the application
|
|
51
|
+
* defaults to the connected PlayBar. */
|
|
52
|
+
transport?: ReactNode | undefined;
|
|
53
|
+
}) {
|
|
54
|
+
const [, forceUpdate] = useReducer((x: number) => x + 1, 0);
|
|
55
|
+
useEffect(() => onProjectChange(forceUpdate), []);
|
|
56
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
57
|
+
const menuRef = useRef<HTMLDivElement>(null);
|
|
58
|
+
|
|
59
|
+
const project = getCurrentProject();
|
|
60
|
+
const projectName = project?.config.name ?? 'No Project';
|
|
61
|
+
const projectVersion = project?.config.version ?? null;
|
|
62
|
+
const engineVersion = project?.config.engine.version ?? null;
|
|
63
|
+
const manifestVersion = project?.config.manifestVersion ?? null;
|
|
64
|
+
const projectPath = project?.rootPath ?? '';
|
|
65
|
+
// Close menu on outside click
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!menuOpen) return;
|
|
68
|
+
const handler = (e: MouseEvent) => {
|
|
69
|
+
if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
|
|
70
|
+
setMenuOpen(false);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
document.addEventListener('mousedown', handler);
|
|
74
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
75
|
+
}, [menuOpen]);
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<header className="vgai-project-header">
|
|
79
|
+
{/* W5 (W4-reviewer candidate — transport narrow-width overlap guard):
|
|
80
|
+
the header is now THREE flex columns — name (shrinkable, ellipsized)
|
|
81
|
+
| transport (fixed) | right spacer — replacing the W4 absolute
|
|
82
|
+
centering, which let the transport cluster overlap the project name
|
|
83
|
+
at narrow widths. Equal-flex side columns keep the transport
|
|
84
|
+
visually centered whenever space allows; flex items cannot overlap
|
|
85
|
+
when it doesn't. */}
|
|
86
|
+
{/* Project name — clickable dropdown trigger. The cluster wrapper is
|
|
87
|
+
layout-neutral under bars chrome and becomes the LEFT glass island
|
|
88
|
+
under islands chrome (P6-U3); the dropdown Menu stays a SIBLING of
|
|
89
|
+
the island so the island's backdrop-filter never captures it. */}
|
|
90
|
+
{activeProduct()?.nativeMenus ? (
|
|
91
|
+
<div className="vgai-project-header-left" />
|
|
92
|
+
) : (
|
|
93
|
+
<div ref={menuRef} className="vgai-project-header-left">
|
|
94
|
+
<div className="vgai-project-header-cluster vgai-chrome-island vgai-glass-island">
|
|
95
|
+
{/* THE LEADING ITEM IS A BARE GLYPH, and that is transcription, not
|
|
96
|
+
economy. Blender opens its top bar with an app mark whose INK
|
|
97
|
+
starts at the band's own inset and whose click opens a MENU —
|
|
98
|
+
the mark IS the app menu's trigger. Measured on `topbar.png` at
|
|
99
|
+
native 2x: device x 12..43, i.e. CSS 6.0..21.5 — 16.0 wide, 13.0
|
|
100
|
+
tall — and the first menu word's ink follows at CSS 32.0. (The
|
|
101
|
+
whole-frame read's "32 CSS px app mark" was that 32-DEVICE-px
|
|
102
|
+
width read as CSS, and its "menu words start at 60" followed
|
|
103
|
+
from it; the frame says 16 and 32.)
|
|
104
|
+
|
|
105
|
+
Ours used to spend 67 px here on a padded pill drawing the
|
|
106
|
+
project NAME, which ellipsized to `prob…` at 1728 even for an
|
|
107
|
+
eight-character name, and the switcher beside it another 204.
|
|
108
|
+
The project's identity is not lost by the glyph: it is the
|
|
109
|
+
browser TAB's title (`AppRoot.tsx` writes `document.title` from
|
|
110
|
+
the project name — the tab strip IS our OS title bar, the place
|
|
111
|
+
Blender puts the file name), this button's tooltip and
|
|
112
|
+
accessible name, and the first row of the menu it opens. */}
|
|
113
|
+
<MenuTrigger
|
|
114
|
+
data-testid="project-menu-trigger"
|
|
115
|
+
aria-label={`${projectName} project menu`}
|
|
116
|
+
title={projectPath ? `${projectName} — ${projectPath}` : projectName}
|
|
117
|
+
onClick={() => setMenuOpen((v) => !v)}
|
|
118
|
+
onKeyDown={(event) => {
|
|
119
|
+
if (event.key !== 'ArrowDown') return;
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
setMenuOpen(true);
|
|
122
|
+
}}
|
|
123
|
+
className="vgai-project-trigger"
|
|
124
|
+
>
|
|
125
|
+
<EditorIcon icon={editorIcons.content.project} />
|
|
126
|
+
{/* The name stays in the DOM at zero pixels: the accessible name
|
|
127
|
+
above is a LABEL, this is the element's CONTENT, and it is what
|
|
128
|
+
`data-project` has always carried for the tooling that reads
|
|
129
|
+
which project a session has open. */}
|
|
130
|
+
<Text
|
|
131
|
+
data-testid="project-name"
|
|
132
|
+
data-project={projectName}
|
|
133
|
+
data-project-version={projectVersion ?? undefined}
|
|
134
|
+
variant="label"
|
|
135
|
+
className="vgai-sr-only"
|
|
136
|
+
>
|
|
137
|
+
{projectName}
|
|
138
|
+
</Text>
|
|
139
|
+
</MenuTrigger>
|
|
140
|
+
<WorktreeSwitcher />
|
|
141
|
+
<Inline onPointerDown={() => setMenuOpen(false)} className="vgai-project-app-menus">
|
|
142
|
+
<ApplicationMenus />
|
|
143
|
+
</Inline>
|
|
144
|
+
</div>
|
|
145
|
+
<WorkspaceTabs />
|
|
146
|
+
|
|
147
|
+
{menuOpen && (
|
|
148
|
+
<Menu
|
|
149
|
+
autoFocusFirst
|
|
150
|
+
onDismiss={() => {
|
|
151
|
+
const trigger = menuRef.current?.querySelector<HTMLButtonElement>(
|
|
152
|
+
'[data-testid="project-menu-trigger"]',
|
|
153
|
+
);
|
|
154
|
+
setMenuOpen(false);
|
|
155
|
+
requestAnimationFrame(() => trigger?.focus());
|
|
156
|
+
}}
|
|
157
|
+
className="vgai-project-menu"
|
|
158
|
+
>
|
|
159
|
+
{/* IDENTITY'S READABLE HOME. The trigger is a glyph, so the name
|
|
160
|
+
is the first thing this menu says — the row Blender's OS title
|
|
161
|
+
bar carries and a browser window does not. */}
|
|
162
|
+
<Text
|
|
163
|
+
data-testid="project-menu-name"
|
|
164
|
+
title={projectName}
|
|
165
|
+
variant="label"
|
|
166
|
+
truncate
|
|
167
|
+
className="vgai-project-menu-name"
|
|
168
|
+
>
|
|
169
|
+
{projectName}
|
|
170
|
+
</Text>
|
|
171
|
+
{projectPath && (
|
|
172
|
+
<Text
|
|
173
|
+
data-testid="project-menu-path"
|
|
174
|
+
title={projectPath}
|
|
175
|
+
variant="caption"
|
|
176
|
+
tone="dim"
|
|
177
|
+
selectable
|
|
178
|
+
truncate
|
|
179
|
+
className="vgai-project-path"
|
|
180
|
+
>
|
|
181
|
+
{projectPath}
|
|
182
|
+
</Text>
|
|
183
|
+
)}
|
|
184
|
+
{projectVersion && engineVersion && manifestVersion !== null && (
|
|
185
|
+
<>
|
|
186
|
+
{projectPath && <MenuSeparator />}
|
|
187
|
+
<div data-testid="project-version-summary" className="vgai-project-versions">
|
|
188
|
+
<span>Editor</span>
|
|
189
|
+
<Text variant="code" tone="muted">
|
|
190
|
+
v{BUNDLED_EDITOR_VERSION}
|
|
191
|
+
</Text>
|
|
192
|
+
<span>Project</span>
|
|
193
|
+
<Text variant="code" tone="muted">
|
|
194
|
+
v{projectVersion}
|
|
195
|
+
</Text>
|
|
196
|
+
<span>Engine</span>
|
|
197
|
+
<Text variant="code" tone="muted">
|
|
198
|
+
v{engineVersion}
|
|
199
|
+
</Text>
|
|
200
|
+
<span>Format</span>
|
|
201
|
+
<Text variant="code" tone="muted">
|
|
202
|
+
v{manifestVersion}
|
|
203
|
+
</Text>
|
|
204
|
+
</div>
|
|
205
|
+
<MenuSeparator />
|
|
206
|
+
</>
|
|
207
|
+
)}
|
|
208
|
+
{projectPath && (
|
|
209
|
+
<MenuItem
|
|
210
|
+
onSelect={() => {
|
|
211
|
+
setMenuOpen(false);
|
|
212
|
+
revealInFinder(projectPath);
|
|
213
|
+
}}
|
|
214
|
+
>
|
|
215
|
+
Show in Finder
|
|
216
|
+
</MenuItem>
|
|
217
|
+
)}
|
|
218
|
+
<MenuItem
|
|
219
|
+
data-testid="project-menu-history"
|
|
220
|
+
onSelect={() => {
|
|
221
|
+
setMenuOpen(false);
|
|
222
|
+
window.dispatchEvent(new CustomEvent('editor:show-history-tab'));
|
|
223
|
+
}}
|
|
224
|
+
>
|
|
225
|
+
{/* §8 naming: `Undo History`, never plain `History` (git/version
|
|
226
|
+
confusion). */}
|
|
227
|
+
Undo History…
|
|
228
|
+
</MenuItem>
|
|
229
|
+
</Menu>
|
|
230
|
+
)}
|
|
231
|
+
</div>
|
|
232
|
+
)}
|
|
233
|
+
{/* W4 (§4.1/§9 W4, inventory row V4 + the recorded always-visible-
|
|
234
|
+
transport work item): the global TRANSPORT cluster lives in the
|
|
235
|
+
command bar — reachable regardless of which center document is
|
|
236
|
+
active (asset/story docs used to hide play/pause/stop entirely).
|
|
237
|
+
Centered in the row, matching the §4.1 mock's `> || >`. */}
|
|
238
|
+
<Inline
|
|
239
|
+
data-testid="header-transport"
|
|
240
|
+
className="vgai-project-transport vgai-chrome-island vgai-glass-island"
|
|
241
|
+
align="center"
|
|
242
|
+
>
|
|
243
|
+
{transport ?? <ProjectTransport />}
|
|
244
|
+
</Inline>
|
|
245
|
+
{/* Conversation entry moved to the global bottom shell row. Keep this
|
|
246
|
+
equal-width spacer so transport remains visually centered. */}
|
|
247
|
+
<Inline className="vgai-project-header-right" justify="end" align="center">
|
|
248
|
+
{/* WHO IS IN THIS SESSION. A chrome slot, not a component: the host
|
|
249
|
+
owns the place and a package owns what sits there
|
|
250
|
+
(`chrome-slot-registry.ts`). `@vgai/collaboration` fills it; a
|
|
251
|
+
build without that package renders nothing here, which is the
|
|
252
|
+
honest answer for an editor nobody else is in. */}
|
|
253
|
+
<ChromeSlot slot="header-trailing" />
|
|
254
|
+
</Inline>
|
|
255
|
+
{/* SaveStatus moved OUT of this command header (H3): status is status,
|
|
256
|
+
not a command — it renders in the W4 status bar
|
|
257
|
+
(`status-contributions.tsx`). */}
|
|
258
|
+
</header>
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* The WORKSPACE TAB STRIP — Blender's top bar, shown only when the active
|
|
264
|
+
* chrome regions say so (`workspaceTabs`, a style's or a workspace's region;
|
|
265
|
+
* the Blender bundle turns it on). A click is the explicit act the workspace
|
|
266
|
+
* ruling requires (`workspace-presets.ts`); the strip derives nothing.
|
|
267
|
+
*/
|
|
268
|
+
function WorkspaceTabs() {
|
|
269
|
+
useSyncExternalStore(subscribeChromeRegions, chromeRegionsVersion, chromeRegionsVersion);
|
|
270
|
+
useSyncExternalStore(subscribeEditorWorkspaces, editorWorkspacesVersion, editorWorkspacesVersion);
|
|
271
|
+
const active = useSyncExternalStore(
|
|
272
|
+
subscribeEditorWorkspace,
|
|
273
|
+
activeEditorWorkspace,
|
|
274
|
+
activeEditorWorkspace,
|
|
275
|
+
);
|
|
276
|
+
if (activeChromeRegions().workspaceTabs !== 'shown') return null;
|
|
277
|
+
const workspaces = editorWorkspaces().filter((entry) => workspaceApplies(entry.id));
|
|
278
|
+
return (
|
|
279
|
+
<>
|
|
280
|
+
{/* Blender closes its menu words with a 1x20 rule before the workspace
|
|
281
|
+
tabs begin (measured `topbar.png`, halved: a #2e2e2e rule sitting 16px
|
|
282
|
+
past `Help`'s ink). Without it the two regions read as one
|
|
283
|
+
undifferentiated run of words, which is what ours did. It belongs to
|
|
284
|
+
the strip, so it appears and disappears with it. */}
|
|
285
|
+
<Divider orientation="vertical" className="vgai-project-menu-rule" />
|
|
286
|
+
<div
|
|
287
|
+
role="tablist"
|
|
288
|
+
aria-label="Workspaces"
|
|
289
|
+
data-testid="workspace-tabs"
|
|
290
|
+
className="vgai-workspace-tabs"
|
|
291
|
+
>
|
|
292
|
+
{workspaces.map((entry) => (
|
|
293
|
+
<button
|
|
294
|
+
key={entry.id}
|
|
295
|
+
type="button"
|
|
296
|
+
role="tab"
|
|
297
|
+
aria-selected={entry.id === active}
|
|
298
|
+
title={entry.description}
|
|
299
|
+
className="vgai-workspace-tab"
|
|
300
|
+
onClick={() => setEditorWorkspace(entry.id)}
|
|
301
|
+
>
|
|
302
|
+
{entry.title}
|
|
303
|
+
</button>
|
|
304
|
+
))}
|
|
305
|
+
</div>
|
|
306
|
+
</>
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/** The global transport cluster: whatever the project's packages contribute
|
|
311
|
+
* to the header (`@volter/editor-sdk/chrome`, `.header`) — the Play transport
|
|
312
|
+
* ships with `@vgai/game`; a folder of models contributes nothing here. */
|
|
313
|
+
function ProjectTransport() {
|
|
314
|
+
useSyncExternalStore(
|
|
315
|
+
subscribeContributedChrome,
|
|
316
|
+
contributedChromeVersion,
|
|
317
|
+
contributedChromeVersion,
|
|
318
|
+
);
|
|
319
|
+
const items = contributedHeaderItems();
|
|
320
|
+
if (items.length === 0) return null;
|
|
321
|
+
return (
|
|
322
|
+
<>
|
|
323
|
+
{items.map(({ id, Component }) => (
|
|
324
|
+
<Component key={id} documentId="" />
|
|
325
|
+
))}
|
|
326
|
+
</>
|
|
327
|
+
);
|
|
328
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/** Project-authored composition over the same native editor documents and services. */
|
|
2
|
+
import {
|
|
3
|
+
type DocumentViewProps,
|
|
4
|
+
EditorFooter,
|
|
5
|
+
EditorFrame,
|
|
6
|
+
EditorHeader,
|
|
7
|
+
Workspace as HostWorkspace,
|
|
8
|
+
} from '@volter/editor-sdk/layouts';
|
|
9
|
+
import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
|
|
10
|
+
import { activeProjectKey } from '../active-project';
|
|
11
|
+
import {
|
|
12
|
+
adapterEditorConfiguration,
|
|
13
|
+
subscribeAdapterEditorConfiguration,
|
|
14
|
+
} from '../adapter-editor-config';
|
|
15
|
+
import {
|
|
16
|
+
object3DDocumentSession,
|
|
17
|
+
object3DDocumentSessionsVersion,
|
|
18
|
+
subscribeObject3DDocumentSessions,
|
|
19
|
+
} from '../authoring/object3d-document-session-registry';
|
|
20
|
+
import { openRegisteredDocumentAsync } from '../document-open-registry';
|
|
21
|
+
import { useEditorStore } from '../editor-runtime';
|
|
22
|
+
import {
|
|
23
|
+
projectAdapterWaitNarration,
|
|
24
|
+
subscribeProjectAdapter,
|
|
25
|
+
waitForProjectAdapter,
|
|
26
|
+
} from '../project-adapter';
|
|
27
|
+
import {
|
|
28
|
+
activateWorkspaceDocument,
|
|
29
|
+
closeWorkspaceDocument,
|
|
30
|
+
openWorkspaceDocuments,
|
|
31
|
+
subscribeWorkspaceDocuments,
|
|
32
|
+
workspaceDocumentRegistryVersion,
|
|
33
|
+
} from '../workspace-document-registry';
|
|
34
|
+
import { openAssetDocument } from './asset-documents';
|
|
35
|
+
import { WorkspaceDocumentSurface } from './WorkspaceDocumentSurface';
|
|
36
|
+
|
|
37
|
+
const documentOwners = new Map<
|
|
38
|
+
string,
|
|
39
|
+
{ project: string | null; count: number; created: boolean }
|
|
40
|
+
>();
|
|
41
|
+
function retainDocument(id: string, created: boolean): () => void {
|
|
42
|
+
const project = activeProjectKey();
|
|
43
|
+
let ownership = documentOwners.get(id);
|
|
44
|
+
if (!ownership || ownership.project !== project) {
|
|
45
|
+
ownership = { project, count: 0, created };
|
|
46
|
+
documentOwners.set(id, ownership);
|
|
47
|
+
}
|
|
48
|
+
ownership.count++;
|
|
49
|
+
const held = ownership;
|
|
50
|
+
return () => {
|
|
51
|
+
if (documentOwners.get(id) !== held || --held.count > 0) return;
|
|
52
|
+
documentOwners.delete(id);
|
|
53
|
+
if (held.created && activeProjectKey() === held.project) closeWorkspaceDocument(id);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* ONE DOCUMENT, mounted with no chrome around it — the layout host's `Document`.
|
|
59
|
+
*
|
|
60
|
+
* It is exported rather than registered here: `frame/bridge.tsx` is the ONE
|
|
61
|
+
* layout host there is, and it names this component in its own registration.
|
|
62
|
+
* Before PART B this module registered a host of its own and the bridge
|
|
63
|
+
* registered a second one OVER it, reading only this member back out — two
|
|
64
|
+
* registrations for one door, where the second always won.
|
|
65
|
+
*/
|
|
66
|
+
export function DocumentView({
|
|
67
|
+
document: address,
|
|
68
|
+
chrome = true,
|
|
69
|
+
active = true,
|
|
70
|
+
onReady,
|
|
71
|
+
}: DocumentViewProps) {
|
|
72
|
+
const store = useEditorStore();
|
|
73
|
+
const [id, setId] = useState<string | null>(null);
|
|
74
|
+
const [error, setError] = useState<string | null>(null);
|
|
75
|
+
const addressKey = JSON.stringify(address);
|
|
76
|
+
const onReadyRef = useRef(onReady);
|
|
77
|
+
onReadyRef.current = onReady;
|
|
78
|
+
const readySession = useRef<unknown>(null);
|
|
79
|
+
useSyncExternalStore(
|
|
80
|
+
subscribeWorkspaceDocuments,
|
|
81
|
+
workspaceDocumentRegistryVersion,
|
|
82
|
+
workspaceDocumentRegistryVersion,
|
|
83
|
+
);
|
|
84
|
+
const sessionsVersion = useSyncExternalStore(
|
|
85
|
+
subscribeObject3DDocumentSessions,
|
|
86
|
+
object3DDocumentSessionsVersion,
|
|
87
|
+
object3DDocumentSessionsVersion,
|
|
88
|
+
);
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
let disposed = false;
|
|
91
|
+
let release: (() => void) | undefined;
|
|
92
|
+
const project = activeProjectKey();
|
|
93
|
+
const current = () => !disposed && activeProjectKey() === project;
|
|
94
|
+
const requested = JSON.parse(addressKey) as DocumentViewProps['document'];
|
|
95
|
+
setId(null);
|
|
96
|
+
setError(null);
|
|
97
|
+
void (async () => {
|
|
98
|
+
await waitForProjectAdapter();
|
|
99
|
+
if (!current()) return;
|
|
100
|
+
const existing = new Set(openWorkspaceDocuments().map((item) => item.descriptor.id));
|
|
101
|
+
// AN ADDRESS, NEVER A BRANCH. A layout names a document; what can open
|
|
102
|
+
// that kind is whatever registered an opener for it, and the kind's own
|
|
103
|
+
// `settle` is the pre-load this used to do by hand for `story`
|
|
104
|
+
// (`document-open-registry.ts`). The two kinds spelled out are the
|
|
105
|
+
// HOST's own: an asset at a path, and a workspace document that is
|
|
106
|
+
// either already open or is not coming.
|
|
107
|
+
const opened =
|
|
108
|
+
requested.kind === 'asset'
|
|
109
|
+
? openAssetDocument(store, requested.path, requested.assetKind ?? 'source', {
|
|
110
|
+
activate: active,
|
|
111
|
+
})
|
|
112
|
+
: requested.kind === 'workspace'
|
|
113
|
+
? existing.has(requested.id)
|
|
114
|
+
? requested.id
|
|
115
|
+
: null
|
|
116
|
+
: await openRegisteredDocumentAsync(requested.kind, store, {
|
|
117
|
+
...requested,
|
|
118
|
+
activate: active,
|
|
119
|
+
});
|
|
120
|
+
if (!current()) return;
|
|
121
|
+
if (!opened) throw new Error('The requested layout document is unavailable.');
|
|
122
|
+
release = retainDocument(opened, !existing.has(opened));
|
|
123
|
+
setId(opened);
|
|
124
|
+
})().catch((reason: unknown) => {
|
|
125
|
+
if (current()) setError(reason instanceof Error ? reason.message : String(reason));
|
|
126
|
+
});
|
|
127
|
+
return () => {
|
|
128
|
+
disposed = true;
|
|
129
|
+
release?.();
|
|
130
|
+
};
|
|
131
|
+
}, [store, addressKey]);
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
if (!id || !active) return;
|
|
134
|
+
activateWorkspaceDocument(id);
|
|
135
|
+
}, [id, active]);
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
if (!id) return;
|
|
138
|
+
const session = object3DDocumentSession(id);
|
|
139
|
+
if (!session || readySession.current === session) return;
|
|
140
|
+
readySession.current = session;
|
|
141
|
+
try {
|
|
142
|
+
onReadyRef.current?.({
|
|
143
|
+
select(name) {
|
|
144
|
+
const matches: string[] = [];
|
|
145
|
+
session.root.traverse((object) => {
|
|
146
|
+
if (object.name === name) {
|
|
147
|
+
const objectId = session.idForObject(object);
|
|
148
|
+
if (objectId) matches.push(objectId);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
if (matches.length !== 1)
|
|
152
|
+
throw new Error(`Expected one object named "${name}"; found ${matches.length}.`);
|
|
153
|
+
session.select(matches);
|
|
154
|
+
},
|
|
155
|
+
transform(mode) {
|
|
156
|
+
session.viewport.setTransformMode(mode);
|
|
157
|
+
},
|
|
158
|
+
frame() {
|
|
159
|
+
session.frame();
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
} catch (reason) {
|
|
163
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
164
|
+
}
|
|
165
|
+
}, [id, sessionsVersion]);
|
|
166
|
+
const opened = id
|
|
167
|
+
? openWorkspaceDocuments().find((item) => item.descriptor.id === id)
|
|
168
|
+
: undefined;
|
|
169
|
+
return (
|
|
170
|
+
<div
|
|
171
|
+
style={{
|
|
172
|
+
position: 'relative',
|
|
173
|
+
flex: 1,
|
|
174
|
+
minWidth: 0,
|
|
175
|
+
minHeight: 0,
|
|
176
|
+
height: '100%',
|
|
177
|
+
overflow: 'hidden',
|
|
178
|
+
}}
|
|
179
|
+
>
|
|
180
|
+
{error ? (
|
|
181
|
+
<div role="alert">{error}</div>
|
|
182
|
+
) : opened ? (
|
|
183
|
+
<WorkspaceDocumentSurface descriptor={opened.descriptor} active={active} chrome={chrome} />
|
|
184
|
+
) : (
|
|
185
|
+
<div role="status">Opening document…</div>
|
|
186
|
+
)}
|
|
187
|
+
</div>
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* THE LAYOUT A PROJECT THAT DECLARES NONE GETS — and it goes through the
|
|
193
|
+
* LAYOUT HOST, exactly as every declared layout does. Never through the
|
|
194
|
+
* components directly: the host is where the editor meets the workbench's
|
|
195
|
+
* parts, and a layout that renders around it puts the project header in an
|
|
196
|
+
* overlay root instead of the title bar and the document beside the editor
|
|
197
|
+
* area instead of in it (measured 2026-09-19, the frame walk's beat 19, on
|
|
198
|
+
* `public/ingest/three-points-waves/`).
|
|
199
|
+
*
|
|
200
|
+
* `configuration.Layout` comes from the project adapter's own `editor.Layout`,
|
|
201
|
+
* which only the scaffolder and the Blender template ever write, so most
|
|
202
|
+
* projects take this path.
|
|
203
|
+
*
|
|
204
|
+
* The body below is `GameLayout` minus `immersivePlay` (the flag is a CLAIM a
|
|
205
|
+
* layout makes, and a project that declared no layout has made no claim).
|
|
206
|
+
*/
|
|
207
|
+
function LegacyLayout() {
|
|
208
|
+
return (
|
|
209
|
+
<EditorFrame>
|
|
210
|
+
<EditorHeader />
|
|
211
|
+
<HostWorkspace />
|
|
212
|
+
<EditorFooter />
|
|
213
|
+
</EditorFrame>
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
export function ProjectLayout() {
|
|
217
|
+
const store = useEditorStore();
|
|
218
|
+
useSyncExternalStore(store.subscribe, store.getShellSnapshot ?? store.getSnapshot);
|
|
219
|
+
const configuration = useSyncExternalStore(
|
|
220
|
+
subscribeAdapterEditorConfiguration,
|
|
221
|
+
adapterEditorConfiguration,
|
|
222
|
+
adapterEditorConfiguration,
|
|
223
|
+
);
|
|
224
|
+
const [ready, setReady] = useState(false);
|
|
225
|
+
// THE BOOT'S OWN STATUS LINE NAMES WHAT IT IS WAITING FOR. Resolving the
|
|
226
|
+
// adapter can take a contribution pass — a project that declares an ingest
|
|
227
|
+
// root has its adapter declaration in a package, and waiting for that
|
|
228
|
+
// package is measured in seconds (`project-adapter.ts`'s
|
|
229
|
+
// `waitForContributedAdapterSources`). Nine silent seconds under "Loading
|
|
230
|
+
// project layout…" reads as a hung editor; the loader publishes the reason
|
|
231
|
+
// and this line speaks it.
|
|
232
|
+
const waiting = useSyncExternalStore(
|
|
233
|
+
subscribeProjectAdapter,
|
|
234
|
+
projectAdapterWaitNarration,
|
|
235
|
+
projectAdapterWaitNarration,
|
|
236
|
+
);
|
|
237
|
+
useEffect(() => {
|
|
238
|
+
let disposed = false;
|
|
239
|
+
void waitForProjectAdapter().then(() => {
|
|
240
|
+
if (!disposed) setReady(true);
|
|
241
|
+
});
|
|
242
|
+
return () => {
|
|
243
|
+
disposed = true;
|
|
244
|
+
};
|
|
245
|
+
}, []);
|
|
246
|
+
if (!ready) return <div role="status">{waiting ?? 'Loading project layout…'}</div>;
|
|
247
|
+
const Layout = configuration.Layout ?? LegacyLayout;
|
|
248
|
+
return <Layout playing={store.playState !== 'stopped'} paused={store.playState === 'paused'} />;
|
|
249
|
+
}
|