@synthaxai/ui 1.0.0

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 (185) hide show
  1. package/README.md +262 -0
  2. package/dist/app.css +2 -0
  3. package/dist/app.html +12 -0
  4. package/dist/data-display/DataTable/DataTable.svelte +773 -0
  5. package/dist/data-display/DataTable/DataTable.svelte.d.ts +120 -0
  6. package/dist/data-display/DataTable/DataTable.svelte.d.ts.map +1 -0
  7. package/dist/data-display/DataTable/index.d.ts +2 -0
  8. package/dist/data-display/DataTable/index.d.ts.map +1 -0
  9. package/dist/data-display/DataTable/index.js +1 -0
  10. package/dist/data-display/StatCard/StatCard.svelte +409 -0
  11. package/dist/data-display/StatCard/StatCard.svelte.d.ts +63 -0
  12. package/dist/data-display/StatCard/StatCard.svelte.d.ts.map +1 -0
  13. package/dist/data-display/StatCard/index.d.ts +2 -0
  14. package/dist/data-display/StatCard/index.d.ts.map +1 -0
  15. package/dist/data-display/StatCard/index.js +1 -0
  16. package/dist/data-display/index.d.ts +8 -0
  17. package/dist/data-display/index.d.ts.map +1 -0
  18. package/dist/data-display/index.js +7 -0
  19. package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte +693 -0
  20. package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte.d.ts +66 -0
  21. package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte.d.ts.map +1 -0
  22. package/dist/dialogs/ConfirmDialog/index.d.ts +2 -0
  23. package/dist/dialogs/ConfirmDialog/index.d.ts.map +1 -0
  24. package/dist/dialogs/ConfirmDialog/index.js +1 -0
  25. package/dist/dialogs/Modal/Modal.svelte +441 -0
  26. package/dist/dialogs/Modal/Modal.svelte.d.ts +69 -0
  27. package/dist/dialogs/Modal/Modal.svelte.d.ts.map +1 -0
  28. package/dist/dialogs/Modal/index.d.ts +2 -0
  29. package/dist/dialogs/Modal/index.d.ts.map +1 -0
  30. package/dist/dialogs/Modal/index.js +1 -0
  31. package/dist/dialogs/index.d.ts +8 -0
  32. package/dist/dialogs/index.d.ts.map +1 -0
  33. package/dist/dialogs/index.js +7 -0
  34. package/dist/feedback/Alert/Alert.svelte +565 -0
  35. package/dist/feedback/Alert/Alert.svelte.d.ts +60 -0
  36. package/dist/feedback/Alert/Alert.svelte.d.ts.map +1 -0
  37. package/dist/feedback/Alert/index.d.ts +2 -0
  38. package/dist/feedback/Alert/index.d.ts.map +1 -0
  39. package/dist/feedback/Alert/index.js +1 -0
  40. package/dist/feedback/EmptyState/EmptyState.svelte +377 -0
  41. package/dist/feedback/EmptyState/EmptyState.svelte.d.ts +63 -0
  42. package/dist/feedback/EmptyState/EmptyState.svelte.d.ts.map +1 -0
  43. package/dist/feedback/EmptyState/index.d.ts +2 -0
  44. package/dist/feedback/EmptyState/index.d.ts.map +1 -0
  45. package/dist/feedback/EmptyState/index.js +1 -0
  46. package/dist/feedback/ProgressBar/ProgressBar.svelte +585 -0
  47. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +68 -0
  48. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
  49. package/dist/feedback/ProgressBar/index.d.ts +2 -0
  50. package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
  51. package/dist/feedback/ProgressBar/index.js +1 -0
  52. package/dist/feedback/Skeleton/Skeleton.svelte +568 -0
  53. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +54 -0
  54. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
  55. package/dist/feedback/Skeleton/index.d.ts +2 -0
  56. package/dist/feedback/Skeleton/index.d.ts.map +1 -0
  57. package/dist/feedback/Skeleton/index.js +1 -0
  58. package/dist/feedback/Spinner/Spinner.svelte +434 -0
  59. package/dist/feedback/Spinner/Spinner.svelte.d.ts +49 -0
  60. package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -0
  61. package/dist/feedback/Spinner/index.d.ts +2 -0
  62. package/dist/feedback/Spinner/index.d.ts.map +1 -0
  63. package/dist/feedback/Spinner/index.js +1 -0
  64. package/dist/feedback/Toast/Toast.svelte +587 -0
  65. package/dist/feedback/Toast/Toast.svelte.d.ts +55 -0
  66. package/dist/feedback/Toast/Toast.svelte.d.ts.map +1 -0
  67. package/dist/feedback/Toast/ToastContainer.svelte +168 -0
  68. package/dist/feedback/Toast/ToastContainer.svelte.d.ts +28 -0
  69. package/dist/feedback/Toast/ToastContainer.svelte.d.ts.map +1 -0
  70. package/dist/feedback/Toast/index.d.ts +4 -0
  71. package/dist/feedback/Toast/index.d.ts.map +1 -0
  72. package/dist/feedback/Toast/index.js +3 -0
  73. package/dist/feedback/Toast/toast-store.d.ts +72 -0
  74. package/dist/feedback/Toast/toast-store.d.ts.map +1 -0
  75. package/dist/feedback/Toast/toast-store.js +157 -0
  76. package/dist/feedback/index.d.ts +13 -0
  77. package/dist/feedback/index.d.ts.map +1 -0
  78. package/dist/feedback/index.js +12 -0
  79. package/dist/forms/Checkbox/Checkbox.svelte +404 -0
  80. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +62 -0
  81. package/dist/forms/Checkbox/Checkbox.svelte.d.ts.map +1 -0
  82. package/dist/forms/Checkbox/index.d.ts +2 -0
  83. package/dist/forms/Checkbox/index.d.ts.map +1 -0
  84. package/dist/forms/Checkbox/index.js +1 -0
  85. package/dist/forms/FormField/FormField.svelte +299 -0
  86. package/dist/forms/FormField/FormField.svelte.d.ts +43 -0
  87. package/dist/forms/FormField/FormField.svelte.d.ts.map +1 -0
  88. package/dist/forms/FormField/index.d.ts +2 -0
  89. package/dist/forms/FormField/index.d.ts.map +1 -0
  90. package/dist/forms/FormField/index.js +1 -0
  91. package/dist/forms/RadioGroup/RadioGroup.svelte +418 -0
  92. package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts +70 -0
  93. package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts.map +1 -0
  94. package/dist/forms/RadioGroup/index.d.ts +2 -0
  95. package/dist/forms/RadioGroup/index.d.ts.map +1 -0
  96. package/dist/forms/RadioGroup/index.js +1 -0
  97. package/dist/forms/Select/Select.svelte +548 -0
  98. package/dist/forms/Select/Select.svelte.d.ts +74 -0
  99. package/dist/forms/Select/Select.svelte.d.ts.map +1 -0
  100. package/dist/forms/Select/index.d.ts +2 -0
  101. package/dist/forms/Select/index.d.ts.map +1 -0
  102. package/dist/forms/Select/index.js +1 -0
  103. package/dist/forms/TextInput/TextInput.svelte +628 -0
  104. package/dist/forms/TextInput/TextInput.svelte.d.ts +97 -0
  105. package/dist/forms/TextInput/TextInput.svelte.d.ts.map +1 -0
  106. package/dist/forms/TextInput/index.d.ts +2 -0
  107. package/dist/forms/TextInput/index.d.ts.map +1 -0
  108. package/dist/forms/TextInput/index.js +1 -0
  109. package/dist/forms/Textarea/Textarea.svelte +587 -0
  110. package/dist/forms/Textarea/Textarea.svelte.d.ts +71 -0
  111. package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
  112. package/dist/forms/Textarea/index.d.ts +2 -0
  113. package/dist/forms/Textarea/index.d.ts.map +1 -0
  114. package/dist/forms/Textarea/index.js +1 -0
  115. package/dist/forms/index.d.ts +13 -0
  116. package/dist/forms/index.d.ts.map +1 -0
  117. package/dist/forms/index.js +12 -0
  118. package/dist/index.d.ts +37 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +65 -0
  121. package/dist/layout/Card/Card.svelte +316 -0
  122. package/dist/layout/Card/Card.svelte.d.ts +63 -0
  123. package/dist/layout/Card/Card.svelte.d.ts.map +1 -0
  124. package/dist/layout/Card/index.d.ts +2 -0
  125. package/dist/layout/Card/index.d.ts.map +1 -0
  126. package/dist/layout/Card/index.js +1 -0
  127. package/dist/layout/Container/Container.svelte +252 -0
  128. package/dist/layout/Container/Container.svelte.d.ts +50 -0
  129. package/dist/layout/Container/Container.svelte.d.ts.map +1 -0
  130. package/dist/layout/Container/index.d.ts +2 -0
  131. package/dist/layout/Container/index.d.ts.map +1 -0
  132. package/dist/layout/Container/index.js +1 -0
  133. package/dist/layout/index.d.ts +8 -0
  134. package/dist/layout/index.d.ts.map +1 -0
  135. package/dist/layout/index.js +7 -0
  136. package/dist/navigation/StepIndicator/StepIndicator.svelte +601 -0
  137. package/dist/navigation/StepIndicator/StepIndicator.svelte.d.ts +70 -0
  138. package/dist/navigation/StepIndicator/StepIndicator.svelte.d.ts.map +1 -0
  139. package/dist/navigation/StepIndicator/index.d.ts +2 -0
  140. package/dist/navigation/StepIndicator/index.d.ts.map +1 -0
  141. package/dist/navigation/StepIndicator/index.js +1 -0
  142. package/dist/navigation/index.d.ts +7 -0
  143. package/dist/navigation/index.d.ts.map +1 -0
  144. package/dist/navigation/index.js +6 -0
  145. package/dist/primitives/Badge/Badge.svelte +365 -0
  146. package/dist/primitives/Badge/Badge.svelte.d.ts +39 -0
  147. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -0
  148. package/dist/primitives/Badge/index.d.ts +2 -0
  149. package/dist/primitives/Badge/index.d.ts.map +1 -0
  150. package/dist/primitives/Badge/index.js +1 -0
  151. package/dist/primitives/Button/Button.svelte +430 -0
  152. package/dist/primitives/Button/Button.svelte.d.ts +50 -0
  153. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -0
  154. package/dist/primitives/Button/index.d.ts +2 -0
  155. package/dist/primitives/Button/index.d.ts.map +1 -0
  156. package/dist/primitives/Button/index.js +1 -0
  157. package/dist/primitives/index.d.ts +9 -0
  158. package/dist/primitives/index.d.ts.map +1 -0
  159. package/dist/primitives/index.js +8 -0
  160. package/dist/routes/+layout.svelte +12 -0
  161. package/dist/routes/+layout.svelte.d.ts +12 -0
  162. package/dist/routes/+layout.svelte.d.ts.map +1 -0
  163. package/dist/routes/+page.svelte +53 -0
  164. package/dist/routes/+page.svelte.d.ts +27 -0
  165. package/dist/routes/+page.svelte.d.ts.map +1 -0
  166. package/dist/styles/tokens.css +399 -0
  167. package/dist/types/index.d.ts +175 -0
  168. package/dist/types/index.d.ts.map +1 -0
  169. package/dist/types/index.js +7 -0
  170. package/dist/utils/accessibility.d.ts +103 -0
  171. package/dist/utils/accessibility.d.ts.map +1 -0
  172. package/dist/utils/accessibility.js +202 -0
  173. package/dist/utils/cn.d.ts +71 -0
  174. package/dist/utils/cn.d.ts.map +1 -0
  175. package/dist/utils/cn.js +61 -0
  176. package/dist/utils/form-styles.d.ts +76 -0
  177. package/dist/utils/form-styles.d.ts.map +1 -0
  178. package/dist/utils/form-styles.js +95 -0
  179. package/dist/utils/index.d.ts +10 -0
  180. package/dist/utils/index.d.ts.map +1 -0
  181. package/dist/utils/index.js +13 -0
  182. package/dist/utils/keyboard.d.ts +94 -0
  183. package/dist/utils/keyboard.d.ts.map +1 -0
  184. package/dist/utils/keyboard.js +179 -0
  185. package/package.json +119 -0
