@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.
- package/README.md +262 -0
- package/dist/app.css +2 -0
- package/dist/app.html +12 -0
- package/dist/data-display/DataTable/DataTable.svelte +773 -0
- package/dist/data-display/DataTable/DataTable.svelte.d.ts +120 -0
- package/dist/data-display/DataTable/DataTable.svelte.d.ts.map +1 -0
- package/dist/data-display/DataTable/index.d.ts +2 -0
- package/dist/data-display/DataTable/index.d.ts.map +1 -0
- package/dist/data-display/DataTable/index.js +1 -0
- package/dist/data-display/StatCard/StatCard.svelte +409 -0
- package/dist/data-display/StatCard/StatCard.svelte.d.ts +63 -0
- package/dist/data-display/StatCard/StatCard.svelte.d.ts.map +1 -0
- package/dist/data-display/StatCard/index.d.ts +2 -0
- package/dist/data-display/StatCard/index.d.ts.map +1 -0
- package/dist/data-display/StatCard/index.js +1 -0
- package/dist/data-display/index.d.ts +8 -0
- package/dist/data-display/index.d.ts.map +1 -0
- package/dist/data-display/index.js +7 -0
- package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte +693 -0
- package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte.d.ts +66 -0
- package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte.d.ts.map +1 -0
- package/dist/dialogs/ConfirmDialog/index.d.ts +2 -0
- package/dist/dialogs/ConfirmDialog/index.d.ts.map +1 -0
- package/dist/dialogs/ConfirmDialog/index.js +1 -0
- package/dist/dialogs/Modal/Modal.svelte +441 -0
- package/dist/dialogs/Modal/Modal.svelte.d.ts +69 -0
- package/dist/dialogs/Modal/Modal.svelte.d.ts.map +1 -0
- package/dist/dialogs/Modal/index.d.ts +2 -0
- package/dist/dialogs/Modal/index.d.ts.map +1 -0
- package/dist/dialogs/Modal/index.js +1 -0
- package/dist/dialogs/index.d.ts +8 -0
- package/dist/dialogs/index.d.ts.map +1 -0
- package/dist/dialogs/index.js +7 -0
- package/dist/feedback/Alert/Alert.svelte +565 -0
- package/dist/feedback/Alert/Alert.svelte.d.ts +60 -0
- package/dist/feedback/Alert/Alert.svelte.d.ts.map +1 -0
- package/dist/feedback/Alert/index.d.ts +2 -0
- package/dist/feedback/Alert/index.d.ts.map +1 -0
- package/dist/feedback/Alert/index.js +1 -0
- package/dist/feedback/EmptyState/EmptyState.svelte +377 -0
- package/dist/feedback/EmptyState/EmptyState.svelte.d.ts +63 -0
- package/dist/feedback/EmptyState/EmptyState.svelte.d.ts.map +1 -0
- package/dist/feedback/EmptyState/index.d.ts +2 -0
- package/dist/feedback/EmptyState/index.d.ts.map +1 -0
- package/dist/feedback/EmptyState/index.js +1 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte +585 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +68 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.d.ts +2 -0
- package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.js +1 -0
- package/dist/feedback/Skeleton/Skeleton.svelte +568 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +54 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.d.ts +2 -0
- package/dist/feedback/Skeleton/index.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.js +1 -0
- package/dist/feedback/Spinner/Spinner.svelte +434 -0
- package/dist/feedback/Spinner/Spinner.svelte.d.ts +49 -0
- package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -0
- package/dist/feedback/Spinner/index.d.ts +2 -0
- package/dist/feedback/Spinner/index.d.ts.map +1 -0
- package/dist/feedback/Spinner/index.js +1 -0
- package/dist/feedback/Toast/Toast.svelte +587 -0
- package/dist/feedback/Toast/Toast.svelte.d.ts +55 -0
- package/dist/feedback/Toast/Toast.svelte.d.ts.map +1 -0
- package/dist/feedback/Toast/ToastContainer.svelte +168 -0
- package/dist/feedback/Toast/ToastContainer.svelte.d.ts +28 -0
- package/dist/feedback/Toast/ToastContainer.svelte.d.ts.map +1 -0
- package/dist/feedback/Toast/index.d.ts +4 -0
- package/dist/feedback/Toast/index.d.ts.map +1 -0
- package/dist/feedback/Toast/index.js +3 -0
- package/dist/feedback/Toast/toast-store.d.ts +72 -0
- package/dist/feedback/Toast/toast-store.d.ts.map +1 -0
- package/dist/feedback/Toast/toast-store.js +157 -0
- package/dist/feedback/index.d.ts +13 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +12 -0
- package/dist/forms/Checkbox/Checkbox.svelte +404 -0
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts +62 -0
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts.map +1 -0
- package/dist/forms/Checkbox/index.d.ts +2 -0
- package/dist/forms/Checkbox/index.d.ts.map +1 -0
- package/dist/forms/Checkbox/index.js +1 -0
- package/dist/forms/FormField/FormField.svelte +299 -0
- package/dist/forms/FormField/FormField.svelte.d.ts +43 -0
- package/dist/forms/FormField/FormField.svelte.d.ts.map +1 -0
- package/dist/forms/FormField/index.d.ts +2 -0
- package/dist/forms/FormField/index.d.ts.map +1 -0
- package/dist/forms/FormField/index.js +1 -0
- package/dist/forms/RadioGroup/RadioGroup.svelte +418 -0
- package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts +70 -0
- package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts.map +1 -0
- package/dist/forms/RadioGroup/index.d.ts +2 -0
- package/dist/forms/RadioGroup/index.d.ts.map +1 -0
- package/dist/forms/RadioGroup/index.js +1 -0
- package/dist/forms/Select/Select.svelte +548 -0
- package/dist/forms/Select/Select.svelte.d.ts +74 -0
- package/dist/forms/Select/Select.svelte.d.ts.map +1 -0
- package/dist/forms/Select/index.d.ts +2 -0
- package/dist/forms/Select/index.d.ts.map +1 -0
- package/dist/forms/Select/index.js +1 -0
- package/dist/forms/TextInput/TextInput.svelte +628 -0
- package/dist/forms/TextInput/TextInput.svelte.d.ts +97 -0
- package/dist/forms/TextInput/TextInput.svelte.d.ts.map +1 -0
- package/dist/forms/TextInput/index.d.ts +2 -0
- package/dist/forms/TextInput/index.d.ts.map +1 -0
- package/dist/forms/TextInput/index.js +1 -0
- package/dist/forms/Textarea/Textarea.svelte +587 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts +71 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
- package/dist/forms/Textarea/index.d.ts +2 -0
- package/dist/forms/Textarea/index.d.ts.map +1 -0
- package/dist/forms/Textarea/index.js +1 -0
- package/dist/forms/index.d.ts +13 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +12 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/layout/Card/Card.svelte +316 -0
- package/dist/layout/Card/Card.svelte.d.ts +63 -0
- package/dist/layout/Card/Card.svelte.d.ts.map +1 -0
- package/dist/layout/Card/index.d.ts +2 -0
- package/dist/layout/Card/index.d.ts.map +1 -0
- package/dist/layout/Card/index.js +1 -0
- package/dist/layout/Container/Container.svelte +252 -0
- package/dist/layout/Container/Container.svelte.d.ts +50 -0
- package/dist/layout/Container/Container.svelte.d.ts.map +1 -0
- package/dist/layout/Container/index.d.ts +2 -0
- package/dist/layout/Container/index.d.ts.map +1 -0
- package/dist/layout/Container/index.js +1 -0
- package/dist/layout/index.d.ts +8 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +7 -0
- package/dist/navigation/StepIndicator/StepIndicator.svelte +601 -0
- package/dist/navigation/StepIndicator/StepIndicator.svelte.d.ts +70 -0
- package/dist/navigation/StepIndicator/StepIndicator.svelte.d.ts.map +1 -0
- package/dist/navigation/StepIndicator/index.d.ts +2 -0
- package/dist/navigation/StepIndicator/index.d.ts.map +1 -0
- package/dist/navigation/StepIndicator/index.js +1 -0
- package/dist/navigation/index.d.ts +7 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +6 -0
- package/dist/primitives/Badge/Badge.svelte +365 -0
- package/dist/primitives/Badge/Badge.svelte.d.ts +39 -0
- package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -0
- package/dist/primitives/Badge/index.d.ts +2 -0
- package/dist/primitives/Badge/index.d.ts.map +1 -0
- package/dist/primitives/Badge/index.js +1 -0
- package/dist/primitives/Button/Button.svelte +430 -0
- package/dist/primitives/Button/Button.svelte.d.ts +50 -0
- package/dist/primitives/Button/Button.svelte.d.ts.map +1 -0
- package/dist/primitives/Button/index.d.ts +2 -0
- package/dist/primitives/Button/index.d.ts.map +1 -0
- package/dist/primitives/Button/index.js +1 -0
- package/dist/primitives/index.d.ts +9 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +8 -0
- package/dist/routes/+layout.svelte +12 -0
- package/dist/routes/+layout.svelte.d.ts +12 -0
- package/dist/routes/+layout.svelte.d.ts.map +1 -0
- package/dist/routes/+page.svelte +53 -0
- package/dist/routes/+page.svelte.d.ts +27 -0
- package/dist/routes/+page.svelte.d.ts.map +1 -0
- package/dist/styles/tokens.css +399 -0
- package/dist/types/index.d.ts +175 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/utils/accessibility.d.ts +103 -0
- package/dist/utils/accessibility.d.ts.map +1 -0
- package/dist/utils/accessibility.js +202 -0
- package/dist/utils/cn.d.ts +71 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +61 -0
- package/dist/utils/form-styles.d.ts +76 -0
- package/dist/utils/form-styles.d.ts.map +1 -0
- package/dist/utils/form-styles.js +95 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/keyboard.d.ts +94 -0
- package/dist/utils/keyboard.d.ts.map +1 -0
- package/dist/utils/keyboard.js +179 -0
- 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 @@
|
|
|
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';
|