@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
@@ -48,9 +48,9 @@
48
48
  </div>
49
49
 
50
50
  {#if label}
51
- <span class="ds-toggle-label" onclick={toggle}>
51
+ <button type="button" class="ds-toggle-label" onclick={toggle} disabled={disabled}>
52
52
  {@render label()}
53
- </span>
53
+ </button>
54
54
  {/if}
55
55
  </label>
56
56
 
@@ -67,13 +67,13 @@
67
67
  opacity: 0.5;
68
68
  }
69
69
 
70
+ /* Track: square (not pill) — mechanical, not soft */
70
71
  .ds-toggle-track {
71
72
  position: relative;
72
73
  background: var(--color-bg-panel-elevated);
73
74
  border: 1px solid var(--border-default);
74
- border-radius: var(--radius-full);
75
- transition: all var(--transition-normal);
76
- box-shadow: var(--shadow-inner);
75
+ border-radius: 0;
76
+ transition: border-color var(--transition-fast) linear, background var(--transition-fast) linear;
77
77
  }
78
78
 
79
79
  /* Track Focus */
@@ -87,29 +87,38 @@
87
87
  top: 2px;
88
88
  left: 2px;
89
89
  background: var(--color-text-secondary);
90
- border-radius: var(--radius-full);
91
- transition: all var(--transition-bounce);
92
- box-shadow: var(--shadow-sm);
90
+ border-radius: 0;
91
+ transition: transform var(--transition-fast) linear, background var(--transition-fast) linear;
93
92
  }
94
93
 
95
- /* Checked State */
94
+ /* Checked: accent border + filled thumb — accent as a live edge/fill on a
95
+ control is acceptable here because the thumb IS the state indicator */
96
96
  .ds-toggle-track.is-checked {
97
- background: var(--color-accent);
98
- border-color: var(--color-accent-hover);
99
- box-shadow: inset 0 1px 2px rgba(0,0,0,0.3), 0 0 8px var(--color-accent-subtle);
97
+ background: var(--color-accent-subtle);
98
+ border-color: var(--color-accent);
100
99
  }
101
100
 
102
101
  .ds-toggle-track.is-checked .ds-toggle-thumb {
103
- background: var(--color-text-inverse);
102
+ background: var(--color-accent);
104
103
  }
105
104
 
106
105
  /* Label */
107
106
  .ds-toggle-label {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ padding: 0;
110
+ border: 0;
111
+ background: transparent;
112
+ font: inherit;
108
113
  font-family: var(--font-sans);
109
114
  color: var(--color-text-primary);
110
115
  cursor: pointer;
111
116
  }
112
117
 
118
+ .ds-toggle-label:disabled {
119
+ cursor: not-allowed;
120
+ }
121
+
113
122
  /* --- Sizes --- */
114
123
 
115
124
  .size-sm .ds-toggle-track {
@@ -99,19 +99,19 @@
99
99
  max-width: 250px;
100
100
  background: var(--color-bg-panel-elevated);
101
101
  border: 1px solid var(--border-default);
102
- box-shadow: var(--shadow-lg), 0 0 0 1px rgba(0,0,0,0.5);
103
- border-radius: var(--radius-md);
104
- animation: ds-fade-in var(--transition-fast) ease-out;
105
- pointer-events: none; /* Don't interfere with mouse */
102
+ box-shadow: none;
103
+ border-radius: 0;
104
+ animation: ds-fade-in var(--transition-fast) linear;
105
+ pointer-events: none;
106
106
  }
107
107
 
108
108
  .ds-tooltip-inner {
109
- padding: var(--space-2) var(--space-3);
109
+ padding: var(--ui-pad-y) var(--ui-pad-x);
110
110
  color: var(--color-text-primary);
111
- font-family: var(--font-sans);
112
- font-size: var(--text-xs);
113
- line-height: 1.4;
114
- text-align: center;
111
+ font-family: var(--font-mono);
112
+ font-size: var(--ui-label);
113
+ line-height: var(--ui-leading);
114
+ text-align: left;
115
115
  }
116
116
 
117
117
  /* Arrow Base */
