luxen-ui 0.1.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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/css/elements/avatar.css +20 -0
  4. package/dist/css/elements/badge.css +159 -0
  5. package/dist/css/elements/button.css +171 -0
  6. package/dist/css/elements/close-button/circle.css +66 -0
  7. package/dist/css/elements/close-button/ring.css +71 -0
  8. package/dist/css/elements/close-button/square.css +70 -0
  9. package/dist/css/elements/disclosure.css +137 -0
  10. package/dist/css/elements/divider.css +75 -0
  11. package/dist/css/elements/input-otp.css +164 -0
  12. package/dist/css/elements/input-stepper/default.css +245 -0
  13. package/dist/css/elements/input-stepper/rounded.css +238 -0
  14. package/dist/css/elements/kbd.css +21 -0
  15. package/dist/css/elements/progress.css +114 -0
  16. package/dist/css/elements/select.css +71 -0
  17. package/dist/css/elements/skeleton.css +89 -0
  18. package/dist/css/elements/tabs/enclosed.css +148 -0
  19. package/dist/css/elements/tabs/line.css +138 -0
  20. package/dist/css/elements/toast.css +260 -0
  21. package/dist/css/index.css +885 -0
  22. package/dist/custom-elements.json +14424 -0
  23. package/dist/define.d.ts +9 -0
  24. package/dist/define.d.ts.map +1 -0
  25. package/dist/define.js +16 -0
  26. package/dist/elements/avatar/avatar.css +128 -0
  27. package/dist/elements/avatar/avatar.d.ts +21 -0
  28. package/dist/elements/avatar/avatar.d.ts.map +1 -0
  29. package/dist/elements/avatar/avatar.js +106 -0
  30. package/dist/elements/avatar/index.d.ts +8 -0
  31. package/dist/elements/avatar/index.d.ts.map +1 -0
  32. package/dist/elements/avatar/index.js +4 -0
  33. package/dist/elements/badge/badge.d.ts +17 -0
  34. package/dist/elements/badge/badge.d.ts.map +1 -0
  35. package/dist/elements/badge/badge.js +34 -0
  36. package/dist/elements/badge/index.d.ts +8 -0
  37. package/dist/elements/badge/index.d.ts.map +1 -0
  38. package/dist/elements/badge/index.js +4 -0
  39. package/dist/elements/carousel/carousel.css +205 -0
  40. package/dist/elements/carousel/carousel.d.ts +148 -0
  41. package/dist/elements/carousel/carousel.d.ts.map +1 -0
  42. package/dist/elements/carousel/carousel.js +473 -0
  43. package/dist/elements/carousel/index.d.ts +8 -0
  44. package/dist/elements/carousel/index.d.ts.map +1 -0
  45. package/dist/elements/carousel/index.js +4 -0
  46. package/dist/elements/carousel-item/carousel-item.css +11 -0
  47. package/dist/elements/carousel-item/carousel-item.d.ts +13 -0
  48. package/dist/elements/carousel-item/carousel-item.d.ts.map +1 -0
  49. package/dist/elements/carousel-item/carousel-item.js +20 -0
  50. package/dist/elements/carousel-item/index.d.ts +8 -0
  51. package/dist/elements/carousel-item/index.d.ts.map +1 -0
  52. package/dist/elements/carousel-item/index.js +4 -0
  53. package/dist/elements/dialog/dialog.css +92 -0
  54. package/dist/elements/dialog/dialog.d.ts +56 -0
  55. package/dist/elements/dialog/dialog.d.ts.map +1 -0
  56. package/dist/elements/dialog/dialog.js +204 -0
  57. package/dist/elements/dialog/dialog.styles.d.ts +8 -0
  58. package/dist/elements/dialog/dialog.styles.d.ts.map +1 -0
  59. package/dist/elements/dialog/dialog.styles.js +8 -0
  60. package/dist/elements/dialog/index.d.ts +8 -0
  61. package/dist/elements/dialog/index.d.ts.map +1 -0
  62. package/dist/elements/dialog/index.js +4 -0
  63. package/dist/elements/divider/divider.d.ts +23 -0
  64. package/dist/elements/divider/divider.d.ts.map +1 -0
  65. package/dist/elements/divider/divider.js +49 -0
  66. package/dist/elements/divider/index.d.ts +8 -0
  67. package/dist/elements/divider/index.d.ts.map +1 -0
  68. package/dist/elements/divider/index.js +4 -0
  69. package/dist/elements/drawer/drawer.css +66 -0
  70. package/dist/elements/drawer/drawer.d.ts +34 -0
  71. package/dist/elements/drawer/drawer.d.ts.map +1 -0
  72. package/dist/elements/drawer/drawer.js +46 -0
  73. package/dist/elements/drawer/index.d.ts +8 -0
  74. package/dist/elements/drawer/index.d.ts.map +1 -0
  75. package/dist/elements/drawer/index.js +4 -0
  76. package/dist/elements/dropdown/dropdown.css +31 -0
  77. package/dist/elements/dropdown/dropdown.d.ts +64 -0
  78. package/dist/elements/dropdown/dropdown.d.ts.map +1 -0
  79. package/dist/elements/dropdown/dropdown.js +322 -0
  80. package/dist/elements/dropdown/index.d.ts +8 -0
  81. package/dist/elements/dropdown/index.d.ts.map +1 -0
  82. package/dist/elements/dropdown/index.js +4 -0
  83. package/dist/elements/dropdown-item/dropdown-item.css +51 -0
  84. package/dist/elements/dropdown-item/dropdown-item.d.ts +25 -0
  85. package/dist/elements/dropdown-item/dropdown-item.d.ts.map +1 -0
  86. package/dist/elements/dropdown-item/dropdown-item.js +110 -0
  87. package/dist/elements/dropdown-item/index.d.ts +8 -0
  88. package/dist/elements/dropdown-item/index.d.ts.map +1 -0
  89. package/dist/elements/dropdown-item/index.js +4 -0
  90. package/dist/elements/icon/icon.css +10 -0
  91. package/dist/elements/icon/icon.d.ts +19 -0
  92. package/dist/elements/icon/icon.d.ts.map +1 -0
  93. package/dist/elements/icon/icon.js +53 -0
  94. package/dist/elements/icon/index.d.ts +8 -0
  95. package/dist/elements/icon/index.d.ts.map +1 -0
  96. package/dist/elements/icon/index.js +4 -0
  97. package/dist/elements/input-otp/index.d.ts +8 -0
  98. package/dist/elements/input-otp/index.d.ts.map +1 -0
  99. package/dist/elements/input-otp/index.js +4 -0
  100. package/dist/elements/input-otp/input-otp.d.ts +31 -0
  101. package/dist/elements/input-otp/input-otp.d.ts.map +1 -0
  102. package/dist/elements/input-otp/input-otp.js +139 -0
  103. package/dist/elements/input-stepper/index.d.ts +8 -0
  104. package/dist/elements/input-stepper/index.d.ts.map +1 -0
  105. package/dist/elements/input-stepper/index.js +4 -0
  106. package/dist/elements/input-stepper/input-stepper.d.ts +63 -0
  107. package/dist/elements/input-stepper/input-stepper.d.ts.map +1 -0
  108. package/dist/elements/input-stepper/input-stepper.js +249 -0
  109. package/dist/elements/popover/index.d.ts +8 -0
  110. package/dist/elements/popover/index.d.ts.map +1 -0
  111. package/dist/elements/popover/index.js +4 -0
  112. package/dist/elements/popover/popover.css +61 -0
  113. package/dist/elements/popover/popover.d.ts +62 -0
  114. package/dist/elements/popover/popover.d.ts.map +1 -0
  115. package/dist/elements/popover/popover.js +244 -0
  116. package/dist/elements/rating/index.d.ts +8 -0
  117. package/dist/elements/rating/index.d.ts.map +1 -0
  118. package/dist/elements/rating/index.js +4 -0
  119. package/dist/elements/rating/rating.css +102 -0
  120. package/dist/elements/rating/rating.d.ts +38 -0
  121. package/dist/elements/rating/rating.d.ts.map +1 -0
  122. package/dist/elements/rating/rating.js +193 -0
  123. package/dist/elements/skeleton/index.d.ts +8 -0
  124. package/dist/elements/skeleton/index.d.ts.map +1 -0
  125. package/dist/elements/skeleton/index.js +4 -0
  126. package/dist/elements/skeleton/skeleton.d.ts +12 -0
  127. package/dist/elements/skeleton/skeleton.d.ts.map +1 -0
  128. package/dist/elements/skeleton/skeleton.js +13 -0
  129. package/dist/elements/spinner/index.d.ts +8 -0
  130. package/dist/elements/spinner/index.d.ts.map +1 -0
  131. package/dist/elements/spinner/index.js +4 -0
  132. package/dist/elements/spinner/spinner.css +28 -0
  133. package/dist/elements/spinner/spinner.d.ts +16 -0
  134. package/dist/elements/spinner/spinner.d.ts.map +1 -0
  135. package/dist/elements/spinner/spinner.js +37 -0
  136. package/dist/elements/tabs/index.d.ts +8 -0
  137. package/dist/elements/tabs/index.d.ts.map +1 -0
  138. package/dist/elements/tabs/index.js +4 -0
  139. package/dist/elements/tabs/tabs.d.ts +48 -0
  140. package/dist/elements/tabs/tabs.d.ts.map +1 -0
  141. package/dist/elements/tabs/tabs.js +210 -0
  142. package/dist/elements/toast/index.d.ts +9 -0
  143. package/dist/elements/toast/index.d.ts.map +1 -0
  144. package/dist/elements/toast/index.js +5 -0
  145. package/dist/elements/toast/toast.d.ts +72 -0
  146. package/dist/elements/toast/toast.d.ts.map +1 -0
  147. package/dist/elements/toast/toast.js +375 -0
  148. package/dist/elements/tooltip/index.d.ts +8 -0
  149. package/dist/elements/tooltip/index.d.ts.map +1 -0
  150. package/dist/elements/tooltip/index.js +4 -0
  151. package/dist/elements/tooltip/tooltip.css +37 -0
  152. package/dist/elements/tooltip/tooltip.d.ts +59 -0
  153. package/dist/elements/tooltip/tooltip.d.ts.map +1 -0
  154. package/dist/elements/tooltip/tooltip.js +231 -0
  155. package/dist/elements/tree/index.d.ts +8 -0
  156. package/dist/elements/tree/index.d.ts.map +1 -0
  157. package/dist/elements/tree/index.js +4 -0
  158. package/dist/elements/tree/tree.css +26 -0
  159. package/dist/elements/tree/tree.d.ts +76 -0
  160. package/dist/elements/tree/tree.d.ts.map +1 -0
  161. package/dist/elements/tree/tree.js +432 -0
  162. package/dist/elements/tree-item/index.d.ts +8 -0
  163. package/dist/elements/tree-item/index.d.ts.map +1 -0
  164. package/dist/elements/tree-item/index.js +4 -0
  165. package/dist/elements/tree-item/tree-item.css +172 -0
  166. package/dist/elements/tree-item/tree-item.d.ts +74 -0
  167. package/dist/elements/tree-item/tree-item.d.ts.map +1 -0
  168. package/dist/elements/tree-item/tree-item.js +301 -0
  169. package/dist/index.d.ts +6 -0
  170. package/dist/index.d.ts.map +1 -0
  171. package/dist/index.js +4 -0
  172. package/dist/registry.d.ts +22 -0
  173. package/dist/registry.d.ts.map +1 -0
  174. package/dist/registry.js +33 -0
  175. package/dist/shared/controllers/popover.d.ts +44 -0
  176. package/dist/shared/controllers/popover.d.ts.map +1 -0
  177. package/dist/shared/controllers/popover.js +359 -0
  178. package/dist/shared/luxen-element.d.ts +20 -0
  179. package/dist/shared/luxen-element.d.ts.map +1 -0
  180. package/dist/shared/luxen-element.js +23 -0
  181. package/dist/shared/luxen-form-associated-element.d.ts +49 -0
  182. package/dist/shared/luxen-form-associated-element.d.ts.map +1 -0
  183. package/dist/shared/luxen-form-associated-element.js +123 -0
  184. package/dist/shared/styles/host.css +13 -0
  185. package/dist/shared/styles/host.styles.d.ts +9 -0
  186. package/dist/shared/styles/host.styles.d.ts.map +1 -0
  187. package/dist/shared/styles/host.styles.js +9 -0
  188. package/dist/skills/luxen-ui/SKILL.md +82 -0
  189. package/dist/skills/luxen-ui/references/avatar.md +259 -0
  190. package/dist/skills/luxen-ui/references/badge.md +289 -0
  191. package/dist/skills/luxen-ui/references/button.md +309 -0
  192. package/dist/skills/luxen-ui/references/close-button.md +104 -0
  193. package/dist/skills/luxen-ui/references/dialog.md +435 -0
  194. package/dist/skills/luxen-ui/references/drawer.md +400 -0
  195. package/dist/skills/luxen-ui/references/progress.md +133 -0
  196. package/dist/skills/luxen-ui/references/select.md +100 -0
  197. package/dist/skills/luxen-ui/references/toast.md +396 -0
  198. package/dist/skills/luxen-ui/references/tree.md +359 -0
  199. package/package.json +116 -0
  200. package/postcss-plugin-prefix.js +63 -0
  201. package/vite-plugin.ts +29 -0
