@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
@@ -0,0 +1,195 @@
1
+ <script lang="ts">
2
+ /**
3
+ * FileTree - Fabric Component
4
+ *
5
+ * Hierarchical file browser tree with expand/collapse and selection.
6
+ * Decoupled from shell stores — uses props/callbacks for all state.
7
+ *
8
+ * @package @stephen-netu/design-system/fabric/data
9
+ */
10
+ import Self from './FileTree.svelte';
11
+ import { ChevronRight, FileText, Folder } from '@lucide/svelte';
12
+
13
+ export interface FileEntry {
14
+ id: string;
15
+ name: string;
16
+ type: 'file' | 'directory';
17
+ path: string;
18
+ children?: FileEntry[];
19
+ isExpanded?: boolean;
20
+ isSelected?: boolean;
21
+ }
22
+
23
+ interface Props {
24
+ items: FileEntry[];
25
+ onFileSelect: (entry: FileEntry) => void;
26
+ onDirectoryToggle?: (entry: FileEntry, expanded: boolean) => void;
27
+ class?: string;
28
+ }
29
+
30
+ let { items, onFileSelect, onDirectoryToggle, class: className = '' }: Props = $props();
31
+
32
+ let expandedPaths = $state<Set<string>>(new Set());
33
+ let selectedPath = $state<string | null>(null);
34
+
35
+ function handleToggle(entry: FileEntry) {
36
+ if (entry.type !== 'directory') return;
37
+
38
+ const next = new Set(expandedPaths);
39
+ if (next.has(entry.path)) {
40
+ next.delete(entry.path);
41
+ } else {
42
+ next.add(entry.path);
43
+ }
44
+ expandedPaths = next;
45
+ onDirectoryToggle?.(entry, next.has(entry.path));
46
+ }
47
+
48
+ function handleSelect(entry: FileEntry) {
49
+ if (entry.type === 'file') {
50
+ selectedPath = entry.path;
51
+ }
52
+ onFileSelect(entry);
53
+ }
54
+
55
+ function isExpanded(entry: FileEntry): boolean {
56
+ return entry.isExpanded ?? expandedPaths.has(entry.path);
57
+ }
58
+
59
+ function isSelected(entry: FileEntry): boolean {
60
+ return entry.isSelected ?? selectedPath === entry.path;
61
+ }
62
+
63
+ function handleChevronKeydown(entry: FileEntry, e: KeyboardEvent) {
64
+ if (e.key === 'Enter' || e.key === ' ') {
65
+ e.stopPropagation();
66
+ e.preventDefault();
67
+ handleToggle(entry);
68
+ }
69
+ }
70
+ </script>
71
+
72
+ <div class="file-tree {className}">
73
+ {#each items as entry (entry.id)}
74
+ <div class="file-tree__node">
75
+ <button
76
+ class="file-tree__row"
77
+ class:file-tree__row--directory={entry.type === 'directory'}
78
+ class:file-tree__row--selected={isSelected(entry)}
79
+ onclick={() => handleSelect(entry)}
80
+ aria-expanded={entry.type === 'directory' ? isExpanded(entry) : undefined}
81
+ aria-current={isSelected(entry) ? 'true' : undefined}
82
+ >
83
+ {#if entry.type === 'directory'}
84
+ <span
85
+ class="file-tree__chevron"
86
+ class:file-tree__chevron--open={isExpanded(entry)}
87
+ onclick={(e) => { e.stopPropagation(); handleToggle(entry); }}
88
+ onkeydown={(e) => handleChevronKeydown(entry, e)}
89
+ role="button"
90
+ tabindex="0"
91
+ aria-label={isExpanded(entry) ? 'Collapse directory' : 'Expand directory'}
92
+ >
93
+ <ChevronRight size={12} />
94
+ </span>
95
+ <Folder size={14} class="file-tree__icon file-tree__icon--folder" />
96
+ {:else}
97
+ <span class="file-tree__spacer"></span>
98
+ <FileText size={14} class="file-tree__icon file-tree__icon--file" />
99
+ {/if}
100
+ <span class="file-tree__name">{entry.name}</span>
101
+ </button>
102
+
103
+ {#if entry.type === 'directory' && entry.children && isExpanded(entry)}
104
+ <div class="file-tree__children" role="group">
105
+ <Self items={entry.children} {onFileSelect} {onDirectoryToggle} />
106
+ </div>
107
+ {/if}
108
+ </div>
109
+ {/each}
110
+ </div>
111
+
112
+ <style>
113
+ .file-tree {
114
+ font-size: 13px;
115
+ line-height: 1.4;
116
+ color: var(--color-text-primary);
117
+ user-select: none;
118
+ }
119
+
120
+ .file-tree__node {
121
+ margin: 0;
122
+ }
123
+
124
+ .file-tree__row {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: var(--space-1);
128
+ width: 100%;
129
+ padding: 2px 8px;
130
+ background: transparent;
131
+ border: none;
132
+ border-radius: 0;
133
+ color: var(--color-text-secondary);
134
+ cursor: pointer;
135
+ text-align: left;
136
+ font: inherit;
137
+ transition: background var(--transition-fast, 110ms) linear, color var(--transition-fast, 110ms) linear;
138
+ }
139
+
140
+ .file-tree__row:hover {
141
+ background: var(--color-bg-panel);
142
+ color: var(--color-text-primary);
143
+ }
144
+
145
+ .file-tree__row--selected {
146
+ background: var(--color-accent-subtle);
147
+ color: var(--color-accent);
148
+ box-shadow: inset 2px 0 0 var(--color-accent);
149
+ }
150
+
151
+ .file-tree__chevron {
152
+ display: flex;
153
+ align-items: center;
154
+ justify-content: center;
155
+ width: 14px;
156
+ height: 14px;
157
+ color: var(--color-text-tertiary);
158
+ cursor: pointer;
159
+ transition: transform var(--transition-fast, 110ms) linear;
160
+ flex-shrink: 0;
161
+ }
162
+
163
+ .file-tree__chevron--open {
164
+ transform: rotate(90deg);
165
+ color: var(--color-accent);
166
+ }
167
+
168
+ .file-tree__spacer {
169
+ display: block;
170
+ width: 14px;
171
+ flex-shrink: 0;
172
+ }
173
+
174
+ .file-tree__icon {
175
+ flex-shrink: 0;
176
+ }
177
+
178
+ .file-tree__icon--folder {
179
+ color: var(--color-accent-muted, var(--color-accent));
180
+ }
181
+
182
+ .file-tree__icon--file {
183
+ color: var(--color-text-tertiary);
184
+ }
185
+
186
+ .file-tree__name {
187
+ overflow: hidden;
188
+ text-overflow: ellipsis;
189
+ white-space: nowrap;
190
+ }
191
+
192
+ .file-tree__children {
193
+ padding-left: 16px;
194
+ }
195
+ </style>
@@ -0,0 +1,19 @@
1
+ export interface FileEntry {
2
+ id: string;
3
+ name: string;
4
+ type: 'file' | 'directory';
5
+ path: string;
6
+ children?: FileEntry[];
7
+ isExpanded?: boolean;
8
+ isSelected?: boolean;
9
+ }
10
+ interface Props {
11
+ items: FileEntry[];
12
+ onFileSelect: (entry: FileEntry) => void;
13
+ onDirectoryToggle?: (entry: FileEntry, expanded: boolean) => void;
14
+ class?: string;
15
+ }
16
+ declare const FileTree: import("svelte").Component<Props, {}, "">;
17
+ type FileTree = ReturnType<typeof FileTree>;
18
+ export default FileTree;
19
+ //# sourceMappingURL=FileTree.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileTree.svelte.d.ts","sourceRoot":"","sources":["../../../src/fabric/data/FileTree.svelte.ts"],"names":[],"mappings":"AAeE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,KAAK;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+EH,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { afterEach, describe, it, expect, vi } from 'vitest';
2
+ import { cleanup, render, fireEvent } from '@testing-library/svelte';
3
+ import FileTree from './FileTree.svelte';
4
+ const mockItems = [
5
+ {
6
+ id: '1',
7
+ name: 'src',
8
+ type: 'directory',
9
+ path: '/src',
10
+ children: [
11
+ { id: '2', name: 'index.ts', type: 'file', path: '/src/index.ts' },
12
+ {
13
+ id: '3',
14
+ name: 'components',
15
+ type: 'directory',
16
+ path: '/src/components',
17
+ children: [
18
+ { id: '4', name: 'Button.svelte', type: 'file', path: '/src/components/Button.svelte' },
19
+ ],
20
+ },
21
+ ],
22
+ },
23
+ { id: '5', name: 'README.md', type: 'file', path: '/README.md' },
24
+ ];
25
+ describe('FileTree', () => {
26
+ afterEach(() => cleanup());
27
+ it('renders top-level items', () => {
28
+ const { container } = render(FileTree, { props: { items: mockItems, onFileSelect: vi.fn() } });
29
+ expect(container.textContent).toContain('src');
30
+ expect(container.textContent).toContain('README.md');
31
+ });
32
+ it('shows children when directory is expanded via chevron click', async () => {
33
+ const { container } = render(FileTree, { props: { items: mockItems, onFileSelect: vi.fn() } });
34
+ const chevron = container.querySelector('.file-tree__chevron');
35
+ expect(chevron).not.toBeNull();
36
+ await fireEvent.click(chevron);
37
+ expect(container.textContent).toContain('index.ts');
38
+ expect(container.textContent).toContain('components');
39
+ });
40
+ it('hides children when directory is collapsed', async () => {
41
+ const { container } = render(FileTree, { props: { items: mockItems, onFileSelect: vi.fn() } });
42
+ const chevron = container.querySelector('.file-tree__chevron');
43
+ await fireEvent.click(chevron);
44
+ expect(container.textContent).toContain('index.ts');
45
+ await fireEvent.click(chevron);
46
+ expect(container.textContent).not.toContain('index.ts');
47
+ });
48
+ it('calls onFileSelect when a file row is clicked', async () => {
49
+ const onFileSelect = vi.fn();
50
+ const { container } = render(FileTree, { props: { items: mockItems, onFileSelect } });
51
+ const chevron = container.querySelector('.file-tree__chevron');
52
+ await fireEvent.click(chevron);
53
+ const fileRows = container.querySelectorAll('.file-tree__row');
54
+ const fileRow = Array.from(fileRows).find(r => r.textContent?.includes('index.ts'));
55
+ expect(fileRow).not.toBeNull();
56
+ await fireEvent.click(fileRow);
57
+ expect(onFileSelect).toHaveBeenCalledTimes(1);
58
+ expect(onFileSelect).toHaveBeenCalledWith(expect.objectContaining({ id: '2', name: 'index.ts' }));
59
+ });
60
+ it('applies selected class to the clicked file row', async () => {
61
+ const { container } = render(FileTree, { props: { items: mockItems, onFileSelect: vi.fn() } });
62
+ const chevron = container.querySelector('.file-tree__chevron');
63
+ await fireEvent.click(chevron);
64
+ const readmeRow = Array.from(container.querySelectorAll('.file-tree__row'))
65
+ .find(r => r.textContent?.includes('README.md'));
66
+ await fireEvent.click(readmeRow);
67
+ expect(readmeRow.classList.contains('file-tree__row--selected')).toBe(true);
68
+ });
69
+ it('calls onDirectoryToggle when a directory is expanded', async () => {
70
+ const onDirectoryToggle = vi.fn();
71
+ const { container } = render(FileTree, {
72
+ props: { items: mockItems, onFileSelect: vi.fn(), onDirectoryToggle },
73
+ });
74
+ const chevron = container.querySelector('.file-tree__chevron');
75
+ await fireEvent.click(chevron);
76
+ expect(onDirectoryToggle).toHaveBeenCalledTimes(1);
77
+ expect(onDirectoryToggle).toHaveBeenCalledWith(expect.objectContaining({ id: '1', name: 'src' }), true);
78
+ });
79
+ it('applies custom class name', () => {
80
+ const { container } = render(FileTree, {
81
+ props: { items: mockItems, onFileSelect: vi.fn(), class: 'custom-class' },
82
+ });
83
+ const el = container.querySelector('.file-tree');
84
+ expect(el?.classList.contains('custom-class')).toBe(true);
85
+ });
86
+ it('supports externally controlled isExpanded on directory items', () => {
87
+ const itemsWithExpanded = [
88
+ {
89
+ id: '1',
90
+ name: 'src',
91
+ type: 'directory',
92
+ path: '/src',
93
+ isExpanded: true,
94
+ children: [
95
+ { id: '2', name: 'index.ts', type: 'file', path: '/src/index.ts' },
96
+ ],
97
+ },
98
+ ];
99
+ const { container } = render(FileTree, { props: { items: itemsWithExpanded, onFileSelect: vi.fn() } });
100
+ expect(container.textContent).toContain('index.ts');
101
+ });
102
+ it('supports externally controlled isSelected on file items', () => {
103
+ const itemsWithSelected = [
104
+ { id: '5', name: 'README.md', type: 'file', path: '/README.md', isSelected: true },
105
+ ];
106
+ const { container } = render(FileTree, { props: { items: itemsWithSelected, onFileSelect: vi.fn() } });
107
+ const row = container.querySelector('.file-tree__row--selected');
108
+ expect(row).not.toBeNull();
109
+ expect(row.textContent).toContain('README.md');
110
+ });
111
+ it('calls onDirectoryToggle with false when collapsing a directory', async () => {
112
+ const onDirectoryToggle = vi.fn();
113
+ const { container } = render(FileTree, {
114
+ props: { items: mockItems, onFileSelect: vi.fn(), onDirectoryToggle },
115
+ });
116
+ const chevron = container.querySelector('.file-tree__chevron');
117
+ await fireEvent.click(chevron);
118
+ await fireEvent.click(chevron);
119
+ expect(onDirectoryToggle).toHaveBeenCalledTimes(2);
120
+ expect(onDirectoryToggle).toHaveBeenLastCalledWith(expect.objectContaining({ id: '1', name: 'src' }), false);
121
+ });
122
+ it('sets aria-expanded on directory rows', () => {
123
+ const { container } = render(FileTree, { props: { items: mockItems, onFileSelect: vi.fn() } });
124
+ const dirRow = container.querySelector('[aria-expanded]');
125
+ expect(dirRow).not.toBeNull();
126
+ });
127
+ });
@@ -2,14 +2,10 @@
2
2
  * Fabric Data Components
3
3
  *
4
4
  * Data visualization and management components.
5
+ *
6
+ * @package @stephen-netu/design-system/fabric/data
7
+ * @adr 2026-04-12-leap-substrate-refactor-001
5
8
  */
6
- export interface FileEntry {
7
- id: string;
8
- name: string;
9
- type: 'file' | 'directory';
10
- path: string;
11
- children?: FileEntry[];
12
- isExpanded?: boolean;
13
- isSelected?: boolean;
14
- }
9
+ export { default as FileTree } from './FileTree.svelte';
10
+ export type { FileEntry } from './FileTree.svelte';
15
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fabric/data/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fabric/data/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -2,5 +2,8 @@
2
2
  * Fabric Data Components
3
3
  *
4
4
  * Data visualization and management components.
5
+ *
6
+ * @package @stephen-netu/design-system/fabric/data
7
+ * @adr 2026-04-12-leap-substrate-refactor-001
5
8
  */
6
- export {};
9
+ export { default as FileTree } from './FileTree.svelte';
@@ -15,6 +15,7 @@ export { GlassBox, KanbanBoard, KanbanColumn, KanbanCard, CollapsiblePanel } fro
15
15
  export type { CardData, ColumnData, PanelPosition, PanelMode, PanelSnap } from './layout';
16
16
  export { ActivityRail } from './navigation';
17
17
  export type { RailItem, RailItemType } from './navigation';
18
+ export { FileTree } from './data';
18
19
  export type { FileEntry } from './data';
19
20
  export { AppHeaderBar, KeyboardShortcuts } from './input';
20
21
  export type { ShortcutBinding, ShortcutGroup } from './input';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fabric/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC7F,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1F,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG3D,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAChD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fabric/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC7F,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1F,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG3D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAChD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -15,6 +15,8 @@
15
15
  export { GlassBox, KanbanBoard, KanbanColumn, KanbanCard, CollapsiblePanel } from './layout';
16
16
  // Navigation
17
17
  export { ActivityRail } from './navigation';
18
+ // Data
19
+ export { FileTree } from './data';
18
20
  // Input
19
21
  export { AppHeaderBar, KeyboardShortcuts } from './input';
20
22
  // AI
@@ -162,20 +162,20 @@
162
162
  .shortcuts-overlay {
163
163
  position: fixed;
164
164
  inset: 0;
165
- background: rgba(0, 0, 0, 0.8);
165
+ background: rgba(0, 0, 0, 0.75);
166
166
  display: flex;
167
167
  align-items: center;
168
168
  justify-content: center;
169
169
  z-index: 10000;
170
- backdrop-filter: blur(4px);
170
+ /* No backdrop-filter: depth via border + contrast only */
171
171
  }
172
172
 
173
173
  .shortcuts-panel {
174
174
  width: min(560px, 90vw);
175
175
  max-height: 80vh;
176
176
  background: var(--color-bg-panel, #222222);
177
- border: 1px solid var(--border-default, #333333);
178
- border-radius: var(--radius-xl, 0.75rem);
177
+ border: var(--border-width-default, 2px) solid var(--border-default, #333333);
178
+ border-radius: 0;
179
179
  display: flex;
180
180
  flex-direction: column;
181
181
  overflow: hidden;
@@ -185,33 +185,35 @@
185
185
  display: flex;
186
186
  align-items: center;
187
187
  justify-content: space-between;
188
- padding: 16px 20px;
189
- border-bottom: 1px solid var(--border-subtle, rgba(255,255,255,0.06));
188
+ padding: var(--ui-pad-y, 5px) var(--ui-pad-x, 8px);
189
+ border-bottom: 1px solid var(--border-default, #333333);
190
190
  }
191
191
 
192
192
  .panel-title {
193
- font-size: 16px;
193
+ font-family: var(--font-mono);
194
+ font-size: var(--ui-label, 10px);
194
195
  font-weight: 600;
195
- color: var(--color-text-primary, #f2efe9);
196
+ letter-spacing: 0.1em;
197
+ text-transform: uppercase;
198
+ color: var(--color-text-secondary, #a09880);
196
199
  margin: 0;
197
200
  }
198
201
 
199
202
  .close-btn {
200
203
  background: none;
201
- border: none;
204
+ border: 1px solid transparent;
202
205
  color: var(--color-text-tertiary, #706858);
203
206
  cursor: pointer;
204
- padding: 4px;
205
- border-radius: var(--radius-sm, 0.25rem);
207
+ padding: 3px;
206
208
  display: flex;
207
209
  align-items: center;
208
210
  justify-content: center;
209
- transition: color 0.15s, background 0.15s;
211
+ transition: color var(--transition-fast, 110ms) linear, border-color var(--transition-fast, 110ms) linear;
210
212
  }
211
213
 
212
214
  .close-btn:hover {
213
- color: var(--color-text-primary, #f2efe9);
214
- background: rgba(255, 255, 255, 0.05);
215
+ color: var(--color-text-primary, #e7e9eb);
216
+ border-color: var(--border-default, #333333);
215
217
  }
216
218
 
217
219
  .search-box {
@@ -242,7 +244,7 @@
242
244
  color: var(--color-text-tertiary, #706858);
243
245
  cursor: pointer;
244
246
  padding: 2px;
245
- border-radius: var(--radius-sm, 0.25rem);
247
+ border-radius: 0;
246
248
  display: flex;
247
249
  align-items: center;
248
250
  justify-content: center;
@@ -292,15 +294,15 @@
292
294
  padding: 10px 12px;
293
295
  background: none;
294
296
  border: 1px solid transparent;
295
- border-radius: var(--radius-md, 0.375rem);
297
+ border-radius: 0;
296
298
  cursor: pointer;
297
299
  text-align: left;
298
300
  transition: background 0.15s, border-color 0.15s;
299
301
  }
300
302
 
301
303
  .shortcut-btn:hover {
302
- background: var(--color-bg-canvas, #1a1a1a);
303
- border-color: var(--border-subtle, rgba(255,255,255,0.06));
304
+ background: var(--color-bg-canvas, #0f1113);
305
+ border-color: var(--border-default, #333333);
304
306
  }
305
307
 
306
308
  .shortcut-keys {
@@ -319,7 +321,7 @@
319
321
  padding: 0 6px;
320
322
  background: var(--color-bg-canvas, #1a1a1a);
321
323
  border: 1px solid var(--border-default, #333333);
322
- border-radius: var(--radius-sm, 0.25rem);
324
+ border-radius: 0;
323
325
  font-family: var(--font-mono, 'JetBrains Mono', monospace);
324
326
  font-size: 11px;
325
327
  font-weight: 500;
@@ -340,7 +342,7 @@
340
342
  font-size: 10px;
341
343
  padding: 2px 6px;
342
344
  background: var(--color-bg-canvas, #1a1a1a);
343
- border-radius: var(--radius-sm, 0.25rem);
345
+ border-radius: 0;
344
346
  color: var(--color-text-tertiary, #706858);
345
347
  }
346
348
 
@@ -380,7 +382,7 @@
380
382
  margin: 0 2px;
381
383
  background: var(--color-bg-panel, #222222);
382
384
  border: 1px solid var(--border-default, #333333);
383
- border-radius: var(--radius-sm, 0.25rem);
385
+ border-radius: 0;
384
386
  font-family: var(--font-mono, 'JetBrains Mono', monospace);
385
387
  font-size: 10px;
386
388
  }
@@ -238,7 +238,7 @@
238
238
  --panel-border: var(--border-subtle, 1px solid rgba(255, 255, 255, 0.06));
239
239
  --handle-bg: var(--color-bg-inset, #0f0f0f);
240
240
  --handle-hover-bg: var(--color-bg-canvas, #141414);
241
- --accent-color: var(--color-accent, #00ff41);
241
+ --accent-color: var(--color-accent);
242
242
  --transition-duration: 300ms;
243
243
 
244
244
  display: flex;
@@ -290,7 +290,7 @@
290
290
  border-right: var(--panel-border);
291
291
  border-left: var(--panel-border);
292
292
  overflow: hidden;
293
- transition: width var(--transition-duration) cubic-bezier(0.34, 1.56, 0.64, 1);
293
+ transition: width var(--transition-duration) linear;
294
294
  flex-shrink: 0;
295
295
  }
296
296
 
@@ -316,7 +316,7 @@
316
316
  cursor: pointer;
317
317
  user-select: none;
318
318
  position: relative;
319
- transition: background 0.15s ease;
319
+ transition: background var(--transition-fast, 110ms) linear;
320
320
  min-height: 100%;
321
321
  }
322
322
 
@@ -341,25 +341,23 @@
341
341
  width: 2px;
342
342
  height: 64px;
343
343
  background: var(--color-text-muted, #555);
344
- border-radius: var(--shape-border-radius, 1px);
345
- transition: all 0.15s ease;
344
+ transition: background var(--transition-fast, 110ms) linear;
346
345
  flex-shrink: 0;
347
346
  }
348
347
 
349
348
  .panel-handle:hover .panel-handle__bar {
350
- background: var(--color-text-primary, #ccc);
351
- box-shadow: 0 0 4px rgba(255, 255, 255, 0.3);
349
+ background: var(--color-text-secondary, #9aa1a8);
352
350
  }
353
351
 
352
+ /* Expanded/dragging: accent fill on the drag handle bar — functional
353
+ state indicator (open/dragging vs closed), same logic as toggle thumb */
354
354
  .panel-handle--expanded .panel-handle__bar {
355
355
  background: var(--accent-color);
356
- box-shadow: 0 0 6px var(--accent-color);
357
- opacity: 0.6;
356
+ opacity: 0.7;
358
357
  }
359
358
 
360
359
  .collapsible-panel--dragging .panel-handle__bar {
361
360
  background: var(--accent-color);
362
- box-shadow: 0 0 8px var(--accent-color);
363
361
  opacity: 1;
364
362
  }
365
363
 
@@ -8,9 +8,7 @@
8
8
  * @package @kos/design-system/fabric/navigation
9
9
  * @adr 2026-04-12-leap-substrate-refactor-001
10
10
  */
11
- // Lucide icons are Svelte 4 class components - use permissive typing
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- type IconComponent = any;
11
+ import type { LucideIcon } from '@lucide/svelte';
14
12
  import {
15
13
  LayoutGrid, FileText, Network, Columns2, Globe,
16
14
  FolderTree, MessageSquare, HelpCircle, Layers, Gauge, Wifi, Folder,
@@ -56,7 +54,7 @@
56
54
  ondropstreamcard,
57
55
  }: Props = $props();
58
56
 
59
- const ICON_MAP: Record<string, IconComponent> = {
57
+ const ICON_MAP: Record<string, LucideIcon> = {
60
58
  'layout-grid': LayoutGrid,
61
59
  'file-text': FileText,
62
60
  'network': Network,
@@ -75,7 +73,7 @@
75
73
  'help-circle': HelpCircle,
76
74
  };
77
75
 
78
- function getIcon(name: string): IconComponent {
76
+ function getIcon(name: string): LucideIcon {
79
77
  return ICON_MAP[name.toLowerCase()] ?? FileText;
80
78
  }
81
79
 
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityRail.svelte.d.ts","sourceRoot":"","sources":["../../../src/fabric/navigation/ActivityRail.svelte.ts"],"names":[],"mappings":"AAsBE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,oCAAoC;IACpC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,wCAAwC;IACxC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,0CAA0C;IAC1C,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7G;AA+HH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ActivityRail.svelte.d.ts","sourceRoot":"","sources":["../../../src/fabric/navigation/ActivityRail.svelte.ts"],"names":[],"mappings":"AAoBE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,oCAAoC;IACpC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,wCAAwC;IACxC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,0CAA0C;IAC1C,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7G;AAgIH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ export interface Props {
3
+ content?: string;
4
+ size?: 'sm' | 'md' | 'lg' | 'xl';
5
+ class?: string;
6
+ }
7
+
8
+ let { content = '', size = 'md', class: className = '' }: Props = $props();
9
+ </script>
10
+
11
+ <span class="openui-text size-{size} {className}">
12
+ {content}
13
+ </span>
14
+
15
+ <style>
16
+ .openui-text {
17
+ color: var(--color-text-primary, #f5f5f5);
18
+ font-family: var(--font-sans);
19
+ line-height: var(--line-height-normal, 1.5);
20
+ }
21
+
22
+ .size-sm {
23
+ font-size: var(--text-xs, 0.75rem);
24
+ }
25
+
26
+ .size-md {
27
+ font-size: var(--text-sm, 0.875rem);
28
+ }
29
+
30
+ .size-lg {
31
+ font-size: var(--text-base, 1rem);
32
+ }
33
+
34
+ .size-xl {
35
+ font-size: var(--text-lg, 1.125rem);
36
+ font-weight: var(--font-weight-semibold, 600);
37
+ }
38
+ </style>
@@ -0,0 +1,9 @@
1
+ export interface Props {
2
+ content?: string;
3
+ size?: 'sm' | 'md' | 'lg' | 'xl';
4
+ class?: string;
5
+ }
6
+ declare const Text: import("svelte").Component<Props, {}, "">;
7
+ type Text = ReturnType<typeof Text>;
8
+ export default Text;
9
+ //# sourceMappingURL=Text.svelte.d.ts.map