@stephen-netu/design-system 0.2.0 → 0.2.2

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 (198) 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/CheckpointPill.svelte +7 -2
  10. package/dist/d0-data-viz/CheckpointPill.svelte.d.ts.map +1 -1
  11. package/dist/d0-data-viz/theme-integration.d.ts +3 -3
  12. package/dist/d0-data-viz/theme-integration.js +3 -3
  13. package/dist/d0-data-viz/theme-integration.test.js +41 -0
  14. package/dist/demos/BspSizingInfographic.svelte +3 -32
  15. package/dist/editor/CodeEditor.test.js +38 -0
  16. package/dist/editor/FindReplaceDialog.svelte +32 -32
  17. package/dist/editor/MarkdownEditor.svelte +71 -58
  18. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  19. package/dist/editor/MarkdownEditor.test.js +38 -0
  20. package/dist/editor/components/CorrectionTooltip.svelte +0 -1
  21. package/dist/editor/extensions/expansion.d.ts.map +1 -1
  22. package/dist/editor/extensions/expansion.js +16 -10
  23. package/dist/entity-graph-view/WorldView.svelte +1 -1
  24. package/dist/fabric/ai/ChatPanel.svelte +31 -31
  25. package/dist/fabric/ai/ResearchPanel.svelte +6 -3
  26. package/dist/fabric/ai/ResearchPanel.svelte.d.ts.map +1 -1
  27. package/dist/fabric/index.d.ts +4 -5
  28. package/dist/fabric/index.d.ts.map +1 -1
  29. package/dist/fabric/index.js +3 -3
  30. package/dist/fabric/input/{CommandBar.svelte → AppHeaderBar.svelte} +13 -13
  31. package/dist/fabric/input/{CommandBar.svelte.d.ts → AppHeaderBar.svelte.d.ts} +5 -5
  32. package/dist/fabric/input/AppHeaderBar.svelte.d.ts.map +1 -0
  33. package/dist/fabric/input/{CommandBar.test.js → AppHeaderBar.test.js} +9 -9
  34. package/dist/fabric/input/index.d.ts +2 -2
  35. package/dist/fabric/input/index.d.ts.map +1 -1
  36. package/dist/fabric/input/index.js +1 -1
  37. package/dist/fabric/layout/KanbanBoard.svelte +25 -155
  38. package/dist/fabric/layout/KanbanBoard.svelte.d.ts +2 -26
  39. package/dist/fabric/layout/KanbanBoard.svelte.d.ts.map +1 -1
  40. package/dist/fabric/layout/KanbanBoard.test.js +125 -10
  41. package/dist/fabric/layout/KanbanCard.svelte +27 -223
  42. package/dist/fabric/layout/KanbanCard.svelte.d.ts +2 -19
  43. package/dist/fabric/layout/KanbanCard.svelte.d.ts.map +1 -1
  44. package/dist/fabric/layout/KanbanColumn.svelte +41 -275
  45. package/dist/fabric/layout/KanbanColumn.svelte.d.ts +2 -22
  46. package/dist/fabric/layout/KanbanColumn.svelte.d.ts.map +1 -1
  47. package/dist/fabric/layout/index.d.ts +2 -5
  48. package/dist/fabric/layout/index.d.ts.map +1 -1
  49. package/dist/fabric/layout/index.js +1 -1
  50. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +3 -3
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +4 -2
  53. package/dist/l0-layout/SectionSplitter.svelte +5 -5
  54. package/dist/l0-layout/block-writer/BlockItem.svelte +6 -4
  55. package/dist/l0-layout/card/CompactCard.svelte +4 -3
  56. package/dist/l0-layout/grant/GrantCard.svelte +15 -5
  57. package/dist/l0-layout/grant/GrantCard.svelte.d.ts.map +1 -1
  58. package/dist/l0-layout/index.d.ts +2 -0
  59. package/dist/l0-layout/index.d.ts.map +1 -1
  60. package/dist/l0-layout/index.js +1 -0
  61. package/dist/l0-layout/kanban/KanbanBoard.svelte +246 -29
  62. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts +28 -2
  63. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts.map +1 -1
  64. package/dist/l0-layout/kanban/KanbanCard.svelte +175 -150
  65. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts +16 -18
  66. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts.map +1 -1
  67. package/dist/l0-layout/kanban/KanbanColumn.svelte +152 -78
  68. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts +28 -7
  69. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts.map +1 -1
  70. package/dist/l0-layout/kanban/index.d.ts +6 -0
  71. package/dist/l0-layout/kanban/index.d.ts.map +1 -0
  72. package/dist/l0-layout/kanban/index.js +3 -0
  73. package/dist/n0-node-graph/Node.svelte +2 -2
  74. package/dist/n0-node-graph/NodePalette.svelte +2 -2
  75. package/dist/n1-flow-canvas/graph-state.test.js +69 -0
  76. package/dist/n1-flow-canvas/utils.test.js +116 -0
  77. package/dist/n3-force-graph/GraphTooltip.svelte +2 -2
  78. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +12 -11
  79. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  80. package/dist/n4-adaptive-manifold/classifier.test.js +104 -0
  81. package/dist/n4-adaptive-manifold/n4-tokens.css +2 -2
  82. package/dist/p0-primitives/ThemeProvider.svelte +10 -11
  83. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +1 -1
  84. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  85. package/dist/p0-primitives/canvas-theme.d.ts +12 -0
  86. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  87. package/dist/p0-primitives/canvas-theme.js +10 -0
  88. package/dist/p0-primitives/index.d.ts +2 -1
  89. package/dist/p0-primitives/index.d.ts.map +1 -1
  90. package/dist/p0-primitives/index.js +1 -0
  91. package/dist/p0-primitives/theme-context.d.ts +9 -0
  92. package/dist/p0-primitives/theme-context.d.ts.map +1 -0
  93. package/dist/p0-primitives/theme-context.js +8 -0
  94. package/dist/p0-primitives/tokens/tokens.css +22 -11
  95. package/dist/p0-primitives/utils/index.d.ts +2 -2
  96. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  97. package/dist/s0-state/SyncStatus.svelte +1 -1
  98. package/dist/s0-state/ThemeStore.svelte.d.ts +3 -2
  99. package/dist/s0-state/ThemeStore.svelte.d.ts.map +1 -1
  100. package/dist/s0-state/ThemeStore.svelte.js +20 -1
  101. package/dist/s0-state/index.d.ts +0 -1
  102. package/dist/s0-state/index.d.ts.map +1 -1
  103. package/dist/s0-state/index.js +1 -0
  104. package/dist/s0-state/modal-stack-store.svelte.d.ts +25 -0
  105. package/dist/s0-state/modal-stack-store.svelte.d.ts.map +1 -1
  106. package/dist/s0-state/modal-stack-store.svelte.js +19 -0
  107. package/dist/showcase/Showcase.svelte +43 -34
  108. package/dist/showcase/Showcase.svelte.d.ts.map +1 -1
  109. package/dist/spatial/BspTilingCanvas.svelte +7 -5
  110. package/dist/spatial/BspTilingCanvas.svelte.d.ts +1 -0
  111. package/dist/spatial/BspTilingCanvas.svelte.d.ts.map +1 -1
  112. package/dist/spatial/BspTilingSimulation.test.js +88 -0
  113. package/dist/spatial/CameraController.test.js +120 -0
  114. package/dist/spatial/ForceCanvas.svelte +20 -13
  115. package/dist/spatial/ForceCanvas.svelte.d.ts +1 -0
  116. package/dist/spatial/ForceCanvas.svelte.d.ts.map +1 -1
  117. package/dist/spatial/ForceSimulation.svelte.d.ts.map +1 -1
  118. package/dist/spatial/ForceSimulation.svelte.js +32 -21
  119. package/dist/spatial/LodRenderer.svelte +16 -1
  120. package/dist/spatial/LodRenderer.svelte.d.ts +1 -0
  121. package/dist/spatial/LodRenderer.svelte.d.ts.map +1 -1
  122. package/dist/spatial/SnapZoomCamera.svelte +25 -13
  123. package/dist/spatial/SnapZoomCamera.svelte.d.ts +1 -0
  124. package/dist/spatial/SnapZoomCamera.svelte.d.ts.map +1 -1
  125. package/dist/spatial/ZoneTiler.svelte +5 -2
  126. package/dist/spatial/ZoneTiler.svelte.d.ts +1 -0
  127. package/dist/spatial/ZoneTiler.svelte.d.ts.map +1 -1
  128. package/dist/spatial/d3-types.d.ts +31 -0
  129. package/dist/spatial/d3-types.d.ts.map +1 -0
  130. package/dist/spatial/d3-types.js +19 -0
  131. package/dist/ssr-import-clean.test.js +37 -0
  132. package/dist/t0-transport/fs.d.ts +12 -0
  133. package/dist/t0-transport/fs.d.ts.map +1 -0
  134. package/dist/t0-transport/fs.js +55 -0
  135. package/dist/t0-transport/index.d.ts +1 -0
  136. package/dist/t0-transport/index.d.ts.map +1 -1
  137. package/dist/t0-transport/index.js +1 -0
  138. package/dist/t0-transport/invoke.d.ts.map +1 -1
  139. package/dist/t0-transport/invoke.js +5 -2
  140. package/dist/t0-transport/quality.d.ts +12 -3
  141. package/dist/t0-transport/quality.d.ts.map +1 -1
  142. package/dist/t0-transport/quality.js +17 -4
  143. package/dist/t0-transport/substrate.svelte.d.ts +27 -0
  144. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -0
  145. package/dist/t0-transport/substrate.svelte.js +49 -0
  146. package/dist/u0-primitives/LockIndicator.svelte +1 -1
  147. package/dist/u0-primitives/VerticalToolbar.svelte +1 -1
  148. package/dist/u0-primitives/accordion/Accordion.svelte +10 -9
  149. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts +0 -7
  150. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts.map +1 -1
  151. package/dist/u0-primitives/accordion/Accordion.test.js +5 -5
  152. package/dist/u0-primitives/badge/Badge.test.js +10 -10
  153. package/dist/u0-primitives/badge/ValidityBadge.test.js +9 -9
  154. package/dist/u0-primitives/button/Button.svelte +3 -1
  155. package/dist/u0-primitives/button/Button.svelte.d.ts +1 -0
  156. package/dist/u0-primitives/button/Button.svelte.d.ts.map +1 -1
  157. package/dist/u0-primitives/button/Button.test.js +11 -11
  158. package/dist/u0-primitives/card/Card.svelte +26 -20
  159. package/dist/u0-primitives/card/Card.svelte.d.ts.map +1 -1
  160. package/dist/u0-primitives/command-palette/CommandPalette.svelte +27 -0
  161. package/dist/u0-primitives/command-palette/CommandPalette.svelte.d.ts.map +1 -1
  162. package/dist/u0-primitives/command-palette/commandStore.svelte.d.ts.map +1 -1
  163. package/dist/u0-primitives/command-palette/commandStore.svelte.js +2 -1
  164. package/dist/u0-primitives/dropdown/Dropdown.test.js +1 -1
  165. package/dist/u0-primitives/index.d.ts +2 -0
  166. package/dist/u0-primitives/index.d.ts.map +1 -1
  167. package/dist/u0-primitives/index.js +1 -0
  168. package/dist/u0-primitives/input/Input.svelte +9 -0
  169. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  170. package/dist/u0-primitives/input/Input.test.js +1 -1
  171. package/dist/u0-primitives/modal/Modal.svelte +46 -23
  172. package/dist/u0-primitives/modal/Modal.svelte.d.ts.map +1 -1
  173. package/dist/u0-primitives/modal/Modal.test.js +63 -15
  174. package/dist/u0-primitives/rsvp/RsvpReader.svelte +8 -8
  175. package/dist/u0-primitives/rsvp/RsvpReader.svelte.d.ts.map +1 -1
  176. package/dist/u0-primitives/steps/Steps.svelte +2 -2
  177. package/dist/u0-primitives/surface-state/SurfaceState.svelte +190 -0
  178. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts +15 -0
  179. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts.map +1 -0
  180. package/dist/u0-primitives/toggle/Toggle.svelte +12 -2
  181. package/dist/u0-primitives/tooltip/Tooltip.test.js +12 -12
  182. package/dist/v0-diagrams/MarkmapDiagram.test.js +49 -0
  183. package/dist/v0-diagrams/MermaidDiagram.svelte +21 -9
  184. package/dist/v0-diagrams/MermaidDiagram.svelte.d.ts.map +1 -1
  185. package/dist/v0-diagrams/MermaidDiagram.test.js +40 -0
  186. package/package.json +51 -24
  187. package/src/n4-adaptive-manifold/n4-tokens.css +2 -2
  188. package/src/p0-primitives/tokens/tokens.css +22 -11
  189. package/src/p0-primitives/tokens/tokens.json +13 -2
  190. package/dist/b0-app-shell/command-bar/CommandBar.svelte.d.ts.map +0 -1
  191. package/dist/fabric/input/CommandBar.svelte.d.ts.map +0 -1
  192. package/dist/stores/vaultStore.svelte +0 -14
  193. package/dist/stores/vaultStore.svelte.d.ts +0 -24
  194. package/dist/stores/vaultStore.svelte.d.ts.map +0 -1
  195. package/dist/tauri/index.d.ts +0 -3
  196. package/dist/tauri/index.d.ts.map +0 -1
  197. package/dist/tauri/index.js +0 -11
  198. package/dist/types/tauri.d.ts +0 -18
