@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,106 @@
|
|
|
1
|
+
import { lazy, Suspense, use, useEffect, useSyncExternalStore } from 'react';
|
|
2
|
+
import { connectAssetEvents } from '../asset-events';
|
|
3
|
+
import { installAssetSelectionAutoClear } from '../asset-selection';
|
|
4
|
+
import { registerEditorShellHotkeys } from '../editor-hotkeys';
|
|
5
|
+
import {
|
|
6
|
+
useEditorInit,
|
|
7
|
+
useEditorStore,
|
|
8
|
+
useHistoryCommands,
|
|
9
|
+
useHistoryService,
|
|
10
|
+
} from '../editor-runtime';
|
|
11
|
+
import { installAuxiliaryEvents } from '../workspace-aux-commands';
|
|
12
|
+
import { installUtilityAutoOpen } from '../workspace-utility-commands';
|
|
13
|
+
import { AgentPresentationNotice } from './AgentPresentationNotice';
|
|
14
|
+
import { useCenterDocuments } from './CenterDocuments';
|
|
15
|
+
import { ensureCoreUtilitiesRegistered } from './core-utilities';
|
|
16
|
+
import { installKindDocumentRefresh } from './kind-documents';
|
|
17
|
+
import { ProjectLayout } from './ProjectLayout';
|
|
18
|
+
import { PaletteActionPublisher } from './palette-action-publisher';
|
|
19
|
+
import { ensureCoreStatusContributionsRegistered } from './status-contributions';
|
|
20
|
+
import { installStandingToolDocuments } from './tool-documents';
|
|
21
|
+
import { setWorkspaceHistoryService } from './workspace-history';
|
|
22
|
+
|
|
23
|
+
// Session discovery remains alive even when every document tab is closed.
|
|
24
|
+
const ProjectAuthoringBootstrap = lazy(async () => {
|
|
25
|
+
const module = await import('./NonThreeAuthoringBootstrap');
|
|
26
|
+
return { default: module.ProjectAuthoringBootstrap };
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export function DefaultEditorLayout() {
|
|
30
|
+
const store = useEditorStore();
|
|
31
|
+
const history = useHistoryService();
|
|
32
|
+
const historyCommands = useHistoryCommands();
|
|
33
|
+
use(useEditorInit()); // suspends until project is detected
|
|
34
|
+
|
|
35
|
+
// Subscribe to store changes: the reads below are what need it; the version
|
|
36
|
+
// itself is not read.
|
|
37
|
+
useSyncExternalStore(store.subscribe, store.getShellSnapshot ?? store.getSnapshot);
|
|
38
|
+
// W1 — install the authored document plus the warm runtime host (whose Game
|
|
39
|
+
// tab is rail-visible only while active) and keep registry activation synced
|
|
40
|
+
// with the store's activeViewportTab (T6.3 gate).
|
|
41
|
+
useCenterDocuments(store);
|
|
42
|
+
// W3 (workspace-shell §9/W3) — the shell contributions the new center
|
|
43
|
+
// documents ride on:
|
|
44
|
+
// - the STANDING tool documents (`installStandingToolDocuments`): every
|
|
45
|
+
// discovered document contribution the project declares `standing` opens
|
|
46
|
+
// as a pinned board beside `3D`/`UI`/`Dev` and stays in step with
|
|
47
|
+
// discovery, so a capability added mid-session brings its tab with it and
|
|
48
|
+
// a deleted one takes its tab away. The editor owns no per-asset
|
|
49
|
+
// documents of its own — a capability's own tool is what puts a board
|
|
50
|
+
// here (the `data-tables` Data tab is the worked case);
|
|
51
|
+
// - the Build Output utility + build-progress status contribution
|
|
52
|
+
// (server mode only — builds spawn npm scripts server-side).
|
|
53
|
+
// W4 (workspace-shell §9/W4) — status-bar contributions register BEFORE the
|
|
54
|
+
// build ensure below so the order-0 items sequence save-status first; the
|
|
55
|
+
// utility auto-open watcher (save/build failure → the right utility) is
|
|
56
|
+
// per-store. Core utilities register before the host reconciles.
|
|
57
|
+
useEffect(() => ensureCoreStatusContributionsRegistered(), []);
|
|
58
|
+
useEffect(() => ensureCoreUtilitiesRegistered(), []);
|
|
59
|
+
useEffect(() => installUtilityAutoOpen(history), [history]);
|
|
60
|
+
useEffect(() => installAuxiliaryEvents(), []);
|
|
61
|
+
useEffect(() => installStandingToolDocuments(store), [store]);
|
|
62
|
+
useEffect(() => installKindDocumentRefresh(store), [store]);
|
|
63
|
+
useEffect(() => setWorkspaceHistoryService(history), [history]);
|
|
64
|
+
// Undo/redo/save/delete live here, not on the world root's stage: a canvas-only
|
|
65
|
+
// project never mounts that panel, and Ctrl+Z was a silent no-op there.
|
|
66
|
+
useEffect(() => registerEditorShellHotkeys(store, historyCommands), [store, historyCommands]);
|
|
67
|
+
// W2 (§5.1) — an ENTITY selection change drops the asset selection, so the
|
|
68
|
+
// Inspector goes back to being purely entity-contextual (asset-selection.ts).
|
|
69
|
+
useEffect(() => installAssetSelectionAutoClear(store), [store]);
|
|
70
|
+
|
|
71
|
+
// Subscribe to server-sent asset move events (file watcher)
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
// Purely a REFRESH signal. Documents that carry asset refs are rewritten
|
|
74
|
+
// by `project-asset-operations.ts` as part of the move itself, so nothing
|
|
75
|
+
// here rewrites anything in memory.
|
|
76
|
+
return connectAssetEvents(
|
|
77
|
+
() => window.dispatchEvent(new CustomEvent('editor:assets-changed')),
|
|
78
|
+
(detail) => window.dispatchEvent(new CustomEvent('editor:assets-changed', { detail })),
|
|
79
|
+
);
|
|
80
|
+
}, []);
|
|
81
|
+
|
|
82
|
+
// There is deliberately NO shell-level document reload watcher here: each
|
|
83
|
+
// adapter owns its own external-change contract
|
|
84
|
+
// (`PersistenceProvider.applyExternal`), because only the adapter knows how
|
|
85
|
+
// to read its own truth back.
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<>
|
|
89
|
+
{/* Edit-time audio is `@vgai/game`'s `edit-mode-audio.service.ts`: the
|
|
90
|
+
graph it installs is the engine's audio RUNTIME, and the shell used to
|
|
91
|
+
import it for every project including one that plays nothing. */}
|
|
92
|
+
{/* Edit-time networking config (declared server + authored identity) for a
|
|
93
|
+
multiplayer project, with no game running. No-op for single-player. */}
|
|
94
|
+
<Suspense fallback={null}>
|
|
95
|
+
<ProjectAuthoringBootstrap store={store} />
|
|
96
|
+
</Suspense>
|
|
97
|
+
<ProjectLayout />
|
|
98
|
+
<AgentPresentationNotice />
|
|
99
|
+
{/* THE PALETTE IS THE WORKBENCH'S (⌘⇧P). This publishes the editor's live
|
|
100
|
+
action table to the bridge, which registers one
|
|
101
|
+
`MenuId.CommandPalette` item per entry with our own label — so the
|
|
102
|
+
workbench's palette lists OUR actions, and there is no second one. */}
|
|
103
|
+
<PaletteActionPublisher />
|
|
104
|
+
</>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type ReactNode, useSyncExternalStore } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
object3DDocumentSession,
|
|
4
|
+
object3DDocumentSessionsVersion,
|
|
5
|
+
subscribeObject3DDocumentSessions,
|
|
6
|
+
} from '../authoring/object3d-document-session-registry';
|
|
7
|
+
import { chromeRegionsKey, subscribeChromeRegions } from '../workspace-regions';
|
|
8
|
+
import { Object3DDocumentToolbar } from './Object3DDocumentToolbar';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* THE DOCUMENT HEADER STRIP — the one region every document's header lives
|
|
12
|
+
* in, drawn by the host. Three kinds of content share the row:
|
|
13
|
+
*
|
|
14
|
+
* - the document's OWN header (`children`: the descriptor's `Toolbar`, or a
|
|
15
|
+
* contribution's `export const Toolbar` mounted through `ToolHost`), which
|
|
16
|
+
* keeps the leading, full-width part of the row;
|
|
17
|
+
* - the host's TRANSFORM controls (`transformControls`: orientation, pivot,
|
|
18
|
+
* snap, transform options), for a document whose stage takes them — they
|
|
19
|
+
* are HEADER controls in Blender's 3D viewport, not tool-shelf ones, and
|
|
20
|
+
* the shelf holds tools only;
|
|
21
|
+
* - the host's 3D controls (`Object3DDocumentToolbar`: frame, camera,
|
|
22
|
+
* shading, environment, preview capture) for ANY document that has
|
|
23
|
+
* mounted an Object3D session — asset models, scene isolation, three
|
|
24
|
+
* stories, the 3D board, a project's mesh document — found through the
|
|
25
|
+
* session registry, so no descriptor has to declare them. A chromeless
|
|
26
|
+
* mount (an inspector preview) registers no session and gets no strip.
|
|
27
|
+
*
|
|
28
|
+
* The strip renders when either kind has something to show. Exported so the
|
|
29
|
+
* bounded host, which mounts a document without the dock, draws the
|
|
30
|
+
* SAME strip instead of a copy.
|
|
31
|
+
*/
|
|
32
|
+
export function DocumentHeaderStrip({
|
|
33
|
+
documentId,
|
|
34
|
+
runtime = false,
|
|
35
|
+
island = false,
|
|
36
|
+
assetPath,
|
|
37
|
+
transformControls,
|
|
38
|
+
children,
|
|
39
|
+
}: {
|
|
40
|
+
readonly documentId: string;
|
|
41
|
+
/** Runtime controls belong to the live view, independent of authoring chrome. */
|
|
42
|
+
readonly runtime?: boolean;
|
|
43
|
+
/** The floating-composition island treatment for a world document. */
|
|
44
|
+
readonly island?: boolean;
|
|
45
|
+
/** The asset this document opened, when it is an asset document — the
|
|
46
|
+
* caller that knows (the dock, through `assetDocumentSpec`) passes it, so
|
|
47
|
+
* this module never imports the asset-document machinery and a host
|
|
48
|
+
* without it (a bounded host) pays only for the toolbar. */
|
|
49
|
+
readonly assetPath?: string | undefined;
|
|
50
|
+
/** The host's TRANSFORM controls (`TransformHeaderControls`), passed by the
|
|
51
|
+
* caller that knows whether this document's stage takes them — the GIZMO
|
|
52
|
+
* arm of the same `stageTransformDriver` answer that gates the shelf's tool
|
|
53
|
+
* strip, because every one of these four wells configures the editor
|
|
54
|
+
* viewport's gizmo and a stage with none has nothing for them to set. They
|
|
55
|
+
* render at the trailing edge beside the 3D controls, which is where
|
|
56
|
+
* Blender's viewport header carries them. */
|
|
57
|
+
readonly transformControls?: ReactNode;
|
|
58
|
+
readonly children?: ReactNode;
|
|
59
|
+
}) {
|
|
60
|
+
useSyncExternalStore(
|
|
61
|
+
subscribeObject3DDocumentSessions,
|
|
62
|
+
object3DDocumentSessionsVersion,
|
|
63
|
+
object3DDocumentSessionsVersion,
|
|
64
|
+
);
|
|
65
|
+
const regionsVersion = useSyncExternalStore(
|
|
66
|
+
subscribeChromeRegions,
|
|
67
|
+
chromeRegionsKey,
|
|
68
|
+
chromeRegionsKey,
|
|
69
|
+
);
|
|
70
|
+
const session = object3DDocumentSession(documentId);
|
|
71
|
+
if (!children && !session && !transformControls) return null;
|
|
72
|
+
// The workspace's knob, not the document's: a skin that hides headers hides
|
|
73
|
+
// them for every document in that workspace (`EditorWorkspaceRegions`).
|
|
74
|
+
if (!runtime && regionsVersion.includes('header:hidden')) return null;
|
|
75
|
+
return (
|
|
76
|
+
<div
|
|
77
|
+
className={
|
|
78
|
+
island
|
|
79
|
+
? 'vgai-dock-document-toolbar vgai-chrome-island vgai-glass-island'
|
|
80
|
+
: 'vgai-dock-document-toolbar'
|
|
81
|
+
}
|
|
82
|
+
data-runtime-toolbar={runtime || undefined}
|
|
83
|
+
data-island-scale="compact"
|
|
84
|
+
data-testid={`document-header:${documentId}`}
|
|
85
|
+
>
|
|
86
|
+
{children ? <div className="vgai-dock-document-toolbar-own">{children}</div> : null}
|
|
87
|
+
{transformControls}
|
|
88
|
+
{session ? (
|
|
89
|
+
<Object3DDocumentToolbar
|
|
90
|
+
documentId={documentId}
|
|
91
|
+
{...(assetPath && !assetPath.startsWith('online:') ? { assetPath } : {})}
|
|
92
|
+
/>
|
|
93
|
+
) : null}
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type ReactNode, useSyncExternalStore } from 'react';
|
|
2
|
+
import { chromeRegionsKey, subscribeChromeRegions } from '../workspace-regions';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* THE DOCUMENT SHELF — Blender's tool shelf (T), the host's second region
|
|
6
|
+
* after the header strip (`DocumentHeaderStrip`): a vertical rail at the
|
|
7
|
+
* leading edge of a document's content box, drawn by the host, contents
|
|
8
|
+
* contributed: the host's transform tools on top for every three stage
|
|
9
|
+
* (`WorkspaceDocumentSurface`, selection or not — Blender's rail is
|
|
10
|
+
* persistent), then the document's own — the mesh document its operators, a
|
|
11
|
+
* project's own document whatever it exports as `Shelf`. The rail sits INSIDE the content box (absolute, over the stage —
|
|
12
|
+
* the position `.vgai-dock-document-content` now provides), so the header
|
|
13
|
+
* strip above it is never covered and the stage keeps its full size.
|
|
14
|
+
*
|
|
15
|
+
* Nothing renders when there is nothing to show; a document without a shelf
|
|
16
|
+
* has no rail, not an empty one.
|
|
17
|
+
*/
|
|
18
|
+
export function DocumentShelfRail({
|
|
19
|
+
documentId,
|
|
20
|
+
children,
|
|
21
|
+
}: {
|
|
22
|
+
readonly documentId: string;
|
|
23
|
+
readonly children?: ReactNode;
|
|
24
|
+
}) {
|
|
25
|
+
const regionsVersion = useSyncExternalStore(
|
|
26
|
+
subscribeChromeRegions,
|
|
27
|
+
chromeRegionsKey,
|
|
28
|
+
chromeRegionsKey,
|
|
29
|
+
);
|
|
30
|
+
if (!children) return null;
|
|
31
|
+
// The workspace's knob (`EditorWorkspaceRegions.shelf`), the same way the
|
|
32
|
+
// header strip reads its own.
|
|
33
|
+
if (regionsVersion.includes('shelf:hidden')) return null;
|
|
34
|
+
return (
|
|
35
|
+
<div
|
|
36
|
+
className="vgai-dock-document-shelf"
|
|
37
|
+
data-testid={`document-shelf:${documentId}`}
|
|
38
|
+
role="toolbar"
|
|
39
|
+
aria-orientation="vertical"
|
|
40
|
+
aria-label="Document tools"
|
|
41
|
+
>
|
|
42
|
+
{children}
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { fontSizeVar, text } from '@volter/editor-sdk/widgets';
|
|
2
|
+
import { MANIFEST_FILENAME } from '@volter/editor-project/manifest/filename';
|
|
3
|
+
import { useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { listProjectSourceFiles, readProjectTextFile } from '../api/project-source';
|
|
5
|
+
import {
|
|
6
|
+
loadProjectThumbnailManifest,
|
|
7
|
+
resetProjectThumbnailManifestCache,
|
|
8
|
+
THUMBNAIL_MANIFEST_PATH,
|
|
9
|
+
ThumbnailJobQueue,
|
|
10
|
+
} from '../asset-workflow/thumbnail-system';
|
|
11
|
+
import {
|
|
12
|
+
DOCUMENT_PREVIEW_HEIGHT,
|
|
13
|
+
DOCUMENT_PREVIEW_RECIPE,
|
|
14
|
+
DOCUMENT_PREVIEW_WIDTH,
|
|
15
|
+
type DocumentPreviewSource,
|
|
16
|
+
} from '../document-preview-source';
|
|
17
|
+
import { projectFiles } from '../files/project-files';
|
|
18
|
+
import { getCurrentProject } from '../project-manager';
|
|
19
|
+
import { getStorageBackend } from '../storage';
|
|
20
|
+
|
|
21
|
+
interface CaptureJob {
|
|
22
|
+
readonly run: () => Promise<string>;
|
|
23
|
+
readonly consumers: Set<AbortSignal>;
|
|
24
|
+
}
|
|
25
|
+
const captureJobs = new Map<string, CaptureJob>();
|
|
26
|
+
const captureQueue = new ThumbnailJobQueue<string>(async (key) => {
|
|
27
|
+
const job = captureJobs.get(key)!;
|
|
28
|
+
await new Promise<void>((resume) => {
|
|
29
|
+
if (typeof requestIdleCallback === 'function')
|
|
30
|
+
requestIdleCallback(() => resume(), { timeout: 1000 });
|
|
31
|
+
else setTimeout(resume, 0);
|
|
32
|
+
});
|
|
33
|
+
if ([...job.consumers].every((consumer) => consumer.aborted)) {
|
|
34
|
+
throw new DOMException('Preview demand was cancelled.', 'AbortError');
|
|
35
|
+
}
|
|
36
|
+
return job.run();
|
|
37
|
+
}, 1);
|
|
38
|
+
let dependencyFingerprint: Promise<string> | null = null;
|
|
39
|
+
let dependencyProject: string | undefined;
|
|
40
|
+
let dependencyWatchDispose: (() => void) | null = null;
|
|
41
|
+
const dependencyListeners = new Set<() => void>();
|
|
42
|
+
|
|
43
|
+
async function listPublicDependencyFacts(path: string): Promise<string[]> {
|
|
44
|
+
const backend = getStorageBackend();
|
|
45
|
+
let entries: Awaited<ReturnType<typeof backend.list>>;
|
|
46
|
+
try {
|
|
47
|
+
entries = await backend.list(path);
|
|
48
|
+
} catch {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
const facts: string[] = [];
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
if (entry.type === 'dir') facts.push(...(await listPublicDependencyFacts(entry.path)));
|
|
54
|
+
else facts.push(`${entry.path}:${entry.size ?? 0}:${entry.mtime ?? 0}`);
|
|
55
|
+
}
|
|
56
|
+
return facts;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function projectDependencyFingerprint(): Promise<string> {
|
|
60
|
+
const project = getCurrentProject()?.rootPath;
|
|
61
|
+
if (dependencyProject !== project) {
|
|
62
|
+
dependencyProject = project;
|
|
63
|
+
dependencyFingerprint = null;
|
|
64
|
+
}
|
|
65
|
+
dependencyFingerprint ??= Promise.all([
|
|
66
|
+
listProjectSourceFiles([
|
|
67
|
+
MANIFEST_FILENAME,
|
|
68
|
+
'vgai.adapter.ts',
|
|
69
|
+
'.storybook/**/*',
|
|
70
|
+
'src/**/*.ts',
|
|
71
|
+
'src/**/*.tsx',
|
|
72
|
+
'src/**/*.js',
|
|
73
|
+
'src/**/*.jsx',
|
|
74
|
+
'src/**/*.mjs',
|
|
75
|
+
'src/**/*.cjs',
|
|
76
|
+
'src/**/*.json',
|
|
77
|
+
'src/**/*.css',
|
|
78
|
+
]).then(async (paths) =>
|
|
79
|
+
Promise.all(paths.map(async (path) => `${path}:${(await readProjectTextFile(path)) ?? ''}`)),
|
|
80
|
+
),
|
|
81
|
+
listPublicDependencyFacts(''),
|
|
82
|
+
]).then(([source, assets]) => digest([...source, ...assets].sort().join('\n')));
|
|
83
|
+
return dependencyFingerprint;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function subscribeProjectDependencies(listener: () => void): () => void {
|
|
87
|
+
dependencyListeners.add(listener);
|
|
88
|
+
dependencyWatchDispose ??= projectFiles.watch((event) => {
|
|
89
|
+
if (event.path === THUMBNAIL_MANIFEST_PATH) {
|
|
90
|
+
resetProjectThumbnailManifestCache();
|
|
91
|
+
for (const current of dependencyListeners) current();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (
|
|
95
|
+
!/^(src|public|\.storybook)\//.test(event.path) &&
|
|
96
|
+
event.path !== MANIFEST_FILENAME &&
|
|
97
|
+
event.path !== 'vgai.adapter.ts'
|
|
98
|
+
)
|
|
99
|
+
return;
|
|
100
|
+
dependencyFingerprint = null;
|
|
101
|
+
for (const current of dependencyListeners) current();
|
|
102
|
+
});
|
|
103
|
+
return () => {
|
|
104
|
+
dependencyListeners.delete(listener);
|
|
105
|
+
if (dependencyListeners.size === 0) {
|
|
106
|
+
dependencyWatchDispose?.();
|
|
107
|
+
dependencyWatchDispose = null;
|
|
108
|
+
dependencyFingerprint = null;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function serializedCapture(
|
|
114
|
+
key: string,
|
|
115
|
+
signal: AbortSignal,
|
|
116
|
+
run: () => Promise<string>,
|
|
117
|
+
): Promise<string> {
|
|
118
|
+
signal.throwIfAborted();
|
|
119
|
+
let job = captureJobs.get(key);
|
|
120
|
+
if (!job) {
|
|
121
|
+
job = { run, consumers: new Set() };
|
|
122
|
+
captureJobs.set(key, job);
|
|
123
|
+
}
|
|
124
|
+
job.consumers.add(signal);
|
|
125
|
+
const request = captureQueue.request(key, 1);
|
|
126
|
+
signal.addEventListener('abort', request.cancel, { once: true });
|
|
127
|
+
try {
|
|
128
|
+
return await request.promise;
|
|
129
|
+
} finally {
|
|
130
|
+
signal.removeEventListener('abort', request.cancel);
|
|
131
|
+
job.consumers.delete(signal);
|
|
132
|
+
if (job.consumers.size === 0 && captureJobs.get(key) === job) captureJobs.delete(key);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function digest(value: string): Promise<string> {
|
|
137
|
+
const bytes = new TextEncoder().encode(value);
|
|
138
|
+
const hash = await crypto.subtle.digest('SHA-256', bytes);
|
|
139
|
+
return [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function decodeDataUrl(value: string): { mime: string; bytes: Uint8Array } {
|
|
143
|
+
const match = /^data:([^;,]+);base64,(.*)$/s.exec(value);
|
|
144
|
+
if (!match) throw new Error('Document preview owner returned an invalid image data URL.');
|
|
145
|
+
const binary = atob(match[2]!);
|
|
146
|
+
const bytes = new Uint8Array(binary.length);
|
|
147
|
+
for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);
|
|
148
|
+
return { mime: match[1]!, bytes };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function blobUrl(bytes: Uint8Array, mime = 'image/png'): string {
|
|
152
|
+
const copy = new Uint8Array(bytes.byteLength);
|
|
153
|
+
copy.set(bytes);
|
|
154
|
+
return URL.createObjectURL(new Blob([copy.buffer], { type: mime }));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function previewCamera(documentId: string) {
|
|
158
|
+
const read = await loadProjectThumbnailManifest();
|
|
159
|
+
if (read.status !== 'ok') return undefined;
|
|
160
|
+
const framing = read.manifest.entries[`document:${documentId}`]?.framing;
|
|
161
|
+
return framing
|
|
162
|
+
? {
|
|
163
|
+
position: { x: framing.position[0], y: framing.position[1], z: framing.position[2] },
|
|
164
|
+
target: { x: framing.target[0], y: framing.target[1], z: framing.target[2] },
|
|
165
|
+
...(framing.fov === undefined ? {} : { fov: framing.fov }),
|
|
166
|
+
}
|
|
167
|
+
: undefined;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function resolvePreview(
|
|
171
|
+
documentId: string,
|
|
172
|
+
source: DocumentPreviewSource,
|
|
173
|
+
force: number,
|
|
174
|
+
signal: AbortSignal,
|
|
175
|
+
): Promise<string> {
|
|
176
|
+
const projectId = getCurrentProject()?.rootPath ?? 'no-project';
|
|
177
|
+
const camera = await previewCamera(documentId);
|
|
178
|
+
const identity = JSON.stringify({
|
|
179
|
+
projectId,
|
|
180
|
+
documentId,
|
|
181
|
+
recipe: DOCUMENT_PREVIEW_RECIPE,
|
|
182
|
+
revision: source.revision(),
|
|
183
|
+
dependencies: await projectDependencyFingerprint(),
|
|
184
|
+
camera,
|
|
185
|
+
});
|
|
186
|
+
signal.throwIfAborted();
|
|
187
|
+
const key = await digest(identity);
|
|
188
|
+
const path = `.vgai/cache/document-previews/${key}.png`;
|
|
189
|
+
if (force === 0 && (await projectFiles.exists(path))) {
|
|
190
|
+
return blobUrl(await projectFiles.readBytes(path));
|
|
191
|
+
}
|
|
192
|
+
const dataUrl = await serializedCapture(key, signal, () =>
|
|
193
|
+
source.capture({
|
|
194
|
+
width: DOCUMENT_PREVIEW_WIDTH,
|
|
195
|
+
height: DOCUMENT_PREVIEW_HEIGHT,
|
|
196
|
+
...(camera ? { camera } : {}),
|
|
197
|
+
}),
|
|
198
|
+
);
|
|
199
|
+
signal.throwIfAborted();
|
|
200
|
+
const image = decodeDataUrl(dataUrl);
|
|
201
|
+
await projectFiles.write(path, image.bytes);
|
|
202
|
+
return blobUrl(image.bytes, image.mime);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function DocumentThumbnail({
|
|
206
|
+
documentId,
|
|
207
|
+
source,
|
|
208
|
+
previewRevision,
|
|
209
|
+
}: {
|
|
210
|
+
readonly documentId: string;
|
|
211
|
+
readonly source: DocumentPreviewSource;
|
|
212
|
+
readonly previewRevision: number;
|
|
213
|
+
}) {
|
|
214
|
+
const [url, setUrl] = useState<string | null>(null);
|
|
215
|
+
const [error, setError] = useState<string | null>(null);
|
|
216
|
+
const [sourceRevision, setSourceRevision] = useState(0);
|
|
217
|
+
const [retry, setRetry] = useState(0);
|
|
218
|
+
const [refreshing, setRefreshing] = useState(true);
|
|
219
|
+
const [visible, setVisible] = useState(false);
|
|
220
|
+
const host = useRef<HTMLDivElement>(null);
|
|
221
|
+
const demand = useRef<AbortController | null>(null);
|
|
222
|
+
const liveUrl = useRef<string | null>(null);
|
|
223
|
+
const lastRefresh = useRef({ previewRevision, retry });
|
|
224
|
+
|
|
225
|
+
useEffect(() => {
|
|
226
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
227
|
+
const invalidate = () => {
|
|
228
|
+
demand.current?.abort();
|
|
229
|
+
setRefreshing(true);
|
|
230
|
+
if (timer) clearTimeout(timer);
|
|
231
|
+
timer = setTimeout(() => setSourceRevision((value) => value + 1), 750);
|
|
232
|
+
};
|
|
233
|
+
const unsubscribeSource = source.subscribe(invalidate);
|
|
234
|
+
// Imported modules are part of the rendered document even when the entry
|
|
235
|
+
// registry itself does not republish. The project watcher is the broad,
|
|
236
|
+
// truthful invalidation signal for that dependency graph.
|
|
237
|
+
const unsubscribeFiles = subscribeProjectDependencies(invalidate);
|
|
238
|
+
return () => {
|
|
239
|
+
if (timer) clearTimeout(timer);
|
|
240
|
+
unsubscribeSource();
|
|
241
|
+
unsubscribeFiles();
|
|
242
|
+
};
|
|
243
|
+
}, [source]);
|
|
244
|
+
|
|
245
|
+
useEffect(
|
|
246
|
+
() => () => {
|
|
247
|
+
if (liveUrl.current?.startsWith('blob:')) URL.revokeObjectURL(liveUrl.current);
|
|
248
|
+
},
|
|
249
|
+
[],
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
useEffect(() => {
|
|
253
|
+
const element = host.current;
|
|
254
|
+
if (!element) return;
|
|
255
|
+
const observer = new IntersectionObserver(([entry]) =>
|
|
256
|
+
setVisible(entry?.isIntersecting ?? false),
|
|
257
|
+
);
|
|
258
|
+
observer.observe(element);
|
|
259
|
+
return () => observer.disconnect();
|
|
260
|
+
}, []);
|
|
261
|
+
|
|
262
|
+
useEffect(() => {
|
|
263
|
+
if (!visible) return;
|
|
264
|
+
const controller = new AbortController();
|
|
265
|
+
demand.current = controller;
|
|
266
|
+
const force =
|
|
267
|
+
lastRefresh.current.previewRevision !== previewRevision || lastRefresh.current.retry !== retry
|
|
268
|
+
? 1
|
|
269
|
+
: 0;
|
|
270
|
+
setError(null);
|
|
271
|
+
setRefreshing(true);
|
|
272
|
+
void resolvePreview(documentId, source, force, controller.signal)
|
|
273
|
+
.then((resolved) => {
|
|
274
|
+
if (controller.signal.aborted) {
|
|
275
|
+
URL.revokeObjectURL(resolved);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (liveUrl.current) URL.revokeObjectURL(liveUrl.current);
|
|
279
|
+
lastRefresh.current = { previewRevision, retry };
|
|
280
|
+
liveUrl.current = resolved;
|
|
281
|
+
setUrl(resolved);
|
|
282
|
+
setRefreshing(false);
|
|
283
|
+
})
|
|
284
|
+
.catch((reason: unknown) => {
|
|
285
|
+
if (controller.signal.aborted) return;
|
|
286
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
287
|
+
setRefreshing(false);
|
|
288
|
+
});
|
|
289
|
+
return () => controller.abort();
|
|
290
|
+
}, [documentId, previewRevision, retry, source, sourceRevision, visible]);
|
|
291
|
+
|
|
292
|
+
return (
|
|
293
|
+
<div
|
|
294
|
+
ref={host}
|
|
295
|
+
style={{
|
|
296
|
+
width: '100%',
|
|
297
|
+
height: '100%',
|
|
298
|
+
position: 'relative',
|
|
299
|
+
display: 'grid',
|
|
300
|
+
placeItems: 'center',
|
|
301
|
+
}}
|
|
302
|
+
>
|
|
303
|
+
{url && (
|
|
304
|
+
<img
|
|
305
|
+
src={url}
|
|
306
|
+
alt={`${documentId} preview`}
|
|
307
|
+
style={{ width: '100%', height: '100%', objectFit: 'contain' }}
|
|
308
|
+
/>
|
|
309
|
+
)}
|
|
310
|
+
{error ? (
|
|
311
|
+
<button
|
|
312
|
+
type="button"
|
|
313
|
+
title={error}
|
|
314
|
+
onClick={(event) => {
|
|
315
|
+
event.stopPropagation();
|
|
316
|
+
setRetry((value) => value + 1);
|
|
317
|
+
}}
|
|
318
|
+
style={{
|
|
319
|
+
position: 'absolute',
|
|
320
|
+
bottom: 0,
|
|
321
|
+
border: 0,
|
|
322
|
+
background: 'var(--vscode-editor-background)',
|
|
323
|
+
color: text[3],
|
|
324
|
+
pointerEvents: 'auto',
|
|
325
|
+
}}
|
|
326
|
+
>
|
|
327
|
+
Preview unavailable · Retry
|
|
328
|
+
</button>
|
|
329
|
+
) : refreshing ? (
|
|
330
|
+
<span
|
|
331
|
+
role="status"
|
|
332
|
+
style={{
|
|
333
|
+
position: 'absolute',
|
|
334
|
+
bottom: 0,
|
|
335
|
+
background: 'var(--vscode-editor-background)',
|
|
336
|
+
color: text[3],
|
|
337
|
+
fontSize: fontSizeVar.xs,
|
|
338
|
+
}}
|
|
339
|
+
>
|
|
340
|
+
{url ? 'Refreshing preview…' : 'Loading preview…'}
|
|
341
|
+
</span>
|
|
342
|
+
) : null}
|
|
343
|
+
</div>
|
|
344
|
+
);
|
|
345
|
+
}
|