@stephen-netu/design-system 0.2.2 → 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 (229) hide show
  1. package/dist/d0-data-viz/BarChart.test.js +53 -0
  2. package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
  3. package/dist/d0-data-viz/CheckpointPill.svelte +1 -1
  4. package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
  5. package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
  6. package/dist/d0-data-viz/MetricCard.test.js +57 -0
  7. package/dist/d0-data-viz/SparkLine.test.js +47 -0
  8. package/dist/d0-data-viz/StorageMap.test.js +63 -0
  9. package/dist/d0-data-viz/Timeline.test.js +62 -0
  10. package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
  11. package/dist/d0-data-viz/checkpoint-types.js +1 -1
  12. package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
  13. package/dist/d0-data-viz/storage-map-types.js +6 -3
  14. package/dist/d0-data-viz/theme-integration.js +1 -1
  15. package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
  16. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
  17. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
  18. package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
  19. package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
  20. package/dist/demos/index.d.ts +1 -0
  21. package/dist/demos/index.d.ts.map +1 -1
  22. package/dist/demos/index.js +1 -0
  23. package/dist/editor/CodeEditor.svelte +83 -26
  24. package/dist/editor/CodeEditor.svelte.d.ts +0 -1
  25. package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
  26. package/dist/editor/ExternalChangeDialog.svelte +117 -0
  27. package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
  28. package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
  29. package/dist/editor/MarkdownEditor.svelte +104 -617
  30. package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
  31. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  32. package/dist/editor/codemirror-config.d.ts +36 -0
  33. package/dist/editor/codemirror-config.d.ts.map +1 -0
  34. package/dist/editor/codemirror-config.js +87 -0
  35. package/dist/editor/components/CorrectionTooltip.svelte +180 -159
  36. package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
  37. package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
  38. package/dist/editor/extensions/autocomplete.d.ts +2 -2
  39. package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
  40. package/dist/editor/extensions/autocomplete.test.js +121 -0
  41. package/dist/editor/extensions/spellcheck.d.ts +21 -3
  42. package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
  43. package/dist/editor/extensions/spellcheck.js +51 -9
  44. package/dist/editor/extensions/spellcheck.test.js +168 -0
  45. package/dist/editor/extensions/types.d.ts +2 -1
  46. package/dist/editor/extensions/types.d.ts.map +1 -1
  47. package/dist/editor/index.d.ts +2 -1
  48. package/dist/editor/index.d.ts.map +1 -1
  49. package/dist/editor/index.js +1 -0
  50. package/dist/editor/markdown-preview.d.ts +9 -0
  51. package/dist/editor/markdown-preview.d.ts.map +1 -0
  52. package/dist/editor/markdown-preview.js +19 -0
  53. package/dist/editor/markdown-preview.test.js +38 -0
  54. package/dist/editor/useCodeMirror.d.ts +23 -0
  55. package/dist/editor/useCodeMirror.d.ts.map +1 -0
  56. package/dist/editor/useCodeMirror.js +40 -0
  57. package/dist/editor/useFilePersistence.d.ts +32 -0
  58. package/dist/editor/useFilePersistence.d.ts.map +1 -0
  59. package/dist/editor/useFilePersistence.js +117 -0
  60. package/dist/fabric/ai/ChatPanel.svelte +61 -62
  61. package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
  62. package/dist/fabric/ai/ResearchPanel.svelte +31 -24
  63. package/dist/fabric/data/FileTree.svelte +195 -0
  64. package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
  65. package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
  66. package/dist/fabric/data/FileTree.test.js +127 -0
  67. package/dist/fabric/data/index.d.ts +5 -9
  68. package/dist/fabric/data/index.d.ts.map +1 -1
  69. package/dist/fabric/data/index.js +4 -1
  70. package/dist/fabric/index.d.ts +1 -0
  71. package/dist/fabric/index.d.ts.map +1 -1
  72. package/dist/fabric/index.js +2 -0
  73. package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
  74. package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
  75. package/dist/fabric/navigation/ActivityRail.svelte +3 -5
  76. package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
  77. package/dist/g0-generative/components/Text.svelte +38 -0
  78. package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
  79. package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
  80. package/dist/g0-generative/index.d.ts +1 -0
  81. package/dist/g0-generative/index.d.ts.map +1 -1
  82. package/dist/g0-generative/index.js +1 -0
  83. package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
  84. package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
  85. package/dist/g0-generative/library/ComponentLibrary.js +10 -0
  86. package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
  87. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
  88. package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
  89. package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
  90. package/dist/g0-geo/SovereignMap.svelte +13 -13
  91. package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
  92. package/dist/index.d.ts +0 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +3 -1
  95. package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
  96. package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
  97. package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
  98. package/dist/l0-layout/block-writer/markdown.js +11 -11
  99. package/dist/l0-layout/block-writer/markdown.test.js +81 -0
  100. package/dist/l0-layout/card/StackedCard.svelte +87 -0
  101. package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
  102. package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
  103. package/dist/l0-layout/card/StackedCard.test.js +29 -0
  104. package/dist/l0-layout/index.d.ts +1 -0
  105. package/dist/l0-layout/index.d.ts.map +1 -1
  106. package/dist/l0-layout/index.js +1 -0
  107. package/dist/l0-layout/kanban/KanbanBoard.svelte +1 -1
  108. package/dist/l0-layout/kanban/KanbanColumn.svelte +1 -1
  109. package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
  110. package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
  111. package/dist/n1-flow-canvas/index.d.ts +2 -0
  112. package/dist/n1-flow-canvas/index.d.ts.map +1 -1
  113. package/dist/n1-flow-canvas/index.js +1 -0
  114. package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
  115. package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
  116. package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
  117. package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
  118. package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
  119. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +23 -19
  120. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  121. package/dist/n4-adaptive-manifold/types.d.ts +3 -0
  122. package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
  123. package/dist/p0-primitives/ThemeProvider.svelte +28 -7
  124. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +5 -0
  125. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  126. package/dist/p0-primitives/canvas-theme.d.ts +21 -1
  127. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  128. package/dist/p0-primitives/canvas-theme.js +78 -23
  129. package/dist/p0-primitives/debug.d.ts +6 -0
  130. package/dist/p0-primitives/debug.d.ts.map +1 -0
  131. package/dist/p0-primitives/debug.js +21 -0
  132. package/dist/p0-primitives/theme.d.ts.map +1 -1
  133. package/dist/p0-primitives/theme.js +11 -31
  134. package/dist/p0-primitives/tokens/ambient.css +76 -0
  135. package/dist/p0-primitives/tokens/tokens.css +124 -29
  136. package/dist/p0-primitives/utils/index.d.ts +2 -0
  137. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  138. package/dist/p0-primitives/utils/index.js +1 -0
  139. package/dist/p0-primitives/utils/reveal.d.ts +15 -0
  140. package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
  141. package/dist/p0-primitives/utils/reveal.js +29 -0
  142. package/dist/p0-primitives/utils/reveal.test.js +95 -0
  143. package/dist/s0-state/SyncStatus.svelte +1 -1
  144. package/dist/s0-state/index.d.ts +2 -1
  145. package/dist/s0-state/index.d.ts.map +1 -1
  146. package/dist/s0-state/index.js +2 -0
  147. package/dist/s0-state/modal-stack-store.svelte.d.ts +3 -3
  148. package/dist/s0-state/modal-stack-store.svelte.js +2 -2
  149. package/dist/spatial/ForceSimulation.svelte.js +1 -1
  150. package/dist/spatial/ParticleAssembleMark.svelte +285 -0
  151. package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
  152. package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
  153. package/dist/spatial/ZoneTiler.test.js +90 -0
  154. package/dist/spatial/index.js +1 -0
  155. package/dist/spatial/particle-assemble-math.d.ts +22 -0
  156. package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
  157. package/dist/spatial/particle-assemble-math.js +26 -0
  158. package/dist/spatial/particle-assemble-math.test.js +56 -0
  159. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -1
  160. package/dist/t0-transport/substrate.svelte.js +10 -4
  161. package/dist/u0-primitives/LockIndicator.svelte +16 -14
  162. package/dist/u0-primitives/VerticalToolbar.svelte +24 -21
  163. package/dist/u0-primitives/accordion/Accordion.svelte +8 -7
  164. package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
  165. package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
  166. package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
  167. package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
  168. package/dist/u0-primitives/badge/Badge.svelte +6 -4
  169. package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
  170. package/dist/u0-primitives/button/Button.svelte +15 -12
  171. package/dist/u0-primitives/card/Card.svelte +37 -15
  172. package/dist/u0-primitives/card/Card.test.js +86 -0
  173. package/dist/u0-primitives/command-palette/CommandPalette.svelte +48 -43
  174. package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
  175. package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
  176. package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
  177. package/dist/u0-primitives/index.d.ts +6 -0
  178. package/dist/u0-primitives/index.d.ts.map +1 -1
  179. package/dist/u0-primitives/index.js +8 -0
  180. package/dist/u0-primitives/input/Input.svelte +77 -24
  181. package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
  182. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  183. package/dist/u0-primitives/input/Input.test.js +81 -1
  184. package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
  185. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
  186. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
  187. package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
  188. package/dist/u0-primitives/live-dot/index.d.ts +3 -0
  189. package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
  190. package/dist/u0-primitives/live-dot/index.js +1 -0
  191. package/dist/u0-primitives/modal/Modal.svelte +22 -19
  192. package/dist/u0-primitives/modal/Modal.test.js +1 -1
  193. package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
  194. package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
  195. package/dist/u0-primitives/steps/Steps.svelte +18 -19
  196. package/dist/u0-primitives/surface-state/SurfaceState.svelte +7 -7
  197. package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
  198. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
  199. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
  200. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
  201. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
  202. package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
  203. package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
  204. package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
  205. package/dist/u0-primitives/toggle/Toggle.svelte +10 -11
  206. package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
  207. package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
  208. package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
  209. package/dist/u0-primitives/web-components/button-component.js +72 -33
  210. package/dist/u0-primitives/web-components/index.d.ts +3 -0
  211. package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
  212. package/dist/u0-primitives/web-components/index.js +2 -0
  213. package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
  214. package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
  215. package/dist/u0-primitives/web-components/input-component.js +56 -39
  216. package/dist/u0-primitives/web-components/web-components.test.js +96 -0
  217. package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
  218. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
  219. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
  220. package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
  221. package/dist/u0-primitives/window-frame/index.d.ts +3 -0
  222. package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
  223. package/dist/u0-primitives/window-frame/index.js +1 -0
  224. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
  225. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
  226. package/package.json +44 -28
  227. package/src/p0-primitives/tokens/ambient.css +76 -0
  228. package/src/p0-primitives/tokens/tokens.css +124 -29
  229. package/src/p0-primitives/tokens/tokens.json +42 -24
