@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
@@ -16,6 +16,15 @@
16
16
  * `begin`/`apply`/`end` bracket per node (spec:301 "one undo step each").
17
17
  */
18
18
  import type { AuthoringAdapter } from '@engine/adapter';
19
+ import type { IconDefinition } from '@fortawesome/fontawesome-svg-core';
20
+ import {
21
+ faAlignCenter,
22
+ faAlignLeft,
23
+ faAlignRight,
24
+ faGripLines,
25
+ faGripLinesVertical,
26
+ } from '@fortawesome/free-solid-svg-icons';
27
+ import { EditorIcon, IconButton, themeVars, zIndex } from '../design-system';
19
28
  import {
20
29
  type AlignEntry,
21
30
  type AlignOp,
@@ -35,10 +44,8 @@ export interface AlignToolbarProps {
35
44
  entries: readonly AlignEntry[];
36
45
  }
37
46
 
38
- const TOOLBAR_BG = '#2c2c2c';
39
- const TOOLBAR_BORDER = '#444';
40
- const BTN_HOVER = '#3a3a3a';
41
-
47
+ const TOOLBAR_BG = themeVars.surface.chrome;
48
+ const TOOLBAR_BORDER = themeVars.boundary.strong;
42
49
  /** Route every {@link AlignTarget} through its owning `boxEdit`
43
50
  * (begin/apply/end — one undo step per node, per B1/D-1) — the ONE place
44
51
  * align/distribute clicks touch the adapter contract. Targets whose owner
@@ -59,59 +66,59 @@ function commitAlignTargets(adapter: AuthoringAdapter, targets: readonly AlignTa
59
66
  }
60
67
  }
61
68
 
62
- function toolbarButtonStyle(): React.CSSProperties {
63
- return {
64
- width: 26,
65
- height: 22,
66
- border: 'none',
67
- background: 'transparent',
68
- color: '#c5c8ce',
69
- cursor: 'pointer',
70
- fontSize: 12,
71
- borderRadius: 3,
72
- display: 'flex',
73
- alignItems: 'center',
74
- justifyContent: 'center',
75
- };
76
- }
77
-
78
- function hoverHandlers(): {
79
- onMouseEnter: (e: React.MouseEvent<HTMLButtonElement>) => void;
80
- onMouseLeave: (e: React.MouseEvent<HTMLButtonElement>) => void;
81
- } {
82
- return {
83
- onMouseEnter: (e) => {
84
- (e.currentTarget as HTMLButtonElement).style.background = BTN_HOVER;
85
- },
86
- onMouseLeave: (e) => {
87
- (e.currentTarget as HTMLButtonElement).style.background = 'transparent';
88
- },
89
- };
90
- }
91
-
92
- const ALIGN_BUTTONS: ReadonlyArray<{ op: AlignOp; testId: string; label: string; glyph: string }> =
93
- [
94
- { op: 'left', testId: 'align-left', label: 'Align left', glyph: '⊢' },
95
- { op: 'hcenter', testId: 'align-hcenter', label: 'Align horizontal center', glyph: '⊣⊢' },
96
- { op: 'right', testId: 'align-right', label: 'Align right', glyph: '⊣' },
97
- { op: 'top', testId: 'align-top', label: 'Align top', glyph: '⊤' },
98
- { op: 'vcenter', testId: 'align-vcenter', label: 'Align vertical center', glyph: '⊥⊤' },
99
- { op: 'bottom', testId: 'align-bottom', label: 'Align bottom', glyph: '⊥' },
100
- ];
69
+ /**
70
+ * L-7 — every other icon in this rail is a FontAwesome glyph; this toolbar
71
+ * was the one holdout still rendering raw Unicode math symbols (`⊢`, `⊣⊢`,
72
+ * `⊤`, `⇔`, …), which clash in weight/centering with the FA icon language
73
+ * used everywhere else. FontAwesome Free's solid set has no dedicated
74
+ * object-bbox align/distribute icons (only the 4 paragraph-align glyphs;
75
+ * verified — no `faDistribute*`/`faAlignTop`/etc. exist in
76
+ * `@fortawesome/free-solid-svg-icons`), so the vertical variants reuse the
77
+ * horizontal align glyphs rotated 90° (`rotate` below) — the same technique
78
+ * several icon sets use to derive a vertical-align glyph from a horizontal
79
+ * one — and distribute reuses the evenly-spaced-bars grip glyphs. Still a
80
+ * strict style-only swap: same meaning, same button size, one consistent
81
+ * icon family instead of a second, unrelated glyph language.
82
+ */
83
+ const ALIGN_BUTTONS: ReadonlyArray<{
84
+ op: AlignOp;
85
+ testId: string;
86
+ label: string;
87
+ icon: IconDefinition;
88
+ rotate?: boolean;
89
+ }> = [
90
+ { op: 'left', testId: 'align-left', label: 'Align left', icon: faAlignLeft },
91
+ { op: 'hcenter', testId: 'align-hcenter', label: 'Align horizontal center', icon: faAlignCenter },
92
+ { op: 'right', testId: 'align-right', label: 'Align right', icon: faAlignRight },
93
+ { op: 'top', testId: 'align-top', label: 'Align top', icon: faAlignLeft, rotate: true },
94
+ {
95
+ op: 'vcenter',
96
+ testId: 'align-vcenter',
97
+ label: 'Align vertical center',
98
+ icon: faAlignCenter,
99
+ rotate: true,
100
+ },
101
+ { op: 'bottom', testId: 'align-bottom', label: 'Align bottom', icon: faAlignRight, rotate: true },
102
+ ];
101
103
 
102
104
  const DISTRIBUTE_BUTTONS: ReadonlyArray<{
103
105
  axis: DistributeAxis;
104
106
  testId: string;
105
107
  label: string;
106
- glyph: string;
108
+ icon: IconDefinition;
107
109
  }> = [
108
110
  {
109
111
  axis: 'horizontal',
110
112
  testId: 'distribute-horizontal',
111
113
  label: 'Distribute horizontally',
112
- glyph: '⇔',
114
+ icon: faGripLinesVertical,
115
+ },
116
+ {
117
+ axis: 'vertical',
118
+ testId: 'distribute-vertical',
119
+ label: 'Distribute vertically',
120
+ icon: faGripLines,
113
121
  },
114
- { axis: 'vertical', testId: 'distribute-vertical', label: 'Distribute vertically', glyph: '⇕' },
115
122
  ];
116
123
 
117
124
  /** Where the toolbar floats: centered above `bbox`, clamped so it never
@@ -141,46 +148,50 @@ export function AlignToolbar({ adapter, entries }: AlignToolbarProps): React.Rea
141
148
  position: 'absolute',
142
149
  left,
143
150
  top,
144
- zIndex: 70,
151
+ zIndex: zIndex.overlayLow,
145
152
  pointerEvents: 'auto',
146
153
  display: 'flex',
147
154
  alignItems: 'center',
148
155
  gap: 2,
149
156
  background: TOOLBAR_BG,
150
157
  border: `1px solid ${TOOLBAR_BORDER}`,
151
- borderRadius: 4,
158
+ borderRadius: themeVars.shape.medium,
152
159
  padding: 3,
153
- boxShadow: '0 4px 12px rgba(0,0,0,0.5)',
160
+ boxShadow: themeVars.elevation.medium,
154
161
  }}
155
162
  >
156
- {ALIGN_BUTTONS.map(({ op, testId, label, glyph }) => (
157
- <button
163
+ {ALIGN_BUTTONS.map(({ op, testId, label, icon, rotate }) => (
164
+ <IconButton
158
165
  key={op}
159
- type="button"
160
166
  data-testid={testId}
161
167
  title={label}
162
- style={toolbarButtonStyle()}
163
- {...hoverHandlers()}
168
+ aria-label={label}
169
+ variant="ghost"
170
+ size="compact"
164
171
  onClick={() => commitAlignTargets(adapter, computeAlignTargets(entries, op))}
165
172
  >
166
- {glyph}
167
- </button>
173
+ <EditorIcon
174
+ icon={icon}
175
+ aria-hidden="true"
176
+ style={rotate ? { transform: 'rotate(90deg)' } : undefined}
177
+ />
178
+ </IconButton>
168
179
  ))}
169
180
  {canDistribute && (
170
181
  <>
171
182
  <div style={{ width: 1, height: 16, background: TOOLBAR_BORDER, margin: '0 2px' }} />
172
- {DISTRIBUTE_BUTTONS.map(({ axis, testId, label, glyph }) => (
173
- <button
183
+ {DISTRIBUTE_BUTTONS.map(({ axis, testId, label, icon }) => (
184
+ <IconButton
174
185
  key={axis}
175
- type="button"
176
186
  data-testid={testId}
177
187
  title={label}
178
- style={toolbarButtonStyle()}
179
- {...hoverHandlers()}
188
+ aria-label={label}
189
+ variant="ghost"
190
+ size="compact"
180
191
  onClick={() => commitAlignTargets(adapter, computeDistributeTargets(entries, axis))}
181
192
  >
182
- {glyph}
183
- </button>
193
+ <EditorIcon icon={icon} aria-hidden="true" />
194
+ </IconButton>
184
195
  ))}
185
196
  </>
186
197
  )}
@@ -1,3 +1,4 @@
1
+ import { Button, themeVars } from '../design-system';
1
2
  /**
2
3
  * AppRoot — conditional render: ProjectScreen vs Editor.
3
4
  *
@@ -11,60 +12,226 @@
11
12
 
12
13
  import { useCallback, useEffect, useState } from 'react';
13
14
  import { EditorProvider } from '../EditorContext';
15
+ import { ProjectCompatibilityError, type StartupRecovery } from '../editor-compatibility';
14
16
  import { type ActiveProject, detectProject } from '../project-manager';
15
17
  import { DefaultEditorLayout } from './DefaultEditorLayout';
16
18
  import { ProjectScreen } from './ProjectScreen';
19
+ import { StartupLoadingScreen } from './StartupLoadingScreen';
17
20
 
18
21
  type State =
19
22
  | { status: 'detecting' }
20
23
  | { status: 'no-project' }
24
+ | { status: 'error'; message: string; recovery?: StartupRecovery }
21
25
  | { status: 'ready'; project: ActiveProject };
22
26
 
27
+ function startupFailure(error: unknown): Extract<State, { status: 'error' }> {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ return error instanceof ProjectCompatibilityError
30
+ ? { status: 'error', message, recovery: error.recovery }
31
+ : { status: 'error', message };
32
+ }
33
+
34
+ /** Project detection is normally a pair of local fetches and should finish
35
+ * almost immediately. Never leave the entire editor on an eternal
36
+ * "Loading..." screen when a dev-server restart or a broken storage backend
37
+ * leaves one of those requests pending. */
38
+ export const PROJECT_DETECTION_TIMEOUT_MS = 8_000;
39
+
40
+ export function detectProjectWithTimeout(
41
+ detect: () => Promise<ActiveProject | null> = detectProject,
42
+ timeoutMs = PROJECT_DETECTION_TIMEOUT_MS,
43
+ ): Promise<ActiveProject | null> {
44
+ return new Promise((resolve, reject) => {
45
+ const timeout = window.setTimeout(() => {
46
+ reject(new Error('Project detection timed out. The editor server may still be starting.'));
47
+ }, timeoutMs);
48
+ detect().then(
49
+ (project) => {
50
+ window.clearTimeout(timeout);
51
+ resolve(project);
52
+ },
53
+ (error: unknown) => {
54
+ window.clearTimeout(timeout);
55
+ reject(error);
56
+ },
57
+ );
58
+ });
59
+ }
60
+
23
61
  export function AppRoot() {
24
62
  const [state, setState] = useState<State>({ status: 'detecting' });
63
+ const [detectionAttempt, setDetectionAttempt] = useState(0);
25
64
 
26
65
  useEffect(() => {
27
- detectProject().then((project) => {
28
- if (project) {
29
- setState({ status: 'ready', project });
30
- } else {
31
- setState({ status: 'no-project' });
32
- }
33
- });
34
- }, []);
66
+ let cancelled = false;
67
+ setState({ status: 'detecting' });
68
+ detectProjectWithTimeout().then(
69
+ (project) => {
70
+ if (cancelled) return;
71
+ if (project) {
72
+ setState({ status: 'ready', project });
73
+ } else {
74
+ setState({ status: 'no-project' });
75
+ }
76
+ },
77
+ (error: unknown) => {
78
+ if (cancelled) return;
79
+ setState(startupFailure(error));
80
+ },
81
+ );
82
+ return () => {
83
+ cancelled = true;
84
+ };
85
+ }, [detectionAttempt]);
35
86
 
