@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,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The panel's half of the hierarchy-presentation convention
|
|
3
|
+
* (`@volter/editor-threejs/adapter/hierarchy-marks`): a game classifies its
|
|
4
|
+
* component-instance roots and its implementation subtrees on the LIVE nodes,
|
|
5
|
+
* and this turns that classification into rows.
|
|
6
|
+
*
|
|
7
|
+
* CLASSIFICATION ONLY — NEVER FABRICATED STRUCTURE. Nothing here invents a
|
|
8
|
+
* parent. Where a node belongs is the TREE's answer, and a world whose tree
|
|
9
|
+
* disagrees with its own ownership is fixed in the world (three's
|
|
10
|
+
* `matrixWorldAutoUpdate = false` keeps a transform-independent object parented
|
|
11
|
+
* where it belongs), not papered over here. What this module decides is
|
|
12
|
+
* narrower and entirely presentational: which rows are the game and which are
|
|
13
|
+
* the implementation underneath it, and — since an implementation node may sit
|
|
14
|
+
* BETWEEN two things that are the game — where a row's nearest visible ancestor
|
|
15
|
+
* is. See {@link componentMarkView} point 5, promotion.
|
|
16
|
+
*
|
|
17
|
+
* WHY THIS IS A DECORATOR AND NOT A SECOND ROW PIPELINE. Exactly the reason
|
|
18
|
+
* `hierarchy-internals.ts` gives for reveal: the panel's cap, collapse, search,
|
|
19
|
+
* selection-reveal and virtualization all layer on ONE flatten of ONE
|
|
20
|
+
* `HierarchyProvider`. A marked tree composes by handing that flattener a
|
|
21
|
+
* richer provider — never by forking the walk. And it composes with reveal
|
|
22
|
+
* specifically by producing an {@link InternalsSource}: built-internals become
|
|
23
|
+
* internals of exactly the kind "Reveal Internals" already shows, so the
|
|
24
|
+
* read-only rule, the search exclusion and the drag refusal that already govern
|
|
25
|
+
* a revealed row govern these with no second policy.
|
|
26
|
+
*
|
|
27
|
+
* THE NO-MARKS FALLBACK IS IDENTITY, BY CONSTRUCTION. Every projection below
|
|
28
|
+
* short-circuits when a node carries no mark and no child carries one, and
|
|
29
|
+
* {@link componentMarkView} returns the source's own `hierarchy` object when the
|
|
30
|
+
* tree cannot carry marks at all (an adapter with no `Object3D` seam — React,
|
|
31
|
+
* Pixi, DOM). A world that adopts nothing renders exactly as it did.
|
|
32
|
+
*
|
|
33
|
+
* PURE ON PURPOSE: the marks arrive through the injected {@link NodeMarkReader},
|
|
34
|
+
* never by importing three or touching `userData` here, so the whole row
|
|
35
|
+
* decision is unit-testable with plain objects.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import type { EditorNode, HierarchyProvider } from '@volter/project/adapter';
|
|
39
|
+
import type { InternalsSource } from '@volter/sdk/kit/hierarchy-internals';
|
|
40
|
+
import type { HierarchyNodeRow } from './hierarchy-node-rows';
|
|
41
|
+
|
|
42
|
+
/** What the marks say about ONE node. Both absent is the ordinary node. */
|
|
43
|
+
export interface NodeMarks {
|
|
44
|
+
/** `volterComponentRoot` — the component name this node is one instance of. */
|
|
45
|
+
readonly componentRoot?: string | undefined;
|
|
46
|
+
/** A native authoring entity constructor. It stays an ordinary entity row, but like a
|
|
47
|
+
* component root it is authored content even when a host implementation node wraps it. */
|
|
48
|
+
readonly authoredEntity?: boolean | undefined;
|
|
49
|
+
/** `volterBuiltInternal` — this node is the root of an implementation subtree. */
|
|
50
|
+
readonly builtInternal?: boolean | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Reads the marks off one node id. `undefined` for an id the source has no
|
|
54
|
+
* live object for — indistinguishable from an unmarked node, deliberately. */
|
|
55
|
+
export type NodeMarkReader = (id: string) => NodeMarks | undefined;
|
|
56
|
+
|
|
57
|
+
/** The hierarchy half of an adapter, plus whatever internals capability it
|
|
58
|
+
* already had. Structurally satisfied by `AuthoringAdapter` /
|
|
59
|
+
* `CompositeAuthoringAdapter` without importing either — the same contract-only
|
|
60
|
+
* probe shape `hierarchy-internals.ts` and `hierarchy-row-model.ts` use. */
|
|
61
|
+
export interface MarkedTreeSource {
|
|
62
|
+
readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
|
|
63
|
+
readonly hasInternals?: ((id: string) => boolean) | undefined;
|
|
64
|
+
readonly internalChildren?: ((id: string) => EditorNode[] | undefined) | undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface MarkedTreeView extends InternalsSource {
|
|
68
|
+
/** True for a node whose live object carries `volterComponentRoot`. */
|
|
69
|
+
isComponentRoot(id: string): boolean;
|
|
70
|
+
/** True for a node that is, or descends from, a `volterBuiltInternal` root.
|
|
71
|
+
* Exposed for tests and for {@link componentMarkView}'s own reuse; the panel
|
|
72
|
+
* reads internal-ness off the reveal projection, which is the union of these
|
|
73
|
+
* and the adapter's own hidden children. */
|
|
74
|
+
isBuiltInternal(id: string): boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Depth backstop for a pathological live tree — the same belt-and-braces
|
|
78
|
+
* constant `hierarchy-internals.ts`/`hierarchy-node-rows.ts` keep. */
|
|
79
|
+
const MAX_DEPTH = 500;
|
|
80
|
+
|
|
81
|
+
/** The reader for a surface that has no node to read marks off. Identity-checked
|
|
82
|
+
* by {@link componentMarkView}, which is why it is a shared constant rather
|
|
83
|
+
* than a fresh closure per call. */
|
|
84
|
+
export const NO_MARKS: NodeMarkReader = () => undefined;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Decorate `source` so the marks become rows.
|
|
88
|
+
*
|
|
89
|
+
* Five things change, and nothing else:
|
|
90
|
+
*
|
|
91
|
+
* 1. A marked component root reports `role: 'component'` and
|
|
92
|
+
* `typeLabel: <mark name>`. That is all the panel needs — `rowIdentity`
|
|
93
|
+
* already prints `Coin1 ·Coin` for exactly this pair, and `ROLE_ICON`
|
|
94
|
+
* already has the component glyph. NO new presentation vocabulary: a second
|
|
95
|
+
* way to render "this is an instance" is how two of them drift.
|
|
96
|
+
* The mark REPLACES any `typeLabel` the adapter had, because a three
|
|
97
|
+
* projection reports the native class there (`Object3D`), and
|
|
98
|
+
* `Coin1 ·Object3D` is worse than no suffix at all.
|
|
99
|
+
* 2. Built-internal children disappear from every `childIds`, so what a
|
|
100
|
+
* collapsed tree shows is the game and not its implementation.
|
|
101
|
+
* 3. A built-internal ROOT disappears from `roots()` for the same reason, but
|
|
102
|
+
* meaningful content beneath it is promoted to roots in place. A root has
|
|
103
|
+
* no parent row to reveal it under, so the implementation wrapper itself
|
|
104
|
+
* stays unreachable while spawned content remains visible.
|
|
105
|
+
* 4. Both come back through `internalChildren`/`hasInternals` — unioned with
|
|
106
|
+
* whatever the adapter already hid — so "Reveal Internals" shows them,
|
|
107
|
+
* read-only, under their real parent, in the true chain.
|
|
108
|
+
* 5. PROMOTION. A component instance does not lose its row because
|
|
109
|
+
* implementation nodes sit between it and its owner. A weapon prefab
|
|
110
|
+
* attached to a hand bone, a nameplate on a head bone: content the author
|
|
111
|
+
* placed, inside a subtree a rig builder marked. `volterComponentRoot` beats
|
|
112
|
+
* `volterBuiltInternal` (see `isBuiltInternal`'s climb), and this lists such a
|
|
113
|
+
* row under its nearest VISIBLE ancestor — so a prefab reads as the parent
|
|
114
|
+
* of everything meaningful beneath it, however many bones the rig hangs in
|
|
115
|
+
* between. A subtree with no instance inside it still folds away whole,
|
|
116
|
+
* because there is nothing in it to promote. This is the elision half of the
|
|
117
|
+
* same classification: (2) removes an implementation row, (5) keeps what was
|
|
118
|
+
* under it from going with it.
|
|
119
|
+
*
|
|
120
|
+
* Built-internal is SUBTREE-scoped (see the engine module's header): a node
|
|
121
|
+
* whose ANCESTOR is marked is internal too, which is what lets a rig cost one
|
|
122
|
+
* mark. {@link MarkedTreeView.isBuiltInternal} memoizes that climb, so a
|
|
123
|
+
* repeated walk over the same tree pays once per node.
|
|
124
|
+
*/
|
|
125
|
+
export function componentMarkView(
|
|
126
|
+
source: MarkedTreeSource,
|
|
127
|
+
marksOf: NodeMarkReader,
|
|
128
|
+
): MarkedTreeView {
|
|
129
|
+
if (marksOf === NO_MARKS) {
|
|
130
|
+
// A surface with no `Object3D` seam (React, Pixi, DOM) cannot carry these
|
|
131
|
+
// marks at all. Hand back the source itself so the panel's provider is
|
|
132
|
+
// IDENTICAL, not merely equivalent.
|
|
133
|
+
return {
|
|
134
|
+
hierarchy: source.hierarchy,
|
|
135
|
+
isComponentRoot: () => false,
|
|
136
|
+
isBuiltInternal: () => false,
|
|
137
|
+
...(source.hasInternals ? { hasInternals: (id: string) => source.hasInternals!(id) } : {}),
|
|
138
|
+
...(source.internalChildren
|
|
139
|
+
? { internalChildren: (id: string) => source.internalChildren!(id) }
|
|
140
|
+
: {}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** id -> "this node is inside a built subtree", memoized across the walk. */
|
|
145
|
+
const internalCache = new Map<string, boolean>();
|
|
146
|
+
|
|
147
|
+
const isBuiltInternal = (id: string): boolean => {
|
|
148
|
+
const cached = internalCache.get(id);
|
|
149
|
+
if (cached !== undefined) return cached;
|
|
150
|
+
// Climb to the first answer we already have (or to a root), then fill the
|
|
151
|
+
// whole chain in one pass — an ancestor walk per node would be O(depth²).
|
|
152
|
+
const chain: string[] = [];
|
|
153
|
+
let cursor: string | null = id;
|
|
154
|
+
let inherited = false;
|
|
155
|
+
let guard = 0;
|
|
156
|
+
while (cursor !== null && guard++ < MAX_DEPTH) {
|
|
157
|
+
const known = internalCache.get(cursor);
|
|
158
|
+
if (known !== undefined) {
|
|
159
|
+
inherited = known;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
chain.push(cursor);
|
|
163
|
+
// PRECEDENCE: an explicit component root is content even inside an
|
|
164
|
+
// implementation subtree. Otherwise an explicit implementation mark on
|
|
165
|
+
// THIS node wins over the automatic authored-entity stamp: generated
|
|
166
|
+
// native machinery is still source-addressable JSX, but its attach seam
|
|
167
|
+
// knows that it is implementation. An authored entity with no such mark
|
|
168
|
+
// remains content inside an implementation ancestor — a weapon attached
|
|
169
|
+
// to a rig bone, for example — which is what makes promotion (see
|
|
170
|
+
// `visibleChildIds`) reachable at all.
|
|
171
|
+
const marks = marksOf(cursor);
|
|
172
|
+
if (marks?.componentRoot !== undefined) break;
|
|
173
|
+
if (marks?.builtInternal === true) {
|
|
174
|
+
inherited = true;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
if (marks?.authoredEntity === true) break;
|
|
178
|
+
cursor = source.hierarchy.node(cursor)?.parentId ?? null;
|
|
179
|
+
}
|
|
180
|
+
// `chain` is innermost-first and every entry shares the verdict of the node
|
|
181
|
+
// that stopped the climb — either an already-known ancestor, or the marked
|
|
182
|
+
// node itself (which is the last entry pushed).
|
|
183
|
+
for (const entry of chain) internalCache.set(entry, inherited);
|
|
184
|
+
return inherited;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const isComponentRoot = (id: string): boolean => marksOf(id)?.componentRoot !== undefined;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* The rows that belong directly under `node` — its own visible children,
|
|
191
|
+
* plus (point 5) the visible descendants that implementation children stand
|
|
192
|
+
* between. Recursive: an implementation node contributes ITS promoted rows in
|
|
193
|
+
* its own place, so a two-deep chain of them elides just as one does, and a
|
|
194
|
+
* subtree with nothing visible in it contributes nothing at all.
|
|
195
|
+
*/
|
|
196
|
+
const visibleChildIds = (node: EditorNode, depth = 0): string[] => {
|
|
197
|
+
if (depth > MAX_DEPTH) return [];
|
|
198
|
+
const out: string[] = [];
|
|
199
|
+
for (const childId of node.childIds) {
|
|
200
|
+
if (!isBuiltInternal(childId)) {
|
|
201
|
+
out.push(childId);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const child = source.hierarchy.node(childId);
|
|
205
|
+
if (child) out.push(...visibleChildIds(child, depth + 1));
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
/** The children of `id` this view hides — its DIRECT implementation children,
|
|
211
|
+
* which is what "Reveal Internals" puts back and where the true chain lives. */
|
|
212
|
+
const hiddenChildIds = (node: EditorNode): string[] =>
|
|
213
|
+
node.childIds.filter((childId) => isBuiltInternal(childId));
|
|
214
|
+
|
|
215
|
+
const project = (node: EditorNode | null): EditorNode | null => {
|
|
216
|
+
if (!node) return null;
|
|
217
|
+
const componentRoot = marksOf(node.id)?.componentRoot;
|
|
218
|
+
const childIds = visibleChildIds(node);
|
|
219
|
+
const sameChildren =
|
|
220
|
+
childIds.length === node.childIds.length &&
|
|
221
|
+
childIds.every((childId, index) => childId === node.childIds[index]);
|
|
222
|
+
if (componentRoot === undefined && sameChildren) return node;
|
|
223
|
+
return {
|
|
224
|
+
...node,
|
|
225
|
+
...(componentRoot === undefined
|
|
226
|
+
? {}
|
|
227
|
+
: { role: 'component' as const, typeLabel: componentRoot }),
|
|
228
|
+
...(sameChildren ? {} : { childIds }),
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const hierarchy: Pick<HierarchyProvider, 'roots' | 'node'> = {
|
|
233
|
+
roots: () =>
|
|
234
|
+
source.hierarchy.roots().flatMap((root) => {
|
|
235
|
+
if (!isBuiltInternal(root.id)) return [project(root)!];
|
|
236
|
+
return visibleChildIds(root).flatMap((childId) => {
|
|
237
|
+
const child = project(source.hierarchy.node(childId));
|
|
238
|
+
return child ? [{ ...child, parentId: root.parentId }] : [];
|
|
239
|
+
});
|
|
240
|
+
}),
|
|
241
|
+
node: (id) => project(source.hierarchy.node(id)),
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
hierarchy,
|
|
246
|
+
isComponentRoot,
|
|
247
|
+
isBuiltInternal,
|
|
248
|
+
hasInternals: (id) => {
|
|
249
|
+
if (source.hasInternals?.(id) === true) return true;
|
|
250
|
+
const node = source.hierarchy.node(id);
|
|
251
|
+
return node ? hiddenChildIds(node).length > 0 : false;
|
|
252
|
+
},
|
|
253
|
+
internalChildren: (id) => {
|
|
254
|
+
const own = source.internalChildren?.(id);
|
|
255
|
+
const node = source.hierarchy.node(id);
|
|
256
|
+
const hidden = node
|
|
257
|
+
? hiddenChildIds(node).flatMap((childId) => {
|
|
258
|
+
// PROJECTED, not raw: this node's own implementation children are
|
|
259
|
+
// hidden from its `childIds` here too, and the reveal walk appends
|
|
260
|
+
// them back itself. Handing back the raw node would list every
|
|
261
|
+
// sub-bone twice. Reveal therefore shows the TRUE chain of
|
|
262
|
+
// implementation nodes — each under its real parent, one level per
|
|
263
|
+
// walk step — which is what the action is for.
|
|
264
|
+
const child = project(source.hierarchy.node(childId));
|
|
265
|
+
// Re-parented to `id` — a revealed subtree is displayed as the tree
|
|
266
|
+
// it literally is, the same rule `internalChildren` states on the
|
|
267
|
+
// source adapter.
|
|
268
|
+
return child ? [{ ...child, parentId: id }] : [];
|
|
269
|
+
})
|
|
270
|
+
: [];
|
|
271
|
+
if (own === undefined) return hidden.length > 0 ? hidden : undefined;
|
|
272
|
+
return [...own, ...hidden];
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* A marked component instance opens CLOSED. This is a default, applied on top
|
|
279
|
+
* of `defaultExpansionByNode`'s shape rule and under the author's own session /
|
|
280
|
+
* persisted preference — so "expandable on demand" is the panel's existing
|
|
281
|
+
* expansion state doing its existing job, and an instance the author opened
|
|
282
|
+
* stays open across renders.
|
|
283
|
+
*
|
|
284
|
+
* Takes the already-flattened structural rows rather than walking the tree
|
|
285
|
+
* again: the panel has them, and a second walk over a live graph is the cost
|
|
286
|
+
* this whole cycle exists to remove.
|
|
287
|
+
*/
|
|
288
|
+
export function applyComponentRootExpansionDefaults(
|
|
289
|
+
defaults: Map<string, boolean>,
|
|
290
|
+
rows: readonly HierarchyNodeRow[],
|
|
291
|
+
isComponentRoot: (id: string) => boolean,
|
|
292
|
+
): Map<string, boolean> {
|
|
293
|
+
for (const row of rows) {
|
|
294
|
+
if (row.more) continue;
|
|
295
|
+
if (isComponentRoot(row.node.id)) defaults.set(row.node.id, false);
|
|
296
|
+
}
|
|
297
|
+
return defaults;
|
|
298
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "reveal internals, read-only". Godot's Editable Children, minus the editing.
|
|
3
|
+
*
|
|
4
|
+
* WHAT THIS IS. `R3fSourceAuthoringAdapter.projectedChildren` surfaces only
|
|
5
|
+
* CROSS-BOUNDARY children: an instance's own host nodes and its unstamped model
|
|
6
|
+
* internals (bones, GLTF meshes) are "traversed but not surfaced", so an
|
|
7
|
+
* `<Enemy>` reads as a leaf even though it rendered a 60-bone rig. Everything
|
|
8
|
+
* needed to show that rig already exists — `indexGraph` mints a path-keyed id
|
|
9
|
+
* for every non-helper object and `hierarchy.node(id)` describes it — so this
|
|
10
|
+
* module adds no identity machinery. It adds a VIEW: a decorator over the
|
|
11
|
+
* adapter's `HierarchyProvider` that appends the hidden children of the ids the
|
|
12
|
+
* author revealed, and answers which ids it minted rows for.
|
|
13
|
+
*
|
|
14
|
+
* WHY A DECORATOR AND NOT A NEW FLATTENER. `flattenHierarchyRows` walks
|
|
15
|
+
* `roots()`/`node(id).childIds`; virtualization, the child cap, collapse,
|
|
16
|
+
* selection-reveal and the search filter are all layered on TOP of that one
|
|
17
|
+
* walk. Injecting internals INTO the provider means every one of those keeps
|
|
18
|
+
* working untouched — a revealed skeleton is windowed, capped and collapsed by
|
|
19
|
+
* the same code as everything else, and no second row pipeline exists to drift.
|
|
20
|
+
*
|
|
21
|
+
* WHY THE STATE IS SESSION-ONLY. Reveal is deliberately NOT written to
|
|
22
|
+
* `hierarchy-expansion-state.ts` (which persists per project in localStorage):
|
|
23
|
+
* a skeleton that reappears on every project open is noise in the panel the
|
|
24
|
+
* author needs most, and unlike a normal fold it is not a statement about the
|
|
25
|
+
* authored tree at all — it is a temporary "let me look inside this". It lives
|
|
26
|
+
* in a module-level Set for the life of the tab, cleared on project switch by
|
|
27
|
+
* nothing at all, because ids are project-scoped (`r3f:<worldId>:<oid>`) and a
|
|
28
|
+
* stale id simply never matches.
|
|
29
|
+
*
|
|
30
|
+
* READ-ONLY IS ENFORCED ELSEWHERE, ON PURPOSE: this module only says WHICH rows
|
|
31
|
+
* are internal; `hierarchy-row-model.ts`'s `rowAffordances` is the single
|
|
32
|
+
* predicate that turns that into "no drag, no rename, no write, no search".
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import type { EditorNode, HierarchyProvider } from '@volter/project/adapter';
|
|
36
|
+
|
|
37
|
+
/** The (optional, structural) adapter capability H6 needs — the same
|
|
38
|
+
* contract-free probe shape H3's `InstanceSourceLocator` and H5's
|
|
39
|
+
* `RowDiagnosticsSource` use, so no adapter is forced to implement it and no
|
|
40
|
+
* editor module imports an R3F type to read it. */
|
|
41
|
+
export interface InternalsSource {
|
|
42
|
+
readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
|
|
43
|
+
/** Cheap "would revealing this row show anything?" — used to decide whether
|
|
44
|
+
* the menu item appears at all. */
|
|
45
|
+
readonly hasInternals?: ((id: string) => boolean) | undefined;
|
|
46
|
+
/** The RAW live children of `id` that the adapter's own projection hides,
|
|
47
|
+
* each described exactly as `hierarchy.node` would describe it, but
|
|
48
|
+
* re-parented to its RAW parent so a revealed subtree reads as the tree it
|
|
49
|
+
* actually is. `undefined` for an id the adapter does not own. */
|
|
50
|
+
readonly internalChildren?: ((id: string) => EditorNode[] | undefined) | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface InternalsProjection {
|
|
54
|
+
/** The provider to flatten. Identity-equal to the source's own when nothing
|
|
55
|
+
* is revealed, so the common case costs nothing. */
|
|
56
|
+
readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
|
|
57
|
+
/** True for a row that exists ONLY because of a reveal. */
|
|
58
|
+
isInternal(id: string): boolean;
|
|
59
|
+
/** The revealed ids that actually produced rows (a revealed id whose object
|
|
60
|
+
* is gone after an HMR remount is silently inert, not an error). */
|
|
61
|
+
readonly revealRootIds: ReadonlySet<string>;
|
|
62
|
+
/** Every id this projection minted a row for, transitively. */
|
|
63
|
+
readonly internalIds: ReadonlySet<string>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Depth backstop for a pathological live tree — the same belt-and-braces
|
|
67
|
+
* constant `hierarchy-node-rows.ts` keeps for the same reason. */
|
|
68
|
+
const MAX_DEPTH = 500;
|
|
69
|
+
|
|
70
|
+
const EMPTY: ReadonlySet<string> = new Set();
|
|
71
|
+
|
|
72
|
+
// ------------------------------------------------------------ session state
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Ids whose internals are currently revealed. Module-level and NOT persisted —
|
|
76
|
+
* see this file's header for why a revealed skeleton must not survive a reload.
|
|
77
|
+
*/
|
|
78
|
+
const revealed = new Set<string>();
|
|
79
|
+
|
|
80
|
+
export function isInternalsRevealed(id: string): boolean {
|
|
81
|
+
return revealed.has(id);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Returns the new state, so a caller can report what it did. */
|
|
85
|
+
export function toggleInternalsRevealed(id: string): boolean {
|
|
86
|
+
if (revealed.delete(id)) return false;
|
|
87
|
+
revealed.add(id);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function revealedInternalsIds(): ReadonlySet<string> {
|
|
92
|
+
return revealed;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Test-only reset for the module-level session set. */
|
|
96
|
+
export function __resetRevealedInternalsForTest(): void {
|
|
97
|
+
revealed.clear();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// -------------------------------------------------------------- projection
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Build the revealing view of `source.hierarchy`.
|
|
104
|
+
*
|
|
105
|
+
* The walk is EAGER (every revealed subtree is expanded to its leaves up
|
|
106
|
+
* front) rather than lazy inside `node()`, because "is this row internal?" must
|
|
107
|
+
* be answerable in any order — the panel asks it while rendering a row, long
|
|
108
|
+
* after the flatten that produced it, and a lazily-populated set would make the
|
|
109
|
+
* answer depend on call order. It costs one `internalChildren` call per
|
|
110
|
+
* revealed node, which the R3F adapter answers in O(children × depth) with no
|
|
111
|
+
* subtree walk.
|
|
112
|
+
*
|
|
113
|
+
* A revealed node's internals are appended AFTER its projected children, which
|
|
114
|
+
* is what keeps a nested instance's row in its authored place: the flattener
|
|
115
|
+
* dedupes by id on first occurrence, so the instance is emitted as the real
|
|
116
|
+
* child it is, and the internal path that also reaches it is skipped.
|
|
117
|
+
*/
|
|
118
|
+
export function internalsProjection(
|
|
119
|
+
source: InternalsSource,
|
|
120
|
+
revealedIds: ReadonlySet<string> = revealed,
|
|
121
|
+
): InternalsProjection {
|
|
122
|
+
// Called THROUGH `source` below, never as a detached reference: every real
|
|
123
|
+
// implementer is a class method that needs its own `this`.
|
|
124
|
+
if (typeof source.internalChildren !== 'function' || revealedIds.size === 0) {
|
|
125
|
+
return {
|
|
126
|
+
hierarchy: source.hierarchy,
|
|
127
|
+
isInternal: () => false,
|
|
128
|
+
revealRootIds: EMPTY,
|
|
129
|
+
internalIds: EMPTY,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** id -> the internal child ids appended to it. */
|
|
134
|
+
const appended = new Map<string, string[]>();
|
|
135
|
+
/** id -> the node an internal row renders (never re-asked of the adapter,
|
|
136
|
+
* whose own `node()` would answer with the PROJECTED parent). */
|
|
137
|
+
const internalNodes = new Map<string, EditorNode>();
|
|
138
|
+
const revealRootIds = new Set<string>();
|
|
139
|
+
|
|
140
|
+
const walk = (id: string, depth: number): void => {
|
|
141
|
+
if (depth > MAX_DEPTH || appended.has(id)) return;
|
|
142
|
+
const children = source.internalChildren!(id) ?? [];
|
|
143
|
+
if (children.length === 0) return;
|
|
144
|
+
appended.set(
|
|
145
|
+
id,
|
|
146
|
+
children.map((child) => child.id),
|
|
147
|
+
);
|
|
148
|
+
for (const child of children) {
|
|
149
|
+
if (internalNodes.has(child.id)) continue;
|
|
150
|
+
internalNodes.set(child.id, child);
|
|
151
|
+
walk(child.id, depth + 1);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
for (const id of revealedIds) {
|
|
156
|
+
walk(id, 0);
|
|
157
|
+
if (appended.has(id)) revealRootIds.add(id);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const decorate = (node: EditorNode | null): EditorNode | null => {
|
|
161
|
+
if (!node) return null;
|
|
162
|
+
const extra = appended.get(node.id);
|
|
163
|
+
return extra ? { ...node, childIds: [...node.childIds, ...extra] } : node;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
hierarchy: {
|
|
168
|
+
roots: () => source.hierarchy.roots().map((root) => decorate(root)!),
|
|
169
|
+
node: (id) => decorate(internalNodes.get(id) ?? source.hierarchy.node(id)),
|
|
170
|
+
},
|
|
171
|
+
isInternal: (id) => internalNodes.has(id),
|
|
172
|
+
revealRootIds,
|
|
173
|
+
internalIds: new Set(internalNodes.keys()),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* H6's first-open policy, applied ON TOP of the panel's own
|
|
179
|
+
* `defaultExpansionByNode` result: **the reveal root's direct children are
|
|
180
|
+
* visible, everything deeper starts folded.**
|
|
181
|
+
*
|
|
182
|
+
* Two overrides express exactly that. The revealed row itself opens (otherwise
|
|
183
|
+
* "Reveal Internals" would appear to do nothing on an instance that happened to
|
|
184
|
+
* be folded), and every internal row starts closed — a rig is 60 rows deep and
|
|
185
|
+
* dumping all of it into the panel is the opposite of the "look inside this one
|
|
186
|
+
* thing" the action is for. Both are DEFAULTS: an explicit fold the author
|
|
187
|
+
* performs afterwards still wins, because the panel consults session and
|
|
188
|
+
* persisted preferences before this map.
|
|
189
|
+
*/
|
|
190
|
+
export function applyRevealExpansionDefaults(
|
|
191
|
+
defaults: Map<string, boolean>,
|
|
192
|
+
projection: Pick<InternalsProjection, 'revealRootIds' | 'internalIds'>,
|
|
193
|
+
): Map<string, boolean> {
|
|
194
|
+
for (const id of projection.internalIds) defaults.set(id, false);
|
|
195
|
+
for (const id of projection.revealRootIds) defaults.set(id, true);
|
|
196
|
+
return defaults;
|
|
197
|
+
}
|