sv5ui 1.3.0 → 1.5.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 (76) hide show
  1. package/README.md +16 -11
  2. package/dist/Checkbox/Checkbox.svelte +2 -11
  3. package/dist/CheckboxGroup/CheckboxGroup.svelte +2 -11
  4. package/dist/Collapsible/Collapsible.svelte +69 -0
  5. package/dist/Collapsible/Collapsible.svelte.d.ts +6 -0
  6. package/dist/Collapsible/CollapsibleTestWrapper.svelte +17 -0
  7. package/dist/Collapsible/CollapsibleTestWrapper.svelte.d.ts +4 -0
  8. package/dist/Collapsible/collapsible.types.d.ts +75 -0
  9. package/dist/Collapsible/collapsible.types.js +1 -0
  10. package/dist/Collapsible/collapsible.variants.d.ts +53 -0
  11. package/dist/Collapsible/collapsible.variants.js +21 -0
  12. package/dist/Collapsible/index.d.ts +2 -0
  13. package/dist/Collapsible/index.js +1 -0
  14. package/dist/Command/Command.svelte +183 -0
  15. package/dist/Command/Command.svelte.d.ts +6 -0
  16. package/dist/Command/CommandTestWrapper.svelte +13 -0
  17. package/dist/Command/CommandTestWrapper.svelte.d.ts +4 -0
  18. package/dist/Command/command.types.d.ts +98 -0
  19. package/dist/Command/command.types.js +1 -0
  20. package/dist/Command/command.variants.d.ts +226 -0
  21. package/dist/Command/command.variants.js +86 -0
  22. package/dist/Command/index.d.ts +2 -0
  23. package/dist/Command/index.js +1 -0
  24. package/dist/FormField/FormField.svelte +2 -6
  25. package/dist/Input/Input.svelte +2 -10
  26. package/dist/PinInput/PinInput.svelte +2 -11
  27. package/dist/RadioGroup/RadioGroup.svelte +2 -11
  28. package/dist/Select/Select.svelte +2 -10
  29. package/dist/Select/select.variants.js +1 -1
  30. package/dist/SelectMenu/SelectMenu.svelte +2 -10
  31. package/dist/SelectMenu/select-menu.variants.js +1 -1
  32. package/dist/Slider/Slider.svelte +2 -11
  33. package/dist/Switch/Switch.svelte +2 -11
  34. package/dist/Table/Table.svelte +752 -0
  35. package/dist/Table/Table.svelte.d.ts +26 -0
  36. package/dist/Table/index.d.ts +2 -0
  37. package/dist/Table/index.js +1 -0
  38. package/dist/Table/table.types.d.ts +199 -0
  39. package/dist/Table/table.types.js +1 -0
  40. package/dist/Table/table.utils.d.ts +51 -0
  41. package/dist/Table/table.utils.js +166 -0
  42. package/dist/Table/table.variants.d.ts +205 -0
  43. package/dist/Table/table.variants.js +126 -0
  44. package/dist/Textarea/Textarea.svelte +2 -10
  45. package/dist/Toast/Toaster.svelte +618 -0
  46. package/dist/Toast/Toaster.svelte.d.ts +5 -0
  47. package/dist/Toast/index.d.ts +4 -0
  48. package/dist/Toast/index.js +2 -0
  49. package/dist/Toast/toast.d.ts +38 -0
  50. package/dist/Toast/toast.js +73 -0
  51. package/dist/Toast/toast.types.d.ts +19 -0
  52. package/dist/Toast/toast.types.js +1 -0
  53. package/dist/Toast/toast.variants.d.ts +7 -0
  54. package/dist/Toast/toast.variants.js +5 -0
  55. package/dist/config.d.ts +4 -0
  56. package/dist/config.js +5 -1
  57. package/dist/hooks/index.d.ts +14 -0
  58. package/dist/hooks/index.js +7 -0
  59. package/dist/hooks/useClickOutside.svelte.d.ts +31 -0
  60. package/dist/hooks/useClickOutside.svelte.js +37 -0
  61. package/dist/hooks/useClipboard.svelte.d.ts +30 -0
  62. package/dist/hooks/useClipboard.svelte.js +45 -0
  63. package/dist/hooks/useDebounce.svelte.d.ts +36 -0
  64. package/dist/hooks/useDebounce.svelte.js +56 -0
  65. package/dist/hooks/useEscapeKeydown.svelte.d.ts +31 -0
  66. package/dist/hooks/useEscapeKeydown.svelte.js +37 -0
  67. package/dist/hooks/useFormField.svelte.d.ts +21 -0
  68. package/dist/hooks/useFormField.svelte.js +17 -0
  69. package/dist/hooks/useInfiniteScroll.svelte.d.ts +57 -0
  70. package/dist/hooks/useInfiniteScroll.svelte.js +69 -0
  71. package/dist/hooks/useMediaQuery.svelte.d.ts +31 -0
  72. package/dist/hooks/useMediaQuery.svelte.js +38 -0
  73. package/dist/index.d.ts +5 -0
  74. package/dist/index.js +6 -0
  75. package/dist/theme.css +36 -0
  76. package/package.json +2 -1
