@volter/sdk 0.0.0-stage → 0.5.203
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/LICENSE +202 -0
- package/NOTICE +20 -0
- package/README.md +38 -3
- package/package.json +510 -4
- package/src/account.ts +210 -0
- package/src/chrome.ts +88 -0
- package/src/client.ts +1646 -0
- package/src/commands.ts +66 -0
- package/src/contributions.ts +619 -0
- package/src/css-numeric-style.ts +97 -0
- package/src/document-probe.ts +282 -0
- package/src/editor-view.ts +225 -0
- package/src/extension.ts +40 -0
- package/src/generations.ts +178 -0
- package/src/host.ts +1157 -0
- package/src/http-transport.browser.ts +14 -0
- package/src/http-transport.node.ts +19 -0
- package/src/index.ts +131 -0
- package/src/kit/CapabilityCoverageSection.tsx +185 -0
- package/src/kit/account-client.ts +333 -0
- package/src/kit/action-registry.ts +317 -0
- package/src/kit/active-product.ts +76 -0
- package/src/kit/active-project.ts +155 -0
- package/src/kit/adapter-editor-config.ts +25 -0
- package/src/kit/adapter-module.ts +7 -0
- package/src/kit/adapter-observation.ts +49 -0
- package/src/kit/animation/animation-clock.ts +479 -0
- package/src/kit/animation/stage-transport.ts +385 -0
- package/src/kit/api/assets.ts +365 -0
- package/src/kit/api/project-open.ts +355 -0
- package/src/kit/api/project-source.ts +180 -0
- package/src/kit/api/project-state.ts +110 -0
- package/src/kit/api/relay.ts +270 -0
- package/src/kit/api/themes.ts +45 -0
- package/src/kit/api-asset-library-wire.ts +45 -0
- package/src/kit/api-base.ts +10 -0
- package/src/kit/api-build.ts +99 -0
- package/src/kit/api-git-wire.ts +56 -0
- package/src/kit/api-logs.ts +92 -0
- package/src/kit/api-project-identity.ts +74 -0
- package/src/kit/api-settings.ts +36 -0
- package/src/kit/api-worktrees.ts +205 -0
- package/src/kit/asset-capabilities.ts +344 -0
- package/src/kit/asset-compare-core.ts +171 -0
- package/src/kit/asset-editor-context.tsx +101 -0
- package/src/kit/asset-events.ts +96 -0
- package/src/kit/asset-inspector-actions.ts +87 -0
- package/src/kit/asset-selection-viewer-registry.ts +113 -0
- package/src/kit/asset-selection.ts +146 -0
- package/src/kit/asset-thumbnails.ts +25 -0
- package/src/kit/asset-viewers.ts +115 -0
- package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/kit/asset-workflow/asset-ledger.ts +156 -0
- package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/kit/asset-workflow/asset-types.ts +142 -0
- package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
- package/src/kit/asset-workflow/audio-waveform.ts +22 -0
- package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/kit/asset-workflow/image-view-scale.ts +31 -0
- package/src/kit/asset-workflow/import-contract.ts +124 -0
- package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
- package/src/kit/asset-workflow/project-content.ts +288 -0
- package/src/kit/asset-workflow/project-source-index.ts +545 -0
- package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
- package/src/kit/authoring/active-adapter.ts +200 -0
- package/src/kit/authoring/active-systems.ts +422 -0
- package/src/kit/authoring/adapter-key.ts +18 -0
- package/src/kit/authoring/authoring-asset-url.ts +27 -0
- package/src/kit/authoring/bootstrap-state.ts +49 -0
- package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
- package/src/kit/authoring/canvas-scene-guides.ts +84 -0
- package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
- package/src/kit/authoring/consumer-actions.ts +531 -0
- package/src/kit/authoring/design-time-layers.ts +852 -0
- package/src/kit/authoring/design-time-mount-registry.ts +244 -0
- package/src/kit/authoring/edit-mode-authoring.ts +637 -0
- package/src/kit/authoring/empty-project-authoring.ts +22 -0
- package/src/kit/authoring/instance-source-menu.ts +135 -0
- package/src/kit/authoring/layered-pick.ts +185 -0
- package/src/kit/authoring/mounted-root-subjects.ts +146 -0
- package/src/kit/authoring/no-authoring-adapter.ts +59 -0
- package/src/kit/authoring/object3d-document-persistence.ts +122 -0
- package/src/kit/authoring/panel-authoring.ts +121 -0
- package/src/kit/authoring/project-authoring-session.ts +105 -0
- package/src/kit/authoring/provenance.ts +99 -0
- package/src/kit/authoring/react-canvas-navigation.ts +259 -0
- package/src/kit/authoring/react-design-canvas-style.ts +20 -0
- package/src/kit/authoring/react-story-board.ts +917 -0
- package/src/kit/authoring/selection-scope.ts +195 -0
- package/src/kit/authoring/shell-document-ops.ts +169 -0
- package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
- package/src/kit/authoring/story-board-presentation.ts +111 -0
- package/src/kit/authoring/three-root.ts +67 -0
- package/src/kit/authoring/viewport-tool-context.ts +73 -0
- package/src/kit/authoring/viewport-tool-owner.ts +38 -0
- package/src/kit/authoring/world-session-state.ts +101 -0
- package/src/kit/authoring-seam-evidence.ts +300 -0
- package/src/kit/availability-tick.ts +66 -0
- package/src/kit/bitmap-label.ts +120 -0
- package/src/kit/boot-routing.ts +392 -0
- package/src/kit/breakpoint-state.ts +43 -0
- package/src/kit/build-identity.ts +16 -0
- package/src/kit/bytes-codec.ts +62 -0
- package/src/kit/cancellation-reason.ts +58 -0
- package/src/kit/canvas-frames.ts +88 -0
- package/src/kit/capture-camera-pose.ts +77 -0
- package/src/kit/capture-size.ts +88 -0
- package/src/kit/chrome-registry.ts +159 -0
- package/src/kit/chrome-slot-registry.ts +91 -0
- package/src/kit/collaboration-client.ts +264 -0
- package/src/kit/collaboration-presence.ts +41 -0
- package/src/kit/command-dispatch.ts +19 -0
- package/src/kit/command-listener.ts +2182 -0
- package/src/kit/command-registry.ts +71 -0
- package/src/kit/component-board-registry.ts +205 -0
- package/src/kit/component-states-registry.ts +199 -0
- package/src/kit/components/AlignToolbar.tsx +204 -0
- package/src/kit/components/ApplicationMenus.tsx +372 -0
- package/src/kit/components/AssetEditorShell.tsx +216 -0
- package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
- package/src/kit/components/BoardRulers.tsx +354 -0
- package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
- package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
- package/src/kit/components/ChromeSlot.tsx +20 -0
- package/src/kit/components/CodeView.tsx +470 -0
- package/src/kit/components/CompactInspectorShell.tsx +39 -0
- package/src/kit/components/ConsolePanel.tsx +273 -0
- package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
- package/src/kit/components/InspectionProjection.tsx +932 -0
- package/src/kit/components/Inspector.tsx +270 -0
- package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
- package/src/kit/components/InspectorFieldsSection.tsx +290 -0
- package/src/kit/components/InspectorStoriesSection.tsx +92 -0
- package/src/kit/components/InspectorToolSection.tsx +96 -0
- package/src/kit/components/InspectorTransformSection.tsx +245 -0
- package/src/kit/components/LightExplorerPanel.tsx +433 -0
- package/src/kit/components/MediaProperties.tsx +145 -0
- package/src/kit/components/ProjectHeader.tsx +328 -0
- package/src/kit/components/ReactCanvasControls.tsx +358 -0
- package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
- package/src/kit/components/RootTextEditor.tsx +79 -0
- package/src/kit/components/SaveStatus.tsx +70 -0
- package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
- package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
- package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
- package/src/kit/components/ToolHost.tsx +380 -0
- package/src/kit/components/Toolbar.tsx +811 -0
- package/src/kit/components/TransientHint.tsx +44 -0
- package/src/kit/components/VersionControlSection.tsx +470 -0
- package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
- package/src/kit/components/VolterLogo.tsx +18 -0
- package/src/kit/components/WorktreeSwitcher.tsx +712 -0
- package/src/kit/components/account-documents.tsx +1162 -0
- package/src/kit/components/asset-documents.tsx +794 -0
- package/src/kit/components/asset-editor-persistence.ts +216 -0
- package/src/kit/components/asset-selection-section.tsx +545 -0
- package/src/kit/components/asset-thumbnails.tsx +307 -0
- package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
- package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
- package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
- package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/kit/components/asset-viewers/shader-source.ts +144 -0
- package/src/kit/components/board-guides.ts +150 -0
- package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
- package/src/kit/components/canvas-temporary-pivot.ts +34 -0
- package/src/kit/components/core-utilities.tsx +94 -0
- package/src/kit/components/inspector-preview-section.tsx +223 -0
- package/src/kit/components/inspector-revert-label.ts +20 -0
- package/src/kit/components/inspector-selection.ts +42 -0
- package/src/kit/components/inspector-stories-gating.ts +171 -0
- package/src/kit/components/inspector-transform-subject.ts +11 -0
- package/src/kit/components/inspector-transform.ts +88 -0
- package/src/kit/components/kind-documents.tsx +544 -0
- package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
- package/src/kit/components/project-tool-documents.tsx +402 -0
- package/src/kit/components/scene-documents.tsx +221 -0
- package/src/kit/components/status-contributions.tsx +407 -0
- package/src/kit/components/tool-documents.tsx +302 -0
- package/src/kit/components/tool-schema-form.tsx +262 -0
- package/src/kit/components/use-after-paint.ts +41 -0
- package/src/kit/components/use-project-image-assets.ts +86 -0
- package/src/kit/components/workspace-history.ts +32 -0
- package/src/kit/components/world-documents.tsx +570 -0
- package/src/kit/components/world-overlay-gestures.ts +1939 -0
- package/src/kit/composite-screenshot.ts +2238 -0
- package/src/kit/content-entry-source-registry.ts +184 -0
- package/src/kit/contribution-surfaces.ts +48 -0
- package/src/kit/coverage/canvas-reveal.ts +192 -0
- package/src/kit/coverage/design-time-surfaces.ts +101 -0
- package/src/kit/coverage/ontology-invariants.ts +466 -0
- package/src/kit/coverage/session-vitals.ts +503 -0
- package/src/kit/crash-null-boundary.ts +36 -0
- package/src/kit/creation-site-edit.ts +1491 -0
- package/src/kit/creation-site-registry.ts +160 -0
- package/src/kit/delegate-harness-registry.ts +134 -0
- package/src/kit/document-areas.ts +70 -0
- package/src/kit/document-context-registry.ts +193 -0
- package/src/kit/document-open-registry.ts +200 -0
- package/src/kit/document-play-extension.ts +221 -0
- package/src/kit/document-preview-source.ts +20 -0
- package/src/kit/document-renderer-session.ts +138 -0
- package/src/kit/document-stage-sessions.ts +26 -0
- package/src/kit/document-viewports.ts +120 -0
- package/src/kit/editor-api.ts +46 -0
- package/src/kit/editor-chrome-capture.ts +136 -0
- package/src/kit/editor-commands.ts +176 -0
- package/src/kit/editor-console.ts +580 -0
- package/src/kit/editor-current-view.ts +56 -0
- package/src/kit/editor-document-probe.ts +1166 -0
- package/src/kit/editor-git-client.ts +115 -0
- package/src/kit/editor-hotkeys.ts +728 -0
- package/src/kit/editor-lease-view.ts +39 -0
- package/src/kit/editor-lease.ts +415 -0
- package/src/kit/editor-mode.ts +19 -0
- package/src/kit/editor-notifications.ts +140 -0
- package/src/kit/editor-presence.ts +563 -0
- package/src/kit/editor-presentation-activity.ts +58 -0
- package/src/kit/editor-presentation-notice.ts +42 -0
- package/src/kit/editor-runtime.tsx +147 -0
- package/src/kit/editor-server-response.ts +86 -0
- package/src/kit/editor-session-attribution.ts +85 -0
- package/src/kit/editor-session-mode.ts +54 -0
- package/src/kit/editor-state-facets.ts +74 -0
- package/src/kit/editor-view-presentation.ts +777 -0
- package/src/kit/environment-images.ts +58 -0
- package/src/kit/eyedropper-session.ts +60 -0
- package/src/kit/files/file-provider.ts +62 -0
- package/src/kit/files/project-files.ts +270 -0
- package/src/kit/finders/index.ts +137 -0
- package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/kit/frame/frame-parts.ts +30 -0
- package/src/kit/framed-document-capture.ts +34 -0
- package/src/kit/game-globals-prelude.ts +143 -0
- package/src/kit/game-surface-defaults.ts +33 -0
- package/src/kit/gameplay-dom-recording.ts +318 -0
- package/src/kit/gameplay-export-state.ts +14 -0
- package/src/kit/gameplay-replay.ts +417 -0
- package/src/kit/gameplay-session-time.ts +9 -0
- package/src/kit/gameplay-sessions.ts +204 -0
- package/src/kit/hierarchy-component-marks.ts +298 -0
- package/src/kit/hierarchy-internals.ts +197 -0
- package/src/kit/hierarchy-kind-icon.ts +217 -0
- package/src/kit/hierarchy-menu-registry.ts +67 -0
- package/src/kit/hierarchy-node-rows.ts +307 -0
- package/src/kit/hierarchy-panel-view.ts +280 -0
- package/src/kit/hierarchy-projection.ts +76 -0
- package/src/kit/hierarchy-row-media.ts +45 -0
- package/src/kit/hierarchy-row-model.ts +308 -0
- package/src/kit/hierarchy-rows.ts +11 -0
- package/src/kit/hierarchy-walk.ts +86 -0
- package/src/kit/history/editor-session.ts +25 -0
- package/src/kit/history/history-commands.ts +147 -0
- package/src/kit/history/history-delegate.ts +187 -0
- package/src/kit/history/history-limit-notices.ts +43 -0
- package/src/kit/history/history-service.ts +1189 -0
- package/src/kit/history/persistence-coordinator.ts +35 -0
- package/src/kit/history/project-file-history.ts +386 -0
- package/src/kit/history/project-root-history-backends.ts +139 -0
- package/src/kit/history/resource-registry.ts +209 -0
- package/src/kit/history/snapshot-store.ts +103 -0
- package/src/kit/history/source-history-backend.ts +546 -0
- package/src/kit/history-types.ts +124 -0
- package/src/kit/hmr-registration-group.ts +67 -0
- package/src/kit/hmr-stable-react-context.ts +23 -0
- package/src/kit/hotkeys.ts +190 -0
- package/src/kit/inference-diagnostics.ts +69 -0
- package/src/kit/initial-project.ts +80 -0
- package/src/kit/inspection/active-subject.ts +571 -0
- package/src/kit/inspection/active-surface.ts +142 -0
- package/src/kit/inspection/compose-subject.ts +1055 -0
- package/src/kit/inspection/compose.ts +7 -0
- package/src/kit/inspection/display.ts +171 -0
- package/src/kit/inspection/document-subject.ts +109 -0
- package/src/kit/inspection/game-subject.ts +85 -0
- package/src/kit/inspection/null-subject.ts +119 -0
- package/src/kit/inspection/serialize.ts +357 -0
- package/src/kit/inspection/use-active-inspection.ts +180 -0
- package/src/kit/inspection-model.ts +542 -0
- package/src/kit/inspection-node-media.ts +58 -0
- package/src/kit/inspector-presentation.ts +203 -0
- package/src/kit/inspector-property-grouping.ts +64 -0
- package/src/kit/inspector-section-registry.ts +221 -0
- package/src/kit/instance-source-actions.ts +163 -0
- package/src/kit/js-heap.ts +71 -0
- package/src/kit/key-actions.ts +91 -0
- package/src/kit/keymap-presets.ts +428 -0
- package/src/kit/layout-policy.ts +31 -0
- package/src/kit/light-explorer-model.ts +134 -0
- package/src/kit/live-canvas-frame.ts +55 -0
- package/src/kit/live-document.ts +296 -0
- package/src/kit/live-gesture-lock.ts +50 -0
- package/src/kit/live-seam-evidence.ts +11 -0
- package/src/kit/live-session-registry.ts +220 -0
- package/src/kit/live-transition.ts +391 -0
- package/src/kit/manifest-project.ts +107 -0
- package/src/kit/module-fetch-diagnosis.ts +192 -0
- package/src/kit/mount-failure-report.ts +154 -0
- package/src/kit/native-selection-style.ts +497 -0
- package/src/kit/object3d-document-write-policy.ts +137 -0
- package/src/kit/packaged-runtime.ts +108 -0
- package/src/kit/palettes/maya.palette.json +57 -0
- package/src/kit/palettes/substance.palette.json +57 -0
- package/src/kit/performance-profiler.ts +367 -0
- package/src/kit/performance-sources.ts +69 -0
- package/src/kit/photograph-notice.ts +141 -0
- package/src/kit/play-boot-phase.ts +166 -0
- package/src/kit/play-camera-flight.ts +35 -0
- package/src/kit/png-encode.worker.ts +26 -0
- package/src/kit/presentation-surface.ts +248 -0
- package/src/kit/product-command.ts +90 -0
- package/src/kit/project-adapter.ts +1140 -0
- package/src/kit/project-asset-refresh.ts +23 -0
- package/src/kit/project-asset-roots.ts +68 -0
- package/src/kit/project-local-state.ts +151 -0
- package/src/kit/project-manager.ts +243 -0
- package/src/kit/project-module-changes.ts +201 -0
- package/src/kit/project-module-split.ts +270 -0
- package/src/kit/project-play-layers.ts +25 -0
- package/src/kit/project-provenance.ts +115 -0
- package/src/kit/project-ready.ts +42 -0
- package/src/kit/project-shape.ts +68 -0
- package/src/kit/project-tools.ts +107 -0
- package/src/kit/projection-types.ts +44 -0
- package/src/kit/readiness.ts +113 -0
- package/src/kit/renderer-resource-counts.ts +27 -0
- package/src/kit/reported-play-state.ts +90 -0
- package/src/kit/resolve-contributed-command.ts +14 -0
- package/src/kit/resolve-relative-specifier.ts +33 -0
- package/src/kit/retained-document-states.ts +91 -0
- package/src/kit/scene-document-plan.ts +320 -0
- package/src/kit/scene-live-open.ts +210 -0
- package/src/kit/scoped-game-css.ts +152 -0
- package/src/kit/served-url.ts +5 -0
- package/src/kit/session-close.ts +17 -0
- package/src/kit/session-tombstone.ts +127 -0
- package/src/kit/settings/settings-provider.ts +82 -0
- package/src/kit/settings-store.ts +348 -0
- package/src/kit/shell-document-state.ts +27 -0
- package/src/kit/shell-store-door.ts +45 -0
- package/src/kit/shell-store.ts +722 -0
- package/src/kit/source-conflict.ts +122 -0
- package/src/kit/stage-context.ts +377 -0
- package/src/kit/stage-invalidation.ts +25 -0
- package/src/kit/stage-store-registry.ts +69 -0
- package/src/kit/startup-failure.ts +80 -0
- package/src/kit/state-report-deferral.ts +73 -0
- package/src/kit/storage/host-files-storage.ts +97 -0
- package/src/kit/storage/http-storage.ts +174 -0
- package/src/kit/storage/index.ts +75 -0
- package/src/kit/storage/mem-storage.ts +158 -0
- package/src/kit/storage/path-lock.ts +44 -0
- package/src/kit/storage/paths.ts +26 -0
- package/src/kit/storage-types.ts +127 -0
- package/src/kit/stories/StoryPreviewMount.tsx +306 -0
- package/src/kit/stories/compose-project-stories.ts +255 -0
- package/src/kit/stories/prefabs-finder.ts +54 -0
- package/src/kit/stories/prefabs-from-stories.ts +182 -0
- package/src/kit/stories/project-story-regions.ts +24 -0
- package/src/kit/stories/story-capture.ts +579 -0
- package/src/kit/stories/story-declared-medium.ts +126 -0
- package/src/kit/stories/story-discovery.ts +176 -0
- package/src/kit/stories/story-dom-runtime.ts +78 -0
- package/src/kit/stories/story-grouping.ts +111 -0
- package/src/kit/stories/story-mount-turn.ts +27 -0
- package/src/kit/stories/story-presentation.ts +215 -0
- package/src/kit/stories/story-preview-component.ts +7 -0
- package/src/kit/stories/story-registry.ts +530 -0
- package/src/kit/stories-scope.ts +35 -0
- package/src/kit/story-document-openers.ts +36 -0
- package/src/kit/story-thumbnails.ts +47 -0
- package/src/kit/surface-keyboard.ts +101 -0
- package/src/kit/surface-state.ts +135 -0
- package/src/kit/system-seam-evidence.ts +72 -0
- package/src/kit/tab-census.ts +202 -0
- package/src/kit/tab-lifecycle-client.ts +227 -0
- package/src/kit/theme-library.ts +897 -0
- package/src/kit/theme-preference.ts +429 -0
- package/src/kit/three-viewport-presentation.ts +23 -0
- package/src/kit/tool-contribution-play.ts +74 -0
- package/src/kit/tool-loader.ts +1918 -0
- package/src/kit/transform-mode-request.ts +66 -0
- package/src/kit/transient-hint.ts +78 -0
- package/src/kit/transport-strip.tsx +174 -0
- package/src/kit/ui-source/adapter-region-includes.ts +238 -0
- package/src/kit/ui-source/file-region-resolver.ts +302 -0
- package/src/kit/ui-source/inspect.ts +775 -0
- package/src/kit/ui-source/source-write-backend.ts +605 -0
- package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
- package/src/kit/user-local-state.ts +105 -0
- package/src/kit/viewport-activation-timings.ts +840 -0
- package/src/kit/viewport-editor-controls.ts +22 -0
- package/src/kit/viewport-presentation.ts +668 -0
- package/src/kit/viewport-surface-status.tsx +55 -0
- package/src/kit/wait-until.ts +37 -0
- package/src/kit/worker-call-metrics.ts +166 -0
- package/src/kit/workspace-areas.ts +191 -0
- package/src/kit/workspace-aux-commands.ts +11 -0
- package/src/kit/workspace-available-documents.ts +142 -0
- package/src/kit/workspace-core-utilities.ts +31 -0
- package/src/kit/workspace-document-ids.ts +59 -0
- package/src/kit/workspace-document-registry.ts +624 -0
- package/src/kit/workspace-document-restore.ts +146 -0
- package/src/kit/workspace-host-commands.ts +141 -0
- package/src/kit/workspace-persistence-gate.ts +40 -0
- package/src/kit/workspace-play-utilities.ts +44 -0
- package/src/kit/workspace-presets.ts +446 -0
- package/src/kit/workspace-regions.ts +276 -0
- package/src/kit/workspace-static-panels.ts +73 -0
- package/src/kit/workspace-status-registry.ts +121 -0
- package/src/kit/workspace-storage.ts +35 -0
- package/src/kit/workspace-style.ts +226 -0
- package/src/kit/workspace-utility-commands.ts +74 -0
- package/src/kit/workspace-utility-registry.ts +263 -0
- package/src/kit/world-adoption-event.ts +23 -0
- package/src/kit/world-adoption.ts +115 -0
- package/src/kit/world-canvas-viewport-state.ts +35 -0
- package/src/kit/world-document-routing.ts +104 -0
- package/src/kit/world-pan-state.ts +198 -0
- package/src/kit/write-pipe.ts +173 -0
- package/src/layout-arrangements.ts +5 -0
- package/src/layouts.tsx +108 -0
- package/src/looks.ts +16 -0
- package/src/project/output-roots.ts +73 -0
- package/src/project/tab-census.ts +155 -0
- package/src/project-tool-catalog.ts +104 -0
- package/src/selection.tsx +107 -0
- package/src/services.ts +18 -0
- package/src/session/build-report.ts +22 -0
- package/src/session/collaboration-types.ts +262 -0
- package/src/session/command-table.ts +327 -0
- package/src/session/discovery.ts +100 -0
- package/src/session/editor-brand.ts +48 -0
- package/src/session/editor-compatibility.ts +317 -0
- package/src/session/editor-control-lifecycle.ts +68 -0
- package/src/session/editor-control-protocol.ts +5 -0
- package/src/session/entrypoint-selection-readers.ts +66 -0
- package/src/session/entrypoint-selection-source.ts +120 -0
- package/src/session/game-css-scope.ts +30 -0
- package/src/session/hosted-attachment.ts +225 -0
- package/src/session/limited-view.ts +82 -0
- package/src/session/product-create.ts +24 -0
- package/src/session/product-locator.ts +478 -0
- package/src/session/project-module-url.ts +242 -0
- package/src/session/project-serving.ts +164 -0
- package/src/session/project-upgrade.ts +403 -0
- package/src/session/registry-format.ts +210 -0
- package/src/session/relative-path-guard.ts +56 -0
- package/src/session/scoped-game-css.ts +461 -0
- package/src/session/source-glob.ts +15 -0
- package/src/session/tool-contribution-convention.ts +123 -0
- package/src/session/workbench-locator.ts +712 -0
- package/src/session.ts +41 -0
- package/src/share.ts +160 -0
- package/src/source-analysis.ts +28 -0
- package/src/source-authoring.ts +439 -0
- package/src/tools/errors.ts +91 -0
- package/src/tools/provider-execution.ts +70 -0
- package/src/tools/registry.ts +341 -0
- package/src/tools/types.ts +159 -0
- package/src/transport.ts +100 -0
- package/src/types.ts +1693 -0
- package/src/views.ts +164 -0
- package/src/widgets/design-system.ts +93 -0
- package/src/widgets/editor-appearance.ts +151 -0
- package/src/widgets/editor-material.ts +83 -0
- package/src/widgets/icon-set-registry.ts +105 -0
- package/src/widgets/index.ts +71 -0
- package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
- package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
- package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
- package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
- package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
- package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
- package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
- package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
- package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
- package/src/widgets/inspector-widgets/color-utils.ts +201 -0
- package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
- package/src/widgets/inspector-widgets/index.ts +25 -0
- package/src/widgets/inspector-widgets/shared.tsx +140 -0
- package/src/widgets/interactive-edit-scope.ts +33 -0
- package/src/widgets/patterns/Dialog.tsx +140 -0
- package/src/widgets/patterns/Fields.tsx +44 -0
- package/src/widgets/patterns/List.tsx +25 -0
- package/src/widgets/patterns/StateSurface.tsx +40 -0
- package/src/widgets/patterns/Surfaces.tsx +122 -0
- package/src/widgets/patterns/Tabs.tsx +80 -0
- package/src/widgets/patterns/Toolbar.tsx +72 -0
- package/src/widgets/patterns/Tree.tsx +72 -0
- package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
- package/src/widgets/primitives/Button.tsx +62 -0
- package/src/widgets/primitives/ColorInput.tsx +78 -0
- package/src/widgets/primitives/DraftTextInput.tsx +63 -0
- package/src/widgets/primitives/EditorIcon.tsx +157 -0
- package/src/widgets/primitives/FormControls.tsx +88 -0
- package/src/widgets/primitives/HoverPreview.tsx +96 -0
- package/src/widgets/primitives/JsonInput.tsx +113 -0
- package/src/widgets/primitives/Layout.tsx +100 -0
- package/src/widgets/primitives/Menu.tsx +161 -0
- package/src/widgets/primitives/NumberInput.tsx +169 -0
- package/src/widgets/primitives/Panel.tsx +80 -0
- package/src/widgets/primitives/SectionHeader.tsx +77 -0
- package/src/widgets/primitives/Text.tsx +54 -0
- package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
- package/src/widgets/primitives/Tooltip.tsx +204 -0
- package/src/widgets/primitives/Vec3Input.tsx +70 -0
- package/src/widgets/primitives/banner-tones.ts +32 -0
- package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
- package/src/widgets/primitives/editor-icons.ts +254 -0
- package/src/widgets/primitives/panel-header-styles.ts +42 -0
- package/src/widgets/theme.ts +2841 -0
- package/src/widgets/z-index.ts +25 -0
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §5.1 asset-selection inspection (W2 — inventory row R6's "single-click
|
|
3
|
+
* selects → Inspector preview/metadata" half).
|
|
4
|
+
*
|
|
5
|
+
* A single click in the Assets browser (`asset-selection.ts`) is a click like
|
|
6
|
+
* any other, so it names a SUBJECT: {@link describeAssetSelectionSubject} is
|
|
7
|
+
* the producer `inspection/active-subject.ts` consults, and what it returns
|
|
8
|
+
* goes through the ONE composer into the same box a scene node gets. An open
|
|
9
|
+
* document still wins — browser selection is navigator state and must not
|
|
10
|
+
* displace a document's own subject — which is the whole of the producer's
|
|
11
|
+
* `null` case. The full viewer lives in a center document
|
|
12
|
+
* (`asset-documents.tsx`, double-click/Enter).
|
|
13
|
+
*
|
|
14
|
+
* Per the §5.1 table, compact metadata only: image dimensions/format/size,
|
|
15
|
+
* model thumbnail + size (the summary reuses the existing
|
|
16
|
+
* `model-thumbnail.ts` renderer), audio duration/format, input-map binding
|
|
17
|
+
* summary (reusing `InputMapViewer`'s exported validation), and plain
|
|
18
|
+
* name/path/size for the rest.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { faCircleInfo, faImage } from '@fortawesome/free-solid-svg-icons';
|
|
22
|
+
import { Button, bg, border, text } from '@volter/sdk/widgets';
|
|
23
|
+
import { useEffect, useState, useSyncExternalStore } from 'react';
|
|
24
|
+
import { assetInspectorActionsFor } from '../asset-inspector-actions';
|
|
25
|
+
import { getSelectedAsset, type SelectedAsset } from '@volter/sdk/kit/asset-selection';
|
|
26
|
+
import {
|
|
27
|
+
assetSelectionViewerFor,
|
|
28
|
+
assetSelectionViewersVersion,
|
|
29
|
+
subscribeAssetSelectionViewers,
|
|
30
|
+
} from '../asset-selection-viewer-registry';
|
|
31
|
+
import { assetDocumentKind } from '@volter/sdk/kit/asset-capabilities';
|
|
32
|
+
import {
|
|
33
|
+
type PixiSpritesheetFrame,
|
|
34
|
+
parsePixiSpritesheet,
|
|
35
|
+
sidecarPathForSheet,
|
|
36
|
+
splitSpritesheetAssetPath,
|
|
37
|
+
} from '@volter/sdk/kit/asset-workflow/pixi-spritesheet';
|
|
38
|
+
import { PROJECT_ASSET_COMMANDS } from '@volter/sdk/kit/asset-workflow/project-asset-commands';
|
|
39
|
+
import {
|
|
40
|
+
contentEntryForComponent,
|
|
41
|
+
contentEntrySourceRegistryVersion,
|
|
42
|
+
subscribeContentEntrySources,
|
|
43
|
+
} from '@volter/sdk/kit/content-entry-source-registry';
|
|
44
|
+
import type { InspectionAction } from '@volter/sdk/kit/inspection-model';
|
|
45
|
+
import {
|
|
46
|
+
PREVIEW_SECTION_ID,
|
|
47
|
+
PREVIEW_SECTION_ORDER,
|
|
48
|
+
PROPERTIES_SECTION_ORDER,
|
|
49
|
+
} from '@volter/sdk/kit/inspection-model';
|
|
50
|
+
import type { NullInspectionSubject } from '@volter/sdk/kit/inspection/null-subject';
|
|
51
|
+
import {
|
|
52
|
+
getAssetInspectorToolContributions,
|
|
53
|
+
getGlobalToolContributions,
|
|
54
|
+
subscribeToolContributions,
|
|
55
|
+
} from '@volter/sdk/kit/tool-loader';
|
|
56
|
+
import { activeWorkspaceDocumentSelection } from '@volter/sdk/kit/workspace-document-registry';
|
|
57
|
+
import { AssetInspectorToolSection } from './AssetInspectorToolSection';
|
|
58
|
+
import { ModelThumbnail, TypedAssetThumbnail } from '@volter/sdk/kit/components/asset-thumbnails';
|
|
59
|
+
import { SpritesheetSpriteView } from '@volter/sdk/kit/components/asset-viewers/SpritesheetSpriteView';
|
|
60
|
+
import { MediaProperties } from '@volter/sdk/kit/components/MediaProperties';
|
|
61
|
+
|
|
62
|
+
const labelStyle: React.CSSProperties = { fontSize: 11, color: text[3], marginBottom: 2 };
|
|
63
|
+
const valueStyle: React.CSSProperties = { fontSize: 11, color: text[1], wordBreak: 'break-all' };
|
|
64
|
+
|
|
65
|
+
function AssetToolSections({ asset }: { asset: SelectedAsset }) {
|
|
66
|
+
useSyncExternalStore(
|
|
67
|
+
subscribeToolContributions,
|
|
68
|
+
getGlobalToolContributions,
|
|
69
|
+
getGlobalToolContributions,
|
|
70
|
+
);
|
|
71
|
+
const contributionAsset = {
|
|
72
|
+
path: asset.path,
|
|
73
|
+
name: asset.name,
|
|
74
|
+
kind: asset.kind,
|
|
75
|
+
origin: asset.origin ?? ('project' as const),
|
|
76
|
+
...(asset.sourcePath ? { sourcePath: asset.sourcePath } : {}),
|
|
77
|
+
};
|
|
78
|
+
return getAssetInspectorToolContributions().map((item) => {
|
|
79
|
+
let matches = false;
|
|
80
|
+
try {
|
|
81
|
+
matches = item.match(contributionAsset);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
// biome-ignore lint/suspicious/noConsole: broken project matchers must teach without taking down the Inspector
|
|
84
|
+
console.error(`[tool contributions] ${item.file}'s asset match() threw.`, error);
|
|
85
|
+
}
|
|
86
|
+
return matches ? (
|
|
87
|
+
<AssetInspectorToolSection
|
|
88
|
+
key={`${item.id}:${item.version}`}
|
|
89
|
+
id={item.id}
|
|
90
|
+
title={item.title}
|
|
91
|
+
file={item.file}
|
|
92
|
+
tool={item.tool}
|
|
93
|
+
Component={item.Component}
|
|
94
|
+
/>
|
|
95
|
+
) : null;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function formatSize(bytes: number): string {
|
|
100
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
101
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
102
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function MetaRow({ label, value }: { label: string; value: string }) {
|
|
106
|
+
return (
|
|
107
|
+
<div>
|
|
108
|
+
<div style={labelStyle}>{label}</div>
|
|
109
|
+
<div style={valueStyle}>{value}</div>
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The selected asset AS THE PREVIEW SECTION's body — the same square box a
|
|
116
|
+
* scene node's live preview fills, with the thumbnail the asset already has.
|
|
117
|
+
* It fills its host at any size, which is what lets the section body and the
|
|
118
|
+
* minimized card's round thumb be one function (`inspection/model.ts`'s
|
|
119
|
+
* `preview` body).
|
|
120
|
+
*/
|
|
121
|
+
export function AssetSelectionThumbnail({ asset }: { asset: SelectedAsset }) {
|
|
122
|
+
const environment = asset.capabilities?.editor === 'environment';
|
|
123
|
+
// The picture of a COMPONENT is the same question the Content grid asks, about
|
|
124
|
+
// one component instead of the index (`content-entry-source-registry.ts`):
|
|
125
|
+
// whichever source admits it also paints it, and this panel learns nothing
|
|
126
|
+
// about why it is content.
|
|
127
|
+
useSyncExternalStore(
|
|
128
|
+
subscribeContentEntrySources,
|
|
129
|
+
contentEntrySourceRegistryVersion,
|
|
130
|
+
contentEntrySourceRegistryVersion,
|
|
131
|
+
);
|
|
132
|
+
const componentPreview = asset.componentPreview;
|
|
133
|
+
const componentPicture = componentPreview
|
|
134
|
+
? contentEntryForComponent({
|
|
135
|
+
name: asset.name,
|
|
136
|
+
path: componentPreview.sourcePath,
|
|
137
|
+
surface: componentPreview.surface,
|
|
138
|
+
})
|
|
139
|
+
: null;
|
|
140
|
+
return (
|
|
141
|
+
<div
|
|
142
|
+
data-testid="inspector-asset-preview"
|
|
143
|
+
style={{
|
|
144
|
+
position: 'absolute',
|
|
145
|
+
inset: 0,
|
|
146
|
+
background: bg.inset,
|
|
147
|
+
display: 'flex',
|
|
148
|
+
alignItems: 'center',
|
|
149
|
+
justifyContent: 'center',
|
|
150
|
+
overflow: 'hidden',
|
|
151
|
+
}}
|
|
152
|
+
>
|
|
153
|
+
{componentPicture ? (
|
|
154
|
+
<componentPicture.source.Thumbnail entry={componentPicture.entry} previewRevision={0} />
|
|
155
|
+
) : environment ? (
|
|
156
|
+
<TypedAssetThumbnail kind="image" name={asset.name} variant="cell" />
|
|
157
|
+
) : asset.kind === 'image' ? (
|
|
158
|
+
<SelectedImagePreview path={asset.path} name={asset.name} />
|
|
159
|
+
) : asset.kind === 'video' ? (
|
|
160
|
+
<SelectedVideoPreview path={asset.path} />
|
|
161
|
+
) : asset.kind === 'model' ? (
|
|
162
|
+
<ModelThumbnail url={asset.path} />
|
|
163
|
+
) : (
|
|
164
|
+
<TypedAssetThumbnail kind={asset.kind} name={asset.name} variant="cell" />
|
|
165
|
+
)}
|
|
166
|
+
</div>
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function SelectedVideoPreview({ path }: { path: string }) {
|
|
171
|
+
return (
|
|
172
|
+
<video
|
|
173
|
+
src={path}
|
|
174
|
+
muted
|
|
175
|
+
preload="metadata"
|
|
176
|
+
style={{ width: '100%', height: '100%', objectFit: 'contain' }}
|
|
177
|
+
/>
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function SelectedImagePreview({ path, name }: { path: string; name: string }) {
|
|
182
|
+
const { sheetPath, frameName } = splitSpritesheetAssetPath(path);
|
|
183
|
+
const [frame, setFrame] = useState<PixiSpritesheetFrame | null>(null);
|
|
184
|
+
useEffect(() => {
|
|
185
|
+
if (!frameName) {
|
|
186
|
+
setFrame(null);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
let cancelled = false;
|
|
190
|
+
void fetch(`/${sidecarPathForSheet(sheetPath)}`)
|
|
191
|
+
.then((response) => (response.ok ? response.text() : null))
|
|
192
|
+
.then((source) => {
|
|
193
|
+
if (cancelled || !source) return;
|
|
194
|
+
const sheet = parsePixiSpritesheet(source);
|
|
195
|
+
setFrame(sheet?.frames.find((entry) => entry.name === frameName) ?? null);
|
|
196
|
+
})
|
|
197
|
+
.catch(() => {
|
|
198
|
+
if (!cancelled) setFrame(null);
|
|
199
|
+
});
|
|
200
|
+
return () => {
|
|
201
|
+
cancelled = true;
|
|
202
|
+
};
|
|
203
|
+
}, [frameName, sheetPath]);
|
|
204
|
+
if (frame) {
|
|
205
|
+
return <SpritesheetSpriteView sheetUrl={`/${sheetPath}`} frame={frame} maxEdge={96} />;
|
|
206
|
+
}
|
|
207
|
+
return (
|
|
208
|
+
<img
|
|
209
|
+
src={path.split('#')[0]}
|
|
210
|
+
alt={name}
|
|
211
|
+
style={{ width: '100%', height: '100%', objectFit: 'contain' }}
|
|
212
|
+
/>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** An image's intrinsic size (§5.1 "dimensions"), measured off the decoded
|
|
217
|
+
* bitmap rather than off a rendered `<img>` — the preview is a section of its
|
|
218
|
+
* own now, and a metadata row must not depend on which tab is showing. */
|
|
219
|
+
function ImageDimensionsRow({ asset }: { asset: SelectedAsset }) {
|
|
220
|
+
const [dims, setDims] = useState<{ w: number; h: number } | null>(null);
|
|
221
|
+
const { sheetPath, frameName } = splitSpritesheetAssetPath(asset.path);
|
|
222
|
+
useEffect(() => {
|
|
223
|
+
setDims(null);
|
|
224
|
+
// Native HDR/EXR loaders own these dimensions in the full document; an
|
|
225
|
+
// HTML Image cannot decode them and must not be used as a silent probe.
|
|
226
|
+
if (asset.kind !== 'image' || asset.capabilities?.editor === 'environment') return;
|
|
227
|
+
let cancelled = false;
|
|
228
|
+
if (frameName) {
|
|
229
|
+
void fetch(`/${sidecarPathForSheet(sheetPath)}`)
|
|
230
|
+
.then((response) => (response.ok ? response.text() : null))
|
|
231
|
+
.then((source) => {
|
|
232
|
+
if (cancelled || !source) return;
|
|
233
|
+
const frame = parsePixiSpritesheet(source)?.frames.find(
|
|
234
|
+
(entry) => entry.name === frameName,
|
|
235
|
+
);
|
|
236
|
+
if (frame) setDims({ w: frame.sourceWidth, h: frame.sourceHeight });
|
|
237
|
+
})
|
|
238
|
+
.catch(() => {});
|
|
239
|
+
return () => {
|
|
240
|
+
cancelled = true;
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const image = new Image();
|
|
244
|
+
image.onload = () => {
|
|
245
|
+
if (!cancelled) setDims({ w: image.naturalWidth, h: image.naturalHeight });
|
|
246
|
+
};
|
|
247
|
+
image.src = asset.path.split('#')[0] ?? asset.path;
|
|
248
|
+
return () => {
|
|
249
|
+
cancelled = true;
|
|
250
|
+
};
|
|
251
|
+
}, [asset.capabilities?.editor, asset.kind, asset.path, frameName, sheetPath]);
|
|
252
|
+
return dims ? <MetaRow label="Dimensions" value={`${dims.w} × ${dims.h}`} /> : null;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** The registered section body — renders ONLY while an asset is selected
|
|
256
|
+
* (the registration's `match` gates on the same store read). */
|
|
257
|
+
export function AssetSelectionSection() {
|
|
258
|
+
// Subscribed, not read once: a package's viewer registers behind the first
|
|
259
|
+
// viewport frame, after this section may already be on screen.
|
|
260
|
+
useSyncExternalStore(
|
|
261
|
+
subscribeAssetSelectionViewers,
|
|
262
|
+
assetSelectionViewersVersion,
|
|
263
|
+
assetSelectionViewersVersion,
|
|
264
|
+
);
|
|
265
|
+
const asset = getSelectedAsset();
|
|
266
|
+
if (!asset) return null;
|
|
267
|
+
const viewer = assetSelectionViewerFor(asset);
|
|
268
|
+
const ext = asset.name.includes('.') ? (asset.name.split('.').pop() ?? '') : '';
|
|
269
|
+
// WHO DRAWS *THIS* ASSET is a registry question. The branch that stood
|
|
270
|
+
// here read `asset.online` and rendered the external catalog's own detail
|
|
271
|
+
// view, which is how a base library for making IDEs came to import a
|
|
272
|
+
// managed-service client (`asset-selection-viewer-registry.ts`).
|
|
273
|
+
if (viewer) {
|
|
274
|
+
return (
|
|
275
|
+
<div
|
|
276
|
+
data-testid="inspector-asset-selection"
|
|
277
|
+
style={{
|
|
278
|
+
pointerEvents: 'auto',
|
|
279
|
+
borderBottom: `1px solid ${border[1]}`,
|
|
280
|
+
display: 'flex',
|
|
281
|
+
flexDirection: 'column',
|
|
282
|
+
gap: 6,
|
|
283
|
+
}}
|
|
284
|
+
>
|
|
285
|
+
<viewer.View asset={asset} />
|
|
286
|
+
<AssetToolSections asset={asset} />
|
|
287
|
+
</div>
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
if (
|
|
291
|
+
(asset.selectionCount ?? 1) === 1 &&
|
|
292
|
+
((asset.kind === 'image' &&
|
|
293
|
+
!asset.path.includes('#') &&
|
|
294
|
+
asset.capabilities?.editor !== 'environment') ||
|
|
295
|
+
asset.kind === 'video' ||
|
|
296
|
+
asset.kind === 'audio')
|
|
297
|
+
) {
|
|
298
|
+
return (
|
|
299
|
+
<>
|
|
300
|
+
<MediaProperties
|
|
301
|
+
assetPath={asset.path}
|
|
302
|
+
kind={asset.kind as 'image' | 'video' | 'audio'}
|
|
303
|
+
sizeBytes={asset.sizeBytes}
|
|
304
|
+
/>
|
|
305
|
+
<div style={{ padding: '0 8px', display: 'grid', gap: 6 }}>
|
|
306
|
+
{asset.health && asset.health !== 'healthy' && (
|
|
307
|
+
<MetaRow label="Health" value={asset.health} />
|
|
308
|
+
)}
|
|
309
|
+
{Boolean(asset.healthCodes?.length) && (
|
|
310
|
+
<MetaRow label="Issues" value={asset.healthCodes!.join(', ')} />
|
|
311
|
+
)}
|
|
312
|
+
{asset.sourcePath && <MetaRow label="Imported from" value={asset.sourcePath} />}
|
|
313
|
+
{Boolean(asset.dependencies?.length) && (
|
|
314
|
+
<MetaRow label="Dependencies" value={asset.dependencies!.join(', ')} />
|
|
315
|
+
)}
|
|
316
|
+
{Boolean(asset.references?.length) && (
|
|
317
|
+
<MetaRow
|
|
318
|
+
label="References"
|
|
319
|
+
value={asset.references!.map((ref) => `${ref.ownerPath} ${ref.jsonPath}`).join(', ')}
|
|
320
|
+
/>
|
|
321
|
+
)}
|
|
322
|
+
</div>
|
|
323
|
+
<AssetToolSections asset={asset} />
|
|
324
|
+
</>
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
return (
|
|
328
|
+
<div
|
|
329
|
+
data-testid="inspector-asset-selection"
|
|
330
|
+
style={{
|
|
331
|
+
pointerEvents: 'auto',
|
|
332
|
+
padding: 8,
|
|
333
|
+
borderBottom: `1px solid ${border[1]}`,
|
|
334
|
+
display: 'flex',
|
|
335
|
+
flexDirection: 'column',
|
|
336
|
+
gap: 6,
|
|
337
|
+
}}
|
|
338
|
+
>
|
|
339
|
+
<ImageDimensionsRow asset={asset} />
|
|
340
|
+
<div style={{ ...labelStyle, marginBottom: 0, textTransform: 'uppercase' }}>Asset</div>
|
|
341
|
+
{/* §8: source-owned name, as authored. */}
|
|
342
|
+
<div style={{ fontWeight: 600, fontSize: 12, color: text[1], wordBreak: 'break-all' }}>
|
|
343
|
+
{asset.name}
|
|
344
|
+
</div>
|
|
345
|
+
<MetaRow label="Path" value={asset.path} />
|
|
346
|
+
{asset.componentPreview && (
|
|
347
|
+
<MetaRow
|
|
348
|
+
label="Surface"
|
|
349
|
+
value={
|
|
350
|
+
asset.componentPreview.surface === 'canvas'
|
|
351
|
+
? '2D / Pixi'
|
|
352
|
+
: asset.componentPreview.surface === 'three'
|
|
353
|
+
? '3D / Three'
|
|
354
|
+
: asset.componentPreview.surface
|
|
355
|
+
}
|
|
356
|
+
/>
|
|
357
|
+
)}
|
|
358
|
+
{asset.selectionCount && asset.selectionCount > 1 && (
|
|
359
|
+
<>
|
|
360
|
+
<MetaRow label="Selection" value={`${asset.selectionCount} assets`} />
|
|
361
|
+
{asset.selectionTotalBytes !== undefined && (
|
|
362
|
+
<MetaRow label="Total size" value={formatSize(asset.selectionTotalBytes)} />
|
|
363
|
+
)}
|
|
364
|
+
{asset.selectionFormats && (
|
|
365
|
+
<MetaRow label="Formats" value={asset.selectionFormats.join(', ')} />
|
|
366
|
+
)}
|
|
367
|
+
</>
|
|
368
|
+
)}
|
|
369
|
+
{ext && <MetaRow label="Format" value={ext.toUpperCase()} />}
|
|
370
|
+
{asset.sizeBytes !== undefined && (
|
|
371
|
+
<MetaRow label="Size" value={formatSize(asset.sizeBytes)} />
|
|
372
|
+
)}
|
|
373
|
+
{asset.capabilities && (
|
|
374
|
+
<>
|
|
375
|
+
<MetaRow
|
|
376
|
+
label="Runtime readiness"
|
|
377
|
+
value={
|
|
378
|
+
asset.capabilities.runtimeReady ? 'Runtime-ready' : 'Import or conversion required'
|
|
379
|
+
}
|
|
380
|
+
/>
|
|
381
|
+
<MetaRow
|
|
382
|
+
label="Preview"
|
|
383
|
+
value={asset.capabilities.previewable ? 'Available' : 'Unsupported'}
|
|
384
|
+
/>
|
|
385
|
+
<MetaRow
|
|
386
|
+
label="Placement"
|
|
387
|
+
value={asset.capabilities.placeable ? 'Placeable' : 'Not placeable'}
|
|
388
|
+
/>
|
|
389
|
+
<MetaRow label="Editor" value={assetDocumentKind(asset.capabilities) ?? 'No editor'} />
|
|
390
|
+
</>
|
|
391
|
+
)}
|
|
392
|
+
{asset.health && <MetaRow label="Health" value={asset.health} />}
|
|
393
|
+
{asset.healthCodes && <MetaRow label="Issues" value={asset.healthCodes.join(', ')} />}
|
|
394
|
+
{asset.dependencies && (
|
|
395
|
+
<MetaRow label="Dependencies" value={asset.dependencies.join(', ') || 'None'} />
|
|
396
|
+
)}
|
|
397
|
+
{asset.references && (
|
|
398
|
+
<MetaRow
|
|
399
|
+
label="References"
|
|
400
|
+
value={
|
|
401
|
+
asset.references
|
|
402
|
+
.map((reference) => `${reference.ownerPath} ${reference.jsonPath}`)
|
|
403
|
+
.join(', ') || 'None'
|
|
404
|
+
}
|
|
405
|
+
/>
|
|
406
|
+
)}
|
|
407
|
+
{asset.sourcePath && <MetaRow label="Imported from" value={asset.sourcePath} />}
|
|
408
|
+
{!asset.componentPreview && (
|
|
409
|
+
<div style={{ display: 'flex', gap: 6 }}>
|
|
410
|
+
<Button
|
|
411
|
+
type="button"
|
|
412
|
+
data-command-id={PROJECT_ASSET_COMMANDS.open.id}
|
|
413
|
+
onClick={() =>
|
|
414
|
+
window.dispatchEvent(
|
|
415
|
+
new CustomEvent('editor:open-project-asset', { detail: { path: asset.path } }),
|
|
416
|
+
)
|
|
417
|
+
}
|
|
418
|
+
>
|
|
419
|
+
Open
|
|
420
|
+
</Button>
|
|
421
|
+
{asset.selectionCount && asset.selectionCount > 1 && (
|
|
422
|
+
<>
|
|
423
|
+
<Button
|
|
424
|
+
type="button"
|
|
425
|
+
data-command-id={PROJECT_ASSET_COMMANDS.move.id}
|
|
426
|
+
onClick={() =>
|
|
427
|
+
window.dispatchEvent(
|
|
428
|
+
new CustomEvent('editor:project-asset-command', {
|
|
429
|
+
detail: { id: PROJECT_ASSET_COMMANDS.move.id },
|
|
430
|
+
}),
|
|
431
|
+
)
|
|
432
|
+
}
|
|
433
|
+
>
|
|
434
|
+
Move selected
|
|
435
|
+
</Button>
|
|
436
|
+
<Button
|
|
437
|
+
type="button"
|
|
438
|
+
data-command-id={PROJECT_ASSET_COMMANDS.delete.id}
|
|
439
|
+
onClick={() =>
|
|
440
|
+
window.dispatchEvent(
|
|
441
|
+
new CustomEvent('editor:project-asset-command', {
|
|
442
|
+
detail: { id: PROJECT_ASSET_COMMANDS.delete.id },
|
|
443
|
+
}),
|
|
444
|
+
)
|
|
445
|
+
}
|
|
446
|
+
>
|
|
447
|
+
Delete selected
|
|
448
|
+
</Button>
|
|
449
|
+
</>
|
|
450
|
+
)}
|
|
451
|
+
</div>
|
|
452
|
+
)}
|
|
453
|
+
<div style={{ fontSize: 10, color: text[3] }}>
|
|
454
|
+
Double-click (or press Enter) in the asset browser to open the full viewer.
|
|
455
|
+
</div>
|
|
456
|
+
<AssetToolSections asset={asset} />
|
|
457
|
+
</div>
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* The selected asset as a SUBJECT — a producer, like every other thing you
|
|
463
|
+
* can click on (`inspection/active-subject.ts` consults it first).
|
|
464
|
+
*
|
|
465
|
+
* A single click in the browser is a click, and the box shows what you
|
|
466
|
+
* clicked: the asset's own name and path on the identity row, its thumbnail
|
|
467
|
+
* in the Preview section, its §5.1 metadata in the Asset section. It used to
|
|
468
|
+
* be a contribution bolted onto whatever ELSE was selected, which is why the
|
|
469
|
+
* card showed the asset while `editor.inspect` reported the stale scene
|
|
470
|
+
* entity — two answers to one question.
|
|
471
|
+
*
|
|
472
|
+
* `null` means the asset selection is not what the human is looking at: no
|
|
473
|
+
* asset is selected, or an open document owns the inspection context (browser
|
|
474
|
+
* selection is navigator state and must not displace a document's subject).
|
|
475
|
+
*/
|
|
476
|
+
/**
|
|
477
|
+
* The verbs the matching `asset.inspector` sections have PUBLISHED for this
|
|
478
|
+
* asset (`asset-inspector-actions.ts` says why they are published rather
|
|
479
|
+
* than declared): they land in the subject's `quickActions`, so the identity
|
|
480
|
+
* row shows them and `editor.runAction(id)` runs the same function the
|
|
481
|
+
* section's own button calls.
|
|
482
|
+
*/
|
|
483
|
+
function contributedAssetActions(assetPath: string): InspectionAction[] {
|
|
484
|
+
return assetInspectorActionsFor(assetPath).map((action) => ({
|
|
485
|
+
id: action.id,
|
|
486
|
+
title: action.title,
|
|
487
|
+
...(action.label === undefined ? {} : { label: action.label }),
|
|
488
|
+
placement: 'identity' as const,
|
|
489
|
+
...(action.disabled === undefined ? {} : { disabled: action.disabled }),
|
|
490
|
+
run: action.run,
|
|
491
|
+
}));
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
export function describeAssetSelectionSubject(): NullInspectionSubject | null {
|
|
495
|
+
const asset = getSelectedAsset();
|
|
496
|
+
if (asset === null) return null;
|
|
497
|
+
// A document with authoring of its own (a scene, a 3D asset document)
|
|
498
|
+
// answers for what is picked INSIDE it; a document that only selects
|
|
499
|
+
// itself (a source file, a JSON) does not stand between the person and the
|
|
500
|
+
// asset they picked in Content — that is where a model's own inspector
|
|
501
|
+
// (the mesh capability's, with its Edit mesh door) lives.
|
|
502
|
+
const documentSelection = activeWorkspaceDocumentSelection();
|
|
503
|
+
if (
|
|
504
|
+
documentSelection &&
|
|
505
|
+
(documentSelection.adapter !== null || documentSelection.nodeId !== null)
|
|
506
|
+
) {
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
// A preview section earns its space with a picture. Generic document,
|
|
510
|
+
// folder and audio glyphs are file metadata, not previews: scaling them to
|
|
511
|
+
// fill the Inspector makes a temporary document selection look broken.
|
|
512
|
+
const hasVisualPreview =
|
|
513
|
+
Boolean(asset.componentPreview) ||
|
|
514
|
+
asset.kind === 'model' ||
|
|
515
|
+
asset.kind === 'video' ||
|
|
516
|
+
(asset.kind === 'image' && asset.capabilities?.editor !== 'environment');
|
|
517
|
+
return {
|
|
518
|
+
quickActions: contributedAssetActions(asset.path),
|
|
519
|
+
id: `asset:${asset.path}`,
|
|
520
|
+
title: asset.name,
|
|
521
|
+
kindLabel: asset.online ? `${asset.kind} · ${asset.online.source}` : asset.kind,
|
|
522
|
+
note: { text: asset.sourcePath ?? asset.path, testId: 'inspector-asset-path' },
|
|
523
|
+
sections: [
|
|
524
|
+
...(hasVisualPreview
|
|
525
|
+
? [{
|
|
526
|
+
id: PREVIEW_SECTION_ID,
|
|
527
|
+
title: 'Preview',
|
|
528
|
+
icon: faImage,
|
|
529
|
+
order: PREVIEW_SECTION_ORDER,
|
|
530
|
+
body: { kind: 'preview' as const, render: () => <AssetSelectionThumbnail asset={asset} /> },
|
|
531
|
+
}]
|
|
532
|
+
: []),
|
|
533
|
+
{
|
|
534
|
+
id: 'asset-selection',
|
|
535
|
+
title: 'Asset',
|
|
536
|
+
icon: faCircleInfo,
|
|
537
|
+
order: PROPERTIES_SECTION_ORDER,
|
|
538
|
+
body: { kind: 'custom', render: () => <AssetSelectionSection /> },
|
|
539
|
+
// Hosts the `asset.inspector` contributions, whose verbs (a model's
|
|
540
|
+
// Edit mesh) exist only while they render.
|
|
541
|
+
keepMounted: true,
|
|
542
|
+
},
|
|
543
|
+
],
|
|
544
|
+
};
|
|
545
|
+
}
|