@vgai/editor 0.2.0 → 0.4.0-canary.20260715.0

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 (430) hide show
  1. package/README.md +24 -0
  2. package/dist/assets/axe-C7YBtOuM.js +30 -0
  3. package/dist/assets/browserAll-DDtGGE48.js +1 -0
  4. package/dist/assets/create-runtime-DbTlBlKG.js +1 -0
  5. package/dist/assets/{game-BI111o5f.js → game-BE0r7DMI.js} +3 -3
  6. package/dist/assets/game-BdTHR2_X.js +1 -0
  7. package/dist/assets/{game-pt_1lQLv.js → game-C3iQGSqo.js} +1 -1
  8. package/dist/assets/game-CcHfYxjP.js +1 -0
  9. package/dist/assets/game-Cqzj_lpD.js +1 -0
  10. package/dist/assets/game-DSZdeCHu.js +1 -0
  11. package/dist/assets/game-Dch9sAPc.js +1 -0
  12. package/dist/assets/{game-xsOho_wg.js → game-SAFn90pA.js} +3 -3
  13. package/dist/assets/game-loop-DMIgSMV-.js +1 -0
  14. package/dist/assets/{game-source-CvidN7AB.js → game-source-Dk83w26t.js} +1 -1
  15. package/dist/assets/{index-Bp5cecD6.js → index-4idIsHHJ.js} +2 -2
  16. package/dist/assets/{index-DL7RcQ0n.js → index-C-LhOTBN.js} +1 -1
  17. package/dist/assets/{index-Cs8xwv3e.js → index-CDkxceqE.js} +1 -1
  18. package/dist/assets/index-CQEfi217.js +15412 -0
  19. package/dist/assets/index-Dvi-V0NE.css +1 -0
  20. package/dist/assets/ingest-siblings-s0P5I1Ub.js +1 -0
  21. package/dist/assets/mount-manifest-DXMOlF79.js +1 -0
  22. package/dist/assets/react-18-C9eHn8x1.js +1 -0
  23. package/dist/assets/webworkerAll-Fn0e-ouF.js +1 -0
  24. package/dist/assets/world-documents-GM0a9Kv7.js +1 -0
  25. package/dist/index.html +15 -13
  26. package/dist/ingest/racing-game/vgai.game.json +5 -4
  27. package/dist/ingest/simcity/vgai.game.json +5 -4
  28. package/dist/ingest/tanks/vgai.game.json +5 -4
  29. package/dist/project-scripts.bundle.js +3917 -0
  30. package/dist/scenes/untitled.vscn.json +2 -0
  31. package/dist-server/packaged.mjs +7697 -3435
  32. package/package.json +31 -4
  33. package/scripts/probe-reporter.ts +349 -0
  34. package/scripts/run-probe.ts +2260 -0
  35. package/server/asset-catalog-audit.ts +268 -0
  36. package/server/asset-catalog-v2.ts +146 -0
  37. package/server/asset-library-routes.ts +276 -58
  38. package/server/canonical-path.ts +1 -1
  39. package/server/dev.ts +148 -44
  40. package/server/editor-server.ts +888 -61
  41. package/server/editor-sse.ts +115 -4
  42. package/server/harness-chat-service.ts +796 -0
  43. package/server/local-asset-catalog.ts +157 -22
  44. package/server/packaged.ts +51 -21
  45. package/server/process-shutdown.ts +136 -0
  46. package/server/prod.ts +9 -6
  47. package/server/project-hmr-files.ts +41 -0
  48. package/server/project-operations.ts +343 -0
  49. package/server/project-optimize-deps-entries.ts +4 -4
  50. package/server/project-output-writer.ts +156 -0
  51. package/server/project-validation.ts +140 -0
  52. package/server/project-view.ts +8 -50
  53. package/server/server-utils.ts +75 -10
  54. package/server/session-registry.ts +12 -0
  55. package/src/EditorContext.tsx +107 -3
  56. package/src/action-registry.ts +115 -17
  57. package/src/adapter-resolver.ts +213 -478
  58. package/src/asset-events.ts +64 -1
  59. package/src/asset-preview.ts +906 -0
  60. package/src/asset-selection.ts +121 -0
  61. package/src/asset-workflow/asset-capabilities.ts +259 -0
  62. package/src/asset-workflow/asset-editor-errors.ts +46 -0
  63. package/src/asset-workflow/asset-import-pipeline.ts +176 -0
  64. package/src/asset-workflow/asset-library-query.ts +107 -0
  65. package/src/asset-workflow/asset-types.ts +192 -0
  66. package/src/asset-workflow/asset-workflow-quality.ts +65 -0
  67. package/src/asset-workflow/import-contract.ts +113 -0
  68. package/src/asset-workflow/model-conversion.ts +126 -0
  69. package/src/asset-workflow/model-inspection.ts +185 -0
  70. package/src/asset-workflow/project-asset-commands.ts +23 -0
  71. package/src/asset-workflow/project-asset-health.ts +153 -0
  72. package/src/asset-workflow/project-asset-operations.ts +119 -0
  73. package/src/asset-workflow/thumbnail-system.ts +172 -0
  74. package/src/authoring/active-systems.ts +15 -0
  75. package/src/authoring/boundary-authoring-adapter.ts +16 -5
  76. package/src/authoring/composite-authoring-adapter.ts +305 -124
  77. package/src/authoring/design-time-layers.ts +300 -117
  78. package/src/authoring/edit-mode-authoring.ts +278 -293
  79. package/src/authoring/embed-only-adapter.ts +4 -2
  80. package/src/authoring/first-party-hierarchy-menu.ts +7 -2
  81. package/src/authoring/first-party-inspector/AddSectionMenu.tsx +5 -12
  82. package/src/authoring/first-party-inspector/EnvironmentSection.tsx +53 -126
  83. package/src/authoring/first-party-inspector/HeaderSection.tsx +54 -65
  84. package/src/authoring/first-party-inspector/is-first-party-selection.ts +30 -11
  85. package/src/authoring/first-party-inspector/register.tsx +13 -2
  86. package/src/authoring/ingest-authoring-adapter.ts +142 -45
  87. package/src/authoring/mount-failure-report.ts +5 -5
  88. package/src/authoring/provenance.ts +41 -0
  89. package/src/authoring/react-dom-authoring-adapter.ts +92 -92
  90. package/src/authoring/react-inspector-section.tsx +489 -51
  91. package/src/authoring/react-world-authoring-adapter.ts +541 -306
  92. package/src/authoring/story-overlay.ts +1 -1
  93. package/src/authoring/story-types.ts +11 -0
  94. package/src/authoring/vgai-scene-authoring-adapter.ts +54 -25
  95. package/src/authoring/viewport-tool-context.ts +78 -0
  96. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  97. package/src/authoring/world-hidden-viewport.ts +186 -0
  98. package/src/authoring/world-pan-state.ts +33 -17
  99. package/src/authoring/world-session-state.ts +1 -1
  100. package/src/authoring/world2d-authoring-adapter.ts +109 -52
  101. package/src/availability-tick.ts +56 -0
  102. package/src/browser-play-entry.ts +5 -5
  103. package/src/browser-project-scripts.ts +1 -0
  104. package/src/build-identity.ts +15 -0
  105. package/src/command-listener.ts +893 -19
  106. package/src/components/AlignToolbar.tsx +74 -63
  107. package/src/components/AppRoot.tsx +193 -26
  108. package/src/components/ApplicationMenus.tsx +272 -0
  109. package/src/components/AssetBrowser.tsx +1450 -293
  110. package/src/components/AssetEditorShell.tsx +141 -0
  111. package/src/components/AssetImportDetails.tsx +218 -0
  112. package/src/components/AssetLibraryPanel.tsx +14 -0
  113. package/src/components/CameraInfo.tsx +11 -20
  114. package/src/components/CenterDocuments.tsx +585 -0
  115. package/src/components/CommandPalette.tsx +75 -30
  116. package/src/components/ConsolePanel.css +55 -0
  117. package/src/components/ConsolePanel.tsx +57 -112
  118. package/src/components/DebugConsolePanel.tsx +461 -0
  119. package/src/components/DebuggerPanel.tsx +165 -0
  120. package/src/components/DefaultEditorLayout.tsx +167 -231
  121. package/src/components/GameHierarchy.tsx +873 -290
  122. package/src/components/GamePerformanceOverlay.tsx +46 -0
  123. package/src/components/HarnessChatPanel.tsx +2352 -0
  124. package/src/components/HistoryPanel.tsx +226 -0
  125. package/src/components/Inspector.tsx +153 -99
  126. package/src/components/InspectorToolSection.tsx +6 -4
  127. package/src/components/MountFailureBanner.tsx +31 -48
  128. package/src/components/NetworkSection.tsx +25 -14
  129. package/src/components/OnlineAssetBrowser.tsx +794 -343
  130. package/src/components/OverlayReportBanner.tsx +38 -64
  131. package/src/components/PerformancePanel.tsx +206 -0
  132. package/src/components/PlayBar.tsx +93 -263
  133. package/src/components/PrefabSaveDialog.tsx +55 -127
  134. package/src/components/ProjectHeader.css +60 -0
  135. package/src/components/ProjectHeader.tsx +170 -105
  136. package/src/components/ProjectScreen.tsx +246 -184
  137. package/src/components/ReactCanvasControls.tsx +185 -0
  138. package/src/components/ResolutionPicker.tsx +85 -0
  139. package/src/components/RootActivateDialog.tsx +39 -68
  140. package/src/components/SaveDialog.tsx +55 -127
  141. package/src/components/SaveStatus.tsx +11 -29
  142. package/src/components/StartupLoadingScreen.tsx +96 -0
  143. package/src/components/StateWatchPanel.tsx +302 -0
  144. package/src/components/StatsOverlay.tsx +12 -5
  145. package/src/components/StatusBar.tsx +64 -0
  146. package/src/components/ThemeManagerDialog.css +89 -0
  147. package/src/components/ThemeManagerDialog.tsx +371 -0
  148. package/src/components/ToolHost.tsx +26 -15
  149. package/src/components/Toolbar.tsx +117 -214
  150. package/src/components/VgaiVoxelLogo.tsx +89 -0
  151. package/src/components/ViewportOverlay.tsx +97 -172
  152. package/src/components/ViewportPanel.tsx +130 -31
  153. package/src/components/WorkspaceDock.tsx +891 -0
  154. package/src/components/WorldSelectionOverlay.tsx +51 -63
  155. package/src/components/WorldTextEditor.tsx +9 -5
  156. package/src/components/asset-documents.tsx +390 -0
  157. package/src/components/asset-editor-persistence.ts +44 -0
  158. package/src/components/asset-selection-section.tsx +338 -0
  159. package/src/components/asset-viewers/AudioViewer.tsx +73 -21
  160. package/src/components/asset-viewers/GenericJsonViewer.tsx +26 -11
  161. package/src/components/asset-viewers/ImageViewer.tsx +43 -11
  162. package/src/components/asset-viewers/InputMapViewer.tsx +512 -134
  163. package/src/components/asset-viewers/MaterialAssetEditor.tsx +540 -0
  164. package/src/components/asset-viewers/ModelViewer.tsx +805 -121
  165. package/src/components/asset-viewers/OnlineAssetDetail.tsx +177 -60
  166. package/src/components/asset-viewers/SourceAssetViewer.tsx +121 -0
  167. package/src/components/asset-workflow.css +506 -0
  168. package/src/components/build-documents.tsx +696 -0
  169. package/src/components/core-utilities.tsx +75 -0
  170. package/src/components/data-documents.tsx +364 -0
  171. package/src/components/{DataPanel.tsx → data-editor.tsx} +138 -288
  172. package/src/components/debugger-panel-state.ts +57 -0
  173. package/src/components/inspector-widgets/AlignmentGrid.tsx +8 -14
  174. package/src/components/inspector-widgets/BorderEditor.tsx +41 -33
  175. package/src/components/inspector-widgets/ColorPicker.tsx +39 -39
  176. package/src/components/inspector-widgets/FontPicker.tsx +13 -21
  177. package/src/components/inspector-widgets/GradientEditor.tsx +11 -19
  178. package/src/components/inspector-widgets/ScrubbableInput.tsx +6 -3
  179. package/src/components/inspector-widgets/ShadowEditor.tsx +20 -33
  180. package/src/components/inspector-widgets/shared.tsx +90 -49
  181. package/src/components/inspectors/AnimationSection.tsx +39 -40
  182. package/src/components/inspectors/AudioSection.tsx +28 -39
  183. package/src/components/inspectors/BoneAttachmentSection.tsx +19 -24
  184. package/src/components/inspectors/CameraSection.tsx +14 -23
  185. package/src/components/inspectors/ComponentsSection.tsx +39 -43
  186. package/src/components/inspectors/JointsSection.tsx +34 -43
  187. package/src/components/inspectors/LightSection.tsx +90 -35
  188. package/src/components/inspectors/MaterialSection.tsx +137 -174
  189. package/src/components/inspectors/MeshSection.tsx +9 -17
  190. package/src/components/inspectors/NavigationSection.tsx +8 -15
  191. package/src/components/inspectors/ParticleSection.tsx +91 -76
  192. package/src/components/inspectors/PhysicsSection.tsx +42 -46
  193. package/src/components/inspectors/PostProcessingSection.tsx +28 -36
  194. package/src/components/inspectors/RenderingSection.tsx +12 -20
  195. package/src/components/inspectors/ShadowSection.tsx +7 -8
  196. package/src/components/inspectors/SplineSection.tsx +31 -42
  197. package/src/components/inspectors/TransformSection.tsx +14 -22
  198. package/src/components/patterns/Dialog.tsx +95 -0
  199. package/src/components/patterns/Fields.tsx +44 -0
  200. package/src/components/patterns/List.tsx +25 -0
  201. package/src/components/patterns/StateSurface.tsx +40 -0
  202. package/src/components/patterns/Surfaces.tsx +115 -0
  203. package/src/components/patterns/Tabs.tsx +80 -0
  204. package/src/components/patterns/Toolbar.tsx +51 -0
  205. package/src/components/patterns/Tree.tsx +72 -0
  206. package/src/components/primitives/Button.tsx +46 -0
  207. package/src/components/primitives/ColorInput.tsx +11 -47
  208. package/src/components/primitives/EditorIcon.tsx +99 -0
  209. package/src/components/primitives/FormControls.tsx +71 -0
  210. package/src/components/primitives/JsonInput.tsx +15 -2
  211. package/src/components/primitives/Layout.tsx +100 -0
  212. package/src/components/primitives/Menu.tsx +105 -0
  213. package/src/components/primitives/NumberInput.tsx +8 -35
  214. package/src/components/primitives/Panel.tsx +49 -44
  215. package/src/components/primitives/SectionHeader.tsx +10 -28
  216. package/src/components/primitives/Text.tsx +46 -0
  217. package/src/components/primitives/Tooltip.tsx +20 -12
  218. package/src/components/primitives/Vec3Input.tsx +3 -0
  219. package/src/components/primitives/banner-tones.ts +33 -0
  220. package/src/components/primitives/editor-icons.ts +102 -0
  221. package/src/components/primitives/panel-header-styles.ts +30 -0
  222. package/src/components/project-operation-documents.tsx +226 -0
  223. package/src/components/status-contributions.tsx +175 -0
  224. package/src/components/story-documents-register.ts +15 -0
  225. package/src/components/story-documents.tsx +1185 -0
  226. package/src/components/tool-documents.tsx +110 -0
  227. package/src/components/workspace-dock.css +293 -0
  228. package/src/components/workspace-history.ts +33 -0
  229. package/src/components/world-documents.tsx +145 -0
  230. package/src/components/xstate-documents.tsx +209 -0
  231. package/src/composite-screenshot.ts +248 -0
  232. package/src/design-system/index.ts +70 -0
  233. package/src/design-system-stories/Foundation.stories.tsx +183 -0
  234. package/src/design-system-stories/Patterns.stories.tsx +251 -0
  235. package/src/design-system-stories/Workspace.stories.tsx +538 -0
  236. package/src/doctor/report.ts +57 -13
  237. package/src/editor-api.ts +295 -31
  238. package/src/editor-compatibility.ts +200 -0
  239. package/src/editor-console.ts +35 -17
  240. package/src/editor-hotkeys.ts +85 -33
  241. package/src/editor-store.ts +538 -233
  242. package/src/editor-viewport.ts +160 -34
  243. package/src/entity-factory.ts +14 -3
  244. package/src/gizmo-registry.ts +21 -5
  245. package/src/harness-chat-editor-context.ts +37 -0
  246. package/src/harness-chat-indicator.ts +68 -0
  247. package/src/harness-chat-layout.ts +53 -0
  248. package/src/harness-chat-lifecycle.ts +170 -0
  249. package/src/harness-chat-reconnect.ts +85 -0
  250. package/src/harness-chat-types.ts +409 -0
  251. package/src/hierarchy-drop.ts +50 -0
  252. package/src/hierarchy-expansion-state.ts +100 -0
  253. package/src/hierarchy-menu-registry.ts +1 -1
  254. package/src/hierarchy-projection.ts +76 -0
  255. package/src/history/editor-session.ts +21 -0
  256. package/src/history/history-commands.ts +147 -0
  257. package/src/history/history-service.ts +904 -0
  258. package/src/history/json-history-resource.ts +165 -0
  259. package/src/history/persistence-coordinator.ts +35 -0
  260. package/src/history/project-file-history.ts +266 -0
  261. package/src/history/project-root-history-backends.ts +53 -0
  262. package/src/history/resource-registry.ts +209 -0
  263. package/src/history/snapshot-store.ts +108 -0
  264. package/src/history/source-history-backend.ts +374 -0
  265. package/src/history/types.ts +100 -0
  266. package/src/hmr-registration-group.ts +67 -0
  267. package/src/hmr-stable-react-context.ts +23 -0
  268. package/src/hosted-example.ts +12 -2
  269. package/src/hotkeys.ts +89 -18
  270. package/src/ingest/discovery-react.ts +9 -10
  271. package/src/ingest/discovery.ts +4 -4
  272. package/src/ingest/discovery2d.ts +5 -5
  273. package/src/ingest/games/bloom-composer/vgai.game.json +3 -3
  274. package/src/ingest/games/embed-bundle/vgai.game.json +3 -3
  275. package/src/ingest/games/games-fps/vgai.game.json +3 -3
  276. package/src/ingest/games/iframe-reachable/vgai.game.json +3 -3
  277. package/src/ingest/games/interactive-cubes/vgai.game.json +3 -3
  278. package/src/ingest/games/mismatched-three/vgai.game.json +3 -3
  279. package/src/ingest/games/own-three-bundled/vgai.game.json +3 -3
  280. package/src/ingest/games/pointerlock-maze/vgai.game.json +7 -4
  281. package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +3 -3
  282. package/src/ingest/games-2d/bunnymark/vgai.game.json +3 -3
  283. package/src/ingest/games-2d/flappy/vgai.game.json +3 -3
  284. package/src/ingest/games-2d/flappy-pixi/vgai.game.json +3 -3
  285. package/src/ingest/games-2d/puzzling-potions/vgai.game.json +3 -3
  286. package/src/ingest/games-2d/tilemap-camera/vgai.game.json +3 -3
  287. package/src/ingest/games-react/react-rpg/vgai.game.json +3 -3
  288. package/src/ingest/types.ts +1 -1
  289. package/src/ingest-mode.ts +47 -52
  290. package/src/ingest-siblings.ts +23 -33
  291. package/src/initial-scene.ts +1 -2
  292. package/src/main.tsx +16 -8
  293. package/src/manifest-project.ts +10 -12
  294. package/src/model-thumbnail.ts +261 -26
  295. package/src/module-mode.ts +44 -50
  296. package/src/play-log-events.ts +26 -0
  297. package/src/play-mode.ts +495 -401
  298. package/src/play-scene-adoption.ts +23 -0
  299. package/src/playground/main.ts +68 -24
  300. package/src/playwright-shim.ts +473 -0
  301. package/src/project-manager.ts +90 -10
  302. package/src/project-operations.ts +112 -0
  303. package/src/project-story-discovery.ts +25 -0
  304. package/src/project-tool-discovery.ts +43 -0
  305. package/src/scene-serializer.ts +0 -6
  306. package/src/scene-sync.ts +7 -2
  307. package/src/script-loader.ts +3 -3
  308. package/src/skeleton-helper.ts +57 -0
  309. package/src/storage/seed.ts +68 -8
  310. package/src/stories/StoryPreviewMount.tsx +265 -0
  311. package/src/stories/action-stories.fixture.tsx +44 -0
  312. package/src/stories/button-stories.fixture.tsx +50 -0
  313. package/src/stories/compose-project-stories.ts +182 -0
  314. package/src/stories/loader-stories.fixture.tsx +53 -0
  315. package/src/stories/story-discovery.ts +130 -0
  316. package/src/stories/story-registry.ts +146 -0
  317. package/src/theme-css.ts +1049 -0
  318. package/src/theme-library.ts +238 -0
  319. package/src/theme-preference.ts +130 -0
  320. package/src/theme.ts +527 -0
  321. package/src/tool-loader.ts +80 -24
  322. package/src/ui-source/inspect.ts +27 -4
  323. package/src/ui-source/source-write-backend.ts +83 -22
  324. package/src/widgets/index.ts +9 -18
  325. package/src/workspace-aux-commands.ts +11 -0
  326. package/src/workspace-dock-controller.ts +64 -0
  327. package/src/workspace-document-ids.ts +5 -0
  328. package/src/workspace-document-registry.ts +367 -0
  329. package/src/workspace-state-persistence.ts +455 -0
  330. package/src/workspace-status-registry.ts +110 -0
  331. package/src/workspace-utility-commands.ts +49 -0
  332. package/src/workspace-utility-registry.ts +161 -0
  333. package/src/world-document-routing.ts +16 -0
  334. package/src/xstate-inspect/XStateMachineInspector.tsx +544 -0
  335. package/src/xstate-inspect/character-animation-machine.fixture.ts +74 -0
  336. package/src/xstate-inspect/use-live-actor-state.ts +39 -0
  337. package/src/xstate-inspect/xstate-graph.ts +265 -0
  338. package/src/xstate-inspect/xstate-layout.ts +76 -0
  339. package/src/z-index.ts +26 -0
  340. package/template/.claude/skills/editor/SKILL.md +129 -90
  341. package/template/AGENTS.md +1110 -0
  342. package/template/CLAUDE.md +1 -512
  343. package/template/IDIOMS.md +50 -0
  344. package/template/check-idioms.ts +706 -0
  345. package/template/manifest-entry-modules-plugin.ts +53 -0
  346. package/template/package.json +13 -4
  347. package/template/public/scenes/default.scn2d.json +6 -0
  348. package/template/public/scenes/default.vscn.json +7 -1
  349. package/template/public/scenes/untitled.vscn.json +10 -0
  350. package/template/scripts/playtest.ts +40 -0
  351. package/template/server/loopback.ts +75 -0
  352. package/template/server/rooms/arena-room.ts +69 -1
  353. package/template/server/rooms/game-room.ts +68 -1
  354. package/template/src/data/README.md +9 -4
  355. package/template/src/data/data-ref.ts +35 -0
  356. package/template/src/data/tuning.schema.ts +1 -1
  357. package/template/src/main.ts +41 -62
  358. package/template/src/manifest-entry-modules.d.ts +3 -0
  359. package/template/src/operations/README.md +88 -0
  360. package/template/src/runtime/pixi-adapter.ts +24 -0
  361. package/template/src/scripts/components/data-spinner.ts +43 -2
  362. package/template/src/scripts/components/spin-lap-math.ts +27 -0
  363. package/template/src/tools/README.md +5 -3
  364. package/template/src/tools/example.tool.tsx +13 -7
  365. package/template/src/ui/Button.stories.tsx +66 -0
  366. package/template/src/ui/RebindPanel.tsx +2 -6
  367. package/template/src/ui/game.tsx +17 -0
  368. package/template/tests/acceptance/example.spec.ts +64 -0
  369. package/template/tests/logic/example.test.ts +31 -0
  370. package/template/tests/logic/room.test.ts +100 -0
  371. package/template/tests/tsconfig.json +30 -0
  372. package/template/validate-manifest.ts +5 -5
  373. package/template/validate-scenes.ts +50 -18
  374. package/template/vgai.game.json +20 -13
  375. package/template/vite.config.ts +77 -16
  376. package/vite-plugin-ui-oid.ts +261 -17
  377. package/dist/assets/CCDIKSolver-Dz-ysxZF.js +0 -1
  378. package/dist/assets/SelectionBox-BXsv_6aH.js +0 -1
  379. package/dist/assets/browser-project-scripts-DOru4L1x.js +0 -2
  380. package/dist/assets/browserAll-CEkWYlFk.js +0 -1
  381. package/dist/assets/create-runtime-DYIWr3va.js +0 -1
  382. package/dist/assets/data-asset-Bb9sIM7i.js +0 -5
  383. package/dist/assets/game-8SDZPPgH.js +0 -1
  384. package/dist/assets/game-CevorxyV.js +0 -1
  385. package/dist/assets/game-Di7XlywD.js +0 -1
  386. package/dist/assets/game-DjnCaw8R.js +0 -1
  387. package/dist/assets/game-Q9A0aXSV.js +0 -1
  388. package/dist/assets/index-CPVV6pjw.js +0 -1
  389. package/dist/assets/index-CpOnYyeD.js +0 -213
  390. package/dist/assets/index-Dr8H_6Rl.js +0 -1
  391. package/dist/assets/index-_bCaipUk.js +0 -13650
  392. package/dist/assets/ingest-siblings-Dz8eEqrV.js +0 -1
  393. package/dist/assets/mount-manifest-Bhk0ohsl.js +0 -1
  394. package/dist/assets/scene-query-BivAHhJu.js +0 -1
  395. package/dist/assets/webworkerAll-BLrH0F6F.js +0 -1
  396. package/dist/assets/xstate-animation-binding-1NGLmw6y.js +0 -1
  397. package/dist/assets/xstate.esm-BgUD33nl.js +0 -3
  398. package/src/authoring/scene-ui-layer.ts +0 -485
  399. package/src/authoring/ui-authoring-adapter.ts +0 -325
  400. package/src/authoring/ui-hierarchy-menu.ts +0 -40
  401. package/src/authoring/ui-inspector-sections.tsx +0 -156
  402. package/src/authoring/undo-timeline.ts +0 -145
  403. package/src/components/BottomPanel.tsx +0 -326
  404. package/src/components/BuildPanel.tsx +0 -455
  405. package/src/components/FolderTree.tsx +0 -179
  406. package/src/components/RightPanel.tsx +0 -166
  407. package/src/components/WorldContextMenu.tsx +0 -257
  408. package/src/components/asset-viewers/AssetViewer.tsx +0 -38
  409. package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +0 -129
  410. package/src/scene-ui-mode/active-scene-ui.ts +0 -58
  411. package/src/scene-ui-mode/scene-ui-palette-panel.tsx +0 -152
  412. package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +0 -29
  413. package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +0 -74
  414. package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +0 -49
  415. package/src/scene-ui-mode/ui-prefab-io.ts +0 -76
  416. package/src/ui-editor/inspector.tsx +0 -563
  417. package/src/ui-editor/node-ops.ts +0 -266
  418. package/src/ui-editor/overlay.tsx +0 -380
  419. package/src/ui-editor/palette.tsx +0 -114
  420. package/src/ui-editor/react-store.ts +0 -78
  421. package/src/ui-editor/timeline-panel.tsx +0 -443
  422. package/src/ui-editor/ui-edit-store.ts +0 -552
  423. package/src/ui-editor/ui-prefab.ts +0 -95
  424. package/template/project.json +0 -9
  425. package/template/src/scripts/main.ts +0 -94
  426. package/template/src/ui/DefaultHud.tsx +0 -40
  427. package/template/src/ui/game-state.tsx +0 -37
  428. package/template/src/ui/mount-default-hud.tsx +0 -19
  429. package/template/src/ui/mount-ui.ts +0 -15
  430. package/vite-plugin-react-world-provider.ts +0 -81
