@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,73 @@
1
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
2
+ import type { EditorShellStore } from '../editor-shell-store';
3
+ import { adapterOnlyToolOwner, type ViewportToolOwner } from '../viewport-authoring-policy';
4
+ import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
5
+ import { resolveThreeViewportRootId } from './world-hidden-viewport';
6
+ import { isRootHidden } from './world-session-state';
7
+
8
+ /**
9
+ * The one native root whose viewport tools may claim the current selection.
10
+ *
11
+ * A composed game can contain several native surfaces at once, but editing
12
+ * chrome needs one unambiguous coordinate system and capability owner. Empty,
13
+ * organizational, and cross-root selections therefore resolve to `null`.
14
+ */
15
+ export interface ViewportToolContext extends ViewportToolOwner {
16
+ readonly adapter: AuthoringAdapter;
17
+ }
18
+
19
+ function compositeContext(
20
+ composite: CompositeAuthoringAdapter,
21
+ selectedIds: readonly string[],
22
+ ): ViewportToolContext | null {
23
+ const children = composite.childAdapters();
24
+ let owner: (typeof children)[number] | null = null;
25
+
26
+ for (const id of selectedIds) {
27
+ const child =
28
+ children.find((candidate) => composite.groupNodeId(candidate.worldId) === id) ??
29
+ children.find((candidate) => composite.ownerOf(id) === candidate.worldId);
30
+ // Kind/projection folders and stale ids do not claim native-world tools.
31
+ if (!child) return null;
32
+ // A heterogeneous selection has no single native editing context.
33
+ if (owner && owner.worldId !== child.worldId) return null;
34
+ owner = child;
35
+ }
36
+
37
+ return owner ? { worldId: owner.worldId, kind: owner.kind, adapter: owner.adapter } : null;
38
+ }
39
+
40
+ /**
41
+ * Resolve viewport-tool ownership from selection, never from which roots
42
+ * merely exist or happen to be visible.
43
+ */
44
+ export function resolveViewportToolContext(
45
+ adapter: AuthoringAdapter,
46
+ selectedIds: Iterable<string>,
47
+ ): ViewportToolContext | null {
48
+ const ids = [...selectedIds];
49
+ if (ids.length === 0) return null;
50
+ if (adapter instanceof CompositeAuthoringAdapter) return compositeContext(adapter, ids);
51
+
52
+ // Legacy/single-adapter sessions have no manifest kind metadata, and that
53
+ // fallback is `adapterOnlyToolOwner` — it speaks only the adapter contract,
54
+ // so it lives below the shell (`viewport-authoring-policy.ts`) as the gizmo
55
+ // viewport's own default. One copy, read from both sides.
56
+ const owner = adapterOnlyToolOwner(adapter, ids);
57
+ return owner ? { ...owner, adapter } : null;
58
+ }
59
+
60
+ /**
61
+ * Whether the selected owner is actually painted in this viewport. DOM
62
+ * layers follow their world eye; the manifest's sole Three root owns the 3D
63
+ * viewport chrome only while that root is visible.
64
+ */
65
+ export function isViewportToolContextVisible(
66
+ store: EditorShellStore,
67
+ context: ViewportToolOwner | null,
68
+ ): boolean {
69
+ if (!context) return false;
70
+ if (context.worldId !== null && isRootHidden(context.worldId)) return false;
71
+ if (context.kind !== 'three' || context.worldId === null) return true;
72
+ return resolveThreeViewportRootId(store) === context.worldId;
73
+ }
@@ -0,0 +1,35 @@
1
+ /** Session-only responsive canvas size for DOM-backed authoring roots. */
2
+ export interface RootCanvasViewport {
3
+ readonly width: number | null;
4
+ readonly height: number | null;
5
+ }
6
+
7
+ const FILL_VIEWPORT: RootCanvasViewport = { width: null, height: null };
8
+ let viewport: RootCanvasViewport = FILL_VIEWPORT;
9
+ const listeners = new Set<() => void>();
10
+
11
+ export function getRootCanvasViewport(): RootCanvasViewport {
12
+ return viewport;
13
+ }
14
+
15
+ export function setRootCanvasViewport(width: number | null, height: number | null): void {
16
+ const nextWidth = width === null ? null : Math.max(1, Math.round(width));
17
+ const nextHeight = height === null ? null : Math.max(1, Math.round(height));
18
+ if (viewport.width === nextWidth && viewport.height === nextHeight) return;
19
+ viewport = { width: nextWidth, height: nextHeight };
20
+ for (const listener of listeners) listener();
21
+ }
22
+
23
+ export function resetRootCanvasViewport(): void {
24
+ setRootCanvasViewport(null, null);
25
+ }
26
+
27
+ export function subscribeRootCanvasViewport(listener: () => void): () => void {
28
+ listeners.add(listener);
29
+ return () => listeners.delete(listener);
30
+ }
31
+
32
+ export function _resetRootCanvasViewportForTest(): void {
33
+ viewport = FILL_VIEWPORT;
34
+ listeners.clear();
35
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * World-hidden eye (D9, `world-session-state.ts`) applied to the EDIT-mode
3
+ * three viewport.
4
+ *
5
+ * Bug this fixes: the eye on a hierarchy world-group row (`world:<id>
6
+ * (<kind>)`, shown for 2+ world manifests) toggles `isRootHidden(worldId)`
7
+ * and culls the hierarchy subtree, but for a react/pixi world that's ALSO the
8
+ * only thing that mattered — `design-time-layers.ts`'s `applySessionStyle`
9
+ * sets `display:none` on that world's DOM layer. A three world has no DOM
10
+ * layer; nothing else consumes `isRootHidden` for its actual
11
+ * `THREE.Object3D`s, so without this module the eye is a viewport no-op.
12
+ *
13
+ * Session-local only — it writes no file and pushes no undo entry, matching
14
+ * the DOM roots' own `display:none` semantics. Every call RECOMPUTES
15
+ * `obj.visible` rather than remembering a previous value, which is what makes
16
+ * it rebuild-proof: an adapter that re-renders its tree re-stamps
17
+ * `obj.visible` from its own truth and would silently drop a one-shot
18
+ * override, but the very next call here puts the world-hidden override back.
19
+ * Callers must re-invoke this after every rebuild
20
+ * AND after the toggle itself; `editor-viewport.ts`'s `syncFromStore()` is
21
+ * exactly that seam — it already re-runs on every `store.subscribe` notify,
22
+ * which covers both an adapter rebuild (which notifies) and
23
+ * `GameHierarchy.tsx`'s toggle handler (`toggleRootHidden` +
24
+ * `store.notifyIngestEdit()`).
25
+ *
26
+ * A composite's `store.objectMap`/live THREE.Scene holds the manifest's sole
27
+ * three content root. `GameManifestSchema` rejects a second content root of
28
+ * the same medium, so `resolveThreeViewportRootId` below only needs to name
29
+ * that one world id rather than arbitrate per-object ownership.
30
+ */
31
+
32
+ import { getUserData } from '@volter/editor-threejs/ecs/user-data';
33
+ import * as THREE from 'three';
34
+ import type { EditorShellStore } from '../editor-shell-store';
35
+ import { getActiveAuthoring } from './active-adapter';
36
+ import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
37
+ import { isRootHidden } from './world-session-state';
38
+
39
+ /**
40
+ * The worldId of the ONE three world actually rendered in this viewport
41
+ * (`store.objectMap`'s contents), or `null` when the active adapter isn't a
42
+ * composite (single-world project — no world-group row/eye exists for it at
43
+ * all, so there is nothing to resolve) or declares no three world.
44
+ *
45
+ * Identifies the LIVE Three child by `capabilities.transform` — a transient
46
+ * Boundary adapter reports no transform capability until the R3F design
47
+ * session attaches. This reuses an existing, already-load-bearing signal
48
+ * instead of adding an `instanceof` check or parallel bookkeeping slot.
49
+ */
50
+ export function resolveThreeViewportRootId(store: EditorShellStore): string | null {
51
+ const active = getActiveAuthoring(store);
52
+ if (!(active instanceof CompositeAuthoringAdapter)) return null;
53
+ const focused = active
54
+ .childAdapters()
55
+ .find((c) => c.kind === 'three' && c.adapter.capabilities.transform);
56
+ return focused?.worldId ?? null;
57
+ }
58
+
59
+ /**
60
+ * Apply the eye toggle to every object in `objectMap` (see module doc
61
+ * comment for the full rebuild-proofing rationale). `threeRootId` is
62
+ * accepted as a parameter (rather than re-resolved internally) so a caller
63
+ * that already computed it once per call (e.g. for a cheap re-apply
64
+ * signature) doesn't pay for `resolveThreeViewportRootId`'s composite walk
65
+ * twice.
66
+ */
67
+ export function applyRootHiddenVisibility(
68
+ objectMap: ReadonlyMap<string, THREE.Object3D>,
69
+ threeRootId: string | null,
70
+ ): void {
71
+ const hidden = threeRootId !== null && isRootHidden(threeRootId);
72
+ if (!hidden) return;
73
+ // The live `Object3D.visible` IS the authored truth, so the SHOW edge has
74
+ // nothing to restore FROM — the adapter re-renders its own tree there.
75
+ // Hiding wins over everything: nothing in a hidden world renders.
76
+ for (const obj of objectMap.values()) obj.visible = false;
77
+ }
78
+
79
+ /**
80
+ * The background an editor viewport with NO authored environment shows. A
81
+ * single shared instance so the per-notify re-apply below never allocates.
82
+ */
83
+ const HIDDEN_WORLD_BACKGROUND = new THREE.Color('#aaaaaa');
84
+
85
+ /**
86
+ * The scene-level half of the eye: `applyRootHiddenVisibility` above only
87
+ * covers entity `Object3D`s (the `objectMap`), but a three world also
88
+ * renders things that live directly on the `THREE.Scene` — the authored
89
+ * `background` color/skybox, `fog`, IBL `environment`, and the
90
+ * `envObject`-tagged ambient light `applyEnvironment` adds. None of those are
91
+ * entities, so without this function hiding the world leaves the viewport
92
+ * painted in the world's background color — looking exactly like "the eye
93
+ * didn't work".
94
+ *
95
+ * Same recompute-don't-remember contract as above: this only ever writes the
96
+ * SUPPRESSED state, idempotently, and callers invoke it on every notify while
97
+ * the world is hidden (an inspector environment edit mid-hide re-paints the
98
+ * authored values via `_applyEnvironment` — the very next notify re-suppresses
99
+ * them here). The restore path is `EditorShellStore.reapplyEnvironment()`, whose
100
+ * truth is `_sceneMeta.environment` — never a snapshot taken here.
101
+ *
102
+ * Post-processing (bloom/vignette) is the composer's half: `the world root's stage`'s
103
+ * `rebuildComposer` passes `undefined` instead of `store.environment` while
104
+ * the world is hidden; `editor-viewport.ts` bumps `composerVersion` (via
105
+ * `reapplyEnvironment`) on both hide/show edges so that rebuild actually runs.
106
+ */
107
+ export function suppressRootEnvironment(scene: THREE.Scene): void {
108
+ scene.background = HIDDEN_WORLD_BACKGROUND;
109
+ scene.fog = null;
110
+ scene.environment = null;
111
+ scene.traverse((obj) => {
112
+ if (getUserData(obj, 'envObject')) obj.visible = false;
113
+ });
114
+ }
115
+
116
+ /**
117
+ * Is a three surface currently SHOWING in the viewport? This is the single
118
+ * derived truth the 3D viewport chrome gates on (spec 28): the grid,
119
+ * orientation gizmo, transform toolstrip, camera readout, shading modes, and
120
+ * the transform gizmo itself are claims about what the user can do RIGHT NOW
121
+ * — showing them over a viewport with no visible 3D content is a false claim
122
+ * (same spirit as the adapter-reach rule: report what isn't there, never
123
+ * advertise it). The DOM half of the chrome (`RootSelectionOverlay`)
124
+ * already self-gates this way; this selector brings the pre-contract 3D
125
+ * chrome under the same rule.
126
+ *
127
+ * Truth table (deliberately conservative — every non-composite mode keeps
128
+ * today's behavior exactly):
129
+ * - active adapter is not a composite (single-world project, ingest):
130
+ * `true` — no world-group eyes exist there, so there is nothing to derive
131
+ * from.
132
+ * - composite with NO threejs-kind child at all (e.g. react-only
133
+ * multi-world manifest): `false` — no 3D content can EVER show.
134
+ * - composite whose three child is still a read-only Boundary
135
+ * (`resolveThreeViewportRootId` → null): `true` — this is reachable
136
+ * transiently while the R3F design session attaches; keep the chrome rather
137
+ * than flickering it around adapter-install timing.
138
+ * - composite with a live three world: `!isRootHidden(worldId)`
139
+ * — the eye is the "what we're showing" signal.
140
+ *
141
+ * Recompute-per-call like everything else in this module: callers read it on
142
+ * every store notify (`syncFromStore` / `the world root's stage` render), never cache
143
+ * it across notifies.
144
+ */
145
+ export function isThreejsSurfaceVisible(store: EditorShellStore): boolean {
146
+ const active = getActiveAuthoring(store);
147
+ if (!(active instanceof CompositeAuthoringAdapter)) return true;
148
+ const children = active.childAdapters();
149
+ if (!children.some((c) => c.kind === 'three')) return false;
150
+ const threeRootId = resolveThreeViewportRootId(store);
151
+ return threeRootId === null ? true : !isRootHidden(threeRootId);
152
+ }
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Shared DOM-world canvas transform (spec27 §8 "space-pan" row, D4 rebuild) — a
3
+ * module-level subscribable singleton (mirrors `eyedropper-session.ts`'s "bare
4
+ * singleton + own listener set" shape) holding the CURRENT SHARED pan + zoom
5
+ * applied, in LOCKSTEP, to both every design-time world-layer host
6
+ * (`design-time-layers.ts`'s `createLayerElement`-produced react/pixi layers)
7
+ * and `RootSelectionOverlay`'s visual-chrome wrapper. Its independent input
8
+ * sibling deliberately remains untransformed and covers the full viewport.
9
+ *
10
+ * SOUNDNESS (why lockstep preserves the "zero-correction" host-relative rect
11
+ * invariant `RootSelectionOverlay.tsx`'s own doc comment establishes):
12
+ * `RectProvider.rect(id)` is computed as `el.getBoundingClientRect()` MINUS
13
+ * the owning world's own root/host `getBoundingClientRect()`
14
+ * (`react-world-authoring-adapter.ts`'s `toHostRelative`/`hostRect` — `this
15
+ * .root` IS the exact layer div `createLayerElement` produces). A CSS
16
+ * `transform: translate()` applied directly to that host element shifts the
17
+ * host's OWN rendered rect AND every descendant's rendered rect by the
18
+ * IDENTICAL `(x, y)` delta — a rigid subtree translation — so the
19
+ * subtraction is invariant under pan: `rect(id)` returns the SAME
20
+ * host-relative numbers at any pan offset, unmodified, with no pan-awareness
21
+ * needed in `inspect.ts`'s geometry math or the overlay chrome consumers.
22
+ * Zoom scales both measured rectangles; `toHostRelative` divides their
23
+ * offsets and dimensions by the shared zoom before exposing authored-space
24
+ * geometry, while `RootSelectionOverlay.toHostLocal` performs the inverse
25
+ * for pointer gestures. `PickProvider.pick` needs no changes — it
26
+ * hit-tests real rendered rects against the real client cursor position,
27
+ * both of which already reflect the applied transform natively.
28
+ *
29
+ * Applying the exact SAME transform to `RootSelectionOverlay`'s own visual-
30
+ * chrome wrapper (a SIBLING of every world-layer host inside the SAME
31
+ * `the world root's stage` containerRef parent — see that file's own mount-site doc
32
+ * comment) shifts and scales the overlay by the identical transform — so
33
+ * drawing a chrome element at `rect(id)`'s authored coordinates lands it at the
34
+ * SAME screen position as the panned live element it describes. This is the
35
+ * entire "lockstep" contract: every consumer on both sides of the pan reads
36
+ * ONE shared value (`getRootPan()`) and applies it through the ONE shared
37
+ * pure helper (`panTransformValue`) — never two independently-computed
38
+ * transforms that could drift.
39
+ */
40
+
41
+ export interface RootPan {
42
+ readonly x: number;
43
+ readonly y: number;
44
+ readonly zoom: number;
45
+ }
46
+
47
+ const ZERO_PAN: RootPan = { x: 0, y: 0, zoom: 1 };
48
+
49
+ /**
50
+ * One document camera over a 2D authoring plane.
51
+ *
52
+ * DOM component boards still use the historical shared instance exported
53
+ * below. A native canvas Scene creates its own instance, because a scene
54
+ * camera and a component-board camera are different documents and must not
55
+ * inherit one another's pose merely because both happen to be 2D.
56
+ */
57
+ export interface RootViewController {
58
+ get(): RootPan;
59
+ setView(x: number, y: number, zoom: number): void;
60
+ setPan(x: number, y: number): void;
61
+ setZoom(zoom: number): void;
62
+ reset(): void;
63
+ subscribe(listener: () => void): () => void;
64
+ }
65
+
66
+ export function createRootViewController(initial: RootPan = ZERO_PAN): RootViewController {
67
+ let current: RootPan = initial;
68
+ const subscribers = new Set<() => void>();
69
+ const notifySubscribers = (): void => {
70
+ for (const listener of subscribers) listener();
71
+ };
72
+ return {
73
+ get: () => current,
74
+ setView: (x, y, zoom) => {
75
+ const nextZoom = Math.min(4, Math.max(0.1, zoom));
76
+ if (current.x === x && current.y === y && current.zoom === nextZoom) return;
77
+ current = { x, y, zoom: nextZoom };
78
+ notifySubscribers();
79
+ },
80
+ setPan: (x, y) => {
81
+ const nextZoom = current.zoom;
82
+ if (current.x === x && current.y === y) return;
83
+ current = { x, y, zoom: nextZoom };
84
+ notifySubscribers();
85
+ },
86
+ setZoom: (zoom) => {
87
+ const nextZoom = Math.min(4, Math.max(0.1, zoom));
88
+ if (current.zoom === nextZoom) return;
89
+ current = { x: current.x, y: current.y, zoom: nextZoom };
90
+ notifySubscribers();
91
+ },
92
+ reset: () => {
93
+ if (current.x === 0 && current.y === 0 && current.zoom === 1) return;
94
+ current = ZERO_PAN;
95
+ notifySubscribers();
96
+ },
97
+ subscribe: (listener) => {
98
+ subscribers.add(listener);
99
+ return () => subscribers.delete(listener);
100
+ },
101
+ };
102
+ }
103
+
104
+ let _pan: RootPan = ZERO_PAN;
105
+ const listeners = new Set<() => void>();
106
+
107
+ /** The historical DOM-board camera, exposed as a controller for generic
108
+ * navigation/overlay code. Existing function exports below remain the
109
+ * compatibility surface for board-specific callers. */
110
+ export const sharedRootViewController: RootViewController = {
111
+ get: () => getRootPan(),
112
+ setView: (x, y, zoom) => setRootView(x, y, zoom),
113
+ setPan: (x, y) => setRootPan(x, y),
114
+ setZoom: (zoom) => setRootZoom(zoom),
115
+ reset: () => resetRootPan(),
116
+ subscribe: (listener) => subscribeRootPan(listener),
117
+ };
118
+
119
+ function notify(): void {
120
+ for (const l of listeners) l();
121
+ }
122
+
123
+ /** The current shared canvas transform; x/y are CSS px and zoom is unitless. */
124
+ export function getRootPan(): RootPan {
125
+ return _pan;
126
+ }
127
+
128
+ /** Set the complete shared canvas transform in one subscriber notification. */
129
+ export function setRootView(x: number, y: number, zoom: number): void {
130
+ const nextZoom = Math.min(4, Math.max(0.1, zoom));
131
+ if (_pan.x === x && _pan.y === y && _pan.zoom === nextZoom) return;
132
+ _pan = { x, y, zoom: nextZoom };
133
+ notify();
134
+ }
135
+
136
+ /** Set the shared pan translate to an absolute `(x, y)`. */
137
+ export function setRootPan(x: number, y: number): void {
138
+ setRootView(x, y, _pan.zoom);
139
+ }
140
+
141
+ /** Set the shared canvas zoom while preserving its current pan. */
142
+ export function setRootZoom(zoom: number): void {
143
+ setRootView(_pan.x, _pan.y, zoom);
144
+ }
145
+
146
+ /** Set the shared pan translate by a RELATIVE `(dx, dy)` — a convenience
147
+ * wrapper over `setRootPan` (not used by `RootSelectionOverlay`'s own
148
+ * space-drag, which composes onto a captured drag-start snapshot instead —
149
+ * see its own doc comment — but kept here as the natural pure counterpart
150
+ * for any future incremental caller, e.g. a nudge-pan keybinding). */
151
+ export function panRootBy(dx: number, dy: number): void {
152
+ setRootPan(_pan.x + dx, _pan.y + dy);
153
+ }
154
+
155
+ /** Reset pan to `(0, 0)` and zoom to 100% — called on a world-layer remount (`design-time-
156
+ * layers.ts`'s `mountDesignTimeLayers`, invoked on initial edit-mode install
157
+ * AND every acknowledged edit-mode rebuild), so switching/reloading the active
158
+ * world set never leaves a stale pan offset applied over a DIFFERENT layer
159
+ * stack. A no-op (no `notify()`) when already at rest, so a fresh session
160
+ * never fires a spurious subscriber tick. */
161
+ export function resetRootPan(): void {
162
+ if (_pan.x === 0 && _pan.y === 0 && _pan.zoom === 1) return;
163
+ _pan = ZERO_PAN;
164
+ notify();
165
+ }
166
+
167
+ /** Subscribe to canvas-transform changes — both `design-time-layers.ts` (imperative DOM
168
+ * style writes) and `RootSelectionOverlay` (`useSyncExternalStore`) bind
169
+ * this so every lockstep mount point re-applies the SAME new value the
170
+ * instant it changes. */
171
+ export function subscribeRootPan(listener: () => void): () => void {
172
+ listeners.add(listener);
173
+ return () => listeners.delete(listener);
174
+ }
175
+
176
+ /**
177
+ * The ONE shared CSS `transform` value both visual lockstep mount points apply —
178
+ * pure, so a unit test can assert the world-layer host and the overlay
179
+ * wrapper are handed byte-identical strings for any given pan (the actual
180
+ * "lockstep" proof). `undefined` at rest `(0, 0)` so neither mount point ever
181
+ * carries a no-op `transform: translate(0px, 0px)` — keeps every pre-pan
182
+ * pixel-position snapshot (the full 27x suite, pinned at pan=0) byte-identical
183
+ * to its pre-this-feature output.
184
+ */
185
+ export function panTransformValue(pan: RootPan): string | undefined {
186
+ if (pan.x === 0 && pan.y === 0 && pan.zoom === 1) return undefined;
187
+ if (pan.zoom === 1) return `translate(${pan.x}px, ${pan.y}px)`;
188
+ if (pan.x === 0 && pan.y === 0) return `scale(${pan.zoom})`;
189
+ return `translate(${pan.x}px, ${pan.y}px) scale(${pan.zoom})`;
190
+ }
191
+
192
+ /** Test-only reset (mirrors `eyedropper-session.ts`'s/`world-session-
193
+ * state.ts`'s identical helpers) — drops pan + every subscriber so unit
194
+ * tests don't leak state across cases. */
195
+ export function _resetRootPanStateForTest(): void {
196
+ _pan = ZERO_PAN;
197
+ listeners.clear();
198
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * World session state (B1) — a module-level subscribable singleton (same shape as
3
+ * `./mount-failure-report.ts`: a bare get/set slot, no subscribe of its own — every
4
+ * caller that mutates it follows up with `store.notifyIngestEdit()`, which every
5
+ * panel already re-renders off via `useSyncExternalStore(store.subscribe, …)`)
6
+ * holding THREE session-local, per-worldId toggles that are NEVER
7
+ * serialized/persisted (D9: "eye = session-local viewport visibility, never
8
+ * serialized" — generalized here to all three, none of which is an authored
9
+ * property):
10
+ *
11
+ * - `hidden` — the eye (A2/D9). LIFTED out of `GameHierarchy.tsx`'s former
12
+ * local `useState<Set<string>> hiddenRootIds` (module-private React state
13
+ * the design-time layer stack could never see) so `design-time-layers.ts`
14
+ * can hide/show a world's actual DOM layer, not just dim its hierarchy row.
15
+ * - `interactive` — forwards real pointer events to the layer (for testing
16
+ * hover/press states at design time); off by default (`pointer-events:none`
17
+ * is the layer's resting state — see `design-time-layers.ts`).
18
+ * - `pickLock` — stored here for B4 to consume (layered viewport picking,
19
+ * D12): a pick-locked layer is skipped by the topmost-first pick walk.
20
+ * B1 only stores/exposes the toggle; nothing reads it yet.
21
+ *
22
+ * Keyed by the RAW manifest world id (`CompositeChild.worldId` /
23
+ * `ResolvedAdapterRoot.id`) — the SAME id `design-time-layers.ts` gets from
24
+ * `composite.childAdapters()`, NOT the composite's synthetic `world:<id>`
25
+ * group-node id. `GameHierarchy.tsx` (whose rows ARE keyed by the group-node
26
+ * id) resolves the raw worldId via `compositeGroupBadge`'s `worldId` field
27
+ * before calling into this module — see that file's row component.
28
+ *
29
+ * A process-lifetime singleton (not project-scoped): switching projects
30
+ * within the same tab does not reset these toggles. That's a deliberate
31
+ * relaxation of the former per-mount-React-state behavior (which reset on
32
+ * every `GameHierarchy` remount) — "session-local" here means "this browser
33
+ * tab's session", matching D9's own framing; nothing depends on a
34
+ * project-switch reset.
35
+ */
36
+
37
+ export interface RootSessionState {
38
+ readonly hidden: boolean;
39
+ readonly interactive: boolean;
40
+ readonly pickLock: boolean;
41
+ }
42
+
43
+ const DEFAULT_STATE: RootSessionState = { hidden: false, interactive: false, pickLock: false };
44
+
45
+ const _states = new Map<string, RootSessionState>();
46
+
47
+ function get(worldId: string): RootSessionState {
48
+ return _states.get(worldId) ?? DEFAULT_STATE;
49
+ }
50
+
51
+ function patch(worldId: string, partial: Partial<RootSessionState>): void {
52
+ _states.set(worldId, { ...get(worldId), ...partial });
53
+ }
54
+
55
+ /** The eye (A2/D9): true while `worldId`'s design-time layer is hidden. */
56
+ export function isRootHidden(worldId: string): boolean {
57
+ return get(worldId).hidden;
58
+ }
59
+
60
+ export function setRootHidden(worldId: string, hidden: boolean): void {
61
+ patch(worldId, { hidden });
62
+ }
63
+
64
+ export function toggleRootHidden(worldId: string): void {
65
+ setRootHidden(worldId, !isRootHidden(worldId));
66
+ }
67
+
68
+ /** True while `worldId`'s layer forwards real pointer events (design-time
69
+ * hover/press testing) instead of its resting `pointer-events:none`. */
70
+ export function isRootInteractive(worldId: string): boolean {
71
+ return get(worldId).interactive;
72
+ }
73
+
74
+ export function setRootInteractive(worldId: string, interactive: boolean): void {
75
+ patch(worldId, { interactive });
76
+ }
77
+
78
+ export function toggleRootInteractive(worldId: string): void {
79
+ setRootInteractive(worldId, !isRootInteractive(worldId));
80
+ }
81
+
82
+ /** B4 will read this to skip a layer in the topmost-first pick walk; B1 only
83
+ * stores/exposes the toggle. */
84
+ export function isRootPickLocked(worldId: string): boolean {
85
+ return get(worldId).pickLock;
86
+ }
87
+
88
+ export function setRootPickLock(worldId: string, pickLock: boolean): void {
89
+ patch(worldId, { pickLock });
90
+ }
91
+
92
+ export function toggleRootPickLock(worldId: string): void {
93
+ setRootPickLock(worldId, !isRootPickLocked(worldId));
94
+ }
95
+
96
+ /** Test-only: drop every world's session state back to defaults so unit
97
+ * tests don't leak toggles across cases (this module is a process-lifetime
98
+ * singleton — see the header comment). */
99
+ export function _resetRootSessionStateForTest(): void {
100
+ _states.clear();
101
+ }