@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,404 @@
1
+ <!--
2
+ @component Checkbox
3
+
4
+ An accessible checkbox component with support for labels,
5
+ descriptions, and indeterminate state.
6
+
7
+ @example
8
+ <Checkbox
9
+ id="consent"
10
+ label="I agree to the terms"
11
+ checked={hasAgreed}
12
+ onchange={(e) => hasAgreed = e.target.checked}
13
+ />
14
+
15
+ @example
16
+ <Checkbox
17
+ id="newsletter"
18
+ label="Subscribe to newsletter"
19
+ description="Receive weekly updates about new features"
20
+ checked={subscribed}
21
+ onchange={(e) => subscribed = e.target.checked}
22
+ />
23
+ -->
24
+ <script lang="ts">
25
+ import { Check, Minus } from 'lucide-svelte';
26
+ import { cn } from '../../utils/cn.js';
27
+ import { generateId } from '../../utils/keyboard.js';
28
+
29
+ type CheckboxSize = 'sm' | 'md' | 'lg';
30
+
31
+ interface Props {
32
+ /** Unique identifier for the checkbox */
33
+ id?: string;
34
+ /** Form field name */
35
+ name?: string;
36
+ /** Value attribute for form submission */
37
+ value?: string;
38
+ /** Label text for the checkbox */
39
+ label: string;
40
+ /** Whether the checkbox is checked */
41
+ checked?: boolean;
42
+ /** Description text below the label */
43
+ description?: string;
44
+ /** Whether the checkbox is required */
45
+ required?: boolean;
46
+ /** Whether the checkbox is disabled */
47
+ disabled?: boolean;
48
+ /** Error message to display */
49
+ error?: string;
50
+ /** Indeterminate state (partially checked) */
51
+ indeterminate?: boolean;
52
+ /** Size of the checkbox */
53
+ size?: CheckboxSize;
54
+ /** Hide the label visually (still accessible to screen readers) */
55
+ hideLabel?: boolean;
56
+ /** Additional CSS classes */
57
+ class?: string;
58
+ /** Change handler */
59
+ onchange?: (event: Event) => void;
60
+ /** Test ID for e2e testing (Playwright, Cypress) */
61
+ testId?: string;
62
+ /** Show validation state immediately without waiting for interaction */
63
+ validateOnMount?: boolean;
64
+ }
65
+
66
+ let {
67
+ id = generateId('checkbox'),
68
+ name,
69
+ value,
70
+ label,
71
+ checked = false,
72
+ description = '',
73
+ required = false,
74
+ disabled = false,
75
+ error = '',
76
+ indeterminate = false,
77
+ size = 'md',
78
+ hideLabel = false,
79
+ class: className = '',
80
+ onchange,
81
+ testId,
82
+ validateOnMount = false
83
+ }: Props = $props();
84
+
85
+ let inputElement: HTMLInputElement;
86
+ let hasInteracted = $state(false);
87
+
88
+ // Set indeterminate state on input element
89
+ $effect(() => {
90
+ if (inputElement) {
91
+ inputElement.indeterminate = indeterminate;
92
+ }
93
+ });
94
+
95
+ const showChecked = $derived(checked && !indeterminate);
96
+ const shouldValidate = $derived(hasInteracted || validateOnMount);
97
+ const showError = $derived(shouldValidate && !!error);
98
+ const errorId = $derived(`${id}-error`);
99
+ const descriptionId = $derived(`${id}-description`);
100
+
101
+ const ariaDescribedBy = $derived(
102
+ [showError && errorId, description && descriptionId].filter(Boolean).join(' ') || undefined
103
+ );
104
+
105
+ function handleChange(e: Event) {
106
+ hasInteracted = true;
107
+ onchange?.(e);
108
+ }
109
+
110
+ // Icon sizes based on checkbox size
111
+ const iconSizes: Record<CheckboxSize, number> = {
112
+ sm: 12,
113
+ md: 14,
114
+ lg: 16
115
+ };
116
+ </script>
117
+
118
+ <div class={cn('checkbox-wrapper', `checkbox-${size}`, disabled && 'checkbox-disabled', className)}>
119
+ <label for={id} class="checkbox-label">
120
+ <!-- Checkbox input (visually hidden) -->
121
+ <input
122
+ bind:this={inputElement}
123
+ {id}
124
+ {name}
125
+ {value}
126
+ type="checkbox"
127
+ {checked}
128
+ {disabled}
129
+ {required}
130
+ aria-invalid={showError}
131
+ aria-describedby={ariaDescribedBy}
132
+ class="checkbox-input"
133
+ data-testid={testId}
134
+ onchange={handleChange}
135
+ />
136
+
137
+ <!-- Custom checkbox visual -->
138
+ <span
139
+ class={cn(
140
+ 'checkbox-box',
141
+ (checked || indeterminate) && 'checkbox-box-checked',
142
+ showError && 'checkbox-box-error'
143
+ )}
144
+ aria-hidden="true"
145
+ >
146
+ {#if showChecked}
147
+ <Check size={iconSizes[size]} strokeWidth={3} />
148
+ {:else if indeterminate}
149
+ <Minus size={iconSizes[size]} strokeWidth={3} />
150
+ {/if}
151
+ </span>
152
+
153
+ <!-- Label and description -->
154
+ <span class="checkbox-content" class:sr-only={hideLabel}>
155
+ <span class="checkbox-text">
156
+ {label}
157
+ {#if required}
158
+ <span class="checkbox-required" aria-hidden="true">*</span>
159
+ {/if}
160
+ </span>
161
+ {#if description && !hideLabel}
162
+ <span id={descriptionId} class="checkbox-description">
163
+ {description}
164
+ </span>
165
+ {/if}
166
+ </span>
167
+ </label>
168
+
169
+ <!-- Error message -->
170
+ {#if showError}
171
+ <p id={errorId} class="checkbox-error" role="alert">
172
+ {error}
173
+ </p>
174
+ {/if}
175
+ </div>
176
+
177
+ <style>
178
+ /* ========================================
179
+ BASE WRAPPER
180
+ ======================================== */
181
+ .checkbox-wrapper {
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: 0.25rem;
185
+ }
186
+
187
+ .checkbox-disabled {
188
+ opacity: 0.6;
189
+ }
190
+
191
+ /* ========================================
192
+ LABEL (clickable area)
193
+ ======================================== */
194
+ .checkbox-label {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: 0.5rem;
198
+ cursor: pointer;
199
+ user-select: none;
200
+ }
201
+
202
+ /* When there's a description, align to top */
203
+ .checkbox-label:has(.checkbox-description) {
204
+ align-items: flex-start;
205
+ }
206
+
207
+ .checkbox-label:has(.checkbox-description) .checkbox-box {
208
+ margin-top: 0.125rem;
209
+ }
210
+
211
+ .checkbox-disabled .checkbox-label {
212
+ cursor: not-allowed;
213
+ }
214
+
215
+ /* ========================================
216
+ HIDDEN INPUT
217
+ ======================================== */
218
+ .checkbox-input {
219
+ position: absolute;
220
+ width: 1px;
221
+ height: 1px;
222
+ padding: 0;
223
+ margin: -1px;
224
+ overflow: hidden;
225
+ clip: rect(0, 0, 0, 0);
226
+ white-space: nowrap;
227
+ border: 0;
228
+ }
229
+
230
+ /* ========================================
231
+ CHECKBOX BOX
232
+ ======================================== */
233
+ .checkbox-box {
234
+ flex-shrink: 0;
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ border: 2px solid var(--ui-border-default);
239
+ border-radius: 0.25rem;
240
+ background: var(--ui-bg-secondary);
241
+ transition: all 0.15s ease;
242
+ }
243
+
244
+ /* Size variants */
245
+ .checkbox-sm .checkbox-box {
246
+ width: 1rem;
247
+ height: 1rem;
248
+ }
249
+
250
+ .checkbox-md .checkbox-box {
251
+ width: 1.25rem;
252
+ height: 1.25rem;
253
+ }
254
+
255
+ .checkbox-lg .checkbox-box {
256
+ width: 1.5rem;
257
+ height: 1.5rem;
258
+ }
259
+
260
+ /* Checked state */
261
+ .checkbox-box-checked {
262
+ background: rgb(var(--ui-color-primary));
263
+ border-color: rgb(var(--ui-color-primary));
264
+ color: white;
265
+ }
266
+
267
+ :global([data-theme='dark']) .checkbox-box-checked {
268
+ background: rgb(var(--ui-color-primary-light));
269
+ border-color: rgb(var(--ui-color-primary-light));
270
+ }
271
+
272
+ @media (prefers-color-scheme: dark) {
273
+ :global(:root:not([data-theme='light'])) .checkbox-box-checked {
274
+ background: rgb(var(--ui-color-primary-light));
275
+ border-color: rgb(var(--ui-color-primary-light));
276
+ }
277
+ }
278
+
279
+ /* Hover state */
280
+ .checkbox-label:hover .checkbox-box:not(.checkbox-box-checked) {
281
+ border-color: rgb(var(--ui-color-primary));
282
+ }
283
+
284
+ :global([data-theme='dark']) .checkbox-label:hover .checkbox-box:not(.checkbox-box-checked) {
285
+ border-color: rgb(var(--ui-color-primary-light));
286
+ }
287
+
288
+ @media (prefers-color-scheme: dark) {
289
+ :global(:root:not([data-theme='light'])) .checkbox-label:hover .checkbox-box:not(.checkbox-box-checked) {
290
+ border-color: rgb(var(--ui-color-primary-light));
291
+ }
292
+ }
293
+
294
+ /* Focus state */
295
+ .checkbox-input:focus-visible + .checkbox-box {
296
+ box-shadow: 0 0 0 3px rgb(var(--ui-color-primary) / 0.4);
297
+ }
298
+
299
+ :global([data-theme='dark']) .checkbox-input:focus-visible + .checkbox-box {
300
+ box-shadow: 0 0 0 3px rgb(var(--ui-color-primary-light) / 0.5);
301
+ }
302
+
303
+ @media (prefers-color-scheme: dark) {
304
+ :global(:root:not([data-theme='light'])) .checkbox-input:focus-visible + .checkbox-box {
305
+ box-shadow: 0 0 0 3px rgb(var(--ui-color-primary-light) / 0.5);
306
+ }
307
+ }
308
+
309
+ /* Error state */
310
+ .checkbox-box-error {
311
+ border-color: rgb(var(--ui-color-error));
312
+ }
313
+
314
+ :global([data-theme='dark']) .checkbox-box-error {
315
+ border-color: rgb(var(--ui-color-error-light));
316
+ }
317
+
318
+ @media (prefers-color-scheme: dark) {
319
+ :global(:root:not([data-theme='light'])) .checkbox-box-error {
320
+ border-color: rgb(var(--ui-color-error-light));
321
+ }
322
+ }
323
+
324
+ /* ========================================
325
+ CONTENT (label + description)
326
+ ======================================== */
327
+ .checkbox-content {
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: 0.125rem;
331
+ }
332
+
333
+ .checkbox-text {
334
+ font-weight: 500;
335
+ color: var(--ui-text-primary);
336
+ }
337
+
338
+ .checkbox-sm .checkbox-text {
339
+ font-size: 0.875rem;
340
+ }
341
+
342
+ .checkbox-md .checkbox-text,
343
+ .checkbox-lg .checkbox-text {
344
+ font-size: 0.875rem;
345
+ }
346
+
347
+ .checkbox-lg .checkbox-text {
348
+ font-size: 1rem;
349
+ }
350
+
351
+ .checkbox-required {
352
+ color: rgb(var(--ui-color-error));
353
+ margin-left: 0.125rem;
354
+ }
355
+
356
+ :global([data-theme='dark']) .checkbox-required {
357
+ color: rgb(var(--ui-color-error-light));
358
+ }
359
+
360
+ @media (prefers-color-scheme: dark) {
361
+ :global(:root:not([data-theme='light'])) .checkbox-required {
362
+ color: rgb(var(--ui-color-error-light));
363
+ }
364
+ }
365
+
366
+ .checkbox-description {
367
+ font-size: 0.75rem;
368
+ color: var(--ui-text-tertiary);
369
+ }
370
+
371
+ /* ========================================
372
+ ERROR MESSAGE
373
+ ======================================== */
374
+ .checkbox-error {
375
+ font-size: 0.75rem;
376
+ color: rgb(var(--ui-color-error));
377
+ margin-left: 2rem;
378
+ }
379
+
380
+ :global([data-theme='dark']) .checkbox-error {
381
+ color: rgb(var(--ui-color-error-light));
382
+ }
383
+
384
+ @media (prefers-color-scheme: dark) {
385
+ :global(:root:not([data-theme='light'])) .checkbox-error {
386
+ color: rgb(var(--ui-color-error-light));
387
+ }
388
+ }
389
+
390
+ /* ========================================
391
+ SCREEN READER ONLY
392
+ ======================================== */
393
+ .sr-only {
394
+ position: absolute;
395
+ width: 1px;
396
+ height: 1px;
397
+ padding: 0;
398
+ margin: -1px;
399
+ overflow: hidden;
400
+ clip: rect(0, 0, 0, 0);
401
+ white-space: nowrap;
402
+ border: 0;
403
+ }
404
+ </style>
@@ -0,0 +1,62 @@
1
+ type CheckboxSize = 'sm' | 'md' | 'lg';
2
+ interface Props {
3
+ /** Unique identifier for the checkbox */
4
+ id?: string;
5
+ /** Form field name */
6
+ name?: string;
7
+ /** Value attribute for form submission */
8
+ value?: string;
9
+ /** Label text for the checkbox */
10
+ label: string;
11
+ /** Whether the checkbox is checked */
12
+ checked?: boolean;
13
+ /** Description text below the label */
14
+ description?: string;
15
+ /** Whether the checkbox is required */
16
+ required?: boolean;
17
+ /** Whether the checkbox is disabled */
18
+ disabled?: boolean;
19
+ /** Error message to display */
20
+ error?: string;
21
+ /** Indeterminate state (partially checked) */
22
+ indeterminate?: boolean;
23
+ /** Size of the checkbox */
24
+ size?: CheckboxSize;
25
+ /** Hide the label visually (still accessible to screen readers) */
26
+ hideLabel?: boolean;
27
+ /** Additional CSS classes */
28
+ class?: string;
29
+ /** Change handler */
30
+ onchange?: (event: Event) => void;
31
+ /** Test ID for e2e testing (Playwright, Cypress) */
32
+ testId?: string;
33
+ /** Show validation state immediately without waiting for interaction */
34
+ validateOnMount?: boolean;
35
+ }
36
+ /**
37
+ * Checkbox
38
+ *
39
+ * An accessible checkbox component with support for labels,
40
+ * descriptions, and indeterminate state.
41
+ *
42
+ * @example
43
+ * <Checkbox
44
+ * id="consent"
45
+ * label="I agree to the terms"
46
+ * checked={hasAgreed}
47
+ * onchange={(e) => hasAgreed = e.target.checked}
48
+ * />
49
+ *
50
+ * @example
51
+ * <Checkbox
52
+ * id="newsletter"
53
+ * label="Subscribe to newsletter"
54
+ * description="Receive weekly updates about new features"
55
+ * checked={subscribed}
56
+ * onchange={(e) => subscribed = e.target.checked}
57
+ * />
58
+ */
59
+ declare const Checkbox: import("svelte").Component<Props, {}, "">;
60
+ type Checkbox = ReturnType<typeof Checkbox>;
61
+ export default Checkbox;
62
+ //# sourceMappingURL=Checkbox.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.svelte.d.ts","sourceRoot":"","sources":["../../../src/forms/Checkbox/Checkbox.svelte.ts"],"names":[],"mappings":"AAQC,KAAK,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,UAAU,KAAK;IACd,yCAAyC;IACzC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AA2GF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as Checkbox } from './Checkbox.svelte';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/Checkbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as Checkbox } from './Checkbox.svelte';