@stephen-netu/design-system 0.2.2 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/dist/d0-data-viz/BarChart.test.js +53 -0
  2. package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
  3. package/dist/d0-data-viz/CheckpointPill.svelte +1 -1
  4. package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
  5. package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
  6. package/dist/d0-data-viz/MetricCard.test.js +57 -0
  7. package/dist/d0-data-viz/SparkLine.test.js +47 -0
  8. package/dist/d0-data-viz/StorageMap.test.js +63 -0
  9. package/dist/d0-data-viz/Timeline.test.js +62 -0
  10. package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
  11. package/dist/d0-data-viz/checkpoint-types.js +1 -1
  12. package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
  13. package/dist/d0-data-viz/storage-map-types.js +6 -3
  14. package/dist/d0-data-viz/theme-integration.js +1 -1
  15. package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
  16. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
  17. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
  18. package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
  19. package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
  20. package/dist/demos/index.d.ts +1 -0
  21. package/dist/demos/index.d.ts.map +1 -1
  22. package/dist/demos/index.js +1 -0
  23. package/dist/editor/CodeEditor.svelte +83 -26
  24. package/dist/editor/CodeEditor.svelte.d.ts +0 -1
  25. package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
  26. package/dist/editor/ExternalChangeDialog.svelte +117 -0
  27. package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
  28. package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
  29. package/dist/editor/MarkdownEditor.svelte +104 -617
  30. package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
  31. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  32. package/dist/editor/codemirror-config.d.ts +36 -0
  33. package/dist/editor/codemirror-config.d.ts.map +1 -0
  34. package/dist/editor/codemirror-config.js +87 -0
  35. package/dist/editor/components/CorrectionTooltip.svelte +180 -159
  36. package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
  37. package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
  38. package/dist/editor/extensions/autocomplete.d.ts +2 -2
  39. package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
  40. package/dist/editor/extensions/autocomplete.test.js +121 -0
  41. package/dist/editor/extensions/spellcheck.d.ts +21 -3
  42. package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
  43. package/dist/editor/extensions/spellcheck.js +51 -9
  44. package/dist/editor/extensions/spellcheck.test.js +168 -0
  45. package/dist/editor/extensions/types.d.ts +2 -1
  46. package/dist/editor/extensions/types.d.ts.map +1 -1
  47. package/dist/editor/index.d.ts +2 -1
  48. package/dist/editor/index.d.ts.map +1 -1
  49. package/dist/editor/index.js +1 -0
  50. package/dist/editor/markdown-preview.d.ts +9 -0
  51. package/dist/editor/markdown-preview.d.ts.map +1 -0
  52. package/dist/editor/markdown-preview.js +19 -0
  53. package/dist/editor/markdown-preview.test.js +38 -0
  54. package/dist/editor/useCodeMirror.d.ts +23 -0
  55. package/dist/editor/useCodeMirror.d.ts.map +1 -0
  56. package/dist/editor/useCodeMirror.js +40 -0
  57. package/dist/editor/useFilePersistence.d.ts +32 -0
  58. package/dist/editor/useFilePersistence.d.ts.map +1 -0
  59. package/dist/editor/useFilePersistence.js +117 -0
  60. package/dist/fabric/ai/ChatPanel.svelte +61 -62
  61. package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
  62. package/dist/fabric/ai/ResearchPanel.svelte +31 -24
  63. package/dist/fabric/data/FileTree.svelte +195 -0
  64. package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
  65. package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
  66. package/dist/fabric/data/FileTree.test.js +127 -0
  67. package/dist/fabric/data/index.d.ts +5 -9
  68. package/dist/fabric/data/index.d.ts.map +1 -1
  69. package/dist/fabric/data/index.js +4 -1
  70. package/dist/fabric/index.d.ts +1 -0
  71. package/dist/fabric/index.d.ts.map +1 -1
  72. package/dist/fabric/index.js +2 -0
  73. package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
  74. package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
  75. package/dist/fabric/navigation/ActivityRail.svelte +3 -5
  76. package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
  77. package/dist/g0-generative/components/Text.svelte +38 -0
  78. package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
  79. package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
  80. package/dist/g0-generative/index.d.ts +1 -0
  81. package/dist/g0-generative/index.d.ts.map +1 -1
  82. package/dist/g0-generative/index.js +1 -0
  83. package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
  84. package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
  85. package/dist/g0-generative/library/ComponentLibrary.js +10 -0
  86. package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
  87. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
  88. package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
  89. package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
  90. package/dist/g0-geo/SovereignMap.svelte +13 -13
  91. package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
  92. package/dist/index.d.ts +0 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +3 -1
  95. package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
  96. package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
  97. package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
  98. package/dist/l0-layout/block-writer/markdown.js +11 -11
  99. package/dist/l0-layout/block-writer/markdown.test.js +81 -0
  100. package/dist/l0-layout/card/StackedCard.svelte +87 -0
  101. package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
  102. package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
  103. package/dist/l0-layout/card/StackedCard.test.js +29 -0
  104. package/dist/l0-layout/index.d.ts +1 -0
  105. package/dist/l0-layout/index.d.ts.map +1 -1
  106. package/dist/l0-layout/index.js +1 -0
  107. package/dist/l0-layout/kanban/KanbanBoard.svelte +1 -1
  108. package/dist/l0-layout/kanban/KanbanColumn.svelte +1 -1
  109. package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
  110. package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
  111. package/dist/n1-flow-canvas/index.d.ts +2 -0
  112. package/dist/n1-flow-canvas/index.d.ts.map +1 -1
  113. package/dist/n1-flow-canvas/index.js +1 -0
  114. package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
  115. package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
  116. package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
  117. package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
  118. package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
  119. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +23 -19
  120. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  121. package/dist/n4-adaptive-manifold/types.d.ts +3 -0
  122. package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
  123. package/dist/p0-primitives/ThemeProvider.svelte +28 -7
  124. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +5 -0
  125. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  126. package/dist/p0-primitives/canvas-theme.d.ts +21 -1
  127. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  128. package/dist/p0-primitives/canvas-theme.js +78 -23
  129. package/dist/p0-primitives/debug.d.ts +6 -0
  130. package/dist/p0-primitives/debug.d.ts.map +1 -0
  131. package/dist/p0-primitives/debug.js +21 -0
  132. package/dist/p0-primitives/theme.d.ts.map +1 -1
  133. package/dist/p0-primitives/theme.js +11 -31
  134. package/dist/p0-primitives/tokens/ambient.css +76 -0
  135. package/dist/p0-primitives/tokens/tokens.css +124 -29
  136. package/dist/p0-primitives/utils/index.d.ts +2 -0
  137. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  138. package/dist/p0-primitives/utils/index.js +1 -0
  139. package/dist/p0-primitives/utils/reveal.d.ts +15 -0
  140. package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
  141. package/dist/p0-primitives/utils/reveal.js +29 -0
  142. package/dist/p0-primitives/utils/reveal.test.js +95 -0
  143. package/dist/s0-state/SyncStatus.svelte +1 -1
  144. package/dist/s0-state/index.d.ts +2 -1
  145. package/dist/s0-state/index.d.ts.map +1 -1
  146. package/dist/s0-state/index.js +2 -0
  147. package/dist/s0-state/modal-stack-store.svelte.d.ts +3 -3
  148. package/dist/s0-state/modal-stack-store.svelte.js +2 -2
  149. package/dist/spatial/ForceSimulation.svelte.js +1 -1
  150. package/dist/spatial/ParticleAssembleMark.svelte +285 -0
  151. package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
  152. package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
  153. package/dist/spatial/ZoneTiler.test.js +90 -0
  154. package/dist/spatial/index.js +1 -0
  155. package/dist/spatial/particle-assemble-math.d.ts +22 -0
  156. package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
  157. package/dist/spatial/particle-assemble-math.js +26 -0
  158. package/dist/spatial/particle-assemble-math.test.js +56 -0
  159. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -1
  160. package/dist/t0-transport/substrate.svelte.js +10 -4
  161. package/dist/u0-primitives/LockIndicator.svelte +16 -14
  162. package/dist/u0-primitives/VerticalToolbar.svelte +24 -21
  163. package/dist/u0-primitives/accordion/Accordion.svelte +8 -7
  164. package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
  165. package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
  166. package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
  167. package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
  168. package/dist/u0-primitives/badge/Badge.svelte +6 -4
  169. package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
  170. package/dist/u0-primitives/button/Button.svelte +15 -12
  171. package/dist/u0-primitives/card/Card.svelte +37 -15
  172. package/dist/u0-primitives/card/Card.test.js +86 -0
  173. package/dist/u0-primitives/command-palette/CommandPalette.svelte +48 -43
  174. package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
  175. package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
  176. package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
  177. package/dist/u0-primitives/index.d.ts +6 -0
  178. package/dist/u0-primitives/index.d.ts.map +1 -1
  179. package/dist/u0-primitives/index.js +8 -0
  180. package/dist/u0-primitives/input/Input.svelte +77 -24
  181. package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
  182. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  183. package/dist/u0-primitives/input/Input.test.js +81 -1
  184. package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
  185. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
  186. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
  187. package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
  188. package/dist/u0-primitives/live-dot/index.d.ts +3 -0
  189. package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
  190. package/dist/u0-primitives/live-dot/index.js +1 -0
  191. package/dist/u0-primitives/modal/Modal.svelte +22 -19
  192. package/dist/u0-primitives/modal/Modal.test.js +1 -1
  193. package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
  194. package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
  195. package/dist/u0-primitives/steps/Steps.svelte +18 -19
  196. package/dist/u0-primitives/surface-state/SurfaceState.svelte +7 -7
  197. package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
  198. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
  199. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
  200. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
  201. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
  202. package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
  203. package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
  204. package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
  205. package/dist/u0-primitives/toggle/Toggle.svelte +10 -11
  206. package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
  207. package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
  208. package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
  209. package/dist/u0-primitives/web-components/button-component.js +72 -33
  210. package/dist/u0-primitives/web-components/index.d.ts +3 -0
  211. package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
  212. package/dist/u0-primitives/web-components/index.js +2 -0
  213. package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
  214. package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
  215. package/dist/u0-primitives/web-components/input-component.js +56 -39
  216. package/dist/u0-primitives/web-components/web-components.test.js +96 -0
  217. package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
  218. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
  219. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
  220. package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
  221. package/dist/u0-primitives/window-frame/index.d.ts +3 -0
  222. package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
  223. package/dist/u0-primitives/window-frame/index.js +1 -0
  224. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
  225. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
  226. package/package.json +44 -28
  227. package/src/p0-primitives/tokens/ambient.css +76 -0
  228. package/src/p0-primitives/tokens/tokens.css +124 -29
  229. package/src/p0-primitives/tokens/tokens.json +42 -24
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import { tick, untrack } from 'svelte';
15
- import { modalStackStore } from '../../s0-state/modal-stack-store.svelte';
15
+ import { modalStackStore } from '@stephen-netu/design-system/s0-state';
16
16
 
