@vgai/editor 0.2.0 → 0.4.0-canary.20260715.1

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-CyiTVRi6.js +30 -0
  3. package/dist/assets/browserAll-fGZ_P1P8.js +1 -0
  4. package/dist/assets/create-runtime-BzSHBTYw.js +1 -0
  5. package/dist/assets/game-DQ7YHNS8.js +1 -0
  6. package/dist/assets/game-DX6Obomf.js +1 -0
  7. package/dist/assets/game-DoUJj8vY.js +1 -0
  8. package/dist/assets/{game-xsOho_wg.js → game-HqybI_X7.js} +3 -3
  9. package/dist/assets/game-NUAnyPkS.js +1 -0
  10. package/dist/assets/game-ck_dNIE6.js +1 -0
  11. package/dist/assets/{game-pt_1lQLv.js → game-hIf5LD4E.js} +1 -1
  12. package/dist/assets/game-loop-o2CcBMFY.js +1 -0
  13. package/dist/assets/{game-source-CvidN7AB.js → game-source-C8HM7gbP.js} +1 -1
  14. package/dist/assets/{game-BI111o5f.js → game-uR_lv3Mp.js} +3 -3
  15. package/dist/assets/index-B-HA1uu3.js +15412 -0
  16. package/dist/assets/{index-Bp5cecD6.js → index-CSBAZwMx.js} +2 -2
  17. package/dist/assets/{index-DL7RcQ0n.js → index-CoSRCKPS.js} +1 -1
  18. package/dist/assets/{index-Cs8xwv3e.js → index-D93bBuUl.js} +1 -1
  19. package/dist/assets/index-bu01fqch.css +1 -0
  20. package/dist/assets/ingest-siblings-CCkkE2h7.js +1 -0
  21. package/dist/assets/mount-manifest-B2ECssU2.js +1 -0
  22. package/dist/assets/react-18-Bmj05S8J.js +1 -0
  23. package/dist/assets/webworkerAll-BC6gMOLZ.js +1 -0
  24. package/dist/assets/world-documents-DXPcAEA0.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 +7718 -3436
  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 +71 -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 +1236 -296
  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 +1116 -344
  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 +620 -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,96 @@
