@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,144 @@
1
+ /** Native GLSL document helpers. GLSL remains the artifact; these functions
2
+ * only describe it for Asset Lab and never serialize a Volter shader shape. */
3
+
4
+ export type ShaderStage = 'vertex' | 'fragment';
5
+
6
+ export interface ShaderUniformDescriptor {
7
+ readonly name: string;
8
+ readonly type: string;
9
+ readonly arraySize?: number | undefined;
10
+ readonly stages: readonly ShaderStage[];
11
+ }
12
+
13
+ export interface ShaderDiagnostic {
14
+ readonly stage: ShaderStage | 'program';
15
+ readonly severity: 'error' | 'warning';
16
+ readonly message: string;
17
+ readonly line?: number | undefined;
18
+ readonly column?: number | undefined;
19
+ }
20
+
21
+ const VERTEX_SUFFIXES = ['.vert', '.vert.glsl'] as const;
22
+ const FRAGMENT_SUFFIXES = ['.frag', '.frag.glsl'] as const;
23
+
24
+ function cleanPath(path: string): string {
25
+ return path.split(/[?#]/, 1)[0]!.toLowerCase();
26
+ }
27
+
28
+ export function shaderStageFromPath(path: string, source = ''): ShaderStage {
29
+ const clean = cleanPath(path);
30
+ if (VERTEX_SUFFIXES.some((suffix) => clean.endsWith(suffix))) return 'vertex';
31
+ if (FRAGMENT_SUFFIXES.some((suffix) => clean.endsWith(suffix))) return 'fragment';
32
+ return /\bgl_Position\b/.test(source) ? 'vertex' : 'fragment';
33
+ }
34
+
35
+ /** Conventional sibling only. A standalone `.glsl` file stays standalone. */
36
+ export function shaderCompanionPath(path: string): string | null {
37
+ const clean = path.split(/[?#]/, 1)[0]!;
38
+ if (/\.vert\.glsl$/i.test(clean)) return clean.replace(/\.vert\.glsl$/i, '.frag.glsl');
39
+ if (/\.frag\.glsl$/i.test(clean)) return clean.replace(/\.frag\.glsl$/i, '.vert.glsl');
40
+ if (/\.vert$/i.test(clean)) return clean.replace(/\.vert$/i, '.frag');
41
+ if (/\.frag$/i.test(clean)) return clean.replace(/\.frag$/i, '.vert');
42
+ return null;
43
+ }
44
+
45
+ function withoutComments(source: string): string {
46
+ // Preserve newlines so reflection never perturbs source-line diagnostics.
47
+ return source
48
+ .replace(/\/\*[\s\S]*?\*\//g, (comment) => comment.replace(/[^\n]/g, ' '))
49
+ .replace(/\/\/[^\n]*/g, '');
50
+ }
51
+
52
+ function declarations(source: string, stage: ShaderStage): ShaderUniformDescriptor[] {
53
+ const result: ShaderUniformDescriptor[] = [];
54
+ const pattern =
55
+ /\buniform\s+(?:(?:lowp|mediump|highp)\s+)?([A-Za-z_]\w*)\s+([A-Za-z_]\w*)\s*(?:\[\s*(\d+)\s*\])?\s*;/g;
56
+ for (const match of withoutComments(source).matchAll(pattern)) {
57
+ const type = match[1];
58
+ const name = match[2];
59
+ if (!type || !name) continue;
60
+ const arraySize = match[3] ? Number.parseInt(match[3], 10) : undefined;
61
+ result.push({ name, type, ...(arraySize ? { arraySize } : {}), stages: [stage] });
62
+ }
63
+ return result;
64
+ }
65
+
66
+ export function reflectShaderUniforms(
67
+ vertexSource: string,
68
+ fragmentSource: string,
69
+ ): ShaderUniformDescriptor[] {
70
+ const reflected = new Map<string, ShaderUniformDescriptor>();
71
+ for (const uniform of [
72
+ ...declarations(vertexSource, 'vertex'),
73
+ ...declarations(fragmentSource, 'fragment'),
74
+ ]) {
75
+ const current = reflected.get(uniform.name);
76
+ if (!current) {
77
+ reflected.set(uniform.name, uniform);
78
+ continue;
79
+ }
80
+ reflected.set(uniform.name, {
81
+ ...current,
82
+ stages: [...new Set([...current.stages, ...uniform.stages])],
83
+ });
84
+ }
85
+ return [...reflected.values()];
86
+ }
87
+
88
+ export function parseShaderDiagnostics(
89
+ log: string,
90
+ stage: ShaderDiagnostic['stage'],
91
+ ): ShaderDiagnostic[] {
92
+ const diagnostics = log
93
+ .split('\n')
94
+ .map((line) => parseDiagnosticLine(line.trim(), stage))
95
+ .filter((diagnostic): diagnostic is ShaderDiagnostic => diagnostic !== null);
96
+ if (diagnostics.length === 0 && log.trim()) {
97
+ diagnostics.push({ stage, severity: 'error', message: log.trim() });
98
+ }
99
+ return diagnostics;
100
+ }
101
+
102
+ function parseDiagnosticLine(
103
+ text: string,
104
+ stage: ShaderDiagnostic['stage'],
105
+ ): ShaderDiagnostic | null {
106
+ if (!text) return null;
107
+ const colon = text.match(/^(ERROR|WARNING):\s*\d+:(\d+)(?::|\((\d+)\):)\s*(.*)$/i);
108
+ if (colon) {
109
+ return {
110
+ stage,
111
+ severity: colon[1]!.toLowerCase() === 'warning' ? 'warning' : 'error',
112
+ line: Number.parseInt(colon[2]!, 10),
113
+ ...(colon[3] ? { column: Number.parseInt(colon[3], 10) } : {}),
114
+ message: colon[4] || text,
115
+ };
116
+ }
117
+ const paren = text.match(/^\d+:(\d+)\((\d+)\):\s*(?:(error|warning)\s*:?)?\s*(.*)$/i);
118
+ if (!paren) return null;
119
+ return {
120
+ stage,
121
+ severity: paren[3]?.toLowerCase() === 'warning' ? 'warning' : 'error',
122
+ line: Number.parseInt(paren[1]!, 10),
123
+ column: Number.parseInt(paren[2]!, 10),
124
+ message: paren[4] || text,
125
+ };
126
+ }
127
+
128
+ /** Reset driver-reported lines after Three's injected ShaderMaterial prefix. */
129
+ export function previewShaderSource(source: string): string {
130
+ return `#line 1\n${source}`;
131
+ }
132
+
133
+ export const FALLBACK_VERTEX_SHADER = `varying vec2 vUv;
134
+
135
+ void main() {
136
+ vUv = uv;
137
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
138
+ }`;
139
+
140
+ export const FALLBACK_FRAGMENT_SHADER = `varying vec2 vUv;
141
+
142
+ void main() {
143
+ gl_FragColor = vec4(vUv, 0.55, 1.0);
144
+ }`;
@@ -0,0 +1,150 @@
1
+ /**
2
+ * PERSISTENT BOARD GUIDES (design ledger: snapping/guides — "persistent
3
+ * guides do not ship"). User-placed ruler guides on the DOM component board,
4
+ * in BOARD coordinates (the same space the frames are laid out in, so a
5
+ * guide stays put under pan/zoom).
6
+ *
7
+ * Persistence: per-project, per-document localStorage — the
8
+ * `device-preview.ts` idiom (keyed by `getCurrentProject().rootPath`; UI
9
+ * convenience, never project truth). A guide is a design AID: it has no
10
+ * rendered meaning in the game, so it must never be written into game
11
+ * source — the same reasoning that keeps the workspace layout and the device
12
+ * preset out of the project.
13
+ *
14
+ * The snap seam: `RootSelectionOverlay`'s gestures snap in HOST-relative
15
+ * space (a per-world frame inside the board), so the board registers its
16
+ * live transform here ({@link registerBoardGuideTransform}) and the overlay
17
+ * asks for guide edges in CLIENT space ({@link guideClientEdges}) to convert
18
+ * against its own host origin.
19
+ */
20
+
21
+ import { getCurrentProject } from '../project-manager';
22
+
23
+ export interface BoardGuide {
24
+ readonly id: string;
25
+ /** 'x' = vertical guide at a board X; 'y' = horizontal guide at a board Y. */
26
+ readonly axis: 'x' | 'y';
27
+ /** Board-space coordinate. */
28
+ readonly value: number;
29
+ }
30
+
31
+ const STORAGE_KEY = 'volter:board-guides:v1';
32
+
33
+ type Stored = Record<string, Record<string, BoardGuide[]>>;
34
+
35
+ function storage(): Storage | null {
36
+ return typeof window === 'undefined' ? null : window.localStorage;
37
+ }
38
+
39
+ function projectKey(): string {
40
+ try {
41
+ return getCurrentProject()?.rootPath ?? '(no-project)';
42
+ } catch {
43
+ return '(no-project)';
44
+ }
45
+ }
46
+
47
+ function readAll(): Stored {
48
+ try {
49
+ return JSON.parse(storage()?.getItem(STORAGE_KEY) ?? '{}') as Stored;
50
+ } catch {
51
+ return {};
52
+ }
53
+ }
54
+
55
+ function writeAll(all: Stored): void {
56
+ try {
57
+ storage()?.setItem(STORAGE_KEY, JSON.stringify(all));
58
+ } catch {
59
+ // Quota/denied — guides silently stay session-only; the next write retries.
60
+ }
61
+ }
62
+
63
+ const listeners = new Set<() => void>();
64
+ let cache: Record<string, BoardGuide[]> | null = null;
65
+ let nextId = Date.now() % 1_000_000;
66
+
67
+ function docs(): Record<string, BoardGuide[]> {
68
+ if (!cache) cache = readAll()[projectKey()] ?? {};
69
+ return cache;
70
+ }
71
+
72
+ function persist(): void {
73
+ const all = readAll();
74
+ all[projectKey()] = docs();
75
+ writeAll(all);
76
+ for (const listener of listeners) listener();
77
+ }
78
+
79
+ const EMPTY_GUIDES: readonly BoardGuide[] = [];
80
+
81
+ export function boardGuides(docId: string): readonly BoardGuide[] {
82
+ // Referentially stable for a guide-less document: this is a
83
+ // `useSyncExternalStore` snapshot, and a fresh `[]` per call is an
84
+ // infinite re-render (measured: it crashed the whole editor surface with
85
+ // "Maximum update depth exceeded" on first mount).
86
+ return docs()[docId] ?? EMPTY_GUIDES;
87
+ }
88
+
89
+ export function subscribeBoardGuides(listener: () => void): () => void {
90
+ listeners.add(listener);
91
+ return () => listeners.delete(listener);
92
+ }
93
+
94
+ export function addBoardGuide(docId: string, axis: BoardGuide['axis'], value: number): string {
95
+ nextId += 1;
96
+ const id = `guide-${nextId}`;
97
+ docs()[docId] = [...boardGuides(docId), { id, axis, value }];
98
+ persist();
99
+ return id;
100
+ }
101
+
102
+ export function moveBoardGuide(docId: string, id: string, value: number): void {
103
+ docs()[docId] = boardGuides(docId).map((g) => (g.id === id ? { ...g, value } : g));
104
+ persist();
105
+ }
106
+
107
+ export function removeBoardGuide(docId: string, id: string): void {
108
+ docs()[docId] = boardGuides(docId).filter((g) => g.id !== id);
109
+ persist();
110
+ }
111
+
112
+ // --- The live board transform, for the overlay's snap conversion ---
113
+
114
+ export interface BoardGuideTransform {
115
+ /** The board container's client origin. */
116
+ readonly originX: number;
117
+ readonly originY: number;
118
+ /** The board pan/zoom (client = origin + pan + value * zoom). */
119
+ readonly panX: number;
120
+ readonly panY: number;
121
+ readonly zoom: number;
122
+ }
123
+
124
+ let activeTransform: { docId: string; transform: BoardGuideTransform } | null = null;
125
+
126
+ /** The mounted board registers its transform (and clears it on unmount) so
127
+ * guide coordinates can be answered in client space. One DOM board is
128
+ * active at a time; a second registration simply replaces the first. */
129
+ export function registerBoardGuideTransform(
130
+ docId: string,
131
+ transform: BoardGuideTransform | null,
132
+ ): void {
133
+ activeTransform = transform ? { docId, transform } : null;
134
+ }
135
+
136
+ /** Every guide of the registered board, as CLIENT-space edge coordinates —
137
+ * what a gesture overlay converts against its own host origin. Empty when
138
+ * no board is registered (nothing to snap to, honestly). */
139
+ export function guideClientEdges(): { x: number[]; y: number[] } {
140
+ if (!activeTransform) return { x: [], y: [] };
141
+ const { docId, transform } = activeTransform;
142
+ const x: number[] = [];
143
+ const y: number[] = [];
144
+ for (const guide of boardGuides(docId)) {
145
+ if (guide.axis === 'x')
146
+ x.push(transform.originX + transform.panX + guide.value * transform.zoom);
147
+ else y.push(transform.originY + transform.panY + guide.value * transform.zoom);
148
+ }
149
+ return { x, y };
150
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A 2D view's keys, from the active keymap, while it is the active one: its transform tools (the
3
+ * three viewport binds the same actions for its own store, `viewport-hotkeys.ts`) and Godot's
4
+ * Pan and Ruler modes. Kept apart from the view so the workbench keymap generator, which reads
5
+ * every `bindActions([...])` call, hashes this small file rather than the whole view.
6
+ */
7
+
8
+ import { editorHost } from '@volter/sdk/host';
9
+ import type { ShellStore } from '@volter/sdk/kit/shell-store';
10
+ import { requestTransformMode } from '@volter/sdk/kit/transform-mode-request';
11
+
12
+ export type CanvasSceneKeyMode = 'pan' | 'ruler';
13
+
14
+ export function bindCanvasSceneKeys(
15
+ store: ShellStore,
16
+ /** Leave any canvas mode (a transform tool's key leaves List Select, Pivot, Pan and Ruler, even
17
+ * when its tool was the one already armed under them). */
18
+ clearMode: () => void,
19
+ /** Switch a canvas mode on, or off when it is the one on. */
20
+ toggleMode: (mode: CanvasSceneKeyMode) => void,
21
+ /** View › Grid › Toggle Grid. */
22
+ toggleGrid: () => void,
23
+ ): () => void {
24
+ const arm = (mode: 'select' | 'translate' | 'rotate' | 'scale') => () => {
25
+ clearMode();
26
+ requestTransformMode(store, mode);
27
+ };
28
+ return editorHost().keyboard.bindActions([
29
+ { id: 'transform.select', scope: 'stage', run: arm('select') },
30
+ { id: 'transform.translate', scope: 'stage', run: arm('translate') },
31
+ { id: 'transform.rotate', scope: 'stage', run: arm('rotate') },
32
+ { id: 'transform.scale', scope: 'stage', run: arm('scale') },
33
+ { id: 'canvas.panMode', scope: 'stage', run: () => toggleMode('pan') },
34
+ { id: 'canvas.rulerMode', scope: 'stage', run: () => toggleMode('ruler') },
35
+ { id: 'canvas.toggleGrid', scope: 'stage', run: toggleGrid },
36
+ ]);
37
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Godot's TEMPORARY PIVOT on a 2D view: a point, in the view's world frame, that rotation turns
3
+ * the selection around without changing any node's own pivot. Pivot mode sets it with Shift+click
4
+ * (and Shift+click on the Pivot button puts it at the selection's centre); Escape in Pivot mode,
5
+ * or a new selection, clears it. One per view.
6
+ */
7
+
8
+ import type { RootViewController } from '@volter/sdk/kit/world-pan-state';
9
+
10
+ type Point = { readonly x: number; readonly y: number };
11
+
12
+ const pivots = new WeakMap<RootViewController, Point>();
13
+ const listeners = new Set<() => void>();
14
+ let version = 0;
15
+
16
+ export function temporaryPivot(view: RootViewController): Point | null {
17
+ return pivots.get(view) ?? null;
18
+ }
19
+
20
+ export function setTemporaryPivot(view: RootViewController, point: Point | null): void {
21
+ if (point) pivots.set(view, point);
22
+ else pivots.delete(view);
23
+ version += 1;
24
+ for (const listener of listeners) listener();
25
+ }
26
+
27
+ export function subscribeTemporaryPivot(listener: () => void): () => void {
28
+ listeners.add(listener);
29
+ return () => listeners.delete(listener);
30
+ }
31
+
32
+ export function temporaryPivotVersion(): number {
33
+ return version;
34
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * The editor's built-in DRAWER utilities, registered through the same
3
+ * W0 workspace-utility registry every other utility uses, so the utility
4
+ * region is registry-driven end to end:
5
+ *
6
+ * - **Console** (B3): always available; its error/warn count becomes the
7
+ * registry `badge()` in the open tab, plus the three standard level counts
8
+ * in the status line while the drawer is hidden.
9
+ * Ordinary log traffic never auto-opens the region; only actionable
10
+ * failures reveal it automatically (today: a world that failed to mount —
11
+ * `workspace-utility-commands.ts`).
12
+ * Animation and state machines are deliberately absent: each is an authored
13
+ * center document (animation inside its owning Asset Lab; an XState machine as
14
+ * its own Machine document), not a global debugger drawer instrument.
15
+ * The Profiler bench and State Watch are deliberately absent: both moved to
16
+ * `@volter/editor-game` as the `profiler.utility` / `state-watch.utility`
17
+ * contributions (WORKBENCH.md §The invariants — the host imports no package).
18
+ * GENERATIONS is absent for the same reason: the paid-provider lane's gallery
19
+ * is `@volter/editor-game`'s `generation.service.ts`, which registers the tab (badge and
20
+ * all) through this same registry.
21
+ * *
22
+ * PROBLEMS (§4.1 mock's `Problems` tab) is deliberately NOT registered —
23
+ * the W4 decision, recorded in the inventory: no truthful problem SOURCE
24
+ * exists today (there is no in-editor typecheck surface; scene-validation
25
+ * and mount failures already surface as console errors plus their own
26
+ * status-bar items), and
27
+ * §4.3's spirit forbids fabricating a surface with nothing real to feed it.
28
+ * The status bar's console counters (`status-contributions.tsx`) read the
29
+ * same real source — the truthful signal that does exist. A real Problems
30
+ * utility lands when a real diagnostics source does.
31
+ *
32
+ * Idempotent-ensure idiom mirrors `build-documents.tsx`'s
33
+ * `ensureBuildContributionsRegistered`.
34
+ */
35
+
36
+ import { editorConsole } from '@volter/sdk/kit/editor-console';
37
+ import { createHmrRegistrationGroup, type HmrRegistrationContext } from '@volter/sdk/kit/hmr-registration-group';
38
+ import { CORE_WORKSPACE_UTILITIES } from '@volter/sdk/kit/workspace-core-utilities';
39
+ import {
40
+ registerWorkspaceUtility,
41
+ type WorkspaceUtilityBadge,
42
+ } from '@volter/sdk/kit/workspace-utility-registry';
43
+ import { ConsolePanel } from './ConsolePanel';
44
+ import { LightExplorerPanel } from './LightExplorerPanel';
45
+
46
+ const registrationGroup = createHmrRegistrationGroup(
47
+ // Vite's HMR context when a dev server serves this module; the SDK carries no bundler types.
48
+ (import.meta as ImportMeta & { hot?: HmrRegistrationContext }).hot,
49
+ 'core-utilities',
50
+ );
51
+
52
+ /** The Console tab's attention badge: error count (error severity) else
53
+ * warn count (warn severity) else none. Exported for tests. */
54
+ export function consoleUtilityBadge(): WorkspaceUtilityBadge | null {
55
+ const { error, warn } = editorConsole.counts;
56
+ if (error > 0) return { count: error + warn, severity: 'error' };
57
+ if (warn > 0) return { count: warn, severity: 'warn' };
58
+ return null;
59
+ }
60
+
61
+ /** Idempotent one-time registration of the built-in workspace utilities. */
62
+ export function ensureCoreUtilitiesRegistered(): void {
63
+ registrationGroup.ensure((track) => {
64
+ track(
65
+ registerWorkspaceUtility({
66
+ ...CORE_WORKSPACE_UTILITIES.console,
67
+ order: -100, // first utility tab, matching the §4.1 mock's tab order
68
+ Content: ConsolePanel,
69
+ badge: consoleUtilityBadge,
70
+ subscribeBadge: editorConsole.subscribe,
71
+ badgeSnapshot: editorConsole.getSnapshot,
72
+ visibleByDefault: false,
73
+ closeable: true,
74
+ }),
75
+ );
76
+ track(
77
+ // Scene-wide light inventory over the active authoring adapter's real
78
+ // hierarchy + inspector fields. Closed by default and opened from the
79
+ // viewport display toolbar or Window menu; no parallel light registry.
80
+ registerWorkspaceUtility({
81
+ ...CORE_WORKSPACE_UTILITIES.lightExplorer,
82
+ order: 21,
83
+ Content: LightExplorerPanel,
84
+ visibleByDefault: false,
85
+ closeable: true,
86
+ }),
87
+ );
88
+ });
89
+ }
90
+
91
+ /** Test-only: allow re-registration after a registry reset. */
92
+ export function __resetCoreUtilitiesForTest(): void {
93
+ registrationGroup.reset();
94
+ }
@@ -0,0 +1,223 @@
1
+ /**
2
+ * The PREVIEW section's body — a live square view of whatever the subject is,
3
+ * with the subject's `preview`-placed verbs sitting in the box over it.
4
+ *
5
+ * It lives in its own light module for one reason: `inspection/compose.ts`
6
+ * builds the preview section, and the preview drags the whole render stack
7
+ * (three.quarks, realism-effects) behind it. The heavy component stays behind
8
+ * `lazy()` here, so a headless composer — every unit test of the model, and
9
+ * `editor.inspect`, which never renders — pays nothing for it.
10
+ *
11
+ * `render` fills its host at any size, which is what lets the section body and
12
+ * the minimized card's round thumb be the SAME function off the SAME subject
13
+ * (`components/CompactInspectorCard.tsx`) rather than two derivations of what
14
+ * the thing looks like. What differs between those hosts is CHROME, not the
15
+ * picture — see {@link InspectionPreviewMode}.
16
+ */
17
+
18
+ import { Button } from '@volter/sdk/widgets';
19
+ import { lazy, type ReactNode, Suspense } from 'react';
20
+ import type { ContentEntry, ContentEntrySource } from '../content-entry-source-registry';
21
+ import type { InspectionAction, InspectionPreviewMode } from '@volter/sdk/kit/inspection-model';
22
+ import { useAfterPaint } from './use-after-paint';
23
+
24
+ const InspectorCanvasPreview = lazy(() =>
25
+ import('./InspectorCanvasPreview').then((m) => ({ default: m.InspectorCanvasPreview })),
26
+ );
27
+
28
+ export function InspectorPreviewBody({
29
+ picture,
30
+ previewKey,
31
+ actions,
32
+ mode = 'section',
33
+ }: {
34
+ /** The subject's live picture, drawn by the medium that renders it (a three.js
35
+ * object's isolated view). The composer only builds a preview section when
36
+ * there IS one, so this never renders a fabricated stand-in. */
37
+ readonly picture: () => ReactNode;
38
+ /** Stable identity for the isolated preview document (the subject's node
39
+ * id) — remounts when the subject changes, not on every compose. */
40
+ readonly previewKey: string;
41
+ readonly actions: readonly InspectionAction[];
42
+ /** Which host this is rendering into. Default `section` — the full box. */
43
+ readonly mode?: InspectionPreviewMode;
44
+ }) {
45
+ // A thumbnail host is a small clipped shape that owns its own single press,
46
+ // so the body gives it the PICTURE and nothing else: it fills the host
47
+ // exactly, and the verbs stay in the section, which is where they are
48
+ // reachable and readable.
49
+ const thumbnail = mode === 'thumbnail';
50
+ // The picture arrives a frame after the box does: mounting it is scene and GL
51
+ // work, and doing it in the selection's own commit is what used to make the
52
+ // whole inspector wait on it (`components/use-after-paint.ts`).
53
+ const showPicture = useAfterPaint(previewKey);
54
+ return (
55
+ <div
56
+ data-testid={thumbnail ? 'inspection-preview-thumbnail' : 'inspection-preview'}
57
+ style={
58
+ thumbnail
59
+ ? { position: 'absolute', inset: 0, overflow: 'hidden' }
60
+ : {
61
+ position: 'relative',
62
+ width: 'calc(100% - 24px)',
63
+ aspectRatio: '1 / 1',
64
+ flexShrink: 0,
65
+ margin: 12,
66
+ overflow: 'hidden',
67
+ border: '1px solid var(--volter-structural-divider)',
68
+ borderRadius: 'var(--dv-group-border-radius, 8px)',
69
+ }
70
+ }
71
+ >
72
+ {showPicture && <Suspense fallback={null}>{picture()}</Suspense>}
73
+ {!thumbnail &&
74
+ actions.map((action) => (
75
+ <Button
76
+ key={action.id}
77
+ data-testid={action.id}
78
+ size="compact"
79
+ disabled={action.disabled}
80
+ title={action.title}
81
+ onClick={action.run}
82
+ style={{ position: 'absolute', right: 8, bottom: 8 }}
83
+ >
84
+ {action.label}
85
+ </Button>
86
+ ))}
87
+ </div>
88
+ );
89
+ }
90
+
91
+ /** The same Preview-section chrome around a COMPONENT's own picture, painted by
92
+ * whichever content source admits it (`content-entry-source-registry.ts`).
93
+ * Canvas entities are Pixi display objects rather than Object3Ds, so the
94
+ * picture Content already shows is the honest preview authority here too; the
95
+ * shell never substitutes the Transform icon for a picture, and never knows
96
+ * what the picture IS. */
97
+ export function InspectorComponentPreviewBody({
98
+ source,
99
+ entry,
100
+ previewKey,
101
+ actions,
102
+ mode = 'section',
103
+ }: {
104
+ readonly source: ContentEntrySource;
105
+ readonly entry: ContentEntry;
106
+ readonly previewKey: string;
107
+ readonly actions: readonly InspectionAction[];
108
+ readonly mode?: InspectionPreviewMode;
109
+ }) {
110
+ const thumbnail = mode === 'thumbnail';
111
+ const showPicture = useAfterPaint(previewKey);
112
+ return (
113
+ <div
114
+ data-testid={thumbnail ? 'inspection-preview-thumbnail' : 'inspection-preview'}
115
+ style={
116
+ thumbnail
117
+ ? { position: 'absolute', inset: 0, overflow: 'hidden' }
118
+ : {
119
+ position: 'relative',
120
+ width: 'calc(100% - 24px)',
121
+ aspectRatio: '1 / 1',
122
+ flexShrink: 0,
123
+ margin: 12,
124
+ overflow: 'hidden',
125
+ border: '1px solid var(--volter-structural-divider)',
126
+ borderRadius: 'var(--dv-group-border-radius, 8px)',
127
+ }
128
+ }
129
+ >
130
+ {showPicture && (
131
+ <div
132
+ style={{
133
+ position: 'absolute',
134
+ inset: 0,
135
+ overflow: 'hidden',
136
+ background: 'var(--volter-bg-inset)',
137
+ }}
138
+ >
139
+ <source.Thumbnail
140
+ entry={entry}
141
+ previewRevision={0}
142
+ width={thumbnail ? 96 : 256}
143
+ height={thumbnail ? 96 : 256}
144
+ />
145
+ </div>
146
+ )}
147
+ {!thumbnail &&
148
+ actions.map((action) => (
149
+ <Button
150
+ key={action.id}
151
+ data-testid={action.id}
152
+ size="compact"
153
+ disabled={action.disabled}
154
+ title={action.title}
155
+ onClick={action.run}
156
+ style={{ position: 'absolute', right: 8, bottom: 8 }}
157
+ >
158
+ {action.label}
159
+ </Button>
160
+ ))}
161
+ </div>
162
+ );
163
+ }
164
+
165
+ /** The selected live Canvas subtree in the same Preview-section shell used by
166
+ * Three and by story fallbacks. */
167
+ export function InspectorCanvasPreviewBody({
168
+ capture,
169
+ previewKey,
170
+ actions,
171
+ mode = 'section',
172
+ }: {
173
+ readonly capture: (size: number) => Promise<string | null>;
174
+ readonly previewKey: string;
175
+ readonly actions: readonly InspectionAction[];
176
+ readonly mode?: InspectionPreviewMode;
177
+ }) {
178
+ const thumbnail = mode === 'thumbnail';
179
+ const showPicture = useAfterPaint(previewKey);
180
+ return (
181
+ <div
182
+ data-testid={thumbnail ? 'inspection-preview-thumbnail' : 'inspection-preview'}
183
+ style={
184
+ thumbnail
185
+ ? { position: 'absolute', inset: 0, overflow: 'hidden' }
186
+ : {
187
+ position: 'relative',
188
+ width: 'calc(100% - 24px)',
189
+ aspectRatio: '1 / 1',
190
+ flexShrink: 0,
191
+ margin: 12,
192
+ overflow: 'hidden',
193
+ border: '1px solid var(--volter-structural-divider)',
194
+ borderRadius: 'var(--dv-group-border-radius, 8px)',
195
+ }
196
+ }
197
+ >
198
+ {showPicture && (
199
+ <Suspense fallback={null}>
200
+ <InspectorCanvasPreview
201
+ capture={capture}
202
+ previewKey={previewKey}
203
+ size={thumbnail ? 96 : 256}
204
+ />
205
+ </Suspense>
206
+ )}
207
+ {!thumbnail &&
208
+ actions.map((action) => (
209
+ <Button
210
+ key={action.id}
211
+ data-testid={action.id}
212
+ size="compact"
213
+ disabled={action.disabled}
214
+ title={action.title}
215
+ onClick={action.run}
216
+ style={{ position: 'absolute', right: 8, bottom: 8 }}
217
+ >
218
+ {action.label}
219
+ </Button>
220
+ ))}
221
+ </div>
222
+ );
223
+ }