@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
@@ -24,11 +24,13 @@ const EMBED_ID = 'embed:root';
24
24
  export function makeEmbedOnlyAdapter(store: EditorStore, label: string): AuthoringAdapter {
25
25
  const node: EditorNode = {
26
26
  id: EMBED_ID,
27
- label: `${label} (embed-only)`,
27
+ label,
28
+ secondaryLabel: 'Embed only',
29
+ role: 'boundary',
28
30
  kind: 'object',
29
31
  parentId: null,
30
32
  childIds: [],
31
- flags: { runtimeOnly: true, locked: true },
33
+ flags: { runtimeOnly: true, locked: true, readOnly: true },
32
34
  };
33
35
  const hierarchy: HierarchyProvider = {
34
36
  roots: () => [node],
@@ -18,6 +18,7 @@
18
18
  */
19
19
 
20
20
  import { resolveUrl } from '@engine/loader';
21
+ import { themeVars } from '../design-system';
21
22
  import { registerHierarchyMenuItems } from '../hierarchy-menu-registry';
22
23
 
23
24
  // Prefab Unpack/Open/Save-as — not yet contract-expressible (StructureProvider
@@ -48,7 +49,9 @@ registerHierarchyMenuItems(
48
49
  },
49
50
  {
50
51
  label: 'Open Prefab',
51
- color: '#60a5fa',
52
+ // L-9 — was `#60a5fa`, a one-off blue that clashed with the app's real
53
+ // accent (`#579EFF`) rendered right beside it (Rename/Duplicate/Delete).
54
+ color: themeVars.accent.default,
52
55
  action: () => {
53
56
  window.dispatchEvent(
54
57
  new CustomEvent('editor:open-asset', { detail: { path: prefabPath } }),
@@ -60,7 +63,9 @@ registerHierarchyMenuItems(
60
63
  return [
61
64
  {
62
65
  label: 'Save as Prefab...',
63
- color: '#60a5fa',
66
+ // L-9 — was `#60a5fa`, a one-off blue that clashed with the app's real
67
+ // accent (`#579EFF`) rendered right beside it (Rename/Duplicate/Delete).
68
+ color: themeVars.accent.default,
64
69
  action: () => {
65
70
  window.dispatchEvent(
66
71
  new CustomEvent('editor:save-as-prefab', {
@@ -1,3 +1,4 @@
1
+ import { Select } from '../../design-system';
1
2
  /**
2
3
  * First-party "+ Add Section…" menu (C2, docs/unified-world-editor/26-
3
4
  * unified-editor-spec.md §4 C2) — verbatim from the deleted
@@ -76,7 +77,7 @@ export function AddSectionMenu({ entities, ids }: SectionProps) {
76
77
 
77
78
  return (
78
79
  <div style={{ padding: '6px 8px' }}>
79
- <select
80
+ <Select
80
81
  onChange={(e) => {
81
82
  const item = available.find((i) => i.label === e.target.value);
82
83
  if (item) {
@@ -93,16 +94,8 @@ export function AddSectionMenu({ entities, ids }: SectionProps) {
93
94
  e.target.value = '';
94
95
  }}
95
96
  value=""
96
- style={{
97
- width: '100%',
98
- background: '#333',
99
- color: '#c5c8ce',
100
- border: '1px solid #444',
101
- borderRadius: 3,
102
- fontSize: 11,
103
- padding: '3px 4px',
104
- cursor: 'pointer',
105
- }}
97
+ className="vgai-select"
98
+ style={{ width: '100%' }}
106
99
  >
107
100
  <option value="" disabled>
108
101
  + Add Section...
@@ -112,7 +105,7 @@ export function AddSectionMenu({ entities, ids }: SectionProps) {
112
105
  {item.label}
113
106
  </option>
114
107
  ))}
115
- </select>
108
+ </Select>
116
109
  </div>
117
110
  );
118
111
  }
@@ -1,3 +1,4 @@
1
+ import { Button, Select, TextInput } from '../../design-system';
1
2
  /**
2
3
  * First-party scene Environment inspector (C2, docs/unified-world-editor/
3
4
  * 26-unified-editor-spec.md §4 C2) — the deselect-state panel: Scene name/
@@ -18,30 +19,17 @@ import type {
18
19
  ScenePhysicsSettings,
19
20
  SceneToneMapping,
20
21
  } from '@engine/scene/scene-types';
22
+ import { fieldLabelStyle } from '../../components/inspector-widgets/shared';
21
23
  import { PostProcessingSection } from '../../components/inspectors/PostProcessingSection';
22
24
  import { RenderingSection } from '../../components/inspectors/RenderingSection';
23
- import { ColorInput } from '../../components/primitives/ColorInput';
24
- import { NumberInput } from '../../components/primitives/NumberInput';
25
- import { SectionHeader } from '../../components/primitives/SectionHeader';
25
+ import { ColorInput, NumberInput, SectionHeader, themeVars } from '../../design-system';
26
26
  import { useEditorStore } from '../../EditorContext';
27
27
  import type { EditorStore } from '../../editor-store';
28
28
  import type { InspectorSectionProps } from '../../inspector-section-registry';
29
29
 
30
- const btnStyle: React.CSSProperties = {
31
- background: '#333',
32
- color: '#c5c8ce',
33
- border: '1px solid #444',
34
- borderRadius: 3,
35
- padding: '3px 8px',
36
- cursor: 'pointer',
37
- fontSize: 11,
38
- };
30
+ // Shared chrome button (I-8/I-10) — the old per-file literal.
39
31
 
40
- const labelStyle: React.CSSProperties = {
41
- fontSize: 11,
42
- color: '#8c8c8c',
43
- marginBottom: 2,
44
- };
32
+ const labelStyle: React.CSSProperties = fieldLabelStyle;
45
33
 
46
34
  const fogTypes = ['linear', 'exponential'] as const;
47
35
 
@@ -55,20 +43,18 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
55
43
  <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
56
44
  <div>
57
45
  <div style={labelStyle}>Name</div>
58
- <input
46
+ <TextInput
59
47
  value={store.sceneName}
48
+ onFocus={() => store.beginInteractiveEdit('Rename Scene')}
60
49
  onChange={(e) => {
61
50
  store.setSceneName(e.target.value);
62
51
  }}
63
- style={{
64
- width: '100%',
65
- background: '#1e1e1e',
66
- border: '1px solid #333',
67
- borderRadius: 2,
68
- color: '#c5c8ce',
69
- fontSize: 12,
70
- padding: '3px 6px',
52
+ onBlur={() => store.endInteractiveEdit()}
53
+ onKeyDown={(e) => {
54
+ if (e.key === 'Enter') e.currentTarget.blur();
71
55
  }}
56
+ className="vgai-input"
57
+ style={{ width: '100%' }}
72
58
  />
73
59
  </div>
74
60
  <div>
@@ -85,7 +71,7 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
85
71
  <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
86
72
  <div>
87
73
  <div style={labelStyle}>HDR / Image Path</div>
88
- <input
74
+ <TextInput
89
75
  value={env.skybox ?? ''}
90
76
  onChange={(e) => {
91
77
  if (e.target.value) {
@@ -96,15 +82,8 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
96
82
  }
97
83
  }}
98
84
  placeholder="/assets/env/sky.hdr"
99
- style={{
100
- width: '100%',
101
- background: '#1e1e1e',
102
- border: '1px solid #333',
103
- borderRadius: 2,
104
- color: '#c5c8ce',
105
- fontSize: 12,
106
- padding: '3px 6px',
107
- }}
85
+ className="vgai-input"
86
+ style={{ width: '100%' }}
108
87
  />
109
88
  </div>
110
89
  <div>
@@ -116,16 +95,16 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
116
95
  />
117
96
  </div>
118
97
  {env.skybox && (
119
- <button
98
+ <Button
120
99
  type="button"
121
- style={{ ...btnStyle, fontSize: 10, padding: '2px 6px' }}
100
+ size="compact"
122
101
  onClick={() => {
123
102
  const { skybox: _s, envMapIntensity: _i, ...rest } = env;
124
103
  store.setEnvironment(rest as SceneEnvironment);
125
104
  }}
126
105
  >
127
106
  Remove Skybox
128
- </button>
107
+ </Button>
129
108
  )}
130
109
  </div>
131
110
  </SectionHeader>
@@ -162,7 +141,7 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
162
141
  <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
163
142
  <div>
164
143
  <div style={labelStyle}>Type</div>
165
- <select
144
+ <Select
166
145
  value={env.fog?.type ?? 'linear'}
167
146
  onChange={(e) =>
168
147
  store.updateEnvironment({
@@ -173,22 +152,15 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
173
152
  },
174
153
  })
175
154
  }
176
- style={{
177
- width: '100%',
178
- background: '#1e1e1e',
179
- border: '1px solid #333',
180
- borderRadius: 2,
181
- color: '#c5c8ce',
182
- fontSize: 11,
183
- padding: '2px 4px',
184
- }}
155
+ className="vgai-select"
156
+ style={{ width: '100%' }}
185
157
  >
186
158
  {fogTypes.map((t) => (
187
159
  <option key={t} value={t}>
188
160
  {t}
189
161
  </option>
190
162
  ))}
191
- </select>
163
+ </Select>
192
164
  </div>
193
165
  <div>
194
166
  <div style={labelStyle}>Color</div>
@@ -258,16 +230,16 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
258
230
  </div>
259
231
  )}
260
232
  {env.fog && (
261
- <button
233
+ <Button
262
234
  type="button"
263
- style={{ ...btnStyle, fontSize: 10, padding: '2px 6px' }}
235
+ size="compact"
264
236
  onClick={() => {
265
237
  const { fog: _fog, ...rest } = env;
266
238
  store.setEnvironment(rest as SceneEnvironment);
267
239
  }}
268
240
  >
269
241
  Remove Fog
270
- </button>
242
+ </Button>
271
243
  )}
272
244
  </div>
273
245
  </SectionHeader>
@@ -276,7 +248,7 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
276
248
  <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
277
249
  <div>
278
250
  <div style={labelStyle}>Mode</div>
279
- <select
251
+ <Select
280
252
  value={env.toneMapping?.mode ?? DEFAULTS.toneMapping.mode}
281
253
  onChange={(e) =>
282
254
  store.updateEnvironment({
@@ -286,22 +258,15 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
286
258
  },
287
259
  })
288
260
  }
289
- style={{
290
- width: '100%',
291
- background: '#1e1e1e',
292
- border: '1px solid #333',
293
- borderRadius: 2,
294
- color: '#c5c8ce',
295
- fontSize: 11,
296
- padding: '2px 4px',
297
- }}
261
+ className="vgai-select"
262
+ style={{ width: '100%' }}
298
263
  >
299
264
  {(['none', 'linear', 'reinhard', 'cineon', 'aces', 'agx'] as const).map((m) => (
300
265
  <option key={m} value={m}>
301
266
  {m}
302
267
  </option>
303
268
  ))}
304
- </select>
269
+ </Select>
305
270
  </div>
306
271
  <div>
307
272
  <div style={labelStyle}>Exposure</div>
@@ -361,52 +326,29 @@ function CollisionLayerEditor({ store }: { store: EditorStore }) {
361
326
  <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
362
327
  {layers.map((name, i) => (
363
328
  <div key={i} style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
364
- <span style={{ fontSize: 10, color: '#8c8c8c', width: 16, textAlign: 'right' }}>{i}</span>
365
- <input
329
+ <span
330
+ style={{ fontSize: 10, color: themeVars.content.muted, width: 16, textAlign: 'right' }}
331
+ >
332
+ {i}
333
+ </span>
334
+ <TextInput
335
+ className="vgai-input"
366
336
  value={name}
367
337
  onChange={(e) => renameLayer(i, e.target.value)}
368
- style={{
369
- flex: 1,
370
- background: '#1e1e1e',
371
- border: '1px solid #333',
372
- borderRadius: 2,
373
- color: '#c5c8ce',
374
- fontSize: 11,
375
- padding: '2px 4px',
376
- }}
338
+ style={{ flex: 1 }}
377
339
  />
378
- <button
379
- type="button"
380
- onClick={() => removeLayer(i)}
381
- style={{
382
- background: 'none',
383
- border: 'none',
384
- color: '#666',
385
- cursor: 'pointer',
386
- fontSize: 11,
387
- padding: '0 4px',
388
- }}
389
- >
390
- x
391
- </button>
340
+ <Button type="button" onClick={() => removeLayer(i)} variant="ghost" size="compact">
341
+ ×
342
+ </Button>
392
343
  </div>
393
344
  ))}
394
345
  {layers.length < 16 && (
395
- <button
396
- type="button"
397
- onClick={addLayer}
398
- style={{
399
- ...btnStyle,
400
- fontSize: 10,
401
- padding: '2px 6px',
402
- alignSelf: 'flex-start',
403
- }}
404
- >
346
+ <Button type="button" onClick={addLayer} style={{ alignSelf: 'flex-start' }}>
405
347
  + Add Layer
406
- </button>
348
+ </Button>
407
349
  )}
408
350
  {layers.length === 0 && (
409
- <div style={{ fontSize: 10, color: '#666', fontStyle: 'italic' }}>
351
+ <div style={{ fontSize: 10, color: themeVars.content.dim, fontStyle: 'italic' }}>
410
352
  No collision layers defined. Add layers to enable per-entity collision filtering.
411
353
  </div>
412
354
  )}
@@ -507,41 +449,26 @@ function NavigationBakeSection({ store }: { store: EditorStore }) {
507
449
  />
508
450
  </div>
509
451
  <div style={{ display: 'flex', gap: 4, marginTop: 4 }}>
510
- <button
452
+ <Button
511
453
  type="button"
454
+ variant={stale ? 'success' : 'primary'}
455
+ size="compact"
512
456
  onClick={() => window.dispatchEvent(new CustomEvent('editor:bake-navmesh'))}
513
- style={{
514
- flex: 1,
515
- background: stale ? '#3a5f1e' : '#333',
516
- color: '#c5c8ce',
517
- border: `1px solid ${stale ? '#5a8f2e' : '#444'}`,
518
- borderRadius: 3,
519
- padding: '4px 8px',
520
- cursor: 'pointer',
521
- fontSize: 11,
522
- fontWeight: 600,
523
- }}
457
+ style={{ flex: 1 }}
524
458
  >
525
459
  {stale ? 'Bake NavMesh *' : 'Bake NavMesh'}
526
- </button>
527
- <button
460
+ </Button>
461
+ <Button
528
462
  type="button"
463
+ variant="secondary"
464
+ size="compact"
529
465
  onClick={() => window.dispatchEvent(new CustomEvent('editor:clear-navmesh'))}
530
- style={{
531
- background: '#333',
532
- color: '#c5c8ce',
533
- border: '1px solid #444',
534
- borderRadius: 3,
535
- padding: '4px 8px',
536
- cursor: 'pointer',
537
- fontSize: 11,
538
- }}
539
466
  >
540
467
  Clear
541
- </button>
468
+ </Button>
542
469
  </div>
543
470
  {stale && (
544
- <div style={{ fontSize: 10, color: '#e0a030', marginTop: 2 }}>
471
+ <div style={{ fontSize: 10, color: themeVars.semantic.warning, marginTop: 2 }}>
545
472
  Scene changed since last bake
546
473
  </div>
547
474
  )}
@@ -1,3 +1,4 @@
1
+ import { Button, TextInput } from '../../design-system';
1
2
  /**
2
3
  * First-party HeaderSection (C2, docs/unified-world-editor/26-unified-
3
4
  * editor-spec.md §4 C2) — entity name field, multi-select header, prefab
@@ -13,25 +14,18 @@
13
14
 
14
15
  import { resolveUrl } from '@engine/loader';
15
16
  import { faXmark } from '@fortawesome/free-solid-svg-icons';
16
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
17
17
  import { useEffect, useState } from 'react';
18
18
  import { getActiveAuthoring } from '../../authoring/active-adapter';
19
19
  import { resolveNameCommit } from '../../components/entity-name-commit';
20
+ import { popoverStyle } from '../../components/inspector-widgets/shared';
20
21
  import type { SectionProps } from '../../components/inspectors/multi-edit-utils';
22
+ import { EditorIcon, themeVars } from '../../design-system';
21
23
  import { useEditorStore } from '../../EditorContext';
22
24
  import type { EditorStore } from '../../editor-store';
23
25
 
24
26
  type Entity = SectionProps['entities'][number];
25
27
 
26
- const btnStyle: React.CSSProperties = {
27
- background: '#333',
28
- color: '#c5c8ce',
29
- border: '1px solid #444',
30
- borderRadius: 3,
31
- padding: '3px 8px',
32
- cursor: 'pointer',
33
- fontSize: 11,
34
- };
28
+ // Shared compact chrome button (I-8/I-10) — the old per-file literal.
35
29
 
36
30
  /**
37
31
  * Entity name field — local draft state, commits (and thus pushes an undo
@@ -66,7 +60,7 @@ function EntityNameField({
66
60
  };
67
61
 
68
62
  return (
69
- <input
63
+ <TextInput
70
64
  value={draft}
71
65
  onChange={(e) => setDraft(e.target.value)}
72
66
  onBlur={commit}
@@ -79,16 +73,8 @@ function EntityNameField({
79
73
  (e.target as HTMLInputElement).blur();
80
74
  }
81
75
  }}
82
- style={{
83
- width: '100%',
84
- background: '#1e1e1e',
85
- color: '#c5c8ce',
86
- border: '1px solid #333',
87
- borderRadius: 2,
88
- padding: '4px 6px',
89
- fontSize: 13,
90
- fontWeight: 600,
91
- }}
76
+ className="vgai-input"
77
+ style={{ width: '100%', padding: '4px 6px', fontSize: 13, fontWeight: 600 }}
92
78
  />
93
79
  );
94
80
  }
@@ -102,15 +88,25 @@ export function HeaderSection({ entities, ids }: SectionProps) {
102
88
  <>
103
89
  {/* Entity name — single entity only */}
104
90
  {!multi && (
105
- <div style={{ padding: '8px', borderBottom: '1px solid #333' }}>
91
+ <div style={{ padding: '8px', borderBottom: `1px solid ${themeVars.boundary.default}` }}>
106
92
  <EntityNameField key={entity.id} store={store} entityId={entity.id!} name={entity.name} />
107
93
  </div>
108
94
  )}
109
95
 
110
96
  {/* Multi-entity header */}
111
97
  {multi && (
112
- <div style={{ padding: '8px', borderBottom: '1px solid #333' }}>
113
- <div style={{ fontWeight: 600, fontSize: 13 }}>{ids.length} entities selected</div>
98
+ <div
99
+ style={{
100
+ padding: '8px',
101
+ borderBottom: `1px solid ${themeVars.boundary.default}`,
102
+ // I-16: same info-banner band the prefab/material-ref banners use,
103
+ // so a multi-selection reads with real visual weight.
104
+ background: themeVars.accent.muted,
105
+ }}
106
+ >
107
+ <div style={{ fontWeight: 600, fontSize: 13, color: themeVars.content.primary }}>
108
+ {ids.length} entities selected
109
+ </div>
114
110
  </div>
115
111
  )}
116
112
 
@@ -119,18 +115,22 @@ export function HeaderSection({ entities, ids }: SectionProps) {
119
115
  <div
120
116
  style={{
121
117
  padding: '6px 8px',
122
- borderBottom: '1px solid #333',
123
- background: '#1e3a5f',
118
+ borderBottom: `1px solid ${themeVars.boundary.default}`,
119
+ // Info-banner tint band — deliberate literal (no tinted-panel
120
+ // token slot); text/buttons reconciled onto text-1/themeVars.accent.default (I-5).
121
+ background: themeVars.accent.muted,
124
122
  display: 'flex',
125
123
  alignItems: 'center',
126
124
  gap: 6,
127
125
  }}
128
126
  >
129
- <span style={{ fontSize: 11, color: '#93c5fd', fontWeight: 600 }}>Prefab</span>
127
+ <span style={{ fontSize: 11, color: themeVars.content.primary, fontWeight: 600 }}>
128
+ Prefab
129
+ </span>
130
130
  <span
131
131
  style={{
132
132
  fontSize: 10,
133
- color: '#60a5fa',
133
+ color: themeVars.accent.default,
134
134
  flex: 1,
135
135
  overflow: 'hidden',
136
136
  textOverflow: 'ellipsis',
@@ -140,9 +140,10 @@ export function HeaderSection({ entities, ids }: SectionProps) {
140
140
  >
141
141
  {entity.prefab.split('/').pop()?.replace('.prefab.json', '')}
142
142
  </span>
143
- <button
143
+ <Button
144
144
  type="button"
145
- style={{ ...btnStyle, fontSize: 10, padding: '2px 6px', color: '#60a5fa' }}
145
+ variant="outline"
146
+ size="compact"
146
147
  onClick={() => {
147
148
  window.dispatchEvent(
148
149
  new CustomEvent('editor:open-asset', { detail: { path: entity.prefab } }),
@@ -150,10 +151,9 @@ export function HeaderSection({ entities, ids }: SectionProps) {
150
151
  }}
151
152
  >
152
153
  Open
153
- </button>
154
- <button
154
+ </Button>
155
+ <Button
155
156
  type="button"
156
- style={{ ...btnStyle, fontSize: 10, padding: '2px 6px' }}
157
157
  onClick={async () => {
158
158
  try {
159
159
  const res = await fetch(resolveUrl(entity.prefab!));
@@ -167,7 +167,7 @@ export function HeaderSection({ entities, ids }: SectionProps) {
167
167
  }}
168
168
  >
169
169
  Unpack
170
- </button>
170
+ </Button>
171
171
  </div>
172
172
  )}
173
173
 
@@ -196,9 +196,11 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
196
196
  };
197
197
 
198
198
  return (
199
- <div style={{ padding: '4px 8px 6px', borderBottom: '1px solid #333' }}>
199
+ <div
200
+ style={{ padding: '4px 8px 6px', borderBottom: `1px solid ${themeVars.boundary.default}` }}
201
+ >
200
202
  <div style={{ display: 'flex', alignItems: 'center', gap: 4, flexWrap: 'wrap' }}>
201
- <span style={{ fontSize: 10, color: '#8c8c8c', fontWeight: 600 }}>Tags</span>
203
+ <span style={{ fontSize: 10, color: themeVars.content.muted, fontWeight: 600 }}>Tags</span>
202
204
  {tags.map((tag) => (
203
205
  <span
204
206
  key={tag}
@@ -206,12 +208,14 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
206
208
  display: 'inline-flex',
207
209
  alignItems: 'center',
208
210
  gap: 2,
209
- background: '#3a3a3a',
210
- border: '1px solid #555',
211
- borderRadius: 10,
211
+ background: themeVars.surface.raised,
212
+ border: `1px solid ${themeVars.boundary.strong}`,
213
+ // radius-lg: at chip height this still reads as a pill, without
214
+ // keeping the one-off radius-10 outlier (I-23; §3 mapping).
215
+ borderRadius: themeVars.shape.large,
212
216
  padding: '1px 6px',
213
217
  fontSize: 10,
214
- color: '#c5c8ce',
218
+ color: themeVars.content.primary,
215
219
  }}
216
220
  >
217
221
  {tag}
@@ -224,7 +228,7 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
224
228
  }}
225
229
  style={{ cursor: 'pointer', opacity: 0.6, fontSize: 9, marginLeft: 2 }}
226
230
  >
227
- <FontAwesomeIcon icon={faXmark} />
231
+ <EditorIcon icon={faXmark} />
228
232
  </span>
229
233
  </span>
230
234
  ))}
@@ -238,7 +242,7 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
238
242
  }}
239
243
  style={{
240
244
  fontSize: 10,
241
- color: '#579EFF',
245
+ color: themeVars.accent.default,
242
246
  cursor: 'pointer',
243
247
  padding: '1px 4px',
244
248
  }}
@@ -249,7 +253,7 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
249
253
  </div>
250
254
  {showInput && (
251
255
  <div style={{ marginTop: 4, position: 'relative' }}>
252
- <input
256
+ <TextInput
253
257
  autoFocus
254
258
  value={inputValue}
255
259
  onChange={(e) => setInputValue(e.target.value)}
@@ -269,35 +273,25 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
269
273
  setShowInput(false);
270
274
  }}
271
275
  placeholder="Add tag..."
272
- style={{
273
- width: '100%',
274
- background: '#1e1e1e',
275
- border: '1px solid #579EFF',
276
- borderRadius: 3,
277
- color: '#c5c8ce',
278
- fontSize: 11,
279
- padding: '2px 6px',
280
- outline: 'none',
281
- }}
276
+ className="vgai-input"
277
+ style={{ width: '100%', borderColor: themeVars.accent.default }}
282
278
  />
283
279
  {inputValue && suggestions.length > 0 && (
284
280
  <div
285
281
  style={{
282
+ ...popoverStyle,
286
283
  position: 'absolute',
287
284
  top: '100%',
288
285
  left: 0,
289
286
  right: 0,
290
- background: '#2c2c2c',
291
- border: '1px solid #444',
292
- borderRadius: 3,
293
- zIndex: 100,
287
+ zIndex: 'var(--vgai-z-dropdown)',
294
288
  maxHeight: 100,
295
289
  overflowY: 'auto',
296
- scrollbarWidth: 'none',
297
290
  }}
298
291
  >
299
292
  {suggestions.slice(0, 5).map((s) => (
300
293
  <div
294
+ className="vgai-selectable"
301
295
  key={s}
302
296
  onMouseDown={(e) => {
303
297
  e.preventDefault();
@@ -307,14 +301,9 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
307
301
  style={{
308
302
  padding: '3px 8px',
309
303
  fontSize: 11,
310
- color: '#c5c8ce',
304
+ color: themeVars.content.primary,
311
305
  cursor: 'pointer',
312
- }}
313
- onMouseEnter={(e) => {
314
- (e.currentTarget as HTMLDivElement).style.background = '#3a3a3a';
315
- }}
316
- onMouseLeave={(e) => {
317
- (e.currentTarget as HTMLDivElement).style.background = 'transparent';
306
+ borderRadius: themeVars.shape.small,
318
307
  }}
319
308
  >
320
309
  {s}