@@ -0,0 +1,49 @@
1
+ import { listen } from '@tauri-apps/api/event';
2
+ import { awaitTauriReady, invoke } from './invoke';
3
+ class SubstrateConnectionImpl {
4
+ options;
5
+ state = $state({ status: 'starting' });
6
+ unlisten = null;
7
+ constructor(options = {}) {
8
+ this.options = options;
9
+ }
10
+ get isDegraded() {
11
+ return this.state.status === 'reconnecting' || this.state.status === 'failed';
12
+ }
13
+ get retryLabel() {
14
+ return this.state.status === 'failed' ? 'Retry' : 'Reconnecting';
15
+ }
16
+ async init() {
17
+ this.destroy();
18
+ const ready = await awaitTauriReady();
19
+ if (!ready) {
20
+ console.warn('[SubstrateConnection] Tauri bridge not available — skipping listeners');
21
+ return;
22
+ }
23
+ try {
24
+ this.state = await invoke(this.options.getStateCommand ?? 'substrate_get_state');
25
+ }
26
+ catch (error) {
27
+ this.state = { status: 'failed', reason: error instanceof Error ? error.message : 'Unable to read substrate state' };
28
+ }
29
+ this.unlisten = await listen(this.options.stateEvent ?? 'substrate:state', (event) => {
30
+ this.state = event.payload;
31
+ });
32
+ }
33
+ async retry() {
34
+ this.state = { status: 'reconnecting', attempt: 0 };
35
+ try {
36
+ await invoke(this.options.retryCommand ?? 'substrate_retry');
37
+ }
38
+ catch (error) {
39
+ this.state = { status: 'failed', reason: error instanceof Error ? error.message : 'Unable to retry substrate connection' };
40
+ }
41
+ }
42
+ destroy() {
43
+ this.unlisten?.();
44
+ this.unlisten = null;
45
+ }
46
+ }
47
+ export function createSubstrateConnection(options = {}) {
48
+ return new SubstrateConnectionImpl(options);
49
+ }
@@ -121,7 +121,7 @@
121
121
  <style>
