@volter/sdk 0.0.0-stage → 0.5.203

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 +1166 -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 +317 -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 +403 -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,121 @@
1
+ /**
2
+ * ONE resolver for "which authoring adapter do the shared panels drive?" —
3
+ * the Hierarchy and the Inspector must never disagree, and before this module
4
+ * they each open-coded the same expression.
5
+ *
6
+ * ## The defect this exists for (audit A1/A3, 2026-08-01) — and its MEASURED cause
7
+ *
8
+ * Symptom: every pixi ingest (the in-tree canvas fixtures, and
9
+ * the synthetic `ingest-pixi` manifest fixtures) mounted, captured and drew,
10
+ * `getAuthoringOverride()` held a healthy `PixiAuthoringAdapter` with
11
+ * `{transform, inspectorFields, persist}` all true — and the Hierarchy still
12
+ * rendered "No authoring adapter" while the Inspector took its
13
+ * nothing-to-show branch. The three route (the `games-fps` fixture) bound fine in the same session
14
+ * shape.
15
+ *
16
+ * The audit's hypothesis was adapter RESOLUTION: that the active workspace
17
+ * document's adapter shadowed the ingest override at `Inspector.tsx`'s
18
+ * `documentSelection?.adapter ?? getActiveAuthoring(store)`. Reproduced live on
19
+ * a single-`ingest-pixi`-root project and measured: `activeWorkspaceDocument
20
+ * Selection()` is `null`, the only open document is `workspace:game`, and the
21
+ * override is already correct at the moment the panels are showing the wrong
22
+ * thing. Resolution was never wrong. **It was a stale render**: the override
23
+ * slot is module state with no change notification, and the panels only
24
+ * re-rendered because ingest entry ALSO moves workspace focus, which in
25
+ * a Three-rooted project activates a different center document and the
26
+ * workspace registry's `notifyChanged()` re-rendered them incidentally. With no
27
+ * Three root there is one center document, that activation is a no-op, and the
28
+ * incidental notification never happens.
29
+ *
30
+ * The fix is therefore in `active-adapter.ts` (the slot notifies) plus the
31
+ * subscription the panels take out beside this resolver. This module exists so
32
+ * the two panels share ONE expression and one subscription set instead of two
33
+ * copies that can drift apart again.
34
+ *
35
+ * ## Why the resolution ORDER is unchanged
36
+ *
37
+ * An earlier revision of this fix also made an ingest override outrank a
38
+ * document-published adapter — the audit's hypothesis, kept "just in case". It
39
+ * is deliberately NOT here: it was never observed (measured null document
40
+ * selection in the reproduction above), and reaching `isIngestActive` from a
41
+ * module both shared panels import drags `ingest/mount-ingest-root.ts`'s whole transitive
42
+ * graph — the pixi stack and the engine renderer setup — into the
43
+ * Hierarchy's module graph, which broke six unit suites outright on a
44
+ * `URL.createObjectURL` that does not exist in the node test environment. A
45
+ * behavior change nobody could demonstrate is not worth a dependency edge that
46
+ * heavy. If document shadowing is ever actually observed, it should be fixed
47
+ * where the document's provider is registered (`world-documents.tsx`), which
48
+ * is the layer that knows a foreign session is live.
49
+ */
50
+
51
+ import type { AdapterSurface, AuthoringAdapter } from '@volter/project/adapter';
52
+ import type { ShellDocumentState } from '@volter/sdk/kit/shell-document-state';
53
+ import {
54
+ activeWorkspaceDocument,
55
+ activeWorkspaceDocumentSelection,
56
+ type WorkspaceDocumentSelection,
57
+ } from '@volter/sdk/kit/workspace-document-registry';
58
+ import { getActiveAuthoring } from './active-adapter';
59
+ import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
60
+
61
+ export interface PanelAuthoringBinding {
62
+ /** The adapter the Hierarchy/Inspector must drive. */
63
+ readonly adapter: AuthoringAdapter;
64
+ /** Render substrate owned by the active authored document. `null` for
65
+ * composition/reference documents that do not focus one root surface. */
66
+ readonly surface: AdapterSurface | null;
67
+ /** The active document's selection context, when it publishes one. */
68
+ readonly documentSelection: WorkspaceDocumentSelection | null;
69
+ }
70
+
71
+ /**
72
+ * An authored root document projects only the root it is showing. The Game
73
+ * document intentionally falls through to the full composite: composition is
74
+ * its subject, while a Scene/world document's subject is one root.
75
+ *
76
+ * `world` documents carry their manifest root id as provenance. The pinned
77
+ * Three Scene document predates per-root document ids, so its focused child is
78
+ * the one live Three adapter that honestly reports transform authoring.
79
+ */
80
+ function adapterSurface(kind: string): AdapterSurface | null {
81
+ return kind === 'three' || kind === 'canvas' || kind === 'dom' ? kind : null;
82
+ }
83
+
84
+ function rootDocumentBinding(
85
+ active: AuthoringAdapter,
86
+ ): { adapter: AuthoringAdapter; surface: AdapterSurface } | null {
87
+ if (!(active instanceof CompositeAuthoringAdapter)) return null;
88
+ const document = activeWorkspaceDocument()?.descriptor;
89
+ if (!document) return null;
90
+
91
+ const children = active.childAdapters();
92
+ if (document.kind === 'world') {
93
+ const rootId = document.provenance?.rootId;
94
+ const child = rootId ? children.find((candidate) => candidate.worldId === rootId) : undefined;
95
+ const surface = child ? adapterSurface(child.kind) : null;
96
+ return child && surface ? { adapter: child.adapter, surface } : null;
97
+ }
98
+ if (document.kind === 'scene') {
99
+ const child = children.find(
100
+ (candidate) => candidate.kind === 'three' && candidate.adapter.capabilities.transform,
101
+ );
102
+ if (!child) return null;
103
+ return {
104
+ adapter: active.projectedDocumentAdapter(child.worldId) ?? child.adapter,
105
+ surface: 'three',
106
+ };
107
+ }
108
+ return null;
109
+ }
110
+
111
+ export function resolvePanelAuthoring(store: ShellDocumentState): PanelAuthoringBinding {
112
+ const documentSelection = activeWorkspaceDocumentSelection();
113
+ const active = getActiveAuthoring(store);
114
+ const rootBinding = rootDocumentBinding(active);
115
+ const documentKind = activeWorkspaceDocument()?.descriptor.kind;
116
+ return {
117
+ adapter: documentSelection?.adapter ?? rootBinding?.adapter ?? active,
118
+ surface: documentKind === 'story' ? 'dom' : (rootBinding?.surface ?? null),
119
+ documentSelection,
120
+ };
121
+ }
@@ -0,0 +1,105 @@
1
+ /** The project owns its authoring session. Scene tabs attach renderers to it;
2
+ * closing a viewport must not remove the other scenes or component canvases. */
3
+ import { runProjectReady } from '../project-ready';
4
+ import {
5
+ availableWorkspaceDocuments,
6
+ requestAvailableWorkspaceDocument,
7
+ } from '@volter/sdk/kit/workspace-available-documents';
8
+ import { activeWorkspaceDocumentId, openWorkspaceDocuments } from '@volter/sdk/kit/workspace-document-registry';
9
+ import type { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
10
+ import {
11
+ bindEditModeRebuildOwner,
12
+ exitEditModeAuthoring,
13
+ installEditModeAuthoringForProject,
14
+ } from '@volter/sdk/kit/authoring/edit-mode-authoring';
15
+ import type { ShellStore } from '@volter/sdk/kit/shell-store';
16
+
17
+ type Stage = (composite: CompositeAuthoringAdapter) => Promise<void>;
18
+ class ProjectAuthoringSession {
19
+ private references = 0;
20
+ private disposed = false;
21
+ private composite: CompositeAuthoringAdapter | undefined;
22
+ private disposeDocuments: (() => void) | undefined;
23
+ private stages = new Set<Stage>();
24
+ private tail: Promise<void> = Promise.resolve();
25
+ private unbind: () => void;
26
+ readonly ready: Promise<void>;
27
+
28
+ constructor(private readonly store: ShellStore) {
29
+ this.unbind = bindEditModeRebuildOwner(() => this.rebuild());
30
+ this.ready = this.rebuild();
31
+ }
32
+ retain(): () => void {
33
+ this.references++;
34
+ return () => {
35
+ if (--this.references > 0) return;
36
+ this.disposed = true;
37
+ this.unbind();
38
+ this.disposeDocuments?.();
39
+ exitEditModeAuthoring(this.composite);
40
+ sessions.delete(this.store);
41
+ };
42
+ }
43
+ attach(stage: Stage): { ready: Promise<void>; dispose: () => void } {
44
+ const release = this.retain();
45
+ this.stages.add(stage);
46
+ // A stage attached during a rebuild is mounted by that rebuild. A later
47
+ // stage attaches to the already installed project without reinstalling it.
48
+ const ready = this.composite ? stage(this.composite) : this.tail;
49
+ return {
50
+ ready,
51
+ dispose: () => {
52
+ this.stages.delete(stage);
53
+ release();
54
+ },
55
+ };
56
+ }
57
+ private rebuild(): Promise<void> {
58
+ const run = this.tail.then(async () => {
59
+ if (this.disposed) return;
60
+ const active = activeWorkspaceDocumentId();
61
+ const available = new Set(availableWorkspaceDocuments().map((entry) => entry.descriptor.id));
62
+ const reopen = this.composite
63
+ ? openWorkspaceDocuments()
64
+ .map((document) => document.descriptor.id)
65
+ .filter((id) => available.has(id))
66
+ : [];
67
+ this.disposeDocuments?.();
68
+ this.disposeDocuments = undefined;
69
+ exitEditModeAuthoring(this.composite);
70
+ this.composite = undefined;
71
+ const composite = await installEditModeAuthoringForProject(this.store);
72
+ if (this.disposed) {
73
+ exitEditModeAuthoring(composite);
74
+ return;
75
+ }
76
+ const { installRootDocuments } = await import('../components/world-documents');
77
+ if (this.disposed) {
78
+ exitEditModeAuthoring(composite);
79
+ return;
80
+ }
81
+ this.composite = composite;
82
+ this.disposeDocuments = installRootDocuments(this.store, composite);
83
+ for (const id of reopen) requestAvailableWorkspaceDocument(id, id === active);
84
+ await Promise.all([...this.stages].map((stage) => stage(composite)));
85
+ });
86
+ this.tail = run.catch(() => undefined);
87
+ return run;
88
+ }
89
+ }
90
+ const sessions = new Map<ShellStore, ProjectAuthoringSession>();
91
+ function sessionFor(store: ShellStore): ProjectAuthoringSession {
92
+ let session = sessions.get(store);
93
+ if (!session) {
94
+ session = new ProjectAuthoringSession(store);
95
+ sessions.set(store, session);
96
+ }
97
+ return session;
98
+ }
99
+ export function retainProjectAuthoringSession(store: ShellStore) {
100
+ const session = sessionFor(store);
101
+ return { ready: session.ready.then(() => runProjectReady()), dispose: session.retain() };
102
+ }
103
+ export function attachProjectAuthoringStage(store: ShellStore, stage: Stage) {
104
+ return sessionFor(store).attach(stage);
105
+ }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Seam-level provenance resolution (spec 29 §5): which {@link
3
+ * AuthoringProvenance} governs a given hierarchy node. Provenance is declared
4
+ * once per adapter and rendered at the seam (world group row / panel header);
5
+ * affordance code also reads it for the REASON string on a disabled operation
6
+ * ("the subject is present but the operation isn't" — the complement of spec
7
+ * 28's hide-when-absent rule).
8
+ *
9
+ * Rule zero: roots are resolved by ASKING the composite (`groupNodeId` /
10
+ * `ownerOf`), never by decoding adapter-minted id strings here.
11
+ */
12
+ import type { AuthoringAdapter, AuthoringProvenance } from '@volter/project/adapter';
13
+ import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
14
+
15
+ /** Resolve the concrete adapter that owns a real hierarchy node. Synthetic
16
+ * composite rows and unknown ids have no owner. */
17
+ export function authoringAdapterForNode(
18
+ adapter: AuthoringAdapter,
19
+ nodeId: string,
20
+ ): AuthoringAdapter | null {
21
+ if (!(adapter instanceof CompositeAuthoringAdapter)) return adapter;
22
+ const worldId = adapter.ownerOf(nodeId);
23
+ if (worldId === null) return null;
24
+ return adapter.childAdapters().find((child) => child.worldId === worldId)?.adapter ?? null;
25
+ }
26
+
27
+ /**
28
+ * The adapter GOVERNING `nodeId` under the ACTIVE adapter — the one entitled to
29
+ * answer questions *about that node*: the owning child inside a composite, the
30
+ * world's own child for a `world:<id>` GROUP row, the adapter itself when it
31
+ * isn't a composite. `null` when the composite recognizes no owner (a synthetic
32
+ * organization row, an unknown id).
33
+ *
34
+ * Use this — not the active adapter — for any PER-NODE capability check inside
35
+ * a composite. `CompositeAuthoringAdapter`'s provider fields are unconditional
36
+ * routing objects: reading presence off the composite is `true` for every node
37
+ * in every multi-root project, including nodes whose owner exposes no such
38
+ * provider at all and nodes nobody owns (where `route()` falls back to the
39
+ * FIRST child). That has the editor assert a capability claim on a child's
40
+ * behalf — exactly the fabrication the anti-shim rule forbids. Ask the
41
+ * governing adapter instead, and treat "no governing adapter" as "nobody
42
+ * declared anything".
43
+ *
44
+ * Distinct from {@link authoringAdapterForNode}, which resolves REAL hierarchy
45
+ * nodes only and is deliberately `null` for a group row.
46
+ */
47
+ export function governingAdapterForNode(
48
+ adapter: AuthoringAdapter,
49
+ nodeId: string,
50
+ ): AuthoringAdapter | null {
51
+ if (!(adapter instanceof CompositeAuthoringAdapter)) return adapter;
52
+ for (const child of adapter.childAdapters()) {
53
+ if (adapter.groupNodeId(child.worldId) === nodeId) return child.adapter;
54
+ }
55
+ return authoringAdapterForNode(adapter, nodeId);
56
+ }
57
+
58
+ /**
59
+ * The provenance governing `nodeId` under the ACTIVE adapter: the owning
60
+ * child's declaration inside a composite (a `world:<id>` group row resolves
61
+ * to that world's own child), the adapter's own declaration otherwise.
62
+ * `null` when nothing was declared (the shell shows no badge and falls back
63
+ * to a generic reason — never fabricates a claim).
64
+ */
65
+ export function provenanceForNode(
66
+ adapter: AuthoringAdapter,
67
+ nodeId: string,
68
+ ): AuthoringProvenance | null {
69
+ return governingAdapterForNode(adapter, nodeId)?.provenance ?? null;
70
+ }
71
+
72
+ /** The reason string for an affordance that is present but unavailable —
73
+ * the adapter's own explanation when it declared one, a plain honest
74
+ * fallback when it didn't. */
75
+ export function unavailableReason(provenance: AuthoringProvenance | null): string {
76
+ return provenance?.detail ?? "Not supported by this world's adapter.";
77
+ }
78
+ /**
79
+ * WHERE this adapter's truth is written, as one human-readable string.
80
+ *
81
+ * One owner, because two surfaces read it and they must agree: the Hierarchy
82
+ * panel publishes it as its scene name (`components/GameHierarchy.tsx`), and
83
+ * the Inspector's identity row PRINTS it as the datablock line
84
+ * (`inspection/model.ts`'s `InspectionDocumentLine`) now that the tree's own
85
+ * breadcrumb row is gone. When the two were computed separately the
86
+ * Inspector's half silently showed nothing for every adapter that answers
87
+ * through its document root instead of a persistence provider — which is the
88
+ * ordinary three-source case.
89
+ *
90
+ * `null` for a session with no single destination (a composite, whose worlds'
91
+ * destinations differ) — the same silence its `provenance` keeps.
92
+ */
93
+ export function authoringDestination(adapter: AuthoringAdapter): string | null {
94
+ const persisted = adapter.persistence?.destination;
95
+ if (persisted) return persisted;
96
+ const roots = adapter.hierarchy.roots();
97
+ const documentRoot = roots.length === 1 && roots[0]?.role === 'document' ? roots[0] : null;
98
+ return documentRoot?.secondaryLabel ?? documentRoot?.label ?? null;
99
+ }
@@ -0,0 +1,259 @@
1
+ import { type RootPan, type RootViewController, sharedRootViewController } from '@volter/sdk/kit/world-pan-state';
2
+
3
+ const MIN_ZOOM = 0.1;
4
+ const MAX_ZOOM = 4;
5
+ /** A 2D scene zooms further both ways than a board: a pixel-art sprite is read at many times its
6
+ * size, and a level wider than the screen is laid out from far above it. */
7
+ export const SCENE_MIN_ZOOM = 0.02;
8
+ export const SCENE_MAX_ZOOM = 32;
9
+ const ZOOM_SENSITIVITY = 0.002;
10
+ const SECONDARY_DRAG_THRESHOLD_PX = 4;
11
+
12
+ export interface ReactCanvasWheelInput {
13
+ readonly clientX: number;
14
+ readonly clientY: number;
15
+ readonly deltaX: number;
16
+ readonly deltaY: number;
17
+ readonly deltaMode: number;
18
+ readonly ctrlKey: boolean;
19
+ readonly metaKey: boolean;
20
+ readonly shiftKey: boolean;
21
+ readonly bounds: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>;
22
+ }
23
+
24
+ function deltaPixels(delta: number, mode: number, pageSize: number): number {
25
+ if (mode === 1) return delta * 16; // WheelEvent.DOM_DELTA_LINE
26
+ if (mode === 2) return delta * pageSize; // WheelEvent.DOM_DELTA_PAGE
27
+ return delta;
28
+ }
29
+
30
+ /** Resolve one component-board wheel gesture without touching global state. */
31
+ export function resolveReactCanvasWheel(view: RootPan, input: ReactCanvasWheelInput): RootPan {
32
+ let deltaX = deltaPixels(input.deltaX, input.deltaMode, input.bounds.width);
33
+ let deltaY = deltaPixels(input.deltaY, input.deltaMode, input.bounds.height);
34
+
35
+ if (input.ctrlKey || input.metaKey) {
36
+ const zoom = Math.min(
37
+ MAX_ZOOM,
38
+ Math.max(MIN_ZOOM, view.zoom * Math.exp(-deltaY * ZOOM_SENSITIVITY)),
39
+ );
40
+ const pointerX = input.clientX - input.bounds.left;
41
+ const pointerY = input.clientY - input.bounds.top;
42
+ const worldX = (pointerX - view.x) / view.zoom;
43
+ const worldY = (pointerY - view.y) / view.zoom;
44
+ return {
45
+ x: pointerX - worldX * zoom,
46
+ y: pointerY - worldY * zoom,
47
+ zoom,
48
+ };
49
+ }
50
+
51
+ // Figma treats a shifted vertical mouse wheel as horizontal movement.
52
+ // Trackpads already provide deltaX, so preserve that richer input.
53
+ if (input.shiftKey && deltaX === 0) {
54
+ deltaX = deltaY;
55
+ deltaY = 0;
56
+ }
57
+ return { x: view.x - deltaX, y: view.y - deltaY, zoom: view.zoom };
58
+ }
59
+
60
+ /** Resolve the wheel gesture for a native 2D Scene. Like the Three Scene and
61
+ * Godot's 2D workspace, the wheel changes the spatial camera's zoom around
62
+ * the cursor; panning belongs to middle-drag, right-drag, or Space-drag. This is
63
+ * intentionally different from the component board above, where a wheel pans
64
+ * the layout and a modifier-wheel zooms it. */
65
+ export function resolveCanvasSceneWheel(view: RootPan, input: ReactCanvasWheelInput): RootPan {
66
+ const deltaY = deltaPixels(input.deltaY, input.deltaMode, input.bounds.height);
67
+ const zoom = Math.min(
68
+ SCENE_MAX_ZOOM,
69
+ Math.max(SCENE_MIN_ZOOM, view.zoom * Math.exp(-deltaY * ZOOM_SENSITIVITY)),
70
+ );
71
+ const pointerX = input.clientX - input.bounds.left;
72
+ const pointerY = input.clientY - input.bounds.top;
73
+ const worldX = (pointerX - view.x) / view.zoom;
74
+ const worldY = (pointerY - view.y) / view.zoom;
75
+ return {
76
+ x: pointerX - worldX * zoom,
77
+ y: pointerY - worldY * zoom,
78
+ zoom,
79
+ };
80
+ }
81
+
82
+ function isNavigationChrome(target: EventTarget | null): boolean {
83
+ return (
84
+ target instanceof Element &&
85
+ target.closest('[data-volter-canvas-navigation-ignore="true"]') !== null
86
+ );
87
+ }
88
+
89
+ /**
90
+ * Install viewport-sized navigation for a React design canvas. This stays on
91
+ * the untransformed document container, unlike authoring chrome that follows
92
+ * the world transform, so navigation remains available after fit/zoom.
93
+ */
94
+ function installCanvasNavigation(
95
+ container: HTMLElement,
96
+ view: RootViewController,
97
+ resolveWheel: (view: RootPan, input: ReactCanvasWheelInput) => RootPan,
98
+ options: { readonly rightDragPans?: boolean } = {},
99
+ ): () => void {
100
+ let drag: {
101
+ readonly pointerId: number;
102
+ readonly button: 1 | 2;
103
+ readonly startClientX: number;
104
+ readonly startClientY: number;
105
+ readonly startPan: RootPan;
106
+ moved: boolean;
107
+ } | null = null;
108
+ let suppressNextContextMenu = false;
109
+ let previousInteractionCursor = '';
110
+
111
+ const interactionLayer = (): HTMLElement | null =>
112
+ container.querySelector<HTMLElement>('[data-testid="world-selection-overlay-interaction"]');
113
+
114
+ const setDraggingAppearance = (dragging: boolean): void => {
115
+ container.dataset['canvasPanning'] = dragging ? 'true' : 'false';
116
+ container.style.cursor = dragging ? 'grabbing' : '';
117
+ const interaction = interactionLayer();
118
+ if (!interaction) return;
119
+ if (dragging) {
120
+ previousInteractionCursor = interaction.style.cursor;
121
+ interaction.style.cursor = 'grabbing';
122
+ } else {
123
+ interaction.style.cursor = previousInteractionCursor;
124
+ }
125
+ };
126
+
127
+ const onPointerMove = (event: PointerEvent): void => {
128
+ if (!drag || event.pointerId !== drag.pointerId) return;
129
+ // PointerEvent's button mask is platform-independent: 4 is middle, 2 is
130
+ // secondary/right. Windows can drop pointerup around native auto-scroll
131
+ // or a window boundary, so stop as soon as the active bit disappears.
132
+ const pressedButtonMask = drag.button === 1 ? 4 : 2;
133
+ if ((event.buttons & pressedButtonMask) === 0) {
134
+ endDrag(event);
135
+ return;
136
+ }
137
+ const deltaX = event.clientX - drag.startClientX;
138
+ const deltaY = event.clientY - drag.startClientY;
139
+ if (!drag.moved) {
140
+ if (Math.hypot(deltaX, deltaY) <= SECONDARY_DRAG_THRESHOLD_PX) return;
141
+ drag.moved = true;
142
+ setDraggingAppearance(true);
143
+ }
144
+ view.setPan(drag.startPan.x + deltaX, drag.startPan.y + deltaY);
145
+ };
146
+
147
+ const endDrag = (event: PointerEvent): void => {
148
+ if (!drag || event.pointerId !== drag.pointerId) return;
149
+ const pointerId = drag.pointerId;
150
+ if (drag.button === 2 && drag.moved) suppressNextContextMenu = true;
151
+ drag = null;
152
+ setDraggingAppearance(false);
153
+ if (container.hasPointerCapture?.(pointerId)) container.releasePointerCapture(pointerId);
154
+ window.removeEventListener('pointermove', onPointerMove);
155
+ window.removeEventListener('pointerup', endDrag);
156
+ window.removeEventListener('pointercancel', endDrag);
157
+ };
158
+
159
+ const onPointerDown = (event: PointerEvent): void => {
160
+ const isMiddleButton = event.button === 1;
161
+ const isRightButton = options.rightDragPans === true && event.button === 2;
162
+ if ((!isMiddleButton && !isRightButton) || isNavigationChrome(event.target)) return;
163
+ if (isRightButton) suppressNextContextMenu = false;
164
+ event.preventDefault();
165
+ // A secondary press is shared with the selection overlay: navigation owns
166
+ // movement, while the overlay owns the stationary overlap menu. Let that
167
+ // one event continue so both can measure the same press; middle drag is
168
+ // unambiguous and remains navigation-only.
169
+ if (isMiddleButton) event.stopPropagation();
170
+ drag = {
171
+ pointerId: event.pointerId,
172
+ button: event.button as 1 | 2,
173
+ startClientX: event.clientX,
174
+ startClientY: event.clientY,
175
+ startPan: view.get(),
176
+ // Middle-drag is unambiguous and retains its immediate response. A
177
+ // secondary press waits for movement so a stationary secondary click
178
+ // remains the viewport's overlap/context menu.
179
+ moved: isMiddleButton,
180
+ };
181
+ // Pointer capture is the mouse-equivalent of a trackpad's uninterrupted
182
+ // gesture stream: middle-drag keeps panning across child frames and past
183
+ // the viewport edge, including on Windows where window-level move/up
184
+ // delivery is otherwise inconsistent around native auto-scroll.
185
+ container.setPointerCapture?.(event.pointerId);
186
+ setDraggingAppearance(isMiddleButton);
187
+ window.addEventListener('pointermove', onPointerMove);
188
+ window.addEventListener('pointerup', endDrag);
189
+ window.addEventListener('pointercancel', endDrag);
190
+ };
191
+
192
+ const onMouseDown = (event: MouseEvent): void => {
193
+ // Prevent Chromium's native middle-button auto-scroll glyph.
194
+ if (event.button === 1 && !isNavigationChrome(event.target)) event.preventDefault();
195
+ };
196
+
197
+ const onContextMenu = (event: MouseEvent): void => {
198
+ if (options.rightDragPans !== true) return;
199
+ const activeRightDrag = drag?.button === 2 && drag.moved;
200
+ if (!activeRightDrag && !suppressNextContextMenu) return;
201
+ suppressNextContextMenu = false;
202
+ event.preventDefault();
203
+ event.stopPropagation();
204
+ };
205
+
206
+ const onWheel = (event: WheelEvent): void => {
207
+ if (isNavigationChrome(event.target)) return;
208
+ event.preventDefault();
209
+ event.stopPropagation();
210
+ const next = resolveWheel(view.get(), {
211
+ clientX: event.clientX,
212
+ clientY: event.clientY,
213
+ deltaX: event.deltaX,
214
+ deltaY: event.deltaY,
215
+ deltaMode: event.deltaMode,
216
+ ctrlKey: event.ctrlKey,
217
+ metaKey: event.metaKey,
218
+ shiftKey: event.shiftKey,
219
+ bounds: container.getBoundingClientRect(),
220
+ });
221
+ view.setView(next.x, next.y, next.zoom);
222
+ };
223
+
224
+ container.addEventListener('pointerdown', onPointerDown, true);
225
+ container.addEventListener('lostpointercapture', endDrag, true);
226
+ container.addEventListener('mousedown', onMouseDown, true);
227
+ container.addEventListener('contextmenu', onContextMenu, true);
228
+ container.addEventListener('wheel', onWheel, { capture: true, passive: false });
229
+ return () => {
230
+ drag = null;
231
+ setDraggingAppearance(false);
232
+ container.removeEventListener('pointerdown', onPointerDown, true);
233
+ container.removeEventListener('lostpointercapture', endDrag, true);
234
+ container.removeEventListener('mousedown', onMouseDown, true);
235
+ container.removeEventListener('contextmenu', onContextMenu, true);
236
+ container.removeEventListener('wheel', onWheel, true);
237
+ window.removeEventListener('pointermove', onPointerMove);
238
+ window.removeEventListener('pointerup', endDrag);
239
+ window.removeEventListener('pointercancel', endDrag);
240
+ };
241
+ }
242
+
243
+ /** Component-board navigation: wheel pans; modifier-wheel zooms. */
244
+ export function installReactCanvasNavigation(
245
+ container: HTMLElement,
246
+ view: RootViewController = sharedRootViewController,
247
+ ): () => void {
248
+ return installCanvasNavigation(container, view, resolveReactCanvasWheel);
249
+ }
250
+
251
+ /** Native 2D Scene navigation: wheel zooms; middle/right/Space drag pans. */
252
+ export function installCanvasSceneNavigation(
253
+ container: HTMLElement,
254
+ view: RootViewController,
255
+ ): () => void {
256
+ return installCanvasNavigation(container, view, resolveCanvasSceneWheel, {
257
+ rightDragPans: true,
258
+ });
259
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * React design documents deliberately use an opaque, theme-independent canvas.
3
+ * Glass theme surface tokens are translucent and would let the chrome's
4
+ * backdrop frost turn the fine dot grid into a pale blur. These literals describe the
5
+ * semantic preview media itself, like an alpha checkerboard, rather than editor
6
+ * chrome colors.
7
+ */
8
+ export const REACT_DESIGN_CANVAS_COLOR = '#191c22';
9
+ export const REACT_DESIGN_CANVAS_DOT = 'rgba(255, 255, 255, 0.2)';
10
+ export const REACT_STORY_TRANSPARENCY_BASE = '#20242a';
11
+ export const REACT_STORY_TRANSPARENCY_TILE = '#2d323a';
12
+
13
+ export function reactStoryTransparencyBackground(): string {
14
+ return (
15
+ `linear-gradient(45deg, ${REACT_STORY_TRANSPARENCY_TILE} 25%, transparent 25%, ` +
16
+ `transparent 75%, ${REACT_STORY_TRANSPARENCY_TILE} 75%), ` +
17
+ `linear-gradient(45deg, ${REACT_STORY_TRANSPARENCY_TILE} 25%, transparent 25%, ` +
18
+ `transparent 75%, ${REACT_STORY_TRANSPARENCY_TILE} 75%)`
19
+ );
20
+ }