sv5ui 1.3.0 → 1.4.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 (39) hide show
  1. package/README.md +16 -11
  2. package/dist/Collapsible/Collapsible.svelte +69 -0
  3. package/dist/Collapsible/Collapsible.svelte.d.ts +6 -0
  4. package/dist/Collapsible/CollapsibleTestWrapper.svelte +17 -0
  5. package/dist/Collapsible/CollapsibleTestWrapper.svelte.d.ts +4 -0
  6. package/dist/Collapsible/collapsible.types.d.ts +75 -0
  7. package/dist/Collapsible/collapsible.types.js +1 -0
  8. package/dist/Collapsible/collapsible.variants.d.ts +53 -0
  9. package/dist/Collapsible/collapsible.variants.js +21 -0
  10. package/dist/Collapsible/index.d.ts +2 -0
  11. package/dist/Collapsible/index.js +1 -0
  12. package/dist/Command/Command.svelte +183 -0
  13. package/dist/Command/Command.svelte.d.ts +6 -0
  14. package/dist/Command/CommandTestWrapper.svelte +13 -0
  15. package/dist/Command/CommandTestWrapper.svelte.d.ts +4 -0
  16. package/dist/Command/command.types.d.ts +98 -0
  17. package/dist/Command/command.types.js +1 -0
  18. package/dist/Command/command.variants.d.ts +226 -0
  19. package/dist/Command/command.variants.js +86 -0
  20. package/dist/Command/index.d.ts +2 -0
  21. package/dist/Command/index.js +1 -0
  22. package/dist/Select/select.variants.js +1 -1
  23. package/dist/SelectMenu/select-menu.variants.js +1 -1
  24. package/dist/Toast/Toaster.svelte +618 -0
  25. package/dist/Toast/Toaster.svelte.d.ts +5 -0
  26. package/dist/Toast/index.d.ts +4 -0
  27. package/dist/Toast/index.js +2 -0
  28. package/dist/Toast/toast.d.ts +38 -0
  29. package/dist/Toast/toast.js +73 -0
  30. package/dist/Toast/toast.types.d.ts +19 -0
  31. package/dist/Toast/toast.types.js +1 -0
  32. package/dist/Toast/toast.variants.d.ts +7 -0
  33. package/dist/Toast/toast.variants.js +5 -0
  34. package/dist/config.d.ts +1 -0
  35. package/dist/config.js +2 -1
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.js +3 -0
  38. package/dist/theme.css +36 -0
  39. 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 };