122
122
  .lock-indicator {
123
123
  position: relative;
124
- background: var(--color-bg-panel, var(--color-bg-panel-token, #181c20));
124
+ background: var(--color-bg-panel, #181c20);
125
125
  border-radius: var(--radius-md, 4px);
126
126
  overflow: hidden;
127
127
  }
@@ -117,7 +117,7 @@
117
117
  background: transparent;
118
118
  border: 1px solid transparent;
119
119
  border-radius: var(--radius-md, 4px);
120
- color: var(--color-text-muted, var(--color-text-muted-token, #6b6558));
120
+ color: var(--color-text-muted, #6b6558);
121
121
  cursor: pointer;
122
122
  transition: all 0.15s ease;
123
123
  }
@@ -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,14 @@
125
126
 
126
127
  <style>
127
128
  .accordion {
128
- border-radius: var(--radius-md, 0.25rem);
129
+ border-radius: var(--radius-md);
129
130
  overflow: hidden;
130
- border: 1px solid var(--color-border, var(--border-default, #3a3630));
131
- background: var(--color-bg-app, #0b0d0f);
131
+ border: var(--border-width-thin) solid var(--color-border);
132
+ background: var(--color-bg-app);
132
133
  }
133
134
 
134
135
  .accordion-item {
135
- border-bottom: 1px solid var(--color-border, var(--border-default, #3a3630));
136
+ border-bottom: var(--border-width-thin) solid var(--color-border);
136
137
  }
137
138
 
138
139
  .accordion-item:last-child {
@@ -148,21 +149,21 @@
148
149
  display: flex;
149
150
  align-items: center;
150
151
  justify-content: space-between;
151
- padding: var(--space-4, 1rem);
152
+ padding: var(--space-4);
152
153
  cursor: pointer;
153
154
  user-select: none;
154
- transition: background-color var(--duration-normal, 200ms) ease-in-out;
155
+ transition: background-color var(--duration-normal) ease-in-out;
155
156
  }
156
157
 
157
158
  .accordion-header:hover:not(.disabled) {
158
- background: var(--color-bg-secondary, var(--color-bg-canvas, #121518));
159
+ background: var(--color-bg-secondary);
159
160
  }
160
161
 
161
162
  /* Removed duplicate focus-visible — the box-shadow variant below supersedes. */
162
163
 
163
164
  /* Focus styles for keyboard navigation */
164
165
  .accordion-header:focus-visible {
165
- box-shadow: 0 0 0 2px var(--color-accent, var(--color-accent));
166
+ box-shadow: 0 0 0 var(--border-width-default) var(--color-accent);
166
167
  }
167
168
 
168
169
  /* Disabled states */
@@ -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"]');
@@ -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
  });
@@ -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
  });
@@ -9,6 +9,7 @@
9
9
  loading?: boolean;
10
10
  class?: string;
11
11
  'aria-label'?: string;
12
+ 'aria-expanded'?: boolean;
12
13
  onclick?: (e: MouseEvent) => void;
13
14
  children?: Snippet;
14
15
  iconLeading?: Snippet;
@@ -23,6 +24,7 @@
23
24
  loading = false,
24
25
  class: className = '',
25
26
  'aria-label': ariaLabel,
27
+ 'aria-expanded': ariaExpanded,
26
28
  onclick,
27
29
  children,
28
30
  iconLeading,
@@ -45,6 +47,7 @@
45
47
  class:is-pressed={isPressed}
46
48
  disabled={disabled || loading}
47
49
  aria-label={ariaLabel}
50
+ aria-expanded={ariaExpanded}
48
51
  onclick={onclick}
49
52
  onpointerdown={handlePointerDown}
50
53
  onpointerup={handlePointerUp}
@@ -233,7 +236,6 @@
233
236
 
234
237
  @media (prefers-reduced-motion: reduce) {
235
238
  .ds-button { transition: none; }
236
- .is-pressed:not(:disabled) { }
237
239
  @keyframes ds-button-spin {
238
240
  from { transform: translate(-50%, -50%) rotate(0deg); }
239
241
  to { transform: translate(-50%, -50%) rotate(360deg); }
@@ -7,6 +7,7 @@ export interface Props {
7
7
  loading?: boolean;
8
8
  class?: string;
9
9
  'aria-label'?: string;
10
+ 'aria-expanded'?: boolean;
10
11
  onclick?: (e: MouseEvent) => void;
11
12
  children?: Snippet;
12
13
  iconLeading?: Snippet;
@@ -1 +1 @@
1
- {"version":3,"file":"Button.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/button/Button.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,WAAW,KAAK;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA0DH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Button.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/button/Button.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,WAAW,KAAK;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA2DH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -4,22 +4,22 @@ import Button from './Button.svelte';
4
4
  describe('Button', () => {
5
5
  afterEach(() => cleanup());
6
6
  it('renders a real <button> element', () => {
7
- render(Button, { children: () => 'ok' });
7
+ render(Button, { children: (() => '') });
8
8
  expect(screen.getByRole('button')).toBeDefined();
9
9
  });
10
10
  it('calls onclick when clicked', async () => {
11
11
  const handleClick = vi.fn();
12
- const { container } = render(Button, { children: () => 'tap', onclick: handleClick });
12
+ const { container } = render(Button, { children: (() => ''), onclick: handleClick });
13
13
  const btn = container.querySelector('button');
14
14
  await fireEvent.click(btn);
15
15
  expect(handleClick).toHaveBeenCalledTimes(1);
16
16
  });
17
17
  it('sets disabled attribute on the native button when disabled', () => {
18
- const { container } = render(Button, { children: () => 'tap', disabled: true });
18
+ const { container } = render(Button, { children: (() => ''), disabled: true });
19
19
  expect(container.querySelector('button').hasAttribute('disabled')).toBe(true);
20
20
  });
21
21
  it('sets disabled attribute on the native button when loading', () => {
22
- const { container } = render(Button, { children: () => 'tap', loading: true });
22
+ const { container } = render(Button, { children: (() => ''), loading: true });
23
23
  expect(container.querySelector('button').hasAttribute('disabled')).toBe(true);
24
24
  });
25
25
  it('sets aria-label when provided', () => {
@@ -28,31 +28,31 @@ describe('Button', () => {
28
28
  expect(btn.getAttribute('aria-label')).toBe('Submit form');
29
29
  });
30
30
  it('renders spinner element when loading is true', () => {
31
- const { container } = render(Button, { children: () => 'tap', loading: true });
31
+ const { container } = render(Button, { children: (() => ''), loading: true });
32
32
  expect(container.querySelector('.ds-button-spinner')).not.toBeNull();
33
33
  });
34
34
  it('applies variant class', () => {
35
- const { container } = render(Button, { children: () => 'tap', variant: 'danger' });
35
+ const { container } = render(Button, { children: (() => ''), variant: 'danger' });
36
36
  expect(container.querySelector('.variant-danger')).not.toBeNull();
37
37
  });
38
38
  it('applies size class', () => {
39
- const { container } = render(Button, { children: () => 'tap', size: 'lg' });
39
+ const { container } = render(Button, { children: (() => ''), size: 'lg' });
40
40
  expect(container.querySelector('.size-lg')).not.toBeNull();
41
41
  });
42
42
  it('applies custom class', () => {
43
- const { container } = render(Button, { children: () => 'tap', class: 'my-btn' });
43
+ const { container } = render(Button, { children: (() => ''), class: 'my-btn' });
44
44
  expect(container.querySelector('.my-btn')).not.toBeNull();
45
45
  });
46
46
  it('applies variant-secondary class', () => {
47
- const { container } = render(Button, { children: () => 'tap', variant: 'secondary' });
47
+ const { container } = render(Button, { children: (() => ''), variant: 'secondary' });
48
48
  expect(container.querySelector('.variant-secondary')).not.toBeNull();
49
49
  });
50
50
  it('defaults type to "button"', () => {
51
- const { container } = render(Button, { children: () => 'Go' });
51
+ const { container } = render(Button, { children: (() => '') });
52
52
  expect(container.querySelector('button').getAttribute('type')).toBe('button');
53
53
  });
54
54
  it('forwards custom type to the native button', () => {
55
- const { container } = render(Button, { children: () => 'Go', type: 'submit' });
55
+ const { container } = render(Button, { children: (() => ''), type: 'submit' });
56
56
  expect(container.querySelector('button').getAttribute('type')).toBe('submit');
57
57
  });
58
58
  });
@@ -30,11 +30,21 @@
30
30
  }: Props = $props();
31
31
 
32
32
  let isInteractive = $derived(variant === 'interactive' || !!onclick);
33
+ let cardAttrs = $derived(isInteractive ? {
34
+ role: 'button',
35
+ tabindex: 0,
36
+ onclick,
37
+ onkeydown: handleKeydown,
38
+ 'aria-pressed': selected
39
+ } : {});
33
40
 
34
41
  function handleKeydown(e: KeyboardEvent) {
35
42
  if (isInteractive && (e.key === 'Enter' || e.key === ' ')) {
43
+ onkeydown?.(e);
44
+ if (e.defaultPrevented) return;
36
45
  e.preventDefault();
37
46
  onclick?.(new MouseEvent('click'));
47
+ return;
38
48
  }
39
49
  onkeydown?.(e);
40
50
  }
@@ -45,13 +55,9 @@
45
55
  style={style || undefined}
46
56
  class:is-interactive={isInteractive}
47
57
  class:is-selected={selected}
48
- role={isInteractive ? "button" : "region"}
49
- tabindex={isInteractive ? 0 : undefined}
50
- onclick={isInteractive ? onclick : undefined}
58
+ {...cardAttrs}
51
59
  onmouseenter={onmouseenter}
52
60
  onmouseleave={onmouseleave}
53
- onkeydown={isInteractive ? handleKeydown : undefined}
54
- aria-pressed={isInteractive ? selected : undefined}
55
61
  >
56
62
  {#if header}
57
63
  <header class="ds-card-header">
@@ -81,7 +87,7 @@
81
87
  position: relative;
82
88
  display: flex;
83
89
  flex-direction: column;
84
- border: 1px solid var(--border-default);
90
+ border: var(--border-width-thin) solid var(--border-default);
85
91
  background: var(--color-card-bg);
86
92
  color: var(--color-card-text-primary);
87
93
  overflow: hidden;
@@ -91,7 +97,7 @@
91
97
 
92
98
  .ds-card-header {
93
99
  padding: var(--space-3) var(--space-4);
94
- border-bottom: 1px solid var(--border-default);
100
+ border-bottom: var(--border-width-thin) solid var(--border-default);
95
101
  font-weight: 600;
96
102
  background: var(--color-bg-panel);
97
103
  font-size: var(--text-sm);
@@ -106,7 +112,7 @@
106
112
 
107
113
  .ds-card-footer {
108
114
  padding: var(--space-3) var(--space-4);
109
- border-top: 1px solid var(--border-default);
115
+ border-top: var(--border-width-thin) solid var(--border-default);
110
116
  background: var(--color-accent-faint);
111
117
  }
112
118
 
@@ -125,9 +131,9 @@
125
131
 
126
132
  .variant-glass {
127
133
  background: rgba(24, 28, 32, 0.6);
128
- backdrop-filter: blur(12px);
129
- -webkit-backdrop-filter: blur(12px);
130
- border: 1px solid rgba(255, 255, 255, 0.08);
134
+ backdrop-filter: blur(var(--blur-md));
135
+ -webkit-backdrop-filter: blur(var(--blur-md));
136
+ border: var(--border-width-thin) solid rgba(255, 255, 255, 0.08);
131
137
  color: var(--color-text-primary);
132
138
  }
133
139
 
@@ -136,10 +142,10 @@
136
142
  border-color: var(--color-card-border);
137
143
  background-image: repeating-linear-gradient(
138
144
  0deg,
139
- transparent 0px,
140
- transparent 1px,
141
- rgba(255, 255, 255, 0.02) 1px,
142
- rgba(255, 255, 255, 0.02) 2px
145
+ transparent 0,
146
+ transparent var(--border-width-thin),
147
+ rgba(255, 255, 255, 0.02) var(--border-width-thin),
148
+ rgba(255, 255, 255, 0.02) var(--border-width-default)
143
149
  );
144
150
  }
145
151
 
@@ -171,7 +177,7 @@
171
177
  position: absolute;
172
178
  inset: 0;
173
179
  pointer-events: none;
174
- border: 1px solid transparent;
180
+ border: var(--border-width-thin) solid transparent;
175
181
  transition: border-color var(--transition-fast);
176
182
  }
177
183
 
@@ -180,10 +186,10 @@
180
186
  border-color: var(--color-accent);
181
187
  background: repeating-linear-gradient(
182
188
  45deg,
183
- transparent 0px,
184
- transparent 2px,
185
- var(--color-accent-muted) 2px,
186
- var(--color-accent-muted) 4px
189
+ transparent 0,
190
+ transparent var(--border-width-default),
191
+ var(--color-accent-muted) var(--border-width-default),
192
+ var(--color-accent-muted) var(--blur-md)
187
193
  );
188
194
  }
189
195
 
@@ -1 +1 @@
1
- {"version":3,"file":"Card.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/card/Card.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,WAAW,KAAK;IACpB,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA0DH,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Card.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/card/Card.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,WAAW,KAAK;IACpB,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAoEH,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
@@ -174,6 +174,21 @@
174
174
  paramValues = {};
175
175
  currentParamIndex = 0;
176
176
  }
177
+
178
+ function handleOptionKeydown(e: KeyboardEvent, cmd: CommandSchema) {
179
+ if (e.key === 'Enter' || e.key === ' ') {
180
+ e.preventDefault();
181
+ selectCommand(cmd);
182
+ }
183
+ }
184
+
185
+ function handleSuggestionKeydown(e: KeyboardEvent, suggestion: string) {
186
+ if (e.key === 'Enter' || e.key === ' ') {
187
+ e.preventDefault();
188
+ inputValue = suggestion;
189
+ submitParameter();
190
+ }
191
+ }
177
192
 
178
193
  function submitParameter() {
179
194
  if (!activeCommand || !currentParam) return;
@@ -269,9 +284,15 @@
269
284
  ? getParameterPlaceholder(currentParam)
270
285
  : placeholder}
271
286
  disabled={isExecuting}
287
+ role="combobox"
272
288
  aria-autocomplete="list"
273
289
  aria-controls="suggestions-list"
274
290
  aria-expanded={filteredCommands.length > 0 || suggestions.length > 0}
291
+ aria-activedescendant={!activeCommand && filteredCommands.length > 0
292
+ ? `command-opt-${selectedIndex}`
293
+ : activeCommand && suggestions.length > 0
294
+ ? `suggestion-opt-${selectedIndex}`
295
+ : undefined}
275
296
  />
276
297
 
277
298
  {#if isExecuting}
@@ -289,10 +310,13 @@
289
310
  >
290
311
  {#each filteredCommands as cmd, i (cmd.id)}
291
312
  <li
313
+ id="command-opt-${i}"
292
314
  role="option"
293
315
  aria-selected={i === selectedIndex}
316
+ tabindex={i === selectedIndex ? 0 : -1}
294
317
  class:selected={i === selectedIndex}
295
318
  onclick={() => selectCommand(cmd)}
319
+ onkeydown={(e) => handleOptionKeydown(e, cmd)}
296
320
  >
297
321
  <span class="command-name">/{cmd.path}</span>
298
322
  <span class="command-desc">{cmd.description}</span>
@@ -316,10 +340,13 @@
316
340
  >
317
341
  {#each suggestions as sug, i (sug)}
318
342
  <li
343
+ id="suggestion-opt-${i}"
319
344
  role="option"
320
345
  aria-selected={i === selectedIndex}
346
+ tabindex={i === selectedIndex ? 0 : -1}
321
347
  class:selected={i === selectedIndex}
322
348
  onclick={() => { inputValue = sug; submitParameter(); }}
349
+ onkeydown={(e) => handleSuggestionKeydown(e, sug)}
323
350
  >
324
351
  {sug}
325
352
  </li>
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/command-palette/CommandPalette.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,iBAAiB,CAAC;AAGpF,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,KAAK;IACb,kEAAkE;IAClE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,iDAAiD;IACjD,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,4DAA4D;IAC5D,SAAS,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAClG,uCAAuC;IACvC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmTH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"CommandPalette.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/command-palette/CommandPalette.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,iBAAiB,CAAC;AAGpF,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,KAAK;IACb,kEAAkE;IAClE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,iDAAiD;IACjD,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,4DAA4D;IAC5D,SAAS,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAClG,uCAAuC;IACvC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAsUH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"commandStore.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/command-palette/commandStore.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,cAAc,EAGd,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAOzB,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD,cAAM,YAAY;IAEhB,QAAQ,6BAAoD;IAC5D,aAAa,8BAA6C;IAC1D,YAAY,cAAkC;IAC9C,WAAW,UAAiB;IAC5B,UAAU,uBAAsC;IAGhD,cAAc,kBAGZ;IAGF,cAAc,iBAAoC;IAGlD,iBAAiB,kBAKf;IAGF,OAAO,CAAC,eAAe,CAAgC;IAEvD;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1C;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAMrC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAyBxC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAgCrC;;OAEG;IACH,YAAY,IAAI,OAAO;IAcvB;;OAEG;IACH,MAAM,IAAI,IAAI;IASd;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IA+DvC;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,aAAa,CAAC;IAczB;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IA4BjE;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAQtC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAMzC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAYrC;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
1
+ {"version":3,"file":"commandStore.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/command-palette/commandStore.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,cAAc,EAGd,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAYzB,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD,cAAM,YAAY;IAEhB,QAAQ,6BAAoD;IAC5D,aAAa,8BAA6C;IAC1D,YAAY,cAAkC;IAC9C,WAAW,UAAiB;IAC5B,UAAU,uBAAsC;IAGhD,cAAc,kBAGZ;IAGF,cAAc,iBAAoC;IAGlD,iBAAiB,kBAKf;IAGF,OAAO,CAAC,eAAe,CAAgC;IAEvD;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1C;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAMrC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAyBxC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAgCrC;;OAEG;IACH,YAAY,IAAI,OAAO;IAcvB;;OAEG;IACH,MAAM,IAAI,IAAI;IASd;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IA+DvC;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,aAAa,CAAC;IAczB;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IA4BjE;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAQtC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAMzC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAYrC;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -9,7 +9,8 @@
9
9
  * - S-05: AbortController for killable operations
10
10
  */
11
11
  async function tauriInvoke(command, payload) {
12
- const mod = await import('@tauri-apps/api/core');
12
+ const spec = '@tauri-apps/api/core';
13
+ const mod = await import(/* @vite-ignore */ spec);
13
14
  return mod.invoke(command, payload);
14
15
  }
15
16
  class CommandStore {
@@ -9,7 +9,7 @@ const sampleItems = [
9
9
  function renderDropdown(props = {}) {
10
10
  return render(Dropdown, {
11
11
  items: sampleItems,
12
- trigger: () => '<button>Open</button>',
12
+ trigger: (() => ''),
13
13
  ...props,
14
14
  });
15
15
  }
@@ -10,6 +10,8 @@ export { default as Dropdown } from './dropdown/Dropdown.svelte';
10
10
  export { default as Tabs } from './tabs/Tabs.svelte';
11
11
  export type { Tab } from './tabs/tabs-types';
12
12
  export { default as Spinner } from './spinner/Spinner.svelte';
13
+ export { default as SurfaceState } from './surface-state/SurfaceState.svelte';
14
+ export type { SurfaceStateKind, Props as SurfaceStateProps } from './surface-state/SurfaceState.svelte';
13
15
  export { default as Modal } from './modal/Modal.svelte';
14
16
  export { default as AnimatedIcon } from './animated-icon/AnimatedIcon.svelte';
15
17
  export type { AnimatedIconName, AnimationType } from './animated-icon/index.js';