@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
@@ -1,7 +1,7 @@
1
1
  import * as THREE from 'three';
2
+ import { Button, SectionHeader, Vec3Input } from '../../design-system';
2
3
  import { useEditorStore } from '../../EditorContext';
3
- import { SectionHeader } from '../primitives/SectionHeader';
4
- import { Vec3Input } from '../primitives/Vec3Input';
4
+ import { fieldLabelStyle } from '../inspector-widgets/shared';
5
5
  import type { SectionProps } from './multi-edit-utils';
6
6
  import { commonVec3 } from './multi-edit-utils';
7
7
 
@@ -24,16 +24,8 @@ export function eulerDegToQuat(deg: [number, number, number]): [number, number,
24
24
  return [q.x, q.y, q.z, q.w];
25
25
  }
26
26
 
27
- const pivotBtnStyle: React.CSSProperties = {
28
- background: '#2a2a2a',
29
- color: '#8c8c8c',
30
- border: '1px solid #444',
31
- borderRadius: 2,
32
- padding: '2px 6px',
33
- fontSize: 10,
34
- cursor: 'pointer',
35
- };
36
-
27
+ /** Converged onto the shared compact chrome-button family (I-10 — this was
28
+ * its own `#2a2a2a`/radius-2 one-off). */
37
29
  export function TransformSection({ entities, ids }: SectionProps) {
38
30
  const store = useEditorStore();
39
31
  const multi = entities.length > 1;
@@ -123,7 +115,7 @@ export function TransformSection({ entities, ids }: SectionProps) {
123
115
  <SectionHeader label="Transform">
124
116
  <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
125
117
  <div>
126
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Position</div>
118
+ <div style={fieldLabelStyle}>Position</div>
127
119
  <Vec3Input
128
120
  value={posVec}
129
121
  onChange={updatePos}
@@ -133,21 +125,21 @@ export function TransformSection({ entities, ids }: SectionProps) {
133
125
  />
134
126
  </div>
135
127
  <div>
136
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Rotation (degrees)</div>
128
+ <div style={fieldLabelStyle}>Rotation (degrees)</div>
137
129
  <Vec3Input value={rotVec} onChange={updateRot} onAxisChange={setRot} step={1} />
138
130
  </div>
139
131
  <div>
140
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Scale</div>
132
+ <div style={fieldLabelStyle}>Scale</div>
141
133
  <Vec3Input value={sclVec} onChange={updateScl} onAxisChange={setScl} step={0.05} />
142
134
  </div>
143
135
  <div>
144
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Pivot</div>
136
+ <div style={fieldLabelStyle}>Pivot</div>
145
137
  <Vec3Input value={pivVec} onChange={updatePiv} onAxisChange={setPiv} step={0.1} />
146
138
  <div style={{ display: 'flex', gap: 4, marginTop: 4 }}>
147
139
  {hasPivot && (
148
- <button
140
+ <Button
149
141
  type="button"
150
- style={pivotBtnStyle}
142
+ size="compact"
151
143
  onClick={() => {
152
144
  store.batchMutate(ids, (entity) => {
153
145
  delete entity.pivot;
@@ -155,12 +147,12 @@ export function TransformSection({ entities, ids }: SectionProps) {
155
147
  }}
156
148
  >
157
149
  Reset
158
- </button>
150
+ </Button>
159
151
  )}
160
152
  {!multi && (
161
- <button
153
+ <Button
162
154
  type="button"
163
- style={pivotBtnStyle}
155
+ size="compact"
164
156
  onClick={() => {
165
157
  const entity = entities[0]!;
166
158
  const obj = store.objectMap.get(entity.id!);
@@ -181,7 +173,7 @@ export function TransformSection({ entities, ids }: SectionProps) {
181
173
  }}
182
174
  >
183
175
  Center to Bounds
184
- </button>
176
+ </Button>
185
177
  )}
186
178
  </div>
187
179
  </div>
@@ -0,0 +1,95 @@
1
+ import type { HTMLAttributes, LabelHTMLAttributes, ReactNode } from 'react';
2
+ import { Actions, Inline, Stack } from '../primitives/Layout';
3
+ import { Text } from '../primitives/Text';
4
+
5
+ function classes(base: string, className?: string): string {
6
+ return className ? `${base} ${className}` : base;
7
+ }
8
+
9
+ export interface DialogProps extends HTMLAttributes<HTMLDivElement> {
10
+ labelledBy: string;
11
+ onDismiss?: () => void;
12
+ size?: 'compact' | 'default' | 'wide';
13
+ }
14
+
15
+ /** Modal editor surface. The scrim, sizing, elevation, and spacing are one recipe. */
16
+ export function Dialog({
17
+ labelledBy,
18
+ onDismiss,
19
+ size = 'default',
20
+ className,
21
+ ...props
22
+ }: DialogProps) {
23
+ return (
24
+ <div
25
+ className="vgai-dialog-scrim"
26
+ onPointerDown={(event) => {
27
+ if (event.target === event.currentTarget) onDismiss?.();
28
+ }}
29
+ >
30
+ <div
31
+ {...props}
32
+ role="dialog"
33
+ aria-modal="true"
34
+ aria-labelledby={labelledBy}
35
+ data-size={size}
36
+ className={classes('vgai-dialog', className)}
37
+ />
38
+ </div>
39
+ );
40
+ }
41
+
42
+ export function DialogHeader({
43
+ titleId,
44
+ title,
45
+ description,
46
+ }: {
47
+ titleId: string;
48
+ title: ReactNode;
49
+ description?: ReactNode;
50
+ }) {
51
+ return (
52
+ <Stack className="vgai-dialog-header" gap={2}>
53
+ <Text id={titleId} as="h2" variant="heading">
54
+ {title}
55
+ </Text>
56
+ {description && (
57
+ <Text as="p" tone="muted">
58
+ {description}
59
+ </Text>
60
+ )}
61
+ </Stack>
62
+ );
63
+ }
64
+
65
+ export function DialogBody({ className, ...props }: HTMLAttributes<HTMLDivElement>) {
66
+ return <Stack {...props} className={classes('vgai-dialog-body', className)} />;
67
+ }
68
+
69
+ export function DialogFooter({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) {
70
+ return (
71
+ <Actions {...props} className={classes('vgai-dialog-footer', className)}>
72
+ {children}
73
+ </Actions>
74
+ );
75
+ }
76
+
77
+ export function DialogField({ className, ...props }: LabelHTMLAttributes<HTMLLabelElement>) {
78
+ return <label {...props} className={classes('vgai-dialog-field', className)} />;
79
+ }
80
+
81
+ export function DialogFieldLabel({ children }: { children: ReactNode }) {
82
+ return (
83
+ <Text variant="label" tone="muted">
84
+ {children}
85
+ </Text>
86
+ );
87
+ }
88
+
89
+ export function JoinedField({ className, ...props }: HTMLAttributes<HTMLDivElement>) {
90
+ return <Inline {...props} className={classes('vgai-joined-field', className)} />;
91
+ }
92
+
93
+ export function JoinedFieldSuffix({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {
94
+ return <span {...props} className={classes('vgai-joined-field-suffix', className)} />;
95
+ }
@@ -0,0 +1,44 @@
1
+ import type { HTMLAttributes, LabelHTMLAttributes, ReactNode } from 'react';
2
+
3
+ function classes(base: string, className?: string): string {
4
+ return className ? `${base} ${className}` : base;
5
+ }
6
+
7
+ export function FieldGroup({ className, ...props }: HTMLAttributes<HTMLDivElement>) {
8
+ return <div {...props} className={classes('vgai-field-group', className)} />;
9
+ }
10
+
11
+ export interface FieldRowProps extends HTMLAttributes<HTMLDivElement> {
12
+ label: ReactNode;
13
+ htmlFor?: string;
14
+ hint?: ReactNode;
15
+ compact?: boolean;
16
+ }
17
+
18
+ export function FieldRow({
19
+ label,
20
+ htmlFor,
21
+ hint,
22
+ compact = false,
23
+ className,
24
+ children,
25
+ ...props
26
+ }: FieldRowProps) {
27
+ return (
28
+ <div
29
+ {...props}
30
+ data-compact={compact || undefined}
31
+ className={classes('vgai-field-row', className)}
32
+ >
33
+ <label htmlFor={htmlFor} className="vgai-field-label">
34
+ {label}
35
+ </label>
36
+ <div className="vgai-field-control">{children}</div>
37
+ {hint && <div className="vgai-field-hint">{hint}</div>}
38
+ </div>
39
+ );
40
+ }
41
+
42
+ export function FieldLabel({ className, ...props }: LabelHTMLAttributes<HTMLLabelElement>) {
43
+ return <label {...props} className={classes('vgai-field-label', className)} />;
44
+ }
@@ -0,0 +1,25 @@
1
+ import { type ButtonHTMLAttributes, forwardRef } from 'react';
2
+
3
+ export interface EditorListButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
4
+ selected?: boolean;
5
+ accent?: 'bar' | 'none';
6
+ }
7
+
8
+ /** Selectable list row with canonical hover, focus, disabled, and selection paint. */
9
+ export const EditorListButton = forwardRef<HTMLButtonElement, EditorListButtonProps>(
10
+ function EditorListButton(
11
+ { selected = false, accent = 'bar', className, type = 'button', ...props },
12
+ ref,
13
+ ) {
14
+ return (
15
+ <button
16
+ {...props}
17
+ ref={ref}
18
+ type={type}
19
+ data-selected={selected || undefined}
20
+ data-accent={accent}
21
+ className={className ? `vgai-list-button ${className}` : 'vgai-list-button'}
22
+ />
23
+ );
24
+ },
25
+ );
@@ -0,0 +1,40 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+
3
+ export type StateSurfaceTone = 'neutral' | 'loading' | 'error' | 'success';
4
+
5
+ export interface StateSurfaceProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
6
+ tone?: StateSurfaceTone;
7
+ icon?: ReactNode;
8
+ title: ReactNode;
9
+ description?: ReactNode;
10
+ action?: ReactNode;
11
+ compact?: boolean;
12
+ }
13
+
14
+ export function StateSurface({
15
+ tone = 'neutral',
16
+ icon,
17
+ title,
18
+ description,
19
+ action,
20
+ compact = false,
21
+ className,
22
+ ...props
23
+ }: StateSurfaceProps) {
24
+ const defaultRole =
25
+ tone === 'error' ? 'alert' : tone === 'loading' || tone === 'success' ? 'status' : undefined;
26
+ return (
27
+ <div
28
+ {...props}
29
+ role={props.role ?? defaultRole}
30
+ data-tone={tone}
31
+ data-compact={compact || undefined}
32
+ className={className ? `vgai-state-surface ${className}` : 'vgai-state-surface'}
33
+ >
34
+ {icon && <div className="vgai-state-surface-icon">{icon}</div>}
35
+ <strong className="vgai-state-surface-title">{title}</strong>
36
+ {description && <div className="vgai-state-surface-description">{description}</div>}
37
+ {action && <div className="vgai-state-surface-action">{action}</div>}
38
+ </div>
39
+ );
40
+ }
@@ -0,0 +1,115 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+
3
+ function classes(base: string, className?: string): string {
4
+ return className ? `${base} ${className}` : base;
5
+ }
6
+
7
+ export type EditorTone = 'info' | 'warning' | 'error' | 'success';
8
+ export type EditorSurfaceVariant = 'shell' | 'panel' | 'chrome' | 'raised' | 'inset' | 'overlay';
9
+
10
+ export interface EditorSurfaceProps extends HTMLAttributes<HTMLDivElement> {
11
+ variant?: EditorSurfaceVariant;
12
+ border?: boolean;
13
+ scroll?: boolean;
14
+ }
15
+
16
+ export function EditorSurface({
17
+ variant = 'panel',
18
+ border = false,
19
+ scroll = false,
20
+ className,
21
+ ...props
22
+ }: EditorSurfaceProps) {
23
+ return (
24
+ <div
25
+ {...props}
26
+ data-variant={variant}
27
+ data-border={border || undefined}
28
+ data-scroll={scroll || undefined}
29
+ className={classes('vgai-surface', className)}
30
+ />
31
+ );
32
+ }
33
+
34
+ export interface EditorBannerProps extends HTMLAttributes<HTMLDivElement> {
35
+ tone?: EditorTone;
36
+ icon?: ReactNode;
37
+ actions?: ReactNode;
38
+ }
39
+
40
+ export function EditorBanner({
41
+ tone = 'info',
42
+ icon,
43
+ actions,
44
+ className,
45
+ children,
46
+ ...props
47
+ }: EditorBannerProps) {
48
+ return (
49
+ <div
50
+ {...props}
51
+ role={tone === 'error' ? 'alert' : 'status'}
52
+ data-tone={tone}
53
+ className={classes('vgai-banner', className)}
54
+ >
55
+ {icon && <span className="vgai-banner-icon">{icon}</span>}
56
+ <div className="vgai-banner-content">{children}</div>
57
+ {actions && <div className="vgai-banner-actions">{actions}</div>}
58
+ </div>
59
+ );
60
+ }
61
+
62
+ export function EditorPopover({ className, ...props }: HTMLAttributes<HTMLDivElement>) {
63
+ return <div {...props} className={classes('vgai-popover', className)} />;
64
+ }
65
+
66
+ export function EditorBadge({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {
67
+ return <span {...props} className={classes('vgai-badge', className)} />;
68
+ }
69
+
70
+ export interface DropIndicatorProps extends HTMLAttributes<HTMLDivElement> {
71
+ position?: 'before' | 'inside' | 'after';
72
+ }
73
+
74
+ export function DropIndicator({ position = 'inside', className, ...props }: DropIndicatorProps) {
75
+ return (
76
+ <div
77
+ {...props}
78
+ aria-hidden="true"
79
+ data-position={position}
80
+ className={classes('vgai-drop-indicator', className)}
81
+ />
82
+ );
83
+ }
84
+
85
+ export interface ResizeHandleProps extends HTMLAttributes<HTMLDivElement> {
86
+ orientation: 'horizontal' | 'vertical';
87
+ label: string;
88
+ valueNow?: number;
89
+ valueMin?: number;
90
+ valueMax?: number;
91
+ }
92
+
93
+ export function ResizeHandle({
94
+ orientation,
95
+ label,
96
+ valueNow,
97
+ valueMin = 0,
98
+ valueMax = 100,
99
+ className,
100
+ ...props
101
+ }: ResizeHandleProps) {
102
+ return (
103
+ <div
104
+ {...props}
105
+ role="separator"
106
+ aria-label={label}
107
+ aria-orientation={orientation}
108
+ aria-valuenow={valueNow}
109
+ aria-valuemin={valueNow === undefined ? undefined : valueMin}
110
+ aria-valuemax={valueNow === undefined ? undefined : valueMax}
111
+ data-orientation={orientation}
112
+ className={classes('vgai-resize-handle', className)}
113
+ />
114
+ );
115
+ }
@@ -0,0 +1,80 @@
1
+ import { type ButtonHTMLAttributes, forwardRef, type HTMLAttributes, type ReactNode } from 'react';
2
+
3
+ function classes(base: string, className?: string): string {
4
+ return className ? `${base} ${className}` : base;
5
+ }
6
+
7
+ export const EditorTabList = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
8
+ function EditorTabList({ className, onKeyDown, ...props }, ref) {
9
+ return (
10
+ <div
11
+ {...props}
12
+ ref={ref}
13
+ role="tablist"
14
+ className={classes('vgai-tabs', className)}
15
+ onKeyDown={(event) => {
16
+ onKeyDown?.(event);
17
+ if (event.defaultPrevented) return;
18
+ if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;
19
+ const tabs = Array.from(
20
+ event.currentTarget.querySelectorAll<HTMLButtonElement>('[role="tab"]:not(:disabled)'),
21
+ );
22
+ if (tabs.length === 0) return;
23
+ event.preventDefault();
24
+ const current = tabs.indexOf(document.activeElement as HTMLButtonElement);
25
+ const next =
26
+ event.key === 'Home'
27
+ ? tabs[0]
28
+ : event.key === 'End'
29
+ ? tabs.at(-1)
30
+ : event.key === 'ArrowRight'
31
+ ? tabs[(current + 1 + tabs.length) % tabs.length]
32
+ : tabs[(current - 1 + tabs.length) % tabs.length];
33
+ next?.focus();
34
+ }}
35
+ />
36
+ );
37
+ },
38
+ );
39
+
40
+ export interface EditorTabProps extends ButtonHTMLAttributes<HTMLButtonElement> {
41
+ selected?: boolean;
42
+ dirty?: boolean;
43
+ badge?: ReactNode;
44
+ }
45
+
46
+ export const EditorTab = forwardRef<HTMLButtonElement, EditorTabProps>(function EditorTab(
47
+ {
48
+ selected = false,
49
+ dirty = false,
50
+ badge,
51
+ className,
52
+ type = 'button',
53
+ tabIndex,
54
+ children,
55
+ ...props
56
+ },
57
+ ref,
58
+ ) {
59
+ return (
60
+ <button
61
+ {...props}
62
+ ref={ref}
63
+ type={type}
64
+ role="tab"
65
+ tabIndex={tabIndex ?? (selected ? 0 : -1)}
66
+ aria-selected={selected}
67
+ data-selected={selected || undefined}
68
+ className={classes('vgai-tab', className)}
69
+ >
70
+ {dirty && (
71
+ <>
72
+ <span className="vgai-tab-dirty" title="Unsaved" aria-hidden="true" />
73
+ <span className="vgai-sr-only">Unsaved</span>
74
+ </>
75
+ )}
76
+ <span className="vgai-tab-label">{children}</span>
77
+ {badge !== undefined && <span className="vgai-tab-badge">{badge}</span>}
78
+ </button>
79
+ );
80
+ });
@@ -0,0 +1,51 @@
1
+ import { forwardRef, type HTMLAttributes } from 'react';
2
+
3
+ function classes(base: string, className?: string): string {
4
+ return className ? `${base} ${className}` : base;
5
+ }
6
+
7
+ export interface EditorToolbarProps extends HTMLAttributes<HTMLDivElement> {
8
+ label: string;
9
+ compact?: boolean;
10
+ }
11
+
12
+ export const EditorToolbar = forwardRef<HTMLDivElement, EditorToolbarProps>(function EditorToolbar(
13
+ { label, compact = false, className, ...props },
14
+ ref,
15
+ ) {
16
+ return (
17
+ <div
18
+ {...props}
19
+ ref={ref}
20
+ role="toolbar"
21
+ aria-label={label}
22
+ data-compact={compact || undefined}
23
+ className={classes('vgai-toolbar', className)}
24
+ />
25
+ );
26
+ });
27
+
28
+ export function ToolbarGroup({ className, ...props }: HTMLAttributes<HTMLDivElement>) {
29
+ return <div {...props} role="group" className={classes('vgai-toolbar-group', className)} />;
30
+ }
31
+
32
+ export function ToolbarDivider(props: HTMLAttributes<HTMLSpanElement>) {
33
+ return (
34
+ <span
35
+ {...props}
36
+ aria-hidden="true"
37
+ className={classes('vgai-toolbar-divider', props.className)}
38
+ />
39
+ );
40
+ }
41
+
42
+ /** Viewport-local tool cluster. Placement remains the viewport's responsibility. */
43
+ export function FloatingToolbar({ className, ...props }: EditorToolbarProps) {
44
+ return (
45
+ <EditorToolbar {...props} compact className={classes('vgai-floating-toolbar', className)} />
46
+ );
47
+ }
48
+
49
+ export function SplitButtonGroup({ className, ...props }: HTMLAttributes<HTMLDivElement>) {
50
+ return <div {...props} role="group" className={classes('vgai-split-button', className)} />;
51
+ }
@@ -0,0 +1,72 @@
1
+ import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
2
+
3
+ function classes(base: string, className?: string): string {
4
+ return className ? `${base} ${className}` : base;
5
+ }
6
+
7
+ export interface EditorTreeProps extends HTMLAttributes<HTMLDivElement> {
8
+ label: string;
9
+ }
10
+
11
+ export const EditorTree = forwardRef<HTMLDivElement, EditorTreeProps>(function EditorTree(
12
+ { label, className, ...props },
13
+ ref,
14
+ ) {
15
+ return (
16
+ <div
17
+ {...props}
18
+ ref={ref}
19
+ role="tree"
20
+ aria-label={label}
21
+ className={classes('vgai-tree', className)}
22
+ />
23
+ );
24
+ });
25
+
26
+ export interface EditorTreeRowProps extends HTMLAttributes<HTMLDivElement> {
27
+ level?: number;
28
+ selected?: boolean;
29
+ expanded?: boolean | undefined;
30
+ muted?: boolean;
31
+ dragging?: boolean;
32
+ leading?: ReactNode;
33
+ actions?: ReactNode;
34
+ }
35
+
36
+ export const EditorTreeRow = forwardRef<HTMLDivElement, EditorTreeRowProps>(function EditorTreeRow(
37
+ {
38
+ level = 1,
39
+ selected = false,
40
+ expanded,
41
+ muted = false,
42
+ dragging = false,
43
+ leading,
44
+ actions,
45
+ className,
46
+ children,
47
+ style,
48
+ ...props
49
+ },
50
+ ref,
51
+ ) {
52
+ return (
53
+ <div
54
+ {...props}
55
+ ref={ref}
56
+ role="treeitem"
57
+ tabIndex={props.tabIndex ?? -1}
58
+ aria-level={level}
59
+ aria-selected={selected}
60
+ {...(expanded === undefined ? {} : { 'aria-expanded': expanded })}
61
+ data-selected={selected || undefined}
62
+ data-muted={muted || undefined}
63
+ data-dragging={dragging || undefined}
64
+ className={classes('vgai-tree-row', className)}
65
+ style={{ paddingLeft: 6 + Math.max(0, level - 1) * 14, ...style }}
66
+ >
67
+ {leading && <span className="vgai-tree-row-leading">{leading}</span>}
68
+ <span className="vgai-tree-row-label">{children}</span>
69
+ {actions && <span className="vgai-tree-row-actions">{actions}</span>}
70
+ </div>
71
+ );
72
+ });
@@ -0,0 +1,46 @@
1
+ import { type ButtonHTMLAttributes, forwardRef } from 'react';
2
+
3
+ export type ButtonVariant =
4
+ | 'primary'
5
+ | 'secondary'
6
+ | 'outline'
7
+ | 'ghost'
8
+ | 'danger'
9
+ | 'success'
10
+ /** @deprecated Use primary. Kept for project-tool source compatibility. */
11
+ | 'solid';
12
+ export type ButtonSize = 'compact' | 'default' | 'comfortable';
13
+
14
+ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
15
+ variant?: ButtonVariant;
16
+ size?: ButtonSize;
17
+ }
18
+
19
+ export type IconButtonProps = Omit<ButtonProps, 'aria-label'> & {
20
+ 'aria-label': string;
21
+ };
22
+
23
+ /** Canonical editor button. Visual variants and dimensions live in theme-css. */
24
+ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
25
+ { variant = 'secondary', size = 'default', className, type = 'button', ...props },
26
+ ref,
27
+ ) {
28
+ return (
29
+ <button
30
+ {...props}
31
+ ref={ref}
32
+ type={type}
33
+ className={className ? `vgai-btn ${className}` : 'vgai-btn'}
34
+ data-variant={variant}
35
+ data-size={size}
36
+ />
37
+ );
38
+ });
39
+
40
+ /** Icon-only button. The accessible name is required by its public type. */
41
+ export const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(
42
+ { variant = 'ghost', ...props },
43
+ ref,
44
+ ) {
45
+ return <Button {...props} ref={ref} variant={variant} data-icon="true" />;
46
+ });