@stephen-netu/design-system 0.2.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/dist/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte +10 -2
  2. package/dist/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte.d.ts.map +1 -1
  3. package/dist/b0-app-shell/{command-bar/CommandBar.svelte → global-command-bar/GlobalCommandBar.svelte} +75 -75
  4. package/dist/b0-app-shell/{command-bar/CommandBar.svelte.d.ts → global-command-bar/GlobalCommandBar.svelte.d.ts} +6 -6
  5. package/dist/b0-app-shell/global-command-bar/GlobalCommandBar.svelte.d.ts.map +1 -0
  6. package/dist/b0-app-shell/index.d.ts +1 -1
  7. package/dist/b0-app-shell/index.d.ts.map +1 -1
  8. package/dist/b0-app-shell/index.js +1 -1
  9. package/dist/d0-data-viz/BarChart.test.js +53 -0
  10. package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
  11. package/dist/d0-data-viz/CheckpointPill.svelte +8 -3
  12. package/dist/d0-data-viz/CheckpointPill.svelte.d.ts.map +1 -1
  13. package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
  14. package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
  15. package/dist/d0-data-viz/MetricCard.test.js +57 -0
  16. package/dist/d0-data-viz/SparkLine.test.js +47 -0
  17. package/dist/d0-data-viz/StorageMap.test.js +63 -0
  18. package/dist/d0-data-viz/Timeline.test.js +62 -0
  19. package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
  20. package/dist/d0-data-viz/checkpoint-types.js +1 -1
  21. package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
  22. package/dist/d0-data-viz/storage-map-types.js +6 -3
  23. package/dist/d0-data-viz/theme-integration.d.ts +3 -3
  24. package/dist/d0-data-viz/theme-integration.js +4 -4
  25. package/dist/d0-data-viz/theme-integration.test.js +41 -0
  26. package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
  27. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
  28. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
  29. package/dist/demos/BspSizingInfographic.svelte +3 -32
  30. package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
  31. package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
  32. package/dist/demos/index.d.ts +1 -0
  33. package/dist/demos/index.d.ts.map +1 -1
  34. package/dist/demos/index.js +1 -0
  35. package/dist/editor/CodeEditor.svelte +83 -26
  36. package/dist/editor/CodeEditor.svelte.d.ts +0 -1
  37. package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
  38. package/dist/editor/CodeEditor.test.js +38 -0
  39. package/dist/editor/ExternalChangeDialog.svelte +117 -0
  40. package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
  41. package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
  42. package/dist/editor/FindReplaceDialog.svelte +32 -32
  43. package/dist/editor/MarkdownEditor.svelte +105 -605
  44. package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
  45. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  46. package/dist/editor/MarkdownEditor.test.js +38 -0
  47. package/dist/editor/codemirror-config.d.ts +36 -0
  48. package/dist/editor/codemirror-config.d.ts.map +1 -0
  49. package/dist/editor/codemirror-config.js +87 -0
  50. package/dist/editor/components/CorrectionTooltip.svelte +180 -160
  51. package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
  52. package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
  53. package/dist/editor/extensions/autocomplete.d.ts +2 -2
  54. package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
  55. package/dist/editor/extensions/autocomplete.test.js +121 -0
  56. package/dist/editor/extensions/spellcheck.d.ts +21 -3
  57. package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
  58. package/dist/editor/extensions/spellcheck.js +51 -9
  59. package/dist/editor/extensions/spellcheck.test.js +168 -0
  60. package/dist/editor/extensions/types.d.ts +2 -1
  61. package/dist/editor/extensions/types.d.ts.map +1 -1
  62. package/dist/editor/index.d.ts +2 -1
  63. package/dist/editor/index.d.ts.map +1 -1
  64. package/dist/editor/index.js +1 -0
  65. package/dist/editor/markdown-preview.d.ts +9 -0
  66. package/dist/editor/markdown-preview.d.ts.map +1 -0
  67. package/dist/editor/markdown-preview.js +19 -0
  68. package/dist/editor/markdown-preview.test.js +38 -0
  69. package/dist/editor/useCodeMirror.d.ts +23 -0
  70. package/dist/editor/useCodeMirror.d.ts.map +1 -0
  71. package/dist/editor/useCodeMirror.js +40 -0
  72. package/dist/editor/useFilePersistence.d.ts +32 -0
  73. package/dist/editor/useFilePersistence.d.ts.map +1 -0
  74. package/dist/editor/useFilePersistence.js +117 -0
  75. package/dist/entity-graph-view/WorldView.svelte +1 -1
  76. package/dist/fabric/ai/ChatPanel.svelte +84 -85
  77. package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
  78. package/dist/fabric/ai/ResearchPanel.svelte +35 -25
  79. package/dist/fabric/ai/ResearchPanel.svelte.d.ts.map +1 -1
  80. package/dist/fabric/data/FileTree.svelte +195 -0
  81. package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
  82. package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
  83. package/dist/fabric/data/FileTree.test.js +127 -0
  84. package/dist/fabric/data/index.d.ts +5 -9
  85. package/dist/fabric/data/index.d.ts.map +1 -1
  86. package/dist/fabric/data/index.js +4 -1
  87. package/dist/fabric/index.d.ts +5 -5
  88. package/dist/fabric/index.d.ts.map +1 -1
  89. package/dist/fabric/index.js +5 -3
  90. package/dist/fabric/input/{CommandBar.svelte → AppHeaderBar.svelte} +13 -13
  91. package/dist/fabric/input/{CommandBar.svelte.d.ts → AppHeaderBar.svelte.d.ts} +5 -5
  92. package/dist/fabric/input/AppHeaderBar.svelte.d.ts.map +1 -0
  93. package/dist/fabric/input/{CommandBar.test.js → AppHeaderBar.test.js} +9 -9
  94. package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
  95. package/dist/fabric/input/index.d.ts +2 -2
  96. package/dist/fabric/input/index.d.ts.map +1 -1
  97. package/dist/fabric/input/index.js +1 -1
  98. package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
  99. package/dist/fabric/layout/KanbanBoard.svelte +25 -155
  100. package/dist/fabric/layout/KanbanBoard.svelte.d.ts +2 -26
  101. package/dist/fabric/layout/KanbanBoard.svelte.d.ts.map +1 -1
  102. package/dist/fabric/layout/KanbanBoard.test.js +125 -10
  103. package/dist/fabric/layout/KanbanCard.svelte +27 -223
  104. package/dist/fabric/layout/KanbanCard.svelte.d.ts +2 -19
  105. package/dist/fabric/layout/KanbanCard.svelte.d.ts.map +1 -1
  106. package/dist/fabric/layout/KanbanColumn.svelte +41 -275
  107. package/dist/fabric/layout/KanbanColumn.svelte.d.ts +2 -22
  108. package/dist/fabric/layout/KanbanColumn.svelte.d.ts.map +1 -1
  109. package/dist/fabric/layout/index.d.ts +2 -5
  110. package/dist/fabric/layout/index.d.ts.map +1 -1
  111. package/dist/fabric/layout/index.js +1 -1
  112. package/dist/fabric/navigation/ActivityRail.svelte +3 -5
  113. package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
  114. package/dist/g0-generative/components/Text.svelte +38 -0
  115. package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
  116. package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
  117. package/dist/g0-generative/index.d.ts +1 -0
  118. package/dist/g0-generative/index.d.ts.map +1 -1
  119. package/dist/g0-generative/index.js +1 -0
  120. package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
  121. package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
  122. package/dist/g0-generative/library/ComponentLibrary.js +10 -0
  123. package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
  124. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
  125. package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
  126. package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
  127. package/dist/g0-geo/SovereignMap.svelte +13 -13
  128. package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
  129. package/dist/index.d.ts +0 -1
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +7 -3
  132. package/dist/l0-layout/SectionSplitter.svelte +5 -5
  133. package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
  134. package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
  135. package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
  136. package/dist/l0-layout/block-writer/BlockItem.svelte +6 -4
  137. package/dist/l0-layout/block-writer/markdown.js +11 -11
  138. package/dist/l0-layout/block-writer/markdown.test.js +81 -0
  139. package/dist/l0-layout/card/CompactCard.svelte +4 -3
  140. package/dist/l0-layout/card/StackedCard.svelte +87 -0
  141. package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
  142. package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
  143. package/dist/l0-layout/card/StackedCard.test.js +29 -0
  144. package/dist/l0-layout/grant/GrantCard.svelte +15 -5
  145. package/dist/l0-layout/grant/GrantCard.svelte.d.ts.map +1 -1
  146. package/dist/l0-layout/index.d.ts +3 -0
  147. package/dist/l0-layout/index.d.ts.map +1 -1
  148. package/dist/l0-layout/index.js +2 -0
  149. package/dist/l0-layout/kanban/KanbanBoard.svelte +246 -29
  150. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts +28 -2
  151. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts.map +1 -1
  152. package/dist/l0-layout/kanban/KanbanCard.svelte +175 -150
  153. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts +16 -18
  154. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts.map +1 -1
  155. package/dist/l0-layout/kanban/KanbanColumn.svelte +152 -78
  156. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts +28 -7
  157. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts.map +1 -1
  158. package/dist/l0-layout/kanban/index.d.ts +6 -0
  159. package/dist/l0-layout/kanban/index.d.ts.map +1 -0
  160. package/dist/l0-layout/kanban/index.js +3 -0
  161. package/dist/n0-node-graph/Node.svelte +2 -2
  162. package/dist/n0-node-graph/NodePalette.svelte +2 -2
  163. package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
  164. package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
  165. package/dist/n1-flow-canvas/graph-state.test.js +69 -0
  166. package/dist/n1-flow-canvas/index.d.ts +2 -0
  167. package/dist/n1-flow-canvas/index.d.ts.map +1 -1
  168. package/dist/n1-flow-canvas/index.js +1 -0
  169. package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
  170. package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
  171. package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
  172. package/dist/n1-flow-canvas/utils.test.js +116 -0
  173. package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
  174. package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
  175. package/dist/n3-force-graph/GraphTooltip.svelte +2 -2
  176. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +34 -29
  177. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  178. package/dist/n4-adaptive-manifold/classifier.test.js +104 -0
  179. package/dist/n4-adaptive-manifold/n4-tokens.css +2 -2
  180. package/dist/n4-adaptive-manifold/types.d.ts +3 -0
  181. package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
  182. package/dist/p0-primitives/ThemeProvider.svelte +38 -18
  183. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +6 -1
  184. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  185. package/dist/p0-primitives/canvas-theme.d.ts +33 -1
  186. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  187. package/dist/p0-primitives/canvas-theme.js +82 -17
  188. package/dist/p0-primitives/debug.d.ts +6 -0
  189. package/dist/p0-primitives/debug.d.ts.map +1 -0
  190. package/dist/p0-primitives/debug.js +21 -0
  191. package/dist/p0-primitives/index.d.ts +2 -1
  192. package/dist/p0-primitives/index.d.ts.map +1 -1
  193. package/dist/p0-primitives/index.js +1 -0
  194. package/dist/p0-primitives/theme-context.d.ts +9 -0
  195. package/dist/p0-primitives/theme-context.d.ts.map +1 -0
  196. package/dist/p0-primitives/theme-context.js +8 -0
  197. package/dist/p0-primitives/theme.d.ts.map +1 -1
  198. package/dist/p0-primitives/theme.js +11 -31
  199. package/dist/p0-primitives/tokens/ambient.css +76 -0
  200. package/dist/p0-primitives/tokens/tokens.css +140 -34
  201. package/dist/p0-primitives/utils/index.d.ts +4 -2
  202. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  203. package/dist/p0-primitives/utils/index.js +1 -0
  204. package/dist/p0-primitives/utils/reveal.d.ts +15 -0
  205. package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
  206. package/dist/p0-primitives/utils/reveal.js +29 -0
  207. package/dist/p0-primitives/utils/reveal.test.js +95 -0
  208. package/dist/s0-state/SyncStatus.svelte +2 -2
  209. package/dist/s0-state/ThemeStore.svelte.d.ts +3 -2
  210. package/dist/s0-state/ThemeStore.svelte.d.ts.map +1 -1
  211. package/dist/s0-state/ThemeStore.svelte.js +20 -1
  212. package/dist/s0-state/index.d.ts +2 -2
  213. package/dist/s0-state/index.d.ts.map +1 -1
  214. package/dist/s0-state/index.js +3 -0
  215. package/dist/s0-state/modal-stack-store.svelte.d.ts +27 -2
  216. package/dist/s0-state/modal-stack-store.svelte.d.ts.map +1 -1
  217. package/dist/s0-state/modal-stack-store.svelte.js +21 -2
  218. package/dist/showcase/Showcase.svelte +43 -34
  219. package/dist/showcase/Showcase.svelte.d.ts.map +1 -1
  220. package/dist/spatial/BspTilingCanvas.svelte +5 -5
  221. package/dist/spatial/BspTilingSimulation.test.js +88 -0
  222. package/dist/spatial/CameraController.test.js +120 -0
  223. package/dist/spatial/ForceCanvas.svelte +18 -13
  224. package/dist/spatial/ForceCanvas.svelte.d.ts.map +1 -1
  225. package/dist/spatial/ForceSimulation.svelte.d.ts.map +1 -1
  226. package/dist/spatial/ForceSimulation.svelte.js +33 -22
  227. package/dist/spatial/LodRenderer.svelte +14 -1
  228. package/dist/spatial/LodRenderer.svelte.d.ts.map +1 -1
  229. package/dist/spatial/ParticleAssembleMark.svelte +285 -0
  230. package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
  231. package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
  232. package/dist/spatial/SnapZoomCamera.svelte +23 -13
  233. package/dist/spatial/SnapZoomCamera.svelte.d.ts.map +1 -1
  234. package/dist/spatial/ZoneTiler.svelte +3 -2
  235. package/dist/spatial/ZoneTiler.test.js +90 -0
  236. package/dist/spatial/d3-types.d.ts +31 -0
  237. package/dist/spatial/d3-types.d.ts.map +1 -0
  238. package/dist/spatial/d3-types.js +19 -0
  239. package/dist/spatial/index.js +1 -0
  240. package/dist/spatial/particle-assemble-math.d.ts +22 -0
  241. package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
  242. package/dist/spatial/particle-assemble-math.js +26 -0
  243. package/dist/spatial/particle-assemble-math.test.js +56 -0
  244. package/dist/ssr-import-clean.test.js +37 -0
  245. package/dist/t0-transport/fs.d.ts +12 -0
  246. package/dist/t0-transport/fs.d.ts.map +1 -0
  247. package/dist/t0-transport/fs.js +55 -0
  248. package/dist/t0-transport/index.d.ts +1 -0
  249. package/dist/t0-transport/index.d.ts.map +1 -1
  250. package/dist/t0-transport/index.js +1 -0
  251. package/dist/t0-transport/invoke.d.ts.map +1 -1
  252. package/dist/t0-transport/invoke.js +5 -2
  253. package/dist/t0-transport/quality.d.ts +12 -3
  254. package/dist/t0-transport/quality.d.ts.map +1 -1
  255. package/dist/t0-transport/quality.js +17 -4
  256. package/dist/t0-transport/substrate.svelte.d.ts +27 -0
  257. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -0
  258. package/dist/t0-transport/substrate.svelte.js +55 -0
  259. package/dist/u0-primitives/LockIndicator.svelte +17 -15
  260. package/dist/u0-primitives/VerticalToolbar.svelte +25 -22
  261. package/dist/u0-primitives/accordion/Accordion.svelte +14 -12
  262. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts +0 -7
  263. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts.map +1 -1
  264. package/dist/u0-primitives/accordion/Accordion.test.js +5 -5
  265. package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
  266. package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
  267. package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
  268. package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
  269. package/dist/u0-primitives/badge/Badge.svelte +6 -4
  270. package/dist/u0-primitives/badge/Badge.test.js +10 -10
  271. package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
  272. package/dist/u0-primitives/badge/ValidityBadge.test.js +9 -9
  273. package/dist/u0-primitives/button/Button.svelte +18 -13
  274. package/dist/u0-primitives/button/Button.svelte.d.ts +1 -0
  275. package/dist/u0-primitives/button/Button.svelte.d.ts.map +1 -1
  276. package/dist/u0-primitives/button/Button.test.js +11 -11
  277. package/dist/u0-primitives/card/Card.svelte +60 -32
  278. package/dist/u0-primitives/card/Card.svelte.d.ts.map +1 -1
  279. package/dist/u0-primitives/card/Card.test.js +86 -0
  280. package/dist/u0-primitives/command-palette/CommandPalette.svelte +75 -43
  281. package/dist/u0-primitives/command-palette/CommandPalette.svelte.d.ts.map +1 -1
  282. package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
  283. package/dist/u0-primitives/command-palette/commandStore.svelte.d.ts.map +1 -1
  284. package/dist/u0-primitives/command-palette/commandStore.svelte.js +2 -1
  285. package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
  286. package/dist/u0-primitives/dropdown/Dropdown.test.js +1 -1
  287. package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
  288. package/dist/u0-primitives/index.d.ts +8 -0
  289. package/dist/u0-primitives/index.d.ts.map +1 -1
  290. package/dist/u0-primitives/index.js +9 -0
  291. package/dist/u0-primitives/input/Input.svelte +85 -23
  292. package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
  293. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  294. package/dist/u0-primitives/input/Input.test.js +82 -2
  295. package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
  296. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
  297. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
  298. package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
  299. package/dist/u0-primitives/live-dot/index.d.ts +3 -0
  300. package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
  301. package/dist/u0-primitives/live-dot/index.js +1 -0
  302. package/dist/u0-primitives/modal/Modal.svelte +64 -38
  303. package/dist/u0-primitives/modal/Modal.svelte.d.ts.map +1 -1
  304. package/dist/u0-primitives/modal/Modal.test.js +63 -15
  305. package/dist/u0-primitives/rsvp/RsvpReader.svelte +8 -8
  306. package/dist/u0-primitives/rsvp/RsvpReader.svelte.d.ts.map +1 -1
  307. package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
  308. package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
  309. package/dist/u0-primitives/steps/Steps.svelte +20 -21
  310. package/dist/u0-primitives/surface-state/SurfaceState.svelte +190 -0
  311. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts +15 -0
  312. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts.map +1 -0
  313. package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
  314. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
  315. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
  316. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
  317. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
  318. package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
  319. package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
  320. package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
  321. package/dist/u0-primitives/toggle/Toggle.svelte +22 -13
  322. package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
  323. package/dist/u0-primitives/tooltip/Tooltip.test.js +12 -12
  324. package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
  325. package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
  326. package/dist/u0-primitives/web-components/button-component.js +72 -33
  327. package/dist/u0-primitives/web-components/index.d.ts +3 -0
  328. package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
  329. package/dist/u0-primitives/web-components/index.js +2 -0
  330. package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
  331. package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
  332. package/dist/u0-primitives/web-components/input-component.js +56 -39
  333. package/dist/u0-primitives/web-components/web-components.test.js +96 -0
  334. package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
  335. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
  336. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
  337. package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
  338. package/dist/u0-primitives/window-frame/index.d.ts +3 -0
  339. package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
  340. package/dist/u0-primitives/window-frame/index.js +1 -0
  341. package/dist/v0-diagrams/MarkmapDiagram.test.js +49 -0
  342. package/dist/v0-diagrams/MermaidDiagram.svelte +21 -9
  343. package/dist/v0-diagrams/MermaidDiagram.svelte.d.ts.map +1 -1
  344. package/dist/v0-diagrams/MermaidDiagram.test.js +40 -0
  345. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
  346. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
  347. package/package.json +57 -15
  348. package/src/n4-adaptive-manifold/n4-tokens.css +2 -2
  349. package/src/p0-primitives/tokens/ambient.css +76 -0
  350. package/src/p0-primitives/tokens/tokens.css +140 -34
  351. package/src/p0-primitives/tokens/tokens.json +55 -26
  352. package/dist/b0-app-shell/command-bar/CommandBar.svelte.d.ts.map +0 -1
  353. package/dist/fabric/input/CommandBar.svelte.d.ts.map +0 -1
  354. package/dist/stores/vaultStore.svelte +0 -14
  355. package/dist/stores/vaultStore.svelte.d.ts +0 -24
  356. package/dist/stores/vaultStore.svelte.d.ts.map +0 -1
  357. package/dist/tauri/index.d.ts +0 -3
  358. package/dist/tauri/index.d.ts.map +0 -1
  359. package/dist/tauri/index.js +0 -11
