@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,145 @@
1
+ import { faBorderAll, faLightbulb } from '@fortawesome/free-solid-svg-icons';
2
+ import { EditorIcon, FloatingToolbar, IconButton, Tooltip } from '@volter/editor-sdk/widgets';
3
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
4
+ import { memo, useEffect, useMemo, useReducer, useSyncExternalStore } from 'react';
5
+ import { activeAuthoringVersion, subscribeActiveAuthoring } from '../authoring/active-adapter';
6
+ import {
7
+ object3DDocumentSession,
8
+ object3DDocumentSessionsVersion,
9
+ subscribeObject3DDocumentSessions,
10
+ } from '../authoring/object3d-document-session-registry';
11
+ import { resolvePanelAuthoring } from '../authoring/panel-authoring';
12
+ import type { EditorShellStore } from '../editor-shell-store';
13
+ import { activeLightCount } from '../light-explorer-model';
14
+ import { CORE_WORKSPACE_UTILITIES } from '../workspace-core-utilities';
15
+ import {
16
+ subscribeWorkspaceDocuments,
17
+ workspaceDocumentRegistryVersion,
18
+ } from '../workspace-document-registry';
19
+ import { showWorkspaceUtility } from '../workspace-host-commands';
20
+ import { ViewportOverlaysMenu } from './ViewportOverlaysMenu';
21
+ import { ViewportShadingMenu } from './ViewportShadingMenu';
22
+ import { ViewportViewMenu } from './ViewportViewMenu';
23
+
24
+ /**
25
+ * Three-specific viewport display controls, mounted over ONE STAGE and driving
26
+ * THAT stage (ARCHITECTURE-CORE §One stage unit 4): `store` is the stage's own
27
+ * store, so a prefab's grid button toggles the prefab's grid rather than the
28
+ * world's. Performance moved to the global header telemetry so Scene and Play
29
+ * expose one source-following instrument.
30
+ *
31
+ * GRID routes through the stage's `Object3DDocumentSession` when it has one.
32
+ * That is not a second source of truth: the session writes the SAME
33
+ * `viewport.grid.visible` the store's toggle reaches through
34
+ * `EditorViewport.syncFromStore`, and it is what the document's own header
35
+ * button and `vgai status`'s `showGrid` already read
36
+ * (`command-listener.ts`'s `documentPresentation?.grid ?? store.showGrid`).
37
+ * Two writers of one flag is how a toggle comes back on by itself.
38
+ */
39
+ export function ViewportOverlay({
40
+ store,
41
+ documentId,
42
+ }: {
43
+ readonly store: EditorShellStore;
44
+ readonly documentId: string;
45
+ }) {
46
+ useSyncExternalStore(store.subscribe, store.getSnapshot);
47
+ useSyncExternalStore(subscribeWorkspaceDocuments, workspaceDocumentRegistryVersion);
48
+ useSyncExternalStore(subscribeActiveAuthoring, activeAuthoringVersion);
49
+ useSyncExternalStore(subscribeObject3DDocumentSessions, object3DDocumentSessionsVersion);
50
+ const { adapter } = resolvePanelAuthoring(store);
51
+ const session = object3DDocumentSession(documentId);
52
+ useSyncExternalStore(session?.subscribe ?? NO_SESSION_SUBSCRIBE, session?.getSnapshot ?? ZERO);
53
+ const grid = session ? session.presentation().grid : store.showGrid;
54
+ return (
55
+ <FloatingToolbar
56
+ label="Viewport display"
57
+ className="vgai-viewport-toolbar vgai-viewport-toolbar-right"
58
+ >
59
+ <Tooltip text={`Grid: ${grid ? 'On' : 'Off'}`}>
60
+ <IconButton
61
+ aria-label="Toggle grid"
62
+ aria-pressed={grid}
63
+ size="comfortable"
64
+ onClick={() => (session ? session.setGrid(!grid) : store.toggleGrid())}
65
+ >
66
+ <EditorIcon icon={faBorderAll} size="md" />
67
+ </IconButton>
68
+ </Tooltip>
69
+ <HelpersButton store={store} />
70
+ <ViewportShadingMenu
71
+ mode={store.shadingMode}
72
+ onChange={(mode) => store.setShadingMode(mode)}
73
+ />
74
+ <ViewportViewMenu store={store} />
75
+ <LightExplorerButton adapter={adapter} store={store} />
76
+ </FloatingToolbar>
77
+ );
78
+ }
79
+
80
+ const NO_SESSION_SUBSCRIBE = () => () => {};
81
+ const ZERO = () => 0;
82
+
83
+ /** Keep the hierarchy walk off ordinary viewport-store renders. The adapter
84
+ * notifies when its projected tree changes; a stable adapter prop lets React
85
+ * skip this child for unrelated grid/shading/selection updates. */
86
+ const LightExplorerButton = memo(function LightExplorerButton({
87
+ adapter,
88
+ store,
89
+ }: {
90
+ readonly adapter: AuthoringAdapter;
91
+ readonly store: EditorShellStore;
92
+ }) {
93
+ const [, refresh] = useReducer((value: number) => value + 1, 0);
94
+ useEffect(() => adapter.subscribe?.(refresh), [adapter]);
95
+ // `adapter.subscribe` is `store.subscribe` on every shipping adapter, so the
96
+ // `memo` above cannot stop this button re-rendering on a bare selection
97
+ // click — and `activeLightCount` walks the WHOLE tree. Key the walk on
98
+ // `contentVersion`, which a selection-only notify leaves alone.
99
+ const lightCount = useMemo(() => activeLightCount(adapter), [adapter, store.contentVersion]);
100
+ if (lightCount === 0) return null;
101
+ return (
102
+ <Tooltip text={`Open Light Explorer · ${lightCount} ${lightCount === 1 ? 'light' : 'lights'}`}>
103
+ <IconButton
104
+ aria-label="Open Light Explorer"
105
+ size="comfortable"
106
+ onClick={() => showWorkspaceUtility(CORE_WORKSPACE_UTILITIES.lightExplorer.id)}
107
+ >
108
+ <EditorIcon icon={faLightbulb} size="md" />
109
+ </IconButton>
110
+ </Tooltip>
111
+ );
112
+ });
113
+
114
+ function HelpersButton({ store }: { store: EditorShellStore }) {
115
+ const helperTypes = [
116
+ { key: 'bounds' as const, label: 'Bounds' },
117
+ { key: 'lights' as const, label: 'Lights' },
118
+ { key: 'cameras' as const, label: 'Cameras' },
119
+ { key: 'colliders' as const, label: 'Colliders' },
120
+ { key: 'joints' as const, label: 'Joints' },
121
+ { key: 'particles' as const, label: 'Particle Emitters' },
122
+ { key: 'lod' as const, label: 'LOD' },
123
+ { key: 'audio' as const, label: 'Audio' },
124
+ { key: 'splines' as const, label: 'Splines' },
125
+ { key: 'navmesh' as const, label: 'NavMesh' },
126
+ { key: 'constraints' as const, label: 'Constraints' },
127
+ { key: 'reflectionProbes' as const, label: 'Reflection Probes' },
128
+ { key: 'triggerVolumes' as const, label: 'Trigger Volumes' },
129
+ { key: 'skeletons' as const, label: 'Skeletons' },
130
+ { key: 'weights' as const, label: 'Weights' },
131
+ ];
132
+
133
+ return (
134
+ <ViewportOverlaysMenu
135
+ label="Helpers"
136
+ master={{ enabled: store.showHelpers, onToggle: () => store.toggleHelpers() }}
137
+ choices={helperTypes.map((helper) => ({
138
+ id: helper.key,
139
+ label: helper.label,
140
+ enabled: store.helperVisibility[helper.key],
141
+ onToggle: () => store.toggleHelperType(helper.key),
142
+ }))}
143
+ />
144
+ );
145
+ }
@@ -0,0 +1,153 @@
1
+ import { faCaretDown, faCheck, faEye, faEyeSlash } from '@fortawesome/free-solid-svg-icons';
2
+ import {
3
+ EditorIcon,
4
+ IconButton,
5
+ Menu,
6
+ MenuItem,
7
+ MenuSeparator,
8
+ SplitButtonGroup,
9
+ Tooltip,
10
+ } from '@volter/editor-sdk/widgets';
11
+ import { type ReactNode, useEffect, useRef, useState } from 'react';
12
+
13
+ export interface ViewportOverlayChoice {
14
+ readonly id: string;
15
+ readonly label: string;
16
+ readonly enabled: boolean;
17
+ readonly disabled?: boolean;
18
+ readonly onToggle: () => void;
19
+ }
20
+
21
+ /**
22
+ * BLENDER'S OVERLAY MARK, transcribed from `modeling-edit-none.png` at its
23
+ * native 2x (the 3D View header's Show Overlays toggle, ink x 2424..2455,
24
+ * y 64..91): a filled disc up and to the right, a stroked ring down and to
25
+ * the left, and a GAP between them where the ring passes in front — the gap
26
+ * is what keeps the ring readable against the disc, and without it the two
27
+ * merge into one blob at 14 px. The disc-minus-gap is traced as one boundary
28
+ * (the disc's far arc, then the gap circle's arc back) rather than knocked
29
+ * out, because a knockout drawn over a single fill leaks wherever it reaches
30
+ * past that fill's edge.
31
+ *
32
+ * Drawn here rather than through `EditorIcon`: the icon-set seam is keyed by
33
+ * Font Awesome name, and no name in the set carries two overlapping circles —
34
+ * hanging this mark on `clone` or `layer-group` would move those marks too.
35
+ */
36
+ export function ViewportOverlaysGlyph() {
37
+ return (
38
+ <svg
39
+ viewBox="0 0 16 16"
40
+ className="vgai-viewport-overlays-glyph"
41
+ aria-hidden="true"
42
+ focusable="false"
43
+ >
44
+ <path
45
+ d="M5.24 4.51 A5.3 5.3 0 1 1 11.89 11.16 A5.85 5.85 0 0 0 5.24 4.51 Z"
46
+ fill="currentColor"
47
+ />
48
+ <circle cx="6.1" cy="10.3" r="4.4" fill="none" stroke="currentColor" strokeWidth="1.1" />
49
+ </svg>
50
+ );
51
+ }
52
+
53
+ export function ViewportOverlaysMenu({
54
+ label = 'Overlays',
55
+ choices,
56
+ master,
57
+ glyph,
58
+ }: {
59
+ readonly label?: string;
60
+ readonly choices: readonly ViewportOverlayChoice[];
61
+ readonly master?: { readonly enabled: boolean; readonly onToggle: () => void };
62
+ /** Replaces the eye — a caller whose overlays have Blender's own mark. */
63
+ readonly glyph?: ReactNode;
64
+ }) {
65
+ const [open, setOpen] = useState(false);
66
+ const ref = useRef<HTMLDivElement>(null);
67
+ const anyEnabled = choices.some((choice) => choice.enabled);
68
+ const active = master?.enabled ?? anyEnabled;
69
+ const mark = glyph ?? <EditorIcon icon={active ? faEye : faEyeSlash} size="md" />;
70
+
71
+ useEffect(() => {
72
+ if (!open) return;
73
+ const handler = (event: MouseEvent) => {
74
+ if (ref.current && !ref.current.contains(event.target as Node)) setOpen(false);
75
+ };
76
+ document.addEventListener('mousedown', handler);
77
+ return () => document.removeEventListener('mousedown', handler);
78
+ }, [open]);
79
+
80
+ const menu = open ? (
81
+ <Menu className="vgai-helpers-menu" onDismiss={() => setOpen(false)}>
82
+ {master ? (
83
+ <>
84
+ <MenuItem
85
+ role="menuitemcheckbox"
86
+ aria-checked={master.enabled}
87
+ onSelect={master.onToggle}
88
+ >
89
+ <span className="vgai-menu-check">
90
+ {master.enabled && <EditorIcon icon={faCheck} size="xs" />}
91
+ </span>
92
+ Show {label}
93
+ </MenuItem>
94
+ <MenuSeparator />
95
+ </>
96
+ ) : null}
97
+ {choices.map((choice) => (
98
+ <MenuItem
99
+ key={choice.id}
100
+ role="menuitemcheckbox"
101
+ aria-checked={choice.enabled}
102
+ disabled={choice.disabled}
103
+ onSelect={choice.onToggle}
104
+ >
105
+ <span className="vgai-menu-check">
106
+ {choice.enabled && <EditorIcon icon={faCheck} size="xs" />}
107
+ </span>
108
+ {choice.label}
109
+ </MenuItem>
110
+ ))}
111
+ </Menu>
112
+ ) : null;
113
+
114
+ return (
115
+ <div ref={ref} className="vgai-viewport-popover-anchor">
116
+ {master ? (
117
+ <SplitButtonGroup>
118
+ <Tooltip text={`${label}: ${active ? 'On' : 'Off'}`}>
119
+ <IconButton
120
+ aria-label={`Toggle ${label.toLowerCase()}`}
121
+ aria-pressed={active}
122
+ size="comfortable"
123
+ onClick={master.onToggle}
124
+ >
125
+ {mark}
126
+ </IconButton>
127
+ </Tooltip>
128
+ <IconButton
129
+ aria-label={`Choose ${label.toLowerCase()}`}
130
+ aria-expanded={open}
131
+ size="comfortable"
132
+ onClick={() => setOpen(!open)}
133
+ >
134
+ <EditorIcon icon={faCaretDown} size="xs" />
135
+ </IconButton>
136
+ </SplitButtonGroup>
137
+ ) : (
138
+ <Tooltip text={`${label}: ${active ? 'On' : 'Off'}`}>
139
+ <IconButton
140
+ aria-label={`Choose ${label.toLowerCase()}`}
141
+ aria-expanded={open}
142
+ aria-pressed={active}
143
+ size="comfortable"
144
+ onClick={() => setOpen(!open)}
145
+ >
146
+ {mark}
147
+ </IconButton>
148
+ </Tooltip>
149
+ )}
150
+ {menu}
151
+ </div>
152
+ );
153
+ }
@@ -0,0 +1,300 @@
1
+ import { faCaretDown, faCheck } from '@fortawesome/free-solid-svg-icons';
2
+ import {
3
+ AnchoredMenu,
4
+ Button,
5
+ EditorIcon,
6
+ IconButton,
7
+ MenuItem,
8
+ MenuSeparator,
9
+ Tooltip,
10
+ themeVars,
11
+ } from '@volter/editor-sdk/widgets';
12
+ import type { ViewportShadingMode } from '@volter/editor-threejs/render/viewport-shading';
13
+ import { type ReactNode, useRef, useState } from 'react';
14
+
15
+ export const viewportShadingModes: ReadonlyArray<{
16
+ mode: ViewportShadingMode;
17
+ label: string;
18
+ description: string;
19
+ }> = [
20
+ { mode: 'solid', label: 'Material', description: 'Authored materials and lighting' },
21
+ { mode: 'clay', label: 'Solid', description: 'Neutral flat-shaded geometry' },
22
+ { mode: 'unlit', label: 'Unlit', description: 'Base color without scene lighting' },
23
+ { mode: 'wireframe', label: 'Wireframe', description: 'Renderable triangle edges' },
24
+ { mode: 'matcap', label: 'Matcap', description: 'Neutral clay sphere — form without color' },
25
+ { mode: 'normals', label: 'Normals', description: 'Surface-normal direction colors' },
26
+ { mode: 'overdraw', label: 'Overdraw', description: 'Additive overlap visualization' },
27
+ ];
28
+
29
+ export interface ViewportDisplayModeChoice<T extends string> {
30
+ readonly mode: T;
31
+ readonly label: string;
32
+ readonly description: string;
33
+ }
34
+
35
+ /**
36
+ * A SHADING SEGMENT — one cell of Blender's four-button shading group, which
37
+ * is what its 3D View header spends on shading instead of a word dropdown.
38
+ * `glyph` names the MARK, never the mode: the same sphere means "solid" in
39
+ * any vocabulary, and a caller's mode ids are its own.
40
+ */
41
+ export interface ViewportShadingSegment<T extends string> {
42
+ readonly mode: T;
43
+ readonly glyph: 'wireframe' | 'sphere' | 'preview';
44
+ readonly label: string;
45
+ }
46
+
47
+ /**
48
+ * THREE OF BLENDER'S FOUR, and the missing one is missing on purpose.
49
+ * Blender's group is Wireframe / Solid / Material Preview / Rendered; this
50
+ * viewport implements the first three (`viewportShadingModes` above:
51
+ * `wireframe`, `clay` — its own label is "Solid" — and `solid`, labelled
52
+ * "Material"). There is no path-traced or offline-rendered mode behind a
53
+ * fourth cell, so no fourth cell is drawn: a segment whose mode does not
54
+ * exist is a shim that promises a render this viewport cannot produce.
55
+ * Every other mode this viewport HAS (Unlit, Matcap, Normals, Overdraw, and
56
+ * the document's UV / Vertex-colors when the asset carries them) stays in the
57
+ * popover behind the chevron, which is also where Blender keeps the rest of
58
+ * its shading controls.
59
+ */
60
+ export const viewportShadingSegments: ReadonlyArray<ViewportShadingSegment<ViewportShadingMode>> = [
61
+ { mode: 'wireframe', glyph: 'wireframe', label: 'Wireframe' },
62
+ { mode: 'clay', glyph: 'sphere', label: 'Solid' },
63
+ { mode: 'solid', glyph: 'preview', label: 'Material' },
64
+ ];
65
+
66
+ /**
67
+ * The three marks, transcribed from `modeling-edit-none.png` at its native 2x
68
+ * — the 3D View header's shading group, cells at x 2628 / 2666 / 2704, y
69
+ * 60..95, each a 36x36 device cell carrying 28..32 device px of ink. On the
70
+ * 16-unit box here (the icon set's own grid, so these sit at the same optical
71
+ * size as every `EditorIcon` beside them):
72
+ *
73
+ * - WIREFRAME is a wire globe: a ring, two latitude chords and ONE meridian,
74
+ * and the frame settles the spacing — measured off the circle's own centre
75
+ * (device rows 64..91, so centre row 77.5, radius 14) the chords sit at
76
+ * ±5 device px and the meridian 5 device px LEFT of centre, i.e. all three
77
+ * at 0.357 of the radius. The off-centre meridian is what makes it read as
78
+ * a globe seen from three-quarters rather than a crosshair.
79
+ * - SPHERE is a plain filled disc. Blender's carries a near-white body
80
+ * inside a lighter rim; at 14 CSS px the rim is below this instrument's
81
+ * floor and a flat disc is the honest reduction.
82
+ * - PREVIEW is the ring with its upper-left lobe filled: the fill's right
83
+ * edge is a near-vertical chord just left of centre (device offset 13 of
84
+ * 28, held from row 68 down) and its lower edge a cut from the ring at
85
+ * row 78.5 down-right to row 82 — measured, because the first cut put
86
+ * that edge two device rows high and the mark read as a pie chart rather
87
+ * than a lit sphere. Blender hatches the remaining lower-right quadrant;
88
+ * three hatch strokes cannot survive 14 px and are deliberately not
89
+ * drawn, so this mark is Blender's silhouette without its texture.
90
+ *
91
+ * These are drawn HERE rather than fetched through `EditorIcon` because the
92
+ * icon-set seam is keyed by Font Awesome NAME, and the three names that would
93
+ * carry these marks are already spent on other jobs (`globe` is the
94
+ * transform-space toggle, `circle` is the Outliner's generic object, and
95
+ * `circle-half-stroke` is the LUT document's before/after). Re-drawing a
96
+ * shared name would move those marks too. The precedent is the sibling
97
+ * segmented group in this same header — `@volter/editor-blender`'s select-mode cells draw
98
+ * their own glyphs inline for the same reason.
99
+ */
100
+ function ViewportShadingGlyph({
101
+ glyph,
102
+ }: {
103
+ readonly glyph: ViewportShadingSegment<string>['glyph'];
104
+ }) {
105
+ return (
106
+ <svg
107
+ viewBox="0 0 16 16"
108
+ className="vgai-viewport-shading-glyph"
109
+ aria-hidden="true"
110
+ focusable="false"
111
+ >
112
+ {glyph === 'sphere' ? (
113
+ <circle cx="8" cy="8" r="7.3" fill="currentColor" />
114
+ ) : (
115
+ <circle cx="8" cy="8" r="7.3" fill="none" stroke="currentColor" strokeWidth="1.05" />
116
+ )}
117
+ {glyph === 'wireframe' ? (
118
+ <g stroke="currentColor" strokeWidth="1.05">
119
+ <line x1="1.7" y1="5.4" x2="14.3" y2="5.4" />
120
+ <line x1="1.7" y1="10.6" x2="14.3" y2="10.6" />
121
+ <line x1="5.4" y1="1.7" x2="5.4" y2="14.3" />
122
+ </g>
123
+ ) : null}
124
+ {glyph === 'preview' ? (
125
+ <path
126
+ d="M7.73 1.23 L7.73 10.43 L1.22 8.04 A6.78 6.78 0 0 1 7.73 1.23 Z"
127
+ fill="currentColor"
128
+ />
129
+ ) : null}
130
+ </svg>
131
+ );
132
+ }
133
+
134
+ export function ViewportDisplayModeMenu<T extends string>({
135
+ mode,
136
+ onChange,
137
+ choices,
138
+ disabled = false,
139
+ segments,
140
+ children,
141
+ }: {
142
+ mode: T;
143
+ onChange: (mode: T) => void;
144
+ choices: ReadonlyArray<ViewportDisplayModeChoice<T>>;
145
+ disabled?: boolean;
146
+ /** Draw Blender's segmented group instead of a labelled trigger. */
147
+ segments?: ReadonlyArray<ViewportShadingSegment<T>>;
148
+ /** Extra rows for the popover — Blender keeps its lighting controls here. */
149
+ children?: ReactNode;
150
+ }) {
151
+ const [open, setOpen] = useState(false);
152
+ const ref = useRef<HTMLButtonElement>(null);
153
+ const active = choices.find((entry) => entry.mode === mode) ?? choices[0];
154
+ if (!active) return null;
155
+
156
+ const menu =
157
+ open && !disabled ? (
158
+ <AnchoredMenu
159
+ id="vgai-viewport-shading-menu"
160
+ anchorRef={ref}
161
+ aria-label="Viewport shading modes"
162
+ onDismiss={() => setOpen(false)}
163
+ style={{
164
+ minWidth: 230,
165
+ }}
166
+ >
167
+ {choices.map((entry) => (
168
+ <MenuItem
169
+ key={entry.mode}
170
+ role="menuitemradio"
171
+ aria-checked={entry.mode === mode}
172
+ onSelect={() => {
173
+ onChange(entry.mode);
174
+ setOpen(false);
175
+ }}
176
+ style={{ display: 'grid', gridTemplateColumns: '14px 1fr', gap: 7 }}
177
+ >
178
+ <span style={{ opacity: entry.mode === mode ? 1 : 0 }}>
179
+ <EditorIcon icon={faCheck} size="xs" />
180
+ </span>
181
+ <span>
182
+ <span style={{ display: 'block' }}>{entry.label}</span>
183
+ <span
184
+ style={{
185
+ display: 'block',
186
+ color: themeVars.content.dim,
187
+ fontSize: 10,
188
+ }}
189
+ >
190
+ {entry.description}
191
+ </span>
192
+ </span>
193
+ </MenuItem>
194
+ ))}
195
+ {children ? (
196
+ <>
197
+ <MenuSeparator />
198
+ <div className="vgai-viewport-shading-options">{children}</div>
199
+ </>
200
+ ) : null}
201
+ </AnchoredMenu>
202
+ ) : null;
203
+
204
+ if (segments) {
205
+ // BLENDER'S SHADING CONTROL: the modes it HAS as joined cells, then the
206
+ // chevron whose popover holds everything else. The cells join the way the
207
+ // sibling select-mode group in this same header joins — square inner
208
+ // corners and a shared border — so the five read as one widget with one
209
+ // cell lit, and `aria-pressed` is the only thing that paints the lit one.
210
+ return (
211
+ <div className="vgai-viewport-popover-anchor">
212
+ <span className="vgai-viewport-shading-segments" role="group" aria-label="Viewport shading">
213
+ {segments.map((segment) => (
214
+ <Tooltip key={segment.mode} text={`Viewport shading: ${segment.label}`}>
215
+ <IconButton
216
+ size="compact"
217
+ shape="segment"
218
+ variant="secondary"
219
+ aria-pressed={segment.mode === mode}
220
+ aria-label={`Viewport shading: ${segment.label}`}
221
+ disabled={disabled}
222
+ onClick={() => onChange(segment.mode)}
223
+ >
224
+ <ViewportShadingGlyph glyph={segment.glyph} />
225
+ </IconButton>
226
+ </Tooltip>
227
+ ))}
228
+ <Tooltip text="Shading options">
229
+ <IconButton
230
+ ref={ref}
231
+ size="compact"
232
+ shape="segment"
233
+ variant="secondary"
234
+ aria-label="Shading options"
235
+ aria-haspopup="menu"
236
+ aria-expanded={open}
237
+ aria-controls={open ? 'vgai-viewport-shading-menu' : undefined}
238
+ disabled={disabled}
239
+ onClick={() => setOpen((value) => !value)}
240
+ >
241
+ <EditorIcon icon={faCaretDown} size="xs" />
242
+ </IconButton>
243
+ </Tooltip>
244
+ </span>
245
+ {menu}
246
+ </div>
247
+ );
248
+ }
249
+
250
+ return (
251
+ <div style={{ position: 'relative' }}>
252
+ <Tooltip text={`Viewport shading: ${active.label}`}>
253
+ {/* A control's CHROME never encodes its VALUE. The variant used to be
254
+ `mode === 'solid' ? 'ghost' : 'secondary'`, so the trigger's well
255
+ appeared and disappeared as you used it — and at rest (`solid`,
256
+ labelled "Material") it was a transparent slab where Blender paints
257
+ a bordered well: measured in `modeling-object-none.png`, `Object
258
+ Mode v` is #272727 inside a 1px #3c3c3c border, 20px tall, on a
259
+ #343434 header. `secondary` is this estate's select-like trigger
260
+ already (FontPicker's `.vgai-field-trigger`), so no new variant. */}
261
+ <Button
262
+ ref={ref}
263
+ type="button"
264
+ size="compact"
265
+ variant="secondary"
266
+ aria-label={`Viewport shading: ${active.label}`}
267
+ aria-haspopup="menu"
268
+ aria-expanded={open}
269
+ aria-controls={open ? 'vgai-viewport-shading-menu' : undefined}
270
+ disabled={disabled}
271
+ onClick={() => setOpen((value) => !value)}
272
+ style={{ display: 'inline-flex', alignItems: 'center', gap: 5, minWidth: 66 }}
273
+ >
274
+ <span>{active.label}</span>
275
+ <EditorIcon icon={faCaretDown} size="xs" />
276
+ </Button>
277
+ </Tooltip>
278
+ {menu}
279
+ </div>
280
+ );
281
+ }
282
+
283
+ export function ViewportShadingMenu({
284
+ mode,
285
+ onChange,
286
+ disabled = false,
287
+ }: {
288
+ mode: ViewportShadingMode;
289
+ onChange: (mode: ViewportShadingMode) => void;
290
+ disabled?: boolean;
291
+ }) {
292
+ return (
293
+ <ViewportDisplayModeMenu
294
+ mode={mode}
295
+ onChange={onChange}
296
+ choices={viewportShadingModes}
297
+ disabled={disabled}
298
+ />
299
+ );
300
+ }