@volter/sdk 0.0.0-stage → 0.5.204
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 +1168 -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 +329 -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 +669 -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,429 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyEditorTheme,
|
|
3
|
+
composeEditorAppearance,
|
|
4
|
+
DEFAULT_ICON_SET_ID,
|
|
5
|
+
EDITOR_REGION_NAMES,
|
|
6
|
+
type EditorMaterialId,
|
|
7
|
+
type EditorPalette,
|
|
8
|
+
type EditorRegionName,
|
|
9
|
+
type EditorTheme,
|
|
10
|
+
isEditorIconSetId,
|
|
11
|
+
isEditorMaterialId,
|
|
12
|
+
setActiveIconSet,
|
|
13
|
+
subscribeEditorMaterials,
|
|
14
|
+
subscribeIconSets,
|
|
15
|
+
} from '@volter/sdk/widgets';
|
|
16
|
+
import { effectiveSettings, subscribeSettings, updatePreferenceSettings } from '@volter/sdk/kit/settings-store';
|
|
17
|
+
import { resolveEditorTheme, subscribeEditorThemeLibrary } from './theme-library';
|
|
18
|
+
|
|
19
|
+
// The palette and material are `appearance.palette` / `appearance.material`
|
|
20
|
+
// in the settings layers (`settings-store.ts`: `~/.volter/settings.json`, a
|
|
21
|
+
// project's `.volter/settings.json` overriding it). A stored preference carries
|
|
22
|
+
// no authored content, so an unreadable/absent one simply falls back to the
|
|
23
|
+
// default appearance — no migration, no alias. The ONE thing still in browser
|
|
24
|
+
// storage here is the PREPAINT record: the shell colour `index.html` paints
|
|
25
|
+
// before any module loads, a cache of the last paint and never a setting.
|
|
26
|
+
export const PREPAINT_EDITOR_THEME_STORAGE_KEY = 'volter.editor.prepaint.v1';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* THE HOST'S OWN DEFAULT APPEARANCE — what the editor wears when no product
|
|
30
|
+
* composed it, and the floor every other answer falls back to. Classic's
|
|
31
|
+
* reference frame is the host with no look declared (ARCHITECTURE-CORE §The
|
|
32
|
+
* core is the workbench, "Host default versus skew").
|
|
33
|
+
*/
|
|
34
|
+
export const DEFAULT_EDITOR_PALETTE_ID = 'graphite-dark';
|
|
35
|
+
export const DEFAULT_EDITOR_MATERIAL_ID: EditorMaterialId = 'classic';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* THE PRODUCT'S DEFAULT APPEARANCE, pushed in rather than read out.
|
|
39
|
+
*
|
|
40
|
+
* The look is the PRODUCT's (ARCHITECTURE-CORE §The target shape, rule 3;
|
|
41
|
+
* WORK.md PART B beat 7 — under the frame there is no look switcher). A
|
|
42
|
+
* product's entry names a style bundle id (`frame/product.ts`'s `look`), and
|
|
43
|
+
* `workspace-style.ts` — which is the module that knows what a bundle IS —
|
|
44
|
+
* resolves it and calls this. It is a DEFAULT and nothing more: the person's
|
|
45
|
+
* `~/.volter/settings.json`, the project's own, and the adapter's declaration all
|
|
46
|
+
* outrank it, because each of those is something somebody said about THIS
|
|
47
|
+
* machine or THIS project.
|
|
48
|
+
*
|
|
49
|
+
* Pushed instead of pulled because the dependency runs the other way:
|
|
50
|
+
* `workspace-style.ts` imports this module, so this module cannot import it.
|
|
51
|
+
*/
|
|
52
|
+
let productAppearance: {
|
|
53
|
+
readonly palette: string;
|
|
54
|
+
readonly material: EditorMaterialId;
|
|
55
|
+
readonly icons: string;
|
|
56
|
+
} | null = null;
|
|
57
|
+
|
|
58
|
+
export function setDefaultEditorAppearance(
|
|
59
|
+
next: { palette: string; material: EditorMaterialId; icons: string } | null,
|
|
60
|
+
): void {
|
|
61
|
+
productAppearance = next;
|
|
62
|
+
// A default that arrives after the first read (the product's style bundle is
|
|
63
|
+
// a package's contribution, so it registers a moment into the session) has to
|
|
64
|
+
// dislodge the cached fallback, or the page wears the host's Graphite for the
|
|
65
|
+
// rest of its life with nothing saying why.
|
|
66
|
+
// A value a setter holds in flight is not a fallback, whatever the settings say yet.
|
|
67
|
+
const stored = effectiveSettings().appearance;
|
|
68
|
+
if (stored?.palette === undefined && !pendingWrites.has('palette')) cachedPaletteId = null;
|
|
69
|
+
if (stored?.material === undefined && !pendingWrites.has('material')) cachedMaterialId = null;
|
|
70
|
+
if (stored?.icons === undefined && !pendingWrites.has('icons')) cachedIconSetId = null;
|
|
71
|
+
fallBackFromMissingTheme();
|
|
72
|
+
applyCurrentTheme();
|
|
73
|
+
emit();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The product's declared palette when it resolves, the host's otherwise. */
|
|
77
|
+
function defaultPaletteId(): string {
|
|
78
|
+
const declared = productAppearance?.palette;
|
|
79
|
+
return declared !== undefined && resolveEditorTheme(declared)
|
|
80
|
+
? declared
|
|
81
|
+
: DEFAULT_EDITOR_PALETTE_ID;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function defaultMaterialId(): EditorMaterialId {
|
|
85
|
+
return productAppearance?.material ?? DEFAULT_EDITOR_MATERIAL_ID;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function defaultIconSetId(): string {
|
|
89
|
+
const declared = productAppearance?.icons;
|
|
90
|
+
return declared !== undefined && isEditorIconSetId(declared) ? declared : DEFAULT_ICON_SET_ID;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* `prefers-reduced-transparency` changes only the painted Glass tier. The
|
|
95
|
+
* stored palette and requested material remain untouched.
|
|
96
|
+
*/
|
|
97
|
+
const REDUCED_TRANSPARENCY_QUERY = '(prefers-reduced-transparency: reduce)';
|
|
98
|
+
|
|
99
|
+
let cachedPaletteId: string | null = null;
|
|
100
|
+
let cachedMaterialId: EditorMaterialId | null = null;
|
|
101
|
+
let cachedIconSetId: string | null = null;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* A SETTER'S WRITE IS IN FLIGHT until it settles. Under the Code-OSS frame a write is the
|
|
105
|
+
* configuration service's asynchronous `updateValue`, and other settings changes arrive
|
|
106
|
+
* meanwhile, each still reporting the previous value: re-read then, a style bundle's palette,
|
|
107
|
+
* material and icon set fell back to the previous bundle's and the chrome wore a mix of the two
|
|
108
|
+
* until the writes landed (measured through `set-style`, which answered "custom mix" for every
|
|
109
|
+
* switch between two bundles). So an axis keeps its setter's value until that write settles,
|
|
110
|
+
* landed or failed, and then takes the stored value again — which is also how a project's own
|
|
111
|
+
* override of the axis still wins.
|
|
112
|
+
*/
|
|
113
|
+
const pendingWrites = new Map<'palette' | 'material' | 'icons', symbol>();
|
|
114
|
+
|
|
115
|
+
function writeAxis(axis: 'palette' | 'material' | 'icons', value: string): void {
|
|
116
|
+
const write = Symbol(`${axis} write`);
|
|
117
|
+
pendingWrites.set(axis, write);
|
|
118
|
+
const appearance =
|
|
119
|
+
axis === 'palette'
|
|
120
|
+
? { palette: value }
|
|
121
|
+
: axis === 'material'
|
|
122
|
+
? { material: value as EditorMaterialId }
|
|
123
|
+
: { icons: value };
|
|
124
|
+
void updatePreferenceSettings({ appearance }).then(() => {
|
|
125
|
+
if (pendingWrites.get(axis) !== write) return; // a later setter owns the axis now
|
|
126
|
+
pendingWrites.delete(axis);
|
|
127
|
+
syncFromSettings();
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Re-read every axis no write holds, and repaint when one moved. */
|
|
132
|
+
function syncFromSettings(): void {
|
|
133
|
+
if (!pendingWrites.has('icons')) cachedIconSetId = readStoredIconSetId();
|
|
134
|
+
setActiveIconSet(editorIconSetSnapshot());
|
|
135
|
+
const palette = pendingWrites.has('palette') ? editorPaletteSnapshot() : readStoredPaletteId();
|
|
136
|
+
const material = pendingWrites.has('material') ? editorMaterialSnapshot() : readStoredMaterialId();
|
|
137
|
+
if (palette === cachedPaletteId && material === cachedMaterialId) return;
|
|
138
|
+
cachedPaletteId = palette;
|
|
139
|
+
cachedMaterialId = material;
|
|
140
|
+
previewTheme = null;
|
|
141
|
+
applyCurrentTheme();
|
|
142
|
+
emit();
|
|
143
|
+
}
|
|
144
|
+
let installedRoot: HTMLElement | null = null;
|
|
145
|
+
let previewTheme: EditorPalette | null = null;
|
|
146
|
+
let removeSettingsListener: (() => void) | null = null;
|
|
147
|
+
let removeMaterialsListener: (() => void) | null = null;
|
|
148
|
+
let removeIconSetsListener: (() => void) | null = null;
|
|
149
|
+
let removeReducedTransparencyListener: (() => void) | null = null;
|
|
150
|
+
const listeners = new Set<() => void>();
|
|
151
|
+
|
|
152
|
+
function storage(): Storage | null {
|
|
153
|
+
try {
|
|
154
|
+
return typeof window === 'undefined' ? null : window.localStorage;
|
|
155
|
+
} catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function resolvePaletteId(value: string | null | undefined): string {
|
|
161
|
+
return value && resolveEditorTheme(value) ? value : defaultPaletteId();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function readStoredPaletteId(): string {
|
|
165
|
+
return resolvePaletteId(effectiveSettings().appearance?.palette);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function readStoredMaterialId(): EditorMaterialId {
|
|
169
|
+
const stored = effectiveSettings().appearance?.material;
|
|
170
|
+
return isEditorMaterialId(stored) ? stored : defaultMaterialId();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function readStoredIconSetId(): string {
|
|
174
|
+
const stored = effectiveSettings().appearance?.icons;
|
|
175
|
+
return isEditorIconSetId(stored) ? stored : defaultIconSetId();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** The stored icon set when a registered set answers it; the editor's own otherwise. Cached
|
|
179
|
+
* like the palette and the material: under a settings PROVIDER (the Code-OSS frame's) a write
|
|
180
|
+
* reaches the effective settings only after the provider's round trip, so a read straight after
|
|
181
|
+
* a setter would see the previous set and a style bundle would read as a custom mix. */
|
|
182
|
+
export function editorIconSetSnapshot(): string {
|
|
183
|
+
cachedIconSetId ??= readStoredIconSetId();
|
|
184
|
+
return cachedIconSetId;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export function setEditorIconSetPreference(id: string): void {
|
|
188
|
+
if (!isEditorIconSetId(id)) throw new Error(`Unknown editor icon set “${id}”.`);
|
|
189
|
+
cachedIconSetId = id;
|
|
190
|
+
writeAxis('icons', id);
|
|
191
|
+
setActiveIconSet(id);
|
|
192
|
+
emit();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function fallBackFromMissingTheme(): void {
|
|
196
|
+
if (resolveEditorTheme(editorPaletteSnapshot())) return;
|
|
197
|
+
// A stored palette that does not resolve is WORN as the default and never repaired on disk. A
|
|
198
|
+
// contributed palette is absent until its package registers (the Blender look's, the brand's
|
|
199
|
+
// Plotter), and absent altogether in a build or project without that package; writing the
|
|
200
|
+
// default would erase the choice in every other product and project that shares the settings
|
|
201
|
+
// file. The stored choice wins again the moment it resolves (`subscribeEditorThemeLibrary`).
|
|
202
|
+
cachedPaletteId = defaultPaletteId();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function editorPaletteSnapshot(): string {
|
|
206
|
+
cachedPaletteId ??= readStoredPaletteId();
|
|
207
|
+
return cachedPaletteId;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function editorMaterialSnapshot(): EditorMaterialId {
|
|
211
|
+
cachedMaterialId ??= readStoredMaterialId();
|
|
212
|
+
return cachedMaterialId;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* THE EDITOR AREAS THE ACTIVE PALETTE PAINTS SEPARATELY — its own
|
|
217
|
+
* `color.region` claims ({@link EditorRegionName}), as a space-joined key so a
|
|
218
|
+
* component can subscribe to the whole SET with one primitive snapshot.
|
|
219
|
+
*
|
|
220
|
+
* It answers a different question from a panel's claim. A panel says WHICH
|
|
221
|
+
* area it is (`workspace-static-panels.ts`); this says whether the installed
|
|
222
|
+
* palette has anything to say about that area at all. A palette naming none
|
|
223
|
+
* paints every group alike and must also not get the chrome that only reads as
|
|
224
|
+
* chrome INSIDE a painted area — Classic's reference frame is the host with no
|
|
225
|
+
* look declared (ARCHITECTURE-CORE §The core is the workbench, "Host default
|
|
226
|
+
* versus skew"), so a frame-justified shape belongs to the skew that measured
|
|
227
|
+
* it.
|
|
228
|
+
*/
|
|
229
|
+
export function editorPaintedRegions(): string {
|
|
230
|
+
const palette = previewTheme ?? resolveEditorTheme(editorPaletteSnapshot())?.theme;
|
|
231
|
+
const region = palette?.color.region;
|
|
232
|
+
if (!region) return '';
|
|
233
|
+
return EDITOR_REGION_NAMES.filter((name: EditorRegionName) => region[name] !== undefined).join(
|
|
234
|
+
' ',
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function subscribeEditorTheme(listener: () => void): () => void {
|
|
239
|
+
listeners.add(listener);
|
|
240
|
+
return () => listeners.delete(listener);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function emit(): void {
|
|
244
|
+
for (const listener of listeners) listener();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function reducedTransparencyRequested(): boolean {
|
|
248
|
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;
|
|
249
|
+
try {
|
|
250
|
+
return window.matchMedia(REDUCED_TRANSPARENCY_QUERY).matches;
|
|
251
|
+
} catch {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Resolve the token set actually painted from the independent palette and
|
|
258
|
+
* material axes. The material composer owns the reduced-transparency tier;
|
|
259
|
+
* custom palette documents cannot inject or replace surface treatment.
|
|
260
|
+
*/
|
|
261
|
+
function resolvePaintTheme(palette: EditorPalette): EditorTheme {
|
|
262
|
+
const materialId = editorMaterialSnapshot();
|
|
263
|
+
return composeEditorAppearance(
|
|
264
|
+
palette,
|
|
265
|
+
materialId,
|
|
266
|
+
materialId === 'glass' && reducedTransparencyRequested(),
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function applyCurrentTheme(): void {
|
|
271
|
+
if (!installedRoot) return;
|
|
272
|
+
const persisted = resolveEditorTheme(editorPaletteSnapshot())?.theme;
|
|
273
|
+
const palette = previewTheme ?? persisted;
|
|
274
|
+
if (palette) {
|
|
275
|
+
applyEditorTheme(installedRoot, resolvePaintTheme(palette));
|
|
276
|
+
installedRoot.dataset['volterPalette'] = palette.id;
|
|
277
|
+
installedRoot.dataset['volterMaterial'] = editorMaterialSnapshot();
|
|
278
|
+
}
|
|
279
|
+
if (!previewTheme && persisted) {
|
|
280
|
+
const painted = resolvePaintTheme(persisted);
|
|
281
|
+
storage()?.setItem(
|
|
282
|
+
PREPAINT_EDITOR_THEME_STORAGE_KEY,
|
|
283
|
+
JSON.stringify({
|
|
284
|
+
paletteId: persisted.id,
|
|
285
|
+
materialId: editorMaterialSnapshot(),
|
|
286
|
+
id: painted.id,
|
|
287
|
+
shell: painted.color.surface.shell,
|
|
288
|
+
}),
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export function setEditorPalettePreference(paletteId: string): void {
|
|
294
|
+
if (!resolveEditorTheme(paletteId)) throw new Error(`Unknown editor palette “${paletteId}”.`);
|
|
295
|
+
previewTheme = null;
|
|
296
|
+
if (editorPaletteSnapshot() === paletteId) {
|
|
297
|
+
applyCurrentTheme();
|
|
298
|
+
// The same palette re-applied can still paint differently (its document changed), and the
|
|
299
|
+
// frame derives the workbench's colours from what is painted (`frame/look-colors.ts`).
|
|
300
|
+
emit();
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
cachedPaletteId = paletteId;
|
|
304
|
+
writeAxis('palette', paletteId);
|
|
305
|
+
applyCurrentTheme();
|
|
306
|
+
emit();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export function setEditorMaterialPreference(materialId: EditorMaterialId): void {
|
|
310
|
+
if (!isEditorMaterialId(materialId)) throw new Error(`Unknown editor material “${materialId}”.`);
|
|
311
|
+
if (editorMaterialSnapshot() === materialId) {
|
|
312
|
+
applyCurrentTheme();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
cachedMaterialId = materialId;
|
|
316
|
+
writeAxis('material', materialId);
|
|
317
|
+
applyCurrentTheme();
|
|
318
|
+
emit();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Temporarily paint an unsaved draft without changing the persisted choice. */
|
|
322
|
+
export function previewEditorTheme(theme: EditorPalette): void {
|
|
323
|
+
previewTheme = theme;
|
|
324
|
+
applyCurrentTheme();
|
|
325
|
+
// A draft is painted like a choice, so the workbench's colours follow it too: the stage
|
|
326
|
+
// reads those first (`native-selection-style.ts`), and a preview they never reached left
|
|
327
|
+
// the 3D viewport on the saved look.
|
|
328
|
+
emit();
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** Return from a draft preview to the currently persisted library theme. */
|
|
332
|
+
export function clearEditorThemePreview(): void {
|
|
333
|
+
previewTheme = null;
|
|
334
|
+
applyCurrentTheme();
|
|
335
|
+
emit();
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/** Install persisted theming and settings-layer synchronization on one editor root. */
|
|
339
|
+
export function installEditorTheme(root: HTMLElement): () => void {
|
|
340
|
+
installedRoot = root;
|
|
341
|
+
applyCurrentTheme();
|
|
342
|
+
|
|
343
|
+
// Re-read: a snapshot taken before the settings loaded cached the default.
|
|
344
|
+
if (!pendingWrites.has('icons')) cachedIconSetId = readStoredIconSetId();
|
|
345
|
+
setActiveIconSet(editorIconSetSnapshot());
|
|
346
|
+
removeIconSetsListener?.();
|
|
347
|
+
// A stored set a package carries is unknown until that package's style registers.
|
|
348
|
+
removeIconSetsListener = subscribeIconSets(() => {
|
|
349
|
+
if (!pendingWrites.has('icons')) cachedIconSetId = readStoredIconSetId();
|
|
350
|
+
setActiveIconSet(editorIconSetSnapshot());
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// The settings layers changed (a load finished, a project with its own
|
|
354
|
+
// appearance override became active, a setter's write settled): re-read the axes.
|
|
355
|
+
removeSettingsListener?.();
|
|
356
|
+
removeSettingsListener = subscribeSettings(syncFromSettings);
|
|
357
|
+
|
|
358
|
+
// A stored material a package carries is unknown until that package's style
|
|
359
|
+
// registers; Classic paints meanwhile and the stored choice wins on arrival.
|
|
360
|
+
removeMaterialsListener?.();
|
|
361
|
+
removeMaterialsListener = subscribeEditorMaterials(() => {
|
|
362
|
+
if (pendingWrites.has('material')) return;
|
|
363
|
+
const material = readStoredMaterialId();
|
|
364
|
+
if (material === cachedMaterialId) return;
|
|
365
|
+
cachedMaterialId = material;
|
|
366
|
+
applyCurrentTheme();
|
|
367
|
+
emit();
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
removeReducedTransparencyListener?.();
|
|
371
|
+
if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
|
|
372
|
+
try {
|
|
373
|
+
const query = window.matchMedia(REDUCED_TRANSPARENCY_QUERY);
|
|
374
|
+
const onChange = () => {
|
|
375
|
+
applyCurrentTheme();
|
|
376
|
+
emit();
|
|
377
|
+
};
|
|
378
|
+
query.addEventListener('change', onChange);
|
|
379
|
+
removeReducedTransparencyListener = () => query.removeEventListener('change', onChange);
|
|
380
|
+
} catch {
|
|
381
|
+
removeReducedTransparencyListener = null;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return () => {
|
|
386
|
+
if (installedRoot === root) installedRoot = null;
|
|
387
|
+
removeSettingsListener?.();
|
|
388
|
+
removeSettingsListener = null;
|
|
389
|
+
removeMaterialsListener?.();
|
|
390
|
+
removeMaterialsListener = null;
|
|
391
|
+
removeIconSetsListener?.();
|
|
392
|
+
removeIconSetsListener = null;
|
|
393
|
+
removeReducedTransparencyListener?.();
|
|
394
|
+
removeReducedTransparencyListener = null;
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** Test-only process reset; production callers should never clear the preference implicitly. */
|
|
399
|
+
export function resetEditorThemePreferenceForTests(): void {
|
|
400
|
+
cachedPaletteId = null;
|
|
401
|
+
cachedMaterialId = null;
|
|
402
|
+
cachedIconSetId = null;
|
|
403
|
+
pendingWrites.clear();
|
|
404
|
+
installedRoot = null;
|
|
405
|
+
previewTheme = null;
|
|
406
|
+
removeReducedTransparencyListener?.();
|
|
407
|
+
removeReducedTransparencyListener = null;
|
|
408
|
+
listeners.clear();
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Library changes made in this tab immediately repaint a selected custom
|
|
412
|
+
// theme and update every menu/dialog subscriber.
|
|
413
|
+
subscribeEditorThemeLibrary(() => {
|
|
414
|
+
// A palette a PACKAGE carries (`@volter/editor-blender`'s Blender palette, registered
|
|
415
|
+
// by its `workspace.style` contribution) does not exist yet when settings
|
|
416
|
+
// are first read, so `readStoredPaletteId` resolved the stored id to the
|
|
417
|
+
// default and cached it. Re-read it now that the library has grown — the
|
|
418
|
+
// stored choice wins on arrival, exactly as a late-registering MATERIAL
|
|
419
|
+
// already does in `installEditorTheme`. Without this, a project whose
|
|
420
|
+
// `.volter/settings.json` names a contributed palette painted Graphite
|
|
421
|
+
// forever and nothing said why.
|
|
422
|
+
if (!pendingWrites.has('palette')) {
|
|
423
|
+
const stored = readStoredPaletteId();
|
|
424
|
+
if (stored !== cachedPaletteId) cachedPaletteId = stored;
|
|
425
|
+
}
|
|
426
|
+
fallBackFromMissingTheme();
|
|
427
|
+
applyCurrentTheme();
|
|
428
|
+
emit();
|
|
429
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type ThreeViewportProjection = 'perspective' | 'orthographic';
|
|
2
|
+
|
|
3
|
+
export interface ThreeViewportPresentationState {
|
|
4
|
+
readonly projection: ThreeViewportProjection;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
let state: ThreeViewportPresentationState = { projection: 'perspective' };
|
|
8
|
+
const listeners = new Set<() => void>();
|
|
9
|
+
|
|
10
|
+
export function threeViewportPresentation(): ThreeViewportPresentationState {
|
|
11
|
+
return state;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function subscribeThreeViewportPresentation(listener: () => void): () => void {
|
|
15
|
+
listeners.add(listener);
|
|
16
|
+
return () => listeners.delete(listener);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function setThreeViewportProjection(projection: ThreeViewportProjection): void {
|
|
20
|
+
if (state.projection === projection) return;
|
|
21
|
+
state = { ...state, projection };
|
|
22
|
+
for (const listener of listeners) listener();
|
|
23
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `play` channel every project contribution's props carry — ONE resolution
|
|
3
|
+
* of "which live game is this contribution looking at", read by all four
|
|
4
|
+
* contribution hosts (`components/ToolHost.tsx`,
|
|
5
|
+
* `components/InspectorToolSection.tsx`,
|
|
6
|
+
* `components/AssetInspectorToolSection.tsx`, and `@volter/editor-game`'s generation
|
|
7
|
+
* documents).
|
|
8
|
+
*
|
|
9
|
+
* A dev-GUI contribution's whole subject is the running game (owner ruling,
|
|
10
|
+
* `docs/ARCHITECTURE-CORE.md`, 2026-08-19), and this is its door to one.
|
|
11
|
+
*
|
|
12
|
+
* THE DEPENDENCY POINTS THE OTHER WAY, deliberately — play-mode PUBLISHES a
|
|
13
|
+
* reader here, and this module imports nothing of play-mode's. That is the
|
|
14
|
+
* same shape `performance-sources.ts` uses, and it is load-bearing rather than
|
|
15
|
+
* stylistic: an inspector section importing play-mode drags the entire runtime
|
|
16
|
+
* boot chain (renderer setup, vendored postprocessing, WebGL) into every
|
|
17
|
+
* module graph that mounts one — which is a real cost in the editor and an
|
|
18
|
+
* outright import-time crash in a headless host.
|
|
19
|
+
*
|
|
20
|
+
* RESOURCE OWNERSHIP: the reader is play-mode's, for the exact lifetime of one
|
|
21
|
+
* play session. It is the only writer, `publishToolContributionPlay(null)` on
|
|
22
|
+
* exit is the only teardown, and nothing here caches its result.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { ToolContributionPlay } from '@volter/sdk/contributions';
|
|
26
|
+
import { subscribeInspectedInstance } from '@volter/sdk/kit/authoring/active-systems';
|
|
27
|
+
|
|
28
|
+
type PlayReader = () => ToolContributionPlay | null;
|
|
29
|
+
|
|
30
|
+
let _read: PlayReader | null = null;
|
|
31
|
+
const _listeners = new Set<() => void>();
|
|
32
|
+
|
|
33
|
+
/** Publish the live reader for a play session, or `null` when one ends. */
|
|
34
|
+
export function publishToolContributionPlay(read: PlayReader | null): void {
|
|
35
|
+
_read = read;
|
|
36
|
+
for (const listener of _listeners) listener();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** The inspected play instance, or `null` while nothing is playing. */
|
|
40
|
+
export function toolContributionPlay(): ToolContributionPlay | null {
|
|
41
|
+
return _read?.() ?? null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Observe the two things that change WHICH game a contribution is bound to: a
|
|
46
|
+
* session starting or stopping (the publication above), and the Inspect
|
|
47
|
+
* selector moving between live seats. Both, because either alone leaves a host
|
|
48
|
+
* describing another mount's game — and the split is exactly the case where
|
|
49
|
+
* that is invisible.
|
|
50
|
+
*/
|
|
51
|
+
export function subscribeToolContributionPlay(listener: () => void): () => void {
|
|
52
|
+
_listeners.add(listener);
|
|
53
|
+
const unsubscribeInstance = subscribeInspectedInstance(listener);
|
|
54
|
+
return () => {
|
|
55
|
+
_listeners.delete(listener);
|
|
56
|
+
unsubscribeInstance();
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* A stable identity for the bound instance — the `getSnapshot` for
|
|
62
|
+
* {@link subscribeToolContributionPlay}.
|
|
63
|
+
*
|
|
64
|
+
* A STRING rather than the `play` object itself, because
|
|
65
|
+
* `useSyncExternalStore` compares snapshots with `Object.is` and
|
|
66
|
+
* {@link toolContributionPlay} builds a fresh object on every call: returning
|
|
67
|
+
* that would report a change on every render and loop. The mount id is enough
|
|
68
|
+
* to key on because it is never reused (`play-mode.ts`'s instance-identity
|
|
69
|
+
* block), so a remount is always a new value.
|
|
70
|
+
*/
|
|
71
|
+
export function toolContributionPlayKey(): string {
|
|
72
|
+
const play = toolContributionPlay();
|
|
73
|
+
return play ? `play:${play.instanceId}` : 'stopped';
|
|
74
|
+
}
|