@@ -8,9 +8,7 @@
8
8
  * @package @kos/design-system/fabric/navigation
9
9
  * @adr 2026-04-12-leap-substrate-refactor-001
10
10
  */
11
- // Lucide icons are Svelte 4 class components - use permissive typing
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- type IconComponent = any;
11
+ import type { LucideIcon } from '@lucide/svelte';
14
12
  import {
15
13
  LayoutGrid, FileText, Network, Columns2, Globe,
16
14
  FolderTree, MessageSquare, HelpCircle, Layers, Gauge, Wifi, Folder,
@@ -56,7 +54,7 @@
56
54
  ondropstreamcard,
57
55
  }: Props = $props();
58
56
 
59
- const ICON_MAP: Record<string, IconComponent> = {
57
+ const ICON_MAP: Record<string, LucideIcon> = {
60
58
  'layout-grid': LayoutGrid,
61
59
  'file-text': FileText,
62
60
  'network': Network,
@@ -75,7 +73,7 @@
75
73
  'help-circle': HelpCircle,
76
74
  };
77
75
 
78
- function getIcon(name: string): IconComponent {
76
+ function getIcon(name: string): LucideIcon {
79
77
  return ICON_MAP[name.toLowerCase()] ?? FileText;
80
78
  }
81
79
 
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityRail.svelte.d.ts","sourceRoot":"","sources":["../../../src/fabric/navigation/ActivityRail.svelte.ts"],"names":[],"mappings":"AAsBE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,oCAAoC;IACpC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,wCAAwC;IACxC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,0CAA0C;IAC1C,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7G;AA+HH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ActivityRail.svelte.d.ts","sourceRoot":"","sources":["../../../src/fabric/navigation/ActivityRail.svelte.ts"],"names":[],"mappings":"AAoBE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,oCAAoC;IACpC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,wCAAwC;IACxC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,0CAA0C;IAC1C,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7G;AAgIH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ export interface Props {
3
+ content?: string;
4
+ size?: 'sm' | 'md' | 'lg' | 'xl';
5
+ class?: string;
6
+ }
7
+
8
+ let { content = '', size = 'md', class: className = '' }: Props = $props();
9
+ </script>
10
+
11
+ <span class="openui-text size-{size} {className}">
12
+ {content}
13
+ </span>
14
+
15
+ <style>
16
+ .openui-text {
17
+ color: var(--color-text-primary, #f5f5f5);
18
+ font-family: var(--font-sans);
19
+ line-height: var(--line-height-normal, 1.5);
20
+ }
21
+
22
+ .size-sm {
23
+ font-size: var(--text-xs, 0.75rem);
24
+ }
25
+
26
+ .size-md {
27
+ font-size: var(--text-sm, 0.875rem);
28
+ }
29
+
30
+ .size-lg {
31
+ font-size: var(--text-base, 1rem);
32
+ }
33
+
34
+ .size-xl {
35
+ font-size: var(--text-lg, 1.125rem);
36
+ font-weight: var(--font-weight-semibold, 600);
37
+ }
38
+ </style>
@@ -0,0 +1,9 @@
1
+ export interface Props {
2
+ content?: string;
3
+ size?: 'sm' | 'md' | 'lg' | 'xl';
4
+ class?: string;
5
+ }
6
+ declare const Text: import("svelte").Component<Props, {}, "">;
7
+ type Text = ReturnType<typeof Text>;
8
+ export default Text;
9
+ //# sourceMappingURL=Text.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.svelte.d.ts","sourceRoot":"","sources":["../../../src/g0-generative/components/Text.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,KAAK;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAeH,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
@@ -9,6 +9,7 @@
9
9
  * @package @kos/design-system/g0-generative
10
10
  */
11
11
  export { default as OpenUIRenderer } from './renderer/OpenUIRenderer.svelte';
12
+ export { default as Text } from './components/Text.svelte';
12
13
  export { parseOpenUILang, type ParseResult } from './parser/parseOpenUILang';
13
14
  export { ComponentLibrary, defineComponent } from './library/ComponentLibrary';
14
15
  export { generateSystemPrompt } from './prompt-gen/generateSystemPrompt';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/g0-generative/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGvG,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjF,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/g0-generative/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGvG,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjF,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -9,6 +9,7 @@
9
9
  * @package @kos/design-system/g0-generative
10
10
  */
11
11
  export { default as OpenUIRenderer } from './renderer/OpenUIRenderer.svelte';
12
+ export { default as Text } from './components/Text.svelte';
12
13
  export { parseOpenUILang } from './parser/parseOpenUILang';
13
14
  export { ComponentLibrary, defineComponent } from './library/ComponentLibrary';
14
15
  export { generateSystemPrompt } from './prompt-gen/generateSystemPrompt';
@@ -8,10 +8,14 @@ import type { ComponentSchema, LibraryConfig, PropSchema } from './types';
8
8
  export declare class ComponentLibrary {
9
9
  private registry;
10
10
  private config;
11
+ private components;
11
12
  constructor(config: LibraryConfig);
12
13
  getComponent(name: string): ComponentSchema | undefined;
13
14
  hasComponent(name: string): boolean;
14
15
  listComponents(): string[];
16
+ registerComponent(name: string, component: import('svelte').Component<Record<string, unknown>>): void;
17
+ getRegisteredComponent(name: string): import('svelte').Component<Record<string, unknown>> | undefined;
18
+ getRegisteredComponents(): Map<string, import('svelte').Component<Record<string, unknown>>>;
15
19
  /**
16
20
  * Generate system prompt for LLM
17
21
  * Describes available components and OpenUI Lang syntax
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentLibrary.d.ts","sourceRoot":"","sources":["../../../src/g0-generative/library/ComponentLibrary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAqB,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE7F,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAOjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIvD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,cAAc,IAAI,MAAM,EAAE;IAI1B;;;OAGG;IACH,cAAc,IAAI,MAAM;IAoCxB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE;IA4BxD,OAAO,CAAC,YAAY;CAYrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACjC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,eAAe,CAiBjB"}
1
+ {"version":3,"file":"ComponentLibrary.d.ts","sourceRoot":"","sources":["../../../src/g0-generative/library/ComponentLibrary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAqB,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE7F,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAA+E;gBAErF,MAAM,EAAE,aAAa;IAOjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIvD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,cAAc,IAAI,MAAM,EAAE;IAI1B,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI;IAIrG,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS;IAIrG,uBAAuB,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAI3F;;;OAGG;IACH,cAAc,IAAI,MAAM;IAoCxB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE;IA4BxD,OAAO,CAAC,YAAY;CAYrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACjC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,eAAe,CAiBjB"}
@@ -7,6 +7,7 @@
7
7
  export class ComponentLibrary {
8
8
  registry = new Map();
9
9
  config;
10
+ components = new Map();
10
11
  constructor(config) {
11
12
  this.config = config;
12
13
  for (const component of config.components) {
@@ -22,6 +23,15 @@ export class ComponentLibrary {
22
23
  listComponents() {
23
24
  return Array.from(this.registry.keys()).sort();
24
25
  }
26
+ registerComponent(name, component) {
27
+ this.components.set(name, component);
28
+ }
29
+ getRegisteredComponent(name) {
30
+ return this.components.get(name);
31
+ }
32
+ getRegisteredComponents() {
33
+ return new Map(this.components);
34
+ }
25
35
  /**
26
36
  * Generate system prompt for LLM
27
37
  * Describes available components and OpenUI Lang syntax
@@ -0,0 +1,135 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ComponentLibrary, defineComponent } from '../library/ComponentLibrary';
3
+ const MockButton = {};
4
+ const MockText = {};
5
+ const MockCard = {};
6
+ describe('ComponentLibrary', () => {
7
+ const lib = new ComponentLibrary({
8
+ name: 'Test Library',
9
+ description: 'A test component library',
10
+ components: [
11
+ defineComponent('Card', 'A card container', {
12
+ title: { type: 'string', optional: true },
13
+ }, { children: true }),
14
+ defineComponent('Button', 'A button', {
15
+ label: { type: 'string' },
16
+ variant: { type: 'string', optional: true, default: 'primary' },
17
+ }),
18
+ defineComponent('Text', 'Display text', {
19
+ content: { type: 'string' },
20
+ size: { type: 'string', optional: true },
21
+ }),
22
+ ],
23
+ });
24
+ describe('registerComponent', () => {
25
+ it('registers a Svelte component', () => {
26
+ lib.registerComponent('Card', MockCard);
27
+ expect(lib.getRegisteredComponent('Card')).toBe(MockCard);
28
+ });
29
+ it('registers multiple components', () => {
30
+ const freshLib = new ComponentLibrary({
31
+ name: 'Fresh',
32
+ description: 'Fresh lib',
33
+ components: [
34
+ defineComponent('Card', 'A card', {}, { children: true }),
35
+ defineComponent('Button', 'A button', { label: { type: 'string' } }),
36
+ defineComponent('Text', 'Text', { content: { type: 'string' } }),
37
+ ],
38
+ });
39
+ freshLib.registerComponent('Card', MockCard);
40
+ freshLib.registerComponent('Button', MockButton);
41
+ freshLib.registerComponent('Text', MockText);
42
+ expect(freshLib.getRegisteredComponent('Card')).toBe(MockCard);
43
+ expect(freshLib.getRegisteredComponent('Button')).toBe(MockButton);
44
+ expect(freshLib.getRegisteredComponent('Text')).toBe(MockText);
45
+ });
46
+ it('returns undefined for unregistered component', () => {
47
+ expect(lib.getRegisteredComponent('Unknown')).toBeUndefined();
48
+ });
49
+ it('overwrites previous registration for same name', () => {
50
+ const freshLib = new ComponentLibrary({
51
+ name: 'Fresh',
52
+ description: 'Fresh lib',
53
+ components: [defineComponent('Card', 'A card', {}, { children: true })],
54
+ });
55
+ freshLib.registerComponent('Card', MockCard);
56
+ freshLib.registerComponent('Card', MockButton);
57
+ expect(freshLib.getRegisteredComponent('Card')).toBe(MockButton);
58
+ });
59
+ });
60
+ describe('getRegisteredComponents', () => {
61
+ it('returns empty map when no components registered', () => {
62
+ const emptyLib = new ComponentLibrary({
63
+ name: 'Empty',
64
+ description: 'No components',
65
+ components: [],
66
+ });
67
+ expect(emptyLib.getRegisteredComponents().size).toBe(0);
68
+ });
69
+ it('returns populated map when components are registered', () => {
70
+ const freshLib = new ComponentLibrary({
71
+ name: 'Fresh',
72
+ description: 'Fresh lib',
73
+ components: [
74
+ defineComponent('Card', 'A card', {}, { children: true }),
75
+ defineComponent('Button', 'A button', { label: { type: 'string' } }),
76
+ ],
77
+ });
78
+ freshLib.registerComponent('Card', MockCard);
79
+ freshLib.registerComponent('Button', MockButton);
80
+ const components = freshLib.getRegisteredComponents();
81
+ expect(components.size).toBe(2);
82
+ expect(components.get('Card')).toBe(MockCard);
83
+ expect(components.get('Button')).toBe(MockButton);
84
+ });
85
+ it('returns a copy (not the internal map)', () => {
86
+ lib.registerComponent('Card', MockCard);
87
+ const map1 = lib.getRegisteredComponents();
88
+ const map2 = lib.getRegisteredComponents();
89
+ expect(map1).not.toBe(map2);
90
+ expect(map1.get('Card')).toBe(map2.get('Card'));
91
+ });
92
+ });
93
+ describe('hasComponent', () => {
94
+ it('returns true for defined components', () => {
95
+ expect(lib.hasComponent('Card')).toBe(true);
96
+ expect(lib.hasComponent('Button')).toBe(true);
97
+ });
98
+ it('returns false for unknown components', () => {
99
+ expect(lib.hasComponent('Unknown')).toBe(false);
100
+ });
101
+ });
102
+ describe('getComponent', () => {
103
+ it('returns schema for defined component', () => {
104
+ const schema = lib.getComponent('Card');
105
+ expect(schema).toBeDefined();
106
+ expect(schema?.name).toBe('Card');
107
+ });
108
+ it('returns undefined for unknown component', () => {
109
+ expect(lib.getComponent('Unknown')).toBeUndefined();
110
+ });
111
+ });
112
+ describe('defineComponent', () => {
113
+ it('creates a schema with correct name and description', () => {
114
+ const schema = defineComponent('Foo', 'A foo', {});
115
+ expect(schema.name).toBe('Foo');
116
+ expect(schema.description).toBe('A foo');
117
+ });
118
+ it('orders required props before optional', () => {
119
+ const schema = defineComponent('Bar', 'A bar', {
120
+ requiredProp: { type: 'string' },
121
+ optionalProp: { type: 'string', optional: true },
122
+ });
123
+ expect(schema.propOrder[0]).toBe('requiredProp');
124
+ expect(schema.propOrder[1]).toBe('optionalProp');
125
+ });
126
+ it('sets children flag', () => {
127
+ const schema = defineComponent('Container', 'A container', {}, { children: true });
128
+ expect(schema.children).toBe(true);
129
+ });
130
+ it('sets svelteComponent in schema', () => {
131
+ const schema = defineComponent('Widget', 'A widget', {}, { svelteComponent: 'Widget.svelte' });
132
+ expect(schema.svelteComponent).toBe('Widget.svelte');
133
+ });
134
+ });
135
+ });
@@ -24,11 +24,7 @@
24
24
  const componentRegistry = $derived(buildRegistry(library));
25
25
 
26
26
  function buildRegistry(library: ComponentLibrary): Map<string, import('svelte').Component<Record<string, unknown>>> {
27
- // TODO: Implement component registration from library schemas
28
- // This requires mapping ComponentLibrary schemas to actual Svelte imports
29
- // Example: if (library.hasComponent('Card')) registry.set('Card', CardComponent);
30
- // For now, return empty - consumers must register components manually
31
- return new Map();
27
+ return library.getRegisteredComponents();
32
28
  }
33
29
 
34
30
  function isResolved(node: OpenUINode): boolean {
@@ -43,22 +39,18 @@
43
39
  component: import('svelte').Component<Record<string, unknown>> | null;
44
40
  props: Record<string, unknown>;
45
41
  children: string[];
46
- grandchildren: string[];
47
42
  } {
48
43
  const Component = getComponent(element.component);
49
44
  const schema = library.getComponent(element.component);
50
-
45
+
51
46
  const componentProps: Record<string, unknown> = {};
52
47
  const children: string[] = [];
53
- const grandchildren: string[] = [];
54
48
 
55
49
  if (schema) {
56
- // Map positional args to named props
57
50
  for (let i = 0; i < element.args.length; i++) {
58
51
  const propName = schema.propOrder[i];
59
52
  if (propName) {
60
53
  const value = element.args[i];
61
- // If this is an identifier array, treat as children
62
54
  if (Array.isArray(value) && value.every(v => typeof v === 'string')) {
63
55
  children.push(...value);
64
56
  } else {
@@ -67,7 +59,6 @@
67
59
  }
68
60
  }
69
61
  } else {
70
- // No schema - treat all array args as children
71
62
  for (const arg of element.args) {
72
63
  if (Array.isArray(arg) && arg.every(v => typeof v === 'string')) {
73
64
  children.push(...arg);
@@ -75,19 +66,7 @@
75
66
  }
76
67
  }
77
68
 
78
- // Extract grandchildren from children (nested structure)
79
- for (const childId of children) {
80
- const childNode = ast?.nodes.get(childId);
81
- if (childNode?.type === 'element') {
82
- for (const arg of childNode.args) {
83
- if (Array.isArray(arg) && arg.every(v => typeof v === 'string')) {
84
- grandchildren.push(...arg);
85
- }
86
- }
87
- }
88
- }
89
-
90
- return { component: Component, props: componentProps, children, grandchildren };
69
+ return { component: Component, props: componentProps, children };
91
70
  }
92
71
  </script>
93
72
 
@@ -107,25 +86,11 @@
107
86
  {@const { component: RootComponent, props: rootProps, children } = renderElement(rootNode)}
108
87
  {#if RootComponent}
109
88
  <RootComponent {...rootProps}>
110
- {#each children as childId}
111
- {@const childNode = ast!.nodes.get(childId)}
112
- {#if childNode}
113
- <!-- Recursive child rendering via snippet -->
114
- {@render renderChild(childId, childNode)}
115
- {/if}
116
- {/each}
89
+ {@render renderChildren(children)}
117
90
  </RootComponent>
118
91
  {:else}
119
92
  <!-- Unregistered component - render children inline -->
120
- {#each children as childId}
121
- {@const childNode = ast!.nodes.get(childId)}
122
- {#if childNode?.type === 'element'}
123
- {@const { component: ChildComponent, props: childProps } = renderElement(childNode)}
124
- {#if ChildComponent}
125
- <ChildComponent {...childProps} />
126
- {/if}
127
- {/if}
128
- {/each}
93
+ {@render renderChildren(children)}
129
94
  {/if}
130
95
  {/if}
131
96
  {/if}
@@ -135,30 +100,25 @@
135
100
  <div class="openui-loading">Loading...</div>
136
101
  </div>
137
102
  {:else if childNode.type === 'element'}
138
- {@const { component: ChildComponent, props: childProps, grandchildren } = renderElement(childNode)}
103
+ {@const { component: ChildComponent, props: childProps, children } = renderElement(childNode)}
139
104
  {#if ChildComponent}
140
105
  <ChildComponent {...childProps}>
141
- {#each grandchildren as grandchildId}
142
- {@const grandchildNode = ast!.nodes.get(grandchildId)}
143
- {#if grandchildNode}
144
- {@render renderChild(grandchildId, grandchildNode)}
145
- {/if}
146
- {/each}
106
+ {@render renderChildren(children)}
147
107
  </ChildComponent>
148
108
  {:else}
149
109
  <!-- Unregistered component - render children inline -->
150
- {#each grandchildren as grandchildId}
151
- {@const grandchildNode = ast!.nodes.get(grandchildId)}
152
- {#if grandchildNode?.type === 'element'}
153
- {@const { component: GC, props: gp } = renderElement(grandchildNode)}
154
- {#if GC}
155
- <GC {...gp} />
156
- {/if}
157
- {/if}
158
- {/each}
110
+ {@render renderChildren(children)}
159
111
  {/if}
160
112
  {/if}
161
113
  {/snippet}
114
+ {#snippet renderChildren(childIds: string[])}
115
+ {#each childIds as childId}
116
+ {@const childNode = ast!.nodes.get(childId)}
117
+ {#if childNode}
118
+ {@render renderChild(childId, childNode)}
119
+ {/if}
120
+ {/each}
121
+ {/snippet}
162
122
 
163
123
  {:else}
164
124
  <!-- No AST yet -->
@@ -1 +1 @@
1
- {"version":3,"file":"OpenUIRenderer.svelte.d.ts","sourceRoot":"","sources":["../../../src/g0-generative/renderer/OpenUIRenderer.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;KAOK;AACL,OAAO,KAAK,EAAE,SAAS,EAAgD,MAAM,iBAAiB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAIlE,UAAU,KAAK;IACb,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACrC;AAmKH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"OpenUIRenderer.svelte.d.ts","sourceRoot":"","sources":["../../../src/g0-generative/renderer/OpenUIRenderer.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;KAOK;AACL,OAAO,KAAK,EAAE,SAAS,EAAgD,MAAM,iBAAiB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAIlE,UAAU,KAAK;IACb,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACrC;AA2HH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,143 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import { cleanup, render } from '@testing-library/svelte';
3
+ import { ComponentLibrary, defineComponent } from '../library/ComponentLibrary';
4
+ import OpenUIRenderer from './OpenUIRenderer.svelte';
5
+ import Card from '../../u0-primitives/card/Card.svelte';
6
+ import Button from '../../u0-primitives/button/Button.svelte';
7
+ import Text from '../components/Text.svelte';
8
+ function createAST(rootId, nodes) {
9
+ return { root: rootId, nodes, errors: [] };
10
+ }
11
+ describe('OpenUIRenderer', () => {
12
+ afterEach(() => cleanup());
13
+ const lib = new ComponentLibrary({
14
+ name: 'Test Library',
15
+ description: 'Test',
16
+ components: [
17
+ defineComponent('Card', 'A card', {
18
+ class: { type: 'string', optional: true },
19
+ }, { children: true }),
20
+ defineComponent('Button', 'A button', {
21
+ label: { type: 'string' },
22
+ class: { type: 'string', optional: true },
23
+ }),
24
+ defineComponent('Text', 'Text', {
25
+ content: { type: 'string' },
26
+ size: { type: 'enum', values: ['sm', 'md', 'lg', 'xl'], optional: true },
27
+ class: { type: 'string', optional: true },
28
+ }),
29
+ ],
30
+ });
31
+ it('renders empty state when ast is null', () => {
32
+ const { container } = render(OpenUIRenderer, {
33
+ props: { ast: null, library: lib },
34
+ });
35
+ expect(container.querySelector('.openui-empty')).not.toBeNull();
36
+ });
37
+ it('renders skeleton for placeholder root', () => {
38
+ const nodes = new Map([
39
+ ['root', { type: 'placeholder', identifier: 'root', referencedBy: [], line: 1 }],
40
+ ]);
41
+ const ast = createAST('root', nodes);
42
+ const { container } = render(OpenUIRenderer, {
43
+ props: { ast, library: lib },
44
+ });
45
+ expect(container.querySelector('.openui-skeleton')).not.toBeNull();
46
+ });
47
+ it('renders element root with registered component', () => {
48
+ lib.registerComponent('Card', Card);
49
+ const nodes = new Map([
50
+ ['root', { type: 'element', identifier: 'root', component: 'Card', args: [], line: 1 }],
51
+ ]);
52
+ const ast = createAST('root', nodes);
53
+ const { container } = render(OpenUIRenderer, {
54
+ props: { ast, library: lib },
55
+ });
56
+ expect(container.querySelector('.ds-card')).not.toBeNull();
57
+ expect(container.querySelector('.openui-empty')).toBeNull();
58
+ expect(container.querySelector('.openui-skeleton')).toBeNull();
59
+ });
60
+ it('renders unregistered component children inline', () => {
61
+ const nodes = new Map([
62
+ ['root', { type: 'element', identifier: 'root', component: 'Unknown', args: [], line: 1 }],
63
+ ]);
64
+ const ast = createAST('root', nodes);
65
+ const { container } = render(OpenUIRenderer, {
66
+ props: { ast, library: lib },
67
+ });
68
+ expect(container.querySelector('.openui-empty')).toBeNull();
69
+ });
70
+ it('passes props to registered components', () => {
71
+ lib.registerComponent('Button', Button);
72
+ const nodes = new Map([
73
+ ['root', { type: 'element', identifier: 'root', component: 'Button', args: ['Click me'], line: 1 }],
74
+ ]);
75
+ const ast = createAST('root', nodes);
76
+ const { container } = render(OpenUIRenderer, {
77
+ props: { ast, library: lib },
78
+ });
79
+ const button = container.querySelector('.ds-button');
80
+ expect(button).not.toBeNull();
81
+ expect(button?.getAttribute('type')).toBe('button');
82
+ });
83
+ it('renders Text from OpenUI DSL', () => {
84
+ lib.registerComponent('Text', Text);
85
+ const nodes = new Map([
86
+ ['root', { type: 'element', identifier: 'root', component: 'Text', args: ['Hello OpenUI'], line: 1 }],
87
+ ]);
88
+ const ast = createAST('root', nodes);
89
+ const { container } = render(OpenUIRenderer, {
90
+ props: { ast, library: lib },
91
+ });
92
+ expect(container.querySelector('.openui-text')?.textContent).toBe('Hello OpenUI');
93
+ });
94
+ it('renders nested children through registered components', () => {
95
+ lib.registerComponent('Card', Card);
96
+ lib.registerComponent('Text', Text);
97
+ const nodes = new Map([
98
+ ['root', { type: 'element', identifier: 'root', component: 'Card', args: [['child1']], line: 1 }],
99
+ ['child1', { type: 'element', identifier: 'child1', component: 'Text', args: ['Nested text'], line: 2 }],
100
+ ]);
101
+ const ast = createAST('root', nodes);
102
+ const { container } = render(OpenUIRenderer, {
103
+ props: { ast, library: lib },
104
+ });
105
+ expect(container.querySelectorAll('.ds-card').length).toBe(1);
106
+ expect(container.querySelector('.openui-text')?.textContent).toBe('Nested text');
107
+ });
108
+ it('renders fallback snippet when provided and ast is null', () => {
109
+ const fallback = () => '<div class="custom-fallback">Loading</div>';
110
+ const { container } = render(OpenUIRenderer, {
111
+ props: {
112
+ ast: null,
113
+ library: lib,
114
+ fallback,
115
+ },
116
+ });
117
+ expect(container.querySelector('.openui-empty')).not.toBeNull();
118
+ });
119
+ it('handles streaming state', () => {
120
+ const nodes = new Map([
121
+ ['root', { type: 'placeholder', identifier: 'root', referencedBy: [], line: 1 }],
122
+ ]);
123
+ const ast = createAST('root', nodes);
124
+ const { container } = render(OpenUIRenderer, {
125
+ props: { ast, library: lib, isStreaming: true },
126
+ });
127
+ const skeleton = container.querySelector('.openui-skeleton');
128
+ expect(skeleton).not.toBeNull();
129
+ expect(skeleton?.getAttribute('aria-busy')).toBe('true');
130
+ });
131
+ it('buildRegistry returns registered components from library', () => {
132
+ lib.registerComponent('Card', Card);
133
+ lib.registerComponent('Button', Button);
134
+ const nodes = new Map([
135
+ ['root', { type: 'element', identifier: 'root', component: 'Button', args: ['Save'], line: 1 }],
136
+ ]);
137
+ const ast = createAST('root', nodes);
138
+ const { container } = render(OpenUIRenderer, {
139
+ props: { ast, library: lib },
140
+ });
141
+ expect(container.querySelector('.ds-button')).not.toBeNull();
142
+ });
143
+ });
@@ -9,6 +9,7 @@
9
9
 
10
10
  import { onMount, onDestroy } from 'svelte';
11
11
  import 'leaflet/dist/leaflet.css';
12
+ import type { LayerGroup, Map } from 'leaflet';
12
13
 
13
14
  interface GeoPoint {
14
15
  lat: number;
@@ -32,29 +33,28 @@
32
33
 
33
34
  let { center, zoom = 12, markers = [], onMarkerSelect }: Props = $props();
34
35
 
36
+ type LeafletApi = typeof import('leaflet');
37
+
35
38
  let mapEl: HTMLDivElement;
36
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
- let map: any = null;
38
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
- let markerLayer: any = null;
40
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
- let L: any = null;
39
+ let map: Map | null = null;
40
+ let markerLayer: LayerGroup | null = null;
41
+ let leafletApi: LeafletApi | null = null;
42
42
 
43
43
  onMount(async () => {
44
44
  // Dynamic import keeps Leaflet out of the critical bundle path.
45
45
  // CSS is statically imported at top of file — resolved from node_modules at build time (ADR: 2026-04-05-sovereign-map-css-delivery-adr.md).
46
46
  const leafletModule = await import('leaflet');
47
- L = leafletModule.default;
47
+ leafletApi = leafletModule.default as LeafletApi;
48
48
 
49
- map = L.map(mapEl).setView([center.lat, center.lon], zoom);
49
+ map = leafletApi.map(mapEl).setView([center.lat, center.lon], zoom);
50
50
 
51
- L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', {
51
+ leafletApi.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', {
52
52
  attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors &copy; <a href="https://carto.com/attributions">CARTO</a>',
53
53
  subdomains: 'abcd',
54
54
  maxZoom: 19,
55
55
  }).addTo(map);
56
56
 
57
- markerLayer = L.layerGroup().addTo(map);
57
+ markerLayer = leafletApi.layerGroup().addTo(map);
58
58
  syncMarkers();
59
59
  });
60
60
 
@@ -74,18 +74,18 @@
74
74
  });
75
75
 
76
76
  function syncMarkers() {
77
- if (!markerLayer || !L) return;
77
+ if (!markerLayer || !leafletApi) return;
78
78
  markerLayer.clearLayers();
79
79
 
80
80
  for (const m of markers) {
81
- const icon = L.divIcon({
81
+ const icon = leafletApi.divIcon({
82
82
  className: '',
83
83
  html: `<div class="sov-marker${m.selected ? ' sov-marker--selected' : ''}"></div>`,
84
84
  iconSize: [12, 12],
85
85
  iconAnchor: [6, 6],
86
86
  });
87
87
 
88
- const leafletMarker = L.marker([m.lat, m.lon], { icon }).addTo(markerLayer);
88
+ const leafletMarker = leafletApi.marker([m.lat, m.lon], { icon }).addTo(markerLayer);
89
89
  leafletMarker.bindTooltip(m.label, { permanent: false, direction: 'top' });
90
90
 
91
91
  if (onMarkerSelect) {
@@ -1 +1 @@
1
- {"version":3,"file":"SovereignMap.svelte.d.ts","sourceRoot":"","sources":["../../src/g0-geo/SovereignMap.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,0BAA0B,CAAC;AAGhC,UAAU,QAAQ;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,KAAK;IACb,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAwFH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"SovereignMap.svelte.d.ts","sourceRoot":"","sources":["../../src/g0-geo/SovereignMap.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,0BAA0B,CAAC;AAIhC,UAAU,QAAQ;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,KAAK;IACb,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAyFH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}