1
+ import { faCircleNotch } from '@fortawesome/free-solid-svg-icons';
2
+ import { EditorIcon, space, themeVars } from '../design-system';
3
+ import { VgaiVoxelLogo } from './VgaiVoxelLogo';
4
+
5
+ /** Lightweight first paint while the local project is being detected and validated. */
6
+ export function StartupLoadingScreen() {
7
+ return (
8
+ <main
9
+ role="status"
10
+ aria-live="polite"
11
+ aria-label="Opening project"
12
+ data-testid="startup-loading-screen"
13
+ style={{
14
+ position: 'absolute',
15
+ inset: 0,
16
+ display: 'grid',
17
+ placeItems: 'center',
18
+ background: themeVars.surface.shell,
19
+ color: themeVars.content.primary,
20
+ fontFamily: themeVars.typography.sans,
21
+ pointerEvents: 'auto',
22
+ }}
23
+ >
24
+ <div
25
+ style={{
26
+ display: 'flex',
27
+ minWidth: 220,
28
+ flexDirection: 'column',
29
+ alignItems: 'center',
30
+ gap: space[6],
31
+ }}
32
+ >
33
+ <div
34
+ aria-hidden="true"
35
+ style={{
36
+ width: 68,
37
+ height: 68,
38
+ display: 'grid',
39
+ placeItems: 'center',
40
+ }}
41
+ >
42
+ <VgaiVoxelLogo size={68} />
43
+ </div>
44
+
45
+ <div style={{ textAlign: 'center' }}>
46
+ <div
47
+ style={{
48
+ color: themeVars.content.primary,
49
+ fontSize: 'var(--vgai-font-2xl)',
50
+ fontWeight: 600,
51
+ letterSpacing: 0.2,
52
+ }}
53
+ >
54
+ VGAI Editor
55
+ </div>
56
+ <div
57
+ style={{
58
+ marginTop: space[2],
59
+ color: themeVars.content.dim,
60
+ fontSize: 'var(--vgai-font-base)',
61
+ }}
62
+ >
63
+ Preparing your local workspace
64
+ </div>
65
+ </div>
66
+
67
+ <div
68
+ style={{
69
+ width: '100%',
70
+ height: 1,
71
+ background: themeVars.boundary.default,
72
+ borderRadius: themeVars.shape.small,
73
+ }}
74
+ />
75
+
76
+ <div
77
+ style={{
78
+ display: 'flex',
79
+ alignItems: 'center',
80
+ gap: space[3],
81
+ color: themeVars.content.muted,
82
+ fontSize: 'var(--vgai-font-base)',
83
+ }}
84
+ >
85
+ <EditorIcon
86
+ icon={faCircleNotch}
87
+ spin
88
+ aria-hidden="true"
89
+ style={{ color: themeVars.accent.default }}
90
+ />
91
+ <span>Opening project…</span>
92
+ </div>
93
+ </div>
94
+ </main>
95
+ );
96
+ }
@@ -0,0 +1,302 @@
1
+ import { themeVars } from '../design-system';
2
+ /**
3
+ * State Watch — the human door onto the game's registered state PROVIDERS
4
+ * (`ctx.debug.registerStateProvider`, docs/SYNTHETIC-PLAYER-SPEC.md §3.6):
5
+ * lists every provider with its honesty-tier badge (D14) and live-polls the
6
+ * selected provider's value (250ms — `NetworkSection`'s poll idiom) into a
7
+ * JSON tree.
8
+ *
9
+ * Reads the live adapter through `getActiveDebug()` and renders NOTHING when
10
+ * no debug adapter is active — same degrade-to-absent discipline as
11
+ * `NetworkSection`. The poll covers both the adapter's IDENTITY changing
12
+ * (play started/stopped, hot reload) and the selected value changing.
13
+ *
14
+ * Layout: `DataPanel`'s master/detail idiom — a provider list on the left
15
+ * (themeVars.accent.default left-border marks the selection, same as the Data tab's file
16
+ * list), the selected provider's live value on the right under a slim
17
+ * header naming what is being watched.
18
+ */
19
+
20
+ import { useEffect, useState } from 'react';
21
+ import { getActiveDebug } from '../authoring/active-systems';
22
+ import { EditorListButton } from '../design-system';
23
+
24
+ type ProviderInfo = { name: string; tier: 'observable' | 'assisted' };
25
+
26
+ const TIER_COLORS: Record<ProviderInfo['tier'], string> = {
27
+ observable: themeVars.semantic.success,
28
+ assisted: themeVars.semantic.warning,
29
+ };
30
+
31
+ function TierBadge({ tier, name }: { tier: ProviderInfo['tier']; name: string }) {
32
+ const color = TIER_COLORS[tier];
33
+ return (
34
+ <span
35
+ data-testid={`state-tier-${name}`}
36
+ title={
37
+ tier === 'assisted'
38
+ ? 'Assisted (X-ray) state — not observable by a player; proofs consuming it are flagged'
39
+ : 'Observable state — a player could see this'
40
+ }
41
+ style={{
42
+ border: `1px solid ${color}55`,
43
+ background: `${color}14`,
44
+ color,
45
+ borderRadius: themeVars.shape.small,
46
+ padding: '0 4px',
47
+ fontSize: 9,
48
+ fontWeight: 700,
49
+ lineHeight: '14px',
50
+ textTransform: 'uppercase',
51
+ letterSpacing: 0.4,
52
+ flexShrink: 0,
53
+ }}
54
+ >
55
+ {tier}
56
+ </span>
57
+ );
58
+ }
59
+
60
+ /** Leaf color by JSON type — the same monokai accents ConsolePanel's
61
+ * subsystem chips draw from, so typed values scan apart at a glance. */
62
+ function leafColor(value: unknown): string {
63
+ if (value === null || value === undefined) return themeVars.content.muted;
64
+ switch (typeof value) {
65
+ case 'number':
66
+ return '#78dce8';
67
+ case 'boolean':
68
+ return '#fc9867';
69
+ case 'string':
70
+ return '#a9dc76';
71
+ default:
72
+ return themeVars.content.primary;
73
+ }
74
+ }
75
+
76
+ /** Small recursive JSON tree — objects/arrays indent behind a guide line,
77
+ * primitives render inline, color-keyed by type. Depth-capped defensively;
78
+ * leaves the raw JSON reachable via the browser console rather than ever
79
+ * crashing the dock on a cyclic value (JSON.stringify in the leaf catches
80
+ * those). */
81
+ function JsonNode({ value, depth }: { value: unknown; depth: number }) {
82
+ if (value !== null && typeof value === 'object' && depth < 6) {
83
+ const entries = Array.isArray(value)
84
+ ? value.map((v, i) => [String(i), v] as const)
85
+ : Object.entries(value as Record<string, unknown>);
86
+ if (entries.length === 0) {
87
+ return (
88
+ <span style={{ color: themeVars.content.muted }}>{Array.isArray(value) ? '[]' : '{}'}</span>
89
+ );
90
+ }
91
+ return (
92
+ <div
93
+ style={
94
+ depth === 0
95
+ ? undefined
96
+ : {
97
+ paddingLeft: 10,
98
+ marginLeft: 3,
99
+ borderLeft: `1px solid ${themeVars.boundary.default}`,
100
+ }
101
+ }
102
+ >
103
+ {entries.map(([key, v]) => (
104
+ <div key={key}>
105
+ <span style={{ color: themeVars.accent.default }}>{key}</span>
106
+ <span style={{ color: themeVars.content.muted }}>: </span>
107
+ <JsonNode value={v} depth={depth + 1} />
108
+ </div>
109
+ ))}
110
+ </div>
111
+ );
112
+ }
113
+ let label: string;
114
+ try {
115
+ label = JSON.stringify(value) ?? 'undefined';
116
+ } catch {
117
+ label = String(value);
118
+ }
119
+ return <span style={{ color: leafColor(value) }}>{label}</span>;
120
+ }
121
+
122
+ export function StateWatchPanel() {
123
+ const [providers, setProviders] = useState<ProviderInfo[] | null>(() => {
124
+ const debug = getActiveDebug();
125
+ return debug ? debug.providers() : null;
126
+ });
127
+ const [selected, setSelected] = useState<string | null>(null);
128
+ const [value, setValue] = useState<unknown>(undefined);
129
+ const [readError, setReadError] = useState<string | null>(null);
130
+
131
+ useEffect(() => {
132
+ const tick = () => {
133
+ const debug = getActiveDebug();
134
+ setProviders(debug ? debug.providers() : null);
135
+ };
136
+ tick();
137
+ const intervalId = setInterval(tick, 250);
138
+ return () => clearInterval(intervalId);
139
+ }, []);
140
+
141
+ // Poll the SELECTED provider's value (NetworkSection's 250ms idiom) — a
142
+ // separate effect keyed on the selection so switching providers reads
143
+ // immediately instead of waiting out the interval.
144
+ useEffect(() => {
145
+ if (!selected) return;
146
+ const tick = () => {
147
+ const debug = getActiveDebug();
148
+ if (!debug) return;
149
+ try {
150
+ setValue(debug.state(selected));
151
+ setReadError(null);
152
+ } catch (err) {
153
+ setReadError(err instanceof Error ? err.message : String(err));
154
+ }
155
+ };
156
+ tick();
157
+ const intervalId = setInterval(tick, 250);
158
+ return () => clearInterval(intervalId);
159
+ }, [selected]);
160
+
161
+ if (!providers) return null;
162
+
163
+ const selectedExists = selected !== null && providers.some((p) => p.name === selected);
164
+
165
+ return (
166
+ <div
167
+ data-testid="state-watch-panel"
168
+ style={{
169
+ flex: 1,
170
+ minHeight: 0,
171
+ display: 'flex',
172
+ fontSize: 11,
173
+ color: themeVars.content.primary,
174
+ background: themeVars.surface.inset,
175
+ }}
176
+ >
177
+ {/* Provider list (master) — DataPanel's file-list idiom */}
178
+ <div
179
+ style={{
180
+ width: 220,
181
+ flexShrink: 0,
182
+ overflowY: 'auto',
183
+ borderRight: `1px solid ${themeVars.boundary.default}`,
184
+ padding: '4px 0',
185
+ }}
186
+ >
187
+ {providers.length === 0 ? (
188
+ <div style={{ padding: 12, fontSize: 12, color: themeVars.content.muted }}>
189
+ <p style={{ margin: '0 0 6px' }}>No state providers registered.</p>
190
+ <p style={{ margin: 0 }}>
191
+ Register one from a GameComponent with{' '}
192
+ <code>ctx.debug.registerStateProvider(name, fn)</code>.
193
+ </p>
194
+ </div>
195
+ ) : (
196
+ providers.map((p) => {
197
+ const isSelected = selected === p.name;
198
+ return (
199
+ <EditorListButton
200
+ key={p.name}
201
+ selected={isSelected}
202
+ data-testid={`state-provider-${p.name}`}
203
+ onClick={() => setSelected(p.name)}
204
+ title={p.name}
205
+ style={{
206
+ display: 'flex',
207
+ alignItems: 'center',
208
+ gap: 6,
209
+ padding: '3px 8px',
210
+ fontSize: 11,
211
+ }}
212
+ >
213
+ <span
214
+ style={{
215
+ fontFamily: themeVars.typography.mono,
216
+ flex: 1,
217
+ minWidth: 0,
218
+ overflow: 'hidden',
219
+ textOverflow: 'ellipsis',
220
+ whiteSpace: 'nowrap',
221
+ }}
222
+ >
223
+ {p.name}
224
+ </span>
225
+ <TierBadge tier={p.tier} name={p.name} />
226
+ </EditorListButton>
227
+ );
228
+ })
229
+ )}
230
+ </div>
231
+ {/* Live value (detail) */}
232
+ <div
233
+ data-testid="state-watch-value"
234
+ style={{
235
+ flex: 1,
236
+ minWidth: 0,
237
+ display: 'flex',
238
+ flexDirection: 'column',
239
+ fontFamily: themeVars.typography.mono,
240
+ }}
241
+ >
242
+ {selectedExists && (
243
+ <div
244
+ style={{
245
+ display: 'flex',
246
+ alignItems: 'center',
247
+ gap: 6,
248
+ padding: '4px 8px',
249
+ borderBottom: `1px solid ${themeVars.boundary.default}`,
250
+ flexShrink: 0,
251
+ }}
252
+ >
253
+ <span
254
+ style={{
255
+ color: themeVars.content.primary,
256
+ minWidth: 0,
257
+ overflow: 'hidden',
258
+ textOverflow: 'ellipsis',
259
+ whiteSpace: 'nowrap',
260
+ }}
261
+ >
262
+ {selected}
263
+ </span>
264
+ <span
265
+ title="Polled every 250ms while playing"
266
+ style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 4 }}
267
+ >
268
+ <span
269
+ style={{
270
+ width: 6,
271
+ height: 6,
272
+ borderRadius: '50%',
273
+ background: themeVars.semantic.success,
274
+ }}
275
+ />
276
+ <span style={{ color: themeVars.content.muted, fontSize: 9 }}>live</span>
277
+ </span>
278
+ </div>
279
+ )}
280
+ <div
281
+ style={{
282
+ flex: 1,
283
+ minHeight: 0,
284
+ overflow: 'auto',
285
+ padding: '6px 8px',
286
+ lineHeight: '17px',
287
+ }}
288
+ >
289
+ {!selectedExists ? (
290
+ <span style={{ color: themeVars.content.dim }}>
291
+ Select a provider to watch its live value.
292
+ </span>
293
+ ) : readError ? (
294
+ <span style={{ color: themeVars.semantic.danger }}>{readError}</span>
295
+ ) : (
296
+ <JsonNode value={value} depth={0} />
297
+ )}
298
+ </div>
299
+ </div>
300
+ </div>
301
+ );
302
+ }
@@ -1,4 +1,5 @@
1
1
  import { useEffect, useState } from 'react';