17
17
  export interface Props {
18
18
  /** Controls modal visibility */
@@ -258,8 +258,8 @@
258
258
  .modal-dialog {
259
259
  position: relative;
260
260
  background: var(--color-bg-panel-elevated);
261
- border: var(--border-width-thin) solid var(--border-default);
262
- border-radius: var(--radius-xl);
261
+ border: var(--border-width-default) solid var(--border-default);
262
+ border-radius: 0;
263
263
  width: 90%;
264
264
  max-width: 37.5rem;
265
265
  max-height: 80vh;
@@ -267,9 +267,9 @@
267
267
  flex-direction: column;
268
268
  z-index: 1;
269
269
  outline: none;
270
- box-shadow: var(--shadow-xl);
271
- transform: translateY(1.25rem) scale(0.98);
272
- transition: transform var(--transition-normal), opacity var(--transition-normal);
270
+ box-shadow: none;
271
+ transform: translateY(0.5rem);
272
+ transition: transform var(--transition-fast) linear, opacity var(--transition-fast) linear;
273
273
  opacity: 0;
274
274
  }
275
275
 
@@ -279,27 +279,30 @@
279
279
  }
280
280
 
281
281
  .modal-dialog:focus {
282
- box-shadow: 0 0 0 var(--border-width-default) var(--color-accent), var(--shadow-xl);
282
+ outline: var(--border-width-default) solid var(--color-accent);
283
+ outline-offset: 2px;
283
284
  }
