@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,73 @@
|
|
|
1
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
2
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
3
|
+
import { adapterOnlyToolOwner, type ViewportToolOwner } from '../viewport-authoring-policy';
|
|
4
|
+
import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
|
|
5
|
+
import { resolveThreeViewportRootId } from './world-hidden-viewport';
|
|
6
|
+
import { isRootHidden } from './world-session-state';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The one native root whose viewport tools may claim the current selection.
|
|
10
|
+
*
|
|
11
|
+
* A composed game can contain several native surfaces at once, but editing
|
|
12
|
+
* chrome needs one unambiguous coordinate system and capability owner. Empty,
|
|
13
|
+
* organizational, and cross-root selections therefore resolve to `null`.
|
|
14
|
+
*/
|
|
15
|
+
export interface ViewportToolContext extends ViewportToolOwner {
|
|
16
|
+
readonly adapter: AuthoringAdapter;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function compositeContext(
|
|
20
|
+
composite: CompositeAuthoringAdapter,
|
|
21
|
+
selectedIds: readonly string[],
|
|
22
|
+
): ViewportToolContext | null {
|
|
23
|
+
const children = composite.childAdapters();
|
|
24
|
+
let owner: (typeof children)[number] | null = null;
|
|
25
|
+
|
|
26
|
+
for (const id of selectedIds) {
|
|
27
|
+
const child =
|
|
28
|
+
children.find((candidate) => composite.groupNodeId(candidate.worldId) === id) ??
|
|
29
|
+
children.find((candidate) => composite.ownerOf(id) === candidate.worldId);
|
|
30
|
+
// Kind/projection folders and stale ids do not claim native-world tools.
|
|
31
|
+
if (!child) return null;
|
|
32
|
+
// A heterogeneous selection has no single native editing context.
|
|
33
|
+
if (owner && owner.worldId !== child.worldId) return null;
|
|
34
|
+
owner = child;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return owner ? { worldId: owner.worldId, kind: owner.kind, adapter: owner.adapter } : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Resolve viewport-tool ownership from selection, never from which roots
|
|
42
|
+
* merely exist or happen to be visible.
|
|
43
|
+
*/
|
|
44
|
+
export function resolveViewportToolContext(
|
|
45
|
+
adapter: AuthoringAdapter,
|
|
46
|
+
selectedIds: Iterable<string>,
|
|
47
|
+
): ViewportToolContext | null {
|
|
48
|
+
const ids = [...selectedIds];
|
|
49
|
+
if (ids.length === 0) return null;
|
|
50
|
+
if (adapter instanceof CompositeAuthoringAdapter) return compositeContext(adapter, ids);
|
|
51
|
+
|
|
52
|
+
// Legacy/single-adapter sessions have no manifest kind metadata, and that
|
|
53
|
+
// fallback is `adapterOnlyToolOwner` — it speaks only the adapter contract,
|
|
54
|
+
// so it lives below the shell (`viewport-authoring-policy.ts`) as the gizmo
|
|
55
|
+
// viewport's own default. One copy, read from both sides.
|
|
56
|
+
const owner = adapterOnlyToolOwner(adapter, ids);
|
|
57
|
+
return owner ? { ...owner, adapter } : null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Whether the selected owner is actually painted in this viewport. DOM
|
|
62
|
+
* layers follow their world eye; the manifest's sole Three root owns the 3D
|
|
63
|
+
* viewport chrome only while that root is visible.
|
|
64
|
+
*/
|
|
65
|
+
export function isViewportToolContextVisible(
|
|
66
|
+
store: EditorShellStore,
|
|
67
|
+
context: ViewportToolOwner | null,
|
|
68
|
+
): boolean {
|
|
69
|
+
if (!context) return false;
|
|
70
|
+
if (context.worldId !== null && isRootHidden(context.worldId)) return false;
|
|
71
|
+
if (context.kind !== 'three' || context.worldId === null) return true;
|
|
72
|
+
return resolveThreeViewportRootId(store) === context.worldId;
|
|
73
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Session-only responsive canvas size for DOM-backed authoring roots. */
|
|
2
|
+
export interface RootCanvasViewport {
|
|
3
|
+
readonly width: number | null;
|
|
4
|
+
readonly height: number | null;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const FILL_VIEWPORT: RootCanvasViewport = { width: null, height: null };
|
|
8
|
+
let viewport: RootCanvasViewport = FILL_VIEWPORT;
|
|
9
|
+
const listeners = new Set<() => void>();
|
|
10
|
+
|
|
11
|
+
export function getRootCanvasViewport(): RootCanvasViewport {
|
|
12
|
+
return viewport;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function setRootCanvasViewport(width: number | null, height: number | null): void {
|
|
16
|
+
const nextWidth = width === null ? null : Math.max(1, Math.round(width));
|
|
17
|
+
const nextHeight = height === null ? null : Math.max(1, Math.round(height));
|
|
18
|
+
if (viewport.width === nextWidth && viewport.height === nextHeight) return;
|
|
19
|
+
viewport = { width: nextWidth, height: nextHeight };
|
|
20
|
+
for (const listener of listeners) listener();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function resetRootCanvasViewport(): void {
|
|
24
|
+
setRootCanvasViewport(null, null);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function subscribeRootCanvasViewport(listener: () => void): () => void {
|
|
28
|
+
listeners.add(listener);
|
|
29
|
+
return () => listeners.delete(listener);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function _resetRootCanvasViewportForTest(): void {
|
|
33
|
+
viewport = FILL_VIEWPORT;
|
|
34
|
+
listeners.clear();
|
|
35
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* World-hidden eye (D9, `world-session-state.ts`) applied to the EDIT-mode
|
|
3
|
+
* three viewport.
|
|
4
|
+
*
|
|
5
|
+
* Bug this fixes: the eye on a hierarchy world-group row (`world:<id>
|
|
6
|
+
* (<kind>)`, shown for 2+ world manifests) toggles `isRootHidden(worldId)`
|
|
7
|
+
* and culls the hierarchy subtree, but for a react/pixi world that's ALSO the
|
|
8
|
+
* only thing that mattered — `design-time-layers.ts`'s `applySessionStyle`
|
|
9
|
+
* sets `display:none` on that world's DOM layer. A three world has no DOM
|
|
10
|
+
* layer; nothing else consumes `isRootHidden` for its actual
|
|
11
|
+
* `THREE.Object3D`s, so without this module the eye is a viewport no-op.
|
|
12
|
+
*
|
|
13
|
+
* Session-local only — it writes no file and pushes no undo entry, matching
|
|
14
|
+
* the DOM roots' own `display:none` semantics. Every call RECOMPUTES
|
|
15
|
+
* `obj.visible` rather than remembering a previous value, which is what makes
|
|
16
|
+
* it rebuild-proof: an adapter that re-renders its tree re-stamps
|
|
17
|
+
* `obj.visible` from its own truth and would silently drop a one-shot
|
|
18
|
+
* override, but the very next call here puts the world-hidden override back.
|
|
19
|
+
* Callers must re-invoke this after every rebuild
|
|
20
|
+
* AND after the toggle itself; `editor-viewport.ts`'s `syncFromStore()` is
|
|
21
|
+
* exactly that seam — it already re-runs on every `store.subscribe` notify,
|
|
22
|
+
* which covers both an adapter rebuild (which notifies) and
|
|
23
|
+
* `GameHierarchy.tsx`'s toggle handler (`toggleRootHidden` +
|
|
24
|
+
* `store.notifyIngestEdit()`).
|
|
25
|
+
*
|
|
26
|
+
* A composite's `store.objectMap`/live THREE.Scene holds the manifest's sole
|
|
27
|
+
* three content root. `GameManifestSchema` rejects a second content root of
|
|
28
|
+
* the same medium, so `resolveThreeViewportRootId` below only needs to name
|
|
29
|
+
* that one world id rather than arbitrate per-object ownership.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { getUserData } from '@volter/editor-threejs/ecs/user-data';
|
|
33
|
+
import * as THREE from 'three';
|
|
34
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
35
|
+
import { getActiveAuthoring } from './active-adapter';
|
|
36
|
+
import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
|
|
37
|
+
import { isRootHidden } from './world-session-state';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The worldId of the ONE three world actually rendered in this viewport
|
|
41
|
+
* (`store.objectMap`'s contents), or `null` when the active adapter isn't a
|
|
42
|
+
* composite (single-world project — no world-group row/eye exists for it at
|
|
43
|
+
* all, so there is nothing to resolve) or declares no three world.
|
|
44
|
+
*
|
|
45
|
+
* Identifies the LIVE Three child by `capabilities.transform` — a transient
|
|
46
|
+
* Boundary adapter reports no transform capability until the R3F design
|
|
47
|
+
* session attaches. This reuses an existing, already-load-bearing signal
|
|
48
|
+
* instead of adding an `instanceof` check or parallel bookkeeping slot.
|
|
49
|
+
*/
|
|
50
|
+
export function resolveThreeViewportRootId(store: EditorShellStore): string | null {
|
|
51
|
+
const active = getActiveAuthoring(store);
|
|
52
|
+
if (!(active instanceof CompositeAuthoringAdapter)) return null;
|
|
53
|
+
const focused = active
|
|
54
|
+
.childAdapters()
|
|
55
|
+
.find((c) => c.kind === 'three' && c.adapter.capabilities.transform);
|
|
56
|
+
return focused?.worldId ?? null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Apply the eye toggle to every object in `objectMap` (see module doc
|
|
61
|
+
* comment for the full rebuild-proofing rationale). `threeRootId` is
|
|
62
|
+
* accepted as a parameter (rather than re-resolved internally) so a caller
|
|
63
|
+
* that already computed it once per call (e.g. for a cheap re-apply
|
|
64
|
+
* signature) doesn't pay for `resolveThreeViewportRootId`'s composite walk
|
|
65
|
+
* twice.
|
|
66
|
+
*/
|
|
67
|
+
export function applyRootHiddenVisibility(
|
|
68
|
+
objectMap: ReadonlyMap<string, THREE.Object3D>,
|
|
69
|
+
threeRootId: string | null,
|
|
70
|
+
): void {
|
|
71
|
+
const hidden = threeRootId !== null && isRootHidden(threeRootId);
|
|
72
|
+
if (!hidden) return;
|
|
73
|
+
// The live `Object3D.visible` IS the authored truth, so the SHOW edge has
|
|
74
|
+
// nothing to restore FROM — the adapter re-renders its own tree there.
|
|
75
|
+
// Hiding wins over everything: nothing in a hidden world renders.
|
|
76
|
+
for (const obj of objectMap.values()) obj.visible = false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The background an editor viewport with NO authored environment shows. A
|
|
81
|
+
* single shared instance so the per-notify re-apply below never allocates.
|
|
82
|
+
*/
|
|
83
|
+
const HIDDEN_WORLD_BACKGROUND = new THREE.Color('#aaaaaa');
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The scene-level half of the eye: `applyRootHiddenVisibility` above only
|
|
87
|
+
* covers entity `Object3D`s (the `objectMap`), but a three world also
|
|
88
|
+
* renders things that live directly on the `THREE.Scene` — the authored
|
|
89
|
+
* `background` color/skybox, `fog`, IBL `environment`, and the
|
|
90
|
+
* `envObject`-tagged ambient light `applyEnvironment` adds. None of those are
|
|
91
|
+
* entities, so without this function hiding the world leaves the viewport
|
|
92
|
+
* painted in the world's background color — looking exactly like "the eye
|
|
93
|
+
* didn't work".
|
|
94
|
+
*
|
|
95
|
+
* Same recompute-don't-remember contract as above: this only ever writes the
|
|
96
|
+
* SUPPRESSED state, idempotently, and callers invoke it on every notify while
|
|
97
|
+
* the world is hidden (an inspector environment edit mid-hide re-paints the
|
|
98
|
+
* authored values via `_applyEnvironment` — the very next notify re-suppresses
|
|
99
|
+
* them here). The restore path is `EditorShellStore.reapplyEnvironment()`, whose
|
|
100
|
+
* truth is `_sceneMeta.environment` — never a snapshot taken here.
|
|
101
|
+
*
|
|
102
|
+
* Post-processing (bloom/vignette) is the composer's half: `the world root's stage`'s
|
|
103
|
+
* `rebuildComposer` passes `undefined` instead of `store.environment` while
|
|
104
|
+
* the world is hidden; `editor-viewport.ts` bumps `composerVersion` (via
|
|
105
|
+
* `reapplyEnvironment`) on both hide/show edges so that rebuild actually runs.
|
|
106
|
+
*/
|
|
107
|
+
export function suppressRootEnvironment(scene: THREE.Scene): void {
|
|
108
|
+
scene.background = HIDDEN_WORLD_BACKGROUND;
|
|
109
|
+
scene.fog = null;
|
|
110
|
+
scene.environment = null;
|
|
111
|
+
scene.traverse((obj) => {
|
|
112
|
+
if (getUserData(obj, 'envObject')) obj.visible = false;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Is a three surface currently SHOWING in the viewport? This is the single
|
|
118
|
+
* derived truth the 3D viewport chrome gates on (spec 28): the grid,
|
|
119
|
+
* orientation gizmo, transform toolstrip, camera readout, shading modes, and
|
|
120
|
+
* the transform gizmo itself are claims about what the user can do RIGHT NOW
|
|
121
|
+
* — showing them over a viewport with no visible 3D content is a false claim
|
|
122
|
+
* (same spirit as the adapter-reach rule: report what isn't there, never
|
|
123
|
+
* advertise it). The DOM half of the chrome (`RootSelectionOverlay`)
|
|
124
|
+
* already self-gates this way; this selector brings the pre-contract 3D
|
|
125
|
+
* chrome under the same rule.
|
|
126
|
+
*
|
|
127
|
+
* Truth table (deliberately conservative — every non-composite mode keeps
|
|
128
|
+
* today's behavior exactly):
|
|
129
|
+
* - active adapter is not a composite (single-world project, ingest):
|
|
130
|
+
* `true` — no world-group eyes exist there, so there is nothing to derive
|
|
131
|
+
* from.
|
|
132
|
+
* - composite with NO threejs-kind child at all (e.g. react-only
|
|
133
|
+
* multi-world manifest): `false` — no 3D content can EVER show.
|
|
134
|
+
* - composite whose three child is still a read-only Boundary
|
|
135
|
+
* (`resolveThreeViewportRootId` → null): `true` — this is reachable
|
|
136
|
+
* transiently while the R3F design session attaches; keep the chrome rather
|
|
137
|
+
* than flickering it around adapter-install timing.
|
|
138
|
+
* - composite with a live three world: `!isRootHidden(worldId)`
|
|
139
|
+
* — the eye is the "what we're showing" signal.
|
|
140
|
+
*
|
|
141
|
+
* Recompute-per-call like everything else in this module: callers read it on
|
|
142
|
+
* every store notify (`syncFromStore` / `the world root's stage` render), never cache
|
|
143
|
+
* it across notifies.
|
|
144
|
+
*/
|
|
145
|
+
export function isThreejsSurfaceVisible(store: EditorShellStore): boolean {
|
|
146
|
+
const active = getActiveAuthoring(store);
|
|
147
|
+
if (!(active instanceof CompositeAuthoringAdapter)) return true;
|
|
148
|
+
const children = active.childAdapters();
|
|
149
|
+
if (!children.some((c) => c.kind === 'three')) return false;
|
|
150
|
+
const threeRootId = resolveThreeViewportRootId(store);
|
|
151
|
+
return threeRootId === null ? true : !isRootHidden(threeRootId);
|
|
152
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared DOM-world canvas transform (spec27 §8 "space-pan" row, D4 rebuild) — a
|
|
3
|
+
* module-level subscribable singleton (mirrors `eyedropper-session.ts`'s "bare
|
|
4
|
+
* singleton + own listener set" shape) holding the CURRENT SHARED pan + zoom
|
|
5
|
+
* applied, in LOCKSTEP, to both every design-time world-layer host
|
|
6
|
+
* (`design-time-layers.ts`'s `createLayerElement`-produced react/pixi layers)
|
|
7
|
+
* and `RootSelectionOverlay`'s visual-chrome wrapper. Its independent input
|
|
8
|
+
* sibling deliberately remains untransformed and covers the full viewport.
|
|
9
|
+
*
|
|
10
|
+
* SOUNDNESS (why lockstep preserves the "zero-correction" host-relative rect
|
|
11
|
+
* invariant `RootSelectionOverlay.tsx`'s own doc comment establishes):
|
|
12
|
+
* `RectProvider.rect(id)` is computed as `el.getBoundingClientRect()` MINUS
|
|
13
|
+
* the owning world's own root/host `getBoundingClientRect()`
|
|
14
|
+
* (`react-world-authoring-adapter.ts`'s `toHostRelative`/`hostRect` — `this
|
|
15
|
+
* .root` IS the exact layer div `createLayerElement` produces). A CSS
|
|
16
|
+
* `transform: translate()` applied directly to that host element shifts the
|
|
17
|
+
* host's OWN rendered rect AND every descendant's rendered rect by the
|
|
18
|
+
* IDENTICAL `(x, y)` delta — a rigid subtree translation — so the
|
|
19
|
+
* subtraction is invariant under pan: `rect(id)` returns the SAME
|
|
20
|
+
* host-relative numbers at any pan offset, unmodified, with no pan-awareness
|
|
21
|
+
* needed in `inspect.ts`'s geometry math or the overlay chrome consumers.
|
|
22
|
+
* Zoom scales both measured rectangles; `toHostRelative` divides their
|
|
23
|
+
* offsets and dimensions by the shared zoom before exposing authored-space
|
|
24
|
+
* geometry, while `RootSelectionOverlay.toHostLocal` performs the inverse
|
|
25
|
+
* for pointer gestures. `PickProvider.pick` needs no changes — it
|
|
26
|
+
* hit-tests real rendered rects against the real client cursor position,
|
|
27
|
+
* both of which already reflect the applied transform natively.
|
|
28
|
+
*
|
|
29
|
+
* Applying the exact SAME transform to `RootSelectionOverlay`'s own visual-
|
|
30
|
+
* chrome wrapper (a SIBLING of every world-layer host inside the SAME
|
|
31
|
+
* `the world root's stage` containerRef parent — see that file's own mount-site doc
|
|
32
|
+
* comment) shifts and scales the overlay by the identical transform — so
|
|
33
|
+
* drawing a chrome element at `rect(id)`'s authored coordinates lands it at the
|
|
34
|
+
* SAME screen position as the panned live element it describes. This is the
|
|
35
|
+
* entire "lockstep" contract: every consumer on both sides of the pan reads
|
|
36
|
+
* ONE shared value (`getRootPan()`) and applies it through the ONE shared
|
|
37
|
+
* pure helper (`panTransformValue`) — never two independently-computed
|
|
38
|
+
* transforms that could drift.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
export interface RootPan {
|
|
42
|
+
readonly x: number;
|
|
43
|
+
readonly y: number;
|
|
44
|
+
readonly zoom: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const ZERO_PAN: RootPan = { x: 0, y: 0, zoom: 1 };
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* One document camera over a 2D authoring plane.
|
|
51
|
+
*
|
|
52
|
+
* DOM component boards still use the historical shared instance exported
|
|
53
|
+
* below. A native canvas Scene creates its own instance, because a scene
|
|
54
|
+
* camera and a component-board camera are different documents and must not
|
|
55
|
+
* inherit one another's pose merely because both happen to be 2D.
|
|
56
|
+
*/
|
|
57
|
+
export interface RootViewController {
|
|
58
|
+
get(): RootPan;
|
|
59
|
+
setView(x: number, y: number, zoom: number): void;
|
|
60
|
+
setPan(x: number, y: number): void;
|
|
61
|
+
setZoom(zoom: number): void;
|
|
62
|
+
reset(): void;
|
|
63
|
+
subscribe(listener: () => void): () => void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function createRootViewController(initial: RootPan = ZERO_PAN): RootViewController {
|
|
67
|
+
let current: RootPan = initial;
|
|
68
|
+
const subscribers = new Set<() => void>();
|
|
69
|
+
const notifySubscribers = (): void => {
|
|
70
|
+
for (const listener of subscribers) listener();
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
get: () => current,
|
|
74
|
+
setView: (x, y, zoom) => {
|
|
75
|
+
const nextZoom = Math.min(4, Math.max(0.1, zoom));
|
|
76
|
+
if (current.x === x && current.y === y && current.zoom === nextZoom) return;
|
|
77
|
+
current = { x, y, zoom: nextZoom };
|
|
78
|
+
notifySubscribers();
|
|
79
|
+
},
|
|
80
|
+
setPan: (x, y) => {
|
|
81
|
+
const nextZoom = current.zoom;
|
|
82
|
+
if (current.x === x && current.y === y) return;
|
|
83
|
+
current = { x, y, zoom: nextZoom };
|
|
84
|
+
notifySubscribers();
|
|
85
|
+
},
|
|
86
|
+
setZoom: (zoom) => {
|
|
87
|
+
const nextZoom = Math.min(4, Math.max(0.1, zoom));
|
|
88
|
+
if (current.zoom === nextZoom) return;
|
|
89
|
+
current = { x: current.x, y: current.y, zoom: nextZoom };
|
|
90
|
+
notifySubscribers();
|
|
91
|
+
},
|
|
92
|
+
reset: () => {
|
|
93
|
+
if (current.x === 0 && current.y === 0 && current.zoom === 1) return;
|
|
94
|
+
current = ZERO_PAN;
|
|
95
|
+
notifySubscribers();
|
|
96
|
+
},
|
|
97
|
+
subscribe: (listener) => {
|
|
98
|
+
subscribers.add(listener);
|
|
99
|
+
return () => subscribers.delete(listener);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let _pan: RootPan = ZERO_PAN;
|
|
105
|
+
const listeners = new Set<() => void>();
|
|
106
|
+
|
|
107
|
+
/** The historical DOM-board camera, exposed as a controller for generic
|
|
108
|
+
* navigation/overlay code. Existing function exports below remain the
|
|
109
|
+
* compatibility surface for board-specific callers. */
|
|
110
|
+
export const sharedRootViewController: RootViewController = {
|
|
111
|
+
get: () => getRootPan(),
|
|
112
|
+
setView: (x, y, zoom) => setRootView(x, y, zoom),
|
|
113
|
+
setPan: (x, y) => setRootPan(x, y),
|
|
114
|
+
setZoom: (zoom) => setRootZoom(zoom),
|
|
115
|
+
reset: () => resetRootPan(),
|
|
116
|
+
subscribe: (listener) => subscribeRootPan(listener),
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
function notify(): void {
|
|
120
|
+
for (const l of listeners) l();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** The current shared canvas transform; x/y are CSS px and zoom is unitless. */
|
|
124
|
+
export function getRootPan(): RootPan {
|
|
125
|
+
return _pan;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Set the complete shared canvas transform in one subscriber notification. */
|
|
129
|
+
export function setRootView(x: number, y: number, zoom: number): void {
|
|
130
|
+
const nextZoom = Math.min(4, Math.max(0.1, zoom));
|
|
131
|
+
if (_pan.x === x && _pan.y === y && _pan.zoom === nextZoom) return;
|
|
132
|
+
_pan = { x, y, zoom: nextZoom };
|
|
133
|
+
notify();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Set the shared pan translate to an absolute `(x, y)`. */
|
|
137
|
+
export function setRootPan(x: number, y: number): void {
|
|
138
|
+
setRootView(x, y, _pan.zoom);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Set the shared canvas zoom while preserving its current pan. */
|
|
142
|
+
export function setRootZoom(zoom: number): void {
|
|
143
|
+
setRootView(_pan.x, _pan.y, zoom);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Set the shared pan translate by a RELATIVE `(dx, dy)` — a convenience
|
|
147
|
+
* wrapper over `setRootPan` (not used by `RootSelectionOverlay`'s own
|
|
148
|
+
* space-drag, which composes onto a captured drag-start snapshot instead —
|
|
149
|
+
* see its own doc comment — but kept here as the natural pure counterpart
|
|
150
|
+
* for any future incremental caller, e.g. a nudge-pan keybinding). */
|
|
151
|
+
export function panRootBy(dx: number, dy: number): void {
|
|
152
|
+
setRootPan(_pan.x + dx, _pan.y + dy);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Reset pan to `(0, 0)` and zoom to 100% — called on a world-layer remount (`design-time-
|
|
156
|
+
* layers.ts`'s `mountDesignTimeLayers`, invoked on initial edit-mode install
|
|
157
|
+
* AND every acknowledged edit-mode rebuild), so switching/reloading the active
|
|
158
|
+
* world set never leaves a stale pan offset applied over a DIFFERENT layer
|
|
159
|
+
* stack. A no-op (no `notify()`) when already at rest, so a fresh session
|
|
160
|
+
* never fires a spurious subscriber tick. */
|
|
161
|
+
export function resetRootPan(): void {
|
|
162
|
+
if (_pan.x === 0 && _pan.y === 0 && _pan.zoom === 1) return;
|
|
163
|
+
_pan = ZERO_PAN;
|
|
164
|
+
notify();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Subscribe to canvas-transform changes — both `design-time-layers.ts` (imperative DOM
|
|
168
|
+
* style writes) and `RootSelectionOverlay` (`useSyncExternalStore`) bind
|
|
169
|
+
* this so every lockstep mount point re-applies the SAME new value the
|
|
170
|
+
* instant it changes. */
|
|
171
|
+
export function subscribeRootPan(listener: () => void): () => void {
|
|
172
|
+
listeners.add(listener);
|
|
173
|
+
return () => listeners.delete(listener);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* The ONE shared CSS `transform` value both visual lockstep mount points apply —
|
|
178
|
+
* pure, so a unit test can assert the world-layer host and the overlay
|
|
179
|
+
* wrapper are handed byte-identical strings for any given pan (the actual
|
|
180
|
+
* "lockstep" proof). `undefined` at rest `(0, 0)` so neither mount point ever
|
|
181
|
+
* carries a no-op `transform: translate(0px, 0px)` — keeps every pre-pan
|
|
182
|
+
* pixel-position snapshot (the full 27x suite, pinned at pan=0) byte-identical
|
|
183
|
+
* to its pre-this-feature output.
|
|
184
|
+
*/
|
|
185
|
+
export function panTransformValue(pan: RootPan): string | undefined {
|
|
186
|
+
if (pan.x === 0 && pan.y === 0 && pan.zoom === 1) return undefined;
|
|
187
|
+
if (pan.zoom === 1) return `translate(${pan.x}px, ${pan.y}px)`;
|
|
188
|
+
if (pan.x === 0 && pan.y === 0) return `scale(${pan.zoom})`;
|
|
189
|
+
return `translate(${pan.x}px, ${pan.y}px) scale(${pan.zoom})`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Test-only reset (mirrors `eyedropper-session.ts`'s/`world-session-
|
|
193
|
+
* state.ts`'s identical helpers) — drops pan + every subscriber so unit
|
|
194
|
+
* tests don't leak state across cases. */
|
|
195
|
+
export function _resetRootPanStateForTest(): void {
|
|
196
|
+
_pan = ZERO_PAN;
|
|
197
|
+
listeners.clear();
|
|
198
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* World session state (B1) — a module-level subscribable singleton (same shape as
|
|
3
|
+
* `./mount-failure-report.ts`: a bare get/set slot, no subscribe of its own — every
|
|
4
|
+
* caller that mutates it follows up with `store.notifyIngestEdit()`, which every
|
|
5
|
+
* panel already re-renders off via `useSyncExternalStore(store.subscribe, …)`)
|
|
6
|
+
* holding THREE session-local, per-worldId toggles that are NEVER
|
|
7
|
+
* serialized/persisted (D9: "eye = session-local viewport visibility, never
|
|
8
|
+
* serialized" — generalized here to all three, none of which is an authored
|
|
9
|
+
* property):
|
|
10
|
+
*
|
|
11
|
+
* - `hidden` — the eye (A2/D9). LIFTED out of `GameHierarchy.tsx`'s former
|
|
12
|
+
* local `useState<Set<string>> hiddenRootIds` (module-private React state
|
|
13
|
+
* the design-time layer stack could never see) so `design-time-layers.ts`
|
|
14
|
+
* can hide/show a world's actual DOM layer, not just dim its hierarchy row.
|
|
15
|
+
* - `interactive` — forwards real pointer events to the layer (for testing
|
|
16
|
+
* hover/press states at design time); off by default (`pointer-events:none`
|
|
17
|
+
* is the layer's resting state — see `design-time-layers.ts`).
|
|
18
|
+
* - `pickLock` — stored here for B4 to consume (layered viewport picking,
|
|
19
|
+
* D12): a pick-locked layer is skipped by the topmost-first pick walk.
|
|
20
|
+
* B1 only stores/exposes the toggle; nothing reads it yet.
|
|
21
|
+
*
|
|
22
|
+
* Keyed by the RAW manifest world id (`CompositeChild.worldId` /
|
|
23
|
+
* `ResolvedAdapterRoot.id`) — the SAME id `design-time-layers.ts` gets from
|
|
24
|
+
* `composite.childAdapters()`, NOT the composite's synthetic `world:<id>`
|
|
25
|
+
* group-node id. `GameHierarchy.tsx` (whose rows ARE keyed by the group-node
|
|
26
|
+
* id) resolves the raw worldId via `compositeGroupBadge`'s `worldId` field
|
|
27
|
+
* before calling into this module — see that file's row component.
|
|
28
|
+
*
|
|
29
|
+
* A process-lifetime singleton (not project-scoped): switching projects
|
|
30
|
+
* within the same tab does not reset these toggles. That's a deliberate
|
|
31
|
+
* relaxation of the former per-mount-React-state behavior (which reset on
|
|
32
|
+
* every `GameHierarchy` remount) — "session-local" here means "this browser
|
|
33
|
+
* tab's session", matching D9's own framing; nothing depends on a
|
|
34
|
+
* project-switch reset.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
export interface RootSessionState {
|
|
38
|
+
readonly hidden: boolean;
|
|
39
|
+
readonly interactive: boolean;
|
|
40
|
+
readonly pickLock: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const DEFAULT_STATE: RootSessionState = { hidden: false, interactive: false, pickLock: false };
|
|
44
|
+
|
|
45
|
+
const _states = new Map<string, RootSessionState>();
|
|
46
|
+
|
|
47
|
+
function get(worldId: string): RootSessionState {
|
|
48
|
+
return _states.get(worldId) ?? DEFAULT_STATE;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function patch(worldId: string, partial: Partial<RootSessionState>): void {
|
|
52
|
+
_states.set(worldId, { ...get(worldId), ...partial });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The eye (A2/D9): true while `worldId`'s design-time layer is hidden. */
|
|
56
|
+
export function isRootHidden(worldId: string): boolean {
|
|
57
|
+
return get(worldId).hidden;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function setRootHidden(worldId: string, hidden: boolean): void {
|
|
61
|
+
patch(worldId, { hidden });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function toggleRootHidden(worldId: string): void {
|
|
65
|
+
setRootHidden(worldId, !isRootHidden(worldId));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** True while `worldId`'s layer forwards real pointer events (design-time
|
|
69
|
+
* hover/press testing) instead of its resting `pointer-events:none`. */
|
|
70
|
+
export function isRootInteractive(worldId: string): boolean {
|
|
71
|
+
return get(worldId).interactive;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function setRootInteractive(worldId: string, interactive: boolean): void {
|
|
75
|
+
patch(worldId, { interactive });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function toggleRootInteractive(worldId: string): void {
|
|
79
|
+
setRootInteractive(worldId, !isRootInteractive(worldId));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** B4 will read this to skip a layer in the topmost-first pick walk; B1 only
|
|
83
|
+
* stores/exposes the toggle. */
|
|
84
|
+
export function isRootPickLocked(worldId: string): boolean {
|
|
85
|
+
return get(worldId).pickLock;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function setRootPickLock(worldId: string, pickLock: boolean): void {
|
|
89
|
+
patch(worldId, { pickLock });
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function toggleRootPickLock(worldId: string): void {
|
|
93
|
+
setRootPickLock(worldId, !isRootPickLocked(worldId));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Test-only: drop every world's session state back to defaults so unit
|
|
97
|
+
* tests don't leak toggles across cases (this module is a process-lifetime
|
|
98
|
+
* singleton — see the header comment). */
|
|
99
|
+
export function _resetRootSessionStateForTest(): void {
|
|
100
|
+
_states.clear();
|
|
101
|
+
}
|