@@ -0,0 +1,377 @@
1
+ <!--
2
+ @component EmptyState
3
+
4
+ A world-class empty state component for displaying zero-data states with
5
+ contextual messaging, illustrations, and clear calls-to-action.
6
+ Designed for healthcare applications where empty states should guide users
7
+ without creating confusion or anxiety.
8
+
9
+ Features:
10
+ - Multiple visual variants (default, search, error, first-use, success)
11
+ - Custom illustrations/icons
12
+ - Primary and secondary actions
13
+ - Compact mode for inline use
14
+ - Professional, calming design
15
+
16
+ @example
17
+ <EmptyState
18
+ title="No patients found"
19
+ description="Try adjusting your search criteria"
20
+ />
21
+
22
+ @example
23
+ <EmptyState
24
+ variant="first-use"
25
+ title="Welcome to Patient Records"
26
+ description="Get started by adding your first patient"
27
+ >
28
+ {#snippet action()}
29
+ <Button>Add Patient</Button>
30
+ {/snippet}
31
+ </EmptyState>
32
+ -->
33
+ <script lang="ts">
34
+ import type { Snippet } from 'svelte';
35
+ import {
36
+ Inbox,
37
+ Search,
38
+ AlertCircle,
39
+ Sparkles,
40
+ CheckCircle2,
41
+ FileX
42
+ } from 'lucide-svelte';
43
+
44
+ type EmptyStateSize = 'sm' | 'md' | 'lg';
45
+ type EmptyStateVariant = 'default' | 'search' | 'error' | 'first-use' | 'success' | 'no-results';
46
+
47
+ interface Props {
48
+ /** Title text */
49
+ title: string;
50
+ /** Description text */
51
+ description?: string;
52
+ /** Size variant */
53
+ size?: EmptyStateSize;
54
+ /** Visual variant - determines icon and styling */
55
+ variant?: EmptyStateVariant;
56
+ /** Custom icon snippet (overrides variant icon) */
57
+ icon?: Snippet;
58
+ /** Primary action button/content snippet */
59
+ action?: Snippet;
60
+ /** Secondary action button/content snippet */
61
+ secondaryAction?: Snippet;
62
+ /** Whether to show a subtle background */
63
+ showBackground?: boolean;
64
+ /** Whether to use compact horizontal layout */
65
+ compact?: boolean;
66
+ /** Additional CSS classes */
67
+ class?: string;
68
+ /** ID for the element */
69
+ id?: string;
70
+ }
71
+
72
+ let {
73
+ title,
74
+ description = '',
75
+ size = 'md',
76
+ variant = 'default',
77
+ icon,
78
+ action,
79
+ secondaryAction,
80
+ showBackground = false,
81
+ compact = false,
82
+ class: className = '',
83
+ id
84
+ }: Props = $props();
85
+
86
+ // Size configurations with refined spacing
87
+ const sizeConfig: Record<
88
+ EmptyStateSize,
89
+ {
90
+ iconSize: number;
91
+ iconWrapperSize: string;
92
+ titleClass: string;
93
+ descriptionClass: string;
94
+ contentMaxWidth: string;
95
+ contentGap: string;
96
+ }
97
+ > = {
98
+ sm: {
99
+ iconSize: 22,
100
+ iconWrapperSize: '2.75rem',
101
+ titleClass: 'empty-state-title-sm',
102
+ descriptionClass: 'empty-state-desc-sm',
103
+ contentMaxWidth: '18rem',
104
+ contentGap: '0.25rem'
105
+ },
106
+ md: {
107
+ iconSize: 28,
108
+ iconWrapperSize: '3.5rem',
109
+ titleClass: 'empty-state-title-md',
110
+ descriptionClass: 'empty-state-desc-md',
111
+ contentMaxWidth: '22rem',
112
+ contentGap: '0.375rem'
113
+ },
114
+ lg: {
115
+ iconSize: 36,
116
+ iconWrapperSize: '4.5rem',
117
+ titleClass: 'empty-state-title-lg',
118
+ descriptionClass: 'empty-state-desc-lg',
119
+ contentMaxWidth: '26rem',
120
+ contentGap: '0.5rem'
121
+ }
122
+ };
123
+
124
+ // Variant configurations
125
+ const variantConfig: Record<
126
+ EmptyStateVariant,
127
+ {
128
+ iconBg: string;
129
+ iconColor: string;
130
+ }
131
+ > = {
132
+ default: {
133
+ iconBg: 'var(--ui-bg-tertiary)',
134
+ iconColor: 'var(--ui-text-tertiary)'
135
+ },
136
+ search: {
137
+ iconBg: 'rgb(var(--ui-color-info) / 0.12)',
138
+ iconColor: 'rgb(var(--ui-color-info))'
139
+ },
140
+ error: {
141
+ iconBg: 'rgb(var(--ui-color-error) / 0.12)',
142
+ iconColor: 'rgb(var(--ui-color-error))'
143
+ },
144
+ 'first-use': {
145
+ iconBg: 'rgb(var(--ui-color-primary) / 0.12)',
146
+ iconColor: 'rgb(var(--ui-color-primary))'
147
+ },
148
+ success: {
149
+ iconBg: 'rgb(var(--ui-color-success) / 0.12)',
150
+ iconColor: 'rgb(var(--ui-color-success))'
151
+ },
152
+ 'no-results': {
153
+ iconBg: 'rgb(var(--ui-color-warning) / 0.12)',
154
+ iconColor: 'rgb(var(--ui-color-warning))'
155
+ }
156
+ };
157
+
158
+ const config = $derived(sizeConfig[size]);
159
+ const variantStyle = $derived(variantConfig[variant]);
160
+
161
+ // Get default icon based on variant
162
+ const getDefaultIcon = () => {
163
+ switch (variant) {
164
+ case 'search':
165
+ return Search;
166
+ case 'error':
167
+ return AlertCircle;
168
+ case 'first-use':
169
+ return Sparkles;
170
+ case 'success':
171
+ return CheckCircle2;
172
+ case 'no-results':
173
+ return FileX;
174
+ default:
175
+ return Inbox;
176
+ }
177
+ };
178
+
179
+ const DefaultIcon = $derived(getDefaultIcon());
180
+ </script>
181
+
182
+ <div
183
+ {id}
184
+ class="empty-state empty-state-{size} {className}"
185
+ class:empty-state-compact={compact}
186
+ class:empty-state-bg={showBackground}
187
+ role="status"
188
+ >
189
+ <!-- Icon -->
190
+ <div
191
+ class="empty-state-icon"
192
+ style="
193
+ width: {config.iconWrapperSize};
194
+ height: {config.iconWrapperSize};
195
+ background-color: {variantStyle.iconBg};
196
+ color: {variantStyle.iconColor};
197
+ "
198
+ aria-hidden="true"
199
+ >
200
+ {#if icon}
201
+ {@render icon()}
202
+ {:else}
203
+ {@const Icon = DefaultIcon}
204
+ <Icon size={config.iconSize} strokeWidth={1.5} />
205
+ {/if}
206
+ </div>
207
+
208
+ <!-- Content -->
209
+ <div
210
+ class="empty-state-content"
211
+ style="max-width: {config.contentMaxWidth}; gap: {config.contentGap};"
212
+ >
213
+ <h3 class="empty-state-title {config.titleClass}">
214
+ {title}
215
+ </h3>
216
+
217
+ {#if description}
218
+ <p class="empty-state-description {config.descriptionClass}">
219
+ {description}
220
+ </p>
221
+ {/if}
222
+ </div>
223
+
224
+ <!-- Actions -->
225
+ {#if action || secondaryAction}
226
+ <div class="empty-state-actions">
227
+ {#if action}
228
+ {@render action()}
229
+ {/if}
230
+ {#if secondaryAction}
231
+ {@render secondaryAction()}
232
+ {/if}
233
+ </div>
234
+ {/if}
235
+ </div>
236
+
237
+ <style>
238
+ /* ========================================
239
+ BASE STYLES
240
+ ======================================== */
241
+ .empty-state {
242
+ display: flex;
243
+ flex-direction: column;
244
+ align-items: center;
245
+ justify-content: center;
246
+ text-align: center;
247
+ }
248
+
249
+ /* Size-specific padding */
250
+ .empty-state-sm {
251
+ padding: 1.5rem 1rem;
252
+ gap: 0.75rem;
253
+ }
254
+
255
+ .empty-state-md {
256
+ padding: 2rem 1.5rem;
257
+ gap: 1rem;
258
+ }
259
+
260
+ .empty-state-lg {
261
+ padding: 3rem 2rem;
262
+ gap: 1.25rem;
263
+ }
264
+
265
+ /* ========================================
266
+ COMPACT VARIANT (Horizontal)
267
+ ======================================== */
268
+ .empty-state-compact {
269
+ flex-direction: row;
270
+ text-align: left;
271
+ padding: 1rem 1.25rem;
272
+ gap: 1rem;
273
+ }
274
+
275
+ .empty-state-compact .empty-state-icon {
276
+ width: 2.5rem !important;
277
+ height: 2.5rem !important;
278
+ }
279
+
280
+ .empty-state-compact .empty-state-content {
281
+ max-width: none !important;
282
+ gap: 0.125rem !important;
283
+ flex: 1;
284
+ }
285
+
286
+ .empty-state-compact .empty-state-actions {
287
+ margin-top: 0;
288
+ margin-left: auto;
289
+ flex-shrink: 0;
290
+ }
291
+
292
+ /* ========================================
293
+ BACKGROUND VARIANT
294
+ ======================================== */
295
+ .empty-state-bg {
296
+ background-color: var(--ui-bg-secondary);
297
+ border: 1px solid var(--ui-border-default);
298
+ border-radius: 0.75rem;
299
+ }
300
+
301
+ /* ========================================
302
+ ICON STYLES
303
+ ======================================== */
304
+ .empty-state-icon {
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+ border-radius: 9999px;
309
+ flex-shrink: 0;
310
+ }
311
+
312
+ /* ========================================
313
+ CONTENT STYLES
314
+ ======================================== */
315
+ .empty-state-content {
316
+ display: flex;
317
+ flex-direction: column;
318
+ align-items: center;
319
+ }
320
+
321
+ .empty-state-compact .empty-state-content {
322
+ align-items: flex-start;
323
+ }
324
+
325
+ .empty-state-title {
326
+ font-weight: 600;
327
+ color: var(--ui-text-primary);
328
+ margin: 0;
329
+ line-height: 1.35;
330
+ }
331
+
332
+ .empty-state-title-sm {
333
+ font-size: 0.9375rem;
334
+ }
335
+
336
+ .empty-state-title-md {
337
+ font-size: 1.0625rem;
338
+ }
339
+
340
+ .empty-state-title-lg {
341
+ font-size: 1.25rem;
342
+ }
343
+
344
+ .empty-state-description {
345
+ color: var(--ui-text-secondary);
346
+ margin: 0;
347
+ line-height: 1.5;
348
+ }
349
+
350
+ .empty-state-desc-sm {
351
+ font-size: 0.8125rem;
352
+ }
353
+
354
+ .empty-state-desc-md {
355
+ font-size: 0.875rem;
356
+ }
357
+
358
+ .empty-state-desc-lg {
359
+ font-size: 0.9375rem;
360
+ }
361
+
362
+ /* ========================================
363
+ ACTIONS STYLES
364
+ ======================================== */
365
+ .empty-state-actions {
366
+ display: flex;
367
+ flex-wrap: wrap;
368
+ align-items: center;
369
+ justify-content: center;
370
+ gap: 0.625rem;
371
+ margin-top: 0.25rem;
372
+ }
373
+
374
+ .empty-state-compact .empty-state-actions {
375
+ justify-content: flex-start;
376
+ }
377
+ </style>
@@ -0,0 +1,63 @@
1
+ import type { Snippet } from 'svelte';
2
+ type EmptyStateSize = 'sm' | 'md' | 'lg';
3
+ type EmptyStateVariant = 'default' | 'search' | 'error' | 'first-use' | 'success' | 'no-results';
4
+ interface Props {
5
+ /** Title text */
6
+ title: string;
7
+ /** Description text */
8
+ description?: string;
9
+ /** Size variant */
10
+ size?: EmptyStateSize;
11
+ /** Visual variant - determines icon and styling */
12
+ variant?: EmptyStateVariant;
13
+ /** Custom icon snippet (overrides variant icon) */
14
+ icon?: Snippet;
15
+ /** Primary action button/content snippet */
16
+ action?: Snippet;
17
+ /** Secondary action button/content snippet */
18
+ secondaryAction?: Snippet;
19
+ /** Whether to show a subtle background */
20
+ showBackground?: boolean;
21
+ /** Whether to use compact horizontal layout */
22
+ compact?: boolean;
23
+ /** Additional CSS classes */
24
+ class?: string;
25
+ /** ID for the element */
26
+ id?: string;
27
+ }
28
+ /**
29
+ * EmptyState
30
+ *
31
+ * A world-class empty state component for displaying zero-data states with
32
+ * contextual messaging, illustrations, and clear calls-to-action.
33
+ * Designed for healthcare applications where empty states should guide users
34
+ * without creating confusion or anxiety.
35
+ *
36
+ * Features:
37
+ * - Multiple visual variants (default, search, error, first-use, success)
38
+ * - Custom illustrations/icons
39
+ * - Primary and secondary actions
40
+ * - Compact mode for inline use
41
+ * - Professional, calming design
42
+ *
43
+ * @example
44
+ * <EmptyState
45
+ * title="No patients found"
46
+ * description="Try adjusting your search criteria"
47
+ * />
48
+ *
49
+ * @example
50
+ * <EmptyState
51
+ * variant="first-use"
52
+ * title="Welcome to Patient Records"
53
+ * description="Get started by adding your first patient"
54
+ * >
55
+ * {#snippet action()}
56
+ * <Button>Add Patient</Button>
57
+ * {/snippet}
58
+ * </EmptyState>
59
+ */
60
+ declare const EmptyState: import("svelte").Component<Props, {}, "">;
61
+ type EmptyState = ReturnType<typeof EmptyState>;
62
+ export default EmptyState;
63
+ //# sourceMappingURL=EmptyState.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.svelte.d.ts","sourceRoot":"","sources":["../../../src/feedback/EmptyState/EmptyState.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAWrC,KAAK,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACzC,KAAK,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC;AAEjG,UAAU,KAAK;IACd,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,mDAAmD;IACnD,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,mDAAmD;IACnD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0CAA0C;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAqKF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as EmptyState } from './EmptyState.svelte';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/feedback/EmptyState/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as EmptyState } from './EmptyState.svelte';