@volter/sdk 0.0.0-stage → 0.5.204

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 (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1168 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +329 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +669 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,545 @@
1
+ /**
2
+ * §5.1 asset-selection inspection (W2 — inventory row R6's "single-click
3
+ * selects → Inspector preview/metadata" half).
4
+ *
5
+ * A single click in the Assets browser (`asset-selection.ts`) is a click like
6
+ * any other, so it names a SUBJECT: {@link describeAssetSelectionSubject} is
7
+ * the producer `inspection/active-subject.ts` consults, and what it returns
8
+ * goes through the ONE composer into the same box a scene node gets. An open
9
+ * document still wins — browser selection is navigator state and must not
10
+ * displace a document's own subject — which is the whole of the producer's
11
+ * `null` case. The full viewer lives in a center document
12
+ * (`asset-documents.tsx`, double-click/Enter).
13
+ *
14
+ * Per the §5.1 table, compact metadata only: image dimensions/format/size,
15
+ * model thumbnail + size (the summary reuses the existing
16
+ * `model-thumbnail.ts` renderer), audio duration/format, input-map binding
17
+ * summary (reusing `InputMapViewer`'s exported validation), and plain
18
+ * name/path/size for the rest.
19
+ */
20
+
21
+ import { faCircleInfo, faImage } from '@fortawesome/free-solid-svg-icons';
22
+ import { Button, bg, border, text } from '@volter/sdk/widgets';
23
+ import { useEffect, useState, useSyncExternalStore } from 'react';
24
+ import { assetInspectorActionsFor } from '../asset-inspector-actions';
25
+ import { getSelectedAsset, type SelectedAsset } from '@volter/sdk/kit/asset-selection';
26
+ import {
27
+ assetSelectionViewerFor,
28
+ assetSelectionViewersVersion,
29
+ subscribeAssetSelectionViewers,
30
+ } from '../asset-selection-viewer-registry';
31
+ import { assetDocumentKind } from '@volter/sdk/kit/asset-capabilities';
32
+ import {
33
+ type PixiSpritesheetFrame,
34
+ parsePixiSpritesheet,
35
+ sidecarPathForSheet,
36
+ splitSpritesheetAssetPath,
37
+ } from '@volter/sdk/kit/asset-workflow/pixi-spritesheet';
38
+ import { PROJECT_ASSET_COMMANDS } from '@volter/sdk/kit/asset-workflow/project-asset-commands';
39
+ import {
40
+ contentEntryForComponent,
41
+ contentEntrySourceRegistryVersion,
42
+ subscribeContentEntrySources,
43
+ } from '@volter/sdk/kit/content-entry-source-registry';
44
+ import type { InspectionAction } from '@volter/sdk/kit/inspection-model';
45
+ import {
46
+ PREVIEW_SECTION_ID,
47
+ PREVIEW_SECTION_ORDER,
48
+ PROPERTIES_SECTION_ORDER,
49
+ } from '@volter/sdk/kit/inspection-model';
50
+ import type { NullInspectionSubject } from '@volter/sdk/kit/inspection/null-subject';
51
+ import {
52
+ getAssetInspectorToolContributions,
53
+ getGlobalToolContributions,
54
+ subscribeToolContributions,
55
+ } from '@volter/sdk/kit/tool-loader';
56
+ import { activeWorkspaceDocumentSelection } from '@volter/sdk/kit/workspace-document-registry';
57
+ import { AssetInspectorToolSection } from './AssetInspectorToolSection';
58
+ import { ModelThumbnail, TypedAssetThumbnail } from '@volter/sdk/kit/components/asset-thumbnails';
59
+ import { SpritesheetSpriteView } from '@volter/sdk/kit/components/asset-viewers/SpritesheetSpriteView';
60
+ import { MediaProperties } from '@volter/sdk/kit/components/MediaProperties';
61
+
62
+ const labelStyle: React.CSSProperties = { fontSize: 11, color: text[3], marginBottom: 2 };
63
+ const valueStyle: React.CSSProperties = { fontSize: 11, color: text[1], wordBreak: 'break-all' };
64
+
65
+ function AssetToolSections({ asset }: { asset: SelectedAsset }) {
66
+ useSyncExternalStore(
67
+ subscribeToolContributions,
68
+ getGlobalToolContributions,
69
+ getGlobalToolContributions,
70
+ );
71
+ const contributionAsset = {
72
+ path: asset.path,
73
+ name: asset.name,
74
+ kind: asset.kind,
75
+ origin: asset.origin ?? ('project' as const),
76
+ ...(asset.sourcePath ? { sourcePath: asset.sourcePath } : {}),
77
+ };
78
+ return getAssetInspectorToolContributions().map((item) => {
79
+ let matches = false;
80
+ try {
81
+ matches = item.match(contributionAsset);
82
+ } catch (error) {
83
+ // biome-ignore lint/suspicious/noConsole: broken project matchers must teach without taking down the Inspector
84
+ console.error(`[tool contributions] ${item.file}'s asset match() threw.`, error);
85
+ }
86
+ return matches ? (
87
+ <AssetInspectorToolSection
88
+ key={`${item.id}:${item.version}`}
89
+ id={item.id}
90
+ title={item.title}
91
+ file={item.file}
92
+ tool={item.tool}
93
+ Component={item.Component}
94
+ />
95
+ ) : null;
96
+ });
97
+ }
98
+
99
+ function formatSize(bytes: number): string {
100
+ if (bytes < 1024) return `${bytes} B`;
101
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
102
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
103
+ }
104
+
105
+ function MetaRow({ label, value }: { label: string; value: string }) {
106
+ return (
107
+ <div>
108
+ <div style={labelStyle}>{label}</div>
109
+ <div style={valueStyle}>{value}</div>
110
+ </div>
111
+ );
112
+ }
113
+
114
+ /**
115
+ * The selected asset AS THE PREVIEW SECTION's body — the same square box a
116
+ * scene node's live preview fills, with the thumbnail the asset already has.
117
+ * It fills its host at any size, which is what lets the section body and the
118
+ * minimized card's round thumb be one function (`inspection/model.ts`'s
119
+ * `preview` body).
120
+ */
121
+ export function AssetSelectionThumbnail({ asset }: { asset: SelectedAsset }) {
122
+ const environment = asset.capabilities?.editor === 'environment';
123
+ // The picture of a COMPONENT is the same question the Content grid asks, about
124
+ // one component instead of the index (`content-entry-source-registry.ts`):
125
+ // whichever source admits it also paints it, and this panel learns nothing
126
+ // about why it is content.
127
+ useSyncExternalStore(
128
+ subscribeContentEntrySources,
129
+ contentEntrySourceRegistryVersion,
130
+ contentEntrySourceRegistryVersion,
131
+ );
132
+ const componentPreview = asset.componentPreview;
133
+ const componentPicture = componentPreview
134
+ ? contentEntryForComponent({
135
+ name: asset.name,
136
+ path: componentPreview.sourcePath,
137
+ surface: componentPreview.surface,
138
+ })
139
+ : null;
140
+ return (
141
+ <div
142
+ data-testid="inspector-asset-preview"
143
+ style={{
144
+ position: 'absolute',
145
+ inset: 0,
146
+ background: bg.inset,
147
+ display: 'flex',
148
+ alignItems: 'center',
149
+ justifyContent: 'center',
150
+ overflow: 'hidden',
151
+ }}
152
+ >
153
+ {componentPicture ? (
154
+ <componentPicture.source.Thumbnail entry={componentPicture.entry} previewRevision={0} />
155
+ ) : environment ? (
156
+ <TypedAssetThumbnail kind="image" name={asset.name} variant="cell" />
157
+ ) : asset.kind === 'image' ? (
158
+ <SelectedImagePreview path={asset.path} name={asset.name} />
159
+ ) : asset.kind === 'video' ? (
160
+ <SelectedVideoPreview path={asset.path} />
161
+ ) : asset.kind === 'model' ? (
162
+ <ModelThumbnail url={asset.path} />
163
+ ) : (
164
+ <TypedAssetThumbnail kind={asset.kind} name={asset.name} variant="cell" />
165
+ )}
166
+ </div>
167
+ );
168
+ }
169
+
170
+ function SelectedVideoPreview({ path }: { path: string }) {
171
+ return (
172
+ <video
173
+ src={path}
174
+ muted
175
+ preload="metadata"
176
+ style={{ width: '100%', height: '100%', objectFit: 'contain' }}
177
+ />
178
+ );
179
+ }
180
+
181
+ function SelectedImagePreview({ path, name }: { path: string; name: string }) {
182
+ const { sheetPath, frameName } = splitSpritesheetAssetPath(path);
183
+ const [frame, setFrame] = useState<PixiSpritesheetFrame | null>(null);
184
+ useEffect(() => {
185
+ if (!frameName) {
186
+ setFrame(null);
187
+ return;
188
+ }
189
+ let cancelled = false;
190
+ void fetch(`/${sidecarPathForSheet(sheetPath)}`)
191
+ .then((response) => (response.ok ? response.text() : null))
192
+ .then((source) => {
193
+ if (cancelled || !source) return;
194
+ const sheet = parsePixiSpritesheet(source);
195
+ setFrame(sheet?.frames.find((entry) => entry.name === frameName) ?? null);
196
+ })
197
+ .catch(() => {
198
+ if (!cancelled) setFrame(null);
199
+ });
200
+ return () => {
201
+ cancelled = true;
202
+ };
203
+ }, [frameName, sheetPath]);
204
+ if (frame) {
205
+ return <SpritesheetSpriteView sheetUrl={`/${sheetPath}`} frame={frame} maxEdge={96} />;
206
+ }
207
+ return (
208
+ <img
209
+ src={path.split('#')[0]}
210
+ alt={name}
211
+ style={{ width: '100%', height: '100%', objectFit: 'contain' }}
212
+ />
213
+ );
214
+ }
215
+
216
+ /** An image's intrinsic size (§5.1 "dimensions"), measured off the decoded
217
+ * bitmap rather than off a rendered `<img>` — the preview is a section of its
218
+ * own now, and a metadata row must not depend on which tab is showing. */
219
+ function ImageDimensionsRow({ asset }: { asset: SelectedAsset }) {
220
+ const [dims, setDims] = useState<{ w: number; h: number } | null>(null);
221
+ const { sheetPath, frameName } = splitSpritesheetAssetPath(asset.path);
222
+ useEffect(() => {
223
+ setDims(null);
224
+ // Native HDR/EXR loaders own these dimensions in the full document; an
225
+ // HTML Image cannot decode them and must not be used as a silent probe.
226
+ if (asset.kind !== 'image' || asset.capabilities?.editor === 'environment') return;
227
+ let cancelled = false;
228
+ if (frameName) {
229
+ void fetch(`/${sidecarPathForSheet(sheetPath)}`)
230
+ .then((response) => (response.ok ? response.text() : null))
231
+ .then((source) => {
232
+ if (cancelled || !source) return;
233
+ const frame = parsePixiSpritesheet(source)?.frames.find(
234
+ (entry) => entry.name === frameName,
235
+ );
236
+ if (frame) setDims({ w: frame.sourceWidth, h: frame.sourceHeight });
237
+ })
238
+ .catch(() => {});
239
+ return () => {
240
+ cancelled = true;
241
+ };
242
+ }
243
+ const image = new Image();
244
+ image.onload = () => {
245
+ if (!cancelled) setDims({ w: image.naturalWidth, h: image.naturalHeight });
246
+ };
247
+ image.src = asset.path.split('#')[0] ?? asset.path;
248
+ return () => {
249
+ cancelled = true;
250
+ };
251
+ }, [asset.capabilities?.editor, asset.kind, asset.path, frameName, sheetPath]);
252
+ return dims ? <MetaRow label="Dimensions" value={`${dims.w} × ${dims.h}`} /> : null;
253
+ }
254
+
255
+ /** The registered section body — renders ONLY while an asset is selected
256
+ * (the registration's `match` gates on the same store read). */
257
+ export function AssetSelectionSection() {
258
+ // Subscribed, not read once: a package's viewer registers behind the first
259
+ // viewport frame, after this section may already be on screen.
260
+ useSyncExternalStore(
261
+ subscribeAssetSelectionViewers,
262
+ assetSelectionViewersVersion,
263
+ assetSelectionViewersVersion,
264
+ );
265
+ const asset = getSelectedAsset();
266
+ if (!asset) return null;
267
+ const viewer = assetSelectionViewerFor(asset);
268
+ const ext = asset.name.includes('.') ? (asset.name.split('.').pop() ?? '') : '';
269
+ // WHO DRAWS *THIS* ASSET is a registry question. The branch that stood
270
+ // here read `asset.online` and rendered the external catalog's own detail
271
+ // view, which is how a base library for making IDEs came to import a
272
+ // managed-service client (`asset-selection-viewer-registry.ts`).
273
+ if (viewer) {
274
+ return (
275
+ <div
276
+ data-testid="inspector-asset-selection"
277
+ style={{
278
+ pointerEvents: 'auto',
279
+ borderBottom: `1px solid ${border[1]}`,
280
+ display: 'flex',
281
+ flexDirection: 'column',
282
+ gap: 6,
283
+ }}
284
+ >
285
+ <viewer.View asset={asset} />
286
+ <AssetToolSections asset={asset} />
287
+ </div>
288
+ );
289
+ }
290
+ if (
291
+ (asset.selectionCount ?? 1) === 1 &&
292
+ ((asset.kind === 'image' &&
293
+ !asset.path.includes('#') &&
294
+ asset.capabilities?.editor !== 'environment') ||
295
+ asset.kind === 'video' ||
296
+ asset.kind === 'audio')
297
+ ) {
298
+ return (
299
+ <>
300
+ <MediaProperties
301
+ assetPath={asset.path}
302
+ kind={asset.kind as 'image' | 'video' | 'audio'}
303
+ sizeBytes={asset.sizeBytes}
304
+ />
305
+ <div style={{ padding: '0 8px', display: 'grid', gap: 6 }}>
306
+ {asset.health && asset.health !== 'healthy' && (
307
+ <MetaRow label="Health" value={asset.health} />
308
+ )}
309
+ {Boolean(asset.healthCodes?.length) && (
310
+ <MetaRow label="Issues" value={asset.healthCodes!.join(', ')} />
311
+ )}
312
+ {asset.sourcePath && <MetaRow label="Imported from" value={asset.sourcePath} />}
313
+ {Boolean(asset.dependencies?.length) && (
314
+ <MetaRow label="Dependencies" value={asset.dependencies!.join(', ')} />
315
+ )}
316
+ {Boolean(asset.references?.length) && (
317
+ <MetaRow
318
+ label="References"
319
+ value={asset.references!.map((ref) => `${ref.ownerPath} ${ref.jsonPath}`).join(', ')}
320
+ />
321
+ )}
322
+ </div>
323
+ <AssetToolSections asset={asset} />
324
+ </>
325
+ );
326
+ }
327
+ return (
328
+ <div
329
+ data-testid="inspector-asset-selection"
330
+ style={{
331
+ pointerEvents: 'auto',
332
+ padding: 8,
333
+ borderBottom: `1px solid ${border[1]}`,
334
+ display: 'flex',
335
+ flexDirection: 'column',
336
+ gap: 6,
337
+ }}
338
+ >
339
+ <ImageDimensionsRow asset={asset} />
340
+ <div style={{ ...labelStyle, marginBottom: 0, textTransform: 'uppercase' }}>Asset</div>
341
+ {/* §8: source-owned name, as authored. */}
342
+ <div style={{ fontWeight: 600, fontSize: 12, color: text[1], wordBreak: 'break-all' }}>
343
+ {asset.name}
344
+ </div>
345
+ <MetaRow label="Path" value={asset.path} />
346
+ {asset.componentPreview && (
347
+ <MetaRow
348
+ label="Surface"
349
+ value={
350
+ asset.componentPreview.surface === 'canvas'
351
+ ? '2D / Pixi'
352
+ : asset.componentPreview.surface === 'three'
353
+ ? '3D / Three'
354
+ : asset.componentPreview.surface
355
+ }
356
+ />
357
+ )}
358
+ {asset.selectionCount && asset.selectionCount > 1 && (
359
+ <>
360
+ <MetaRow label="Selection" value={`${asset.selectionCount} assets`} />
361
+ {asset.selectionTotalBytes !== undefined && (
362
+ <MetaRow label="Total size" value={formatSize(asset.selectionTotalBytes)} />
363
+ )}
364
+ {asset.selectionFormats && (
365
+ <MetaRow label="Formats" value={asset.selectionFormats.join(', ')} />
366
+ )}
367
+ </>
368
+ )}
369
+ {ext && <MetaRow label="Format" value={ext.toUpperCase()} />}
370
+ {asset.sizeBytes !== undefined && (
371
+ <MetaRow label="Size" value={formatSize(asset.sizeBytes)} />
372
+ )}
373
+ {asset.capabilities && (
374
+ <>
375
+ <MetaRow
376
+ label="Runtime readiness"
377
+ value={
378
+ asset.capabilities.runtimeReady ? 'Runtime-ready' : 'Import or conversion required'
379
+ }
380
+ />
381
+ <MetaRow
382
+ label="Preview"
383
+ value={asset.capabilities.previewable ? 'Available' : 'Unsupported'}
384
+ />
385
+ <MetaRow
386
+ label="Placement"
387
+ value={asset.capabilities.placeable ? 'Placeable' : 'Not placeable'}
388
+ />
389
+ <MetaRow label="Editor" value={assetDocumentKind(asset.capabilities) ?? 'No editor'} />
390
+ </>
391
+ )}
392
+ {asset.health && <MetaRow label="Health" value={asset.health} />}
393
+ {asset.healthCodes && <MetaRow label="Issues" value={asset.healthCodes.join(', ')} />}
394
+ {asset.dependencies && (
395
+ <MetaRow label="Dependencies" value={asset.dependencies.join(', ') || 'None'} />
396
+ )}
397
+ {asset.references && (
398
+ <MetaRow
399
+ label="References"
400
+ value={
401
+ asset.references
402
+ .map((reference) => `${reference.ownerPath} ${reference.jsonPath}`)
403
+ .join(', ') || 'None'
404
+ }
405
+ />
406
+ )}
407
+ {asset.sourcePath && <MetaRow label="Imported from" value={asset.sourcePath} />}
408
+ {!asset.componentPreview && (
409
+ <div style={{ display: 'flex', gap: 6 }}>
410
+ <Button
411
+ type="button"
412
+ data-command-id={PROJECT_ASSET_COMMANDS.open.id}
413
+ onClick={() =>
414
+ window.dispatchEvent(
415
+ new CustomEvent('editor:open-project-asset', { detail: { path: asset.path } }),
416
+ )
417
+ }
418
+ >
419
+ Open
420
+ </Button>
421
+ {asset.selectionCount && asset.selectionCount > 1 && (
422
+ <>
423
+ <Button
424
+ type="button"
425
+ data-command-id={PROJECT_ASSET_COMMANDS.move.id}
426
+ onClick={() =>
427
+ window.dispatchEvent(
428
+ new CustomEvent('editor:project-asset-command', {
429
+ detail: { id: PROJECT_ASSET_COMMANDS.move.id },
430
+ }),
431
+ )
432
+ }
433
+ >
434
+ Move selected
435
+ </Button>
436
+ <Button
437
+ type="button"
438
+ data-command-id={PROJECT_ASSET_COMMANDS.delete.id}
439
+ onClick={() =>
440
+ window.dispatchEvent(
441
+ new CustomEvent('editor:project-asset-command', {
442
+ detail: { id: PROJECT_ASSET_COMMANDS.delete.id },
443
+ }),
444
+ )
445
+ }
446
+ >
447
+ Delete selected
448
+ </Button>
449
+ </>
450
+ )}
451
+ </div>
452
+ )}
453
+ <div style={{ fontSize: 10, color: text[3] }}>
454
+ Double-click (or press Enter) in the asset browser to open the full viewer.
455
+ </div>
456
+ <AssetToolSections asset={asset} />
457
+ </div>
458
+ );
459
+ }
460
+
461
+ /**
462
+ * The selected asset as a SUBJECT — a producer, like every other thing you
463
+ * can click on (`inspection/active-subject.ts` consults it first).
464
+ *
465
+ * A single click in the browser is a click, and the box shows what you
466
+ * clicked: the asset's own name and path on the identity row, its thumbnail
467
+ * in the Preview section, its §5.1 metadata in the Asset section. It used to
468
+ * be a contribution bolted onto whatever ELSE was selected, which is why the
469
+ * card showed the asset while `editor.inspect` reported the stale scene
470
+ * entity — two answers to one question.
471
+ *
472
+ * `null` means the asset selection is not what the human is looking at: no
473
+ * asset is selected, or an open document owns the inspection context (browser
474
+ * selection is navigator state and must not displace a document's subject).
475
+ */
476
+ /**
477
+ * The verbs the matching `asset.inspector` sections have PUBLISHED for this
478
+ * asset (`asset-inspector-actions.ts` says why they are published rather
479
+ * than declared): they land in the subject's `quickActions`, so the identity
480
+ * row shows them and `editor.runAction(id)` runs the same function the
481
+ * section's own button calls.
482
+ */
483
+ function contributedAssetActions(assetPath: string): InspectionAction[] {
484
+ return assetInspectorActionsFor(assetPath).map((action) => ({
485
+ id: action.id,
486
+ title: action.title,
487
+ ...(action.label === undefined ? {} : { label: action.label }),
488
+ placement: 'identity' as const,
489
+ ...(action.disabled === undefined ? {} : { disabled: action.disabled }),
490
+ run: action.run,
491
+ }));
492
+ }
493
+
494
+ export function describeAssetSelectionSubject(): NullInspectionSubject | null {
495
+ const asset = getSelectedAsset();
496
+ if (asset === null) return null;
497
+ // A document with authoring of its own (a scene, a 3D asset document)
498
+ // answers for what is picked INSIDE it; a document that only selects
499
+ // itself (a source file, a JSON) does not stand between the person and the
500
+ // asset they picked in Content — that is where a model's own inspector
501
+ // (the mesh capability's, with its Edit mesh door) lives.
502
+ const documentSelection = activeWorkspaceDocumentSelection();
503
+ if (
504
+ documentSelection &&
505
+ (documentSelection.adapter !== null || documentSelection.nodeId !== null)
506
+ ) {
507
+ return null;
508
+ }
509
+ // A preview section earns its space with a picture. Generic document,
510
+ // folder and audio glyphs are file metadata, not previews: scaling them to
511
+ // fill the Inspector makes a temporary document selection look broken.
512
+ const hasVisualPreview =
513
+ Boolean(asset.componentPreview) ||
514
+ asset.kind === 'model' ||
515
+ asset.kind === 'video' ||
516
+ (asset.kind === 'image' && asset.capabilities?.editor !== 'environment');
517
+ return {
518
+ quickActions: contributedAssetActions(asset.path),
519
+ id: `asset:${asset.path}`,
520
+ title: asset.name,
521
+ kindLabel: asset.online ? `${asset.kind} · ${asset.online.source}` : asset.kind,
522
+ note: { text: asset.sourcePath ?? asset.path, testId: 'inspector-asset-path' },
523
+ sections: [
524
+ ...(hasVisualPreview
525
+ ? [{
526
+ id: PREVIEW_SECTION_ID,
527
+ title: 'Preview',
528
+ icon: faImage,
529
+ order: PREVIEW_SECTION_ORDER,
530
+ body: { kind: 'preview' as const, render: () => <AssetSelectionThumbnail asset={asset} /> },
531
+ }]
532
+ : []),
533
+ {
534
+ id: 'asset-selection',
535
+ title: 'Asset',
536
+ icon: faCircleInfo,
537
+ order: PROPERTIES_SECTION_ORDER,
538
+ body: { kind: 'custom', render: () => <AssetSelectionSection /> },
539
+ // Hosts the `asset.inspector` contributions, whose verbs (a model's
540
+ // Edit mesh) exist only while they render.
541
+ keepMounted: true,
542
+ },
543
+ ],
544
+ };
545
+ }