@volter/editor-core 0.5.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme-backed renderer selection ink shared by the native Three and Pixi
|
|
3
|
+
* views. CSS can consume `var(--vgai-accent)` directly; WebGL cannot, so this
|
|
4
|
+
* module resolves the inherited token to the integer both renderers speak.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { EDITOR_THEME_CLASS, graphiteDarkEditorTheme } from '@volter/editor-sdk/widgets';
|
|
8
|
+
|
|
9
|
+
/** Import/SSR fallback: Graphite Dark's canonical blue accent. */
|
|
10
|
+
export const DEFAULT_NATIVE_SELECTION_COLOR = 0x579eff;
|
|
11
|
+
|
|
12
|
+
export interface NativeSelectionColors {
|
|
13
|
+
readonly visible: number;
|
|
14
|
+
readonly hidden: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function rgbHex(red: number, green: number, blue: number): number {
|
|
18
|
+
return (red << 16) | (green << 8) | blue;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function parseNormalizedColor(value: string): number | null {
|
|
22
|
+
const hex = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(value.trim())?.[1];
|
|
23
|
+
if (hex) {
|
|
24
|
+
const opaque = hex.length === 3 ? [...hex].map((digit) => `${digit}${digit}`).join('') : hex;
|
|
25
|
+
return Number.parseInt(opaque.slice(0, 6), 16);
|
|
26
|
+
}
|
|
27
|
+
const rgb =
|
|
28
|
+
/^rgba?\(\s*(\d+(?:\.\d+)?)\s*(?:,\s*|\s+)(\d+(?:\.\d+)?)\s*(?:,\s*|\s+)(\d+(?:\.\d+)?)/i.exec(
|
|
29
|
+
value.trim(),
|
|
30
|
+
);
|
|
31
|
+
if (!rgb) return null;
|
|
32
|
+
const channels = rgb.slice(1, 4).map((channel) => Math.round(Number(channel)));
|
|
33
|
+
if (channels.some((channel) => channel < 0 || channel > 255)) return null;
|
|
34
|
+
return rgbHex(channels[0]!, channels[1]!, channels[2]!);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Normalize any browser-valid CSS color (custom palettes may use HSL/names). */
|
|
38
|
+
function parseCssColor(value: string): number | null {
|
|
39
|
+
const direct = parseNormalizedColor(value);
|
|
40
|
+
if (direct !== null || typeof document === 'undefined') return direct;
|
|
41
|
+
if (typeof CSS !== 'undefined' && !CSS.supports('color', value)) return null;
|
|
42
|
+
const context = document.createElement('canvas').getContext('2d');
|
|
43
|
+
if (!context) return null;
|
|
44
|
+
context.fillStyle = '#010203';
|
|
45
|
+
context.fillStyle = value;
|
|
46
|
+
return parseNormalizedColor(String(context.fillStyle));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function themeRoot(element?: Element | null): Element | null {
|
|
50
|
+
if (typeof document === 'undefined') return null;
|
|
51
|
+
return (
|
|
52
|
+
element?.closest(`.${EDITOR_THEME_CLASS}`) ?? document.querySelector(`.${EDITOR_THEME_CLASS}`)
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function dimColor(color: number): number {
|
|
57
|
+
const red = Math.round(((color >> 16) & 0xff) * 0.42);
|
|
58
|
+
const green = Math.round(((color >> 8) & 0xff) * 0.42);
|
|
59
|
+
const blue = Math.round((color & 0xff) * 0.42);
|
|
60
|
+
return rgbHex(red, green, blue);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Current palette accent, with a same-hue dim variant for occluded 3D edges. */
|
|
64
|
+
function themeToken(root: Element | null, name: string): string {
|
|
65
|
+
return root && typeof getComputedStyle !== 'undefined'
|
|
66
|
+
? getComputedStyle(root).getPropertyValue(name).trim()
|
|
67
|
+
: '';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The palette's selection colour: its viewport group's when it carries one
|
|
71
|
+
* (Blender's orange), the accent otherwise. */
|
|
72
|
+
export function nativeSelectionColors(element?: Element | null): NativeSelectionColors {
|
|
73
|
+
const root = themeRoot(element);
|
|
74
|
+
const raw = themeToken(root, '--vgai-viewport-selection') || themeToken(root, '--vgai-accent');
|
|
75
|
+
const visible =
|
|
76
|
+
parseCssColor(raw || graphiteDarkEditorTheme.color.accent.default) ??
|
|
77
|
+
DEFAULT_NATIVE_SELECTION_COLOR;
|
|
78
|
+
return { visible, hidden: dimColor(visible) };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** The palette's VIEWPORT GROUP (`EditorTheme.color.viewport`), each member
|
|
82
|
+
* `null` when the palette carries none — the viewport keeps its own then. */
|
|
83
|
+
export interface NativeViewportLook {
|
|
84
|
+
readonly background: number | null;
|
|
85
|
+
readonly grid: number | null;
|
|
86
|
+
readonly axisX: number | null;
|
|
87
|
+
readonly axisY: number | null;
|
|
88
|
+
readonly active: number | null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Whether the ACTIVE LOOK declares a `color.viewport` group at all — the
|
|
93
|
+
* question "is the backdrop the look's, or the editor's own?"
|
|
94
|
+
* (ARCHITECTURE-CORE §A model is data: a data subject opens in an isolation
|
|
95
|
+
* scene whose story is the studio, and the studio's backdrop is the editor's;
|
|
96
|
+
* a look that paints the viewport itself — Blender's flat grey — has already
|
|
97
|
+
* answered, and the studio must not paint over it).
|
|
98
|
+
*
|
|
99
|
+
* `background` alone is the whole test because the group is ALL-OR-NOTHING:
|
|
100
|
+
* `EditorTheme.color.viewport` makes every member required, and a palette
|
|
101
|
+
* DOCUMENT that carries a partial group is rejected by name at parse
|
|
102
|
+
* (`theme-library.ts`'s viewport reconstruction). So the group is present
|
|
103
|
+
* exactly when this token paints.
|
|
104
|
+
*/
|
|
105
|
+
export function lookDeclaresViewportColors(element?: Element | null): boolean {
|
|
106
|
+
return nativeViewportLook(element).background !== null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function nativeViewportLook(element?: Element | null): NativeViewportLook {
|
|
110
|
+
const root = themeRoot(element);
|
|
111
|
+
const read = (name: string): number | null => {
|
|
112
|
+
const raw = themeToken(root, name);
|
|
113
|
+
return raw ? parseCssColor(raw) : null;
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
background: read('--vgai-viewport-background'),
|
|
117
|
+
grid: read('--vgai-viewport-grid'),
|
|
118
|
+
axisX: read('--vgai-viewport-axis-x'),
|
|
119
|
+
axisY: read('--vgai-viewport-axis-y'),
|
|
120
|
+
active: read('--vgai-viewport-active'),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* THE LOOK'S TRANSFORM-GIZMO SIZE, in px per gizmo unit
|
|
126
|
+
* (`EditorTheme.density.viewport.gizmoSize`), or `null` when the look names
|
|
127
|
+
* none — which is every look but Blender's, and means "keep three's own
|
|
128
|
+
* viewport-relative handle".
|
|
129
|
+
*
|
|
130
|
+
* Read off the emitted token for the same reason the colours above are: WebGL
|
|
131
|
+
* cannot consume a CSS variable, and the theme object reaching the viewport
|
|
132
|
+
* would be a second source for a value the stylesheet already carries.
|
|
133
|
+
* `editor-viewport.ts` is the one caller and it says what it does with the
|
|
134
|
+
* number; nothing here knows about three's units.
|
|
135
|
+
*/
|
|
136
|
+
export function nativeViewportGizmoSize(element?: Element | null): number | null {
|
|
137
|
+
const raw = themeToken(themeRoot(element), '--vgai-viewport-gizmo-size');
|
|
138
|
+
if (!raw) return null;
|
|
139
|
+
const value = Number.parseFloat(raw);
|
|
140
|
+
return Number.isFinite(value) && value > 0 ? value : null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* WHICH TOOL THE LOOK'S SHELF OPENS ON
|
|
145
|
+
* (`EditorTheme.density.viewport.shelfTool`), or `null` when the look names
|
|
146
|
+
* none — which is every look but Blender's, and means the editor's own
|
|
147
|
+
* combined gizmo.
|
|
148
|
+
*
|
|
149
|
+
* It rides the THEME rather than the chrome regions, and that is measured
|
|
150
|
+
* rather than stylistic: a region crosses the Code-OSS frame's configuration
|
|
151
|
+
* service, which knows only the key list its generated contribution carries
|
|
152
|
+
* and drops anything newer until the next release is cut
|
|
153
|
+
* (`workspace-regions.ts`'s own note). A theme token is installed on the theme
|
|
154
|
+
* root by the page, so a look can add a value and use it in the same session.
|
|
155
|
+
*/
|
|
156
|
+
export function nativeViewportShelfTool(element?: Element | null): 'select' | 'transform' | null {
|
|
157
|
+
const raw = themeToken(themeRoot(element), '--vgai-viewport-shelf-tool');
|
|
158
|
+
return raw === 'select' || raw === 'transform' ? raw : null;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* WHICH AXIS THE LOOK SAYS IS UP in the world its stage presents
|
|
163
|
+
* (`EditorTheme.density.viewport.upAxis`), or `null` when it names none —
|
|
164
|
+
* which is every look but Blender's, and means three's own frame.
|
|
165
|
+
*
|
|
166
|
+
* Read off the emitted token for the same reason the two above are: WebGL
|
|
167
|
+
* consumes no CSS variable, and a second path from the theme object into the
|
|
168
|
+
* viewport would be a second source for one value. What `'z'` means in three's
|
|
169
|
+
* units — which handle carries which axis's colour, which side its arm is
|
|
170
|
+
* drawn on, and what the six navigation balls are called — is
|
|
171
|
+
* `editor-viewport.ts`'s to know, and it says so there.
|
|
172
|
+
*/
|
|
173
|
+
export function nativeViewportUpAxis(element?: Element | null): 'y' | 'z' | null {
|
|
174
|
+
const raw = themeToken(themeRoot(element), '--vgai-viewport-up-axis');
|
|
175
|
+
return raw === 'y' || raw === 'z' ? raw : null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** WHAT A BOX SELECT MEANS in the look's stage
|
|
179
|
+
* (`EditorTheme.density.viewport.boxSelect`), or `null` for the editor's own
|
|
180
|
+
* `contain`. Blender's Select Box is `touch`; see the field's own note for
|
|
181
|
+
* why neither can be the other's default. */
|
|
182
|
+
export function nativeViewportBoxSelect(element?: Element | null): 'contain' | 'touch' | null {
|
|
183
|
+
const raw = themeToken(themeRoot(element), '--vgai-viewport-box-select');
|
|
184
|
+
return raw === 'contain' || raw === 'touch' ? raw : null;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Observe the one theme root's inline token update. This includes saved theme
|
|
189
|
+
* changes and unsaved Theme Manager previews; neither renderer has to poll
|
|
190
|
+
* `getComputedStyle` on every frame.
|
|
191
|
+
*/
|
|
192
|
+
export function subscribeNativeSelectionTheme(
|
|
193
|
+
element: Element | null | undefined,
|
|
194
|
+
listener: () => void,
|
|
195
|
+
): () => void {
|
|
196
|
+
listener();
|
|
197
|
+
const root = themeRoot(element);
|
|
198
|
+
if (!root || typeof MutationObserver === 'undefined') return () => {};
|
|
199
|
+
const observer = new MutationObserver(listener);
|
|
200
|
+
observer.observe(root, { attributes: true, attributeFilter: ['style'] });
|
|
201
|
+
return () => observer.disconnect();
|
|
202
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHAT THE ASSET LAB 3D DOCUMENT ASKS THE SHELL — the one collaborator
|
|
3
|
+
* `StageHost.tsx` (with its toolbar) declares and the shell
|
|
4
|
+
* installs at boot.
|
|
5
|
+
*
|
|
6
|
+
* ARCHITECTURE-CORE §Editor chrome, "The viewport stack is separable": a
|
|
7
|
+
* surface below the shell never imports the shell's transport, a world
|
|
8
|
+
* authoring adapter, or project discovery. The 3D document was importing four
|
|
9
|
+
* modules to answer three questions —
|
|
10
|
+
*
|
|
11
|
+
* · where do this document's own bytes go? (`object3d-document-persistence`
|
|
12
|
+
* → project file history → the resource history backend)
|
|
13
|
+
* · how do I replace a whole SOURCE file? (`ui-source/tier-source-write-backend`
|
|
14
|
+
* for the tier's recorder + `history/source-history-backend` to run it)
|
|
15
|
+
* · where does a thumbnail framing get recorded? (`asset-workflow/thumbnail-system`
|
|
16
|
+
* to read `.vgai/thumbnails.json` + `components/asset-editor-persistence`
|
|
17
|
+
* to write it, which reaches `editor-api.ts`)
|
|
18
|
+
*
|
|
19
|
+
* — and every one of those is TRANSPORT. Measured, those edges were 72 of the
|
|
20
|
+
* document's 213 files, all of them behind the server SDK barrel; the document
|
|
21
|
+
* itself only ever needed "hand these bytes to the project and tell me whether
|
|
22
|
+
* one moved".
|
|
23
|
+
*
|
|
24
|
+
* ## The default is the NO-SHELL answer, and it is deliberate
|
|
25
|
+
*
|
|
26
|
+
* {@link DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY} is what a document mounted
|
|
27
|
+
* with no shell above it (a bounded host; a fixture) gets: there is no
|
|
28
|
+
* project to write to, so each member REFUSES by name rather than
|
|
29
|
+
* half-answering. Every call site here already renders a refusal — the
|
|
30
|
+
* document's error state, the toolbar's error banner — because the same
|
|
31
|
+
* refusal is what a read-only tier produced before this seam existed
|
|
32
|
+
* ("This editor tier cannot write project source").
|
|
33
|
+
*
|
|
34
|
+
* In the editor the shell policy is installed once by `EditorProvider`
|
|
35
|
+
* (`EditorContext.tsx`), beside the viewport policy and before any document
|
|
36
|
+
* mounts, so today's behaviour is unchanged.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import type {
|
|
40
|
+
Object3DDocumentPersistenceSession,
|
|
41
|
+
OpenObject3DDocumentPersistenceOptions,
|
|
42
|
+
} from './authoring/object3d-document-persistence';
|
|
43
|
+
import type { HistoryService } from './history/history-service';
|
|
44
|
+
|
|
45
|
+
/** Re-exported from its declaration site so a consumer of this seam does not
|
|
46
|
+
* import the persistence module (which reaches project file history) for a
|
|
47
|
+
* type. `import type` is erased, so this costs the closure nothing. */
|
|
48
|
+
export type { Object3DDocumentPersistenceSession } from './authoring/object3d-document-persistence';
|
|
49
|
+
|
|
50
|
+
/** A whole-file SOURCE replacement — the document's animation binding and its
|
|
51
|
+
* single-module documents both write this way. */
|
|
52
|
+
export interface Object3DDocumentSourceReplacement {
|
|
53
|
+
readonly file: string;
|
|
54
|
+
readonly source: string;
|
|
55
|
+
readonly label: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The camera framing `.vgai/thumbnails.json` records for one asset.
|
|
59
|
+
* `undefined` is the RESET — remove this asset's framing. */
|
|
60
|
+
export interface Object3DDocumentThumbnailFraming {
|
|
61
|
+
readonly position: [number, number, number];
|
|
62
|
+
readonly target: [number, number, number];
|
|
63
|
+
readonly fov?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface Object3DDocumentWritePolicy {
|
|
67
|
+
/**
|
|
68
|
+
* Open the persistence baseline for a document that declares a binding.
|
|
69
|
+
* The session owns transaction ordering, checksum preflight and canonical
|
|
70
|
+
* undo/redo; the document only calls `commit`.
|
|
71
|
+
*/
|
|
72
|
+
openPersistence(
|
|
73
|
+
options: OpenObject3DDocumentPersistenceOptions,
|
|
74
|
+
): Promise<Object3DDocumentPersistenceSession>;
|
|
75
|
+
/**
|
|
76
|
+
* Replace a whole source file through the tier's recorder, in `history`.
|
|
77
|
+
* Resolves to whether a byte actually moved. The HISTORY lookup stays with
|
|
78
|
+
* the document (it holds the session's service already, and its two call
|
|
79
|
+
* sites word an absent one differently); what the shell owns here is the
|
|
80
|
+
* WRITE BACKEND — the thing a read-only tier does not have.
|
|
81
|
+
*/
|
|
82
|
+
replaceSource(
|
|
83
|
+
history: HistoryService,
|
|
84
|
+
request: Object3DDocumentSourceReplacement,
|
|
85
|
+
): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* Record (or clear, with `undefined`) this asset's thumbnail framing in the
|
|
88
|
+
* project's thumbnail manifest. Refuses loudly rather than rebuilding a
|
|
89
|
+
* manifest it could not read.
|
|
90
|
+
*/
|
|
91
|
+
saveThumbnailFraming(
|
|
92
|
+
assetPath: string,
|
|
93
|
+
framing: Object3DDocumentThumbnailFraming | undefined,
|
|
94
|
+
): Promise<void>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** The one refusal, worded for the member that raised it. Rejected rather than
|
|
98
|
+
* thrown so every member answers the same way; each call site is already
|
|
99
|
+
* inside the `await` of a try/catch that renders the message. */
|
|
100
|
+
function refuse<T>(what: string): Promise<T> {
|
|
101
|
+
return Promise.reject(new Error(`This editor tier cannot ${what}.`));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export const DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY: Object3DDocumentWritePolicy = {
|
|
105
|
+
openPersistence: () => refuse('persist Asset Lab documents'),
|
|
106
|
+
// The exact wording a read-only tier produced when the document asked the
|
|
107
|
+
// tier recorder for a source-write backend and got none.
|
|
108
|
+
replaceSource: () => refuse('write project source'),
|
|
109
|
+
saveThumbnailFraming: () => refuse('write project thumbnail framing'),
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
let _policy: Object3DDocumentWritePolicy = DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Install the shell's composition. One owner, same rule as
|
|
116
|
+
* `installViewportAuthoringPolicy` and the store's `attachHistory`:
|
|
117
|
+
* re-installing the SAME policy is a no-op (React strict-mode double-invokes
|
|
118
|
+
* the provider body), a DIFFERENT one throws rather than letting two shells
|
|
119
|
+
* disagree about where a document's bytes go.
|
|
120
|
+
*/
|
|
121
|
+
export function installObject3DDocumentWritePolicy(policy: Object3DDocumentWritePolicy): void {
|
|
122
|
+
if (_policy === policy) return;
|
|
123
|
+
if (_policy !== DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY) {
|
|
124
|
+
throw new Error('An Object3D document write policy is already installed.');
|
|
125
|
+
}
|
|
126
|
+
_policy = policy;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** The installed policy, or the no-shell default. */
|
|
130
|
+
export function object3DDocumentWritePolicy(): Object3DDocumentWritePolicy {
|
|
131
|
+
return _policy;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Test seam: drop the installed policy. */
|
|
135
|
+
export function __resetObject3DDocumentWritePolicyForTest(): void {
|
|
136
|
+
_policy = DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY;
|
|
137
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime detection of the PACKAGED editor server (`packages/editor/server/
|
|
3
|
+
* packaged.ts` — a `@vgai/editor` npm package with NO monorepo checkout on
|
|
4
|
+
* disk) from editor CLIENT code. Needed because a react world's mount
|
|
5
|
+
* (`react-mount-runtime.ts`'s `resolveReactRootMountRuntime`) must resolve its
|
|
6
|
+
* `react`/`react-dom/client`/`WorldProvider`-fallback wrapper from the
|
|
7
|
+
* PROJECT's own module graph ONLY under this runtime — see that function's
|
|
8
|
+
* doc comment, and `packaged.ts`'s header doc comment ("React-world OID
|
|
9
|
+
* authoring parity"), for the dual-React-instance bug this closes. Under
|
|
10
|
+
* dev, this must resolve `false` so the existing static-import path
|
|
11
|
+
* stays byte-unchanged (one shared Vite instance already collapses both
|
|
12
|
+
* react copies via `resolve.dedupe`).
|
|
13
|
+
*
|
|
14
|
+
* Reads the server's own `packaged` flag off `/__editor/project`'s response
|
|
15
|
+
* (computed server-side via `isMonorepoScaffoldRoot`, `server-utils.ts`)
|
|
16
|
+
* rather than probing a URL that only resolves in packaged mode: an
|
|
17
|
+
* unconditional dynamic `import()` probe would 404 (and log an
|
|
18
|
+
* unsuppressible browser console error) on EVERY react-world mount under
|
|
19
|
+
* dev — the exact reasoning `binding-resolver.ts`'s
|
|
20
|
+
* `loadProjectUIRegistry` doc comment already recorded for `hasUiRegistry`
|
|
21
|
+
* ("the client must not probe /@fs for it").
|
|
22
|
+
*
|
|
23
|
+
* A plain inline `fetch()`, not `editor-api.ts`'s `getCurrentServerProject`
|
|
24
|
+
* — same reasoning `loadProjectUIRegistry` documents: this module (via
|
|
25
|
+
* `binding-resolver.ts`) must stay importable by headless Node/vitest
|
|
26
|
+
* suites, and `editor-api.ts`'s module top level pulls in `./storage`.
|
|
27
|
+
*
|
|
28
|
+
* A HOST THAT SERVES NO `/__editor/project` is answered locally rather than by
|
|
29
|
+
* a doomed fetch: it is never the packaged runtime, because "packaged" names a
|
|
30
|
+
* Node host serving a project's own module graph, and a 404's console error is
|
|
31
|
+
* unsuppressible on every doorway of every mount. Same guard, same reason, as
|
|
32
|
+
* `ui-source/tier-source-write-backend.ts`'s `serverSourceWriteRoutes`.
|
|
33
|
+
*
|
|
34
|
+
* ## What is memoized, and what a FAILED probe does
|
|
35
|
+
*
|
|
36
|
+
* An ANSWER is memoized for the page — the runtime a server process runs
|
|
37
|
+
* under cannot change without a restart, so a settled answer is settled. A
|
|
38
|
+
* probe that never got an answer is NOT memoized, and does NOT resolve: it
|
|
39
|
+
* drops the memo and REJECTS, so the next caller asks again.
|
|
40
|
+
*
|
|
41
|
+
* Both halves were bought by one measured failure. A `.catch(() => false)`
|
|
42
|
+
* latch turned a single unreachable fetch — a mount landing in the window
|
|
43
|
+
* while `vgai edit` restarts its dev server, which it does on any
|
|
44
|
+
* server-file change — into a page where EVERY doorway
|
|
45
|
+
* (`three-ingest-runtime`, `canvas-entry-runtime`, `r3f-entry-runtime`,
|
|
46
|
+
* the two story runtimes, `binding-resolver`'s react
|
|
47
|
+
* mount) silently resolved the SHELL's namespace for the rest of the
|
|
48
|
+
* session. Under the packaged runtime that is the wrong graph, and the cost
|
|
49
|
+
* lands 10–15 seconds later as a mount failure whose message blames the
|
|
50
|
+
* GAME ("bundles its own (un-shared) copy of three") for a defect in this
|
|
51
|
+
* host — the exact mis-attribution `three-ingest-runtime.ts`'s own
|
|
52
|
+
* loud-throw comment already refuses to make for the sibling case.
|
|
53
|
+
*
|
|
54
|
+
* So "I don't know" is never spent as "dev". Every doorway reads this with
|
|
55
|
+
* `await isPackagedRuntime()` and does nothing else with the answer, so the
|
|
56
|
+
* rejection propagates to the mount site unchanged: nothing mounts on a
|
|
57
|
+
* guessed graph, the message names this host, and because the memo is
|
|
58
|
+
* dropped the remedy it states — retry the mount — is a real one rather
|
|
59
|
+
* than advice.
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
import { editorServerJson } from './editor-server-response';
|
|
63
|
+
|
|
64
|
+
let cachedIsPackaged: Promise<boolean> | null = null;
|
|
65
|
+
|
|
66
|
+
export function isPackagedRuntime(): Promise<boolean> {
|
|
67
|
+
if (!cachedIsPackaged) {
|
|
68
|
+
// The `fetch` call is INSIDE the chain so that a synchronous throw from it
|
|
69
|
+
// is a rejected probe like any other, rather than an exception thrown at
|
|
70
|
+
// whoever happened to ask first.
|
|
71
|
+
const probe: Promise<boolean> = Promise.resolve()
|
|
72
|
+
.then(() => fetch('/__editor/project'))
|
|
73
|
+
.then((res) =>
|
|
74
|
+
editorServerJson<{ project?: { packaged?: boolean } | null }>(
|
|
75
|
+
res,
|
|
76
|
+
'`/__editor/project` did not answer',
|
|
77
|
+
),
|
|
78
|
+
)
|
|
79
|
+
.then((data) => Boolean(data.project?.packaged))
|
|
80
|
+
.catch((err: unknown) => {
|
|
81
|
+
if (cachedIsPackaged === probe) cachedIsPackaged = null;
|
|
82
|
+
throw new Error(
|
|
83
|
+
"This editor session's runtime is unknown — `/__editor/project` did not answer, so " +
|
|
84
|
+
'which module graph a world mounts in (this shell’s, or the project’s) cannot be ' +
|
|
85
|
+
'decided and nothing was mounted on a guess. This is a fault in the editor host, ' +
|
|
86
|
+
'not in the game. The answer is not latched: retry the mount (reopen the project) ' +
|
|
87
|
+
`and the question is asked again. (${err instanceof Error ? err.message : String(err)})`,
|
|
88
|
+
{ cause: err },
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
cachedIsPackaged = probe;
|
|
92
|
+
}
|
|
93
|
+
return cachedIsPackaged;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Test-only: reset the memoized result between tests (mirrors
|
|
97
|
+
* `setCachedProjectUIRegistry`'s test-seam shape). */
|
|
98
|
+
export function resetPackagedRuntimeCacheForTest(): void {
|
|
99
|
+
cachedIsPackaged = null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Test-only: pre-seed the probe's answer. jsdom has no `/__editor/project` to
|
|
103
|
+
* ask (vitest's MODE is not `web`, so the browser short-circuit does not
|
|
104
|
+
* apply), and the loud unknown-runtime refusal — correct in a live session —
|
|
105
|
+
* is pure noise in a suite that mounts portable stories. */
|
|
106
|
+
export function setPackagedRuntimeForTest(packaged: boolean): void {
|
|
107
|
+
cachedIsPackaged = Promise.resolve(packaged);
|
|
108
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 3,
|
|
3
|
+
"name": "Maya",
|
|
4
|
+
"theme": {
|
|
5
|
+
"id": "maya",
|
|
6
|
+
"color": {
|
|
7
|
+
"surface": {
|
|
8
|
+
"shell": "#2b2b2b",
|
|
9
|
+
"panel": "#444444",
|
|
10
|
+
"chrome": "#373737",
|
|
11
|
+
"raised": "#4b4b4b",
|
|
12
|
+
"inset": "#333333",
|
|
13
|
+
"overlay": "rgba(55,55,55,0.94)"
|
|
14
|
+
},
|
|
15
|
+
"boundary": {
|
|
16
|
+
"default": "#2b2b2b",
|
|
17
|
+
"strong": "#5a5a5a"
|
|
18
|
+
},
|
|
19
|
+
"content": {
|
|
20
|
+
"primary": "#cccccc",
|
|
21
|
+
"muted": "#a8a8a8",
|
|
22
|
+
"dim": "#858585",
|
|
23
|
+
"onAccent": "#ffffff",
|
|
24
|
+
"onBright": {
|
|
25
|
+
"primary": "#1c1c1c",
|
|
26
|
+
"muted": "rgba(28,28,28,0.82)",
|
|
27
|
+
"dim": "rgba(28,28,28,0.7)"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"accent": {
|
|
31
|
+
"default": "#5285a6",
|
|
32
|
+
"muted": "rgba(82,133,166,0.34)"
|
|
33
|
+
},
|
|
34
|
+
"semantic": {
|
|
35
|
+
"danger": "#d9534f",
|
|
36
|
+
"dangerMuted": "rgba(217,83,79,0.28)",
|
|
37
|
+
"dangerFaint": "rgba(217,83,79,0.12)",
|
|
38
|
+
"warning": "#e0a030",
|
|
39
|
+
"warningMuted": "rgba(224,160,48,0.28)",
|
|
40
|
+
"success": "#4fd85b",
|
|
41
|
+
"successMuted": "rgba(79,216,91,0.28)",
|
|
42
|
+
"dynamic": "#e6a6ff",
|
|
43
|
+
"dynamicMuted": "rgba(230,166,255,0.18)",
|
|
44
|
+
"instance": "#4fd85b"
|
|
45
|
+
},
|
|
46
|
+
"neutralOverlay": {
|
|
47
|
+
"hover": "rgba(255,255,255,0.07)",
|
|
48
|
+
"active": "rgba(255,255,255,0.12)"
|
|
49
|
+
},
|
|
50
|
+
"scrim": "rgba(0,0,0,0.55)"
|
|
51
|
+
},
|
|
52
|
+
"typography": {
|
|
53
|
+
"sans": "'Helvetica Neue', Arial, system-ui, sans-serif",
|
|
54
|
+
"mono": "Menlo, Consolas, monospace"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 3,
|
|
3
|
+
"name": "Substance",
|
|
4
|
+
"theme": {
|
|
5
|
+
"id": "substance",
|
|
6
|
+
"color": {
|
|
7
|
+
"surface": {
|
|
8
|
+
"shell": "#1e1e1e",
|
|
9
|
+
"panel": "#252525",
|
|
10
|
+
"chrome": "#2a2a2a",
|
|
11
|
+
"raised": "#2d2d2d",
|
|
12
|
+
"inset": "#1a1a1a",
|
|
13
|
+
"overlay": "rgba(37,37,37,0.94)"
|
|
14
|
+
},
|
|
15
|
+
"boundary": {
|
|
16
|
+
"default": "#3a3a3a",
|
|
17
|
+
"strong": "#4a4a4a"
|
|
18
|
+
},
|
|
19
|
+
"content": {
|
|
20
|
+
"primary": "#d9d9d9",
|
|
21
|
+
"muted": "#a6a6a6",
|
|
22
|
+
"dim": "#7f7f7f",
|
|
23
|
+
"onAccent": "#ffffff",
|
|
24
|
+
"onBright": {
|
|
25
|
+
"primary": "#1e1e1e",
|
|
26
|
+
"muted": "rgba(30,30,30,0.82)",
|
|
27
|
+
"dim": "rgba(30,30,30,0.7)"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"accent": {
|
|
31
|
+
"default": "#4aa3df",
|
|
32
|
+
"muted": "rgba(74,163,223,0.3)"
|
|
33
|
+
},
|
|
34
|
+
"semantic": {
|
|
35
|
+
"danger": "#e5534b",
|
|
36
|
+
"dangerMuted": "rgba(229,83,75,0.28)",
|
|
37
|
+
"dangerFaint": "rgba(229,83,75,0.12)",
|
|
38
|
+
"warning": "#e3a52f",
|
|
39
|
+
"warningMuted": "rgba(227,165,47,0.28)",
|
|
40
|
+
"success": "#5cc27a",
|
|
41
|
+
"successMuted": "rgba(92,194,122,0.28)",
|
|
42
|
+
"dynamic": "#4aa3df",
|
|
43
|
+
"dynamicMuted": "rgba(74,163,223,0.18)",
|
|
44
|
+
"instance": "#e98b3a"
|
|
45
|
+
},
|
|
46
|
+
"neutralOverlay": {
|
|
47
|
+
"hover": "rgba(255,255,255,0.06)",
|
|
48
|
+
"active": "rgba(255,255,255,0.11)"
|
|
49
|
+
},
|
|
50
|
+
"scrim": "rgba(0,0,0,0.62)"
|
|
51
|
+
},
|
|
52
|
+
"typography": {
|
|
53
|
+
"sans": "'Source Sans 3', 'Segoe UI', system-ui, sans-serif",
|
|
54
|
+
"mono": "'Source Code Pro', Menlo, monospace"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural detection of a PASTEBOARD MODULE — an ordinary project `.tsx`
|
|
3
|
+
* whose default export renders the pasteboard capability's `Pasteboard`
|
|
4
|
+
* helper at its root (`src/lib/pasteboard/pasteboard.tsx` in the project,
|
|
5
|
+
* marker `data-vgai-pasteboard`). Same doctrine as `LiveModuleDocument`'s
|
|
6
|
+
* Object3D probe and the quarks JSON probe: detection is structural, never a
|
|
7
|
+
* filename convention, so a project's freely edited copy of the helper keeps
|
|
8
|
+
* working.
|
|
9
|
+
*
|
|
10
|
+
* The probe is a BARE UNWRAP, not a render: the default export is invoked as
|
|
11
|
+
* a plain function and the returned element chain is followed by invoking
|
|
12
|
+
* each function `type` until a host element appears, whose props either carry
|
|
13
|
+
* the marker or do not. This keeps the probe free of react-dom and of the
|
|
14
|
+
* two-React-copies trap (the editor's react-dom driving a project component
|
|
15
|
+
* would crash on the project React's own hook dispatcher). The CONTRACT that
|
|
16
|
+
* buys: the chain from the default export down to `<Pasteboard>` is hook-free
|
|
17
|
+
* static composition — which a pasteboard is by design. Children BELOW the
|
|
18
|
+
* Pasteboard root may do anything; the probe never descends past the first
|
|
19
|
+
* host element. A chain that throws (hooks, wrong shape) is simply not a
|
|
20
|
+
* pasteboard: the module falls back to the ordinary source viewer.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { liveModuleImportUrl } from '@volter/editor-sdk/session/project-module-url';
|
|
24
|
+
|
|
25
|
+
const PASTEBOARD_MARKER = 'data-vgai-pasteboard';
|
|
26
|
+
|
|
27
|
+
/** Follow a React element's function-component chain to its first host
|
|
28
|
+
* element and answer whether that element carries the pasteboard marker. */
|
|
29
|
+
export function isPasteboardElementTree(value: unknown): boolean {
|
|
30
|
+
let current = value;
|
|
31
|
+
for (let depth = 0; depth < 12; depth++) {
|
|
32
|
+
if (!current || typeof current !== 'object') return false;
|
|
33
|
+
const element = current as { type?: unknown; props?: Record<string, unknown> | null };
|
|
34
|
+
if (typeof element.type === 'string') {
|
|
35
|
+
return element.props?.[PASTEBOARD_MARKER] === 'true';
|
|
36
|
+
}
|
|
37
|
+
if (typeof element.type === 'function') {
|
|
38
|
+
try {
|
|
39
|
+
current = (element.type as (props: unknown) => unknown)(element.props ?? {});
|
|
40
|
+
} catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// memo/forwardRef/fragment wrappers are outside the static-composition
|
|
46
|
+
// contract; an author who wants one keeps it below the Pasteboard root.
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Import the module (same revisioned url the live-module probe uses, so the
|
|
54
|
+
* two probes share one fetch) and answer whether its DEFAULT export is a
|
|
55
|
+
* pasteboard component. Named exports are deliberately not considered — the
|
|
56
|
+
* pasteboard contract is "the file IS the canvas", and a file whose canvas is
|
|
57
|
+
* a side export has no one subject.
|
|
58
|
+
*/
|
|
59
|
+
export async function probePasteboardModule(
|
|
60
|
+
projectRoot: string,
|
|
61
|
+
modulePath: string,
|
|
62
|
+
revision: number,
|
|
63
|
+
): Promise<boolean> {
|
|
64
|
+
let namespace: Record<string, unknown>;
|
|
65
|
+
try {
|
|
66
|
+
namespace = (await import(
|
|
67
|
+
/* @vite-ignore */ liveModuleImportUrl(projectRoot, modulePath, revision)
|
|
68
|
+
)) as Record<string, unknown>;
|
|
69
|
+
} catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const candidate = namespace['default'];
|
|
73
|
+
if (typeof candidate !== 'function') return false;
|
|
74
|
+
let element: unknown;
|
|
75
|
+
try {
|
|
76
|
+
element = (candidate as (props: Record<string, unknown>) => unknown)({});
|
|
77
|
+
} catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return isPasteboardElementTree(element);
|
|
81
|
+
}
|