@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,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Stories inspection section's renderer (D4/B3) — the story picker for a
|
|
3
|
+
* `world:<id>` group row whose owning child adapter advertises `stories`, and
|
|
4
|
+
* for a `kind:'component'` catalog node (which also gets the Isolate toggle).
|
|
5
|
+
*
|
|
6
|
+
* The governing adapter decides which nodes own portable states. React roots
|
|
7
|
+
* can apply them in place; Three component nodes open the same CSF state in
|
|
8
|
+
* the standard Object3D story document. This renderer knows neither substrate
|
|
9
|
+
* — it renders the provider data it is handed.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Button, Select, themeVars } from '@volter/editor-sdk/widgets';
|
|
13
|
+
|
|
14
|
+
export interface InspectorStoriesSectionProps {
|
|
15
|
+
/** The selection's available portable-CSF previews (`[]` ⇒ the disclosure). */
|
|
16
|
+
readonly stories: readonly { readonly id: string; readonly label: string }[];
|
|
17
|
+
/** Currently applied story id, or `''` for none. */
|
|
18
|
+
readonly activeStoryId: string;
|
|
19
|
+
readonly onApplyStory: (storyId: string | null) => void;
|
|
20
|
+
/** B3 — a catalog component node also gets the Isolate toggle. */
|
|
21
|
+
readonly isolation: { readonly isolated: boolean; readonly toggle: () => void } | null;
|
|
22
|
+
/** The PROVIDER's own reason its list could not be read
|
|
23
|
+
* (`StoriesProvider.unavailable`), or `null`/absent when it ran. This
|
|
24
|
+
* renderer reaches into no particular provider's discovery to find out:
|
|
25
|
+
* the same section draws an ingested game's screens and a project's CSF. */
|
|
26
|
+
readonly unavailableReason?: string | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function InspectorStoriesSection({
|
|
30
|
+
stories,
|
|
31
|
+
activeStoryId,
|
|
32
|
+
onApplyStory,
|
|
33
|
+
isolation,
|
|
34
|
+
unavailableReason,
|
|
35
|
+
}: InspectorStoriesSectionProps) {
|
|
36
|
+
// No "Stories" label and no divider of its own: the projection heads every
|
|
37
|
+
// section with its title + icon and owns the separator
|
|
38
|
+
// (`components/InspectionProjection.tsx`).
|
|
39
|
+
return (
|
|
40
|
+
<div style={{ padding: '4px 0' }}>
|
|
41
|
+
{stories.length > 0 ? (
|
|
42
|
+
<Select
|
|
43
|
+
data-testid="ingest-stories-select"
|
|
44
|
+
value={activeStoryId}
|
|
45
|
+
onChange={(e) => {
|
|
46
|
+
const v = e.target.value;
|
|
47
|
+
onApplyStory(v === '' ? null : v);
|
|
48
|
+
}}
|
|
49
|
+
style={{ width: '100%' }}
|
|
50
|
+
>
|
|
51
|
+
<option value="">(none)</option>
|
|
52
|
+
{stories.map((s) => (
|
|
53
|
+
<option key={s.id} value={s.id}>
|
|
54
|
+
{s.label}
|
|
55
|
+
</option>
|
|
56
|
+
))}
|
|
57
|
+
</Select>
|
|
58
|
+
) : (
|
|
59
|
+
<div
|
|
60
|
+
data-testid="ingest-stories-none"
|
|
61
|
+
style={{
|
|
62
|
+
fontSize: 'var(--vgai-font-base)',
|
|
63
|
+
color: themeVars.content.dim,
|
|
64
|
+
fontStyle: 'italic',
|
|
65
|
+
}}
|
|
66
|
+
>
|
|
67
|
+
{/* "This root has no previews" is a claim about the PROJECT, and it
|
|
68
|
+
is only true when discovery actually ran. When it could not, say
|
|
69
|
+
which realm limitation or host failure stopped it instead — an
|
|
70
|
+
empty list and an unread list look identical from here. */}
|
|
71
|
+
{unavailableReason ?? 'No stories — this root has no associated portable CSF previews.'}
|
|
72
|
+
</div>
|
|
73
|
+
)}
|
|
74
|
+
{/* B3 — Isolate toggle: render ONLY this catalog component (alone,
|
|
75
|
+
against whichever story is currently selected in the dropdown
|
|
76
|
+
above) on the world's design-time layer; exiting restores the
|
|
77
|
+
Live Preview. Session-only — mirrors the story overlay writes,
|
|
78
|
+
never persisted to source. */}
|
|
79
|
+
{isolation && (
|
|
80
|
+
<Button
|
|
81
|
+
data-testid="catalog-isolate"
|
|
82
|
+
onClick={isolation.toggle}
|
|
83
|
+
variant={isolation.isolated ? 'primary' : 'secondary'}
|
|
84
|
+
aria-pressed={isolation.isolated}
|
|
85
|
+
style={{ marginTop: 6, width: '100%' }}
|
|
86
|
+
>
|
|
87
|
+
{isolation.isolated ? 'Exit isolation' : 'Isolate'}
|
|
88
|
+
</Button>
|
|
89
|
+
)}
|
|
90
|
+
</div>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inspector-tool section host (W3) — renders one project tool (`placement:
|
|
3
|
+
* 'inspector'`) as a section in the ONE inspector shell (`Inspector.tsx`), via
|
|
4
|
+
* `inspector-section-registry`.
|
|
5
|
+
*
|
|
6
|
+
* The chrome is the editor's (§3.4): a bordered section with a semantic tool
|
|
7
|
+
* icon in its title row, matching
|
|
8
|
+
* the shell's own section styling (`Inspector.tsx`'s Stories block). What the
|
|
9
|
+
* tool renders inside is its own business — plain React, ideally built from
|
|
10
|
+
* `@volter/editor-sdk/widgets` so fields sit flush with the built-in sections.
|
|
11
|
+
*
|
|
12
|
+
* Crash containment mirrors the dock (`ToolHost.tsx`, shared boundary): a
|
|
13
|
+
* throwing tool component swaps THIS section for a teaching message; the
|
|
14
|
+
* rest of the inspector, and every other tool, keep working. The loader
|
|
15
|
+
* re-registers a fresh registration per (re)load, so an HMR save remounts
|
|
16
|
+
* the section and clears a tripped boundary for free.
|
|
17
|
+
*
|
|
18
|
+
* W3.1 (§3.3): the tool render is wrapped in `EditorSelectionProvider`, INSIDE
|
|
19
|
+
* the error boundary, so `useSelection()` works for any inspector tool
|
|
20
|
+
* without adding to `InspectorToolProps` — richer data arrives through hooks,
|
|
21
|
+
* not more props. Utility tools get no such provider (`ToolHost` inside a
|
|
22
|
+
* utility has no adapter/selection in scope) — `useSelection` throws a
|
|
23
|
+
* teaching error, contained the same way a render crash is.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { ToolInspectorContributionProps } from '@volter/editor-sdk/contributions';
|
|
27
|
+
import { EditorSelectionProvider } from '@volter/editor-sdk/selection';
|
|
28
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
29
|
+
import { type ComponentType, useSyncExternalStore } from 'react';
|
|
30
|
+
import { accountVersion, contributionAccount, subscribeAccount } from '../account';
|
|
31
|
+
import type { ProjectToolCatalogEntry } from '../project-tools';
|
|
32
|
+
import {
|
|
33
|
+
subscribeToolContributionPlay,
|
|
34
|
+
toolContributionPlay,
|
|
35
|
+
toolContributionPlayKey,
|
|
36
|
+
} from '../tool-contribution-play';
|
|
37
|
+
import { getToolContributionClient } from '../tool-loader';
|
|
38
|
+
import { toolContributionSurfaces } from './ToolContributionSurfaces';
|
|
39
|
+
import { ToolErrorBoundary } from './ToolHost';
|
|
40
|
+
|
|
41
|
+
export interface InspectorToolSectionProps {
|
|
42
|
+
/** `ToolConfig.id` — the section's `data-testid` suffix (`inspector-tool-<id>`). */
|
|
43
|
+
id: string;
|
|
44
|
+
/** The contribution's title — shown by the SECTION HEADER (the collapsible
|
|
45
|
+
* row the inspector owns); the body deliberately does not repeat it. */
|
|
46
|
+
title: string;
|
|
47
|
+
/** Project-relative source file, shown in crash/teaching messages. */
|
|
48
|
+
file: string;
|
|
49
|
+
/** The registered callable the module named, when it named one at all. */
|
|
50
|
+
tool?: ProjectToolCatalogEntry;
|
|
51
|
+
Component: ComponentType<ToolInspectorContributionProps>;
|
|
52
|
+
/** Live adapter + selection, as the section registry hands them over. */
|
|
53
|
+
adapter: AuthoringAdapter;
|
|
54
|
+
nodeId: string | null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** One inspector tool's section: editor-styled chrome + boundary + the tool. */
|
|
58
|
+
export function InspectorToolSection({
|
|
59
|
+
id,
|
|
60
|
+
title: _title,
|
|
61
|
+
file,
|
|
62
|
+
tool,
|
|
63
|
+
Component,
|
|
64
|
+
adapter,
|
|
65
|
+
nodeId,
|
|
66
|
+
}: InspectorToolSectionProps) {
|
|
67
|
+
useSyncExternalStore(subscribeAccount, accountVersion, accountVersion);
|
|
68
|
+
// Re-render when the bound play instance changes, so a section mounted
|
|
69
|
+
// before Play (or while another seat was inspected) does not keep reporting
|
|
70
|
+
// "no game" to a contribution whose whole subject is the running one.
|
|
71
|
+
useSyncExternalStore(
|
|
72
|
+
subscribeToolContributionPlay,
|
|
73
|
+
toolContributionPlayKey,
|
|
74
|
+
toolContributionPlayKey,
|
|
75
|
+
);
|
|
76
|
+
const node = nodeId ? adapter.hierarchy.node(nodeId) : null;
|
|
77
|
+
return (
|
|
78
|
+
<div className="vgai-inspector-tool-section" data-testid={`inspector-tool-${id}`}>
|
|
79
|
+
<ToolErrorBoundary file={file}>
|
|
80
|
+
<EditorSelectionProvider adapter={adapter} nodeId={nodeId}>
|
|
81
|
+
<Component
|
|
82
|
+
{...(tool ? { tool } : {})}
|
|
83
|
+
contributionId={id.slice(id.lastIndexOf(':') + 1)}
|
|
84
|
+
client={getToolContributionClient()}
|
|
85
|
+
surfaces={toolContributionSurfaces}
|
|
86
|
+
account={contributionAccount()}
|
|
87
|
+
play={toolContributionPlay()}
|
|
88
|
+
node={node}
|
|
89
|
+
nodeId={nodeId}
|
|
90
|
+
adapter={adapter}
|
|
91
|
+
/>
|
|
92
|
+
</EditorSelectionProvider>
|
|
93
|
+
</ToolErrorBoundary>
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { FieldGroup, FieldRow, NumberInput, Text } from '@volter/editor-sdk/widgets';
|
|
2
|
+
import type { Transform, TransformChannel } from '@volter/editor-project/adapter';
|
|
3
|
+
import { useRef, useState } from 'react';
|
|
4
|
+
import { rotationDegrees, type TransformAxis, withRotationDegrees } from './inspector-transform';
|
|
5
|
+
|
|
6
|
+
/** The industry-convention axis tint (X red, Y green, Z blue) — muted to the
|
|
7
|
+
* panel's palette. A first-time tester reported the three unlabeled number
|
|
8
|
+
* boxes made "Position X" unguessable (runhuman, 2026-08-27); the aria-label
|
|
9
|
+
* alone labels nothing a sighted user can see. */
|
|
10
|
+
const AXIS_COLORS: Record<string, string> = { x: '#e0726d', y: '#83bd66', z: '#6390dd' };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* One row of axis fields, each the editor's shared scrub field (`NumberInput`):
|
|
14
|
+
* drag to scrub, click to type with the whole value selected, commit on
|
|
15
|
+
* Enter/blur. This used to be three native `<input type="number">`s committing
|
|
16
|
+
* on EVERY keystroke — so typing "10" wrote 1 and then 10 (two source writes,
|
|
17
|
+
* two remounts, the second re-rendering the field mid-word: "it didn't give me
|
|
18
|
+
* time to type", runhuman pass 128), and a click landing on the native spinner
|
|
19
|
+
* bumped the value by one before the author typed anything (measured on the
|
|
20
|
+
* GPU instrument: click a field showing -5, type -7 → -47; double-click, type
|
|
21
|
+
* -9 → -459 — runhuman passes 122 and 127's "everything's there, just not
|
|
22
|
+
* where I wanted it").
|
|
23
|
+
*
|
|
24
|
+
* The three callbacks are ONE gesture shape for both scrub and typing: the
|
|
25
|
+
* first change opens it (`onBegin`), every change previews (`onPreview`), the
|
|
26
|
+
* release/Enter commits (`onCommit`) — the same begin/apply/end the gizmo
|
|
27
|
+
* drives, so a scrub is one undo step and one source write.
|
|
28
|
+
*/
|
|
29
|
+
function AxisRow({
|
|
30
|
+
axes,
|
|
31
|
+
label,
|
|
32
|
+
values,
|
|
33
|
+
testidPrefix,
|
|
34
|
+
step,
|
|
35
|
+
precision,
|
|
36
|
+
onBegin,
|
|
37
|
+
onPreview,
|
|
38
|
+
onCommit,
|
|
39
|
+
readOnly,
|
|
40
|
+
readOnlyReason,
|
|
41
|
+
}: {
|
|
42
|
+
readonly axes: Array<{ axis: TransformAxis; name: string }>;
|
|
43
|
+
readonly label: string;
|
|
44
|
+
readonly values: [number, number, number];
|
|
45
|
+
readonly testidPrefix: string;
|
|
46
|
+
readonly step: number;
|
|
47
|
+
readonly precision: number;
|
|
48
|
+
readonly onBegin: (() => void) | undefined;
|
|
49
|
+
readonly onPreview: ((axis: TransformAxis, value: number) => void) | undefined;
|
|
50
|
+
readonly onCommit: (axis: TransformAxis, value: number) => void;
|
|
51
|
+
readonly readOnly: boolean;
|
|
52
|
+
readonly readOnlyReason?: string;
|
|
53
|
+
}) {
|
|
54
|
+
// The value under the hand while a gesture is open: the projection's
|
|
55
|
+
// `values` follow the adapter's own notifications, which need not arrive
|
|
56
|
+
// per scrub move, and a field that lags its own drag reads as stuck.
|
|
57
|
+
const [live, setLive] = useState<{ axis: TransformAxis; value: number } | null>(null);
|
|
58
|
+
const gestureOpen = useRef(false);
|
|
59
|
+
return (
|
|
60
|
+
<FieldRow label={label} style={{ padding: '4px 8px' }}>
|
|
61
|
+
{axes.map(({ axis, name }) => (
|
|
62
|
+
<NumberInput
|
|
63
|
+
key={name}
|
|
64
|
+
testId={`${testidPrefix}-${name}`}
|
|
65
|
+
label={name}
|
|
66
|
+
labelColor={AXIS_COLORS[name]}
|
|
67
|
+
// The reason shows whether or not the field is disabled. A `reason`
|
|
68
|
+
// does not imply `writable: false`: the ingest adapter declares a
|
|
69
|
+
// WRITABLE channel whose reason states that the edit is live-only and
|
|
70
|
+
// names the source line it would have to be written to.
|
|
71
|
+
title={readOnlyReason}
|
|
72
|
+
disabled={readOnly}
|
|
73
|
+
step={step}
|
|
74
|
+
precision={precision}
|
|
75
|
+
value={
|
|
76
|
+
live?.axis === axis ? live.value : Number.isFinite(values[axis]) ? values[axis] : 0
|
|
77
|
+
}
|
|
78
|
+
style={{ flex: 1, minWidth: 0 }}
|
|
79
|
+
onChange={(value) => {
|
|
80
|
+
if (!gestureOpen.current) {
|
|
81
|
+
gestureOpen.current = true;
|
|
82
|
+
onBegin?.();
|
|
83
|
+
}
|
|
84
|
+
setLive({ axis, value });
|
|
85
|
+
onPreview?.(axis, value);
|
|
86
|
+
}}
|
|
87
|
+
onChangeEnd={(value) => {
|
|
88
|
+
gestureOpen.current = false;
|
|
89
|
+
setLive(null);
|
|
90
|
+
onCommit(axis, value);
|
|
91
|
+
}}
|
|
92
|
+
/>
|
|
93
|
+
))}
|
|
94
|
+
</FieldRow>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function InspectorTransformSection({
|
|
99
|
+
dimensions = '3d',
|
|
100
|
+
transform,
|
|
101
|
+
readOnly = false,
|
|
102
|
+
channelEditability,
|
|
103
|
+
note,
|
|
104
|
+
onBegin,
|
|
105
|
+
onPreview,
|
|
106
|
+
onCommit,
|
|
107
|
+
}: {
|
|
108
|
+
readonly dimensions?: '2d' | '3d';
|
|
109
|
+
readonly transform: Transform;
|
|
110
|
+
readonly readOnly?: boolean;
|
|
111
|
+
readonly channelEditability?: Partial<
|
|
112
|
+
Record<TransformChannel, { writable: boolean; reason?: string }>
|
|
113
|
+
>;
|
|
114
|
+
/**
|
|
115
|
+
* A sentence about what editing THESE numbers does, when that is not what a
|
|
116
|
+
* reader would assume — today the world-anchored instanced class
|
|
117
|
+
* (`instanced-presentation.ts`), whose container transform offsets future
|
|
118
|
+
* placements rather than moving the content already on screen.
|
|
119
|
+
*
|
|
120
|
+
* It is a visible line rather than a `title` like the per-channel reasons
|
|
121
|
+
* above, because it is not a refusal to explain on hover: the channels are
|
|
122
|
+
* writable and the surprise arrives after the write.
|
|
123
|
+
*/
|
|
124
|
+
readonly note?: string | undefined;
|
|
125
|
+
/** A gesture is opening — the adapter's `beginEdit` (one undo step, one
|
|
126
|
+
* write, however many previews follow). Optional: a caller with no live
|
|
127
|
+
* path gets `onCommit` alone, which is a complete gesture by itself. */
|
|
128
|
+
readonly onBegin?: () => void;
|
|
129
|
+
/** The value under the hand mid-gesture — the adapter's live `apply`,
|
|
130
|
+
* never a write. */
|
|
131
|
+
readonly onPreview?: (transform: Transform) => void;
|
|
132
|
+
/** The gesture's end — the adapter's `endEdit`, the one write. */
|
|
133
|
+
readonly onCommit: (transform: Transform) => void;
|
|
134
|
+
}) {
|
|
135
|
+
const xyAxes: Array<{ axis: TransformAxis; name: string }> = [
|
|
136
|
+
{ axis: 0, name: 'x' },
|
|
137
|
+
{ axis: 1, name: 'y' },
|
|
138
|
+
];
|
|
139
|
+
const xyzAxes: Array<{ axis: TransformAxis; name: string }> = [...xyAxes, { axis: 2, name: 'z' }];
|
|
140
|
+
const withVector = (axis: TransformAxis, key: 'position' | 'scale', value: number) => {
|
|
141
|
+
const next: Transform = {
|
|
142
|
+
position: [...transform.position] as [number, number, number],
|
|
143
|
+
rotation: [...transform.rotation] as [number, number, number, number],
|
|
144
|
+
scale: [...transform.scale] as [number, number, number],
|
|
145
|
+
};
|
|
146
|
+
next[key][axis] = value;
|
|
147
|
+
return next;
|
|
148
|
+
};
|
|
149
|
+
const vector =
|
|
150
|
+
(key: 'position' | 'scale', deliver: ((transform: Transform) => void) | undefined) =>
|
|
151
|
+
(axis: TransformAxis, value: number) => {
|
|
152
|
+
if (Number.isFinite(value)) deliver?.(withVector(axis, key, value));
|
|
153
|
+
};
|
|
154
|
+
const rotation =
|
|
155
|
+
(deliver: ((transform: Transform) => void) | undefined) =>
|
|
156
|
+
(axis: TransformAxis, value: number) => {
|
|
157
|
+
if (Number.isFinite(value)) deliver?.(withRotationDegrees(transform, axis, value));
|
|
158
|
+
};
|
|
159
|
+
const channelState = (channel: TransformChannel) => {
|
|
160
|
+
const state = channelEditability?.[channel];
|
|
161
|
+
const channelReadOnly = readOnly || state?.writable === false;
|
|
162
|
+
return state?.reason
|
|
163
|
+
? { readOnly: channelReadOnly, readOnlyReason: state.reason }
|
|
164
|
+
: { readOnly: channelReadOnly };
|
|
165
|
+
};
|
|
166
|
+
// A GRAYED FIELD SAYS WHY WHERE THE EYE IS. The reason used to live only in
|
|
167
|
+
// the field's hover title, so a tester who dropped a self-placing prefab
|
|
168
|
+
// met "the Position X field is grayed out and uneditable" and concluded the
|
|
169
|
+
// test could not continue (runhuman pass 130) — the sentence that would
|
|
170
|
+
// have sent them to the component's own code was one hover away. Each
|
|
171
|
+
// distinct reason of a read-only channel is printed once, below the rows.
|
|
172
|
+
const readOnlyReasons = [
|
|
173
|
+
...new Set(
|
|
174
|
+
(['position', 'rotation', 'scale'] as const)
|
|
175
|
+
.map((channel) => channelState(channel))
|
|
176
|
+
.filter((state) => state.readOnly && state.readOnlyReason)
|
|
177
|
+
.map((state) => state.readOnlyReason as string),
|
|
178
|
+
),
|
|
179
|
+
];
|
|
180
|
+
|
|
181
|
+
// No header of its own: the PROJECTION heads every section with its title
|
|
182
|
+
// and icon (`components/InspectionProjection.tsx`), so a "Transform" title
|
|
183
|
+
// printed here would be the second one on screen.
|
|
184
|
+
return (
|
|
185
|
+
<FieldGroup>
|
|
186
|
+
<AxisRow
|
|
187
|
+
axes={dimensions === '2d' ? xyAxes : xyzAxes}
|
|
188
|
+
label="Position"
|
|
189
|
+
testidPrefix="ingest-position"
|
|
190
|
+
values={transform.position}
|
|
191
|
+
step={0.1}
|
|
192
|
+
precision={3}
|
|
193
|
+
{...channelState('position')}
|
|
194
|
+
onBegin={onBegin}
|
|
195
|
+
onPreview={onPreview && vector('position', onPreview)}
|
|
196
|
+
onCommit={vector('position', onCommit)}
|
|
197
|
+
/>
|
|
198
|
+
<AxisRow
|
|
199
|
+
axes={dimensions === '2d' ? [{ axis: 2, name: 'z' }] : xyzAxes}
|
|
200
|
+
label={dimensions === '2d' ? 'Rotation (degrees)' : 'Rotation'}
|
|
201
|
+
testidPrefix="ingest-rotation"
|
|
202
|
+
values={rotationDegrees(transform.rotation)}
|
|
203
|
+
step={1}
|
|
204
|
+
precision={1}
|
|
205
|
+
{...channelState('rotation')}
|
|
206
|
+
onBegin={onBegin}
|
|
207
|
+
onPreview={onPreview && rotation(onPreview)}
|
|
208
|
+
onCommit={rotation(onCommit)}
|
|
209
|
+
/>
|
|
210
|
+
<AxisRow
|
|
211
|
+
axes={dimensions === '2d' ? xyAxes : xyzAxes}
|
|
212
|
+
label="Scale"
|
|
213
|
+
testidPrefix="ingest-scale"
|
|
214
|
+
values={transform.scale}
|
|
215
|
+
step={0.01}
|
|
216
|
+
precision={3}
|
|
217
|
+
{...channelState('scale')}
|
|
218
|
+
onBegin={onBegin}
|
|
219
|
+
onPreview={onPreview && vector('scale', onPreview)}
|
|
220
|
+
onCommit={vector('scale', onCommit)}
|
|
221
|
+
/>
|
|
222
|
+
{readOnlyReasons.map((reason) => (
|
|
223
|
+
<Text
|
|
224
|
+
key={reason}
|
|
225
|
+
data-testid="inspector-transform-readonly-reason"
|
|
226
|
+
variant="caption"
|
|
227
|
+
tone="muted"
|
|
228
|
+
style={{ display: 'block', padding: '4px 8px', overflowWrap: 'anywhere' }}
|
|
229
|
+
>
|
|
230
|
+
{reason}
|
|
231
|
+
</Text>
|
|
232
|
+
))}
|
|
233
|
+
{note && (
|
|
234
|
+
<Text
|
|
235
|
+
data-testid="inspector-transform-note"
|
|
236
|
+
variant="caption"
|
|
237
|
+
tone="muted"
|
|
238
|
+
style={{ display: 'block', padding: '4px 8px', overflowWrap: 'anywhere' }}
|
|
239
|
+
>
|
|
240
|
+
{note}
|
|
241
|
+
</Text>
|
|
242
|
+
)}
|
|
243
|
+
</FieldGroup>
|
|
244
|
+
);
|
|
245
|
+
}
|