284
285
 
285
286
  .modal-header {
286
287
  display: flex;
287
288
  justify-content: space-between;
288
289
  align-items: center;
289
- padding: var(--space-5) var(--space-6);
290
+ padding: var(--ui-pad-y) var(--ui-pad-x);
290
291
  border-bottom: var(--border-width-thin) solid var(--border-default);
291
292
  flex-shrink: 0;
292
293
  }
293
294
 
294
295
  .modal-title {
295
296
  margin: 0;
296
- font-size: var(--text-lg);
297
- color: var(--color-text-primary);
297
+ font-size: var(--ui-label);
298
+ letter-spacing: 0.1em;
299
+ text-transform: uppercase;
300
+ color: var(--color-text-secondary);
298
301
  display: flex;
299
302
  align-items: center;
300
303
  gap: var(--space-3);
301
304
  font-weight: 600;
302
- font-family: var(--font-sans);
305
+ font-family: var(--font-mono);
303
306
  }
304
307
 
305
308
  .modal-header-actions {
@@ -310,19 +313,18 @@
310
313
 
311
314
  .modal-close-btn {
312
315
  background: none;
313
- border: none;
316
+ border: 1px solid transparent;
314
317
  color: var(--color-text-secondary);
315
318
  cursor: pointer;
316
- padding: var(--space-1);
319
+ padding: 3px;
317
320
  display: flex;
318
321
  align-items: center;
319
- border-radius: var(--radius-sm);
320
- transition: all var(--transition-fast);
322
+ transition: color var(--transition-fast) linear, border-color var(--transition-fast) linear;
321
323
  }
322
324
 
323
325
  .modal-close-btn:hover {
324
326
  color: var(--color-text-primary);
325
- background: rgba(255, 255, 255, 0.1);
327
+ border-color: var(--border-default);
326
328
  }
327
329
 
328
330
  .modal-close-btn:focus-visible {
@@ -332,17 +334,18 @@
332
334
 
333
335
  .modal-content {
334
336
  overflow-y: auto;
335
- padding: var(--space-6);
337
+ padding: var(--ui-pad-x);
336
338
  flex: 1;
337
339
  min-height: 0;
340
+ font-size: var(--ui-font);
338
341
  }
339
342
 
340
343
  .modal-footer {
341
344
  display: flex;
342
345
  align-items: center;
343
346
  justify-content: flex-end;
344
- gap: var(--space-3);
345
- padding: var(--space-4) var(--space-6);
347
+ gap: var(--ui-pad-y);
348
+ padding: var(--ui-pad-y) var(--ui-pad-x);
346
349
  border-top: var(--border-width-thin) solid var(--border-default);
347
350
  flex-shrink: 0;
348
351
  }
@@ -1,7 +1,7 @@
1
1
  import { describe, it, expect, vi, afterEach, beforeEach } from 'vitest';
2
2
  import { render, fireEvent, cleanup } from '@testing-library/svelte';
3
3
  import Modal from './Modal.svelte';
4
- import { modalStackStore } from '../../s0-state/modal-stack-store.svelte';
4
+ import { modalStackStore } from '@stephen-netu/design-system/s0-state';
5
5
  beforeEach(() => {
6
6
  modalStackStore.closeAll();
7
7
  });
@@ -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"}
@@ -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,18 +147,13 @@
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 */
@@ -99,7 +99,6 @@
99
99
  min-height: 14rem;
100
100
  padding: var(--space-6);
101
101
  border: 1px solid var(--border-subtle);
102
- border-radius: var(--radius-lg);
103
102
  background: var(--color-bg-panel-elevated);
104
103
  color: var(--color-text-primary);
105
104
  text-align: center;
@@ -109,11 +108,10 @@
109
108
  display: inline-flex;
110
109
  align-items: center;
111
110
  justify-content: center;
112
- width: 3rem;
113
- height: 3rem;
111
+ width: 2.5rem;
112
+ height: 2.5rem;
114
113
  flex-shrink: 0;
115
114
  border: 1px solid var(--border-default);
116
- border-radius: var(--radius-full);
117
115
  background: var(--color-bg-app);
118
116
  }
119
117
 
@@ -152,10 +150,12 @@
152
150
 
153
151
  .ds-surface-state__title {
154
152
  margin: 0;
155
- font-size: var(--text-lg);
153
+ font-family: var(--font-mono);
154
+ font-size: var(--ui-font);
156
155
  font-weight: 600;
157
- letter-spacing: 0.02em;
158
- color: var(--color-text-primary);
156
+ letter-spacing: 0.06em;
157
+ text-transform: uppercase;
158
+ color: var(--color-text-secondary);
159
159
  }
160
160
 
161
161
  .ds-surface-state__message {
@@ -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';
@@ -67,13 +67,13 @@
67
67
  opacity: 0.5;
68
68
  }
69
69
 
70
+ /* Track: square (not pill) — mechanical, not soft */
70
71
  .ds-toggle-track {
71
72
  position: relative;
72
73
  background: var(--color-bg-panel-elevated);
73
74
  border: 1px solid var(--border-default);
74
- border-radius: var(--radius-full);
75
- transition: all var(--transition-normal);
76
- box-shadow: var(--shadow-inner);
75
+ border-radius: 0;
76
+ transition: border-color var(--transition-fast) linear, background var(--transition-fast) linear;
77
77
  }
78
78
 
79
79
  /* Track Focus */
@@ -87,20 +87,19 @@
87
87
  top: 2px;
88
88
  left: 2px;
89
89
  background: var(--color-text-secondary);
90
- border-radius: var(--radius-full);
91
- transition: all var(--transition-bounce);
92
- box-shadow: var(--shadow-sm);
90
+ border-radius: 0;
91
+ transition: transform var(--transition-fast) linear, background var(--transition-fast) linear;
93
92
  }
