@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,454 @@
1
+ import {
2
+ faBone,
3
+ faCamera,
4
+ faCaretDown,
5
+ faCheck,
6
+ faCube,
7
+ faEllipsis,
8
+ faExpand,
9
+ faRotateLeft,
10
+ } from '@fortawesome/free-solid-svg-icons';
11
+ import {
12
+ AnchoredMenu,
13
+ Button,
14
+ EditorBanner,
15
+ EditorIcon,
16
+ EditorPopover,
17
+ EditorToolbar,
18
+ IconButton,
19
+ MenuItem,
20
+ MenuSeparator,
21
+ Select,
22
+ Text,
23
+ TextInput,
24
+ Tooltip,
25
+ } from '@volter/editor-sdk/widgets';
26
+ import { useRef, useState, useSyncExternalStore } from 'react';
27
+ import { captureModelAssetPreview, captureObjectAssetPreview } from '../asset-preview';
28
+ import {
29
+ type ModelCameraPreset,
30
+ supportedModelDiagnosticModes,
31
+ } from '../asset-workflow/model-inspection';
32
+ import type { Object3DDocumentViewMode } from '../authoring/object3d-document-session';
33
+ import {
34
+ object3DDocumentSession,
35
+ object3DDocumentSessionsVersion,
36
+ subscribeObject3DDocumentSessions,
37
+ } from '../authoring/object3d-document-session-registry';
38
+ import {
39
+ contributedChromeVersion,
40
+ contributedHeaderItems,
41
+ subscribeContributedChrome,
42
+ } from '../chrome-registry';
43
+ import type { HelperVisibility } from '../editor-shell-store';
44
+ import { object3DDocumentWritePolicy } from '../object3d-document-write-policy';
45
+ import { stageStore, stageStoresVersion, subscribeStageStores } from '../stage-store-registry';
46
+ import { viewportStageHelperKinds } from '../viewport-door';
47
+ import { ViewportOverlaysGlyph, ViewportOverlaysMenu } from './ViewportOverlaysMenu';
48
+ import {
49
+ type ViewportDisplayModeChoice,
50
+ ViewportDisplayModeMenu,
51
+ viewportShadingModes,
52
+ viewportShadingSegments,
53
+ } from './ViewportShadingMenu';
54
+
55
+ const subscribeToNothing = () => () => undefined;
56
+ const noSessionVersion = () => 0;
57
+
58
+ /**
59
+ * THE DOCUMENT'S OWN OVERLAY ROWS, beside Grid and Bounds.
60
+ *
61
+ * Blender's viewport overlay popover carries a BONES checkbox
62
+ * (`View3DOverlay.show_bones`, `makesrna/intern/rna_space.cc:5125-5129`, drawn
63
+ * by `scripts/startup/bl_ui/space_view3d.py:7161` with `text="Bones"`), and it
64
+ * is Blender's noun that is used here rather than the Helpers vocabulary's
65
+ * `Skeletons`, because this menu IS that popover — the comment on the eye below
66
+ * says so. `Weights` has no Blender checkbox at all: Blender reaches weight
67
+ * colours through Weight Paint MODE, and an inspection surface has no brushes
68
+ * to enter one, so it is a display toggle here (WORK.md §Blender in the tab is
69
+ * Blender, "Inspection parity", I4).
70
+ *
71
+ * A ROW STANDS ONLY WHERE THE DOCUMENT PUT A HELPER OF THAT KIND on this stage
72
+ * (`viewportStageHelperKinds`) — the same rule the Outliner's restriction
73
+ * columns follow: a control follows what the thing behind it answers, never a
74
+ * knob. So an imported GLB's Asset Lab document, which shows no bones, draws
75
+ * neither row.
76
+ */
77
+ const DOCUMENT_HELPER_ROWS: readonly { key: keyof HelperVisibility; label: string }[] = [
78
+ { key: 'skeletons', label: 'Bones' },
79
+ { key: 'weights', label: 'Weights' },
80
+ ];
81
+ export function Object3DDocumentToolbar({
82
+ documentId,
83
+ assetPath,
84
+ }: {
85
+ readonly documentId: string;
86
+ readonly assetPath?: string;
87
+ }) {
88
+ useSyncExternalStore(
89
+ subscribeObject3DDocumentSessions,
90
+ object3DDocumentSessionsVersion,
91
+ object3DDocumentSessionsVersion,
92
+ );
93
+ const session = object3DDocumentSession(documentId);
94
+ useSyncExternalStore(
95
+ subscribeContributedChrome,
96
+ contributedChromeVersion,
97
+ contributedChromeVersion,
98
+ );
99
+ useSyncExternalStore(
100
+ session?.subscribe ?? subscribeToNothing,
101
+ session?.getSnapshot ?? noSessionVersion,
102
+ session?.getSnapshot ?? noSessionVersion,
103
+ );
104
+ // THIS STAGE's own store and its own helpers: the shared panels read
105
+ // whichever store the FOCUSED document's stage runs on (ARCHITECTURE-CORE
106
+ // §One stage), and a toolbar is a control over ITS document, never over the
107
+ // world root's.
108
+ useSyncExternalStore(subscribeStageStores, stageStoresVersion, stageStoresVersion);
109
+ const stage = stageStore(documentId);
110
+ useSyncExternalStore(
111
+ stage?.subscribe ?? subscribeToNothing,
112
+ stage?.getSnapshot ?? noSessionVersion,
113
+ stage?.getSnapshot ?? noSessionVersion,
114
+ );
115
+ const helperKinds = viewportStageHelperKinds(documentId);
116
+ const [capture, setCapture] = useState<string | null>(null);
117
+ const [error, setError] = useState<string | null>(null);
118
+ const [viewOpen, setViewOpen] = useState(false);
119
+ const [moreOpen, setMoreOpen] = useState(false);
120
+ const viewRef = useRef<HTMLButtonElement>(null);
121
+ const moreRef = useRef<HTMLButtonElement>(null);
122
+ if (!session) return null;
123
+ const presentation = session.presentation();
124
+ const availableModes = new Set(
125
+ supportedModelDiagnosticModes(session.root)
126
+ .filter((item) => item.available)
127
+ .map((item) => item.mode),
128
+ );
129
+ const modes: Array<ViewportDisplayModeChoice<Object3DDocumentViewMode>> = [
130
+ ...viewportShadingModes,
131
+ ...(availableModes.has('uv')
132
+ ? [{ mode: 'uv' as const, label: 'UV', description: 'UV coordinates as surface color' }]
133
+ : []),
134
+ ...(availableModes.has('vertex-colors')
135
+ ? [
136
+ {
137
+ mode: 'vertex-colors' as const,
138
+ label: 'Vertex colors',
139
+ description: 'Authored color attributes without textures',
140
+ },
141
+ ]
142
+ : []),
143
+ ];
144
+
145
+ const saveThumbnailFraming = async (reset: boolean) => {
146
+ if (!assetPath) return;
147
+ setError(null);
148
+ try {
149
+ // The shell owns where a framing is RECORDED (`.vgai/thumbnails.json`,
150
+ // written through the project-file route); this surface only knows the
151
+ // asset and the pose. See `object3d-document-write-policy.ts`.
152
+ await object3DDocumentWritePolicy().saveThumbnailFraming(
153
+ assetPath,
154
+ reset ? undefined : session.cameraPose(),
155
+ );
156
+ } catch (cause) {
157
+ setError(cause instanceof Error ? cause.message : String(cause));
158
+ }
159
+ };
160
+
161
+ const capturePreview = async () => {
162
+ setError(null);
163
+ try {
164
+ const options = { background: presentation.background } as const;
165
+ const result = assetPath?.toLowerCase().endsWith('.spz')
166
+ ? await captureModelAssetPreview(assetPath, options)
167
+ : captureObjectAssetPreview(session.root, options);
168
+ setCapture(`data:image/png;base64,${result.contactSheet.base64}`);
169
+ } catch (cause) {
170
+ setError(cause instanceof Error ? cause.message : String(cause));
171
+ }
172
+ };
173
+
174
+ const frameLabel = session.selection().length > 0 ? 'Frame selection' : 'Frame all';
175
+ return (
176
+ <div className="vgai-model-document-header">
177
+ <EditorToolbar
178
+ compact
179
+ label="Viewport view controls"
180
+ className="vgai-model-viewport-toolbar vgai-model-viewport-toolbar--view"
181
+ >
182
+ {/* THE BUTTON SAYS WHAT IT DOES. `session.frame()` frames the
183
+ selection when there is one and the whole subject when there is
184
+ not, but it was labelled "Frame selection" unconditionally — so a
185
+ tester hunting a fit-the-board control on the 3D board reported
186
+ finding none, then discovered this button does exactly that
187
+ (runhuman passes 87 and 89). One control, named for the job it is
188
+ about to do. */}
189
+ <Tooltip text={frameLabel}>
190
+ <IconButton aria-label={frameLabel} onClick={() => session.frame()}>
191
+ <EditorIcon icon={faExpand} size="md" />
192
+ </IconButton>
193
+ </Tooltip>
194
+ <div className="vgai-viewport-popover-anchor">
195
+ <Tooltip text="Camera orientation and projection">
196
+ <Button
197
+ ref={viewRef}
198
+ type="button"
199
+ size="compact"
200
+ // A dropdown TRIGGER is a widget, not a label: Blender's
201
+ // `Object Mode v` in the same row of chrome is a 20px well
202
+ // (#272727 in a 1px #3c3c3c border) while its plain menu words
203
+ // — View/Select/Add — carry no chrome at all. `ghost` said this
204
+ // was the second kind; it is the first.
205
+ variant="secondary"
206
+ aria-label={`Camera view: ${presentation.projection}`}
207
+ aria-haspopup="menu"
208
+ aria-expanded={viewOpen}
209
+ onClick={() => setViewOpen((open) => !open)}
210
+ className="vgai-model-toolbar-labelled-control"
211
+ >
212
+ <EditorIcon icon={faCube} size="sm" />
213
+ <span>
214
+ {presentation.projection === 'perspective' ? 'Perspective' : 'Orthographic'}
215
+ </span>
216
+ <EditorIcon icon={faCaretDown} size="xs" />
217
+ </Button>
218
+ </Tooltip>
219
+ {viewOpen && (
220
+ <AnchoredMenu
221
+ anchorRef={viewRef}
222
+ align="start"
223
+ clamp
224
+ aria-label="Camera view"
225
+ onDismiss={() => setViewOpen(false)}
226
+ style={{ minWidth: 210 }}
227
+ >
228
+ {(['front', 'right', 'top', 'isometric'] as ModelCameraPreset[]).map((preset) => (
229
+ <MenuItem
230
+ key={preset}
231
+ onSelect={() => {
232
+ session.setViewPreset(preset);
233
+ setViewOpen(false);
234
+ }}
235
+ >
236
+ {preset === 'isometric'
237
+ ? 'Perspective 3/4'
238
+ : `${preset[0]?.toUpperCase()}${preset.slice(1)} view`}
239
+ </MenuItem>
240
+ ))}
241
+ <MenuSeparator />
242
+ {(['perspective', 'orthographic'] as const).map((projection) => (
243
+ <MenuItem
244
+ key={projection}
245
+ role="menuitemradio"
246
+ aria-checked={presentation.projection === projection}
247
+ onSelect={() => {
248
+ session.setProjection(projection);
249
+ setViewOpen(false);
250
+ }}
251
+ >
252
+ <span className="vgai-menu-check">
253
+ {presentation.projection === projection && (
254
+ <EditorIcon icon={faCheck} size="xs" />
255
+ )}
256
+ </span>
257
+ {projection === 'perspective' ? 'Perspective' : 'Orthographic'}
258
+ </MenuItem>
259
+ ))}
260
+ </AnchoredMenu>
261
+ )}
262
+ </div>
263
+ {availableModes.has('skeleton') ? (
264
+ <Tooltip text={`Rig: ${presentation.skeleton ? 'Visible' : 'Hidden'}`}>
265
+ <IconButton
266
+ aria-label="Toggle rig overlay"
267
+ aria-pressed={presentation.skeleton}
268
+ onClick={() => session.setSkeleton(!presentation.skeleton)}
269
+ >
270
+ <EditorIcon icon={faBone} size="md" />
271
+ </IconButton>
272
+ </Tooltip>
273
+ ) : null}
274
+ {/* A package's own controls on this document (`@volter/editor-sdk/chrome`,
275
+ `placement: 'object3d-document'`): handed the document's id; the
276
+ contribution resolves its subject through its own integration. */}
277
+ {contributedHeaderItems('object3d-document').map(({ id, Component }) => (
278
+ <Component key={id} documentId={documentId} />
279
+ ))}
280
+ </EditorToolbar>
281
+ <EditorToolbar
282
+ compact
283
+ label="Viewport preview controls"
284
+ className="vgai-model-viewport-toolbar vgai-model-viewport-toolbar--preview"
285
+ >
286
+ {/* THE DISPLAY CONTROLS SIT AT THE TRAILING EDGE, which is where
287
+ Blender's are: its 3D View header packs Visibility, Gizmo,
288
+ Overlays, X-Ray and Shading hard against the region's right border
289
+ and leaves the middle empty. Ours used to clump them after the
290
+ view controls with three hundred pixels of bare header to their
291
+ right and this group's `...` alone at the edge. */}
292
+ {/* BLENDER'S SHADING CONTROL, one widget: the segments it has, and the
293
+ chevron's popover carrying every other mode AND the lighting rows
294
+ that used to be a second `Studio v` dropdown further along the row.
295
+ Blender's own shading popover is where Lighting lives (Studio /
296
+ MatCap / Flat), so the two controls were always one control drawn
297
+ twice — measured in `modeling-edit-none.png`, its header's trailing
298
+ cluster is five icon groups and no words at all. */}
299
+ <ViewportDisplayModeMenu
300
+ mode={presentation.mode}
301
+ onChange={(mode) => session.setMode(mode)}
302
+ choices={modes}
303
+ segments={viewportShadingSegments}
304
+ >
305
+ {session.lightingAvailable() ? (
306
+ <>
307
+ <label>
308
+ <span>Lighting</span>
309
+ <Select
310
+ aria-label="Lighting preset"
311
+ value={presentation.lighting}
312
+ onChange={(event) =>
313
+ session.setLighting(event.target.value as 'studio' | 'outdoor' | 'flat')
314
+ }
315
+ >
316
+ <option value="studio">Studio</option>
317
+ <option value="outdoor">Outdoor</option>
318
+ <option value="flat">Flat</option>
319
+ </Select>
320
+ </label>
321
+ <label>
322
+ <span>Exposure</span>
323
+ <TextInput
324
+ aria-label="Preview exposure"
325
+ type="range"
326
+ min="0.2"
327
+ max="2"
328
+ step="0.1"
329
+ value={presentation.exposure}
330
+ onChange={(event) => session.setExposure(Number(event.target.value))}
331
+ />
332
+ <Text as="span" variant="caption">
333
+ {presentation.exposure.toFixed(1)}
334
+ </Text>
335
+ </label>
336
+ </>
337
+ ) : null}
338
+ </ViewportDisplayModeMenu>
339
+ {/* THE EYE WAS THE OVERLAYS CONTROL ALL ALONG — measured by what it
340
+ toggles, which is Grid and Bounds, exactly Blender's Show Overlays
341
+ subject. It takes Blender's mark. It does NOT take Blender's split
342
+ toggle+chevron: that toggle binds to a MASTER overlays flag this
343
+ document's session does not have, and deriving one from "any
344
+ overlay is on" would silently drop the per-overlay state on the
345
+ first click. One button, one job, until the session has the flag. */}
346
+ <ViewportOverlaysMenu
347
+ glyph={<ViewportOverlaysGlyph />}
348
+ choices={[
349
+ {
350
+ id: 'grid',
351
+ label: 'Grid',
352
+ enabled: presentation.grid,
353
+ onToggle: () => session.setGrid(!presentation.grid),
354
+ },
355
+ {
356
+ id: 'bounds',
357
+ label: 'Bounds',
358
+ enabled: presentation.bounds,
359
+ onToggle: () => session.setBounds(!presentation.bounds),
360
+ },
361
+ ...(stage === null
362
+ ? []
363
+ : DOCUMENT_HELPER_ROWS.filter((row) => helperKinds.includes(row.key)).map((row) => ({
364
+ id: row.key,
365
+ label: row.label,
366
+ enabled: stage.helperVisibility[row.key],
367
+ onToggle: () => stage.toggleHelperType(row.key),
368
+ }))),
369
+ ]}
370
+ />
371
+ <div className="vgai-viewport-popover-anchor">
372
+ <Tooltip text="Asset preview actions">
373
+ <IconButton
374
+ ref={moreRef}
375
+ aria-label="Asset preview actions"
376
+ aria-haspopup="menu"
377
+ aria-expanded={moreOpen}
378
+ onClick={() => setMoreOpen((open) => !open)}
379
+ >
380
+ <EditorIcon icon={faEllipsis} size="md" />
381
+ </IconButton>
382
+ </Tooltip>
383
+ {moreOpen && (
384
+ <AnchoredMenu
385
+ anchorRef={moreRef}
386
+ clamp
387
+ aria-label="Asset preview actions"
388
+ onDismiss={() => setMoreOpen(false)}
389
+ style={{ minWidth: 210 }}
390
+ >
391
+ <MenuItem
392
+ onSelect={() => {
393
+ setMoreOpen(false);
394
+ void capturePreview();
395
+ }}
396
+ >
397
+ <EditorIcon icon={faCamera} size="sm" />
398
+ Capture preview
399
+ </MenuItem>
400
+ {assetPath ? (
401
+ <>
402
+ <MenuItem
403
+ onSelect={() => {
404
+ setMoreOpen(false);
405
+ void saveThumbnailFraming(false);
406
+ }}
407
+ >
408
+ Save thumbnail framing
409
+ </MenuItem>
410
+ <MenuItem
411
+ onSelect={() => {
412
+ setMoreOpen(false);
413
+ void saveThumbnailFraming(true);
414
+ }}
415
+ >
416
+ Reset thumbnail framing
417
+ </MenuItem>
418
+ </>
419
+ ) : null}
420
+ <MenuSeparator />
421
+ <MenuItem
422
+ onSelect={() => {
423
+ session.resetPresentation();
424
+ setMoreOpen(false);
425
+ }}
426
+ >
427
+ <EditorIcon icon={faRotateLeft} size="sm" />
428
+ Reset viewport settings
429
+ </MenuItem>
430
+ </AnchoredMenu>
431
+ )}
432
+ </div>
433
+ </EditorToolbar>
434
+ {capture ? (
435
+ <EditorPopover className="vgai-model-capture-preview">
436
+ <div>
437
+ <Text as="strong" variant="label">
438
+ Deterministic views
439
+ </Text>
440
+ <Button type="button" variant="ghost" onClick={() => setCapture(null)}>
441
+ Close
442
+ </Button>
443
+ </div>
444
+ <img src={capture} alt="Front, right, top, and three-quarter model preview" />
445
+ </EditorPopover>
446
+ ) : null}
447
+ {error ? (
448
+ <EditorBanner className="vgai-model-toolbar-error" tone="error">
449
+ {error}
450
+ </EditorBanner>
451
+ ) : null}
452
+ </div>
453
+ );
454
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Lazy document boundary for the shared Object3D authoring surface.
3
+ *
4
+ * Registries and open-document planners need to be able to name this surface
5
+ * during editor boot, but the implementation carries Asset Lab's animation,
6
+ * capture, model-inspection, and source-authoring graph. Importing that graph
7
+ * merely to register unopened document kinds put it on Scene's cold path.
8
+ * Keep the public component shape here and evaluate the implementation only
9
+ * when React actually renders an Object3D document.
10
+ */
11
+
12
+ import { lazy, Suspense, useEffect } from 'react';
13
+ import { announceObject3DDocumentStage } from '../authoring/object3d-document-session-registry';
14
+ import type { Object3DDocumentViewportProps } from './StageHost';
15
+ import { OBJECT3D_SURFACE_BUILDING, ViewportSurfaceStatus } from './viewport-surface-status';
16
+
17
+ const LazyObject3DDocumentViewport = lazy(async () => {
18
+ const module = await import('./StageHost');
19
+ return { default: module.Object3DDocumentViewport };
20
+ });
21
+
22
+ export function Object3DDocumentViewport(props: Object3DDocumentViewportProps) {
23
+ // ANNOUNCE BEFORE THE CHUNK RESOLVES. An opener's `ready` asks whether this
24
+ // document is mounting a stage at a moment when the implementation import is
25
+ // still in flight, and this boundary is the only thing rendered by then —
26
+ // announcing from inside `StageHost` would answer "no stage" for exactly the
27
+ // window the wait exists to cover.
28
+ useAnnouncedObject3DDocumentStage(props.documentId, props.chromeless);
29
+ return (
30
+ <Suspense
31
+ fallback={
32
+ <ViewportSurfaceStatus testId="object3d-document-loading">
33
+ {OBJECT3D_SURFACE_BUILDING}
34
+ </ViewportSurfaceStatus>
35
+ }
36
+ >
37
+ <LazyObject3DDocumentViewport {...props} />
38
+ </Suspense>
39
+ );
40
+ }
41
+
42
+ /**
43
+ * The announcement, spelled here and again at `StageHost.tsx`'s own
44
+ * `Object3DDocumentViewport` — deliberately NOT a shared hook, because
45
+ * importing one across these two files is the static edge that would put this
46
+ * boundary inside the implementation's own pinned closure and defeat the
47
+ * laziness the boundary exists for.
48
+ *
49
+ * A CHROMELESS mount announces nothing, for the same reason it registers no
50
+ * session (`StageHost.tsx:2235`): it is a thumbnail of a document, several can
51
+ * be alive for one id at once, and an opener waiting on one would wait forever.
52
+ */
53
+ function useAnnouncedObject3DDocumentStage(documentId: string, chromeless = false): void {
54
+ useEffect(() => {
55
+ if (chromeless) return;
56
+ return announceObject3DDocumentStage(documentId);
57
+ }, [documentId, chromeless]);
58
+ }