@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
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @package @kos/design-system/u0-primitives
8
8
  */
9
+ import { untrack } from 'svelte';
9
10
  import type { Snippet } from 'svelte';
10
11
 
11
12
  interface Panel {
@@ -40,7 +41,7 @@
40
41
  onOpenChange,
41
42
  }: Props = $props();
42
43
 
43
- let internalOpenIds = $state<string[]>([...defaultOpen]);
44
+ let internalOpenIds = $state<string[]>(untrack(() => [...defaultOpen]));
44
45
 
45
46
  function setInternalOpenIds(fn: (prev: string[]) => string[]) {
46
47
  internalOpenIds = fn(internalOpenIds);
@@ -125,14 +126,12 @@
125
126
 
126
127
  <style>
127
128
  .accordion {
128
- border-radius: var(--radius-md, 0.25rem);
129
- overflow: hidden;
130
- border: 1px solid var(--color-border, var(--border-default, #3a3630));
131
- background: var(--color-bg-app, #0b0d0f);
129
+ border: var(--border-width-thin) solid var(--color-border);
130
+ background: var(--color-bg-app);
132
131
  }
133
132
 
134
133
  .accordion-item {
135
- border-bottom: 1px solid var(--color-border, var(--border-default, #3a3630));
134
+ border-bottom: var(--border-width-thin) solid var(--color-border);
136
135
  }
137
136
 
138
137
  .accordion-item:last-child {
@@ -148,21 +147,23 @@
148
147
  display: flex;
149
148
  align-items: center;
150
149
  justify-content: space-between;
151
- padding: var(--space-4, 1rem);
150
+ padding: var(--ui-pad-y) var(--ui-pad-x);
151
+ min-height: var(--ui-control-h);
152
152
  cursor: pointer;
153
153
  user-select: none;
154
- transition: background-color var(--duration-normal, 200ms) ease-in-out;
154
+ transition: background-color var(--transition-fast) linear;
155
155
  }
156
156
 
157
157
  .accordion-header:hover:not(.disabled) {
158
- background: var(--color-bg-secondary, var(--color-bg-canvas, #121518));
158
+ background: var(--color-bg-secondary);
159
159
  }
160
160
 
161
161
  /* Removed duplicate focus-visible — the box-shadow variant below supersedes. */
162
162
 
163
163
  /* Focus styles for keyboard navigation */
164
164
  .accordion-header:focus-visible {
165
- box-shadow: 0 0 0 2px var(--color-accent, var(--color-accent));
165
+ outline: var(--border-width-default) solid var(--color-accent);
166
+ outline-offset: -2px;
166
167
  }
167
168
 
168
169
  /* Disabled states */
@@ -179,7 +180,8 @@
179
180
  }
180
181
 
181
182
  .accordion-content {
182
- padding: var(--space-4, 1rem);
183
- padding-top: 0;
183
+ padding: var(--ui-pad-x);
184
+ padding-top: var(--ui-pad-y);
185
+ font-size: var(--ui-font);
184
186
  }
185
187
  </style>
@@ -1,10 +1,3 @@
1
- /**
2
- * Accordion Component
3
- *
4
- * A vertically stacked set of interactive headings that each reveal a panel of associated content.
5
- *
6
- * @package @kos/design-system/u0-primitives
7
- */
8
1
  import type { Snippet } from 'svelte';
9
2
  interface Panel {
10
3
  /** Unique identifier for the panel */
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/accordion/Accordion.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;KAMK;AACL,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,UAAU,KAAK;IACb,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,iCAAiC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC5C;AAyFH,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"Accordion.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/accordion/Accordion.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,UAAU,KAAK;IACb,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,iCAAiC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC5C;AA0FH,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -2,9 +2,9 @@ import { afterEach, describe, it, expect, vi } from 'vitest';
2
2
  import { cleanup, render, fireEvent } from '@testing-library/svelte';
3
3
  import Accordion from './Accordion.svelte';
4
4
  const samplePanels = [
5
- { id: 'p1', title: 'First', content: () => 'Content 1' },
6
- { id: 'p2', title: 'Second', content: () => 'Content 2' },
7
- { id: 'p3', title: 'Third', content: () => 'Content 3' },
5
+ { id: 'p1', title: 'First', content: (() => '') },
6
+ { id: 'p2', title: 'Second', content: (() => '') },
7
+ { id: 'p3', title: 'Third', content: (() => '') },
8
8
  ];
9
9
  describe('Accordion', () => {
10
10
  afterEach(() => cleanup());
@@ -54,8 +54,8 @@ describe('Accordion', () => {
54
54
  });
55
55
  it('does not open disabled panels', async () => {
56
56
  const panels = [
57
- { id: 'p1', title: 'Enabled', content: () => 'E' },
58
- { id: 'p2', title: 'Disabled', content: () => 'D', disabled: true },
57
+ { id: 'p1', title: 'Enabled', content: (() => '') },
58
+ { id: 'p2', title: 'Disabled', content: (() => ''), disabled: true },
59
59
  ];
60
60
  const { container } = render(Accordion, { panels });
61
61
  const buttons = container.querySelectorAll('[role="button"]');
@@ -116,7 +116,7 @@
116
116
  {:else if name === 'power-plant'}
117
117
  <!-- Power plant silhouette with cooling tower -->
118
118
  <defs>
119
- <linearGradient id="brassGrad-{size}" x1="0%" y1="0%" x2="100%" y2="100%">
119
+ <linearGradient id="accentGrad-{size}" x1="0%" y1="0%" x2="100%" y2="100%">
120
120
  <stop offset="0%" stop-color="var(--color-accent-hover)"/>
121
121
  <stop offset="50%" stop-color="var(--color-accent)"/>
122
122
  <stop offset="100%" stop-color="var(--color-accent-active)"/>
@@ -125,7 +125,7 @@
125
125
 
126
126
  <!-- Cooling tower -->
127
127
  <path d="M8 35 Q4 25 12 15 L14 5 Q20 2 26 5 L28 15 Q36 25 32 35 Z"
128
- fill="url(#brassGrad-{size})" opacity="0.8"/>
128
+ fill="url(#accentGrad-{size})" opacity="0.8"/>
129
129
 
130
130
  <!-- Inner detail -->
131
131
  <path d="M12 32 Q8 24 15 15 L17 8 Q20 6 23 8 L25 15 Q32 24 28 32"
@@ -200,7 +200,7 @@
200
200
  {:else if name === 'steam-tower'}
201
201
  <!-- Minimal steam tower with rising particles -->
202
202
  <path d="M12 38 L16 12 L24 12 L28 38 Z" fill="currentColor" opacity="0.3"/>
203
- <path d="M14 38 L17 14 L23 14 L26 38 Z" fill="url(#brassGrad-{size})" opacity="0.7"/>
203
+ <path d="M14 38 L17 14 L23 14 L26 38 Z" fill="url(#accentGrad-{size})" opacity="0.7"/>
204
204
 
205
205
  {#if animation === 'steam'}
206
206
  <!-- Rising particles -->
@@ -0,0 +1,82 @@
1
+ import { afterEach, describe, it, expect } from 'vitest';
2
+ import { cleanup, render } from '@testing-library/svelte';
3
+ import AnimatedIcon from './AnimatedIcon.svelte';
4
+ describe('AnimatedIcon', () => {
5
+ afterEach(() => cleanup());
6
+ it('renders an SVG element', () => {
7
+ const { container } = render(AnimatedIcon, { name: 'power-node' });
8
+ expect(container.querySelector('svg')).not.toBeNull();
9
+ });
10
+ it('applies the default size (40px)', () => {
11
+ const { container } = render(AnimatedIcon, { name: 'power-node' });
12
+ const svg = container.querySelector('svg');
13
+ expect(svg.getAttribute('style')).toContain('width: 40px');
14
+ expect(svg.getAttribute('style')).toContain('height: 40px');
15
+ });
16
+ it('applies a custom size', () => {
17
+ const { container } = render(AnimatedIcon, { name: 'power-node', size: 64 });
18
+ const svg = container.querySelector('svg');
19
+ expect(svg.getAttribute('style')).toContain('width: 64px');
20
+ expect(svg.getAttribute('style')).toContain('height: 64px');
21
+ });
22
+ it('applies a custom color', () => {
23
+ const { container } = render(AnimatedIcon, { name: 'power-node', color: 'red' });
24
+ expect(container.querySelector('svg').getAttribute('style')).toContain('color: red');
25
+ });
26
+ it('renders power-node icon paths (core circle)', () => {
27
+ const { container } = render(AnimatedIcon, { name: 'power-node' });
28
+ const svg = container.querySelector('svg');
29
+ expect(svg.querySelectorAll('circle').length).toBeGreaterThanOrEqual(3);
30
+ });
31
+ it('renders activity icon paths (rect bars)', () => {
32
+ const { container } = render(AnimatedIcon, { name: 'activity' });
33
+ const svg = container.querySelector('svg');
34
+ expect(svg.querySelectorAll('rect').length).toBe(4);
35
+ });
36
+ it('renders connection icon paths (two circles and a line)', () => {
37
+ const { container } = render(AnimatedIcon, { name: 'connection' });
38
+ const svg = container.querySelector('svg');
39
+ expect(svg.querySelectorAll('circle').length).toBeGreaterThanOrEqual(3);
40
+ expect(svg.querySelectorAll('line').length).toBe(1);
41
+ });
42
+ it('contains animate elements for animated icons', () => {
43
+ const { container } = render(AnimatedIcon, { name: 'activity' });
44
+ const svg = container.querySelector('svg');
45
+ expect(svg.querySelectorAll('animate').length).toBeGreaterThan(0);
46
+ });
47
+ it('contains animateTransform for orbit animation on power-node', () => {
48
+ const { container } = render(AnimatedIcon, { name: 'power-node', animation: 'orbit' });
49
+ const svg = container.querySelector('svg');
50
+ expect(svg.querySelectorAll('animateTransform').length).toBe(1);
51
+ });
52
+ it('render pulse animation markup on power-node', () => {
53
+ const { container } = render(AnimatedIcon, { name: 'power-node', animation: 'pulse' });
54
+ const svg = container.querySelector('svg');
55
+ expect(svg.querySelectorAll('animate').length).toBeGreaterThanOrEqual(2);
56
+ });
57
+ it('doubles speed halves the dur attribute', () => {
58
+ const { container: c1 } = render(AnimatedIcon, { name: 'power-node', animation: 'pulse', speed: 1 });
59
+ const animates1 = c1.querySelectorAll('animate');
60
+ const dur1 = animates1[0].getAttribute('dur');
61
+ cleanup();
62
+ const { container: c2 } = render(AnimatedIcon, { name: 'power-node', animation: 'pulse', speed: 2 });
63
+ const animates2 = c2.querySelectorAll('animate');
64
+ const dur2 = animates2[0].getAttribute('dur');
65
+ expect(dur1).toBe('2000ms');
66
+ expect(dur2).toBe('1000ms');
67
+ });
68
+ it('has aria-hidden attribute on SVG', () => {
69
+ const { container } = render(AnimatedIcon, { name: 'power-node' });
70
+ expect(container.querySelector('svg').getAttribute('aria-hidden')).toBe('true');
71
+ });
72
+ it('renders energy-pulse icon correctly', () => {
73
+ const { container } = render(AnimatedIcon, { name: 'energy-pulse' });
74
+ const svg = container.querySelector('svg');
75
+ expect(svg.querySelectorAll('circle').length).toBeGreaterThanOrEqual(4);
76
+ });
77
+ it('renders status-ring icon correctly', () => {
78
+ const { container } = render(AnimatedIcon, { name: 'status-ring' });
79
+ const svg = container.querySelector('svg');
80
+ expect(svg.querySelectorAll('path').length).toBe(2);
81
+ });
82
+ });
@@ -74,11 +74,10 @@
74
74
  position: relative;
75
75
  width: 100%;
76
76
  height: 100%;
77
- border-radius: var(--radius-full);
77
+ border-radius: var(--radius-full); /* circle — intentional, avatars are always round */
78
78
  overflow: hidden;
79
79
  background: var(--color-bg-panel-elevated);
80
80
  border: 1px solid var(--border-subtle);
81
- box-shadow: var(--shadow-sm);
82
81
  }
83
82
 
84
83
  .ds-avatar-image {
@@ -93,7 +92,7 @@
93
92
  display: flex;
94
93
  align-items: center;
95
94
  justify-content: center;
96
- background: linear-gradient(135deg, var(--color-bg-panel-elevated), var(--color-bg-panel));
95
+ background: var(--color-bg-panel-elevated);
97
96
  color: var(--color-text-secondary);
98
97
  }
99
98
 
@@ -142,36 +141,37 @@
142
141
  z-index: 10;
143
142
  }
144
143
 
145
- .status-online { background-color: var(--color-online); box-shadow: 0 0 6px var(--color-cyan-glow); }
144
+ .status-online { background-color: var(--color-online); }
146
145
  .status-away { background-color: var(--color-away); }
147
146
  .status-busy { background-color: var(--color-busy); }
148
147
  .status-offline { background-color: var(--color-offline); }
149
148
 
150
- .status-typing {
149
+ /* Typing: blinking dots — mechanical, no bounce, no glow */
150
+ .status-typing {
151
151
  background-color: var(--color-typing);
152
152
  display: flex;
153
153
  align-items: center;
154
154
  justify-content: space-evenly;
155
155
  width: auto;
156
- padding: 0 4px;
156
+ padding: 0 3px;
157
157
  min-width: 16px;
158
158
  border-radius: var(--radius-full);
159
- box-shadow: var(--shadow-glow);
160
159
  }
161
160
 
162
161
  .typing-dot {
163
162
  width: 3px;
164
163
  height: 3px;
165
- background-color: var(--color-text-inverse);
164
+ background-color: var(--color-text-inverse);
166
165
  border-radius: var(--radius-full);
167
- animation: typing-bounce 1.4s infinite ease-in-out both;
166
+ animation: typing-blink 1.2s step-end infinite;
168
167
  }
169
168
 
170
- .typing-dot:nth-child(1) { animation-delay: -0.32s; }
171
- .typing-dot:nth-child(2) { animation-delay: -0.16s; }
169
+ .typing-dot:nth-child(1) { animation-delay: 0s; }
170
+ .typing-dot:nth-child(2) { animation-delay: 0.4s; }
171
+ .typing-dot:nth-child(3) { animation-delay: 0.8s; }
172
172
 
173
- @keyframes typing-bounce {
174
- 0%, 80%, 100% { transform: scale(0); }
175
- 40% { transform: scale(1); }
173
+ @keyframes typing-blink {
174
+ 0%, 100% { opacity: 0.2; }
175
+ 50% { opacity: 1; }
176
176
  }
177
177
  </style>
@@ -0,0 +1,81 @@
1
+ import { afterEach, describe, it, expect } from 'vitest';
2
+ import { cleanup, render, fireEvent } from '@testing-library/svelte';
3
+ import Avatar from './Avatar.svelte';
4
+ describe('Avatar', () => {
5
+ afterEach(() => cleanup());
6
+ it('renders the ds-avatar-wrapper root element', () => {
7
+ const { container } = render(Avatar);
8
+ expect(container.querySelector('.ds-avatar-wrapper')).not.toBeNull();
9
+ });
10
+ it('applies the size-sm class', () => {
11
+ const { container } = render(Avatar, { size: 'sm' });
12
+ expect(container.querySelector('.size-sm')).not.toBeNull();
13
+ });
14
+ it('applies the size-md class by default', () => {
15
+ const { container } = render(Avatar);
16
+ expect(container.querySelector('.size-md')).not.toBeNull();
17
+ });
18
+ it('applies the size-lg class', () => {
19
+ const { container } = render(Avatar, { size: 'lg' });
20
+ expect(container.querySelector('.size-lg')).not.toBeNull();
21
+ });
22
+ it('applies the size-xl class', () => {
23
+ const { container } = render(Avatar, { size: 'xl' });
24
+ expect(container.querySelector('.size-xl')).not.toBeNull();
25
+ });
26
+ it('renders an image when src is provided', () => {
27
+ const { container } = render(Avatar, { src: 'https://example.com/photo.png', name: 'Jane' });
28
+ const img = container.querySelector('.ds-avatar-image');
29
+ expect(img).not.toBeNull();
30
+ expect(img.getAttribute('src')).toBe('https://example.com/photo.png');
31
+ });
32
+ it('renders initials from a two-word name', () => {
33
+ const { container } = render(Avatar, { name: 'Jane Doe' });
34
+ expect(container.querySelector('.ds-avatar-initials').textContent).toBe('JD');
35
+ });
36
+ it('renders initials from a single-word name', () => {
37
+ const { container } = render(Avatar, { name: 'Alice' });
38
+ expect(container.querySelector('.ds-avatar-initials').textContent).toBe('A');
39
+ });
40
+ it('renders a question mark when name is empty', () => {
41
+ const { container } = render(Avatar);
42
+ expect(container.querySelector('.ds-avatar-initials').textContent).toBe('?');
43
+ });
44
+ it('does not render a status dot when status is null', () => {
45
+ const { container } = render(Avatar);
46
+ expect(container.querySelector('.ds-avatar-status')).toBeNull();
47
+ });
48
+ it('renders a status dot with the online class', () => {
49
+ const { container } = render(Avatar, { status: 'online' });
50
+ const status = container.querySelector('.ds-avatar-status');
51
+ expect(status).not.toBeNull();
52
+ expect(status.classList.contains('status-online')).toBe(true);
53
+ });
54
+ it('renders a status dot with the away class', () => {
55
+ const { container } = render(Avatar, { status: 'away' });
56
+ expect(container.querySelector('.status-away')).not.toBeNull();
57
+ });
58
+ it('renders a status dot with the busy class', () => {
59
+ const { container } = render(Avatar, { status: 'busy' });
60
+ expect(container.querySelector('.status-busy')).not.toBeNull();
61
+ });
62
+ it('renders a status dot with the offline class', () => {
63
+ const { container } = render(Avatar, { status: 'offline' });
64
+ expect(container.querySelector('.status-offline')).not.toBeNull();
65
+ });
66
+ it('renders typing dots when status is typing', () => {
67
+ const { container } = render(Avatar, { status: 'typing' });
68
+ expect(container.querySelectorAll('.typing-dot').length).toBe(3);
69
+ });
70
+ it('switches to initials fallback on image error', async () => {
71
+ const { container } = render(Avatar, {
72
+ src: 'https://example.com/broken.png',
73
+ name: 'Test User',
74
+ });
75
+ const img = container.querySelector('.ds-avatar-image');
76
+ expect(img).not.toBeNull();
77
+ await fireEvent.error(img);
78
+ expect(container.querySelector('.ds-avatar-initials')).not.toBeNull();
79
+ expect(container.querySelector('.ds-avatar-initials').textContent).toBe('TU');
80
+ });
81
+ });
@@ -36,11 +36,13 @@
36
36
  display: inline-flex;
37
37
  align-items: center;
38
38
  justify-content: center;
39
- font-family: var(--font-sans);
39
+ font-family: var(--font-mono);
40
40
  font-weight: 600;
41
+ letter-spacing: 0.06em;
42
+ text-transform: uppercase;
41
43
  white-space: nowrap;
42
- border-radius: var(--radius-full);
43
- transition: all var(--transition-fast);
44
+ border-radius: 0;
45
+ transition: border-color var(--transition-fast), background-color var(--transition-fast), color var(--transition-fast);
44
46
  }
45
47
 
46
48
  /* --- Variants --- */
@@ -88,7 +90,7 @@
88
90
 
89
91
  /* Count (Solid background, white/dark text) */
90
92
  .variant-count {
91
- box-shadow: var(--shadow-sm);
93
+ font-variant-numeric: tabular-nums;
92
94
  }
93
95
 
94
96
  .variant-count.color-accent { background: var(--color-accent); color: var(--color-text-inverse); }
@@ -4,30 +4,30 @@ import Badge from './Badge.svelte';
4
4
  describe('Badge', () => {
5
5
  afterEach(() => cleanup());
6
6
  it('renders with default variant', () => {
7
- const { container } = render(Badge, { props: { children: () => { } } });
7
+ const { container } = render(Badge, { props: { children: (() => '') } });
8
8
  expect(container.querySelector('.ds-badge')).not.toBeNull();
9
9
  expect(container.querySelector('.variant-status')).not.toBeNull();
10
10
  });
11
11
  it('renders with info variant color class', () => {
12
- const { container } = render(Badge, { props: { color: 'info', children: () => { } } });
12
+ const { container } = render(Badge, { props: { color: 'info', children: (() => '') } });
13
13
  expect(container.querySelector('.color-info')).not.toBeNull();
14
14
  });
15
15
  it('renders with success variant color class', () => {
16
- const { container } = render(Badge, { props: { color: 'success', children: () => { } } });
16
+ const { container } = render(Badge, { props: { color: 'success', children: (() => '') } });
17
17
  expect(container.querySelector('.color-success')).not.toBeNull();
18
18
  });
19
19
  it('renders with warning variant color class', () => {
20
- const { container } = render(Badge, { props: { color: 'warning', children: () => { } } });
20
+ const { container } = render(Badge, { props: { color: 'warning', children: (() => '') } });
21
21
  expect(container.querySelector('.color-warning')).not.toBeNull();
22
22
  });
23
23
  it('renders with error variant color class', () => {
24
- const { container } = render(Badge, { props: { color: 'error', children: () => { } } });
24
+ const { container } = render(Badge, { props: { color: 'error', children: (() => '') } });
25
25
  expect(container.querySelector('.color-error')).not.toBeNull();
26
26
  });
27
27
  it('applies size classes', () => {
28
- const { container: sm } = render(Badge, { props: { size: 'sm', children: () => { } } });
28
+ const { container: sm } = render(Badge, { props: { size: 'sm', children: (() => '') } });
29
29
  expect(sm.querySelector('.size-sm')).not.toBeNull();
30
- const { container: lg } = render(Badge, { props: { size: 'lg', children: () => { } } });
30
+ const { container: lg } = render(Badge, { props: { size: 'lg', children: (() => '') } });
31
31
  expect(lg.querySelector('.size-lg')).not.toBeNull();
32
32
  });
33
33
  it('renders dot variant without content span', () => {
@@ -36,15 +36,15 @@ describe('Badge', () => {
36
36
  expect(container.querySelector('.ds-badge-content')).toBeNull();
37
37
  });
38
38
  it('renders outline variant', () => {
39
- const { container } = render(Badge, { props: { variant: 'outline', children: () => { } } });
39
+ const { container } = render(Badge, { props: { variant: 'outline', children: (() => '') } });
40
40
  expect(container.querySelector('.variant-outline')).not.toBeNull();
41
41
  });
42
42
  it('renders children text', () => {
43
- const { container } = render(Badge, { props: { children: () => 'Hello' } });
43
+ const { container } = render(Badge, { props: { children: (() => '') } });
44
44
  expect(container.querySelector('.ds-badge-content')).not.toBeNull();
45
45
  });
46
46
  it('applies custom class', () => {
47
- const { container } = render(Badge, { props: { class: 'custom-badge', children: () => { } } });
47
+ const { container } = render(Badge, { props: { class: 'custom-badge', children: (() => '') } });
48
48
  expect(container.querySelector('.custom-badge')).not.toBeNull();
49
49
  });
50
50
  });
@@ -53,9 +53,10 @@
53
53
  font-family: var(--font-mono);
54
54
  font-weight: 700;
55
55
  white-space: nowrap;
56
- border-radius: var(--radius-full);
57
- transition: all var(--transition-fast);
56
+ border-radius: 0;
57
+ transition: border-color var(--transition-fast) linear, background var(--transition-fast) linear;
58
58
  gap: 0.125rem;
59
+ font-variant-numeric: tabular-nums;
59
60
  }
60
61
 
61
62
  /* High Validity (900-1000) */
@@ -125,29 +126,5 @@
125
126
  margin-left: 0.25rem;
126
127
  }
127
128
 
128
- /* Hover effect */
129
- .ds-validity-badge:hover {
130
- transform: translateY(-1px);
131
- box-shadow: var(--shadow-sm);
132
- }
133
-
134
- .validity-color-high:hover {
135
- background: var(--validity-high);
136
- color: #fff;
137
- }
138
-
139
- .validity-color-medium:hover {
140
- background: var(--validity-medium);
141
- color: #fff;
142
- }
143
-
144
- .validity-color-low:hover {
145
- background: var(--validity-low);
146
- color: #fff;
147
- }
148
-
149
- .validity-color-critical:hover {
150
- background: var(--validity-critical);
151
- color: #fff;
152
- }
129
+ /* No lift/shadow hover — reads as data, not interactive decoration */
153
130
  </style>
@@ -4,23 +4,23 @@ import ValidityBadge from './ValidityBadge.svelte';
4
4
  describe('ValidityBadge', () => {
5
5
  afterEach(() => cleanup());
6
6
  it('renders with default score', () => {
7
- const { container } = render(ValidityBadge, { props: { children: () => { } } });
7
+ const { container } = render(ValidityBadge, { props: { children: (() => '') } });
8
8
  expect(container.querySelector('.ds-validity-badge')).not.toBeNull();
9
9
  });
10
10
  it('applies high validity class for score >= 900', () => {
11
- const { container } = render(ValidityBadge, { props: { score: 950, children: () => { } } });
11
+ const { container } = render(ValidityBadge, { props: { score: 950, children: (() => '') } });
12
12
  expect(container.querySelector('.validity-color-high')).not.toBeNull();
13
13
  });
14
14
  it('applies medium validity class for score 700-899', () => {
15
- const { container } = render(ValidityBadge, { props: { score: 750, children: () => { } } });
15
+ const { container } = render(ValidityBadge, { props: { score: 750, children: (() => '') } });
16
16
  expect(container.querySelector('.validity-color-medium')).not.toBeNull();
17
17
  });
18
18
  it('applies low validity class for score 500-699', () => {
19
- const { container } = render(ValidityBadge, { props: { score: 600, children: () => { } } });
19
+ const { container } = render(ValidityBadge, { props: { score: 600, children: (() => '') } });
20
20
  expect(container.querySelector('.validity-color-low')).not.toBeNull();
21
21
  });
22
22
  it('applies critical validity class for score < 500', () => {
23
- const { container } = render(ValidityBadge, { props: { score: 300, children: () => { } } });
23
+ const { container } = render(ValidityBadge, { props: { score: 300, children: (() => '') } });
24
24
  expect(container.querySelector('.validity-color-critical')).not.toBeNull();
25
25
  });
26
26
  it('renders score and total text', () => {
@@ -31,9 +31,9 @@ describe('ValidityBadge', () => {
31
31
  expect(totalEl).not.toBeNull();
32
32
  });
33
33
  it('applies size classes', () => {
34
- const { container: sm } = render(ValidityBadge, { props: { size: 'sm', children: () => { } } });
34
+ const { container: sm } = render(ValidityBadge, { props: { size: 'sm', children: (() => '') } });
35
35
  expect(sm.querySelector('.size-sm')).not.toBeNull();
36
- const { container: lg } = render(ValidityBadge, { props: { size: 'lg', children: () => { } } });
36
+ const { container: lg } = render(ValidityBadge, { props: { size: 'lg', children: (() => '') } });
37
37
  expect(lg.querySelector('.size-lg')).not.toBeNull();
38
38
  });
39
39
  it('shows label when showLabel is true', () => {
@@ -45,12 +45,12 @@ describe('ValidityBadge', () => {
45
45
  expect(container.querySelector('.ds-validity-label')).toBeNull();
46
46
  });
47
47
  it('sets aria-label from validity label', () => {
48
- const { container } = render(ValidityBadge, { props: { score: 950, children: () => { } } });
48
+ const { container } = render(ValidityBadge, { props: { score: 950, children: (() => '') } });
49
49
  const badge = container.querySelector('.ds-validity-badge');
50
50
  expect(badge.getAttribute('aria-label')).toBe('High Validity');
51
51
  });
52
52
  it('renders custom children when provided', () => {
53
- const { container } = render(ValidityBadge, { props: { score: 500, children: () => 'custom' } });
53
+ const { container } = render(ValidityBadge, { props: { score: 500, children: (() => '') } });
54
54
  expect(container.querySelector('.ds-validity-content')).not.toBeNull();
55
55
  expect(container.querySelector('.ds-validity-score')).toBeNull();
56
56
  });