@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,9 +1,15 @@
1
1
  import type { SceneCollider, SceneEnvironment, ScenePhysics } from '@engine/scene/scene-types';
2
+ import {
3
+ Checkbox,
4
+ NumberInput,
5
+ SectionHeader,
6
+ Select,
7
+ Tooltip,
8
+ themeVars,
9
+ Vec3Input,
10
+ } from '../../design-system';
2
11
  import { useEditorStore } from '../../EditorContext';
3
- import { NumberInput } from '../primitives/NumberInput';
4
- import { SectionHeader } from '../primitives/SectionHeader';
5
- import { Tooltip } from '../primitives/Tooltip';
6
- import { Vec3Input } from '../primitives/Vec3Input';
12
+ import { fieldLabelStyle, groupLabelStyle, mixedStyle } from '../inspector-widgets/shared';
7
13
  import type { SectionProps } from './multi-edit-utils';
8
14
  import { commonBool, commonNum, commonStr, commonVec3 } from './multi-edit-utils';
9
15
 
@@ -25,20 +31,9 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
25
31
  const sensor = commonBool(entities, (e) => e.physics?.collider.isSensor ?? false);
26
32
  const offset = commonVec3(entities, (e) => e.physics?.collider.offset ?? [0, 0, 0]);
27
33
 
28
- const selectStyle: React.CSSProperties = {
29
- width: '100%',
30
- background: '#1e1e1e',
31
- color: '#c5c8ce',
32
- border: '1px solid #333',
33
- borderRadius: 2,
34
- padding: '3px 4px',
35
- fontSize: 12,
36
- };
37
-
38
34
  const mixedSelectStyle = (isMixed: boolean): React.CSSProperties => ({
39
- ...selectStyle,
40
- color: isMixed ? '#666' : '#c5c8ce',
41
- fontStyle: isMixed ? 'italic' : 'normal',
35
+ width: '100%',
36
+ ...mixedStyle(isMixed),
42
37
  });
43
38
 