@@ -0,0 +1,396 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Toast
6
+
7
+ Toasts are used to display brief, non-blocking notifications that auto-dismiss. Commonly used to confirm actions, report errors, or surface system messages without interrupting the user's workflow.
8
+
9
+ <ElementSpec
10
+ tag="l-toast"
11
+ type="custom"
12
+ />
13
+
14
+ ## Options
15
+
16
+ ### Basic
17
+
18
+ Place a single `<l-toast>` element anywhere inside the `<body>`. Call `toast()` to display notifications.
19
+
20
+ ```html
21
+ <button
22
+ class="l-button"
23
+ onclick="toast({ text: 'This is a toast notification!' })"
24
+ >
25
+ Show notification
26
+ </button>
27
+ ```
28
+
29
+ ### Variants
30
+
31
+ Pass `variant` in the options to apply accent colors: `info`, `success`, `warning`, `danger`.
32
+
33
+ ```html
34
+ <div class="flex gap-2 flex-wrap">
35
+ <button
36
+ class="l-button"
37
+ onclick="toast({ text: 'Neutral message' })"
38
+ >
39
+ Neutral
40
+ </button>
41
+ <button
42
+ class="l-button"
43
+ onclick="toast({ text: 'Informational message', variant: 'info' })"
44
+ >
45
+ Info
46
+ </button>
47
+ <button
48
+ class="l-button"
49
+ onclick="toast({ text: 'Operation successful!', variant: 'success' })"
50
+ >
51
+ Success
52
+ </button>
53
+ <button
54
+ class="l-button"
55
+ onclick="toast({ text: 'Please be careful', variant: 'warning' })"
56
+ >
57
+ Warning
58
+ </button>
59
+ <button
60
+ class="l-button"
61
+ onclick="toast({ text: 'Something went wrong', variant: 'danger' })"
62
+ >
63
+ Danger
64
+ </button>
65
+ </div>
66
+ ```
67
+
68
+ ### Heading
69
+
70
+ Pass `heading` in the options to display a title above the message.
71
+
72
+ ```html
73
+ <div class="flex gap-2 flex-wrap">
74
+ <button
75
+ class="l-button"
76
+ onclick="
77
+ toast({
78
+ text: 'Your changes have been saved.',
79
+ heading: 'Saved',
80
+ variant: 'success',
81
+ timer: true,
82
+ })
83
+ "
84
+ >
85
+ Success
86
+ </button>
87
+ <button
88
+ class="l-button"
89
+ onclick="
90
+ toast({
91
+ text: 'This action cannot be undone.',
92
+ heading: 'Warning',
93
+ variant: 'warning',
94
+ timer: true,
95
+ })
96
+ "
97
+ >
98
+ Warning
99
+ </button>
100
+ <button
101
+ class="l-button"
102
+ onclick="
103
+ toast({ text: 'Please try again later.', heading: 'Error', variant: 'danger', timer: true })
104
+ "
105
+ >
106
+ Error
107
+ </button>
108
+ </div>
109
+ ```
110
+
111
+ ### Icon
112
+
113
+ Pass `icon` with an Iconify icon name to replace the accent bar with an icon, colored by variant.
114
+
115
+ ```html
116
+ <div class="flex gap-2 flex-wrap">
117
+ <button
118
+ class="l-button"
119
+ onclick="
120
+ toast({
121
+ text: 'Informational message',
122
+ heading: 'Info',
123
+ variant: 'info',
124
+ icon: 'lucide:info',
125
+ })
126
+ "
127
+ >
128
+ Info
129
+ </button>
130
+ <button
131
+ class="l-button"
132
+ onclick="
133
+ toast({
134
+ text: 'Operation successful!',
135
+ heading: 'Success',
136
+ variant: 'success',
137
+ icon: 'lucide:circle-check',
138
+ })
139
+ "
140
+ >
141
+ Success
142
+ </button>
143
+ <button
144
+ class="l-button"
145
+ onclick="
146
+ toast({
147
+ text: 'Please be careful',
148
+ heading: 'Warning',
149
+ variant: 'warning',
150
+ icon: 'lucide:triangle-alert',
151
+ })
152
+ "
153
+ >
154
+ Warning
155
+ </button>
156
+ <button
157
+ class="l-button"
158
+ onclick="
159
+ toast({
160
+ text: 'Something went wrong',
161
+ heading: 'Error',
162
+ variant: 'danger',
163
+ icon: 'lucide:circle-x',
164
+ })
165
+ "
166
+ >
167
+ Danger
168
+ </button>
169
+ </div>
170
+ ```
171
+
172
+ ### Duration
173
+
174
+ Control how long the toast stays visible. Set to `0` for persistent notifications that must be manually dismissed.
175
+
176
+ ```html
177
+ <div class="flex gap-2 flex-wrap">
178
+ <button
179
+ class="l-button"
180
+ onclick="toast({ text: 'Closes in 3 seconds', duration: 3000 })"
181
+ >
182
+ 3s
183
+ </button>
184
+ <button
185
+ class="l-button"
186
+ onclick="toast({ text: 'Closes in 10 seconds', duration: 10000 })"
187
+ >
188
+ 10s
189
+ </button>
190
+ <button
191
+ class="l-button"
192
+ onclick="toast({ text: 'Stays until dismissed', duration: 0 })"
193
+ >
194
+ Persistent
195
+ </button>
196
+ <button
197
+ class="l-button"
198
+ onclick="toast({ text: 'With countdown bar', duration: 5000, timer: true })"
199
+ >
200
+ With timer
201
+ </button>
202
+ </div>
203
+ ```
204
+
205
+ ### Placement
206
+
207
+ Position the toast stack using the `placement` attribute.
208
+
209
+ ```html
210
+ <div class="flex gap-2 flex-wrap">
211
+ <button
212
+ class="l-button"
213
+ onclick="
214
+ document.querySelector('l-toast').placement = 'top-start';
215
+ toast({ text: 'Top start' });
216
+ "
217
+ >
218
+ Top start
219
+ </button>
220
+ <button
221
+ class="l-button"
222
+ onclick="
223
+ document.querySelector('l-toast').placement = 'top-center';
224
+ toast({ text: 'Top center' });
225
+ "
226
+ >
227
+ Top center
228
+ </button>
229
+ <button
230
+ class="l-button"
231
+ onclick="
232
+ document.querySelector('l-toast').placement = 'top-end';
233
+ toast({ text: 'Top end' });
234
+ "
235
+ >
236
+ Top end
237
+ </button>
238
+ <button
239
+ class="l-button"
240
+ onclick="
241
+ document.querySelector('l-toast').placement = 'bottom-start';
242
+ toast({ text: 'Bottom start' });
243
+ "
244
+ >
245
+ Bottom start
246
+ </button>
247
+ <button
248
+ class="l-button"
249
+ onclick="
250
+ document.querySelector('l-toast').placement = 'bottom-center';
251
+ toast({ text: 'Bottom center' });
252
+ "
253
+ >
254
+ Bottom center
255
+ </button>
256
+ <button
257
+ class="l-button"
258
+ onclick="
259
+ document.querySelector('l-toast').placement = 'bottom-end';
260
+ toast({ text: 'Bottom end' });
261
+ "
262
+ >
263
+ Bottom end
264
+ </button>
265
+ </div>
266
+ ```
267
+
268
+ ### Programmatic API
269
+
270
+ ```js
271
+ import { toast } from 'luxen-ui/toast';
272
+
273
+ // Basic
274
+ toast({ text: 'Saved successfully!' });
275
+
276
+ // With variant
277
+ toast({ text: 'File uploaded', variant: 'success' });
278
+
279
+ // With heading and custom duration
280
+ toast({
281
+ text: 'Undo this action?',
282
+ heading: 'Warning',
283
+ variant: 'warning',
284
+ duration: 0,
285
+ });
286
+ ```
287
+
288
+ ### Features
289
+
290
+ - **Function-based API** — call `toast({ text: '...' })` from anywhere, no component wiring needed
291
+ - **Timer pausing on hover & focus** — countdown pauses when hovered or focused, resumes when the pointer or focus leaves
292
+ - **Timer pausing on hidden tab** — countdown pauses when the browser tab loses visibility, resumes with the remaining time when the user returns
293
+ - **Swipe to dismiss** — drag a toast horizontally to dismiss it; works with mouse, touch, and pen input
294
+ - **`@starting-style` enter animations** — smooth CSS entry transitions using the `@starting-style` at-rule
295
+ - **Keyboard dismiss** — press <kbd>Escape</kbd> to dismiss the most recent toast
296
+ - **FLIP reorder animations** — remaining toasts animate smoothly into their new positions when one is dismissed
297
+
298
+ ## Accessibility
299
+
300
+ ### Criteria
301
+
302
+ | Check | Description |
303
+ |-------|-------------|
304
+ | Live region | Container uses `role="log"` with `aria-live="polite"` for screen reader announcements |
305
+ | Role | Items use `role="status"` (`role="alert"` for `danger` variant) |
306
+ | Accessible name | Heading and message linked via `aria-labelledby` / `aria-describedby` |
307
+ | Decorative elements | Icons, accent bar, and timer bar are hidden with `aria-hidden="true"` |
308
+ | Timer pausing | Timer pauses on hover and focus, providing keyboard parity |
309
+ | Motion | Respects `prefers-reduced-motion` |
310
+
311
+ ### Rules
312
+ - Keep messages short and readable within the auto-dismiss duration
313
+ - Set `duration` to `5000` or longer for readability
314
+ - Use `variant="danger"` for critical alerts — it promotes the toast to `role="alert"`
315
+ - Ensure any actions in toasts are also available elsewhere on the page
316
+ - Use dialogs instead of toasts for information that requires user action
317
+
318
+ ### Keyboard interactions
319
+
320
+ | Key | Description |
321
+ |-----|-------------|
322
+ | Escape | Dismisses the most recent toast |
323
+ | Tab | Moves focus into the toast (pauses the auto-dismiss timer) |
324
+
325
+ ## API reference
326
+
327
+ ### Importing
328
+
329
+ ```js
330
+ // Side-effect import (registers <l-toast> element)
331
+ import 'luxen-ui/toast';
332
+
333
+ // Or import the standalone function (auto-creates <l-toast>)
334
+ import { toast } from 'luxen-ui/toast';
335
+ toast({ text: 'Hello!' });
336
+ ```
337
+
338
+ ```css
339
+ @import 'luxen-ui/css/toast';
340
+ @import 'luxen-ui/css/close-button';
341
+ ```
342
+
343
+ ### Attributes & Properties
344
+
345
+ <ApiTable :data="[
346
+ { Attribute: 'placement', Description: 'Position of the toast stack: `top-start`, `top-center`, `top-end` (default), `bottom-start`, `bottom-center`, `bottom-end`' },
347
+ { Attribute: 'duration', Description: 'Default auto-dismiss delay in ms. Default `5000`. Set to `0` or `Infinity` to keep open until dismissed' },
348
+ { Attribute: 'variant', Description: 'Default variant for toast items: `info`, `success`, `warning`, `danger`' },
349
+ ]" />
350
+
351
+ ### Methods
352
+
353
+ <ApiTable :data="[
354
+ { Method: 'toast()', Arguments: '`options: ToastOptions`', Returns: '`HTMLElement`', Description: 'Creates and shows a toast notification' },
355
+ ]" />
356
+
357
+ ### ToastOptions
358
+
359
+ <ApiTable :data="[
360
+ { Property: 'text', Type: '`string`', Default: '—', Description: 'The message text to display. Required unless `html` is provided' },
361
+ { Property: 'html', Type: '`string`', Default: '—', Description: 'HTML content for the message, sanitized via the [Sanitizer API](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Sanitizer_API). Ignored if `text` is provided' },
362
+ { Property: 'heading', Type: '`string`', Default: '—', Description: 'Heading text displayed above the message' },
363
+ { Property: 'icon', Type: '`string`', Default: '—', Description: 'Iconify icon name (e.g. `lucide:check`). Replaces the accent bar, colored by variant' },
364
+ { Property: 'variant', Type: '`string`', Default: 'Element\'s `variant`', Description: 'Override variant for this toast' },
365
+ { Property: 'duration', Type: '`number`', Default: 'Element\'s `duration`', Description: 'Override auto-dismiss delay in ms. `0` or `Infinity` to keep open until dismissed' },
366
+ { Property: 'timer', Type: '`boolean`', Default: '`false`', Description: 'Show a countdown progress bar at the bottom' },
367
+ ]" />
368
+
369
+ ### Events
370
+
371
+ <ApiTable :data="[
372
+ { Event: 'l-show', Detail: '`{ toast }`', Description: 'Emitted when a toast begins to show. Cancelable' },
373
+ { Event: 'l-after-show', Detail: '`{ toast }`', Description: 'Emitted after the show animation completes' },
374
+ { Event: 'l-hide', Detail: '`{ toast }`', Description: 'Emitted when a toast begins to hide. Cancelable' },
375
+ { Event: 'l-after-hide', Detail: '`{ toast }`', Description: 'Emitted after the hide animation completes and toast is removed' },
376
+ ]" />
377
+
378
+ ### CSS classes
379
+
380
+ <ApiTable :data="[
381
+ { Class: 'l-toast-item', Description: 'Toast item custom element (generated internally)' },
382
+ { Class: '.l-toast-accent', Description: 'Left accent bar, colored by variant' },
383
+ { Class: '.l-toast-content', Description: 'Content area' },
384
+ { Class: '.l-toast-heading', Description: 'Heading text' },
385
+ { Class: '.l-toast-message', Description: 'Message text' },
386
+ { Class: '.l-toast-timer', Description: 'Countdown progress bar (auto-added for timed toasts)' },
387
+ ]" />
388
+
389
+ ### CSS custom properties
390
+
391
+ <ApiTable :data="[
392
+ { Property: '--gap', Description: 'Gap between stacked items. Default `0.5rem`' },
393
+ { Property: '--width', Description: 'Width of the toast stack. Default `28rem`' },
394
+ { Property: '--show-duration', Description: 'Show animation duration. Default `200ms`' },
395
+ { Property: '--hide-duration', Description: 'Hide animation duration. Default `200ms`' },
396
+ ]" />