@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
@@ -1 +1 @@
1
- {"version":3,"file":"RsvpReader.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/rsvp/RsvpReader.svelte.ts"],"names":[],"mappings":"AAMC,KAAK,gBAAgB,GAAI;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAqIJ,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"RsvpReader.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/rsvp/RsvpReader.svelte.ts"],"names":[],"mappings":"AAOC,KAAK,gBAAgB,GAAI;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAsIJ,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -14,11 +14,6 @@
14
14
 
15
15
  <div class="ds-spinner-wrapper size-{size} color-{color} {className}" role="status" aria-label="Loading">
16
16
  <div class="ds-spinner-ring"></div>
17
- <div class="ds-spinner-core"></div>
18
- <!-- Floating magical dust particles -->
19
- <div class="ds-spinner-particle p1"></div>
20
- <div class="ds-spinner-particle p2"></div>
21
- <div class="ds-spinner-particle p3"></div>
22
17
  </div>
23
18
 
24
19
  <style>
@@ -29,69 +24,19 @@
29
24
  justify-content: center;
30
25
  }
31
26
 
32
- /* Base Ring */
27
+ /* Mechanical ring — linear, no spring, no glow, no particles.
28
+ Identity comes from the accent edge alone. */
33
29
  .ds-spinner-ring {
34
30
  position: absolute;
35
31
  inset: 0;
36
- border-radius: var(--radius-full);
37
- border: 2px solid transparent;
32
+ border: 2px solid var(--border-default);
38
33
  border-top-color: currentColor;
39
34
  border-right-color: currentColor;
40
- opacity: 0.8;
41
- animation: ds-spin 1s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;
35
+ animation: ds-spin 0.7s linear infinite;
42
36
  }
43
37
 
44
- /* Inner Core */
45
- .ds-spinner-core {
46
- position: absolute;
47
- inset: 20%;
48
- border-radius: var(--radius-full);
49
- background: currentColor;
50
- opacity: 0.3;
51
- filter: blur(4px);
52
- animation: ds-pulse-core 2s ease-in-out infinite alternate;
53
- }
54
-
55
- /* Magical Dust Particles */
56
- .ds-spinner-particle {
57
- position: absolute;
58
- width: 3px;
59
- height: 3px;
60
- border-radius: var(--radius-full);
61
- background: currentColor;
62
- opacity: 0;
63
- }
64
-
65
- .p1 { animation: ds-particle-drift-1 2s ease-out infinite; top: 10%; left: 10%; }
66
- .p2 { animation: ds-particle-drift-2 2.5s ease-out infinite 0.5s; bottom: 10%; right: 10%; }
67
- .p3 { animation: ds-particle-drift-3 1.8s ease-out infinite 1s; top: 10%; right: 20%; }
68
-
69
38
  @keyframes ds-spin {
70
- 0% { transform: rotate(0deg); }
71
- 100% { transform: rotate(360deg); }
72
- }
73
-
74
- @keyframes ds-pulse-core {
75
- 0% { transform: scale(0.8); opacity: 0.2; }
76
- 100% { transform: scale(1.2); opacity: 0.5; }
77
- }
78
-
79
- @keyframes ds-particle-drift-1 {
80
- 0% { transform: translate(0, 0) scale(0); opacity: 0; }
81
- 50% { transform: translate(-10px, -15px) scale(1); opacity: 0.8; }
82
- 100% { transform: translate(-20px, -30px) scale(0); opacity: 0; }
83
- }
84
-
85
- @keyframes ds-particle-drift-2 {
86
- 0% { transform: translate(0, 0) scale(0); opacity: 0; }
87
- 50% { transform: translate(15px, 10px) scale(1.2); opacity: 0.6; }
88
- 100% { transform: translate(30px, 20px) scale(0); opacity: 0; }
89
- }
90
-
91
- @keyframes ds-particle-drift-3 {
92
- 0% { transform: translate(0, 0) scale(0); opacity: 0; }
93
- 50% { transform: translate(10px, -20px) scale(0.8); opacity: 0.9; }
94
- 100% { transform: translate(20px, -40px) scale(0); opacity: 0; }
39
+ to { transform: rotate(360deg); }
95
40
  }
96
41
 