2
+ import { themeVars } from '../design-system';
2
3
  import { useEditorStats } from '../EditorContext';
3
4
 
4
5
  export function StatsOverlay() {
@@ -11,18 +12,24 @@ export function StatsOverlay() {
11
12
  }, []);
12
13
 
13
14
  return (
15
+ // EDITOR-STYLE-AUDIT.md V-10 — this was an EIGHTH one-off "dark panel"
16
+ // value (`rgba(0,0,0,0.7)`, flat black, no border) directly stacked
17
+ // above-right of ViewportOverlay's cluster and CameraInfo's pill in the
18
+ // same corner. Given the same border/radius treatment as its siblings so
19
+ // the whole corner reads as one family.
14
20
  <div
15
21
  style={{
16
22
  position: 'absolute',
17
23
  top: 48,
18
24
  right: 8,
19
- background: 'rgba(0, 0, 0, 0.7)',
20
- borderRadius: 4,
25
+ background: themeVars.surface.overlay,
26
+ border: `1px solid ${themeVars.boundary.strong}`,
27
+ borderRadius: themeVars.shape.medium,
21
28
  padding: '6px 10px',
22
29
  pointerEvents: 'auto',
23
- fontSize: 11,
24
- color: '#c5c8ce',
25
- fontFamily: 'monospace',
30
+ fontSize: 'var(--vgai-font-base)',
31
+ color: themeVars.content.primary,
32
+ fontFamily: themeVars.typography.mono,
26
33
  lineHeight: '16px',
27
34
  }}
28
35
  >
@@ -0,0 +1,64 @@
1
+ import { chromeSize, themeVars } from '../design-system';
2
+ /**
3
+ * W4 (docs/EDITOR-WORKSPACE-SHELL-TODO.md §1.5/§4.1/§9 W4) — the narrow
4
+ * STATUS BAR: the first (and only) consumer of the W0 workspace-status
5
+ * registry. "Status is status, not a command": compact session state on the
6
+ * left (save/dirty/failure, error count, play state, connection while
7
+ * active, build progress), concise selection information on the right —
8
+ * the §4.1 mock's bottom line.
9
+ *
10
+ * The bar renders every registered contribution in (align, order,
11
+ * registration-sequence) order; a contribution that is currently
12
+ * meaningless returns null itself (the registry contract), so inactive
13
+ * items occupy no space and the flex `gap` never double-spaces.
14
+ *
15
+ * Mounted by `DefaultEditorLayout` into the `#editor-bottom` portal BELOW
16
+ * the bottom dock/drawer, matching the mock's row order (drawer line, then
17
+ * status line).
18
+ */
19
+
20
+ import { useSyncExternalStore } from 'react';
21
+ import {
22
+ subscribeWorkspaceStatus,
23
+ workspaceStatusContributions,
24
+ workspaceStatusRegistryVersion,
25
+ } from '../workspace-status-registry';
26
+
27
+ export function StatusBar() {
28
+ useSyncExternalStore(subscribeWorkspaceStatus, workspaceStatusRegistryVersion);
29
+ const left = workspaceStatusContributions('left');
30
+ const right = workspaceStatusContributions('right');
31
+
32
+ return (
33
+ <div
34
+ data-testid="status-bar"
35
+ // W5 a11y — the shell's `status` landmark (§9/W5): a live region ATs
36
+ // announce politely; also why focus mode keeps this bar visible.
37
+ role="status"
38
+ style={{
39
+ height: chromeSize.statusBar,
40
+ flexShrink: 0,
41
+ display: 'flex',
42
+ alignItems: 'center',
43
+ gap: 12,
44
+ padding: '0 8px',
45
+ background: themeVars.surface.chrome,
46
+ borderTop: `1px solid ${themeVars.boundary.default}`,
47
+ fontSize: 'var(--vgai-font-sm)',
48
+ color: themeVars.content.muted,
49
+ pointerEvents: 'auto',
50
+ userSelect: 'none',
51
+ overflow: 'hidden',
52
+ whiteSpace: 'nowrap',
53
+ }}
54
+ >
55
+ {left.map((c) => (
56
+ <c.Content key={c.id} />
57
+ ))}
58
+ <div style={{ marginLeft: 'auto' }} />
59
+ {right.map((c) => (
60
+ <c.Content key={c.id} />
61
+ ))}
62
+ </div>
63
+ );
64
+ }
@@ -0,0 +1,89 @@
1
+ .vgai-theme-manager-content {
2
+ min-height: 0;
3
+ flex: 1;
4
+ align-items: stretch;
5
+ }
6
+
7
+ .vgai-theme-list {
8
+ width: 220px;
9
+ flex: 0 0 auto;
10
+ padding: var(--vgai-space-4);
11
+ overflow-y: auto;
12
+ background: var(--vgai-surface-panel);
13
+ border-right: var(--vgai-stroke-resting) solid var(--vgai-boundary-default);
14
+ box-sizing: border-box;
15
+ }
16
+
17
+ .vgai-theme-choice {
18
+ width: 100%;
19
+ height: auto;
20
+ min-height: var(--vgai-control-comfortable-height);
21
+ flex-direction: column;
22
+ align-items: flex-start;
23
+ margin-bottom: var(--vgai-space-2);
24
+ text-align: left;
25
+ }
26
+
27
+ .vgai-theme-choice[aria-pressed="true"] {
28
+ color: var(--vgai-content-primary);
29
+ background: var(--vgai-accent-muted);
30
+ }
31
+
32
+ .vgai-theme-list-action {
33
+ width: 100%;
34
+ margin-top: var(--vgai-space-2);
35
+ }
36
+ .vgai-theme-tokens {
37
+ min-width: 0;
38
+ flex: 1;
39
+ padding: var(--vgai-space-8);
40
+ overflow-y: auto;
41
+ }
42
+ .vgai-theme-name-row {
43
+ margin-bottom: var(--vgai-space-8);
44
+ }
45
+ .vgai-theme-name-field {
46
+ min-width: 0;
47
+ flex: 1;
48
+ }
49
+ .vgai-theme-readonly-note {
50
+ margin-bottom: var(--vgai-space-8);
51
+ }
52
+ .vgai-theme-group {
53
+ margin-bottom: var(--vgai-space-10);
54
+ }
55
+ .vgai-theme-field-grid {
56
+ display: grid;
57
+ grid-template-columns: repeat(2, minmax(220px, 1fr));
58
+ gap: var(--vgai-space-4) var(--vgai-space-8);
59
+ }
60
+ .vgai-theme-value > .vgai-input {
61
+ min-width: 0;
62
+ flex: 1;
63
+ }
64
+ .vgai-theme-swatch-input,
65
+ .vgai-theme-swatch-preview {
66
+ width: 24px;
67
+ height: 24px;
68
+ flex: 0 0 auto;
69
+ padding: 1px;
70
+ border: var(--vgai-stroke-resting) solid var(--vgai-boundary-default);
71
+ border-radius: var(--vgai-radius-sm);
72
+ box-sizing: border-box;
73
+ }
74
+ .vgai-theme-swatch-input {
75
+ background: transparent;
76
+ cursor: pointer;
77
+ }
78
+ .vgai-theme-message {
79
+ margin-right: auto;
80
+ }
81
+
82
+ @media (max-width: 760px) {
83
+ .vgai-theme-list {
84
+ width: 180px;
85
+ }
86
+ .vgai-theme-field-grid {
87
+ grid-template-columns: minmax(0, 1fr);
88
+ }
89
+ }