@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,429 @@
1
+ import {
2
+ applyEditorTheme,
3
+ composeEditorAppearance,
4
+ DEFAULT_ICON_SET_ID,
5
+ EDITOR_REGION_NAMES,
6
+ type EditorMaterialId,
7
+ type EditorPalette,
8
+ type EditorRegionName,
9
+ type EditorTheme,
10
+ isEditorIconSetId,
11
+ isEditorMaterialId,
12
+ setActiveIconSet,
13
+ subscribeEditorMaterials,
14
+ subscribeIconSets,
15
+ } from '@volter/sdk/widgets';
16
+ import { effectiveSettings, subscribeSettings, updatePreferenceSettings } from '@volter/sdk/kit/settings-store';
17
+ import { resolveEditorTheme, subscribeEditorThemeLibrary } from './theme-library';
18
+
19
+ // The palette and material are `appearance.palette` / `appearance.material`
20
+ // in the settings layers (`settings-store.ts`: `~/.volter/settings.json`, a
21
+ // project's `.volter/settings.json` overriding it). A stored preference carries
22
+ // no authored content, so an unreadable/absent one simply falls back to the
23
+ // default appearance — no migration, no alias. The ONE thing still in browser
24
+ // storage here is the PREPAINT record: the shell colour `index.html` paints
25
+ // before any module loads, a cache of the last paint and never a setting.
26
+ export const PREPAINT_EDITOR_THEME_STORAGE_KEY = 'volter.editor.prepaint.v1';
27
+
28
+ /**
29
+ * THE HOST'S OWN DEFAULT APPEARANCE — what the editor wears when no product
30
+ * composed it, and the floor every other answer falls back to. Classic's
31
+ * reference frame is the host with no look declared (ARCHITECTURE-CORE §The
32
+ * core is the workbench, "Host default versus skew").
33
+ */
34
+ export const DEFAULT_EDITOR_PALETTE_ID = 'graphite-dark';
35
+ export const DEFAULT_EDITOR_MATERIAL_ID: EditorMaterialId = 'classic';
36
+
37
+ /**
38
+ * THE PRODUCT'S DEFAULT APPEARANCE, pushed in rather than read out.
39
+ *
40
+ * The look is the PRODUCT's (ARCHITECTURE-CORE §The target shape, rule 3;
41
+ * WORK.md PART B beat 7 — under the frame there is no look switcher). A
42
+ * product's entry names a style bundle id (`frame/product.ts`'s `look`), and
43
+ * `workspace-style.ts` — which is the module that knows what a bundle IS —
44
+ * resolves it and calls this. It is a DEFAULT and nothing more: the person's
45
+ * `~/.volter/settings.json`, the project's own, and the adapter's declaration all
46
+ * outrank it, because each of those is something somebody said about THIS
47
+ * machine or THIS project.
48
+ *
49
+ * Pushed instead of pulled because the dependency runs the other way:
50
+ * `workspace-style.ts` imports this module, so this module cannot import it.
51
+ */
52
+ let productAppearance: {
53
+ readonly palette: string;
54
+ readonly material: EditorMaterialId;
55
+ readonly icons: string;
56
+ } | null = null;
57
+
58
+ export function setDefaultEditorAppearance(
59
+ next: { palette: string; material: EditorMaterialId; icons: string } | null,
60
+ ): void {
61
+ productAppearance = next;
62
+ // A default that arrives after the first read (the product's style bundle is
63
+ // a package's contribution, so it registers a moment into the session) has to
64
+ // dislodge the cached fallback, or the page wears the host's Graphite for the
65
+ // rest of its life with nothing saying why.
66
+ // A value a setter holds in flight is not a fallback, whatever the settings say yet.
67
+ const stored = effectiveSettings().appearance;
68
+ if (stored?.palette === undefined && !pendingWrites.has('palette')) cachedPaletteId = null;
69
+ if (stored?.material === undefined && !pendingWrites.has('material')) cachedMaterialId = null;
70
+ if (stored?.icons === undefined && !pendingWrites.has('icons')) cachedIconSetId = null;
71
+ fallBackFromMissingTheme();
72
+ applyCurrentTheme();
73
+ emit();
74
+ }
75
+
76
+ /** The product's declared palette when it resolves, the host's otherwise. */
77
+ function defaultPaletteId(): string {
78
+ const declared = productAppearance?.palette;
79
+ return declared !== undefined && resolveEditorTheme(declared)
80
+ ? declared
81
+ : DEFAULT_EDITOR_PALETTE_ID;
82
+ }
83
+
84
+ function defaultMaterialId(): EditorMaterialId {
85
+ return productAppearance?.material ?? DEFAULT_EDITOR_MATERIAL_ID;
86
+ }
87
+
88
+ function defaultIconSetId(): string {
89
+ const declared = productAppearance?.icons;
90
+ return declared !== undefined && isEditorIconSetId(declared) ? declared : DEFAULT_ICON_SET_ID;
91
+ }
92
+
93
+ /**
94
+ * `prefers-reduced-transparency` changes only the painted Glass tier. The
95
+ * stored palette and requested material remain untouched.
96
+ */
97
+ const REDUCED_TRANSPARENCY_QUERY = '(prefers-reduced-transparency: reduce)';
98
+
99
+ let cachedPaletteId: string | null = null;
100
+ let cachedMaterialId: EditorMaterialId | null = null;
101
+ let cachedIconSetId: string | null = null;
102
+
103
+ /**
104
+ * A SETTER'S WRITE IS IN FLIGHT until it settles. Under the Code-OSS frame a write is the
105
+ * configuration service's asynchronous `updateValue`, and other settings changes arrive
106
+ * meanwhile, each still reporting the previous value: re-read then, a style bundle's palette,
107
+ * material and icon set fell back to the previous bundle's and the chrome wore a mix of the two
108
+ * until the writes landed (measured through `set-style`, which answered "custom mix" for every
109
+ * switch between two bundles). So an axis keeps its setter's value until that write settles,
110
+ * landed or failed, and then takes the stored value again — which is also how a project's own
111
+ * override of the axis still wins.
112
+ */
113
+ const pendingWrites = new Map<'palette' | 'material' | 'icons', symbol>();
114
+
115
+ function writeAxis(axis: 'palette' | 'material' | 'icons', value: string): void {
116
+ const write = Symbol(`${axis} write`);
117
+ pendingWrites.set(axis, write);
118
+ const appearance =
119
+ axis === 'palette'
120
+ ? { palette: value }
121
+ : axis === 'material'
122
+ ? { material: value as EditorMaterialId }
123
+ : { icons: value };
124
+ void updatePreferenceSettings({ appearance }).then(() => {
125
+ if (pendingWrites.get(axis) !== write) return; // a later setter owns the axis now
126
+ pendingWrites.delete(axis);
127
+ syncFromSettings();
128
+ });
129
+ }
130
+
131
+ /** Re-read every axis no write holds, and repaint when one moved. */
132
+ function syncFromSettings(): void {
133
+ if (!pendingWrites.has('icons')) cachedIconSetId = readStoredIconSetId();
134
+ setActiveIconSet(editorIconSetSnapshot());
135
+ const palette = pendingWrites.has('palette') ? editorPaletteSnapshot() : readStoredPaletteId();
136
+ const material = pendingWrites.has('material') ? editorMaterialSnapshot() : readStoredMaterialId();
137
+ if (palette === cachedPaletteId && material === cachedMaterialId) return;
138
+ cachedPaletteId = palette;
139
+ cachedMaterialId = material;
140
+ previewTheme = null;
141
+ applyCurrentTheme();
142
+ emit();
143
+ }
144
+ let installedRoot: HTMLElement | null = null;
145
+ let previewTheme: EditorPalette | null = null;
146
+ let removeSettingsListener: (() => void) | null = null;
147
+ let removeMaterialsListener: (() => void) | null = null;
148
+ let removeIconSetsListener: (() => void) | null = null;
149
+ let removeReducedTransparencyListener: (() => void) | null = null;
150
+ const listeners = new Set<() => void>();
151
+
152
+ function storage(): Storage | null {
153
+ try {
154
+ return typeof window === 'undefined' ? null : window.localStorage;
155
+ } catch {
156
+ return null;
157
+ }
158
+ }
159
+
160
+ function resolvePaletteId(value: string | null | undefined): string {
161
+ return value && resolveEditorTheme(value) ? value : defaultPaletteId();
162
+ }
163
+
164
+ function readStoredPaletteId(): string {
165
+ return resolvePaletteId(effectiveSettings().appearance?.palette);
166
+ }
167
+
168
+ function readStoredMaterialId(): EditorMaterialId {
169
+ const stored = effectiveSettings().appearance?.material;
170
+ return isEditorMaterialId(stored) ? stored : defaultMaterialId();
171
+ }
172
+
173
+ function readStoredIconSetId(): string {
174
+ const stored = effectiveSettings().appearance?.icons;
175
+ return isEditorIconSetId(stored) ? stored : defaultIconSetId();
176
+ }
177
+
178
+ /** The stored icon set when a registered set answers it; the editor's own otherwise. Cached
179
+ * like the palette and the material: under a settings PROVIDER (the Code-OSS frame's) a write
180
+ * reaches the effective settings only after the provider's round trip, so a read straight after
181
+ * a setter would see the previous set and a style bundle would read as a custom mix. */
182
+ export function editorIconSetSnapshot(): string {
183
+ cachedIconSetId ??= readStoredIconSetId();
184
+ return cachedIconSetId;
185
+ }
186
+
187
+ export function setEditorIconSetPreference(id: string): void {
188
+ if (!isEditorIconSetId(id)) throw new Error(`Unknown editor icon set “${id}”.`);
189
+ cachedIconSetId = id;
190
+ writeAxis('icons', id);
191
+ setActiveIconSet(id);
192
+ emit();
193
+ }
194
+
195
+ function fallBackFromMissingTheme(): void {
196
+ if (resolveEditorTheme(editorPaletteSnapshot())) return;
197
+ // A stored palette that does not resolve is WORN as the default and never repaired on disk. A
198
+ // contributed palette is absent until its package registers (the Blender look's, the brand's
199
+ // Plotter), and absent altogether in a build or project without that package; writing the
200
+ // default would erase the choice in every other product and project that shares the settings
201
+ // file. The stored choice wins again the moment it resolves (`subscribeEditorThemeLibrary`).
202
+ cachedPaletteId = defaultPaletteId();
203
+ }
204
+
205
+ export function editorPaletteSnapshot(): string {
206
+ cachedPaletteId ??= readStoredPaletteId();
207
+ return cachedPaletteId;
208
+ }
209
+
210
+ export function editorMaterialSnapshot(): EditorMaterialId {
211
+ cachedMaterialId ??= readStoredMaterialId();
212
+ return cachedMaterialId;
213
+ }
214
+
215
+ /**
216
+ * THE EDITOR AREAS THE ACTIVE PALETTE PAINTS SEPARATELY — its own
217
+ * `color.region` claims ({@link EditorRegionName}), as a space-joined key so a
218
+ * component can subscribe to the whole SET with one primitive snapshot.
219
+ *
220
+ * It answers a different question from a panel's claim. A panel says WHICH
221
+ * area it is (`workspace-static-panels.ts`); this says whether the installed
222
+ * palette has anything to say about that area at all. A palette naming none
223
+ * paints every group alike and must also not get the chrome that only reads as
224
+ * chrome INSIDE a painted area — Classic's reference frame is the host with no
225
+ * look declared (ARCHITECTURE-CORE §The core is the workbench, "Host default
226
+ * versus skew"), so a frame-justified shape belongs to the skew that measured
227
+ * it.
228
+ */
229
+ export function editorPaintedRegions(): string {
230
+ const palette = previewTheme ?? resolveEditorTheme(editorPaletteSnapshot())?.theme;
231
+ const region = palette?.color.region;
232
+ if (!region) return '';
233
+ return EDITOR_REGION_NAMES.filter((name: EditorRegionName) => region[name] !== undefined).join(
234
+ ' ',
235
+ );
236
+ }
237
+
238
+ export function subscribeEditorTheme(listener: () => void): () => void {
239
+ listeners.add(listener);
240
+ return () => listeners.delete(listener);
241
+ }
242
+
243
+ function emit(): void {
244
+ for (const listener of listeners) listener();
245
+ }
246
+
247
+ function reducedTransparencyRequested(): boolean {
248
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;
249
+ try {
250
+ return window.matchMedia(REDUCED_TRANSPARENCY_QUERY).matches;
251
+ } catch {
252
+ return false;
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Resolve the token set actually painted from the independent palette and
258
+ * material axes. The material composer owns the reduced-transparency tier;
259
+ * custom palette documents cannot inject or replace surface treatment.
260
+ */
261
+ function resolvePaintTheme(palette: EditorPalette): EditorTheme {
262
+ const materialId = editorMaterialSnapshot();
263
+ return composeEditorAppearance(
264
+ palette,
265
+ materialId,
266
+ materialId === 'glass' && reducedTransparencyRequested(),
267
+ );
268
+ }
269
+
270
+ function applyCurrentTheme(): void {
271
+ if (!installedRoot) return;
272
+ const persisted = resolveEditorTheme(editorPaletteSnapshot())?.theme;
273
+ const palette = previewTheme ?? persisted;
274
+ if (palette) {
275
+ applyEditorTheme(installedRoot, resolvePaintTheme(palette));
276
+ installedRoot.dataset['volterPalette'] = palette.id;
277
+ installedRoot.dataset['volterMaterial'] = editorMaterialSnapshot();
278
+ }
279
+ if (!previewTheme && persisted) {
280
+ const painted = resolvePaintTheme(persisted);
281
+ storage()?.setItem(
282
+ PREPAINT_EDITOR_THEME_STORAGE_KEY,
283
+ JSON.stringify({
284
+ paletteId: persisted.id,
285
+ materialId: editorMaterialSnapshot(),
286
+ id: painted.id,
287
+ shell: painted.color.surface.shell,
288
+ }),
289
+ );
290
+ }
291
+ }
292
+
293
+ export function setEditorPalettePreference(paletteId: string): void {
294
+ if (!resolveEditorTheme(paletteId)) throw new Error(`Unknown editor palette “${paletteId}”.`);
295
+ previewTheme = null;
296
+ if (editorPaletteSnapshot() === paletteId) {
297
+ applyCurrentTheme();
298
+ // The same palette re-applied can still paint differently (its document changed), and the
299
+ // frame derives the workbench's colours from what is painted (`frame/look-colors.ts`).
300
+ emit();
301
+ return;
302
+ }
303
+ cachedPaletteId = paletteId;
304
+ writeAxis('palette', paletteId);
305
+ applyCurrentTheme();
306
+ emit();
307
+ }
308
+
309
+ export function setEditorMaterialPreference(materialId: EditorMaterialId): void {
310
+ if (!isEditorMaterialId(materialId)) throw new Error(`Unknown editor material “${materialId}”.`);
311
+ if (editorMaterialSnapshot() === materialId) {
312
+ applyCurrentTheme();
313
+ return;
314
+ }
315
+ cachedMaterialId = materialId;
316
+ writeAxis('material', materialId);
317
+ applyCurrentTheme();
318
+ emit();
319
+ }
320
+
321
+ /** Temporarily paint an unsaved draft without changing the persisted choice. */
322
+ export function previewEditorTheme(theme: EditorPalette): void {
323
+ previewTheme = theme;
324
+ applyCurrentTheme();
325
+ // A draft is painted like a choice, so the workbench's colours follow it too: the stage
326
+ // reads those first (`native-selection-style.ts`), and a preview they never reached left
327
+ // the 3D viewport on the saved look.
328
+ emit();
329
+ }
330
+
331
+ /** Return from a draft preview to the currently persisted library theme. */
332
+ export function clearEditorThemePreview(): void {
333
+ previewTheme = null;
334
+ applyCurrentTheme();
335
+ emit();
336
+ }
337
+
338
+ /** Install persisted theming and settings-layer synchronization on one editor root. */
339
+ export function installEditorTheme(root: HTMLElement): () => void {
340
+ installedRoot = root;
341
+ applyCurrentTheme();
342
+
343
+ // Re-read: a snapshot taken before the settings loaded cached the default.
344
+ if (!pendingWrites.has('icons')) cachedIconSetId = readStoredIconSetId();
345
+ setActiveIconSet(editorIconSetSnapshot());
346
+ removeIconSetsListener?.();
347
+ // A stored set a package carries is unknown until that package's style registers.
348
+ removeIconSetsListener = subscribeIconSets(() => {
349
+ if (!pendingWrites.has('icons')) cachedIconSetId = readStoredIconSetId();
350
+ setActiveIconSet(editorIconSetSnapshot());
351
+ });
352
+
353
+ // The settings layers changed (a load finished, a project with its own
354
+ // appearance override became active, a setter's write settled): re-read the axes.
355
+ removeSettingsListener?.();
356
+ removeSettingsListener = subscribeSettings(syncFromSettings);
357
+
358
+ // A stored material a package carries is unknown until that package's style
359
+ // registers; Classic paints meanwhile and the stored choice wins on arrival.
360
+ removeMaterialsListener?.();
361
+ removeMaterialsListener = subscribeEditorMaterials(() => {
362
+ if (pendingWrites.has('material')) return;
363
+ const material = readStoredMaterialId();
364
+ if (material === cachedMaterialId) return;
365
+ cachedMaterialId = material;
366
+ applyCurrentTheme();
367
+ emit();
368
+ });
369
+
370
+ removeReducedTransparencyListener?.();
371
+ if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
372
+ try {
373
+ const query = window.matchMedia(REDUCED_TRANSPARENCY_QUERY);
374
+ const onChange = () => {
375
+ applyCurrentTheme();
376
+ emit();
377
+ };
378
+ query.addEventListener('change', onChange);
379
+ removeReducedTransparencyListener = () => query.removeEventListener('change', onChange);
380
+ } catch {
381
+ removeReducedTransparencyListener = null;
382
+ }
383
+ }
384
+
385
+ return () => {
386
+ if (installedRoot === root) installedRoot = null;
387
+ removeSettingsListener?.();
388
+ removeSettingsListener = null;
389
+ removeMaterialsListener?.();
390
+ removeMaterialsListener = null;
391
+ removeIconSetsListener?.();
392
+ removeIconSetsListener = null;
393
+ removeReducedTransparencyListener?.();
394
+ removeReducedTransparencyListener = null;
395
+ };
396
+ }
397
+
398
+ /** Test-only process reset; production callers should never clear the preference implicitly. */
399
+ export function resetEditorThemePreferenceForTests(): void {
400
+ cachedPaletteId = null;
401
+ cachedMaterialId = null;
402
+ cachedIconSetId = null;
403
+ pendingWrites.clear();
404
+ installedRoot = null;
405
+ previewTheme = null;
406
+ removeReducedTransparencyListener?.();
407
+ removeReducedTransparencyListener = null;
408
+ listeners.clear();
409
+ }
410
+
411
+ // Library changes made in this tab immediately repaint a selected custom
412
+ // theme and update every menu/dialog subscriber.
413
+ subscribeEditorThemeLibrary(() => {
414
+ // A palette a PACKAGE carries (`@volter/editor-blender`'s Blender palette, registered
415
+ // by its `workspace.style` contribution) does not exist yet when settings
416
+ // are first read, so `readStoredPaletteId` resolved the stored id to the
417
+ // default and cached it. Re-read it now that the library has grown — the
418
+ // stored choice wins on arrival, exactly as a late-registering MATERIAL
419
+ // already does in `installEditorTheme`. Without this, a project whose
420
+ // `.volter/settings.json` names a contributed palette painted Graphite
421
+ // forever and nothing said why.
422
+ if (!pendingWrites.has('palette')) {
423
+ const stored = readStoredPaletteId();
424
+ if (stored !== cachedPaletteId) cachedPaletteId = stored;
425
+ }
426
+ fallBackFromMissingTheme();
427
+ applyCurrentTheme();
428
+ emit();
429
+ });
@@ -0,0 +1,23 @@
1
+ export type ThreeViewportProjection = 'perspective' | 'orthographic';
2
+
3
+ export interface ThreeViewportPresentationState {
4
+ readonly projection: ThreeViewportProjection;
5
+ }
6
+
7
+ let state: ThreeViewportPresentationState = { projection: 'perspective' };
8
+ const listeners = new Set<() => void>();
9
+
10
+ export function threeViewportPresentation(): ThreeViewportPresentationState {
11
+ return state;
12
+ }
13
+
14
+ export function subscribeThreeViewportPresentation(listener: () => void): () => void {
15
+ listeners.add(listener);
16
+ return () => listeners.delete(listener);
17
+ }
18
+
19
+ export function setThreeViewportProjection(projection: ThreeViewportProjection): void {
20
+ if (state.projection === projection) return;
21
+ state = { ...state, projection };
22
+ for (const listener of listeners) listener();
23
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The `play` channel every project contribution's props carry — ONE resolution
3
+ * of "which live game is this contribution looking at", read by all four
4
+ * contribution hosts (`components/ToolHost.tsx`,
5
+ * `components/InspectorToolSection.tsx`,
6
+ * `components/AssetInspectorToolSection.tsx`, and `@volter/editor-game`'s generation
7
+ * documents).
8
+ *
9
+ * A dev-GUI contribution's whole subject is the running game (owner ruling,
10
+ * `docs/ARCHITECTURE-CORE.md`, 2026-08-19), and this is its door to one.
11
+ *
12
+ * THE DEPENDENCY POINTS THE OTHER WAY, deliberately — play-mode PUBLISHES a
13
+ * reader here, and this module imports nothing of play-mode's. That is the
14
+ * same shape `performance-sources.ts` uses, and it is load-bearing rather than
15
+ * stylistic: an inspector section importing play-mode drags the entire runtime
16
+ * boot chain (renderer setup, vendored postprocessing, WebGL) into every
17
+ * module graph that mounts one — which is a real cost in the editor and an
18
+ * outright import-time crash in a headless host.
19
+ *
20
+ * RESOURCE OWNERSHIP: the reader is play-mode's, for the exact lifetime of one
21
+ * play session. It is the only writer, `publishToolContributionPlay(null)` on
22
+ * exit is the only teardown, and nothing here caches its result.
23
+ */
24
+
25
+ import type { ToolContributionPlay } from '@volter/sdk/contributions';
26
+ import { subscribeInspectedInstance } from '@volter/sdk/kit/authoring/active-systems';
27
+
28
+ type PlayReader = () => ToolContributionPlay | null;
29
+
30
+ let _read: PlayReader | null = null;
31
+ const _listeners = new Set<() => void>();
32
+
33
+ /** Publish the live reader for a play session, or `null` when one ends. */
34
+ export function publishToolContributionPlay(read: PlayReader | null): void {
35
+ _read = read;
36
+ for (const listener of _listeners) listener();
37
+ }
38
+
39
+ /** The inspected play instance, or `null` while nothing is playing. */
40
+ export function toolContributionPlay(): ToolContributionPlay | null {
41
+ return _read?.() ?? null;
42
+ }
43
+
44
+ /**
45
+ * Observe the two things that change WHICH game a contribution is bound to: a
46
+ * session starting or stopping (the publication above), and the Inspect
47
+ * selector moving between live seats. Both, because either alone leaves a host
48
+ * describing another mount's game — and the split is exactly the case where
49
+ * that is invisible.
50
+ */
51
+ export function subscribeToolContributionPlay(listener: () => void): () => void {
52
+ _listeners.add(listener);
53
+ const unsubscribeInstance = subscribeInspectedInstance(listener);
54
+ return () => {
55
+ _listeners.delete(listener);
56
+ unsubscribeInstance();
57
+ };
58
+ }
59
+
60
+ /**
61
+ * A stable identity for the bound instance — the `getSnapshot` for
62
+ * {@link subscribeToolContributionPlay}.
63
+ *
64
+ * A STRING rather than the `play` object itself, because
65
+ * `useSyncExternalStore` compares snapshots with `Object.is` and
66
+ * {@link toolContributionPlay} builds a fresh object on every call: returning
67
+ * that would report a change on every render and loop. The mount id is enough
68
+ * to key on because it is never reused (`play-mode.ts`'s instance-identity
69
+ * block), so a remount is always a new value.
70
+ */
71
+ export function toolContributionPlayKey(): string {
72
+ const play = toolContributionPlay();
73
+ return play ? `play:${play.instanceId}` : 'stopped';
74
+ }