97
42
  /* --- Sizes --- */
@@ -102,28 +47,15 @@
102
47
  .size-xl { width: 4.5rem; height: 4.5rem; }
103
48
  .size-xl .ds-spinner-ring { border-width: 4px; }
104
49
 
105
- /* --- Colors --- */
106
- .color-accent {
107
- color: var(--color-accent);
108
- filter: drop-shadow(0 0 4px var(--color-accent-glow));
109
- }
110
-
111
- .color-muted {
112
- color: var(--color-text-muted);
113
- }
114
-
115
- .color-white {
116
- color: var(--color-text-primary);
117
- filter: drop-shadow(0 0 4px rgba(255,255,255,0.4));
118
- }
50
+ /* Colors no glow/drop-shadow; depth from the 2-tone border only */
51
+ .color-accent { color: var(--color-accent); }
52
+ .color-muted { color: var(--color-text-muted); }
53
+ .color-white { color: var(--color-text-primary); }
119
54
 
120
- /* Reduced motion */
55
+ /* Reduced motion — slow the ring to a near-stop */
121
56
  @media (prefers-reduced-motion: reduce) {
122
57
  .ds-spinner-ring {
123
- animation: ds-spin 2s linear infinite;
124
- }
125
- .ds-spinner-core, .ds-spinner-particle {
126
- display: none;
58
+ animation: ds-spin 3s linear infinite;
127
59
  }
128
60
  }
129
61
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"Spinner.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/spinner/Spinner.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"Spinner.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/spinner/Spinner.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -93,7 +93,7 @@
93
93
  color: var(--color-text-secondary, #a09880);
94
94
  }
95
95
 
96
- .steps[vertical="false"] {
96
+ .steps:not(.vertical) {
97
97
  flex-direction: column;
98
98
  align-items: stretch;
99
99
  }
@@ -104,26 +104,30 @@
104
104
  gap: var(--space-3, 0.75rem);
105
105
  }
106
106
 
