@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,233 @@
1
+ /**
2
+ * `Inspector` — the connected inspector: it RESOLVES what is being inspected
3
+ * and hands it to a projection. It renders no content of its own.
4
+ *
5
+ * Two halves, and the split is the whole point:
6
+ * - the MODEL side is `inspection/use-active-inspection.ts` → ONE
7
+ * {@link InspectionDisplay} (`inspection/display.ts`): the composed
8
+ * subject, its surface, whether an inspector exists at all, and which
9
+ * projection shows it. the workspace host gates the dock panel
10
+ * and the floating card on the SAME hook, so "the dock floats a card while
11
+ * the inspector renders a column" is not a state the app can reach;
12
+ * - the VIEW side is `components/InspectionProjection.tsx`, which reads
13
+ * identity/verbs/sections off the subject and knows nothing else.
14
+ *
15
+ * `inspection/compose.ts` is the one assembler: the active
16
+ * {@link AuthoringAdapter}'s providers (`hierarchy` / `selection` /
17
+ * `transforms` / `inspector`) plus whatever `inspector-section-registry.ts`
18
+ * registrations match become ONE `InspectionSubject`. Which built-ins a
19
+ * contribution replaces (by CLAIMING their section ids) is resolved there and
20
+ * is never visible here.
21
+ */
22
+
23
+ import { faUpRightAndDownLeftFromCenter } from '@fortawesome/free-solid-svg-icons';
24
+ import { EditorIcon, IconButton, Panel, themeVars } from '@volter/editor-sdk/widgets';
25
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
26
+ import { useEffect, useReducer, useSyncExternalStore } from 'react';
27
+ import { assetSelectionVersion, subscribeAssetSelection } from '../asset-selection';
28
+ import { getActiveCamera } from '../authoring/active-systems';
29
+ import { resolvePanelAuthoring } from '../authoring/panel-authoring';
30
+ import { useAvailabilitySelector } from '../availability-tick';
31
+ import { useEditorStore } from '../editor-runtime';
32
+ import type { EditorShellStore } from '../editor-shell-store';
33
+ import { setActiveScope } from '../hotkeys';
34
+ import { composeInspectionForBinding } from '../inspection/active-subject';
35
+ import type { InspectionPresentation, InspectionSurfaceKind } from '../inspection/model';
36
+ import { useActiveInspection } from '../inspection/use-active-inspection';
37
+ import { setInspectorPresentationOverride } from '../inspector-presentation';
38
+ import {
39
+ inspectorSectionRegistryVersion,
40
+ subscribeInspectorSectionRegistry,
41
+ } from '../inspector-section-registry';
42
+ import { liveAuthoringRefusal } from '../live-session-registry';
43
+ import { projectMounts } from '../project-shape';
44
+ import type { WorkspaceDocumentSelection } from '../workspace-document-registry';
45
+ import { InspectionProjectionView } from './InspectionProjection';
46
+
47
+ export interface AuthoringInspectorSurfaceProps {
48
+ readonly store: EditorShellStore;
49
+ readonly adapter: AuthoringAdapter;
50
+ readonly documentSelection: WorkspaceDocumentSelection | null;
51
+ /** The RESOLVED presentation for this surface (`inspection/display.ts`):
52
+ * `'card'` tabs the sections behind icon buttons in the bottom-right card,
53
+ * `'column'` stacks them in the classic column, `'properties'` tabs them
54
+ * behind a vertical rail in that same column. Omitted (bounded
55
+ * design-system hosts) behaves as `'column'` without the mode-switch
56
+ * affordance — presentation is the live shell's concern. */
57
+ readonly presentation?: InspectionPresentation;
58
+ /** Which surface this is — the key the mode-switch affordances write their
59
+ * override under, so a preference expressed here changes no other
60
+ * surface. Omitted alongside `presentation`. */
61
+ readonly surface?: InspectionSurfaceKind;
62
+ }
63
+
64
+ /**
65
+ * The honest copy for an adapter with NO inspector surface at all — a
66
+ * `{ module }` root that publishes none, or an ingested native-React world
67
+ * (no-authoring by design, D-N8). It is deliberately not a projection of a
68
+ * subject — there is no subject, because the adapter cannot describe one.
69
+ */
70
+ function NoAuthoringInspector({
71
+ presentation,
72
+ surface,
73
+ }: {
74
+ readonly presentation: InspectionPresentation | undefined;
75
+ readonly surface?: InspectionSurfaceKind | undefined;
76
+ }) {
77
+ const authoringRefusal = liveAuthoringRefusal();
78
+ const noAuthoringNote = (
79
+ <div
80
+ data-testid="no-authoring-note"
81
+ style={{
82
+ padding: 12,
83
+ color: themeVars.semantic.warning,
84
+ fontSize: 'var(--vgai-font-md)',
85
+ lineHeight: 1.5,
86
+ }}
87
+ >
88
+ {authoringRefusal !== null ? (
89
+ <>
90
+ <strong>Nothing to author.</strong> {authoringRefusal}
91
+ </>
92
+ ) : (
93
+ <>
94
+ <strong>Nothing to author.</strong> This root's adapter publishes no inspector surface, so
95
+ there is nothing here to describe or edit. The root is still hosted, sized, and disposed;
96
+ play it in the Game tab.
97
+ </>
98
+ )}
99
+ </div>
100
+ );
101
+ // The one affordance back to the narrow column: this card has no subject and
102
+ // no icon strip, so without it a collapsed nothing-to-author card has no
103
+ // route back. Shown only in the live shell (a known `surface`).
104
+ const expandRow = surface ? (
105
+ <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '2px 4px' }}>
106
+ <IconButton
107
+ size="compact"
108
+ data-testid="inspector-expand"
109
+ aria-label="Expand inspector to side panel"
110
+ title="Expand inspector to side panel"
111
+ onClick={() => setInspectorPresentationOverride(surface, 'column')}
112
+ >
113
+ <EditorIcon icon={faUpRightAndDownLeftFromCenter} />
114
+ </IconButton>
115
+ </div>
116
+ ) : null;
117
+ if (presentation === 'card') {
118
+ return (
119
+ <div
120
+ className="vgai-mini-inspector"
121
+ data-testid="inspector-panel"
122
+ data-vgai-inspector-presentation="card"
123
+ onPointerDown={() => setActiveScope('inspector')}
124
+ >
125
+ {expandRow}
126
+ {noAuthoringNote}
127
+ </div>
128
+ );
129
+ }
130
+ return (
131
+ <Panel
132
+ name="Inspector (nothing to author)"
133
+ hideHeader
134
+ className="vgai-content-frost"
135
+ data-testid="inspector-panel"
136
+ onPointerDown={() => setActiveScope('inspector')}
137
+ >
138
+ {noAuthoringNote}
139
+ </Panel>
140
+ );
141
+ }
142
+
143
+ /**
144
+ * Production authoring Inspector with explicit application dependencies —
145
+ * the BOUNDED host entry point (design-system stories): it composes a subject
146
+ * from the adapter it is handed and projects it, so a host can exercise this
147
+ * exact surface through an adapter fixture instead of reproducing its fields
148
+ * in a visual facsimile. The live shell does NOT come through here; it goes
149
+ * through {@link Inspector}, which reads the one shared resolution.
150
+ *
151
+ * "Composes" is the SAME call either way — `composeInspectionForBinding`
152
+ * (`inspection/active-subject.ts`). The two paths differ only in where the
153
+ * binding comes from: handed in here, resolved from live state there.
154
+ */
155
+ export function AuthoringInspectorSurface({
156
+ store,
157
+ adapter,
158
+ documentSelection,
159
+ presentation,
160
+ surface,
161
+ }: AuthoringInspectorSurfaceProps) {
162
+ useSyncExternalStore(store.subscribe, store.getSnapshot);
163
+ // Project inspector TOOLS register asynchronously (folder scan) and
164
+ // re-register on HMR, possibly while a matching selection is showing; the
165
+ // §5.1 asset selection is another context registrations key on.
166
+ useSyncExternalStore(subscribeInspectorSectionRegistry, inspectorSectionRegistryVersion);
167
+ useSyncExternalStore(subscribeAssetSelection, assetSelectionVersion);
168
+ const [, forceAdapterUpdate] = useReducer((value: number) => value + 1, 0);
169
+ useEffect(() => adapter.subscribe?.(forceAdapterUpdate), [adapter]);
170
+ if (!adapter.capabilities.inspectorFields) {
171
+ return <NoAuthoringInspector presentation={presentation} {...(surface ? { surface } : {})} />;
172
+ }
173
+ const { subject } = composeInspectionForBinding({
174
+ store,
175
+ adapter,
176
+ documentSelection,
177
+ surface,
178
+ });
179
+ return (
180
+ <InspectionProjectionView
181
+ subject={subject}
182
+ presentation={presentation ?? 'column'}
183
+ {...(surface ? { surface } : {})}
184
+ />
185
+ );
186
+ }
187
+
188
+ /**
189
+ * The LIVE inspector. Whether it shows at all, which layout it uses, and what
190
+ * is in it are all the ONE resolution
191
+ * (`inspection/use-active-inspection.ts`) the workspace gates on — read here,
192
+ * never re-derived. Every surface goes through it, an open asset document
193
+ * included: that document is the three paradigm scoped to a subtree, so the
194
+ * same box rides over it as rides over the scene.
195
+ */
196
+ export function Inspector() {
197
+ const store = useEditorStore();
198
+ // A camera controller may register after Play's first React commit. Keep the
199
+ // contribution match live without making the inspection model own runtime
200
+ // system state; availability-tick is the existing late-capability seam used
201
+ // by the Profiler and Frame debugger for the same reason.
202
+ useAvailabilitySelector(() => getActiveCamera());
203
+ const display = useActiveInspection(store);
204
+ const { adapter } = resolvePanelAuthoring(store);
205
+ if (!display.available) return null;
206
+ if (!adapter.capabilities.inspectorFields) {
207
+ // A subject the shared resolver composed WITHOUT the adapter's fields —
208
+ // an ingest's coverage row, or the project's own asset selection (a
209
+ // model picked in Content, whose kind's asset inspector takes it from
210
+ // there) — renders through the ordinary projection. The nothing-to-author
211
+ // note is the floor for a MOUNTED root whose adapter describes nothing;
212
+ // a project that mounts nothing has no root to say that about, and with
213
+ // nothing selected the inspector shows nothing.
214
+ if (display.subject.identity !== null || display.subject.sections.length > 0) {
215
+ return (
216
+ <InspectionProjectionView
217
+ subject={display.subject}
218
+ presentation={display.presentation}
219
+ surface={display.surface}
220
+ />
221
+ );
222
+ }
223
+ if (!projectMounts()) return null;
224
+ return <NoAuthoringInspector presentation={display.presentation} surface={display.surface} />;
225
+ }
226
+ return (
227
+ <InspectionProjectionView
228
+ subject={display.subject}
229
+ presentation={display.presentation}
230
+ surface={display.surface}
231
+ />
232
+ );
233
+ }
@@ -0,0 +1,35 @@
1
+ /** The Inspector image captured from an existing native authoring viewport. */
2
+
3
+ import { useEffect, useState } from 'react';
4
+
5
+ export function InspectorCanvasPreview({
6
+ capture,
7
+ previewKey,
8
+ size,
9
+ }: {
10
+ readonly capture: (size: number) => Promise<string | null>;
11
+ readonly previewKey: string;
12
+ readonly size: number;
13
+ }) {
14
+ const [url, setUrl] = useState<string | null>(null);
15
+
16
+ useEffect(() => {
17
+ let cancelled = false;
18
+ setUrl(null);
19
+ void capture(size).then(
20
+ (next) => {
21
+ if (!cancelled) setUrl(next);
22
+ },
23
+ () => {
24
+ if (!cancelled) setUrl(null);
25
+ },
26
+ );
27
+ return () => {
28
+ cancelled = true;
29
+ };
30
+ }, [capture, previewKey, size]);
31
+
32
+ return url ? (
33
+ <img src={url} alt="Selected object preview" className="vgai-component-thumbnail" />
34
+ ) : null;
35
+ }
@@ -0,0 +1,290 @@
1
+ /**
2
+ * The ONE renderer for an inspection section whose body is `kind: 'fields'`
3
+ * (`inspection/model.ts`) — a `FieldDescriptor` list plus the io that reads
4
+ * and writes it. Extracted verbatim from `components/Inspector.tsx`'s former
5
+ * inline `renderProperty`, so the stacked column and the compact card render
6
+ * a field identically: one per-`type` switch, one revert arrow rule, one
7
+ * testid rule.
8
+ *
9
+ * Chrome (a collapsible title, a group's `data-testid`) belongs to the
10
+ * PROJECTION, not here — this component renders rows and nothing else.
11
+ */
12
+
13
+ import { faRotateLeft } from '@fortawesome/free-solid-svg-icons';
14
+ import {
15
+ AssetSlotPicker,
16
+ Checkbox,
17
+ DraftTextInput,
18
+ EditorIcon,
19
+ IconButton,
20
+ LABEL_COL_WIDTH,
21
+ Select,
22
+ TextArea,
23
+ themeVars,
24
+ Vec3Input,
25
+ } from '@volter/editor-sdk/widgets';
26
+ import { useState } from 'react';
27
+ import {
28
+ type FieldDescriptor,
29
+ fieldReadonlyReason,
30
+ type InspectionFieldIo,
31
+ isMixed,
32
+ } from '../inspection/model';
33
+ import { revertActionLabel } from './inspector-revert-label';
34
+ import { DraftColorInput } from './primitives/DraftColorInput';
35
+ import { useProjectImageAssets } from './use-project-image-assets';
36
+
37
+ /** Layout-only remnant of the old hand-rolled field style — chrome now comes
38
+ * from the shared `.vgai-input`/`.vgai-select` classes (theme.css), so
39
+ * every field here shares one height/padding/radius/focus treatment. */
40
+ const NUM_STYLE: React.CSSProperties = { width: 64 };
41
+
42
+ /** Row label (label-left/field-right grammar) — one width via
43
+ * `LABEL_COL_WIDTH` (I-13). */
44
+ export const ROW_LABEL_STYLE: React.CSSProperties = {
45
+ width: LABEL_COL_WIDTH,
46
+ fontSize: 'var(--vgai-font-md)',
47
+ color: themeVars.content.muted,
48
+ };
49
+
50
+ /** One rule, no exceptions: `visible` used to get a hand-carved
51
+ * `ingest-visible` testid for an e2e spec that no longer exists. */
52
+ function testidFor(path: string): string {
53
+ return `ingest-prop-${path.replace(/\./g, '-')}`;
54
+ }
55
+
56
+ /**
57
+ * The `asset` row's control — a project-asset slot (a material's texture map).
58
+ *
59
+ * Its own component because it holds two things a stateless row cannot: the
60
+ * shared project-image scan, and WHAT THE LAST ASSIGNMENT ANSWERED. The second
61
+ * is the point — a slot whose live half worked and whose file half did not is
62
+ * indistinguishable from a saved edit unless the ack is shown, so the write
63
+ * pipe's `persisted: false` is rendered here rather than dropped on the floor.
64
+ */
65
+ function AssetFieldControl({
66
+ field,
67
+ io,
68
+ value,
69
+ }: {
70
+ readonly field: FieldDescriptor;
71
+ readonly io: InspectionFieldIo;
72
+ readonly value: string;
73
+ }) {
74
+ const { paths, failures } = useProjectImageAssets(true);
75
+ // The ack is remembered WITH the value it answered for. A row is reused as
76
+ // the selection moves between subjects that both publish this path, so an
77
+ // ack held on its own would go on claiming "not saved" about an edit made to
78
+ // something else — the exact confusion the note exists to prevent.
79
+ const [ack, setAck] = useState<{ readonly forValue: string; readonly text: string } | null>(null);
80
+ const assign = (next: string): void => {
81
+ setAck(null);
82
+ // An empty selection CLEARS the slot; `null` is the value an adapter reads
83
+ // as "no asset", not the empty string, which would be a path of length 0.
84
+ void Promise.resolve(io.set(field.path, next === '' ? null : next)).then((answer) => {
85
+ setAck(
86
+ answer && !answer.persisted
87
+ ? {
88
+ forValue: next,
89
+ text: `Not saved — ${answer.destination}. See the editor console for the mechanism.`,
90
+ }
91
+ : null,
92
+ );
93
+ });
94
+ };
95
+ const ackNote = ack?.forValue === value ? ack.text : undefined;
96
+ const scanNote =
97
+ failures.length > 0
98
+ ? `${failures.length} folder(s) under public/ could not be read — this list may be incomplete.`
99
+ : undefined;
100
+ return (
101
+ <AssetSlotPicker
102
+ testId={testidFor(field.path)}
103
+ value={value}
104
+ options={paths}
105
+ previewUrlFor={(path) => `/${path}`}
106
+ disabled={field.readonly}
107
+ note={ackNote ?? scanNote}
108
+ onChange={assign}
109
+ />
110
+ );
111
+ }
112
+
113
+ export function InspectorField({
114
+ field,
115
+ io,
116
+ }: {
117
+ readonly field: FieldDescriptor;
118
+ readonly io: InspectionFieldIo;
119
+ }) {
120
+ const p = field;
121
+ const raw = io.get(p.path);
122
+ // MIXED means "these subjects disagree" — there is no single value to show,
123
+ // which is exactly the blank/placeholder rendering an unset field already
124
+ // has. Normalized once, here, so no field widget below carries a second
125
+ // notion of emptiness.
126
+ const v = isMixed(raw) ? undefined : raw;
127
+ // UNSET: the document does not carry this property AND nobody could tell us
128
+ // what governs it in absence (a library component's defaults live in its
129
+ // implementation, not its type). Render it as genuinely blank — a `0` in a
130
+ // number field or an unchecked box would be a claim about the value, and
131
+ // `gravityScale` actually defaults to 1, `canSleep` to true. The field is
132
+ // still editable: typing into it writes the property for the first time.
133
+ const unset = p.defaulted === true && v === undefined;
134
+ const readonlyReason = p.readonly ? fieldReadonlyReason(p) : undefined;
135
+ /** The revert arrow, rendered only on rows the adapter says can lose their
136
+ * override. Occupies no space otherwise, so rows stay aligned. */
137
+ const revertButton = p.resettable ? (
138
+ <IconButton
139
+ data-testid={`ingest-revert-${p.path.replace(/\./g, '-')}`}
140
+ aria-label={revertActionLabel(p)}
141
+ title={revertActionLabel(p)}
142
+ onClick={() => io.remove?.(p.path)}
143
+ >
144
+ <EditorIcon icon={faRotateLeft} />
145
+ </IconButton>
146
+ ) : null;
147
+
148
+ if (p.type === 'boolean') {
149
+ return (
150
+ <label
151
+ title={readonlyReason}
152
+ style={{
153
+ display: 'flex',
154
+ gap: 6,
155
+ alignItems: 'center',
156
+ padding: '6px 8px',
157
+ fontSize: 'var(--vgai-font-md)',
158
+ }}
159
+ >
160
+ <Checkbox
161
+ data-testid={testidFor(p.path)}
162
+ checked={Boolean(v)}
163
+ // Indeterminate says "not set here" without claiming false.
164
+ ref={(el: HTMLInputElement | null) => {
165
+ if (el) el.indeterminate = unset;
166
+ }}
167
+ disabled={p.readonly}
168
+ onChange={(e) => io.set(p.path, e.target.checked)}
169
+ />
170
+ <span style={p.defaulted ? { color: themeVars.content.dim } : undefined}>{p.label}</span>
171
+ {revertButton}
172
+ </label>
173
+ );
174
+ }
175
+ return (
176
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '6px 8px' }}>
177
+ {/* A defaulted row is greyed: the value is the owner's declared
178
+ default, not something this document says. Editing it writes the
179
+ property in for the first time. */}
180
+ <span
181
+ style={p.defaulted ? { ...ROW_LABEL_STYLE, color: themeVars.content.dim } : ROW_LABEL_STYLE}
182
+ title={readonlyReason ?? (p.defaulted ? `${p.label} — default (not set here)` : p.label)}
183
+ >
184
+ {p.label}
185
+ </span>
186
+ {p.type === 'color' ? (
187
+ <DraftColorInput
188
+ data-testid={p.path === 'material.color' ? 'ingest-color' : testidFor(p.path)}
189
+ value={(v as string) ?? '#ffffff'}
190
+ disabled={p.readonly}
191
+ onCommit={(next) => io.set(p.path, next)}
192
+ // Live while the picker is open (adapters that cannot show a value
193
+ // without writing it omit `preview`, and this is a no-op).
194
+ onPreview={(next) => io.preview?.(p.path, next)}
195
+ />
196
+ ) : p.type === 'number' ? (
197
+ <DraftTextInput
198
+ type="number"
199
+ data-testid={testidFor(p.path)}
200
+ disabled={p.readonly}
201
+ value={typeof v === 'number' ? String(Math.round(v * 1000) / 1000) : ''}
202
+ placeholder={unset ? '—' : undefined}
203
+ onCommit={(text) => {
204
+ const parsed = Number.parseFloat(text);
205
+ if (Number.isFinite(parsed)) io.set(p.path, parsed);
206
+ }}
207
+ style={NUM_STYLE}
208
+ />
209
+ ) : p.type === 'enum' ? (
210
+ <Select
211
+ data-testid={testidFor(p.path)}
212
+ disabled={p.readonly}
213
+ value={String(v ?? '')}
214
+ onChange={(e) => {
215
+ const value =
216
+ p.options?.find((option) => String(option) === e.target.value) ?? e.target.value;
217
+ io.set(p.path, value);
218
+ }}
219
+ style={{ width: 120 }}
220
+ >
221
+ {unset && <option value="">—</option>}
222
+ {(p.options ?? []).map((option) => (
223
+ <option key={String(option)} value={String(option)}>
224
+ {String(option)}
225
+ </option>
226
+ ))}
227
+ </Select>
228
+ ) : p.type === 'vec3' ? (
229
+ <div style={{ width: 190 }}>
230
+ <Vec3Input
231
+ value={
232
+ Array.isArray(v) && v.length === 3
233
+ ? [Number(v[0]), Number(v[1]), Number(v[2])]
234
+ : [null, null, null]
235
+ }
236
+ disabled={Boolean(p.readonly)}
237
+ testIdPrefix={testidFor(p.path)}
238
+ onChange={(value) => io.set(p.path, value)}
239
+ />
240
+ </div>
241
+ ) : p.type === 'asset' ? (
242
+ <AssetFieldControl field={p} io={io} value={typeof v === 'string' ? v : ''} />
243
+ ) : p.type === 'json' ? (
244
+ <TextArea
245
+ key={`${p.path}:${JSON.stringify(v ?? null)}`}
246
+ data-testid={testidFor(p.path)}
247
+ data-variant="code"
248
+ disabled={p.readonly}
249
+ defaultValue={unset ? '' : JSON.stringify(v ?? null)}
250
+ placeholder={unset ? '—' : undefined}
251
+ onBlur={(event) => {
252
+ try {
253
+ io.set(p.path, JSON.parse(event.target.value));
254
+ } catch {
255
+ // Keep the authored value unchanged until the edit is valid JSON.
256
+ }
257
+ }}
258
+ style={{ width: 160 }}
259
+ />
260
+ ) : (
261
+ <DraftTextInput
262
+ type="text"
263
+ data-testid={testidFor(p.path)}
264
+ readOnly={p.readonly}
265
+ value={String(v ?? '')}
266
+ placeholder={unset ? '—' : undefined}
267
+ onCommit={(text) => io.set(p.path, text)}
268
+ style={{ width: 120 }}
269
+ />
270
+ )}
271
+ {revertButton}
272
+ </div>
273
+ );
274
+ }
275
+
276
+ export function InspectorFieldsSection({
277
+ fields,
278
+ io,
279
+ }: {
280
+ readonly fields: readonly FieldDescriptor[];
281
+ readonly io: InspectionFieldIo;
282
+ }) {
283
+ return (
284
+ <>
285
+ {fields.map((field) => (
286
+ <InspectorField key={field.path} field={field} io={io} />
287
+ ))}
288
+ </>
289
+ );
290
+ }
@@ -0,0 +1,57 @@
1
+ import type * as THREE from 'three';
2
+ import { Object3DSnapshotDocument } from './asset-viewers/EntityModelDocument';
3
+
4
+ /**
5
+ * Inspector-sized projection of the canonical Asset Lab viewport, over a live
6
+ * `Object3D` the caller already has in hand.
7
+ *
8
+ * It takes the OBJECT, not an id to look one up by: a subject's preview is
9
+ * composed only when the thing is genuinely previewable
10
+ * (`inspection/compose.ts`), and the object the composer proved exists is the
11
+ * one rendered here. A scene node and a part inside an asset document are
12
+ * therefore the same case — the part is not in the shell's object map, and
13
+ * with an id this component could only have shown a "no longer available"
14
+ * alert for a thing that is right there on screen.
15
+ *
16
+ * Every host passes `fill`: the section body's square box, the compact card's
17
+ * round disc, and the minimized card's round thumb all own their own geometry
18
+ * and this component just fills it.
19
+ */
20
+ export function InspectorObjectPreview({
21
+ previewKey,
22
+ object,
23
+ displayName,
24
+ fill = false,
25
+ }: {
26
+ /** Stable identity for the isolated preview document. */
27
+ previewKey: string;
28
+ object: THREE.Object3D;
29
+ displayName: string;
30
+ fill?: boolean;
31
+ }) {
32
+ return (
33
+ <div
34
+ data-testid="inspector-object-preview"
35
+ style={
36
+ fill
37
+ ? { position: 'absolute', inset: 0, overflow: 'hidden' }
38
+ : {
39
+ width: '100%',
40
+ height: 220,
41
+ minHeight: 220,
42
+ borderBottom: '1px solid var(--vgai-structural-divider)',
43
+ overflow: 'hidden',
44
+ position: 'relative',
45
+ }
46
+ }
47
+ >
48
+ <Object3DSnapshotDocument
49
+ documentId={`inspector-preview:${previewKey}`}
50
+ source={object}
51
+ displayName={displayName}
52
+ active
53
+ chromeless
54
+ />
55
+ </div>
56
+ );
57
+ }