@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.
Files changed (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,417 @@
1
+ /**
2
+ * The STANDARD VIEWPORT dressing — the ONE chrome-and-dressing definition every
3
+ * 3D document viewport inherits (owner-ratified contract). A document surface
4
+ * (`Object3DDocumentViewport` and everything mounted on it: the 3D board,
5
+ * story turntables, model/entity asset documents) gets the editor's standard
6
+ * look from this module instead of instantiating its own background/lighting:
7
+ *
8
+ * - `scene.environment` baked from three's own `RoomEnvironment` through
9
+ * `PMREMGenerator`, so PBR materials actually read;
10
+ * - a subtle dark vertical-gradient backdrop (never a flat hex);
11
+ * - one NEUTRAL directional key light for definition (it was warm; see the
12
+ * measurement where it is constructed);
13
+ * - an optional ground grid following the Scene viewport's grid conventions
14
+ * (1 m cells, `0x999999`, `EDITOR_LAYER` — see `editor-viewport.ts`),
15
+ * centred on the content and fading out with distance so it never
16
+ * degenerates into convergence-line artifacts at the horizon.
17
+ *
18
+ * Everything created here is EDITOR CHROME: marked per `editor-layers.ts`'s
19
+ * conventions (`userData.editorHelper`, and `EDITOR_LAYER` for the grid) so no
20
+ * hierarchy walk, pick, or export ever mistakes it for content — and it is
21
+ * never serialized, never touching project data (the anti-shim rule). It
22
+ * exists only inside the document viewport's scene at view time.
23
+ *
24
+ * Ownership: {@link applyStandardViewportDressing} owns every object and
25
+ * texture it creates, INCLUDING the {@link StandardEnvironment} handed to it
26
+ * (PMREM render targets leak if not disposed). Its returned `dispose` is the
27
+ * one teardown path; it is idempotent.
28
+ *
29
+ * The environment bake lives in `@volter/editor-threejs/viewport/environment`
30
+ * because it is the one GL-bound step — it needs a live `WebGLRenderer`,
31
+ * where the rest of the dressing is plain scene-graph work.
32
+ */
33
+
34
+ import { contentWorldBounds } from '@volter/editor-threejs/viewport/content-bounds';
35
+ import { EDITOR_LAYER } from '@volter/editor-threejs/viewport/editor-layers';
36
+ import type { StandardEnvironment } from '@volter/editor-threejs/viewport/environment';
37
+ import { setUserData } from '@volter/editor-threejs/ecs/user-data';
38
+ import * as THREE from 'three';
39
+
40
+ /**
41
+ * Front-right three-quarter view for project-owned R3F components. Their
42
+ * gameplay-forward convention is −Z, so the camera belongs on that side of
43
+ * the subject. The 3D board and an opened story must never show opposite
44
+ * faces of the same prefab.
45
+ */
46
+ export const STANDARD_COMPONENT_CAMERA_DIRECTION = [0.8, 0.5, -1] as const;
47
+
48
+ /** The standard backdrop, dark at the ground line and lifting toward the top.
49
+ * These are the STUDIO tints; the painted stops blend them with the active
50
+ * palette (see {@link paletteBackdropStops}) so a document stage follows the
51
+ * editor's palette the way the Asset Lab's CSS studio stage does. */
52
+ const GRADIENT_BOTTOM = new THREE.Color(0x1e2530);
53
+ const GRADIENT_TOP = new THREE.Color(0x4c5b70);
54
+
55
+ export interface BackdropStops {
56
+ readonly bottom: THREE.Color;
57
+ readonly top: THREE.Color;
58
+ }
59
+
60
+ /**
61
+ * The backdrop's stops for the ACTIVE PALETTE: the ground line is the
62
+ * palette's panel surface and the top is its raised surface, each blended
63
+ * with the studio tint and lifted for ACES. Measured under the Blender
64
+ * palette (panel #303030, raised #3d3d3d) the stage reads as Blender's grey
65
+ * ground instead of a black void; under Classic Graphite it stays within a
66
+ * few steps of the studio constants. Falls back to the studio constants
67
+ * where no palette is installed (a bounded host, headless).
68
+ */
69
+ export function paletteBackdropStops(): BackdropStops {
70
+ const root =
71
+ typeof document === 'undefined' ? null : document.querySelector('[data-vgai-palette]');
72
+ if (!root) return { bottom: GRADIENT_BOTTOM.clone(), top: GRADIENT_TOP.clone() };
73
+ const style = getComputedStyle(root);
74
+ const canvas = document.createElement('canvas');
75
+ canvas.width = canvas.height = 1;
76
+ const context = canvas.getContext('2d');
77
+ const read = (name: string, fallback: THREE.Color): THREE.Color => {
78
+ const value = style.getPropertyValue(name).trim();
79
+ if (!context || !value || !CSS.supports('color', value)) return fallback.clone();
80
+ // Palette surfaces may be translucent (Glass). Let the browser composite
81
+ // their CSS colors over the shell; Three.Color has no alpha channel.
82
+ context.fillStyle = fallback.getStyle();
83
+ context.fillRect(0, 0, 1, 1);
84
+ context.fillStyle = style.getPropertyValue('--vgai-surface-shell').trim();
85
+ context.fillRect(0, 0, 1, 1);
86
+ context.fillStyle = value;
87
+ context.fillRect(0, 0, 1, 1);
88
+ const [r, g, b] = context.getImageData(0, 0, 1, 1).data;
89
+ return new THREE.Color().setRGB(r! / 255, g! / 255, b! / 255, THREE.SRGBColorSpace);
90
+ };
91
+ const panel = read('--vgai-surface-panel', GRADIENT_BOTTOM);
92
+ const raised = read('--vgai-surface-raised', GRADIENT_TOP);
93
+ // A background texture is not tone-mapped, so what is authored here is
94
+ // what the screen shows. The small lift keeps the ground a step above the
95
+ // panel it sits beside (Blender's viewport is lighter than its editors).
96
+ // Measured on screen under the Blender palette: ground #40, top #50, beside
97
+ // Blender's own #3f–#4e.
98
+ const bottom = panel.lerp(GRADIENT_BOTTOM, 0.25).lerp(new THREE.Color(0xffffff), 0.03);
99
+ const top = raised.lerp(GRADIENT_TOP, 0.25).lerp(new THREE.Color(0xffffff), 0.04);
100
+ return { bottom, top };
101
+ }
102
+
103
+ /**
104
+ * Fires when the palette the backdrop follows changes. The theme installer
105
+ * stamps its root with `data-vgai-palette` / `data-vgai-material` on every
106
+ * switch, so the DOM is the contract here — a document stage never imports
107
+ * the shell's preference store (its closure is pinned,
108
+ * `scripts/validate-editor-closure.mjs`). Returns the unsubscribe.
109
+ */
110
+ export function watchPaletteBackdrop(onChange: () => void): () => void {
111
+ if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return () => {};
112
+ const root = document.querySelector('[data-vgai-palette]');
113
+ if (!root) return () => {};
114
+ const observer = new MutationObserver(onChange);
115
+ observer.observe(root, {
116
+ attributes: true,
117
+ attributeFilter: ['data-vgai-palette', 'data-vgai-material'],
118
+ });
119
+ return () => observer.disconnect();
120
+ }
121
+
122
+ /** One 1×N vertical-gradient strip; the renderer stretches it full-frame. */
123
+ export function createGradientBackgroundTexture(
124
+ stops: BackdropStops = paletteBackdropStops(),
125
+ ): THREE.DataTexture {
126
+ const height = 128;
127
+ const data = new Uint8Array(height * 4);
128
+ const color = new THREE.Color();
129
+ for (let row = 0; row < height; row++) {
130
+ // Row 0 is the BOTTOM of the texture, so the gradient runs ground → sky.
131
+ // `Color` holds LINEAR components under colour management while the
132
+ // texture below is declared sRGB, so the bytes are encoded on the way
133
+ // out — written raw, every stop rendered several steps darker than
134
+ // authored (measured: the stage read #050506 for a #1e2530 stop).
135
+ color
136
+ .copy(stops.bottom)
137
+ .lerp(stops.top, row / (height - 1))
138
+ .convertLinearToSRGB();
139
+ data[row * 4] = Math.round(color.r * 255);
140
+ data[row * 4 + 1] = Math.round(color.g * 255);
141
+ data[row * 4 + 2] = Math.round(color.b * 255);
142
+ data[row * 4 + 3] = 255;
143
+ }
144
+ const texture = new THREE.DataTexture(data, 1, height, THREE.RGBAFormat);
145
+ texture.colorSpace = THREE.SRGBColorSpace;
146
+ texture.magFilter = THREE.LinearFilter;
147
+ texture.minFilter = THREE.LinearFilter;
148
+ texture.needsUpdate = true;
149
+ return texture;
150
+ }
151
+
152
+ /**
153
+ * Grid frame for this scene's content: the Scene viewport's 50 m floor grown
154
+ * in 10 m steps so a large layout (the 3D board's districts) never hangs past
155
+ * its own ground reference — and CENTRED on the content's ground footprint, so
156
+ * an off-origin layout (the board grows into one quadrant) still sits inside
157
+ * the grid's crisp middle rather than out on its fading rim.
158
+ */
159
+ function gridFrameForScene(scene: THREE.Object3D): { size: number; centre: [number, number] } {
160
+ const bounds = contentWorldBounds(scene);
161
+ if (bounds.isEmpty()) return { size: 50, centre: [0, 0] };
162
+ const extent = Math.max(bounds.max.x - bounds.min.x, bounds.max.z - bounds.min.z);
163
+ return {
164
+ size: Math.min(Math.max(Math.ceil(extent / 10) * 10 + 20, 50), 1000),
165
+ centre: [(bounds.min.x + bounds.max.x) / 2, (bounds.min.z + bounds.max.z) / 2],
166
+ };
167
+ }
168
+
169
+ /** The Scene grid's 1 m cells, coarsening in 1/2/5/10 m steps once the extent
170
+ * would put more than ~60 lines on screen — denser reads as moiré noise, not
171
+ * as a ground reference. */
172
+ function gridDivisions(size: number): number {
173
+ for (const cell of [1, 2, 5, 10]) {
174
+ if (size / cell <= 60) return Math.round(size / cell);
175
+ }
176
+ return Math.round(size / 10);
177
+ }
178
+
179
+ /**
180
+ * Fade the grid out with DISTANCE, in the grid's own shader.
181
+ *
182
+ * A finite grid drawn hard to its edge degenerates at grazing angles: the far
183
+ * lines compress toward the horizon into harsh convergence/moiré artifacts,
184
+ * and the grid ends on an abrupt square rim. Multiplying the fragment alpha by
185
+ * a smoothstep over the fragment's radial distance from the grid's centre
186
+ * dissolves both — near cells stay a crisp ground reference, the outer band
187
+ * (which is exactly what sits at the horizon in a low shot) melts into the
188
+ * backdrop before it can alias. The fade is anchored to the grid's OWN extent
189
+ * rather than to the camera, so no zoom level ever dissolves the whole
190
+ * reference; the band scales with `gridFrameForScene`, which already tracks
191
+ * the content. Injection at `color_fragment` is where `LineBasicMaterial` has
192
+ * `diffuseColor` in scope.
193
+ *
194
+ * Exported because the dressing OWNS the grid treatment: `editor-viewport.ts`
195
+ * applies the same fade to its own editing grid, so no viewport anywhere ends
196
+ * a grid on a hard aliasing rim.
197
+ */
198
+ export function applyGridDistanceFade(material: THREE.Material, gridSize: number): void {
199
+ // The band ends at the grid's own extent: it exists so the floor never ends
200
+ // on a hard rim, not to shrink the floor. The old 0.18/0.42 band was tuned
201
+ // for a camera standing close — a document that opens further back (the
202
+ // Model document's `openingFit`) photographed a floor with NO visible grid
203
+ // at all, measured against Blender's uniform lattice.
204
+ //
205
+ // `gridSize` is `GridHelper`'s size, which is the grid's DIAMETER — it spans
206
+ // ±size/2 — while the shader below compares against a RADIUS
207
+ // (`length(vGridPlanePosition)`). Comparing the two directly put the whole
208
+ // band outside the geometry: on a 400 m grid the fade started at 220 m when
209
+ // the farthest point along either axis is 200 m, so alpha never left 1.0 and
210
+ // the floor ended on exactly the hard rim this function exists to prevent
211
+ // (measured against Blender: our horizon stepped from #3f3f3f to #4f4f4f in
212
+ // four scanlines across the full stage width, Blender's held #3f3f3f-#41
213
+ // throughout). The band is a fraction of the RADIUS, so it reaches zero at
214
+ // the grid's edge, where the fade belongs.
215
+ const gridRadius = gridSize / 2;
216
+ const fadeStart = gridRadius * 0.55;
217
+ const fadeEnd = gridRadius;
218
+ material.onBeforeCompile = (shader) => {
219
+ shader.uniforms['uGridFadeStart'] = { value: fadeStart };
220
+ shader.uniforms['uGridFadeEnd'] = { value: fadeEnd };
221
+ shader.vertexShader = shader.vertexShader
222
+ .replace('#include <common>', '#include <common>\nvarying vec2 vGridPlanePosition;')
223
+ .replace(
224
+ '#include <begin_vertex>',
225
+ '#include <begin_vertex>\nvGridPlanePosition = position.xz;',
226
+ );
227
+ shader.fragmentShader = shader.fragmentShader
228
+ .replace(
229
+ '#include <common>',
230
+ '#include <common>\nvarying vec2 vGridPlanePosition;\nuniform float uGridFadeStart;\nuniform float uGridFadeEnd;',
231
+ )
232
+ .replace(
233
+ '#include <color_fragment>',
234
+ '#include <color_fragment>\ndiffuseColor.a *= 1.0 - smoothstep(uGridFadeStart, uGridFadeEnd, length(vGridPlanePosition));',
235
+ );
236
+ };
237
+ // Distinct fade bands must not share one cached program.
238
+ material.customProgramCacheKey = () => `vgai-grid-fade:${fadeStart}:${fadeEnd}`;
239
+ }
240
+
241
+ export interface StandardViewportDressingOptions {
242
+ /**
243
+ * The baked IBL from `@volter/editor-threejs/viewport/environment`; `null` opts the
244
+ * scene out of an environment entirely. Ownership transfers here.
245
+ */
246
+ readonly environment: StandardEnvironment | null;
247
+ /** Apply the vertical-gradient backdrop. Default `true`; a host whose
248
+ * backdrop lives elsewhere (the Asset Lab's alpha-canvas studio stage, an
249
+ * explicit SDK-contributed background) opts out. */
250
+ readonly background?: boolean;
251
+ /** Add the warm directional key light. Default `true`; a source that
252
+ * authors its own lights opts out — authored lighting always wins. */
253
+ readonly keyLight?: boolean;
254
+ /** Add the ground grid (content standing on y=0 by design). Default `false`. */
255
+ readonly grid?: boolean;
256
+ readonly content?: THREE.Object3D;
257
+ }
258
+
259
+ export interface StandardViewportDressing {
260
+ /** The gradient applied to `scene.background`, or `null` when opted out —
261
+ * hosts hand it on (e.g. as a document session's neutral background). */
262
+ readonly backgroundTexture: THREE.Texture | null;
263
+ /** The dressing's lights, for hosts whose lighting presets retune them. */
264
+ readonly lights: readonly THREE.Light[];
265
+ frameContent(content: THREE.Object3D): void;
266
+ /** The ONE teardown path for everything this dressing created. Idempotent. */
267
+ dispose(): void;
268
+ }
269
+
270
+ /**
271
+ * The room bake's strength on a document stage. NOT the asset-preview lane's
272
+ * `STUDIO_ENVIRONMENT_INTENSITY` (0.45): that lane has no key light, this rig
273
+ * does, and the two are fitted together — with the mesh package's
274
+ * `STUDIO_GREY`, which is the other half of this number.
275
+ *
276
+ * THE FRAME AND THE COORDINATES, so every round compares. Reference:
277
+ * Blender's object-mode cube, `modeling-object-none.png` at its native 2x —
278
+ * front face 111, left 130, top 141, spread 30, read identically at 2x and
279
+ * downscaled to our 1728-wide frame. Ours: a fresh `--template models`
280
+ * scaffold, the Model document on its own default camera, `vgai screenshot
281
+ * editor` at 1x (1728x941), 11x11 medians at (735,505) front, (665,500) left,
282
+ * (710,440) top.
283
+ *
284
+ * THE ROUNDS (albedo, strength -> front/left/top):
285
+ * #545454, 1.00 -> 108/130/159 reproduces the earlier round exactly
286
+ * #545454, 0.60 -> 90/100/135
287
+ * #545454, 0.30 -> 73/ 69/111 what shipped before this — see below
288
+ * #4f4f4f, 1.04 -> 103/125/154 the min-max alternative; duller by eye
289
+ * #5a5a5a, 0.85 -> 110/128/159 LANDED
290
+ *
291
+ * WHY 0.30 WAS WRONG: at that strength the cube is not uniformly dark. The
292
+ * left face collapses BELOW the front one (69 against 73), inverting
293
+ * Blender's own order — the left face is almost pure IBL, the front face
294
+ * mostly key — so the narrow spread it bought was the two side faces meeting
295
+ * in the dark, not Blender's shape.
296
+ *
297
+ * WHY THE TOP FACE STAYS ~18 HOT, and why no value here fixes it. This
298
+ * subject has exactly TWO lighting bases, the directional key and the room
299
+ * bake, so face radiance is p*K + q*E; the albedo, the key's intensity and
300
+ * this strength only move p and q (the albedo scales both, adding no third
301
+ * degree of freedom). Split from the rounds above, in scene-linear through
302
+ * ACES: K = 0.044 / 0.020 / 0.070 and E = 0.069 / 0.134 / 0.161
303
+ * (front/left/top). The model predicted 89/100/136 at strength 0.6 against
304
+ * 90/100/135 measured, so it holds — and it says Blender's three faces need a
305
+ * NEGATIVE p or q. Solving front+left exactly leaves the top at 161; the best
306
+ * min-max anywhere in the family is 101/123/151, ten off on all three and
307
+ * still 50 of spread. The residual is the RoomEnvironment's
308
+ * ceiling-to-floor gradient against Blender's camera-following studio light:
309
+ * closing it needs a different environment or a key from the camera's side,
310
+ * not a different number here. So this is fitted on the two faces that ARE
311
+ * reachable, which carry 74% of the cube's pixels (front 54%, left 20%,
312
+ * top 26%).
313
+ *
314
+ * The host applies this to the CONTENT scene it creates (`StageHost.tsx`),
315
+ * the one place the per-draw mirror cannot overwrite it.
316
+ */
317
+ export const STANDARD_ENVIRONMENT_INTENSITY = 0.85;
318
+
319
+ /** Apply the standard dressing to one document viewport scene. */
320
+ export function applyStandardViewportDressing(
321
+ scene: THREE.Scene,
322
+ options: StandardViewportDressingOptions,
323
+ ): StandardViewportDressing {
324
+ const { environment, background = true, keyLight = true, grid = false } = options;
325
+ const chrome: THREE.Object3D[] = [];
326
+ const lights: THREE.Light[] = [];
327
+ let backgroundTexture: THREE.DataTexture | null = null;
328
+
329
+ if (environment) scene.environment = environment.texture;
330
+
331
+ if (background) {
332
+ backgroundTexture = createGradientBackgroundTexture();
333
+ scene.background = backgroundTexture;
334
+ }
335
+
336
+ if (keyLight) {
337
+ // NEUTRAL, not warm. It was `0xfff3dd` — (255,243,221), a 15% warm bias —
338
+ // and that is what made every document's subject read warm against the
339
+ // reference: measured live on the Model document's cube, our three faces
340
+ // came out (124,123,120), (145,145,145), (172,171,169) — R−B of +4/0/+3 —
341
+ // where Blender's object-mode cube (`modeling-object-none.png` at 2x) is
342
+ // (111,112,113), (129,131,131), (141,143,145), COOL by 2 to 4. White key,
343
+ // and every face measures R−B of 0. The INTENSITY is unchanged: measured
344
+ // across four rounds, halving and thirding it moved the faces 6–8 levels
345
+ // and barely touched the spread between them, so it is not what this
346
+ // difference was made of and every other document surface keeps its
347
+ // definition.
348
+ const key = new THREE.DirectionalLight(0xffffff, 1.9);
349
+ key.name = 'vgai:standard-dressing-key';
350
+ key.position.set(6, 10, -4);
351
+ key.castShadow = true;
352
+ // `userData.editorHelper` keeps it out of hierarchy walks and picks;
353
+ // layers stay default so it lights layer-0 content under any camera.
354
+ setUserData(key, 'editorHelper', true);
355
+ scene.add(key);
356
+ chrome.push(key);
357
+ lights.push(key);
358
+ }
359
+
360
+ let gridHelper: THREE.GridHelper | null = null;
361
+ let gridFrame = '';
362
+ const frameContent = (content: THREE.Object3D) => {
363
+ if (!grid) return;
364
+ const { size, centre } = gridFrameForScene(content);
365
+ const frame = `${size}:${centre.join(':')}`;
366
+ if (frame === gridFrame) return;
367
+ gridFrame = frame;
368
+ if (gridHelper) {
369
+ gridHelper.removeFromParent();
370
+ gridHelper.dispose();
371
+ chrome.splice(chrome.indexOf(gridHelper), 1);
372
+ }
373
+ // The Scene viewport's grid color (`editor-viewport.ts`), softened with
374
+ // transparency so it reads as a ground reference under the gradient
375
+ // rather than competing with the content.
376
+ const helper = new THREE.GridHelper(size, gridDivisions(size), 0x999999, 0x999999);
377
+ gridHelper = helper;
378
+ const gridMaterial = helper.material as THREE.Material;
379
+ gridMaterial.transparent = true;
380
+ gridMaterial.opacity = 0.35;
381
+ gridMaterial.depthWrite = false;
382
+ applyGridDistanceFade(gridMaterial, size);
383
+ helper.name = 'vgai:standard-dressing-grid';
384
+ // Just below the ground line so content standing exactly on y=0 never
385
+ // z-fights the grid lines; centred on the content's own footprint.
386
+ helper.position.set(centre[0], -0.02, centre[1]);
387
+ helper.layers.set(EDITOR_LAYER);
388
+ setUserData(helper, 'editorHelper', true);
389
+ scene.add(helper);
390
+ chrome.push(helper);
391
+ };
392
+ frameContent(options.content ?? scene);
393
+
394
+ let disposed = false;
395
+ return {
396
+ backgroundTexture,
397
+ lights,
398
+ frameContent,
399
+ dispose(): void {
400
+ if (disposed) return;
401
+ disposed = true;
402
+ for (const object of chrome) {
403
+ object.removeFromParent();
404
+ // GridHelper frees its geometry+material; Light frees its shadow map.
405
+ (object as { dispose?: () => void }).dispose?.();
406
+ }
407
+ if (environment) {
408
+ if (scene.environment === environment.texture) scene.environment = null;
409
+ environment.dispose();
410
+ }
411
+ if (backgroundTexture) {
412
+ if (scene.background === backgroundTexture) scene.background = null;
413
+ backgroundTexture.dispose();
414
+ }
415
+ },
416
+ };
417
+ }