107
+ /* Square step indicator — mechanical numbering, not progress pills */
107
108
  .step-circle {
108
109
  display: flex;
109
110
  align-items: center;
110
111
  justify-content: center;
111
- border-radius: var(--radius-full, 9999px);
112
- background: var(--color-bg-secondary, #222);
113
- color: var(--color-text-primary, #e8e0d0);
112
+ border-radius: 0;
113
+ border: 1px solid var(--border-default);
114
+ background: var(--color-bg-panel);
115
+ color: var(--color-text-secondary);
114
116
  flex-shrink: 0;
117
+ font-family: var(--font-mono);
115
118
  font-weight: 600;
116
119
  }
117
120
 
118
- .step-circle.completed {
119
- background: var(--color-success);
120
- color: var(--color-text-inverse);
121
- }
121
+ .step-circle.completed {
122
+ background: color-mix(in srgb, var(--color-success) 15%, transparent);
123
+ border-color: var(--color-success);
124
+ color: var(--color-success);
125
+ }
122
126
 
123
- .step-circle.active {
124
- background: var(--color-accent);
125
- color: var(--color-text-inverse);
126
- box-shadow: 0 0 0 2px var(--color-accent-subtle, var(--color-accent-subtle));
127
+ .step-circle.active {
128
+ border-color: var(--color-accent);
129
+ color: var(--color-accent);
130
+ background: var(--color-accent-subtle);
127
131
  }
128
132
 
129
133
  .step-content {
@@ -143,23 +147,18 @@
143
147
  }
144
148
 
145
149
  .connector-line {
146
- background: var(--color-border, #333);
150
+ background: var(--border-default);
147
151
  flex-shrink: 0;
148
152
  }
149
153
 
150
- .connector-line.first {
151
- border-top-left-radius: var(--radius-sm, 0.125rem);
152
- border-top-right-radius: var(--radius-sm, 0.125rem);
153
- }
154
-
154
+ .connector-line.first,
155
155
  .connector-line.last {
156
- border-bottom-left-radius: var(--radius-sm, 0.125rem);
157
- border-bottom-right-radius: var(--radius-sm, 0.125rem);
156
+ border-radius: 0;
158
157
  }
159
158
 
160
159
  /* Responsive adjustments */
161
160
  @media (max-width: 640px) {
162
- .steps[vertical="true"] {
161
+ .steps.vertical {
163
162
  flex-direction: column;
164
163
  align-items: flex-start;
165
164
  }
@@ -0,0 +1,190 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import Spinner from '../spinner/Spinner.svelte';
4
+ import Button from '../button/Button.svelte';
5
+
6
+ export type SurfaceStateKind = 'loading' | 'empty' | 'error' | 'degraded';
7
+
8
+ export interface Props {
9
+ state: SurfaceStateKind;
10
+ title?: string;
11
+ message?: string;
12
+ actionLabel?: string;
13
+ onRetry?: () => void | Promise<void>;
14
+ class?: string;
15
+ children?: Snippet;
16
+ }
17
+
18
+ let {
19
+ state,
20
+ title,
21
+ message,
22
+ actionLabel,
23
+ onRetry,
24
+ class: className = '',
25
+ children,
26
+ }: Props = $props();
27
+
28
+ const effectiveTitle = $derived(
29
+ title ??
30
+ (state === 'loading'
31
+ ? 'Loading'
32
+ : state === 'empty'
33
+ ? 'Nothing here yet'
34
+ : state === 'error'
35
+ ? 'Something went wrong'
36
+ : 'Substrate offline')
37
+ );
38
+
39
+ const effectiveMessage = $derived(
40
+ message ??
41
+ (state === 'loading'
42
+ ? 'Preparing the surface…'
43
+ : state === 'empty'
44
+ ? 'No content is available for this view.'
45
+ : state === 'error'
46
+ ? 'The operation could not be completed. Please try again.'
47
+ : 'The SOVEREIGN daemon isn’t responding. Your data is safe; reconnect to continue.')
48
+ );
49
+
50
+ const effectiveActionLabel = $derived(actionLabel ?? (state === 'degraded' ? 'Retry' : 'Try again'));
51
+
52
+ const isBusy = $derived(state === 'loading' || state === 'degraded');
53
+ const showAction = $derived(state === 'error' || state === 'degraded');
54
+ </script>
55
+
56
+ <section
57
+ class="ds-surface-state state-{state} {className}"
58
+ role="status"
59
+ aria-live="polite"
60
+ >
61
+ <div class="ds-surface-state__icon" aria-hidden="true">
62
+ {#if isBusy}
63
+ <Spinner size="md" color="accent" />
64
+ {:else if state === 'empty'}
65
+ <span class="ds-surface-state__glyph">∅</span>
66
+ {:else}
67
+ <span class="ds-surface-state__glyph">!</span>
68
+ {/if}
69
+ </div>
70
+
71
+ <div class="ds-surface-state__content">
72
+ <h2 class="ds-surface-state__title">{effectiveTitle}</h2>
73
+ {#if effectiveMessage}
74
+ <p class="ds-surface-state__message">{effectiveMessage}</p>
75
+ {/if}
76
+ {#if children}
77
+ <div class="ds-surface-state__children">
78
+ {@render children()}
79
+ </div>
80
+ {/if}
81
+ </div>
82
+
83
+ {#if showAction}
84
+ <div class="ds-surface-state__actions">
85
+ <Button variant={state === 'error' ? 'danger' : 'secondary'} size="sm" disabled={!onRetry} onclick={() => void onRetry?.()}>
86
+ {effectiveActionLabel}
87
+ </Button>
88
+
89
+ </div>
90
+ {/if}
91
+ </section>
92
+
93
+ <style>
94
+ .ds-surface-state {
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: center;
98
+ gap: var(--space-3);
99
+ min-height: 14rem;
100
+ padding: var(--space-6);
101
+ border: 1px solid var(--border-subtle);
102
+ background: var(--color-bg-panel-elevated);
103
+ color: var(--color-text-primary);
104
+ text-align: center;
105
+ }
106
+
107
+ .ds-surface-state__icon {
108
+ display: inline-flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ width: 2.5rem;
112
+ height: 2.5rem;
113
+ flex-shrink: 0;
114
+ border: 1px solid var(--border-default);
115
+ background: var(--color-bg-app);
116
+ }
117
+
118
+ .state-error .ds-surface-state__icon,
119
+ .state-degraded .ds-surface-state__icon {
120
+ border-color: color-mix(in srgb, var(--color-error) 45%, var(--border-default));
121
+ }
122
+
123
+ .state-empty .ds-surface-state__icon {
124
+ border-color: var(--border-default);
125
+ }
126
+
127
+ .ds-surface-state__glyph {
128
+ font-family: var(--font-mono);
129
+ font-size: var(--text-xl);
130
+ font-weight: 700;
131
+ color: var(--color-text-primary);
132
+ }
133
+
134
+ .state-error .ds-surface-state__glyph,
135
+ .state-degraded .ds-surface-state__glyph {
136
+ color: var(--color-error);
137
+ }
138
+
139
+ .state-empty .ds-surface-state__glyph {
140
+ color: var(--color-text-muted);
141
+ }
142
+
143
+ .ds-surface-state__content {
144
+ display: flex;
145
+ flex: 1;
146
+ min-width: 0;
147
+ flex-direction: column;
148
+ gap: var(--space-1);
149
+ }
150
+
151
+ .ds-surface-state__title {
152
+ margin: 0;
153
+ font-family: var(--font-mono);
154
+ font-size: var(--ui-font);
155
+ font-weight: 600;
156
+ letter-spacing: 0.06em;
157
+ text-transform: uppercase;
158
+ color: var(--color-text-secondary);
159
+ }
160
+
161
+ .ds-surface-state__message {
162
+ margin: 0;
163
+ max-width: 34rem;
164
+ color: var(--color-text-secondary);
165
+ font-size: var(--text-sm);
166
+ line-height: 1.5;
167
+ }
168
+
169
+ .ds-surface-state__children {
170
+ margin-top: var(--space-2);
171
+ }
172
+
173
+ .ds-surface-state__actions {
174
+ display: flex;
175
+ align-items: center;
176
+ justify-content: center;
177
+ }
178
+
179
+ @media (max-width: 42rem) {
180
+ .ds-surface-state {
181
+ align-items: flex-start;
182
+ flex-direction: column;
183
+ text-align: left;
184
+ }
185
+
186
+ .ds-surface-state__actions {
187
+ justify-content: flex-start;
188
+ }
189
+ }
190
+ </style>
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from 'svelte';
2
+ export type SurfaceStateKind = 'loading' | 'empty' | 'error' | 'degraded';
3
+ export interface Props {
4
+ state: SurfaceStateKind;
5
+ title?: string;
6
+ message?: string;
7
+ actionLabel?: string;
8
+ onRetry?: () => void | Promise<void>;
9
+ class?: string;
10
+ children?: Snippet;
11
+ }
12
+ declare const SurfaceState: import("svelte").Component<Props, {}, "">;
13
+ type SurfaceState = ReturnType<typeof SurfaceState>;
14
+ export default SurfaceState;
15
+ //# sourceMappingURL=SurfaceState.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SurfaceState.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/surface-state/SurfaceState.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKpC,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAmFH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -151,15 +151,18 @@
151
151
  align-items: center;
152
152
  justify-content: center;
153
153
  gap: var(--space-2);
154
- padding: var(--space-3) var(--space-4);
154
+ padding: var(--ui-pad-y) var(--ui-pad-x);
155
+ height: var(--ui-control-h);
155
156
  background: transparent;
156
157
  border: none;
157
158
  color: var(--color-text-secondary);
158
- font-family: var(--font-sans);
159
- font-size: var(--text-sm);
160
- font-weight: 500;
159
+ font-family: var(--font-mono);
160
+ font-size: var(--ui-label);
161
+ font-weight: 600;
162
+ letter-spacing: 0.08em;
163
+ text-transform: uppercase;
161
164
  cursor: pointer;
162
- transition: color var(--transition-fast), background var(--transition-fast);
165
+ transition: color var(--transition-fast) linear, background var(--transition-fast) linear;
163
166
  white-space: nowrap;
164
167
  z-index: 1;
165
168
  }
@@ -197,6 +200,7 @@
197
200
  height: 1.1em;
198
201
  }
199
202
 
203
+ /* Active indicator: crisp 2px live edge, no bounce, no glow */
200
204
  .ds-tab::after {
201
205
  content: '';
202
206
  position: absolute;
@@ -206,9 +210,8 @@
206
210
  height: 2px;
207
211
  background: var(--color-accent);
208
212
  transform: scaleX(0);
209
- transition: transform var(--transition-bounce);
210
- transform-origin: center;
211
- box-shadow: 0 -1px 4px var(--color-accent-glow);
213
+ transition: transform var(--transition-fast) linear;
214
+ transform-origin: left;
212
215
  }
213
216
 
214
217
  .ds-tab.is-active::after {
@@ -218,8 +221,7 @@
218
221
  .ds-tab:focus-visible::before {
219
222
  content: '';
220
223
  position: absolute;
221
- inset: 4px;
222
- border-radius: var(--radius-sm);
223
- border: 2px solid var(--color-accent-subtle);
224
+ inset: 2px;
225
+ border: 1.5px solid var(--color-accent);
224
226
  }
225
227
  </style>
@@ -0,0 +1,94 @@
1
+ <script lang="ts">
2
+ export interface Swatch {
3
+ hex: string;
4
+ label: string;
5
+ }
6
+
7
+ export interface Props {
8
+ swatches: Swatch[];
9
+ value?: string;
10
+ size?: 'sm' | 'md' | 'lg';
11
+ class?: string;
12
+ 'aria-label'?: string;
13
+ onSelect?: (hex: string) => void;
14
+ }
15
+
16
+ let {
17
+ swatches,
18
+ value = $bindable(''),
19
+ size = 'md',
20
+ class: className = '',
21
+ 'aria-label': ariaLabel = 'Accent color',
22
+ onSelect
23
+ }: Props = $props();
24
+
25
+ function select(hex: string) {
26
+ value = hex;
27
+ onSelect?.(hex);
28
+ }
29
+
30
+ function handleKeydown(e: KeyboardEvent, hex: string) {
31
+ if (e.key === 'Enter' || e.key === ' ') {
32
+ e.preventDefault();
33
+ select(hex);
34
+ }
35
+ }
36
+ </script>
37
+
38
+ <div class="ds-theme-swatch-group size-{size} {className}" role="radiogroup" aria-label={ariaLabel}>
39
+ {#each swatches as swatch (swatch.hex)}
40
+ <button
41
+ type="button"
42
+ class="ds-theme-swatch"
43
+ class:is-active={value === swatch.hex}
44
+ style="--swatch-hex: {swatch.hex}; --swatch-hex-2: color-mix(in oklab, {swatch.hex}, #fff 26%);"
45
+ role="radio"
46
+ aria-checked={value === swatch.hex}
47
+ aria-label={swatch.label}
48
+ title={swatch.label}
49
+ onclick={() => select(swatch.hex)}
50
+ onkeydown={(e) => handleKeydown(e, swatch.hex)}
51
+ ></button>
52
+ {/each}
53
+ </div>
54
+
55
+ <style>
56
+ .ds-theme-swatch-group {
57
+ display: inline-flex;
58
+ align-items: center;
59
+ gap: 0.5rem;
60
+ padding: 0.25rem 0.5rem;
61
+ border: var(--border-width-thin) solid var(--border-default);
62
+ border-radius: var(--radius-full);
63
+ }
64
+
65
+ .ds-theme-swatch {
66
+ padding: 0;
67
+ border: 2px solid transparent;
68
+ border-radius: var(--radius-full);
69
+ background: linear-gradient(135deg, var(--swatch-hex) 0%, var(--swatch-hex-2) 100%);
70
+ cursor: pointer;
71
+ transition: transform var(--transition-fast), border-color var(--transition-fast);
72
+ }
73
+
74
+ .size-sm .ds-theme-swatch { width: 0.875rem; height: 0.875rem; }
75
+ .size-md .ds-theme-swatch { width: 1.125rem; height: 1.125rem; }
76
+ .size-lg .ds-theme-swatch { width: 1.375rem; height: 1.375rem; }
77
+
78
+ .ds-theme-swatch:hover {
79
+ transform: scale(1.12);
80
+ }
81
+
82
+ .ds-theme-swatch.is-active {
83
+ border-color: var(--color-text-primary);
84
+ }
85
+
86
+ .ds-theme-swatch:focus-visible {
87
+ outline: 2px solid var(--color-accent);
88
+ outline-offset: 2px;
89
+ }
90
+
91
+ @media (prefers-reduced-motion: reduce) {
92
+ .ds-theme-swatch { transition: none; }
93
+ }
94
+ </style>
@@ -0,0 +1,16 @@
1
+ export interface Swatch {
2
+ hex: string;
3
+ label: string;
4
+ }
5
+ export interface Props {
6
+ swatches: Swatch[];
7
+ value?: string;
8
+ size?: 'sm' | 'md' | 'lg';
9
+ class?: string;
10
+ 'aria-label'?: string;
11
+ onSelect?: (hex: string) => void;
12
+ }
13
+ declare const ThemeSwatchGroup: import("svelte").Component<Props, {}, "value">;
14
+ type ThemeSwatchGroup = ReturnType<typeof ThemeSwatchGroup>;
15
+ export default ThemeSwatchGroup;
16
+ //# sourceMappingURL=ThemeSwatchGroup.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeSwatchGroup.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAqCH,QAAA,MAAM,gBAAgB,gDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { afterEach, describe, it, expect, vi } from 'vitest';
2
+ import { cleanup, render, screen, fireEvent } from '@testing-library/svelte';
3
+ import ThemeSwatchGroup from './ThemeSwatchGroup.svelte';
4
+ const swatches = [
5
+ { hex: '#b87333', label: 'Brass' },
6
+ { hex: '#4fa8a2', label: 'Teal' },
7
+ { hex: '#c14a4a', label: 'Crimson' }
8
+ ];
9
+ describe('ThemeSwatchGroup', () => {
10
+ afterEach(() => cleanup());
11
+ it('renders a radiogroup with one radio per swatch', () => {
12
+ render(ThemeSwatchGroup, { swatches });
13
+ expect(screen.getByRole('radiogroup')).toBeDefined();
14
+ expect(screen.getAllByRole('radio')).toHaveLength(3);
15
+ });
16
+ it('marks the swatch matching value as checked', () => {
17
+ render(ThemeSwatchGroup, { swatches, value: '#4fa8a2' });
18
+ const radios = screen.getAllByRole('radio');
19
+ expect(radios[1].getAttribute('aria-checked')).toBe('true');
20
+ expect(radios[0].getAttribute('aria-checked')).toBe('false');
21
+ });
22
+ it('calls onSelect with the clicked swatch hex', async () => {
23
+ const onSelect = vi.fn();
24
+ render(ThemeSwatchGroup, { swatches, onSelect });
25
+ const radios = screen.getAllByRole('radio');
26
+ await fireEvent.click(radios[2]);
27
+ expect(onSelect).toHaveBeenCalledWith('#c14a4a');
28
+ });
29
+ it('selects on Enter and Space keydown', async () => {
30
+ const onSelect = vi.fn();
31
+ render(ThemeSwatchGroup, { swatches, onSelect });
32
+ const radios = screen.getAllByRole('radio');
33
+ await fireEvent.keyDown(radios[0], { key: 'Enter' });
34
+ expect(onSelect).toHaveBeenCalledWith('#b87333');
35
+ await fireEvent.keyDown(radios[1], { key: ' ' });
36
+ expect(onSelect).toHaveBeenCalledWith('#4fa8a2');
37
+ });
38
+ it('uses each swatch label as its aria-label', () => {
39
+ render(ThemeSwatchGroup, { swatches });
40
+ expect(screen.getByLabelText('Brass')).toBeDefined();
41
+ expect(screen.getByLabelText('Teal')).toBeDefined();
42
+ expect(screen.getByLabelText('Crimson')).toBeDefined();
43
+ });
44
+ it('applies size class', () => {
45
+ const { container } = render(ThemeSwatchGroup, { swatches, size: 'lg' });
46
+ expect(container.querySelector('.size-lg')).not.toBeNull();
47
+ });
48
+ });
@@ -0,0 +1,3 @@
1
+ export { default as ThemeSwatchGroup } from './ThemeSwatchGroup.svelte';
2
+ export type { Props, Swatch } from './ThemeSwatchGroup.svelte';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/theme-swatch-group/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as ThemeSwatchGroup } from './ThemeSwatchGroup.svelte';