94
93
 
95
- /* Checked State */
94
+ /* Checked: accent border + filled thumb — accent as a live edge/fill on a
95
+ control is acceptable here because the thumb IS the state indicator */
96
96
  .ds-toggle-track.is-checked {
97
- background: var(--color-accent);
98
- border-color: var(--color-accent-hover);
99
- box-shadow: inset 0 1px 2px rgba(0,0,0,0.3), 0 0 8px var(--color-accent-subtle);
97
+ background: var(--color-accent-subtle);
98
+ border-color: var(--color-accent);
100
99
  }
101
100
 
102
101
  .ds-toggle-track.is-checked .ds-toggle-thumb {
103
- background: var(--color-text-inverse);
102
+ background: var(--color-accent);
104
103
  }
105
104
 
106
105
  /* Label */
@@ -99,19 +99,19 @@
99
99
  max-width: 250px;
100
100
  background: var(--color-bg-panel-elevated);
101
101
  border: 1px solid var(--border-default);
102
- box-shadow: var(--shadow-lg), 0 0 0 1px rgba(0,0,0,0.5);
103
- border-radius: var(--radius-md);
104
- animation: ds-fade-in var(--transition-fast) ease-out;
105
- pointer-events: none; /* Don't interfere with mouse */
102
+ box-shadow: none;
103
+ border-radius: 0;
104
+ animation: ds-fade-in var(--transition-fast) linear;
105
+ pointer-events: none;
106
106
  }
107
107
 
108
108
  .ds-tooltip-inner {
109
- padding: var(--space-2) var(--space-3);
109
+ padding: var(--ui-pad-y) var(--ui-pad-x);
110
110
  color: var(--color-text-primary);
111
- font-family: var(--font-sans);
112
- font-size: var(--text-xs);
113
- line-height: 1.4;
114
- text-align: center;
111
+ font-family: var(--font-mono);
112
+ font-size: var(--ui-label);
113
+ line-height: var(--ui-leading);
114
+ text-align: left;
115
115
  }
116
116
 
117
117
  /* Arrow Base */