package/src/theme.ts ADDED
@@ -0,0 +1,527 @@
1
+ /**
2
+ * Canonical design-token module for the vgai editor (editor-style-polish U0,
3
+ * `roadmaps/editor-style-polish/EDITOR-STYLE-AUDIT.md` §3 "Proposed Token
4
+ * Set"). Every color/spacing/radius/type/shadow/z-index value the editor's
5
+ * ~98 React components currently hand-roll as inline hex literals gets one
6
+ * home here. This module is imported by `theme-css.ts` (the injected global
7
+ * stylesheet) AND by plain TS/TSX call sites that still build inline `style`
8
+ * objects (e.g. `inspector-widgets/shared.tsx`, `primitives/Panel.tsx`) — so
9
+ * it must stay import-safe from any context: no DOM access, no side effects,
10
+ * just typed `const` data.
11
+ *
12
+ * The default theme values are the audit's §3 reconciliation decisions, not a fresh re-derive:
13
+ * accent is `#579EFF` (the plurality color actually on screen — 44 sites —
14
+ * NOT `inspector-widgets/shared.tsx`'s previously-independent `#3b82f6`,
15
+ * confined to 6 sites); the mono stack is the `ui-monospace` spelling with
16
+ * 2 independent votes, not `FONT_MONO`'s 1; the sans stack drops `'Inter'`
17
+ * (never loaded — zero `@font-face` hits repo-wide) in favor of the
18
+ * `-apple-system` chain already live in root `index.html`.
19
+ */
20
+
21
+ const GRAPHITE_BG = {
22
+ 0: '#1a1a1a',
23
+ 1: '#242424',
24
+ 2: '#2c2c2c',
25
+ 3: '#333333',
26
+ inset: '#1e1e1e',
27
+ } as const;
28
+ const GRAPHITE_BORDER = { 1: '#333333', 2: '#444444' } as const;
29
+ const GRAPHITE_TEXT = { 1: '#c5c8ce', 2: '#9aa0a6', 3: '#90959c' } as const;
30
+ const GRAPHITE_ACCENT = '#579EFF';
31
+ const GRAPHITE_ACCENT_MUTED = 'rgba(87,158,255,0.15)';
32
+ const GRAPHITE_DANGER = '#FF6B6B';
33
+ const GRAPHITE_WARN = '#e0a030';
34
+ const GRAPHITE_SUCCESS = '#4caf50';
35
+ const GRAPHITE_SUCCESS_MUTED = 'rgba(76,175,80,0.15)';
36
+ const GRAPHITE_DANGER_MUTED = 'rgba(255,107,107,0.15)';
37
+ const GRAPHITE_WARN_MUTED = 'rgba(224,160,48,0.12)';
38
+ const GRAPHITE_DANGER_FAINT = 'rgba(255,107,107,0.06)';
39
+ const GRAPHITE_SCRIM = 'rgba(0,0,0,0.5)';
40
+ const GRAPHITE_DYNAMIC = '#ff79c6';
41
+ const GRAPHITE_DYNAMIC_BG = 'rgba(255,121,198,0.08)';
42
+ const GRAPHITE_FONT_SANS = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif';
43
+ const GRAPHITE_FONT_MONO = 'ui-monospace, "SF Mono", Monaco, "Cascadia Code", monospace';
44
+ const GRAPHITE_SHADOW = {
45
+ sm: '0 2px 8px rgba(0,0,0,0.6)',
46
+ md: '0 4px 12px rgba(0,0,0,0.5)',
47
+ lg: '0 8px 32px rgba(0,0,0,0.6)',
48
+ } as const;
49
+
50
+ /**
51
+ * Compatibility references used by existing DOM call sites. They resolve at
52
+ * paint time, so the whole existing editor participates in runtime themes.
53
+ * New code should prefer the semantic {@link themeVars} vocabulary.
54
+ */
55
+ export const bg = {
56
+ /** App shell / loading screen (`AppRoot.tsx`, root `index.html` body). */
57
+ 0: 'var(--vgai-surface-shell)',
58
+ /** Panel body (`Panel.tsx`'s content area, THEME.bg). */
59
+ 1: 'var(--vgai-surface-panel)',
60
+ /** Surface: header / menu / dropdown / popover (THEME.surface). */
61
+ 2: 'var(--vgai-surface-chrome)',
62
+ /** Raised / hover surface (THEME.surfaceHover). */
63
+ 3: 'var(--vgai-surface-raised)',
64
+ /** Input well / recessed field background (THEME.inputBg). */
65
+ inset: 'var(--vgai-surface-inset)',
66
+ } as const;
67
+
68
+ /** Border ramp — same literal as `bg[3]` for `border[1]` by design (distinguished by CSS property, not value). */
69
+ export const border = {
70
+ /** Default border. */
71
+ 1: 'var(--vgai-boundary-default)',
72
+ /** Hover / emphasis border. */
73
+ 2: 'var(--vgai-boundary-strong)',
74
+ } as const;
75
+
76
+ /** Text ramp — primary → tertiary/dim. */
77
+ export const text = {
78
+ /** Primary text (THEME.text). */
79
+ 1: 'var(--vgai-content-primary)',
80
+ /** Secondary / muted text (THEME.textMuted). */
81
+ 2: 'var(--vgai-content-muted)',
82
+ /** Tertiary / dim text. */
83
+ 3: 'var(--vgai-content-dim)',
84
+ } as const;
85
+
86
+ /** Canonical accent blue — the plurality color across the whole editor (44 census hits). */
87
+ export const accent = 'var(--vgai-accent)';
88
+ /** Accent tint for hover/active backgrounds behind accent-colored content. */
89
+ export const accentMuted = 'var(--vgai-accent-muted)';
90
+
91
+ /** Semantic tones. */
92
+ export const danger = 'var(--vgai-danger)';
93
+ export const warn = 'var(--vgai-warn)';
94
+ export const success = 'var(--vgai-success)';
95
+
96
+ /**
97
+ * Semantic background tints (U6, punch-list #1) — one family alpha (0.15,
98
+ * matching `accentMuted`) for chip/band/state backgrounds behind
99
+ * semantic-colored content. Converges the drifted hand-rolled alphas
100
+ * (0.12/0.15) that U3-U5 left behind in EnvironmentSection (stale-bake),
101
+ * ConsolePanel (entity chip), HistoryPanel (error band), AudioSection
102
+ * (stop state), and Dockview's unsaved-document treatment.
103
+ */
104
+ export const successMuted = 'var(--vgai-success-muted)';
105
+ export const dangerMuted = 'var(--vgai-danger-muted)';
106
+ /** Resting warning surface used for unsaved/attention states. */
107
+ export const warnMuted = 'var(--vgai-warn-muted)';
108
+ /**
109
+ * Deliberately fainter danger tint for RESTING full-row backgrounds
110
+ * (ConsolePanel / DebugConsolePanel error rows): a run of consecutive error
111
+ * rows must read as a list, not a solid red wall, so rows sit at 0.06 while
112
+ * point-emphasis chips/bands use `dangerMuted`. Two files independently
113
+ * converged on this exact value — tokenized so they can't drift apart.
114
+ */
115
+ export const dangerFaint = 'var(--vgai-danger-faint)';
116
+
117
+ /**
118
+ * The one modal/backdrop dimming scrim. The canonical Dialog pattern and
119
+ * non-dialog modal surfaces share this semantic value.
120
+ */
121
+ export const scrim = 'var(--vgai-scrim)';
122
+
123
+ /** Kit-specific "reactive/bound value" indicator (inspector-widgets only — not otherwise contested). */
124
+ export const dynamic = 'var(--vgai-dynamic)';
125
+ export const dynamicBg = 'var(--vgai-dynamic-muted)';
126
+
127
+ /** 4/8-based spacing scale — compose padding/margin/gap from these instead of ad hoc shorthand strings. */
128
+ export const space = {
129
+ 1: 2,
130
+ 2: 4,
131
+ 3: 6,
132
+ 4: 8,
133
+ 5: 10,
134
+ 6: 12,
135
+ 8: 16,
136
+ 10: 20,
137
+ 12: 24,
138
+ } as const;
139
+
140
+ /**
141
+ * Semantic editor-chrome dimensions. Different roles intentionally use
142
+ * different heights, but every instance of a role must consume the same
143
+ * token instead of retyping a nearby number.
144
+ */
145
+ export const chromeSize = {
146
+ commandBar: 36,
147
+ panelHeader: 30,
148
+ localToolbar: 28,
149
+ treeRow: 24,
150
+ statusBar: 22,
151
+ } as const;
152
+
153
+ /** Reusable interactive-control heights. */
154
+ export const controlSize = {
155
+ compact: 20,
156
+ default: 24,
157
+ comfortable: 28,
158
+ } as const;
159
+
160
+ /** Resting boundaries stay quiet; interaction affordances may strengthen. */
161
+ export const strokeWidth = {
162
+ resting: 1,
163
+ active: 2,
164
+ } as const;
165
+
166
+ /** Named type scale (px). Covers the overwhelming majority of real fontSize call sites. */
167
+ export const fontSize = {
168
+ xs: 9,
169
+ sm: 10,
170
+ base: 11,
171
+ md: 12,
172
+ lg: 13,
173
+ xl: 14,
174
+ '2xl': 16,
175
+ heading: 24,
176
+ } as const;
177
+
178
+ export const fontWeight = {
179
+ regular: 400,
180
+ semibold: 600,
181
+ bold: 700,
182
+ } as const;
183
+
184
+ /**
185
+ * Sans stack — the fallback chain already live everywhere else (originally
186
+ * declared in root `index.html`). `'Inter'` is intentionally NOT included:
187
+ * no `@font-face`/`<link>` for it exists anywhere in `packages/editor`, so it
188
+ * only ever silently fell back to this same chain.
189
+ */
190
+ export const fontSans = 'var(--vgai-font-sans)';
191
+
192
+ /**
193
+ * Canonical mono stack — replaces `FONT_MONO`/`MONO`/18 bare `'monospace'`
194
+ * sites. This spelling had 2 independent votes in the codebase vs. 1 each
195
+ * for the others.
196
+ */
197
+ export const fontMono = 'var(--vgai-font-mono)';
198
+
199
+ const DEFAULT_RADIUS = {
200
+ small: '3px',
201
+ medium: '6px',
202
+ large: '8px',
203
+ full: '50%',
204
+ } as const;
205
+
206
+ /**
207
+ * Runtime border-radius references. Like the color compatibility exports,
208
+ * these resolve at paint time so existing product surfaces participate in a
209
+ * custom theme instead of freezing the Graphite defaults into inline styles.
210
+ */
211
+ export const radius = {
212
+ sm: 'var(--vgai-radius-sm)',
213
+ md: 'var(--vgai-radius-md)',
214
+ lg: 'var(--vgai-radius-lg)',
215
+ full: 'var(--vgai-radius-full)',
216
+ } as const;
217
+
218
+ /** Drop-shadow tiers. */
219
+ export const shadow = {
220
+ /** Tooltip tier. */
221
+ sm: 'var(--vgai-shadow-sm)',
222
+ /** Dropdown / menu tier — already the dominant value pre-token. */
223
+ md: 'var(--vgai-shadow-md)',
224
+ /** Modal tier. */
225
+ lg: 'var(--vgai-shadow-lg)',
226
+ } as const;
227
+
228
+ /**
229
+ * `1px solid <accent>` — apply via a global `:focus-visible` rule for
230
+ * `className`-based controls (see `theme-css.ts`), and via a shared
231
+ * `onFocus`/`onBlur` handler for inline-`style` components that can't
232
+ * express the pseudo-class directly (out of scope for U0 — later units).
233
+ */
234
+ export const focusRing = 'var(--vgai-focus-ring)';
235
+
236
+ /**
237
+ * Runtime editor-theme contract. The compatibility exports above are CSS
238
+ * references so existing DOM chrome themes at paint time; concrete defaults
239
+ * live in {@link graphiteDarkEditorTheme}. New DOM code should consume
240
+ * {@link themeVars}' semantic names.
241
+ */
242
+ export interface EditorTheme {
243
+ readonly id: string;
244
+ readonly color: {
245
+ readonly surface: {
246
+ readonly shell: string;
247
+ readonly panel: string;
248
+ readonly chrome: string;
249
+ readonly raised: string;
250
+ readonly inset: string;
251
+ /** Translucent editor HUD chrome drawn over a game/scene viewport. */
252
+ readonly overlay: string;
253
+ };
254
+ readonly boundary: { readonly default: string; readonly strong: string };
255
+ readonly content: {
256
+ readonly primary: string;
257
+ readonly muted: string;
258
+ readonly dim: string;
259
+ readonly onAccent: string;
260
+ };
261
+ readonly accent: { readonly default: string; readonly muted: string };
262
+ readonly semantic: {
263
+ readonly danger: string;
264
+ readonly dangerMuted: string;
265
+ readonly dangerFaint: string;
266
+ readonly warning: string;
267
+ readonly warningMuted: string;
268
+ readonly success: string;
269
+ readonly successMuted: string;
270
+ readonly dynamic: string;
271
+ readonly dynamicMuted: string;
272
+ };
273
+ readonly neutralOverlay: { readonly hover: string; readonly active: string };
274
+ readonly scrim: string;
275
+ };
276
+ readonly typography: { readonly sans: string; readonly mono: string };
277
+ readonly shape: {
278
+ readonly small: string;
279
+ readonly medium: string;
280
+ readonly large: string;
281
+ readonly full: string;
282
+ };
283
+ readonly elevation: { readonly small: string; readonly medium: string; readonly large: string };
284
+ }
285
+
286
+ export const graphiteDarkEditorTheme: EditorTheme = {
287
+ id: 'graphite-dark',
288
+ color: {
289
+ surface: {
290
+ shell: GRAPHITE_BG[0],
291
+ panel: GRAPHITE_BG[1],
292
+ chrome: GRAPHITE_BG[2],
293
+ raised: GRAPHITE_BG[3],
294
+ inset: GRAPHITE_BG.inset,
295
+ overlay: 'rgba(36,36,36,0.94)',
296
+ },
297
+ boundary: { default: GRAPHITE_BORDER[1], strong: GRAPHITE_BORDER[2] },
298
+ content: {
299
+ primary: GRAPHITE_TEXT[1],
300
+ muted: GRAPHITE_TEXT[2],
301
+ dim: GRAPHITE_TEXT[3],
302
+ onAccent: '#101820',
303
+ },
304
+ accent: { default: GRAPHITE_ACCENT, muted: GRAPHITE_ACCENT_MUTED },
305
+ semantic: {
306
+ danger: GRAPHITE_DANGER,
307
+ dangerMuted: GRAPHITE_DANGER_MUTED,
308
+ dangerFaint: GRAPHITE_DANGER_FAINT,
309
+ warning: GRAPHITE_WARN,
310
+ warningMuted: GRAPHITE_WARN_MUTED,
311
+ success: GRAPHITE_SUCCESS,
312
+ successMuted: GRAPHITE_SUCCESS_MUTED,
313
+ dynamic: GRAPHITE_DYNAMIC,
314
+ dynamicMuted: GRAPHITE_DYNAMIC_BG,
315
+ },
316
+ neutralOverlay: {
317
+ hover: 'rgba(255,255,255,0.08)',
318
+ active: 'rgba(255,255,255,0.14)',
319
+ },
320
+ scrim: GRAPHITE_SCRIM,
321
+ },
322
+ typography: { sans: GRAPHITE_FONT_SANS, mono: GRAPHITE_FONT_MONO },
323
+ shape: {
324
+ small: DEFAULT_RADIUS.small,
325
+ medium: DEFAULT_RADIUS.medium,
326
+ large: DEFAULT_RADIUS.large,
327
+ full: DEFAULT_RADIUS.full,
328
+ },
329
+ elevation: {
330
+ small: GRAPHITE_SHADOW.sm,
331
+ medium: GRAPHITE_SHADOW.md,
332
+ large: GRAPHITE_SHADOW.lg,
333
+ },
334
+ };
335
+
336
+ /**
337
+ * Production high-contrast theme. It deliberately preserves the editor's
338
+ * dark, low-glare character while increasing text/boundary separation and
339
+ * shifting the accent away from the default graphite palette.
340
+ */
341
+ export const midnightHighContrastEditorTheme: EditorTheme = {
342
+ id: 'midnight-high-contrast',
343
+ color: {
344
+ surface: {
345
+ shell: '#0b0f14',
346
+ panel: '#111821',
347
+ chrome: '#17212c',
348
+ raised: '#223040',
349
+ inset: '#080c11',
350
+ overlay: 'rgba(17,24,33,0.96)',
351
+ },
352
+ boundary: { default: '#34465a', strong: '#71869d' },
353
+ content: {
354
+ primary: '#f2f5f8',
355
+ muted: '#bdc8d5',
356
+ dim: '#8493a5',
357
+ onAccent: '#071019',
358
+ },
359
+ accent: { default: '#65d1ff', muted: 'rgba(101,209,255,0.18)' },
360
+ semantic: {
361
+ danger: '#ff7b86',
362
+ dangerMuted: 'rgba(255,123,134,0.18)',
363
+ dangerFaint: 'rgba(255,123,134,0.08)',
364
+ warning: '#f3c969',
365
+ warningMuted: 'rgba(243,201,105,0.16)',
366
+ success: '#62d394',
367
+ successMuted: 'rgba(98,211,148,0.18)',
368
+ dynamic: '#e889ff',
369
+ dynamicMuted: 'rgba(232,137,255,0.12)',
370
+ },
371
+ neutralOverlay: {
372
+ hover: 'rgba(255,255,255,0.10)',
373
+ active: 'rgba(255,255,255,0.18)',
374
+ },
375
+ scrim: 'rgba(0,0,0,0.68)',
376
+ },
377
+ typography: { sans: GRAPHITE_FONT_SANS, mono: GRAPHITE_FONT_MONO },
378
+ shape: { small: '3px', medium: '6px', large: '8px', full: '50%' },
379
+ elevation: {
380
+ small: '0 2px 8px rgba(0,0,0,0.72)',
381
+ medium: '0 6px 18px rgba(0,0,0,0.68)',
382
+ large: '0 12px 40px rgba(0,0,0,0.76)',
383
+ },
384
+ };
385
+
386
+ export const editorThemes = {
387
+ 'graphite-dark': graphiteDarkEditorTheme,
388
+ 'midnight-high-contrast': midnightHighContrastEditorTheme,
389
+ } as const satisfies Record<string, EditorTheme>;
390
+
391
+ export type EditorThemeId = keyof typeof editorThemes;
392
+
393
+ export function isEditorThemeId(value: unknown): value is EditorThemeId {
394
+ return typeof value === 'string' && Object.hasOwn(editorThemes, value);
395
+ }
396
+
397
+ /** Semantic CSS-variable references for rendered editor chrome. */
398
+ export const themeVars = {
399
+ surface: {
400
+ shell: 'var(--vgai-surface-shell)',
401
+ panel: 'var(--vgai-surface-panel)',
402
+ chrome: 'var(--vgai-surface-chrome)',
403
+ raised: 'var(--vgai-surface-raised)',
404
+ inset: 'var(--vgai-surface-inset)',
405
+ overlay: 'var(--vgai-surface-overlay)',
406
+ },
407
+ boundary: {
408
+ default: 'var(--vgai-boundary-default)',
409
+ strong: 'var(--vgai-boundary-strong)',
410
+ },
411
+ content: {
412
+ primary: 'var(--vgai-content-primary)',
413
+ muted: 'var(--vgai-content-muted)',
414
+ dim: 'var(--vgai-content-dim)',
415
+ onAccent: 'var(--vgai-content-on-accent)',
416
+ },
417
+ accent: {
418
+ default: 'var(--vgai-accent)',
419
+ muted: 'var(--vgai-accent-muted)',
420
+ },
421
+ semantic: {
422
+ danger: 'var(--vgai-danger)',
423
+ dangerMuted: 'var(--vgai-danger-muted)',
424
+ dangerFaint: 'var(--vgai-danger-faint)',
425
+ warning: 'var(--vgai-warn)',
426
+ warningMuted: 'var(--vgai-warn-muted)',
427
+ success: 'var(--vgai-success)',
428
+ successMuted: 'var(--vgai-success-muted)',
429
+ dynamic: 'var(--vgai-dynamic)',
430
+ dynamicMuted: 'var(--vgai-dynamic-muted)',
431
+ },
432
+ neutralOverlay: {
433
+ hover: 'var(--vgai-neutral-hover)',
434
+ active: 'var(--vgai-neutral-active)',
435
+ },
436
+ scrim: 'var(--vgai-scrim)',
437
+ typography: {
438
+ sans: 'var(--vgai-font-sans)',
439
+ mono: 'var(--vgai-font-mono)',
440
+ },
441
+ shape: {
442
+ small: 'var(--vgai-radius-sm)',
443
+ medium: 'var(--vgai-radius-md)',
444
+ large: 'var(--vgai-radius-lg)',
445
+ full: 'var(--vgai-radius-full)',
446
+ },
447
+ elevation: {
448
+ small: 'var(--vgai-shadow-sm)',
449
+ medium: 'var(--vgai-shadow-md)',
450
+ large: 'var(--vgai-shadow-lg)',
451
+ },
452
+ focusRing: 'var(--vgai-focus-ring)',
453
+ } as const;
454
+
455
+ export type EditorThemeVariable = `--vgai-${string}`;
456
+
457
+ /** Theme-derived native-select artwork; data URIs cannot inherit CSS `color`. */
458
+ function chevronDataUri(color: string): string {
459
+ const svg =
460
+ `<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'>` +
461
+ `<path d='M1 1L5 5L9 1' stroke='${color}' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/>` +
462
+ `</svg>`;
463
+ return `url("data:image/svg+xml,${encodeURIComponent(svg)}")`;
464
+ }
465
+
466
+ /** Map one typed theme to the semantic variables consumed by editor chrome. */
467
+ export function editorThemeVariables(theme: EditorTheme): Record<EditorThemeVariable, string> {
468
+ return {
469
+ '--vgai-surface-shell': theme.color.surface.shell,
470
+ '--vgai-surface-panel': theme.color.surface.panel,
471
+ '--vgai-surface-chrome': theme.color.surface.chrome,
472
+ '--vgai-surface-raised': theme.color.surface.raised,
473
+ '--vgai-surface-inset': theme.color.surface.inset,
474
+ '--vgai-surface-overlay': theme.color.surface.overlay,
475
+ '--vgai-boundary-default': theme.color.boundary.default,
476
+ '--vgai-boundary-strong': theme.color.boundary.strong,
477
+ '--vgai-content-primary': theme.color.content.primary,
478
+ '--vgai-content-muted': theme.color.content.muted,
479
+ '--vgai-content-dim': theme.color.content.dim,
480
+ '--vgai-content-on-accent': theme.color.content.onAccent,
481
+ '--vgai-accent': theme.color.accent.default,
482
+ '--vgai-accent-muted': theme.color.accent.muted,
483
+ '--vgai-danger': theme.color.semantic.danger,
484
+ '--vgai-danger-muted': theme.color.semantic.dangerMuted,
485
+ '--vgai-danger-faint': theme.color.semantic.dangerFaint,
486
+ '--vgai-warn': theme.color.semantic.warning,
487
+ '--vgai-warn-muted': theme.color.semantic.warningMuted,
488
+ '--vgai-success': theme.color.semantic.success,
489
+ '--vgai-success-muted': theme.color.semantic.successMuted,
490
+ '--vgai-dynamic': theme.color.semantic.dynamic,
491
+ '--vgai-dynamic-muted': theme.color.semantic.dynamicMuted,
492
+ '--vgai-neutral-hover': theme.color.neutralOverlay.hover,
493
+ '--vgai-neutral-active': theme.color.neutralOverlay.active,
494
+ '--vgai-scrim': theme.color.scrim,
495
+ '--vgai-font-sans': theme.typography.sans,
496
+ '--vgai-font-mono': theme.typography.mono,
497
+ '--vgai-radius-sm': theme.shape.small,
498
+ '--vgai-radius-md': theme.shape.medium,
499
+ '--vgai-radius-lg': theme.shape.large,
500
+ '--vgai-radius-full': theme.shape.full,
501
+ '--vgai-shadow-sm': theme.elevation.small,
502
+ '--vgai-shadow-md': theme.elevation.medium,
503
+ '--vgai-shadow-lg': theme.elevation.large,
504
+ '--vgai-focus-ring': `1px solid ${theme.color.accent.default}`,
505
+ '--vgai-select-chevron': chevronDataUri(theme.color.content.muted),
506
+ };
507
+ }
508
+
509
+ export const EDITOR_THEME_CLASS = 'vgai-editor-theme';
510
+
511
+ /** Install or switch a theme on one editor-chrome root. */
512
+ export function applyEditorTheme(
513
+ root: HTMLElement,
514
+ theme: EditorTheme = graphiteDarkEditorTheme,
515
+ ): void {
516
+ root.classList.add(EDITOR_THEME_CLASS);
517
+ root.dataset['vgaiTheme'] = theme.id;
518
+ for (const [name, value] of Object.entries(editorThemeVariables(theme))) {
519
+ root.style.setProperty(name, value);
520
+ }
521
+ }
522
+
523
+ /**
524
+ * Re-exported from `z-index.ts` so callers can import either module for the
525
+ * full token set. See that file's own doc comment for the scale rationale.
526
+ */
527
+ export { zIndex } from './z-index';