44
39
  const update = (partial: Partial<ScenePhysics>) => {
@@ -61,16 +56,17 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
61
56
  text="Dynamic: simulated, Fixed: immovable, Kinematic: scripted"
62
57
  position="right"
63
58
  >
64
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Body Type</div>
59
+ <div style={fieldLabelStyle}>Body Type</div>
65
60
  </Tooltip>
66
- <select
61
+ <Select
62
+ className="vgai-select"
67
63
  value={bodyType ?? ''}
68
64
  onChange={(e) => update({ bodyType: e.target.value as ScenePhysics['bodyType'] })}
69
65
  style={mixedSelectStyle(bodyType === null)}
70
66
  >
71
67
  {bodyType === null && (
72
68
  <option value="" disabled>
73
- (mixed)
69
+ —
74
70
  </option>
75
71
  )}
76
72
  {bodyTypes.map((t) => (
@@ -78,24 +74,25 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
78
74
  {t}
79
75
  </option>
80
76
  ))}
81
- </select>
77
+ </Select>
82
78
  </div>
83
79
  <div>
84
80
  <Tooltip text="Weight for physics simulation" position="right">
85
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Mass</div>
81
+ <div style={fieldLabelStyle}>Mass</div>
86
82
  </Tooltip>
87
83
  <NumberInput value={mass} onChange={(v) => update({ mass: v })} step={0.1} />
88
84
  </div>
89
85
  <div>
90
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Collider Type</div>
91
- <select
86
+ <div style={fieldLabelStyle}>Collider Type</div>
87
+ <Select
88
+ className="vgai-select"
92
89
  value={colliderType ?? ''}
93
90
  onChange={(e) => updateCollider({ type: e.target.value as SceneCollider['type'] })}
94
91
  style={mixedSelectStyle(colliderType === null)}
95
92
  >
96
93
  {colliderType === null && (
97
94
  <option value="" disabled>
98
- (mixed)
95
+ —
99
96
  </option>
100
97
  )}
101
98
  {colliderTypes.map((t) => (
@@ -103,12 +100,12 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
103
100
  {t}
104
101
  </option>
105
102
  ))}
106
- </select>
103
+ </Select>
107
104
  </div>
108
105
  {colliderType === 'cuboid' && (
109
106
  <div>
110
107
  <Tooltip text="Half-size from center to edge" position="right">
111
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Half Extents</div>
108
+ <div style={fieldLabelStyle}>Half Extents</div>
112
109
  </Tooltip>
113
110
  <Vec3Input
114
111
  value={commonVec3(
@@ -134,7 +131,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
134
131
  )}
135
132
  {colliderType === 'ball' && (
136
133
  <div>
137
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Radius</div>
134
+ <div style={fieldLabelStyle}>Radius</div>
138
135
  <NumberInput
139
136
  value={commonNum(entities, (e) => e.physics?.collider.radius ?? 0.5)}
140
137
  onChange={(v) => updateCollider({ radius: v })}
@@ -145,7 +142,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
145
142
  {colliderType === 'capsule' && (
146
143
  <>
147
144
  <div>
148
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Radius</div>
145
+ <div style={fieldLabelStyle}>Radius</div>
149
146
  <NumberInput
150
147
  value={commonNum(entities, (e) => e.physics?.collider.radius ?? 0.25)}
151
148
  onChange={(v) => updateCollider({ radius: v })}
@@ -153,7 +150,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
153
150
  />
154
151
  </div>
155
152
  <div>
156
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Half Height</div>
153
+ <div style={fieldLabelStyle}>Half Height</div>
157
154
  <NumberInput
158
155
  value={commonNum(entities, (e) => e.physics?.collider.halfHeight ?? 0.5)}
159
156
  onChange={(v) => updateCollider({ halfHeight: v })}
@@ -166,7 +163,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
166
163
  {/* Physics material */}
167
164
  <div>
168
165
  <Tooltip text="Surface friction — 0 = ice, 1+ = sticky" position="right">
169
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Friction</div>
166
+ <div style={fieldLabelStyle}>Friction</div>
170
167
  </Tooltip>
171
168
  <NumberInput
172
169
  value={friction}
@@ -176,7 +173,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
176
173
  </div>
177
174
  <div>
178
175
  <Tooltip text="Bounciness — 0 = no bounce, 1 = full bounce" position="right">
179
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Restitution</div>
176
+ <div style={fieldLabelStyle}>Restitution</div>
180
177
  </Tooltip>
181
178
  <NumberInput
182
179
  value={restitution}
@@ -186,7 +183,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
186
183
  </div>
187
184
  <div>
188
185
  <Tooltip text="Mass per volume — overrides mass when set" position="right">
189
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Density</div>
186
+ <div style={fieldLabelStyle}>Density</div>
190
187
  </Tooltip>
191
188
  <NumberInput
192
189
  value={density}
@@ -196,7 +193,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
196
193
  </div>
197
194
  <div>
198
195
  <Tooltip text="Local offset from body origin" position="right">
199
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Collider Offset</div>
196
+ <div style={fieldLabelStyle}>Collider Offset</div>
200
197
  </Tooltip>
201
198
  <Vec3Input
202
199
  value={offset}
@@ -221,15 +218,17 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
221
218
  <div>
222
219
  <Tooltip text="Detect overlaps without physical blocking" position="right">
223
220
  <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
224
- <input
225
- type="checkbox"
221
+ <Checkbox
222
+ className="vgai-checkbox"
226
223
  checked={sensor ?? false}
227
224
  ref={(el) => {
228
225
  if (el) el.indeterminate = sensor === null;
229
226
  }}
230
227
  onChange={(e) => updateCollider({ isSensor: e.target.checked })}
231
228
  />
232
- <span style={{ fontSize: 11, color: '#c5c8ce' }}>Is Sensor (Trigger)</span>
229
+ <span style={{ fontSize: 11, color: themeVars.content.primary }}>
230
+ Is Sensor (Trigger)
231
+ </span>
233
232
  </div>
234
233
  </Tooltip>
235
234
  </div>
@@ -257,11 +256,8 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
257
256
  // --- Collision Layers ---
258
257
 
259
258
  const layerLabelStyle: React.CSSProperties = {
260
- fontSize: 10,
261
- color: '#8c8c8c',
259
+ ...groupLabelStyle,
262
260
  marginBottom: 2,
263
- fontWeight: 700,
264
- textTransform: 'uppercase',
265
261
  marginTop: 4,
266
262
  };
267
263
 
@@ -270,7 +266,7 @@ const layerCheckStyle: React.CSSProperties = {
270
266
  alignItems: 'center',
271
267
  gap: 4,
272
268
  fontSize: 10,
273
- color: '#c5c8ce',
269
+ color: themeVars.content.primary,
274
270
  };
275
271
 
276
272
  function CollisionLayersUI({
@@ -299,8 +295,8 @@ function CollisionLayersUI({
299
295
  <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
300
296
  {layerNames.map((name, i) => (
301
297
  <label key={`g-${name}`} style={layerCheckStyle}>
302
- <input
303
- type="checkbox"
298
+ <Checkbox
299
+ className="vgai-checkbox"
304
300
  checked={(groups & (1 << i)) !== 0}
305
301
  onChange={() => toggleBit('collisionGroups', i)}
306
302
  />
@@ -312,8 +308,8 @@ function CollisionLayersUI({
312
308
  <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
313
309
  {layerNames.map((name, i) => (
314
310
  <label key={`f-${name}`} style={layerCheckStyle}>
315
- <input
316
- type="checkbox"
311
+ <Checkbox
312
+ className="vgai-checkbox"
317
313
  checked={(filter & (1 << i)) !== 0}
318
314
  onChange={() => toggleBit('collisionFilter', i)}
319
315
  />
@@ -1,31 +1,20 @@
1
1
  import { DEFAULTS } from '@engine/scene/defaults';
2
2
  import type { SceneEnvironment, ScenePostProcessing } from '@engine/scene/scene-types';
3
+ import {
4
+ Checkbox,
5
+ ColorInput,
6
+ NumberInput,
7
+ SectionHeader,
8
+ Select,
9
+ TextInput,
10
+ themeVars,
11
+ } from '../../design-system';
3
12
  import { useEditorStore } from '../../EditorContext';
4
13
  import type { EditorStore } from '../../editor-store';
5
- import { ColorInput } from '../primitives/ColorInput';
6
- import { NumberInput } from '../primitives/NumberInput';
7
- import { SectionHeader } from '../primitives/SectionHeader';
14
+ import { fieldLabelStyle, groupLabelStyle } from '../inspector-widgets/shared';
8
15
 
9
- const labelStyle: React.CSSProperties = { fontSize: 11, color: '#8c8c8c', marginBottom: 2 };
10
- const effectLabel: React.CSSProperties = {
11
- fontSize: 10,
12
- color: '#8c8c8c',
13
- fontWeight: 700,
14
- marginTop: 6,
15
- };
16
- const selectStyle: React.CSSProperties = {
17
- width: '100%',
18
- background: '#2a2d35',
19
- color: '#c5c8ce',
20
- border: '1px solid #3a3d45',
21
- borderRadius: 3,
22
- padding: '2px 4px',
23
- fontSize: 11,
24
- };
25
- const textInputStyle: React.CSSProperties = {
26
- ...selectStyle,
27
- boxSizing: 'border-box' as const,
28
- };
16
+ const labelStyle: React.CSSProperties = fieldLabelStyle;
17
+ const effectLabel: React.CSSProperties = { ...groupLabelStyle, marginTop: 6 };
29
18
 
30
19
  const d = DEFAULTS.postProcessing;
31
20
 
@@ -56,12 +45,12 @@ function EnabledCheckbox({
56
45
  }) {
57
46
  return (
58
47
  <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
59
- <input
60
- type="checkbox"
48
+ <Checkbox
49
+ className="vgai-checkbox"
61
50
  checked={checked}
62
51
  onChange={(e) => updatePP(store, env, effectKey, { enabled: e.target.checked })}
63
52
  />
64
- <span style={{ fontSize: 11, color: '#c5c8ce' }}>Enabled</span>
53
+ <span style={{ fontSize: 11, color: themeVars.content.primary }}>Enabled</span>
65
54
  </div>
66
55
  );
67
56
  }
@@ -112,12 +101,12 @@ function Check({
112
101
  }) {
113
102
  return (
114
103
  <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
115
- <input
116
- type="checkbox"
104
+ <Checkbox
105
+ className="vgai-checkbox"
117
106
  checked={checked}
118
107
  onChange={(e) => updatePP(store, env, effectKey, { [field]: e.target.checked })}
119
108
  />
120
- <span style={{ fontSize: 11, color: '#c5c8ce' }}>{label}</span>
109
+ <span style={{ fontSize: 11, color: themeVars.content.primary }}>{label}</span>
121
110
  </div>
122
111
  );
123
112
  }
@@ -415,14 +404,15 @@ export function PostProcessingSection() {
415
404
  <>
416
405
  <div>
417
406
  <div style={labelStyle}>Source Entity ID</div>
418
- <input
407
+ <TextInput
419
408
  type="text"
420
409
  value={pp.godRays.sourceEntity ?? ''}
421
410
  onChange={(e) =>
422
411
  updatePP(store, env, 'godRays', { sourceEntity: e.target.value })
423
412
  }
424
413
  placeholder="Entity ID of light source mesh"
425
- style={textInputStyle}
414
+ className="vgai-input"
415
+ style={{ width: '100%' }}
426
416
  />
427
417
  </div>
428
418
  <Num
@@ -1123,7 +1113,7 @@ export function PostProcessingSection() {
1123
1113
  <>
1124
1114
  <div>
1125
1115
  <div style={labelStyle}>Tags (comma-separated)</div>
1126
- <input
1116
+ <TextInput
1127
1117
  type="text"
1128
1118
  value={(pp.outline.tags ?? []).join(', ')}
1129
1119
  onChange={(e) => {
@@ -1134,7 +1124,8 @@ export function PostProcessingSection() {
1134
1124
  updatePP(store, env, 'outline', { tags });
1135
1125
  }}
1136
1126
  placeholder="e.g. highlighted, selected"
1137
- style={textInputStyle}
1127
+ className="vgai-input"
1128
+ style={{ width: '100%' }}
1138
1129
  />
1139
1130
  </div>
1140
1131
  <Num
@@ -1270,16 +1261,17 @@ export function PostProcessingSection() {
1270
1261
  {pp?.smaa?.enabled && (
1271
1262
  <div>
1272
1263
  <div style={labelStyle}>Preset</div>
1273
- <select
1264
+ <Select
1265
+ className="vgai-select"
1274
1266
  value={pp.smaa.preset ?? d.smaa.preset}
1275
1267
  onChange={(e) => updatePP(store, env, 'smaa', { preset: e.target.value })}
1276
- style={selectStyle}
1268
+ style={{ width: '100%' }}
1277
1269
  >
1278
1270
  <option value="low">Low</option>
1279
1271
  <option value="medium">Medium</option>
1280
1272
  <option value="high">High</option>
1281
1273
  <option value="ultra">Ultra</option>
1282
- </select>
1274
+ </Select>
1283
1275
  </div>
1284
1276
  )}
1285
1277
  </div>
@@ -1,22 +1,13 @@
1
1
  import { RENDER_FEATURES, type RenderFeature } from '@engine/render/render-features';
2
2
  import type { SceneEnvironment } from '@engine/scene/scene-types';
3
+ import { Checkbox, NumberInput, SectionHeader, Select, themeVars } from '../../design-system';
3
4
  import type { EditorStore } from '../../editor-store';
4
- import { NumberInput } from '../primitives/NumberInput';
5
- import { SectionHeader } from '../primitives/SectionHeader';
5
+ import { fieldLabelStyle } from '../inspector-widgets/shared';
6
6
 
7
- const labelStyle: React.CSSProperties = { fontSize: 11, color: '#c5c8ce' };
8
- const selectStyle: React.CSSProperties = {
9
- width: '100%',
10
- background: '#2a2d35',
11
- color: '#c5c8ce',
12
- border: '1px solid #3a3d45',
13
- borderRadius: 3,
14
- padding: '2px 4px',
15
- fontSize: 11,
16
- };
7
+ const labelStyle: React.CSSProperties = { fontSize: 11, color: themeVars.content.primary };
17
8
  const noteStyle: React.CSSProperties = {
18
9
  fontSize: 10,
19
- color: '#8c8c8c',
10
+ color: themeVars.content.muted,
20
11
  lineHeight: 1.4,
21
12
  marginBottom: 4,
22
13
  };
@@ -44,8 +35,8 @@ export function RenderingSection({ store }: { store: EditorStore }) {
44
35
  style={{ display: 'flex', alignItems: 'center', gap: 6 }}
45
36
  title={feature.description}
46
37
  >
47
- <input
48
- type="checkbox"
38
+ <Checkbox
39
+ className="vgai-checkbox"
49
40
  checked={current as boolean}
50
41
  onChange={(e) => setFeature(feature.key, e.target.checked)}
51
42
  />
@@ -57,7 +48,7 @@ export function RenderingSection({ store }: { store: EditorStore }) {
57
48
  if (feature.kind === 'number') {
58
49
  return (
59
50
  <div key={feature.key} title={feature.description}>
60
- <div style={{ ...labelStyle, color: '#8c8c8c', marginBottom: 2 }}>{feature.label}</div>
51
+ <div style={fieldLabelStyle}>{feature.label}</div>
61
52
  <NumberInput
62
53
  value={current as number}
63
54
  onChange={(v) => {
@@ -77,18 +68,19 @@ export function RenderingSection({ store }: { store: EditorStore }) {
77
68
  // enum
78
69
  return (
79
70
  <div key={feature.key} title={feature.description}>
80
- <div style={{ ...labelStyle, color: '#8c8c8c', marginBottom: 2 }}>{feature.label}</div>
81
- <select
71
+ <div style={fieldLabelStyle}>{feature.label}</div>
72
+ <Select
73
+ className="vgai-select"
82
74
  value={current as string}
83
75
  onChange={(e) => setFeature(feature.key, e.target.value)}
84
- style={selectStyle}
76
+ style={{ width: '100%' }}
85
77
  >
86
78
  {(feature.options ?? []).map((opt) => (
87
79
  <option key={opt} value={opt}>
88
80
  {opt}
89
81
  </option>
90
82
  ))}
91
- </select>
83
+ </Select>
92
84
  </div>
93
85
  );
94
86
  };
@@ -1,7 +1,6 @@
1
+ import { Checkbox, NumberInput, SectionHeader, Tooltip } from '../../design-system';
1
2
  import { useEditorStore } from '../../EditorContext';
2
- import { NumberInput } from '../primitives/NumberInput';
3
- import { SectionHeader } from '../primitives/SectionHeader';
4
- import { Tooltip } from '../primitives/Tooltip';
3
+ import { fieldLabelStyle } from '../inspector-widgets/shared';
5
4
  import type { SectionProps } from './multi-edit-utils';
6
5
  import { commonBool, commonNum } from './multi-edit-utils';
7
6
 
@@ -18,8 +17,8 @@ export function ShadowSection({ entities, ids }: SectionProps) {
18
17
  <SectionHeader label="Shadow">
19
18
  <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
20
19
  <label style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 12 }}>
21
- <input
22
- type="checkbox"
20
+ <Checkbox
21
+ className="vgai-checkbox"
23
22
  checked={enabled ?? false}
24
23
  ref={(el) => {
25
24
  if (el) el.indeterminate = enabled === null;
@@ -36,7 +35,7 @@ export function ShadowSection({ entities, ids }: SectionProps) {
36
35
  <>
37
36
  <div>
38
37
  <Tooltip text="Shadow resolution (higher = sharper)" position="right">
39
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Map Size</div>
38
+ <div style={fieldLabelStyle}>Map Size</div>
40
39
  </Tooltip>
41
40
  <NumberInput
42
41
  value={mapSize}
@@ -50,7 +49,7 @@ export function ShadowSection({ entities, ids }: SectionProps) {
50
49
  </div>
51
50
  <div>
52
51
  <Tooltip text="Reduce shadow acne artifacts" position="right">
53
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Bias</div>
52
+ <div style={fieldLabelStyle}>Bias</div>
54
53
  </Tooltip>
55
54
  <NumberInput
56
55
  value={bias}
@@ -64,7 +63,7 @@ export function ShadowSection({ entities, ids }: SectionProps) {
64
63
  </div>
65
64
  <div>
66
65
  <Tooltip text="Soft shadow blur radius" position="right">
67
- <div style={{ fontSize: 10, color: '#8c8c8c', marginBottom: 2 }}>Radius</div>
66
+ <div style={fieldLabelStyle}>Radius</div>
68
67
  </Tooltip>
69
68
  <NumberInput
70
69
  value={radius}
@@ -1,22 +1,21 @@
1
1
  import type { SceneSpline } from '@engine/scene/scene-types';
2
+ import {
3
+ Button,
4
+ Checkbox,
5
+ NumberInput,
6
+ SectionHeader,
7
+ Select,
8
+ themeVars,
9
+ Vec3Input,
10
+ } from '../../design-system';
2
11
  import { useEditorStore } from '../../EditorContext';
3
- import { NumberInput } from '../primitives/NumberInput';
4
- import { SectionHeader } from '../primitives/SectionHeader';
5
- import { Vec3Input } from '../primitives/Vec3Input';
12
+ import { fieldLabelStyle } from '../inspector-widgets/shared';
6
13
  import type { SectionProps } from './multi-edit-utils';
7
14
  import { commonBool, commonNum, commonStr } from './multi-edit-utils';
8
15
 
9
- const labelStyle: React.CSSProperties = { fontSize: 10, color: '#8c8c8c', marginBottom: 2 };
16
+ const labelStyle: React.CSSProperties = fieldLabelStyle;
10
17
 
11
- const btnStyle: React.CSSProperties = {
12
- background: '#333',
13
- color: '#c5c8ce',
14
- border: '1px solid #444',
15
- borderRadius: 3,
16
- padding: '2px 6px',
17
- cursor: 'pointer',
18
- fontSize: 10,
19
- };
18
+ // Shared compact chrome button (I-8/I-10) — the old per-file literal.
20
19
 
21
20
  export function SplineSection({ entities, ids }: SectionProps) {
22
21
  const store = useEditorStore();
@@ -69,41 +68,34 @@ export function SplineSection({ entities, ids }: SectionProps) {
69
68
  {/* Curve Type */}
70
69
  <div>
71
70
  <div style={labelStyle}>Curve Type</div>
72
- <select
71
+ <Select
73
72
  value={curveType ?? ''}
74
73
  onChange={(e) =>
75
74
  update({
76
75
  curveType: e.target.value as SceneSpline['curveType'],
77
76
  })
78
77
  }
79
- style={{
80
- width: '100%',
81
- background: '#1e1e1e',
82
- border: '1px solid #333',
83
- borderRadius: 2,
84
- color: '#c5c8ce',
85
- fontSize: 11,
86
- padding: '2px 4px',
87
- }}
78
+ className="vgai-select"
79
+ style={{ width: '100%' }}
88
80
  >
89
81
  <option value="centripetal">Centripetal</option>
90
82
  <option value="chordal">Chordal</option>
91
83
  <option value="catmullrom">Catmull-Rom</option>
92
- </select>
84
+ </Select>
93
85
  </div>
94
86
 
95
87
  {/* Closed */}
96
88
  <div>
97
89
  <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
98
- <input
99
- type="checkbox"
90
+ <Checkbox
91
+ className="vgai-checkbox"
100
92
  checked={closed ?? false}
101
93
  ref={(el) => {
102
94
  if (el) el.indeterminate = closed === null;
103
95
  }}
104
96
  onChange={(e) => update({ closed: e.target.checked })}
105
97
  />
106
- <span style={{ fontSize: 11, color: '#c5c8ce' }}>Closed Loop</span>
98
+ <span style={{ fontSize: 11, color: themeVars.content.primary }}>Closed Loop</span>
107
99
  </div>
108
100
  </div>
109
101
 
@@ -133,7 +125,6 @@ export function SplineSection({ entities, ids }: SectionProps) {
133
125
  style={{
134
126
  maxHeight: 200,
135
127
  overflowY: 'auto',
136
- scrollbarWidth: 'thin',
137
128
  display: 'flex',
138
129
  flexDirection: 'column',
139
130
  gap: 4,
@@ -144,7 +135,7 @@ export function SplineSection({ entities, ids }: SectionProps) {
144
135
  <span
145
136
  style={{
146
137
  fontSize: 9,
147
- color: '#666',
138
+ color: themeVars.content.dim,
148
139
  width: 14,
149
140
  textAlign: 'right',
150
141
  flexShrink: 0,
@@ -159,30 +150,28 @@ export function SplineSection({ entities, ids }: SectionProps) {
159
150
  step={0.1}
160
151
  />
161
152
  </div>
162
- <button
153
+ <Button
163
154
  type="button"
155
+ variant="danger"
156
+ size="compact"
157
+ aria-label={`Remove spline point ${i + 1}`}
164
158
  onClick={() => removePoint(i)}
165
159
  disabled={splineData.points.length <= 2}
166
- style={{
167
- ...btnStyle,
168
- padding: '1px 5px',
169
- fontSize: 9,
170
- opacity: splineData.points.length <= 2 ? 0.3 : 1,
171
- cursor: splineData.points.length <= 2 ? 'default' : 'pointer',
172
- }}
173
160
  >
174
- x
175
- </button>
161
+ ×
162
+ </Button>
176
163
  </div>
177
164
  ))}
178
165
  </div>
179
- <button
166
+ <Button
180
167
  type="button"
168
+ variant="secondary"
169
+ size="compact"
181
170
  onClick={addPoint}
182
- style={{ ...btnStyle, marginTop: 4, alignSelf: 'flex-start' }}
171
+ style={{ marginTop: 4, alignSelf: 'flex-start' }}
183
172
  >
184
173
  + Add Point
185
- </button>
174
+ </Button>
186
175
  </div>
187
176
  )}
188
177
  </div>