@@ -0,0 +1,618 @@
1
+ <script lang="ts" module>
2
+ import type { ToasterProps } from './toast.types.js'
3
+
4
+ export type Props = ToasterProps
5
+ </script>
6
+
7
+ <script lang="ts">
8
+ import { Toaster as SonnerToaster } from 'svelte-sonner'
9
+ import { toastDefaults } from './toast.variants.js'
10
+ import { getComponentConfig } from '../config.js'
11
+
12
+ const config = getComponentConfig('toast', toastDefaults)
13
+
14
+ let {
15
+ variant = config.defaultVariants.variant,
16
+ position = 'bottom-right',
17
+ visibleToasts = 3,
18
+ duration = 5000,
19
+ closeButton = true,
20
+ expand = false,
21
+ gap = 14,
22
+ class: className,
23
+ ...restProps
24
+ }: Props = $props()
25
+
26
+ const toasterClass = $derived([`sv5ui-toast-${variant}`, className].filter(Boolean).join(' '))
27
+ </script>
28
+
29
+ <SonnerToaster
30
+ {position}
31
+ {visibleToasts}
32
+ {duration}
33
+ {closeButton}
34
+ {expand}
35
+ {gap}
36
+ class={toasterClass}
37
+ {...restProps}
38
+ />
39
+
40
+ <style>
41
+ /* ============================================
42
+ * BASE OVERRIDES — applied to all variants
43
+ *
44
+ * Selector: [data-sonner-toaster] with our variant class.
45
+ * Sonner renders via portal, so we use :global() selectors
46
+ * scoped by our variant class on the toaster <ol> element.
47
+ * ============================================ */
48
+
49
+ :global([data-sonner-toaster][class*='sv5ui-toast-'] [data-sonner-toast][data-styled='true']) {
50
+ font-family: inherit;
51
+ border-radius: 0.75rem;
52
+ box-shadow:
53
+ 0 4px 6px -1px oklch(0 0 0 / 0.1),
54
+ 0 2px 4px -2px oklch(0 0 0 / 0.1);
55
+ }
56
+
57
+ :global(
58
+ [data-sonner-toaster][class*='sv5ui-toast-']
59
+ [data-sonner-toast][data-styled='true']
60
+ [data-content]
61
+ ) {
62
+ gap: 2px;
63
+ }
64
+
65
+ :global(
66
+ [data-sonner-toaster][class*='sv5ui-toast-']
67
+ [data-sonner-toast][data-styled='true']
68
+ [data-icon]:has([data-avatar-root])
69
+ ) {
70
+ width: auto;
71
+ height: auto;
72
+ margin: 0;
73
+ margin-right: 4px;
74
+ }
75
+
76
+ :global(
77
+ [data-sonner-toaster][class*='sv5ui-toast-']
78
+ [data-sonner-toast][data-styled='true']
79
+ [data-title]
80
+ ) {
81
+ font-weight: 600;
82
+ font-size: 0.875rem;
83
+ line-height: 1.25rem;
84
+ }
85
+
86
+ :global(
87
+ [data-sonner-toaster][class*='sv5ui-toast-']
88
+ [data-sonner-toast][data-styled='true']
89
+ [data-description]
90
+ ) {
91
+ font-size: 0.8125rem;
92
+ line-height: 1.25rem;
93
+ opacity: 0.85;
94
+ }
95
+
96
+ :global(
97
+ [data-sonner-toaster][class*='sv5ui-toast-']
98
+ [data-sonner-toast][data-styled='true']
99
+ [data-button]
100
+ ) {
101
+ font-weight: 600;
102
+ border-radius: 0.375rem;
103
+ font-size: 0.75rem;
104
+ padding: 0 0.625rem;
105
+ height: 1.625rem;
106
+ }
107
+
108
+ :global(
109
+ [data-sonner-toaster][class*='sv5ui-toast-']
110
+ [data-sonner-toast][data-styled='true']
111
+ [data-close-button]
112
+ ) {
113
+ border-radius: 50%;
114
+ transition:
115
+ opacity 150ms,
116
+ background-color 150ms,
117
+ border-color 150ms;
118
+ }
119
+
120
+ :global(
121
+ [data-sonner-toaster][class*='sv5ui-toast-']
122
+ [data-sonner-toast][data-styled='true']
123
+ [data-close-button]:hover
124
+ ) {
125
+ opacity: 1;
126
+ }
127
+
128
+ /* ============================================
129
+ * SHARED — CSS custom properties per toast type
130
+ *
131
+ * Each variant sets --toast-bg, --toast-border, --toast-color,
132
+ * --toast-desc, --toast-close-bg, --toast-close-border per type.
133
+ * The shared rules below consume them.
134
+ * ============================================ */
135
+
136
+ :global([data-sonner-toaster][class*='sv5ui-toast-'] [data-sonner-toast][data-styled='true']) {
137
+ background-color: var(--toast-bg);
138
+ border: 1px solid var(--toast-border);
139
+ color: var(--toast-color);
140
+ }
141
+
142
+ :global(
143
+ [data-sonner-toaster][class*='sv5ui-toast-']
144
+ [data-sonner-toast][data-styled='true']
145
+ [data-description]
146
+ ) {
147
+ color: var(--toast-desc);
148
+ }
149
+
150
+ :global(
151
+ [data-sonner-toaster][class*='sv5ui-toast-']
152
+ [data-sonner-toast][data-styled='true']
153
+ [data-icon]
154
+ ) {
155
+ color: var(--toast-icon, inherit);
156
+ }
157
+
158
+ :global(
159
+ [data-sonner-toaster][class*='sv5ui-toast-']
160
+ [data-sonner-toast][data-styled='true']
161
+ [data-title]
162
+ ) {
163
+ color: var(--toast-title, inherit);
164
+ }
165
+
166
+ :global(
167
+ [data-sonner-toaster][class*='sv5ui-toast-']
168
+ [data-sonner-toast][data-styled='true']
169
+ [data-button]
170
+ ) {
171
+ background-color: var(--toast-action-bg);
172
+ color: var(--toast-action-color);
173
+ }
174
+
175
+ :global(
176
+ [data-sonner-toaster][class*='sv5ui-toast-']
177
+ [data-sonner-toast][data-styled='true']
178
+ [data-cancel]
179
+ ) {
180
+ background-color: var(--toast-cancel-bg);
181
+ color: var(--toast-cancel-color);
182
+ }
183
+
184
+ :global(
185
+ [data-sonner-toaster][class*='sv5ui-toast-']
186
+ [data-sonner-toast][data-styled='true']
187
+ [data-close-button]
188
+ ) {
189
+ background-color: var(--toast-close-bg);
190
+ border-color: var(--toast-close-border);
191
+ color: var(--toast-close-color);
192
+ }
193
+
194
+ :global(
195
+ [data-sonner-toaster][class*='sv5ui-toast-']
196
+ [data-sonner-toast][data-styled='true']:hover
197
+ [data-close-button]:hover
198
+ ) {
199
+ background-color: var(--toast-close-hover-bg);
200
+ }
201
+
202
+ /* ============================================
203
+ * OUTLINE VARIANT — surface bg, semantic border + icon + title
204
+ * ============================================ */
205
+ :global([data-sonner-toaster].sv5ui-toast-outline [data-sonner-toast][data-styled='true']) {
206
+ --toast-bg: var(--color-surface-container);
207
+ --toast-border: var(--color-outline-variant);
208
+ --toast-color: var(--color-on-surface);
209
+ --toast-desc: var(--color-on-surface-variant);
210
+ --toast-icon: inherit;
211
+ --toast-title: inherit;
212
+ --toast-action-bg: var(--color-primary);
213
+ --toast-action-color: var(--color-on-primary);
214
+ --toast-cancel-bg: var(--color-surface-container-highest);
215
+ --toast-cancel-color: var(--color-on-surface);
216
+ --toast-close-bg: var(--color-surface-container);
217
+ --toast-close-border: var(--color-outline-variant);
218
+ --toast-close-color: var(--color-on-surface-variant);
219
+ --toast-close-hover-bg: var(--color-surface-container-highest);
220
+ }
221
+
222
+ :global(
223
+ [data-sonner-toaster].sv5ui-toast-outline
224
+ [data-sonner-toast][data-type='success'][data-styled='true']
225
+ ) {
226
+ --toast-border: oklch(from var(--color-success) l c h / 0.4);
227
+ --toast-icon: var(--color-success);
228
+ --toast-title: var(--color-success);
229
+ }
230
+
231
+ :global(
232
+ [data-sonner-toaster].sv5ui-toast-outline
233
+ [data-sonner-toast][data-type='error'][data-styled='true']
234
+ ) {
235
+ --toast-border: oklch(from var(--color-error) l c h / 0.4);
236
+ --toast-icon: var(--color-error);
237
+ --toast-title: var(--color-error);
238
+ }
239
+
240
+ :global(
241
+ [data-sonner-toaster].sv5ui-toast-outline
242
+ [data-sonner-toast][data-type='warning'][data-styled='true']
243
+ ) {
244
+ --toast-border: oklch(from var(--color-warning) l c h / 0.4);
245
+ --toast-icon: var(--color-warning);
246
+ --toast-title: var(--color-warning);
247
+ }
248
+
249
+ :global(
250
+ [data-sonner-toaster].sv5ui-toast-outline
251
+ [data-sonner-toast][data-type='info'][data-styled='true']
252
+ ) {
253
+ --toast-border: oklch(from var(--color-info) l c h / 0.4);
254
+ --toast-icon: var(--color-info);
255
+ --toast-title: var(--color-info);
256
+ }
257
+
258
+ /* ============================================
259
+ * SOFT VARIANT — tinted bg, semantic text
260
+ * ============================================ */
261
+ :global([data-sonner-toaster].sv5ui-toast-soft [data-sonner-toast][data-styled='true']) {
262
+ --toast-bg: var(--color-surface-container-high);
263
+ --toast-border: transparent;
264
+ --toast-color: var(--color-on-surface);
265
+ --toast-desc: var(--color-on-surface-variant);
266
+ --toast-icon: inherit;
267
+ --toast-title: inherit;
268
+ --toast-action-bg: var(--color-primary);
269
+ --toast-action-color: var(--color-on-primary);
270
+ --toast-cancel-bg: var(--color-surface-container-highest);
271
+ --toast-cancel-color: var(--color-on-surface);
272
+ --toast-close-bg: var(--color-surface-container-high);
273
+ --toast-close-border: transparent;
274
+ --toast-close-color: var(--color-on-surface-variant);
275
+ --toast-close-hover-bg: var(--color-surface-container-highest);
276
+ }
277
+
278
+ :global(
279
+ [data-sonner-toaster].sv5ui-toast-soft
280
+ [data-sonner-toast][data-type='success'][data-styled='true']
281
+ ) {
282
+ --toast-bg: oklch(from var(--color-success) l c h / 0.1);
283
+ --toast-color: var(--color-success);
284
+ --toast-desc: oklch(from var(--color-success) l c h / 0.8);
285
+ --toast-close-bg: oklch(from var(--color-success) l c h / 0.1);
286
+ --toast-close-color: var(--color-success);
287
+ }
288
+
289
+ :global(
290
+ [data-sonner-toaster].sv5ui-toast-soft
291
+ [data-sonner-toast][data-type='error'][data-styled='true']
292
+ ) {
293
+ --toast-bg: oklch(from var(--color-error) l c h / 0.1);
294
+ --toast-color: var(--color-error);
295
+ --toast-desc: oklch(from var(--color-error) l c h / 0.8);
296
+ --toast-close-bg: oklch(from var(--color-error) l c h / 0.1);
297
+ --toast-close-color: var(--color-error);
298
+ }
299
+
300
+ :global(
301
+ [data-sonner-toaster].sv5ui-toast-soft
302
+ [data-sonner-toast][data-type='warning'][data-styled='true']
303
+ ) {
304
+ --toast-bg: oklch(from var(--color-warning) l c h / 0.1);
305
+ --toast-color: var(--color-warning);
306
+ --toast-desc: oklch(from var(--color-warning) l c h / 0.8);
307
+ --toast-close-bg: oklch(from var(--color-warning) l c h / 0.1);
308
+ --toast-close-color: var(--color-warning);
309
+ }
310
+
311
+ :global(
312
+ [data-sonner-toaster].sv5ui-toast-soft
313
+ [data-sonner-toast][data-type='info'][data-styled='true']
314
+ ) {
315
+ --toast-bg: oklch(from var(--color-info) l c h / 0.1);
316
+ --toast-color: var(--color-info);
317
+ --toast-desc: oklch(from var(--color-info) l c h / 0.8);
318
+ --toast-close-bg: oklch(from var(--color-info) l c h / 0.1);
319
+ --toast-close-color: var(--color-info);
320
+ }
321
+
322
+ /* ============================================
323
+ * SUBTLE VARIANT — tinted bg + semantic border
324
+ * ============================================ */
325
+ :global([data-sonner-toaster].sv5ui-toast-subtle [data-sonner-toast][data-styled='true']) {
326
+ --toast-bg: var(--color-surface-container-high);
327
+ --toast-border: var(--color-outline-variant);
328
+ --toast-color: var(--color-on-surface);
329
+ --toast-desc: var(--color-on-surface-variant);
330
+ --toast-icon: inherit;
331
+ --toast-title: inherit;
332
+ --toast-action-bg: var(--color-primary);
333
+ --toast-action-color: var(--color-on-primary);
334
+ --toast-cancel-bg: var(--color-surface-container-highest);
335
+ --toast-cancel-color: var(--color-on-surface);
336
+ --toast-close-bg: var(--color-surface-container-high);
337
+ --toast-close-border: var(--color-outline-variant);
338
+ --toast-close-color: var(--color-on-surface-variant);
339
+ --toast-close-hover-bg: var(--color-surface-container-highest);
340
+ }
341
+
342
+ :global(
343
+ [data-sonner-toaster].sv5ui-toast-subtle
344
+ [data-sonner-toast][data-type='success'][data-styled='true']
345
+ ) {
346
+ --toast-bg: oklch(from var(--color-success) l c h / 0.1);
347
+ --toast-border: oklch(from var(--color-success) l c h / 0.3);
348
+ --toast-color: var(--color-success);
349
+ --toast-desc: oklch(from var(--color-success) l c h / 0.8);
350
+ --toast-close-bg: oklch(from var(--color-success) l c h / 0.1);
351
+ --toast-close-border: oklch(from var(--color-success) l c h / 0.3);
352
+ --toast-close-color: var(--color-success);
353
+ }
354
+
355
+ :global(
356
+ [data-sonner-toaster].sv5ui-toast-subtle
357
+ [data-sonner-toast][data-type='error'][data-styled='true']
358
+ ) {
359
+ --toast-bg: oklch(from var(--color-error) l c h / 0.1);
360
+ --toast-border: oklch(from var(--color-error) l c h / 0.3);
361
+ --toast-color: var(--color-error);
362
+ --toast-desc: oklch(from var(--color-error) l c h / 0.8);
363
+ --toast-close-bg: oklch(from var(--color-error) l c h / 0.1);
364
+ --toast-close-border: oklch(from var(--color-error) l c h / 0.3);
365
+ --toast-close-color: var(--color-error);
366
+ }
367
+
368
+ :global(
369
+ [data-sonner-toaster].sv5ui-toast-subtle
370
+ [data-sonner-toast][data-type='warning'][data-styled='true']
371
+ ) {
372
+ --toast-bg: oklch(from var(--color-warning) l c h / 0.1);
373
+ --toast-border: oklch(from var(--color-warning) l c h / 0.3);
374
+ --toast-color: var(--color-warning);
375
+ --toast-desc: oklch(from var(--color-warning) l c h / 0.8);
376
+ --toast-close-bg: oklch(from var(--color-warning) l c h / 0.1);
377
+ --toast-close-border: oklch(from var(--color-warning) l c h / 0.3);
378
+ --toast-close-color: var(--color-warning);
379
+ }
380
+
381
+ :global(
382
+ [data-sonner-toaster].sv5ui-toast-subtle
383
+ [data-sonner-toast][data-type='info'][data-styled='true']
384
+ ) {
385
+ --toast-bg: oklch(from var(--color-info) l c h / 0.1);
386
+ --toast-border: oklch(from var(--color-info) l c h / 0.3);
387
+ --toast-color: var(--color-info);
388
+ --toast-desc: oklch(from var(--color-info) l c h / 0.8);
389
+ --toast-close-bg: oklch(from var(--color-info) l c h / 0.1);
390
+ --toast-close-border: oklch(from var(--color-info) l c h / 0.3);
391
+ --toast-close-color: var(--color-info);
392
+ }
393
+
394
+ /* ============================================
395
+ * SOLID VARIANT — full semantic bg
396
+ * ============================================ */
397
+ :global([data-sonner-toaster].sv5ui-toast-solid [data-sonner-toast][data-styled='true']) {
398
+ --toast-bg: var(--color-inverse-surface);
399
+ --toast-border: transparent;
400
+ --toast-color: var(--color-inverse-on-surface);
401
+ --toast-desc: var(--color-inverse-on-surface);
402
+ --toast-icon: inherit;
403
+ --toast-title: inherit;
404
+ --toast-action-bg: oklch(from var(--color-inverse-on-surface) l c h / 0.2);
405
+ --toast-action-color: var(--color-inverse-on-surface);
406
+ --toast-cancel-bg: oklch(from var(--color-inverse-on-surface) l c h / 0.1);
407
+ --toast-cancel-color: var(--color-inverse-on-surface);
408
+ --toast-close-bg: var(--color-inverse-surface);
409
+ --toast-close-border: oklch(from var(--color-inverse-on-surface) l c h / 0.2);
410
+ --toast-close-color: var(--color-inverse-on-surface);
411
+ --toast-close-hover-bg: oklch(from var(--color-inverse-on-surface) l c h / 0.1);
412
+ }
413
+
414
+ :global(
415
+ [data-sonner-toaster].sv5ui-toast-solid
416
+ [data-sonner-toast][data-styled='true']
417
+ [data-description]
418
+ ) {
419
+ opacity: 0.8;
420
+ }
421
+
422
+ :global(
423
+ [data-sonner-toaster].sv5ui-toast-solid
424
+ [data-sonner-toast][data-type='success'][data-styled='true']
425
+ ) {
426
+ --toast-bg: var(--color-success);
427
+ --toast-color: var(--color-on-success);
428
+ --toast-desc: var(--color-on-success);
429
+ --toast-close-bg: var(--color-success);
430
+ --toast-close-color: var(--color-on-success);
431
+ }
432
+
433
+ :global(
434
+ [data-sonner-toaster].sv5ui-toast-solid
435
+ [data-sonner-toast][data-type='error'][data-styled='true']
436
+ ) {
437
+ --toast-bg: var(--color-error);
438
+ --toast-color: var(--color-on-error);
439
+ --toast-desc: var(--color-on-error);
440
+ --toast-close-bg: var(--color-error);
441
+ --toast-close-color: var(--color-on-error);
442
+ }
443
+
444
+ :global(
445
+ [data-sonner-toaster].sv5ui-toast-solid
446
+ [data-sonner-toast][data-type='warning'][data-styled='true']
447
+ ) {
448
+ --toast-bg: var(--color-warning);
449
+ --toast-color: var(--color-on-warning);
450
+ --toast-desc: var(--color-on-warning);
451
+ --toast-close-bg: var(--color-warning);
452
+ --toast-close-color: var(--color-on-warning);
453
+ }
454
+
455
+ :global(
456
+ [data-sonner-toaster].sv5ui-toast-solid
457
+ [data-sonner-toast][data-type='info'][data-styled='true']
458
+ ) {
459
+ --toast-bg: var(--color-info);
460
+ --toast-color: var(--color-on-info);
461
+ --toast-desc: var(--color-on-info);
462
+ --toast-close-bg: var(--color-info);
463
+ --toast-close-color: var(--color-on-info);
464
+ }
465
+
466
+ /* ============================================
467
+ * ACCENT VARIANT — left border accent strip
468
+ * ============================================ */
469
+ :global([data-sonner-toaster].sv5ui-toast-accent [data-sonner-toast][data-styled='true']) {
470
+ --toast-bg: var(--color-surface-container);
471
+ --toast-border: var(--color-outline-variant);
472
+ --toast-color: var(--color-on-surface);
473
+ --toast-desc: var(--color-on-surface-variant);
474
+ --toast-icon: inherit;
475
+ --toast-title: inherit;
476
+ --toast-action-bg: var(--color-primary);
477
+ --toast-action-color: var(--color-on-primary);
478
+ --toast-cancel-bg: var(--color-surface-container-highest);
479
+ --toast-cancel-color: var(--color-on-surface);
480
+ --toast-close-bg: var(--color-surface-container);
481
+ --toast-close-border: var(--color-outline-variant);
482
+ --toast-close-color: var(--color-on-surface-variant);
483
+ --toast-close-hover-bg: var(--color-surface-container-highest);
484
+ border-left: 3px solid var(--color-on-surface-variant);
485
+ border-radius: 0.5rem;
486
+ }
487
+
488
+ :global(
489
+ [data-sonner-toaster].sv5ui-toast-accent
490
+ [data-sonner-toast][data-type='success'][data-styled='true']
491
+ ) {
492
+ border-left-color: var(--color-success);
493
+ --toast-icon: var(--color-success);
494
+ --toast-title: var(--color-success);
495
+ }
496
+
497
+ :global(
498
+ [data-sonner-toaster].sv5ui-toast-accent
499
+ [data-sonner-toast][data-type='error'][data-styled='true']
500
+ ) {
501
+ border-left-color: var(--color-error);
502
+ --toast-icon: var(--color-error);
503
+ --toast-title: var(--color-error);
504
+ }
505
+
506
+ :global(
507
+ [data-sonner-toaster].sv5ui-toast-accent
508
+ [data-sonner-toast][data-type='warning'][data-styled='true']
509
+ ) {
510
+ border-left-color: var(--color-warning);
511
+ --toast-icon: var(--color-warning);
512
+ --toast-title: var(--color-warning);
513
+ }
514
+
515
+ :global(
516
+ [data-sonner-toaster].sv5ui-toast-accent
517
+ [data-sonner-toast][data-type='info'][data-styled='true']
518
+ ) {
519
+ border-left-color: var(--color-info);
520
+ --toast-icon: var(--color-info);
521
+ --toast-title: var(--color-info);
522
+ }
523
+
524
+ /* ============================================
525
+ * COLOR CLASSES — per-toast color override via class
526
+ *
527
+ * Usage: toast('msg', { class: 'sv5ui-color-primary' })
528
+ * These set --sv5ui-c (main) and --sv5ui-c-on (contrast)
529
+ * which are consumed by variant-specific rules below.
530
+ * ============================================ */
531
+
532
+ :global([data-sonner-toast].sv5ui-color-primary) {
533
+ --sv5ui-c: var(--color-primary);
534
+ --sv5ui-c-on: var(--color-on-primary);
535
+ }
536
+ :global([data-sonner-toast].sv5ui-color-secondary) {
537
+ --sv5ui-c: var(--color-secondary);
538
+ --sv5ui-c-on: var(--color-on-secondary);
539
+ }
540
+ :global([data-sonner-toast].sv5ui-color-tertiary) {
541
+ --sv5ui-c: var(--color-tertiary);
542
+ --sv5ui-c-on: var(--color-on-tertiary);
543
+ }
544
+ :global([data-sonner-toast].sv5ui-color-success) {
545
+ --sv5ui-c: var(--color-success);
546
+ --sv5ui-c-on: var(--color-on-success);
547
+ }
548
+ :global([data-sonner-toast].sv5ui-color-warning) {
549
+ --sv5ui-c: var(--color-warning);
550
+ --sv5ui-c-on: var(--color-on-warning);
551
+ }
552
+ :global([data-sonner-toast].sv5ui-color-error) {
553
+ --sv5ui-c: var(--color-error);
554
+ --sv5ui-c-on: var(--color-on-error);
555
+ }
556
+ :global([data-sonner-toast].sv5ui-color-info) {
557
+ --sv5ui-c: var(--color-info);
558
+ --sv5ui-c-on: var(--color-on-info);
559
+ }
560
+
561
+ /* Outline + color class */
562
+ :global(
563
+ [data-sonner-toaster].sv5ui-toast-outline
564
+ [data-sonner-toast][class*='sv5ui-color-'][data-styled='true']
565
+ ) {
566
+ --toast-border: oklch(from var(--sv5ui-c) l c h / 0.4);
567
+ --toast-icon: var(--sv5ui-c);
568
+ --toast-title: var(--sv5ui-c);
569
+ }
570
+
571
+ /* Soft + color class */
572
+ :global(
573
+ [data-sonner-toaster].sv5ui-toast-soft
574
+ [data-sonner-toast][class*='sv5ui-color-'][data-styled='true']
575
+ ) {
576
+ --toast-bg: oklch(from var(--sv5ui-c) l c h / 0.1);
577
+ --toast-color: var(--sv5ui-c);
578
+ --toast-desc: oklch(from var(--sv5ui-c) l c h / 0.8);
579
+ --toast-close-bg: oklch(from var(--sv5ui-c) l c h / 0.1);
580
+ --toast-close-color: var(--sv5ui-c);
581
+ }
582
+
583
+ /* Subtle + color class */
584
+ :global(
585
+ [data-sonner-toaster].sv5ui-toast-subtle
586
+ [data-sonner-toast][class*='sv5ui-color-'][data-styled='true']
587
+ ) {
588
+ --toast-bg: oklch(from var(--sv5ui-c) l c h / 0.1);
589
+ --toast-border: oklch(from var(--sv5ui-c) l c h / 0.3);
590
+ --toast-color: var(--sv5ui-c);
591
+ --toast-desc: oklch(from var(--sv5ui-c) l c h / 0.8);
592
+ --toast-close-bg: oklch(from var(--sv5ui-c) l c h / 0.1);
593
+ --toast-close-border: oklch(from var(--sv5ui-c) l c h / 0.3);
594
+ --toast-close-color: var(--sv5ui-c);
595
+ }
596
+
597
+ /* Solid + color class */
598
+ :global(
599
+ [data-sonner-toaster].sv5ui-toast-solid
600
+ [data-sonner-toast][class*='sv5ui-color-'][data-styled='true']
601
+ ) {
602
+ --toast-bg: var(--sv5ui-c);
603
+ --toast-color: var(--sv5ui-c-on);
604
+ --toast-desc: var(--sv5ui-c-on);
605
+ --toast-close-bg: var(--sv5ui-c);
606
+ --toast-close-color: var(--sv5ui-c-on);
607
+ }
608
+
609
+ /* Accent + color class */
610
+ :global(
611
+ [data-sonner-toaster].sv5ui-toast-accent
612
+ [data-sonner-toast][class*='sv5ui-color-'][data-styled='true']
613
+ ) {
614
+ border-left-color: var(--sv5ui-c);
615
+ --toast-icon: var(--sv5ui-c);
616
+ --toast-title: var(--sv5ui-c);
617
+ }
618
+ </style>
@@ -0,0 +1,5 @@
1
+ import type { ToasterProps } from './toast.types.js';
2
+ export type Props = ToasterProps;
3
+ declare const Toaster: import("svelte").Component<ToasterProps, {}, "">;
4
+ type Toaster = ReturnType<typeof Toaster>;
5
+ export default Toaster;
@@ -0,0 +1,4 @@
1
+ export { default as Toaster } from './Toaster.svelte';
2
+ export { toast } from './toast.js';
3
+ export type { ToasterProps } from './toast.types.js';
4
+ export type { ToastOptions } from './toast.js';
@@ -0,0 +1,2 @@
1
+ export { default as Toaster } from './Toaster.svelte';
2
+ export { toast } from './toast.js';
@@ -0,0 +1,38 @@
1
+ import type { ExternalToast } from 'svelte-sonner';
2
+ import type { AvatarProps } from '../Avatar/avatar.types.js';
3
+ import type { ToastColor } from './toast.variants.js';
4
+ type ToastAvatarOptions = Pick<AvatarProps, 'src' | 'alt' | 'text' | 'icon' | 'size'>;
5
+ type SV5UIToastOptions = Omit<ExternalToast, 'icon'> & {
6
+ /**
7
+ * Semantic color for the toast.
8
+ * Works with all Toaster variants (outline, soft, subtle, solid, accent).
9
+ * @example toast('Message', { color: 'primary' })
10
+ */
11
+ color?: ToastColor;
12
+ /**
13
+ * Iconify icon name to display in the toast.
14
+ * Replaces the default type icon (success checkmark, error X, etc.)
15
+ * @example toast('Launched!', { icon: 'lucide:rocket' })
16
+ */
17
+ icon?: string | ExternalToast['icon'];
18
+ /**
19
+ * Avatar to display in the icon slot.
20
+ * Pass an object with Avatar props (src, alt, text, icon, size).
21
+ * @example toast('John commented', { avatar: { src: '/avatar.jpg', alt: 'John' } })
22
+ */
23
+ avatar?: ToastAvatarOptions;
24
+ };
25
+ declare function toastFn(message: string, data?: SV5UIToastOptions): string | number;
26
+ declare namespace toastFn {
27
+ var success: (message: string, data?: SV5UIToastOptions) => string | number;
28
+ var error: (message: string, data?: SV5UIToastOptions) => string | number;
29
+ var warning: (message: string, data?: SV5UIToastOptions) => string | number;
30
+ var info: (message: string, data?: SV5UIToastOptions) => string | number;
31
+ var loading: (message: string, data?: SV5UIToastOptions) => string | number;
32
+ var promise;
33
+ var dismiss: (id?: number | string) => string | number | undefined;
34
+ var custom;
35
+ var message;
36
+ }
37
+ export { toastFn as toast };
38
+ export type { SV5UIToastOptions as ToastOptions };