@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,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Inspector` — the connected inspector: it RESOLVES what is being inspected
|
|
3
|
+
* and hands it to a projection. It renders no content of its own.
|
|
4
|
+
*
|
|
5
|
+
* Two halves, and the split is the whole point:
|
|
6
|
+
* - the MODEL side is `inspection/use-active-inspection.ts` → ONE
|
|
7
|
+
* {@link InspectionDisplay} (`inspection/display.ts`): the composed
|
|
8
|
+
* subject, its surface, whether an inspector exists at all, and which
|
|
9
|
+
* projection shows it. the workspace host gates the dock panel
|
|
10
|
+
* and the floating card on the SAME hook, so "the dock floats a card while
|
|
11
|
+
* the inspector renders a column" is not a state the app can reach;
|
|
12
|
+
* - the VIEW side is `components/InspectionProjection.tsx`, which reads
|
|
13
|
+
* identity/verbs/sections off the subject and knows nothing else.
|
|
14
|
+
*
|
|
15
|
+
* `inspection/compose.ts` is the one assembler: the active
|
|
16
|
+
* {@link AuthoringAdapter}'s providers (`hierarchy` / `selection` /
|
|
17
|
+
* `transforms` / `inspector`) plus whatever `inspector-section-registry.ts`
|
|
18
|
+
* registrations match become ONE `InspectionSubject`. Which built-ins a
|
|
19
|
+
* contribution replaces (by CLAIMING their section ids) is resolved there and
|
|
20
|
+
* is never visible here.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { faUpRightAndDownLeftFromCenter } from '@fortawesome/free-solid-svg-icons';
|
|
24
|
+
import { EditorIcon, IconButton, Panel, themeVars } from '@volter/editor-sdk/widgets';
|
|
25
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
26
|
+
import { useEffect, useReducer, useSyncExternalStore } from 'react';
|
|
27
|
+
import { assetSelectionVersion, subscribeAssetSelection } from '../asset-selection';
|
|
28
|
+
import { getActiveCamera } from '../authoring/active-systems';
|
|
29
|
+
import { resolvePanelAuthoring } from '../authoring/panel-authoring';
|
|
30
|
+
import { useAvailabilitySelector } from '../availability-tick';
|
|
31
|
+
import { useEditorStore } from '../editor-runtime';
|
|
32
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
33
|
+
import { setActiveScope } from '../hotkeys';
|
|
34
|
+
import { composeInspectionForBinding } from '../inspection/active-subject';
|
|
35
|
+
import type { InspectionPresentation, InspectionSurfaceKind } from '../inspection/model';
|
|
36
|
+
import { useActiveInspection } from '../inspection/use-active-inspection';
|
|
37
|
+
import { setInspectorPresentationOverride } from '../inspector-presentation';
|
|
38
|
+
import {
|
|
39
|
+
inspectorSectionRegistryVersion,
|
|
40
|
+
subscribeInspectorSectionRegistry,
|
|
41
|
+
} from '../inspector-section-registry';
|
|
42
|
+
import { liveAuthoringRefusal } from '../live-session-registry';
|
|
43
|
+
import { projectMounts } from '../project-shape';
|
|
44
|
+
import type { WorkspaceDocumentSelection } from '../workspace-document-registry';
|
|
45
|
+
import { InspectionProjectionView } from './InspectionProjection';
|
|
46
|
+
|
|
47
|
+
export interface AuthoringInspectorSurfaceProps {
|
|
48
|
+
readonly store: EditorShellStore;
|
|
49
|
+
readonly adapter: AuthoringAdapter;
|
|
50
|
+
readonly documentSelection: WorkspaceDocumentSelection | null;
|
|
51
|
+
/** The RESOLVED presentation for this surface (`inspection/display.ts`):
|
|
52
|
+
* `'card'` tabs the sections behind icon buttons in the bottom-right card,
|
|
53
|
+
* `'column'` stacks them in the classic column, `'properties'` tabs them
|
|
54
|
+
* behind a vertical rail in that same column. Omitted (bounded
|
|
55
|
+
* design-system hosts) behaves as `'column'` without the mode-switch
|
|
56
|
+
* affordance — presentation is the live shell's concern. */
|
|
57
|
+
readonly presentation?: InspectionPresentation;
|
|
58
|
+
/** Which surface this is — the key the mode-switch affordances write their
|
|
59
|
+
* override under, so a preference expressed here changes no other
|
|
60
|
+
* surface. Omitted alongside `presentation`. */
|
|
61
|
+
readonly surface?: InspectionSurfaceKind;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The honest copy for an adapter with NO inspector surface at all — a
|
|
66
|
+
* `{ module }` root that publishes none, or an ingested native-React world
|
|
67
|
+
* (no-authoring by design, D-N8). It is deliberately not a projection of a
|
|
68
|
+
* subject — there is no subject, because the adapter cannot describe one.
|
|
69
|
+
*/
|
|
70
|
+
function NoAuthoringInspector({
|
|
71
|
+
presentation,
|
|
72
|
+
surface,
|
|
73
|
+
}: {
|
|
74
|
+
readonly presentation: InspectionPresentation | undefined;
|
|
75
|
+
readonly surface?: InspectionSurfaceKind | undefined;
|
|
76
|
+
}) {
|
|
77
|
+
const authoringRefusal = liveAuthoringRefusal();
|
|
78
|
+
const noAuthoringNote = (
|
|
79
|
+
<div
|
|
80
|
+
data-testid="no-authoring-note"
|
|
81
|
+
style={{
|
|
82
|
+
padding: 12,
|
|
83
|
+
color: themeVars.semantic.warning,
|
|
84
|
+
fontSize: 'var(--vgai-font-md)',
|
|
85
|
+
lineHeight: 1.5,
|
|
86
|
+
}}
|
|
87
|
+
>
|
|
88
|
+
{authoringRefusal !== null ? (
|
|
89
|
+
<>
|
|
90
|
+
<strong>Nothing to author.</strong> {authoringRefusal}
|
|
91
|
+
</>
|
|
92
|
+
) : (
|
|
93
|
+
<>
|
|
94
|
+
<strong>Nothing to author.</strong> This root's adapter publishes no inspector surface, so
|
|
95
|
+
there is nothing here to describe or edit. The root is still hosted, sized, and disposed;
|
|
96
|
+
play it in the Game tab.
|
|
97
|
+
</>
|
|
98
|
+
)}
|
|
99
|
+
</div>
|
|
100
|
+
);
|
|
101
|
+
// The one affordance back to the narrow column: this card has no subject and
|
|
102
|
+
// no icon strip, so without it a collapsed nothing-to-author card has no
|
|
103
|
+
// route back. Shown only in the live shell (a known `surface`).
|
|
104
|
+
const expandRow = surface ? (
|
|
105
|
+
<div style={{ display: 'flex', justifyContent: 'flex-end', padding: '2px 4px' }}>
|
|
106
|
+
<IconButton
|
|
107
|
+
size="compact"
|
|
108
|
+
data-testid="inspector-expand"
|
|
109
|
+
aria-label="Expand inspector to side panel"
|
|
110
|
+
title="Expand inspector to side panel"
|
|
111
|
+
onClick={() => setInspectorPresentationOverride(surface, 'column')}
|
|
112
|
+
>
|
|
113
|
+
<EditorIcon icon={faUpRightAndDownLeftFromCenter} />
|
|
114
|
+
</IconButton>
|
|
115
|
+
</div>
|
|
116
|
+
) : null;
|
|
117
|
+
if (presentation === 'card') {
|
|
118
|
+
return (
|
|
119
|
+
<div
|
|
120
|
+
className="vgai-mini-inspector"
|
|
121
|
+
data-testid="inspector-panel"
|
|
122
|
+
data-vgai-inspector-presentation="card"
|
|
123
|
+
onPointerDown={() => setActiveScope('inspector')}
|
|
124
|
+
>
|
|
125
|
+
{expandRow}
|
|
126
|
+
{noAuthoringNote}
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return (
|
|
131
|
+
<Panel
|
|
132
|
+
name="Inspector (nothing to author)"
|
|
133
|
+
hideHeader
|
|
134
|
+
className="vgai-content-frost"
|
|
135
|
+
data-testid="inspector-panel"
|
|
136
|
+
onPointerDown={() => setActiveScope('inspector')}
|
|
137
|
+
>
|
|
138
|
+
{noAuthoringNote}
|
|
139
|
+
</Panel>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Production authoring Inspector with explicit application dependencies —
|
|
145
|
+
* the BOUNDED host entry point (design-system stories): it composes a subject
|
|
146
|
+
* from the adapter it is handed and projects it, so a host can exercise this
|
|
147
|
+
* exact surface through an adapter fixture instead of reproducing its fields
|
|
148
|
+
* in a visual facsimile. The live shell does NOT come through here; it goes
|
|
149
|
+
* through {@link Inspector}, which reads the one shared resolution.
|
|
150
|
+
*
|
|
151
|
+
* "Composes" is the SAME call either way — `composeInspectionForBinding`
|
|
152
|
+
* (`inspection/active-subject.ts`). The two paths differ only in where the
|
|
153
|
+
* binding comes from: handed in here, resolved from live state there.
|
|
154
|
+
*/
|
|
155
|
+
export function AuthoringInspectorSurface({
|
|
156
|
+
store,
|
|
157
|
+
adapter,
|
|
158
|
+
documentSelection,
|
|
159
|
+
presentation,
|
|
160
|
+
surface,
|
|
161
|
+
}: AuthoringInspectorSurfaceProps) {
|
|
162
|
+
useSyncExternalStore(store.subscribe, store.getSnapshot);
|
|
163
|
+
// Project inspector TOOLS register asynchronously (folder scan) and
|
|
164
|
+
// re-register on HMR, possibly while a matching selection is showing; the
|
|
165
|
+
// §5.1 asset selection is another context registrations key on.
|
|
166
|
+
useSyncExternalStore(subscribeInspectorSectionRegistry, inspectorSectionRegistryVersion);
|
|
167
|
+
useSyncExternalStore(subscribeAssetSelection, assetSelectionVersion);
|
|
168
|
+
const [, forceAdapterUpdate] = useReducer((value: number) => value + 1, 0);
|
|
169
|
+
useEffect(() => adapter.subscribe?.(forceAdapterUpdate), [adapter]);
|
|
170
|
+
if (!adapter.capabilities.inspectorFields) {
|
|
171
|
+
return <NoAuthoringInspector presentation={presentation} {...(surface ? { surface } : {})} />;
|
|
172
|
+
}
|
|
173
|
+
const { subject } = composeInspectionForBinding({
|
|
174
|
+
store,
|
|
175
|
+
adapter,
|
|
176
|
+
documentSelection,
|
|
177
|
+
surface,
|
|
178
|
+
});
|
|
179
|
+
return (
|
|
180
|
+
<InspectionProjectionView
|
|
181
|
+
subject={subject}
|
|
182
|
+
presentation={presentation ?? 'column'}
|
|
183
|
+
{...(surface ? { surface } : {})}
|
|
184
|
+
/>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* The LIVE inspector. Whether it shows at all, which layout it uses, and what
|
|
190
|
+
* is in it are all the ONE resolution
|
|
191
|
+
* (`inspection/use-active-inspection.ts`) the workspace gates on — read here,
|
|
192
|
+
* never re-derived. Every surface goes through it, an open asset document
|
|
193
|
+
* included: that document is the three paradigm scoped to a subtree, so the
|
|
194
|
+
* same box rides over it as rides over the scene.
|
|
195
|
+
*/
|
|
196
|
+
export function Inspector() {
|
|
197
|
+
const store = useEditorStore();
|
|
198
|
+
// A camera controller may register after Play's first React commit. Keep the
|
|
199
|
+
// contribution match live without making the inspection model own runtime
|
|
200
|
+
// system state; availability-tick is the existing late-capability seam used
|
|
201
|
+
// by the Profiler and Frame debugger for the same reason.
|
|
202
|
+
useAvailabilitySelector(() => getActiveCamera());
|
|
203
|
+
const display = useActiveInspection(store);
|
|
204
|
+
const { adapter } = resolvePanelAuthoring(store);
|
|
205
|
+
if (!display.available) return null;
|
|
206
|
+
if (!adapter.capabilities.inspectorFields) {
|
|
207
|
+
// A subject the shared resolver composed WITHOUT the adapter's fields —
|
|
208
|
+
// an ingest's coverage row, or the project's own asset selection (a
|
|
209
|
+
// model picked in Content, whose kind's asset inspector takes it from
|
|
210
|
+
// there) — renders through the ordinary projection. The nothing-to-author
|
|
211
|
+
// note is the floor for a MOUNTED root whose adapter describes nothing;
|
|
212
|
+
// a project that mounts nothing has no root to say that about, and with
|
|
213
|
+
// nothing selected the inspector shows nothing.
|
|
214
|
+
if (display.subject.identity !== null || display.subject.sections.length > 0) {
|
|
215
|
+
return (
|
|
216
|
+
<InspectionProjectionView
|
|
217
|
+
subject={display.subject}
|
|
218
|
+
presentation={display.presentation}
|
|
219
|
+
surface={display.surface}
|
|
220
|
+
/>
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
if (!projectMounts()) return null;
|
|
224
|
+
return <NoAuthoringInspector presentation={display.presentation} surface={display.surface} />;
|
|
225
|
+
}
|
|
226
|
+
return (
|
|
227
|
+
<InspectionProjectionView
|
|
228
|
+
subject={display.subject}
|
|
229
|
+
presentation={display.presentation}
|
|
230
|
+
surface={display.surface}
|
|
231
|
+
/>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** The Inspector image captured from an existing native authoring viewport. */
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
export function InspectorCanvasPreview({
|
|
6
|
+
capture,
|
|
7
|
+
previewKey,
|
|
8
|
+
size,
|
|
9
|
+
}: {
|
|
10
|
+
readonly capture: (size: number) => Promise<string | null>;
|
|
11
|
+
readonly previewKey: string;
|
|
12
|
+
readonly size: number;
|
|
13
|
+
}) {
|
|
14
|
+
const [url, setUrl] = useState<string | null>(null);
|
|
15
|
+
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
let cancelled = false;
|
|
18
|
+
setUrl(null);
|
|
19
|
+
void capture(size).then(
|
|
20
|
+
(next) => {
|
|
21
|
+
if (!cancelled) setUrl(next);
|
|
22
|
+
},
|
|
23
|
+
() => {
|
|
24
|
+
if (!cancelled) setUrl(null);
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
return () => {
|
|
28
|
+
cancelled = true;
|
|
29
|
+
};
|
|
30
|
+
}, [capture, previewKey, size]);
|
|
31
|
+
|
|
32
|
+
return url ? (
|
|
33
|
+
<img src={url} alt="Selected object preview" className="vgai-component-thumbnail" />
|
|
34
|
+
) : null;
|
|
35
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE renderer for an inspection section whose body is `kind: 'fields'`
|
|
3
|
+
* (`inspection/model.ts`) — a `FieldDescriptor` list plus the io that reads
|
|
4
|
+
* and writes it. Extracted verbatim from `components/Inspector.tsx`'s former
|
|
5
|
+
* inline `renderProperty`, so the stacked column and the compact card render
|
|
6
|
+
* a field identically: one per-`type` switch, one revert arrow rule, one
|
|
7
|
+
* testid rule.
|
|
8
|
+
*
|
|
9
|
+
* Chrome (a collapsible title, a group's `data-testid`) belongs to the
|
|
10
|
+
* PROJECTION, not here — this component renders rows and nothing else.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { faRotateLeft } from '@fortawesome/free-solid-svg-icons';
|
|
14
|
+
import {
|
|
15
|
+
AssetSlotPicker,
|
|
16
|
+
Checkbox,
|
|
17
|
+
DraftTextInput,
|
|
18
|
+
EditorIcon,
|
|
19
|
+
IconButton,
|
|
20
|
+
LABEL_COL_WIDTH,
|
|
21
|
+
Select,
|
|
22
|
+
TextArea,
|
|
23
|
+
themeVars,
|
|
24
|
+
Vec3Input,
|
|
25
|
+
} from '@volter/editor-sdk/widgets';
|
|
26
|
+
import { useState } from 'react';
|
|
27
|
+
import {
|
|
28
|
+
type FieldDescriptor,
|
|
29
|
+
fieldReadonlyReason,
|
|
30
|
+
type InspectionFieldIo,
|
|
31
|
+
isMixed,
|
|
32
|
+
} from '../inspection/model';
|
|
33
|
+
import { revertActionLabel } from './inspector-revert-label';
|
|
34
|
+
import { DraftColorInput } from './primitives/DraftColorInput';
|
|
35
|
+
import { useProjectImageAssets } from './use-project-image-assets';
|
|
36
|
+
|
|
37
|
+
/** Layout-only remnant of the old hand-rolled field style — chrome now comes
|
|
38
|
+
* from the shared `.vgai-input`/`.vgai-select` classes (theme.css), so
|
|
39
|
+
* every field here shares one height/padding/radius/focus treatment. */
|
|
40
|
+
const NUM_STYLE: React.CSSProperties = { width: 64 };
|
|
41
|
+
|
|
42
|
+
/** Row label (label-left/field-right grammar) — one width via
|
|
43
|
+
* `LABEL_COL_WIDTH` (I-13). */
|
|
44
|
+
export const ROW_LABEL_STYLE: React.CSSProperties = {
|
|
45
|
+
width: LABEL_COL_WIDTH,
|
|
46
|
+
fontSize: 'var(--vgai-font-md)',
|
|
47
|
+
color: themeVars.content.muted,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/** One rule, no exceptions: `visible` used to get a hand-carved
|
|
51
|
+
* `ingest-visible` testid for an e2e spec that no longer exists. */
|
|
52
|
+
function testidFor(path: string): string {
|
|
53
|
+
return `ingest-prop-${path.replace(/\./g, '-')}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The `asset` row's control — a project-asset slot (a material's texture map).
|
|
58
|
+
*
|
|
59
|
+
* Its own component because it holds two things a stateless row cannot: the
|
|
60
|
+
* shared project-image scan, and WHAT THE LAST ASSIGNMENT ANSWERED. The second
|
|
61
|
+
* is the point — a slot whose live half worked and whose file half did not is
|
|
62
|
+
* indistinguishable from a saved edit unless the ack is shown, so the write
|
|
63
|
+
* pipe's `persisted: false` is rendered here rather than dropped on the floor.
|
|
64
|
+
*/
|
|
65
|
+
function AssetFieldControl({
|
|
66
|
+
field,
|
|
67
|
+
io,
|
|
68
|
+
value,
|
|
69
|
+
}: {
|
|
70
|
+
readonly field: FieldDescriptor;
|
|
71
|
+
readonly io: InspectionFieldIo;
|
|
72
|
+
readonly value: string;
|
|
73
|
+
}) {
|
|
74
|
+
const { paths, failures } = useProjectImageAssets(true);
|
|
75
|
+
// The ack is remembered WITH the value it answered for. A row is reused as
|
|
76
|
+
// the selection moves between subjects that both publish this path, so an
|
|
77
|
+
// ack held on its own would go on claiming "not saved" about an edit made to
|
|
78
|
+
// something else — the exact confusion the note exists to prevent.
|
|
79
|
+
const [ack, setAck] = useState<{ readonly forValue: string; readonly text: string } | null>(null);
|
|
80
|
+
const assign = (next: string): void => {
|
|
81
|
+
setAck(null);
|
|
82
|
+
// An empty selection CLEARS the slot; `null` is the value an adapter reads
|
|
83
|
+
// as "no asset", not the empty string, which would be a path of length 0.
|
|
84
|
+
void Promise.resolve(io.set(field.path, next === '' ? null : next)).then((answer) => {
|
|
85
|
+
setAck(
|
|
86
|
+
answer && !answer.persisted
|
|
87
|
+
? {
|
|
88
|
+
forValue: next,
|
|
89
|
+
text: `Not saved — ${answer.destination}. See the editor console for the mechanism.`,
|
|
90
|
+
}
|
|
91
|
+
: null,
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
const ackNote = ack?.forValue === value ? ack.text : undefined;
|
|
96
|
+
const scanNote =
|
|
97
|
+
failures.length > 0
|
|
98
|
+
? `${failures.length} folder(s) under public/ could not be read — this list may be incomplete.`
|
|
99
|
+
: undefined;
|
|
100
|
+
return (
|
|
101
|
+
<AssetSlotPicker
|
|
102
|
+
testId={testidFor(field.path)}
|
|
103
|
+
value={value}
|
|
104
|
+
options={paths}
|
|
105
|
+
previewUrlFor={(path) => `/${path}`}
|
|
106
|
+
disabled={field.readonly}
|
|
107
|
+
note={ackNote ?? scanNote}
|
|
108
|
+
onChange={assign}
|
|
109
|
+
/>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function InspectorField({
|
|
114
|
+
field,
|
|
115
|
+
io,
|
|
116
|
+
}: {
|
|
117
|
+
readonly field: FieldDescriptor;
|
|
118
|
+
readonly io: InspectionFieldIo;
|
|
119
|
+
}) {
|
|
120
|
+
const p = field;
|
|
121
|
+
const raw = io.get(p.path);
|
|
122
|
+
// MIXED means "these subjects disagree" — there is no single value to show,
|
|
123
|
+
// which is exactly the blank/placeholder rendering an unset field already
|
|
124
|
+
// has. Normalized once, here, so no field widget below carries a second
|
|
125
|
+
// notion of emptiness.
|
|
126
|
+
const v = isMixed(raw) ? undefined : raw;
|
|
127
|
+
// UNSET: the document does not carry this property AND nobody could tell us
|
|
128
|
+
// what governs it in absence (a library component's defaults live in its
|
|
129
|
+
// implementation, not its type). Render it as genuinely blank — a `0` in a
|
|
130
|
+
// number field or an unchecked box would be a claim about the value, and
|
|
131
|
+
// `gravityScale` actually defaults to 1, `canSleep` to true. The field is
|
|
132
|
+
// still editable: typing into it writes the property for the first time.
|
|
133
|
+
const unset = p.defaulted === true && v === undefined;
|
|
134
|
+
const readonlyReason = p.readonly ? fieldReadonlyReason(p) : undefined;
|
|
135
|
+
/** The revert arrow, rendered only on rows the adapter says can lose their
|
|
136
|
+
* override. Occupies no space otherwise, so rows stay aligned. */
|
|
137
|
+
const revertButton = p.resettable ? (
|
|
138
|
+
<IconButton
|
|
139
|
+
data-testid={`ingest-revert-${p.path.replace(/\./g, '-')}`}
|
|
140
|
+
aria-label={revertActionLabel(p)}
|
|
141
|
+
title={revertActionLabel(p)}
|
|
142
|
+
onClick={() => io.remove?.(p.path)}
|
|
143
|
+
>
|
|
144
|
+
<EditorIcon icon={faRotateLeft} />
|
|
145
|
+
</IconButton>
|
|
146
|
+
) : null;
|
|
147
|
+
|
|
148
|
+
if (p.type === 'boolean') {
|
|
149
|
+
return (
|
|
150
|
+
<label
|
|
151
|
+
title={readonlyReason}
|
|
152
|
+
style={{
|
|
153
|
+
display: 'flex',
|
|
154
|
+
gap: 6,
|
|
155
|
+
alignItems: 'center',
|
|
156
|
+
padding: '6px 8px',
|
|
157
|
+
fontSize: 'var(--vgai-font-md)',
|
|
158
|
+
}}
|
|
159
|
+
>
|
|
160
|
+
<Checkbox
|
|
161
|
+
data-testid={testidFor(p.path)}
|
|
162
|
+
checked={Boolean(v)}
|
|
163
|
+
// Indeterminate says "not set here" without claiming false.
|
|
164
|
+
ref={(el: HTMLInputElement | null) => {
|
|
165
|
+
if (el) el.indeterminate = unset;
|
|
166
|
+
}}
|
|
167
|
+
disabled={p.readonly}
|
|
168
|
+
onChange={(e) => io.set(p.path, e.target.checked)}
|
|
169
|
+
/>
|
|
170
|
+
<span style={p.defaulted ? { color: themeVars.content.dim } : undefined}>{p.label}</span>
|
|
171
|
+
{revertButton}
|
|
172
|
+
</label>
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
return (
|
|
176
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '6px 8px' }}>
|
|
177
|
+
{/* A defaulted row is greyed: the value is the owner's declared
|
|
178
|
+
default, not something this document says. Editing it writes the
|
|
179
|
+
property in for the first time. */}
|
|
180
|
+
<span
|
|
181
|
+
style={p.defaulted ? { ...ROW_LABEL_STYLE, color: themeVars.content.dim } : ROW_LABEL_STYLE}
|
|
182
|
+
title={readonlyReason ?? (p.defaulted ? `${p.label} — default (not set here)` : p.label)}
|
|
183
|
+
>
|
|
184
|
+
{p.label}
|
|
185
|
+
</span>
|
|
186
|
+
{p.type === 'color' ? (
|
|
187
|
+
<DraftColorInput
|
|
188
|
+
data-testid={p.path === 'material.color' ? 'ingest-color' : testidFor(p.path)}
|
|
189
|
+
value={(v as string) ?? '#ffffff'}
|
|
190
|
+
disabled={p.readonly}
|
|
191
|
+
onCommit={(next) => io.set(p.path, next)}
|
|
192
|
+
// Live while the picker is open (adapters that cannot show a value
|
|
193
|
+
// without writing it omit `preview`, and this is a no-op).
|
|
194
|
+
onPreview={(next) => io.preview?.(p.path, next)}
|
|
195
|
+
/>
|
|
196
|
+
) : p.type === 'number' ? (
|
|
197
|
+
<DraftTextInput
|
|
198
|
+
type="number"
|
|
199
|
+
data-testid={testidFor(p.path)}
|
|
200
|
+
disabled={p.readonly}
|
|
201
|
+
value={typeof v === 'number' ? String(Math.round(v * 1000) / 1000) : ''}
|
|
202
|
+
placeholder={unset ? '—' : undefined}
|
|
203
|
+
onCommit={(text) => {
|
|
204
|
+
const parsed = Number.parseFloat(text);
|
|
205
|
+
if (Number.isFinite(parsed)) io.set(p.path, parsed);
|
|
206
|
+
}}
|
|
207
|
+
style={NUM_STYLE}
|
|
208
|
+
/>
|
|
209
|
+
) : p.type === 'enum' ? (
|
|
210
|
+
<Select
|
|
211
|
+
data-testid={testidFor(p.path)}
|
|
212
|
+
disabled={p.readonly}
|
|
213
|
+
value={String(v ?? '')}
|
|
214
|
+
onChange={(e) => {
|
|
215
|
+
const value =
|
|
216
|
+
p.options?.find((option) => String(option) === e.target.value) ?? e.target.value;
|
|
217
|
+
io.set(p.path, value);
|
|
218
|
+
}}
|
|
219
|
+
style={{ width: 120 }}
|
|
220
|
+
>
|
|
221
|
+
{unset && <option value="">—</option>}
|
|
222
|
+
{(p.options ?? []).map((option) => (
|
|
223
|
+
<option key={String(option)} value={String(option)}>
|
|
224
|
+
{String(option)}
|
|
225
|
+
</option>
|
|
226
|
+
))}
|
|
227
|
+
</Select>
|
|
228
|
+
) : p.type === 'vec3' ? (
|
|
229
|
+
<div style={{ width: 190 }}>
|
|
230
|
+
<Vec3Input
|
|
231
|
+
value={
|
|
232
|
+
Array.isArray(v) && v.length === 3
|
|
233
|
+
? [Number(v[0]), Number(v[1]), Number(v[2])]
|
|
234
|
+
: [null, null, null]
|
|
235
|
+
}
|
|
236
|
+
disabled={Boolean(p.readonly)}
|
|
237
|
+
testIdPrefix={testidFor(p.path)}
|
|
238
|
+
onChange={(value) => io.set(p.path, value)}
|
|
239
|
+
/>
|
|
240
|
+
</div>
|
|
241
|
+
) : p.type === 'asset' ? (
|
|
242
|
+
<AssetFieldControl field={p} io={io} value={typeof v === 'string' ? v : ''} />
|
|
243
|
+
) : p.type === 'json' ? (
|
|
244
|
+
<TextArea
|
|
245
|
+
key={`${p.path}:${JSON.stringify(v ?? null)}`}
|
|
246
|
+
data-testid={testidFor(p.path)}
|
|
247
|
+
data-variant="code"
|
|
248
|
+
disabled={p.readonly}
|
|
249
|
+
defaultValue={unset ? '' : JSON.stringify(v ?? null)}
|
|
250
|
+
placeholder={unset ? '—' : undefined}
|
|
251
|
+
onBlur={(event) => {
|
|
252
|
+
try {
|
|
253
|
+
io.set(p.path, JSON.parse(event.target.value));
|
|
254
|
+
} catch {
|
|
255
|
+
// Keep the authored value unchanged until the edit is valid JSON.
|
|
256
|
+
}
|
|
257
|
+
}}
|
|
258
|
+
style={{ width: 160 }}
|
|
259
|
+
/>
|
|
260
|
+
) : (
|
|
261
|
+
<DraftTextInput
|
|
262
|
+
type="text"
|
|
263
|
+
data-testid={testidFor(p.path)}
|
|
264
|
+
readOnly={p.readonly}
|
|
265
|
+
value={String(v ?? '')}
|
|
266
|
+
placeholder={unset ? '—' : undefined}
|
|
267
|
+
onCommit={(text) => io.set(p.path, text)}
|
|
268
|
+
style={{ width: 120 }}
|
|
269
|
+
/>
|
|
270
|
+
)}
|
|
271
|
+
{revertButton}
|
|
272
|
+
</div>
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export function InspectorFieldsSection({
|
|
277
|
+
fields,
|
|
278
|
+
io,
|
|
279
|
+
}: {
|
|
280
|
+
readonly fields: readonly FieldDescriptor[];
|
|
281
|
+
readonly io: InspectionFieldIo;
|
|
282
|
+
}) {
|
|
283
|
+
return (
|
|
284
|
+
<>
|
|
285
|
+
{fields.map((field) => (
|
|
286
|
+
<InspectorField key={field.path} field={field} io={io} />
|
|
287
|
+
))}
|
|
288
|
+
</>
|
|
289
|
+
);
|
|
290
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type * as THREE from 'three';
|
|
2
|
+
import { Object3DSnapshotDocument } from './asset-viewers/EntityModelDocument';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Inspector-sized projection of the canonical Asset Lab viewport, over a live
|
|
6
|
+
* `Object3D` the caller already has in hand.
|
|
7
|
+
*
|
|
8
|
+
* It takes the OBJECT, not an id to look one up by: a subject's preview is
|
|
9
|
+
* composed only when the thing is genuinely previewable
|
|
10
|
+
* (`inspection/compose.ts`), and the object the composer proved exists is the
|
|
11
|
+
* one rendered here. A scene node and a part inside an asset document are
|
|
12
|
+
* therefore the same case — the part is not in the shell's object map, and
|
|
13
|
+
* with an id this component could only have shown a "no longer available"
|
|
14
|
+
* alert for a thing that is right there on screen.
|
|
15
|
+
*
|
|
16
|
+
* Every host passes `fill`: the section body's square box, the compact card's
|
|
17
|
+
* round disc, and the minimized card's round thumb all own their own geometry
|
|
18
|
+
* and this component just fills it.
|
|
19
|
+
*/
|
|
20
|
+
export function InspectorObjectPreview({
|
|
21
|
+
previewKey,
|
|
22
|
+
object,
|
|
23
|
+
displayName,
|
|
24
|
+
fill = false,
|
|
25
|
+
}: {
|
|
26
|
+
/** Stable identity for the isolated preview document. */
|
|
27
|
+
previewKey: string;
|
|
28
|
+
object: THREE.Object3D;
|
|
29
|
+
displayName: string;
|
|
30
|
+
fill?: boolean;
|
|
31
|
+
}) {
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
data-testid="inspector-object-preview"
|
|
35
|
+
style={
|
|
36
|
+
fill
|
|
37
|
+
? { position: 'absolute', inset: 0, overflow: 'hidden' }
|
|
38
|
+
: {
|
|
39
|
+
width: '100%',
|
|
40
|
+
height: 220,
|
|
41
|
+
minHeight: 220,
|
|
42
|
+
borderBottom: '1px solid var(--vgai-structural-divider)',
|
|
43
|
+
overflow: 'hidden',
|
|
44
|
+
position: 'relative',
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
>
|
|
48
|
+
<Object3DSnapshotDocument
|
|
49
|
+
documentId={`inspector-preview:${previewKey}`}
|
|
50
|
+
source={object}
|
|
51
|
+
displayName={displayName}
|
|
52
|
+
active
|
|
53
|
+
chromeless
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
56
|
+
);
|
|
57
|
+
}
|