@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
@@ -0,0 +1,371 @@
1
+ import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
2
+ import {
3
+ Button,
4
+ ColorSwatchInput,
5
+ Dialog,
6
+ DialogField,
7
+ DialogFieldLabel,
8
+ DialogFooter,
9
+ DialogHeader,
10
+ type EditorTheme,
11
+ FileInput,
12
+ Inline,
13
+ Stack,
14
+ Text,
15
+ TextInput,
16
+ } from '../design-system';
17
+ import {
18
+ CUSTOM_EDITOR_THEME_SCHEMA_VERSION,
19
+ type CustomEditorThemeDocument,
20
+ deleteCustomEditorTheme,
21
+ duplicateEditorTheme,
22
+ editorThemeLibrarySnapshot,
23
+ importCustomEditorTheme,
24
+ saveCustomEditorTheme,
25
+ subscribeEditorThemeLibrary,
26
+ } from '../theme-library';
27
+ import {
28
+ clearEditorThemePreview,
29
+ DEFAULT_EDITOR_THEME_ID,
30
+ editorThemeSnapshot,
31
+ previewEditorTheme,
32
+ setEditorThemePreference,
33
+ } from '../theme-preference';
34
+ import './ThemeManagerDialog.css';
35
+
36
+ interface ThemeManagerDialogProps {
37
+ onClose: () => void;
38
+ }
39
+
40
+ interface ThemeField {
41
+ readonly label: string;
42
+ readonly path: string;
43
+ }
44
+
45
+ interface ThemeFieldGroup {
46
+ readonly title: string;
47
+ readonly fields: readonly ThemeField[];
48
+ }
49
+
50
+ const FIELD_GROUPS: readonly ThemeFieldGroup[] = [
51
+ {
52
+ title: 'Surfaces',
53
+ fields: [
54
+ { label: 'Shell', path: 'color.surface.shell' },
55
+ { label: 'Panel', path: 'color.surface.panel' },
56
+ { label: 'Chrome', path: 'color.surface.chrome' },
57
+ { label: 'Raised', path: 'color.surface.raised' },
58
+ { label: 'Inset', path: 'color.surface.inset' },
59
+ { label: 'Viewport overlay', path: 'color.surface.overlay' },
60
+ ],
61
+ },
62
+ {
63
+ title: 'Content & boundaries',
64
+ fields: [
65
+ { label: 'Primary text', path: 'color.content.primary' },
66
+ { label: 'Muted text', path: 'color.content.muted' },
67
+ { label: 'Dim text', path: 'color.content.dim' },
68
+ { label: 'Text on accent', path: 'color.content.onAccent' },
69
+ { label: 'Default boundary', path: 'color.boundary.default' },
70
+ { label: 'Strong boundary', path: 'color.boundary.strong' },
71
+ { label: 'Hover overlay', path: 'color.neutralOverlay.hover' },
72
+ { label: 'Active overlay', path: 'color.neutralOverlay.active' },
73
+ { label: 'Modal scrim', path: 'color.scrim' },
74
+ ],
75
+ },
76
+ {
77
+ title: 'Accent & status',
78
+ fields: [
79
+ { label: 'Accent', path: 'color.accent.default' },
80
+ { label: 'Accent tint', path: 'color.accent.muted' },
81
+ { label: 'Danger', path: 'color.semantic.danger' },
82
+ { label: 'Danger tint', path: 'color.semantic.dangerMuted' },
83
+ { label: 'Danger row', path: 'color.semantic.dangerFaint' },
84
+ { label: 'Warning', path: 'color.semantic.warning' },
85
+ { label: 'Warning tint', path: 'color.semantic.warningMuted' },
86
+ { label: 'Success', path: 'color.semantic.success' },
87
+ { label: 'Success tint', path: 'color.semantic.successMuted' },
88
+ { label: 'Dynamic', path: 'color.semantic.dynamic' },
89
+ { label: 'Dynamic tint', path: 'color.semantic.dynamicMuted' },
90
+ ],
91
+ },
92
+ {
93
+ title: 'Typography',
94
+ fields: [
95
+ { label: 'Interface font', path: 'typography.sans' },
96
+ { label: 'Monospace font', path: 'typography.mono' },
97
+ ],
98
+ },
99
+ {
100
+ title: 'Shape & elevation',
101
+ fields: [
102
+ { label: 'Small radius', path: 'shape.small' },
103
+ { label: 'Medium radius', path: 'shape.medium' },
104
+ { label: 'Large radius', path: 'shape.large' },
105
+ { label: 'Round radius', path: 'shape.full' },
106
+ { label: 'Small shadow', path: 'elevation.small' },
107
+ { label: 'Medium shadow', path: 'elevation.medium' },
108
+ { label: 'Large shadow', path: 'elevation.large' },
109
+ ],
110
+ },
111
+ ];
112
+
113
+ function themeValue(theme: EditorTheme, path: string): string {
114
+ let value: unknown = theme;
115
+ for (const key of path.split('.')) value = (value as Record<string, unknown>)[key];
116
+ return value as string;
117
+ }
118
+
119
+ function withThemeValue(theme: EditorTheme, path: string, value: string): EditorTheme {
120
+ const next = structuredClone(theme) as unknown as Record<string, unknown>;
121
+ const keys = path.split('.');
122
+ let target = next;
123
+ for (const key of keys.slice(0, -1)) target = target[key] as Record<string, unknown>;
124
+ target[keys.at(-1)!] = value;
125
+ return next as unknown as EditorTheme;
126
+ }
127
+
128
+ function ThemeValueInput({
129
+ disabled,
130
+ path,
131
+ theme,
132
+ onChange,
133
+ }: {
134
+ disabled: boolean;
135
+ path: string;
136
+ theme: EditorTheme;
137
+ onChange: (theme: EditorTheme) => void;
138
+ }) {
139
+ const value = themeValue(theme, path);
140
+ const isColor = path.startsWith('color.');
141
+ const hasNativeSwatch = /^#[0-9a-f]{6}$/i.test(value);
142
+ return (
143
+ <Inline className="vgai-theme-value" gap={2} align="center">
144
+ {isColor &&
145
+ (hasNativeSwatch ? (
146
+ <ColorSwatchInput
147
+ aria-label={`${path} color`}
148
+ disabled={disabled}
149
+ value={value}
150
+ onChange={(event) => onChange(withThemeValue(theme, path, event.target.value))}
151
+ className="vgai-theme-swatch-input"
152
+ />
153
+ ) : (
154
+ <span
155
+ role="img"
156
+ aria-label={`${path} preview`}
157
+ className="vgai-theme-swatch-preview"
158
+ style={{ background: value }}
159
+ />
160
+ ))}
161
+ <TextInput
162
+ aria-label={path}
163
+ disabled={disabled}
164
+ value={value}
165
+ onChange={(event) => onChange(withThemeValue(theme, path, event.target.value))}
166
+ />
167
+ </Inline>
168
+ );
169
+ }
170
+
171
+ function downloadTheme(themeDocument: CustomEditorThemeDocument): void {
172
+ const blob = new Blob([`${JSON.stringify(themeDocument, null, 2)}\n`], {
173
+ type: 'application/json',
174
+ });
175
+ const url = URL.createObjectURL(blob);
176
+ const anchor = document.createElement('a');
177
+ anchor.href = url;
178
+ anchor.download = `${themeDocument.name.toLowerCase().replace(/[^a-z0-9]+/g, '-') || 'vgai-theme'}.vgai-theme.json`;
179
+ anchor.click();
180
+ URL.revokeObjectURL(url);
181
+ }
182
+
183
+ export function ThemeManagerDialog({ onClose }: ThemeManagerDialogProps) {
184
+ const choices = useSyncExternalStore(
185
+ subscribeEditorThemeLibrary,
186
+ editorThemeLibrarySnapshot,
187
+ editorThemeLibrarySnapshot,
188
+ );
189
+ const currentId = editorThemeSnapshot();
190
+ const initial = choices.find((choice) => choice.id === currentId) ?? choices[0]!;
191
+ const [selectedId, setSelectedId] = useState(initial.id);
192
+ const [name, setName] = useState(initial.name);
193
+ const [draft, setDraft] = useState<EditorTheme>(() => structuredClone(initial.theme));
194
+ const [message, setMessage] = useState<string | null>(null);
195
+ const fileRef = useRef<HTMLInputElement>(null);
196
+ const selected = choices.find((choice) => choice.id === selectedId) ?? initial;
197
+ const editable = selected.kind === 'custom';
198
+
199
+ useEffect(() => {
200
+ previewEditorTheme(draft);
201
+ return clearEditorThemePreview;
202
+ }, [draft]);
203
+
204
+ useEffect(() => {
205
+ const onKeyDown = (event: KeyboardEvent) => {
206
+ if (event.key !== 'Escape') return;
207
+ event.preventDefault();
208
+ onClose();
209
+ };
210
+ window.addEventListener('keydown', onKeyDown);
211
+ return () => window.removeEventListener('keydown', onKeyDown);
212
+ }, [onClose]);
213
+
214
+ const exportDocument = useMemo<CustomEditorThemeDocument>(
215
+ () => ({ schemaVersion: CUSTOM_EDITOR_THEME_SCHEMA_VERSION, name, theme: draft }),
216
+ [draft, name],
217
+ );
218
+
219
+ const setChoice = (choice: (typeof choices)[number]) => {
220
+ setSelectedId(choice.id);
221
+ setName(choice.name);
222
+ setDraft(structuredClone(choice.theme));
223
+ setMessage(null);
224
+ };
225
+
226
+ const chooseTheme = (id: string) => {
227
+ const choice = choices.find((candidate) => candidate.id === id);
228
+ if (choice) setChoice(choice);
229
+ };
230
+
231
+ const duplicate = () => {
232
+ const created = duplicateEditorTheme(selected.id);
233
+ setChoice(created);
234
+ setMessage('Custom copy created.');
235
+ };
236
+
237
+ const saveAndUse = () => {
238
+ try {
239
+ if (editable) saveCustomEditorTheme({ ...exportDocument, name: name.trim() });
240
+ clearEditorThemePreview();
241
+ setEditorThemePreference(selected.id);
242
+ onClose();
243
+ } catch (error) {
244
+ setMessage(error instanceof Error ? error.message : String(error));
245
+ }
246
+ };
247
+
248
+ return (
249
+ <Dialog
250
+ labelledBy="theme-manager-title"
251
+ onDismiss={onClose}
252
+ size="wide"
253
+ data-testid="theme-manager-dialog"
254
+ >
255
+ <DialogHeader
256
+ titleId="theme-manager-title"
257
+ title="Editor Themes"
258
+ description="Customize editor chrome only. Game worlds and authored UI keep their own design tokens."
259
+ />
260
+ <Inline className="vgai-theme-manager-content">
261
+ <aside aria-label="Available themes" className="vgai-theme-list">
262
+ {choices.map((choice) => (
263
+ <Button
264
+ key={choice.id}
265
+ variant="ghost"
266
+ aria-pressed={selectedId === choice.id}
267
+ onClick={() => chooseTheme(choice.id)}
268
+ className="vgai-theme-choice"
269
+ >
270
+ <Text variant="label" truncate>
271
+ {choice.name}
272
+ </Text>
273
+ <Text variant="caption" tone="dim">
274
+ {choice.kind === 'built-in' ? 'Built in' : 'Custom'}
275
+ </Text>
276
+ </Button>
277
+ ))}
278
+ <Button onClick={duplicate} className="vgai-theme-list-action">
279
+ Duplicate Theme
280
+ </Button>
281
+ <Button onClick={() => fileRef.current?.click()} className="vgai-theme-list-action">
282
+ Import JSON…
283
+ </Button>
284
+ <FileInput
285
+ ref={fileRef}
286
+ accept="application/json,.json"
287
+ hidden
288
+ onChange={async (event) => {
289
+ const file = event.target.files?.[0];
290
+ event.target.value = '';
291
+ if (!file) return;
292
+ try {
293
+ const imported = importCustomEditorTheme(JSON.parse(await file.text()));
294
+ setChoice(imported);
295
+ setMessage('Theme imported.');
296
+ } catch (error) {
297
+ setMessage(error instanceof Error ? error.message : String(error));
298
+ }
299
+ }}
300
+ />
301
+ </aside>
302
+
303
+ <div role="region" aria-label="Theme tokens" className="vgai-theme-tokens">
304
+ <Inline className="vgai-theme-name-row" gap={4} align="end">
305
+ <DialogField className="vgai-theme-name-field">
306
+ <DialogFieldLabel>Theme name</DialogFieldLabel>
307
+ <TextInput
308
+ disabled={!editable}
309
+ value={name}
310
+ onChange={(event) => setName(event.target.value)}
311
+ />
312
+ </DialogField>
313
+ <Button onClick={() => downloadTheme(exportDocument)}>Export JSON</Button>
314
+ {editable && (
315
+ <Button
316
+ variant="danger"
317
+ onClick={() => {
318
+ if (editorThemeSnapshot() === selected.id)
319
+ setEditorThemePreference(DEFAULT_EDITOR_THEME_ID);
320
+ deleteCustomEditorTheme(selected.id);
321
+ chooseTheme(DEFAULT_EDITOR_THEME_ID);
322
+ setMessage('Custom theme deleted.');
323
+ }}
324
+ >
325
+ Delete
326
+ </Button>
327
+ )}
328
+ </Inline>
329
+
330
+ {!editable && (
331
+ <Text as="p" tone="muted" className="vgai-theme-readonly-note">
332
+ Built-in themes are read-only. Duplicate this theme to customize every token.
333
+ </Text>
334
+ )}
335
+
336
+ {FIELD_GROUPS.map((group) => (
337
+ <Stack key={group.title} className="vgai-theme-group" gap={4}>
338
+ <Text as="h3" variant="title">
339
+ {group.title}
340
+ </Text>
341
+ <div className="vgai-theme-field-grid">
342
+ {group.fields.map((field) => (
343
+ <DialogField key={field.path}>
344
+ <DialogFieldLabel>{field.label}</DialogFieldLabel>
345
+ <ThemeValueInput
346
+ disabled={!editable}
347
+ path={field.path}
348
+ theme={draft}
349
+ onChange={setDraft}
350
+ />
351
+ </DialogField>
352
+ ))}
353
+ </div>
354
+ </Stack>
355
+ ))}
356
+ </div>
357
+ </Inline>
358
+ <DialogFooter>
359
+ {message && (
360
+ <Text role="status" tone="muted" className="vgai-theme-message">
361
+ {message}
362
+ </Text>
363
+ )}
364
+ <Button onClick={onClose}>Cancel</Button>
365
+ <Button variant="primary" disabled={editable && !name.trim()} onClick={saveAndUse}>
366
+ {editable ? 'Save & Use' : 'Use Theme'}
367
+ </Button>
368
+ </DialogFooter>
369
+ </Dialog>
370
+ );
371
+ }
@@ -1,12 +1,14 @@
1
+ import { space, themeVars } from '../design-system';
1
2
  /**
2
- * Dock-tool host (W4, docs/DATA-TOOLS-DESIGN.md §3.2/§3.4) — renders one
3
- * project tool's component inside the bottom dock, wrapped in an error
4
- * boundary: tools are PROJECT code running in the editor (§4's trust note),
5
- * and a crashing tool must never take the editor down with it. A render
6
- * crash swaps the panel content for a teaching message naming the source
7
- * file; the tab, and every other tool, keep working. An HMR reload of the
8
- * tool remounts the host fresh (`BottomPanel` keys it on the load version),
9
- * which also clears a tripped boundary — fix the file, save, retry for free.
3
+ * Project-global tool host (W4, docs/DATA-TOOLS-DESIGN.md §3.2/§3.4; re-homed
4
+ * by workspace-shell W3) — renders one project tool's component wrapped in an
5
+ * error boundary: tools are PROJECT code running in the editor (§4's trust
6
+ * note), and a crashing tool must never take the editor down with it. A
7
+ * render crash swaps the content for a teaching message naming the source
8
+ * file; every other tool keeps working. An HMR reload of the tool remounts
9
+ * the host fresh (its hosts key it on the load version — see
10
+ * `tool-documents.tsx` and `tool-loader.ts`'s utility registrations), which
11
+ * also clears a tripped boundary — fix the file, save, retry for free.
10
12
  *
11
13
  * Chrome stays editor-styled (§3.4): the host provides the scrollable
12
14
  * editor-toned container; whatever the tool renders inside is its own
@@ -14,7 +16,7 @@
14
16
  */