36
87
  const handleReturnToProjectScreen = useCallback(() => {
37
88
  setState({ status: 'no-project' });
38
89
  }, []);
39
90
 
40
91
  if (state.status === 'detecting') {
92
+ return <StartupLoadingScreen />;
93
+ }
94
+
95
+ if (state.status === 'no-project') {
96
+ return <ProjectScreen onOpen={(project) => setState({ status: 'ready', project })} />;
97
+ }
98
+
99
+ if (state.status === 'error') {
100
+ const recoveryCommand =
101
+ state.recovery && 'command' in state.recovery ? state.recovery.command : null;
41
102
  return (
42
- <div
103
+ <main
104
+ data-testid="project-detection-error"
105
+ role="alert"
106
+ aria-labelledby="project-startup-error-title"
43
107
  style={{
44
108
  position: 'absolute',
45
- top: 0,
46
- left: 0,
47
- width: '100%',
48
- height: '100%',
49
- background: '#1a1a1a',
50
- display: 'flex',
51
- alignItems: 'center',
52
- justifyContent: 'center',
53
- color: '#666',
54
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
55
- fontSize: 14,
109
+ inset: 0,
110
+ display: 'grid',
111
+ placeItems: 'center',
112
+ padding: 24,
113
+ background: themeVars.surface.shell,
114
+ color: themeVars.content.primary,
115
+ fontFamily: themeVars.typography.sans,
56
116
  pointerEvents: 'auto',
57
117
  }}
58
118
  >
59
- Loading...
60
- </div>
119
+ <section
120
+ style={{
121
+ width: 'min(680px, 100%)',
122
+ padding: 20,
123
+ background: themeVars.surface.panel,
124
+ border: `1px solid ${themeVars.boundary.default}`,
125
+ borderTop: `2px solid ${themeVars.semantic.danger}`,
126
+ borderRadius: themeVars.shape.large,
127
+ }}
128
+ >
129
+ <h1
130
+ id="project-startup-error-title"
131
+ style={{ margin: 0, color: themeVars.content.primary, fontSize: 18, fontWeight: 600 }}
132
+ >
133
+ {state.recovery?.title ?? 'Couldn’t open this project'}
134
+ </h1>
135
+ <p
136
+ style={{
137
+ margin: '8px 0 12px',
138
+ color: themeVars.content.muted,
139
+ fontSize: 12,
140
+ lineHeight: 1.5,
141
+ }}
142
+ >
143
+ {state.recovery?.guidance ??
144
+ 'The editor stopped during project validation. Fix the project file and retry, or choose another project.'}
145
+ </p>
146
+ <pre
147
+ data-testid="project-startup-error-details"
148
+ style={{
149
+ maxHeight: 'min(42vh, 360px)',
150
+ margin: 0,
151
+ padding: 12,
152
+ overflow: 'auto',
153
+ whiteSpace: 'pre-wrap',
154
+ overflowWrap: 'anywhere',
155
+ background: themeVars.surface.inset,
156
+ border: `1px solid ${themeVars.boundary.default}`,
157
+ borderRadius: themeVars.shape.medium,
158
+ color: themeVars.semantic.danger,
159
+ fontFamily: themeVars.typography.mono,
160
+ fontSize: 11,
161
+ lineHeight: 1.5,
162
+ }}
163
+ >
164
+ {state.message}
165
+ </pre>
166
+ {recoveryCommand && (
167
+ <div style={{ marginTop: 12 }}>
168
+ <div
169
+ style={{
170
+ marginBottom: 5,
171
+ color: themeVars.content.dim,
172
+ fontSize: 10,
173
+ fontWeight: 600,
174
+ }}
175
+ >
176
+ RUN FROM THE PROJECT FOLDER
177
+ </div>
178
+ <div
179
+ style={{
180
+ display: 'flex',
181
+ alignItems: 'center',
182
+ gap: 8,
183
+ padding: '8px 10px',
184
+ background: themeVars.surface.inset,
185
+ border: `1px solid ${themeVars.boundary.default}`,
186
+ borderRadius: themeVars.shape.medium,
187
+ }}
188
+ >
189
+ <code
190
+ data-testid="project-startup-recovery-command"
191
+ style={{
192
+ flex: 1,
193
+ color: themeVars.content.primary,
194
+ fontFamily: themeVars.typography.mono,
195
+ fontSize: 11,
196
+ }}
197
+ >
198
+ {recoveryCommand}
199
+ </code>
200
+ <Button
201
+ type="button"
202
+ variant="secondary"
203
+ size="compact"
204
+ onClick={() => void navigator.clipboard?.writeText(recoveryCommand)}
205
+ >
206
+ Copy command
207
+ </Button>
208
+ </div>
209
+ </div>
210
+ )}
211
+ <div style={{ display: 'flex', gap: 8, marginTop: 16 }}>
212
+ <Button
213
+ type="button"
214
+ variant="primary"
215
+ size="comfortable"
216
+ data-testid="retry-project-detection"
217
+ onClick={() => setDetectionAttempt((attempt) => attempt + 1)}
218
+ >
219
+ Retry
220
+ </Button>
221
+ <Button
222
+ type="button"
223
+ variant="secondary"
224
+ size="comfortable"
225
+ onClick={() => setState({ status: 'no-project' })}
226
+ >
227
+ Choose another project
228
+ </Button>
229
+ </div>
230
+ </section>
231
+ </main>
61
232
  );
62
233
  }
63
234
 
64
- if (state.status === 'no-project') {
65
- return <ProjectScreen onOpen={(project) => setState({ status: 'ready', project })} />;
66
- }
67
-
68
235
  return (
69
236
  <EditorProvider>
70
237
  <DefaultEditorLayout onReturnToProjectScreen={handleReturnToProjectScreen} />