@@ -6,21 +6,21 @@ describe('Tooltip', () => {
6
6
  afterEach(() => cleanup());
7
7
  it('renders the trigger wrapper', async () => {
8
8
  const { container } = render(Tooltip, {
9
- props: { content: 'tip', trigger: () => 'hover me' },
9
+ props: { content: 'tip', trigger: (() => '') },
10
10
  });
11
11
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
12
12
  expect(wrapper).not.toBeNull();
13
13
  });
14
14
  it('does not show tooltip content initially', () => {
15
15
  const { container } = render(Tooltip, {
16
- props: { content: 'secret tip', trigger: () => 'hover me' },
16
+ props: { content: 'secret tip', trigger: (() => '') },
17
17
  });
18
18
  expect(container.querySelector('.ds-tooltip-content')).toBeNull();
19
19
  });
20
20
  it('shows tooltip on mouse enter', async () => {
21
21
  vi.useFakeTimers();
22
22
  const { container } = render(Tooltip, {
23
- props: { content: 'hovered!', trigger: () => 'target', delayMs: 0 },
23
+ props: { content: 'hovered!', trigger: (() => ''), delayMs: 0 },
24
24
  });
25
25
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
26
26
  await fireEvent.mouseEnter(wrapper);
@@ -33,7 +33,7 @@ describe('Tooltip', () => {
33
33
  it('hides tooltip on mouse leave', async () => {
34
34
  vi.useFakeTimers();
35
35
  const { container } = render(Tooltip, {
36
- props: { content: 'hovered!', trigger: () => 'target', delayMs: 0 },
36
+ props: { content: 'hovered!', trigger: (() => ''), delayMs: 0 },
37
37
  });
38
38
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
39
39
  await fireEvent.mouseEnter(wrapper);
@@ -49,7 +49,7 @@ describe('Tooltip', () => {
49
49
  it('applies position class for top (default)', async () => {
50
50
  vi.useFakeTimers();
51
51
  const { container } = render(Tooltip, {
52
- props: { content: 'top tip', trigger: () => 'target', delayMs: 0 },
52
+ props: { content: 'top tip', trigger: (() => ''), delayMs: 0 },
53
53
  });
54
54
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
55
55
  await fireEvent.mouseEnter(wrapper);
@@ -62,7 +62,7 @@ describe('Tooltip', () => {
62
62
  it('applies position class for bottom', async () => {
63
63
  vi.useFakeTimers();
64
64
  const { container } = render(Tooltip, {
65
- props: { content: 'bottom tip', position: 'bottom', trigger: () => 'target', delayMs: 0 },
65
+ props: { content: 'bottom tip', position: 'bottom', trigger: (() => ''), delayMs: 0 },
66
66
  });
67
67
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
68
68
  await fireEvent.mouseEnter(wrapper);
@@ -75,7 +75,7 @@ describe('Tooltip', () => {
75
75
  it('applies position class for left', async () => {
76
76
  vi.useFakeTimers();
77
77
  const { container } = render(Tooltip, {
78
- props: { content: 'left tip', position: 'left', trigger: () => 'target', delayMs: 0 },
78
+ props: { content: 'left tip', position: 'left', trigger: (() => ''), delayMs: 0 },
79
79
  });
80
80
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
81
81
  await fireEvent.mouseEnter(wrapper);
@@ -88,7 +88,7 @@ describe('Tooltip', () => {
88
88
  it('applies position class for right', async () => {
89
89
  vi.useFakeTimers();
90
90
  const { container } = render(Tooltip, {
91
- props: { content: 'right tip', position: 'right', trigger: () => 'target', delayMs: 0 },
91
+ props: { content: 'right tip', position: 'right', trigger: (() => ''), delayMs: 0 },
92
92
  });
93
93
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
94
94
  await fireEvent.mouseEnter(wrapper);
@@ -101,7 +101,7 @@ describe('Tooltip', () => {
101
101
  it('renders string content inside tooltip inner', async () => {
102
102
  vi.useFakeTimers();
103
103
  const { container } = render(Tooltip, {
104
- props: { content: 'hello world', trigger: () => 'target', delayMs: 0 },
104
+ props: { content: 'hello world', trigger: (() => ''), delayMs: 0 },
105
105
  });
106
106
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
107
107
  await fireEvent.mouseEnter(wrapper);
@@ -115,7 +115,7 @@ describe('Tooltip', () => {
115
115
  it('respects delayMs before showing', async () => {
116
116
  vi.useFakeTimers();
117
117
  const { container } = render(Tooltip, {
118
- props: { content: 'delayed', trigger: () => 'target', delayMs: 500 },
118
+ props: { content: 'delayed', trigger: (() => ''), delayMs: 500 },
119
119
  });
120
120
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
121
121
  await fireEvent.mouseEnter(wrapper);
@@ -131,7 +131,7 @@ describe('Tooltip', () => {
131
131
  it('shows tooltip on focus', async () => {
132
132
  vi.useFakeTimers();
133
133
  const { container } = render(Tooltip, {
134
- props: { content: 'focused!', trigger: () => 'target', delayMs: 0 },
134
+ props: { content: 'focused!', trigger: (() => ''), delayMs: 0 },
135
135
  });
136
136
  const wrapper = container.querySelector('.ds-tooltip-wrapper');
137
137
  await fireEvent.focusIn(wrapper);
@@ -143,7 +143,7 @@ describe('Tooltip', () => {
143
143
  });
144
144
  it('applies custom class to wrapper', () => {
145
145
  const { container } = render(Tooltip, {
146
- props: { content: 'tip', trigger: () => 'target', class: 'my-tooltip' },
146
+ props: { content: 'tip', trigger: (() => ''), class: 'my-tooltip' },
147
147
  });
148
148
  expect(container.querySelector('.my-tooltip')).not.toBeNull();
149
149
  });
@@ -1,12 +1,16 @@
1
+ import type { Props as ButtonProps } from '../button/Button.svelte';
1
2
  declare class KosButton extends HTMLElement {
2
3
  static observedAttributes: string[];
3
4
  private svelteRoot;
5
+ private svelteComponent;
4
6
  constructor();
5
7
  connectedCallback(): void;
6
8
  disconnectedCallback(): void;
7
9
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
8
- getComponentProps(): Record<string, unknown>;
10
+ getComponentProps(): ButtonProps;
9
11
  render(): void;
12
+ destroy(): void;
13
+ private ensureHostStyle;
10
14
  }
11
15
  export { KosButton };
12
16
  export default KosButton;
@@ -1 +1 @@
1
- {"version":3,"file":"button-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/button-component.ts"],"names":[],"mappings":"AAWA,cAAM,SAAU,SAAQ,WAAW;IACjC,MAAM,CAAC,kBAAkB,WAMvB;IAEF,OAAO,CAAC,UAAU,CAA4B;;IAO9C,iBAAiB;IAIjB,oBAAoB;IAOpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAwB5C,MAAM;CA4BP;AAMD,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"button-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/button-component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAWpE,cAAM,SAAU,SAAQ,WAAW;IACjC,MAAM,CAAC,kBAAkB,WAUvB;IAEF,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAwC;;IAO/D,iBAAiB;IAIjB,oBAAoB;IAIpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,WAAW;IAyChC,MAAM;IAaN,OAAO;IAWP,OAAO,CAAC,eAAe;CAYxB;AAuBD,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,eAAe,SAAS,CAAC"}
@@ -1,22 +1,22 @@
1
- /**
2
- * KosButton Web Component
3
- *
4
- * Web Component wrapper for the KosButton Svelte component.
5
- * Enables usage of KosButton in vanilla JS, React, or other frameworks.
6
- *
7
- * @package @kos/design-system/u0-primitives
8
- */
9
- import { mount } from 'svelte';
1
+ import { createRawSnippet, mount, unmount } from 'svelte';
10
2
  import Button from '../button/Button.svelte';
3
+ const variants = ['primary', 'secondary', 'ghost', 'danger'];
4
+ const sizes = ['sm', 'md', 'lg'];
5
+ const types = ['button', 'submit', 'reset'];
11
6
  class KosButton extends HTMLElement {
12
7
  static observedAttributes = [
13
8
  'disabled',
14
9
  'loading',
15
10
  'variant',
16
11
  'size',
12
+ 'type',
13
+ 'class',
14
+ 'aria-label',
15
+ 'aria-expanded',
17
16
  'children'
18
17
  ];
19
18
  svelteRoot = null;
19
+ svelteComponent = null;
20
20
  constructor() {
21
21
  super();
22
22
  this.attachShadow({ mode: 'open' });
@@ -25,10 +25,7 @@ class KosButton extends HTMLElement {
25
25
  this.render();
26
26
  }
27
27
  disconnectedCallback() {
28
- if (this.svelteRoot) {
29
- this.svelteRoot.innerHTML = '';
30
- this.svelteRoot = null;
31
- }
28
+ this.destroy();
32
29
  }
33
30
  attributeChangedCallback(name, oldValue, newValue) {
34
31
  if (oldValue !== newValue) {
@@ -37,48 +34,90 @@ class KosButton extends HTMLElement {
37
34
  }
38
35
  getComponentProps() {
39
36
  const props = {};
37
+ const variant = this.getAttribute('variant');
38
+ const size = this.getAttribute('size');
39
+ const type = this.getAttribute('type');
40
+ const className = this.getAttribute('class');
41
+ const ariaLabel = this.getAttribute('aria-label');
42
+ const ariaExpanded = this.getAttribute('aria-expanded');
43
+ const children = this.getAttribute('children');
40
44
  if (this.hasAttribute('disabled')) {
41
45
  props.disabled = true;
42
46
  }
43
47
  if (this.hasAttribute('loading')) {
44
48
  props.loading = true;
45
49
  }
46
- if (this.hasAttribute('variant')) {
47
- props.variant = this.getAttribute('variant') ?? 'primary';
50
+ if (variant) {
51
+ props.variant = readOption(variant, variants, 'primary');
52
+ }
53
+ if (size) {
54
+ props.size = readOption(size, sizes, 'md');
55
+ }
56
+ if (type) {
57
+ props.type = readOption(type, types, 'button');
48
58
  }
49
- if (this.hasAttribute('size')) {
50
- props.size = this.getAttribute('size') ?? 'md';
59
+ if (className) {
60
+ props.class = className;
51
61
  }
52
- if (this.hasAttribute('children')) {
53
- props.children = this.getAttribute('children');
62
+ if (ariaLabel) {
63
+ props['aria-label'] = ariaLabel;
64
+ }
65
+ if (ariaExpanded !== null) {
66
+ props['aria-expanded'] = ariaExpanded !== 'false';
67
+ }
68
+ if (children !== null) {
69
+ props.children = createTextSnippet(children);
54
70
  }
55
71
  return props;
56
72
  }
57
73
  render() {
58
74
  if (!this.shadowRoot)
59
75
  return;
60
- if (this.svelteRoot) {
61
- this.svelteRoot.innerHTML = '';
62
- }
76
+ this.destroy();
63
77
  this.svelteRoot = document.createElement('div');
64
78
  this.shadowRoot.appendChild(this.svelteRoot);
65
- mount(Button, {
79
+ this.svelteComponent = mount(Button, {
66
80
  target: this.svelteRoot,
67
81
  props: this.getComponentProps()
68
82
  });
69
- if (!this.shadowRoot.querySelector('style')) {
70
- const style = document.createElement('style');
71
- style.textContent = `
72
- :host {
73
- display: inline-block;
74
- font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
75
- }
76
- ::slotted(*) {
83
+ this.ensureHostStyle();
84
+ }
85
+ destroy() {
86
+ if (this.svelteComponent) {
87
+ void unmount(this.svelteComponent);
88
+ this.svelteComponent = null;
77
89
  }
78
- `;
79
- this.shadowRoot.appendChild(style);
90
+ if (this.svelteRoot) {
91
+ this.svelteRoot.remove();
92
+ this.svelteRoot = null;
80
93
  }
81
94
  }
95
+ ensureHostStyle() {
96
+ if (!this.shadowRoot || this.shadowRoot.querySelector('style'))
97
+ return;
98
+ const style = document.createElement('style');
99
+ style.textContent = `
100
+ :host {
101
+ display: inline-block;
102
+ font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
103
+ }
104
+ `;
105
+ this.shadowRoot.appendChild(style);
106
+ }
107
+ }
108
+ function readOption(value, options, fallback) {
109
+ return options.includes(value) ? value : fallback;
110
+ }
111
+ function createTextSnippet(value) {
112
+ return createRawSnippet(() => ({
113
+ render: () => `<span>${escapeHtml(value)}</span>`
114
+ }));
115
+ }
116
+ function escapeHtml(value) {
117
+ return value
118
+ .replace(/&/g, '&amp;')
119
+ .replace(/</g, '&lt;')
120
+ .replace(/>/g, '&gt;');
82
121
  }
83
122
  if (!customElements.get('kos-button')) {
84
123
  customElements.define('kos-button', KosButton);
@@ -0,0 +1,3 @@
1
+ export { KosButton } from './button-component';
2
+ export { KosInput } from './input-component';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { KosButton } from './button-component';
2
+ export { KosInput } from './input-component';
@@ -1,12 +1,16 @@
1
+ import type { Props as InputProps } from '../input/Input.svelte';
1
2
  declare class KosInput extends HTMLElement {
2
3
  static observedAttributes: string[];
3
4
  private svelteRoot;
5
+ private svelteComponent;
4
6
  constructor();
5
7
  connectedCallback(): void;
6
8
  disconnectedCallback(): void;
7
9
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
8
- getComponentProps(): Record<string, unknown>;
10
+ getComponentProps(): InputProps;
9
11
  render(): void;
12
+ destroy(): void;
13
+ private ensureHostStyle;
10
14
  }
11
15
  export { KosInput };
12
16
  export default KosInput;
@@ -1 +1 @@
1
- {"version":3,"file":"input-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/input-component.ts"],"names":[],"mappings":"AAWA,cAAM,QAAS,SAAQ,WAAW;IAChC,MAAM,CAAC,kBAAkB,WAOvB;IAEF,OAAO,CAAC,UAAU,CAA4B;;IAO9C,iBAAiB;IAIjB,oBAAoB;IAOpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA0B5C,MAAM;CA4BP;AAMD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"input-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/input-component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAOjE,cAAM,QAAS,SAAQ,WAAW;IAChC,MAAM,CAAC,kBAAkB,WASvB;IAEF,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAwC;;IAO/D,iBAAiB;IAIjB,oBAAoB;IAIpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,UAAU;IAqC/B,MAAM;IAaN,OAAO;IAWP,OAAO,CAAC,eAAe;CAYxB;AAUD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,eAAe,QAAQ,CAAC"}
@@ -1,23 +1,19 @@
1
- /**
2
- * KosInput Web Component
3
- *
4
- * Web Component wrapper for the KosInput Svelte component.
5
- * Enables usage of KosInput in vanilla JS, React, or other frameworks.
6
- *
7
- * @package @kos/design-system/u0-primitives
8
- */
9
- import { mount } from 'svelte';
1
+ import { mount, unmount } from 'svelte';
10
2
  import Input from '../input/Input.svelte';
3
+ const types = ['text', 'search', 'password', 'email', 'url'];
11
4
  class KosInput extends HTMLElement {
12
5
  static observedAttributes = [
13
6
  'type',
14
7
  'value',
15
8
  'placeholder',
16
9
  'disabled',
17
- 'readonly',
18
- 'required'
10
+ 'error',
11
+ 'class',
12
+ 'id',
13
+ 'name'
19
14
  ];
20
15
  svelteRoot = null;
16
+ svelteComponent = null;
21
17
  constructor() {
22
18
  super();
23
19
  this.attachShadow({ mode: 'open' });
@@ -26,10 +22,7 @@ class KosInput extends HTMLElement {
26
22
  this.render();
27
23
  }
28
24
  disconnectedCallback() {
29
- if (this.svelteRoot) {
30
- this.svelteRoot.innerHTML = '';
31
- this.svelteRoot = null;
32
- }
25
+ this.destroy();
33
26
  }
34
27
  attributeChangedCallback(name, oldValue, newValue) {
35
28
  if (oldValue !== newValue) {
@@ -38,51 +31,75 @@ class KosInput extends HTMLElement {
38
31
  }
39
32
  getComponentProps() {
40
33
  const props = {};
41
- if (this.hasAttribute('type')) {
42
- props.type = this.getAttribute('type') ?? 'text';
34
+ const type = this.getAttribute('type');
35
+ const value = this.getAttribute('value');
36
+ const placeholder = this.getAttribute('placeholder');
37
+ const className = this.getAttribute('class');
38
+ const id = this.getAttribute('id');
39
+ const name = this.getAttribute('name');
40
+ if (type) {
41
+ props.type = readOption(type, types, 'text');
43
42
  }
44
- if (this.hasAttribute('value')) {
45
- props.value = this.getAttribute('value') ?? '';
43
+ if (value !== null) {
44
+ props.value = value;
46
45
  }
47
- if (this.hasAttribute('placeholder')) {
48
- props.placeholder = this.getAttribute('placeholder') ?? '';
46
+ if (placeholder !== null) {
47
+ props.placeholder = placeholder;
49
48
  }
50
49
  if (this.hasAttribute('disabled')) {
51
50
  props.disabled = true;
52
51
  }
53
- if (this.hasAttribute('readonly')) {
54
- props.readonly = true;
52
+ if (this.hasAttribute('error')) {
53
+ props.error = true;
54
+ }
55
+ if (className) {
56
+ props.class = className;
55
57
  }
56
- if (this.hasAttribute('required')) {
57
- props.required = true;
58
+ if (id) {
59
+ props.id = id;
60
+ }
61
+ if (name) {
62
+ props.name = name;
58
63
  }
59
64
  return props;
60
65
  }
61
66
  render() {
62
67
  if (!this.shadowRoot)
63
68
  return;
64
- if (this.svelteRoot) {
65
- this.svelteRoot.innerHTML = '';
66
- }
69
+ this.destroy();
67
70
  this.svelteRoot = document.createElement('div');
68
71
  this.shadowRoot.appendChild(this.svelteRoot);
69
- mount(Input, {
72
+ this.svelteComponent = mount(Input, {
70
73
  target: this.svelteRoot,
71
74
  props: this.getComponentProps()
72
75
  });
73
- if (!this.shadowRoot.querySelector('style')) {
74
- const style = document.createElement('style');
75
- style.textContent = `
76
- :host {
77
- display: block;
78
- font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
79
- }
80
- ::slotted(*) {
76
+ this.ensureHostStyle();
77
+ }
78
+ destroy() {
79
+ if (this.svelteComponent) {
80
+ void unmount(this.svelteComponent);
81
+ this.svelteComponent = null;
81
82
  }
82
- `;
83
- this.shadowRoot.appendChild(style);
83
+ if (this.svelteRoot) {
84
+ this.svelteRoot.remove();
85
+ this.svelteRoot = null;
84
86
  }
85
87
  }
88
+ ensureHostStyle() {
89
+ if (!this.shadowRoot || this.shadowRoot.querySelector('style'))
90
+ return;
91
+ const style = document.createElement('style');
92
+ style.textContent = `
93
+ :host {
94
+ display: block;
95
+ font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
96
+ }
97
+ `;
98
+ this.shadowRoot.appendChild(style);
99
+ }
100
+ }
101
+ function readOption(value, options, fallback) {
102
+ return options.includes(value) ? value : fallback;
86
103
  }
87
104
  if (!customElements.get('kos-input')) {
88
105
  customElements.define('kos-input', KosInput);
@@ -0,0 +1,96 @@
1
+ import { afterEach, describe, expect, it } from 'vitest';
2
+ import { KosButton } from './button-component';
3
+ import { KosInput } from './input-component';
4
+ describe('u0-primitives/web-components', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+ it('defines and renders the kos-button custom element', () => {
9
+ const element = createButton({
10
+ variant: 'danger',
11
+ size: 'lg',
12
+ type: 'submit',
13
+ class: 'custom-button',
14
+ 'aria-label': 'Submit form',
15
+ 'aria-expanded': 'true',
16
+ children: 'Save'
17
+ });
18
+ const button = element.shadowRoot?.querySelector('button');
19
+ expect(customElements.get('kos-button')).toBe(KosButton);
20
+ expect(button).not.toBeNull();
21
+ expect(button?.getAttribute('type')).toBe('submit');
22
+ expect(button?.getAttribute('aria-label')).toBe('Submit form');
23
+ expect(button?.getAttribute('aria-expanded')).toBe('true');
24
+ expect(button?.classList.contains('variant-danger')).toBe(true);
25
+ expect(button?.classList.contains('size-lg')).toBe(true);
26
+ expect(button?.classList.contains('custom-button')).toBe(true);
27
+ expect(button?.textContent?.trim()).toBe('Save');
28
+ });
29
+ it('updates the kos-button when attributes change', () => {
30
+ const element = createButton();
31
+ const button = element.shadowRoot?.querySelector('button');
32
+ expect(button?.hasAttribute('disabled')).toBe(false);
33
+ element.setAttribute('loading', '');
34
+ const updatedButton = element.shadowRoot?.querySelector('button');
35
+ expect(updatedButton?.hasAttribute('disabled')).toBe(true);
36
+ expect(updatedButton?.classList.contains('is-loading')).toBe(true);
37
+ });
38
+ it('falls back to safe button defaults for invalid attributes', () => {
39
+ const element = createButton({
40
+ variant: 'invalid',
41
+ size: 'invalid',
42
+ type: 'invalid'
43
+ });
44
+ const button = element.shadowRoot?.querySelector('button');
45
+ expect(button?.classList.contains('variant-primary')).toBe(true);
46
+ expect(button?.classList.contains('size-md')).toBe(true);
47
+ expect(button?.getAttribute('type')).toBe('button');
48
+ });
49
+ it('defines and renders the kos-input custom element', () => {
50
+ const element = createInput({
51
+ type: 'search',
52
+ value: 'needle',
53
+ placeholder: 'Search',
54
+ disabled: '',
55
+ error: '',
56
+ class: 'custom-input',
57
+ id: 'search-box',
58
+ name: 'q'
59
+ });
60
+ const input = element.shadowRoot?.querySelector('input');
61
+ expect(customElements.get('kos-input')).toBe(KosInput);
62
+ expect(input).not.toBeNull();
63
+ expect(input?.getAttribute('type')).toBe('search');
64
+ expect(input.value).toBe('needle');
65
+ expect(input?.getAttribute('placeholder')).toBe('Search');
66
+ expect(input?.getAttribute('id')).toBe('search-box');
67
+ expect(input?.getAttribute('name')).toBe('q');
68
+ expect(input?.hasAttribute('disabled')).toBe(true);
69
+ expect(input?.getAttribute('aria-invalid')).toBe('true');
70
+ expect(element.shadowRoot?.querySelector('.custom-input')).not.toBeNull();
71
+ });
72
+ it('updates the kos-input when attributes change', () => {
73
+ const element = createInput({ type: 'text' });
74
+ expect(element.shadowRoot?.querySelector('input')?.getAttribute('type')).toBe('text');
75
+ element.setAttribute('type', 'password');
76
+ const input = element.shadowRoot?.querySelector('input');
77
+ expect(input?.getAttribute('type')).toBe('password');
78
+ });
79
+ it('falls back to safe input defaults for invalid attributes', () => {
80
+ const element = createInput({ type: 'tel' });
81
+ const input = element.shadowRoot?.querySelector('input');
82
+ expect(input?.getAttribute('type')).toBe('text');
83
+ });
84
+ });
85
+ function createButton(attributes = {}) {
86
+ const element = document.createElement('kos-button');
87
+ Object.entries(attributes).forEach(([name, value]) => element.setAttribute(name, value));
88
+ document.body.appendChild(element);
89
+ return element;
90
+ }
91
+ function createInput(attributes) {
92
+ const element = document.createElement('kos-input');
93
+ Object.entries(attributes).forEach(([name, value]) => element.setAttribute(name, value));
94
+ document.body.appendChild(element);
95
+ return element;
96
+ }