15
17
 
16
18
  import { Component, type ErrorInfo, type ReactNode } from 'react';
17
- import type { DockTool } from '../tool-loader';
19
+ import type { GlobalTool } from '../tool-loader';
18
20
 
19
21
  interface ToolErrorBoundaryProps {
20
22
  /** Project-relative source file, shown in the crash message. */
@@ -49,12 +51,19 @@ export class ToolErrorBoundary extends Component<ToolErrorBoundaryProps, ToolErr
49
51
  override render(): ReactNode {
50
52
  if (this.state.error) {
51
53
  return (
52
- <div style={{ padding: 12, fontSize: 12, color: '#FF6B6B', maxWidth: 640 }}>
53
- <div style={{ fontWeight: 600, marginBottom: 4 }}>
54
+ <div
55
+ style={{
56
+ padding: space[6],
57
+ fontSize: 'var(--vgai-font-md)',
58
+ color: themeVars.semantic.danger,
59
+ maxWidth: 640,
60
+ }}
61
+ >
62
+ <div style={{ fontWeight: 600, marginBottom: space[2] }}>
54
63
  Tool crashed: <code>{this.props.file}</code>
55
64
  </div>
56
65
  <div style={{ whiteSpace: 'pre-wrap' }}>{String(this.state.error)}</div>
57
- <div style={{ color: '#8c8c8c', marginTop: 6 }}>
66
+ <div style={{ color: themeVars.content.muted, marginTop: space[3] }}>
58
67
  The editor is fine — fix the tool file and save; it reloads in place.
59
68
  </div>
60
69
  </div>
@@ -64,13 +73,15 @@ export class ToolErrorBoundary extends Component<ToolErrorBoundaryProps, ToolErr
64
73
  }
65
74
  }
66
75
 
67
- /** One dock tool's panel content: editor-styled scroll container + boundary. */
68
- export function ToolHost({ tool }: { tool: DockTool }) {
76
+ /** One project-global tool's content host: editor-styled scroll container +
77
+ * boundary. Rendered by a center tool DOCUMENT (`tool-documents.tsx`) or a
78
+ * utility-placement registration (`tool-loader.ts`) since W3. */
79
+ export function ToolHost({ tool }: { tool: GlobalTool }) {
69
80
  const ToolComponent = tool.Component;
70
81
  return (
71
82
  <div
72
83
  data-testid={`tool-panel-${tool.id}`}
73
- style={{ flex: 1, minHeight: 0, overflow: 'auto', color: '#c5c8ce' }}
84
+ style={{ flex: 1, minHeight: 0, overflow: 'auto', color: themeVars.content.primary }}
74
85
  >
75
86
  <ToolErrorBoundary file={tool.file}>
76
87
  <ToolComponent />