@@ -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"}
package/dist/index.d.ts CHANGED
@@ -7,7 +7,6 @@ export * from './p0-primitives';
7
7
  export * from './u0-primitives';
8
8
  export * from './l0-layout';
9
9
  export * from './s0-lifecycle';
10
- export * from './s0-state';
11
10
  export * from './t0-transport';
12
11
  export * from './f0-forms';
13
12
  export * from './d0-data-viz';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,YAAY,CAAC;AAEpB,OAAO,4CAA4C,CAAC;AACpD,OAAO,+BAA+B,CAAC;AACvC,OAAO,6BAA6B,CAAC;AAGrC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,iBAAiB,CAAC;AAEhC,cAAc,iBAAiB,CAAC;AAEhC,cAAc,aAAa,CAAC;AAE5B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,YAAY,CAAC;AAE3B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,YAAY,CAAC;AAE3B,cAAc,eAAe,CAAC;AAE9B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,YAAY,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,YAAY,CAAC;AAGpB,OAAO,4CAA4C,CAAC;AACpD,OAAO,+BAA+B,CAAC;AACvC,OAAO,6BAA6B,CAAC;AAGrC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,iBAAiB,CAAC;AAEhC,cAAc,iBAAiB,CAAC;AAEhC,cAAc,aAAa,CAAC;AAE5B,cAAc,gBAAgB,CAAC;AAK/B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,YAAY,CAAC;AAE3B,cAAc,eAAe,CAAC;AAE9B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,YAAY,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@
6
6
  // CSS imports
7
7
  import './base.css';
8
8
  /* NOTE: control-room.css is opt-in via data-theme="control-room" — import it explicitly if needed */
9
+ /* NOTE: ambient.css is opt-in decorative tokens/utilities for marketing/docs surfaces — import it explicitly if needed */
9
10
  import './p0-primitives/tokens/validity-tokens.css';
10
11
  import './n0-node-graph/n0-tokens.css';
11
12
  import './d0-data-viz/d0-tokens.css';
@@ -20,7 +21,8 @@ export * from './l0-layout';
20
21
  // S0 Lifecycle — Component lifecycle phases (constrain → layout → interact → render)
21
22
  export * from './s0-lifecycle';
22
23
  // S0 State — Store primitives (Svelte 5 runes)
23
- export * from './s0-state';
24
+ // Subpath only: consumers must import via @stephen-netu/design-system/s0-state
25
+ // to avoid module-scope singleton side effects from the root barrel.
24
26
  // T0 Transport — Tauri IPC
25
27
  export * from './t0-transport';
26
28
  // F0 Forms — Form primitives