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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/css/elements/avatar.css +20 -0
- package/dist/css/elements/badge.css +159 -0
- package/dist/css/elements/button.css +171 -0
- package/dist/css/elements/close-button/circle.css +66 -0
- package/dist/css/elements/close-button/ring.css +71 -0
- package/dist/css/elements/close-button/square.css +70 -0
- package/dist/css/elements/disclosure.css +137 -0
- package/dist/css/elements/divider.css +75 -0
- package/dist/css/elements/input-otp.css +164 -0
- package/dist/css/elements/input-stepper/default.css +245 -0
- package/dist/css/elements/input-stepper/rounded.css +238 -0
- package/dist/css/elements/kbd.css +21 -0
- package/dist/css/elements/progress.css +114 -0
- package/dist/css/elements/select.css +71 -0
- package/dist/css/elements/skeleton.css +89 -0
- package/dist/css/elements/tabs/enclosed.css +148 -0
- package/dist/css/elements/tabs/line.css +138 -0
- package/dist/css/elements/toast.css +260 -0
- package/dist/css/index.css +885 -0
- package/dist/custom-elements.json +14424 -0
- package/dist/define.d.ts +9 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +16 -0
- package/dist/elements/avatar/avatar.css +128 -0
- package/dist/elements/avatar/avatar.d.ts +21 -0
- package/dist/elements/avatar/avatar.d.ts.map +1 -0
- package/dist/elements/avatar/avatar.js +106 -0
- package/dist/elements/avatar/index.d.ts +8 -0
- package/dist/elements/avatar/index.d.ts.map +1 -0
- package/dist/elements/avatar/index.js +4 -0
- package/dist/elements/badge/badge.d.ts +17 -0
- package/dist/elements/badge/badge.d.ts.map +1 -0
- package/dist/elements/badge/badge.js +34 -0
- package/dist/elements/badge/index.d.ts +8 -0
- package/dist/elements/badge/index.d.ts.map +1 -0
- package/dist/elements/badge/index.js +4 -0
- package/dist/elements/carousel/carousel.css +205 -0
- package/dist/elements/carousel/carousel.d.ts +148 -0
- package/dist/elements/carousel/carousel.d.ts.map +1 -0
- package/dist/elements/carousel/carousel.js +473 -0
- package/dist/elements/carousel/index.d.ts +8 -0
- package/dist/elements/carousel/index.d.ts.map +1 -0
- package/dist/elements/carousel/index.js +4 -0
- package/dist/elements/carousel-item/carousel-item.css +11 -0
- package/dist/elements/carousel-item/carousel-item.d.ts +13 -0
- package/dist/elements/carousel-item/carousel-item.d.ts.map +1 -0
- package/dist/elements/carousel-item/carousel-item.js +20 -0
- package/dist/elements/carousel-item/index.d.ts +8 -0
- package/dist/elements/carousel-item/index.d.ts.map +1 -0
- package/dist/elements/carousel-item/index.js +4 -0
- package/dist/elements/dialog/dialog.css +92 -0
- package/dist/elements/dialog/dialog.d.ts +56 -0
- package/dist/elements/dialog/dialog.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.js +204 -0
- package/dist/elements/dialog/dialog.styles.d.ts +8 -0
- package/dist/elements/dialog/dialog.styles.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.styles.js +8 -0
- package/dist/elements/dialog/index.d.ts +8 -0
- package/dist/elements/dialog/index.d.ts.map +1 -0
- package/dist/elements/dialog/index.js +4 -0
- package/dist/elements/divider/divider.d.ts +23 -0
- package/dist/elements/divider/divider.d.ts.map +1 -0
- package/dist/elements/divider/divider.js +49 -0
- package/dist/elements/divider/index.d.ts +8 -0
- package/dist/elements/divider/index.d.ts.map +1 -0
- package/dist/elements/divider/index.js +4 -0
- package/dist/elements/drawer/drawer.css +66 -0
- package/dist/elements/drawer/drawer.d.ts +34 -0
- package/dist/elements/drawer/drawer.d.ts.map +1 -0
- package/dist/elements/drawer/drawer.js +46 -0
- package/dist/elements/drawer/index.d.ts +8 -0
- package/dist/elements/drawer/index.d.ts.map +1 -0
- package/dist/elements/drawer/index.js +4 -0
- package/dist/elements/dropdown/dropdown.css +31 -0
- package/dist/elements/dropdown/dropdown.d.ts +64 -0
- package/dist/elements/dropdown/dropdown.d.ts.map +1 -0
- package/dist/elements/dropdown/dropdown.js +322 -0
- package/dist/elements/dropdown/index.d.ts +8 -0
- package/dist/elements/dropdown/index.d.ts.map +1 -0
- package/dist/elements/dropdown/index.js +4 -0
- package/dist/elements/dropdown-item/dropdown-item.css +51 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts +25 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts.map +1 -0
- package/dist/elements/dropdown-item/dropdown-item.js +110 -0
- package/dist/elements/dropdown-item/index.d.ts +8 -0
- package/dist/elements/dropdown-item/index.d.ts.map +1 -0
- package/dist/elements/dropdown-item/index.js +4 -0
- package/dist/elements/icon/icon.css +10 -0
- package/dist/elements/icon/icon.d.ts +19 -0
- package/dist/elements/icon/icon.d.ts.map +1 -0
- package/dist/elements/icon/icon.js +53 -0
- package/dist/elements/icon/index.d.ts +8 -0
- package/dist/elements/icon/index.d.ts.map +1 -0
- package/dist/elements/icon/index.js +4 -0
- package/dist/elements/input-otp/index.d.ts +8 -0
- package/dist/elements/input-otp/index.d.ts.map +1 -0
- package/dist/elements/input-otp/index.js +4 -0
- package/dist/elements/input-otp/input-otp.d.ts +31 -0
- package/dist/elements/input-otp/input-otp.d.ts.map +1 -0
- package/dist/elements/input-otp/input-otp.js +139 -0
- package/dist/elements/input-stepper/index.d.ts +8 -0
- package/dist/elements/input-stepper/index.d.ts.map +1 -0
- package/dist/elements/input-stepper/index.js +4 -0
- package/dist/elements/input-stepper/input-stepper.d.ts +63 -0
- package/dist/elements/input-stepper/input-stepper.d.ts.map +1 -0
- package/dist/elements/input-stepper/input-stepper.js +249 -0
- package/dist/elements/popover/index.d.ts +8 -0
- package/dist/elements/popover/index.d.ts.map +1 -0
- package/dist/elements/popover/index.js +4 -0
- package/dist/elements/popover/popover.css +61 -0
- package/dist/elements/popover/popover.d.ts +62 -0
- package/dist/elements/popover/popover.d.ts.map +1 -0
- package/dist/elements/popover/popover.js +244 -0
- package/dist/elements/rating/index.d.ts +8 -0
- package/dist/elements/rating/index.d.ts.map +1 -0
- package/dist/elements/rating/index.js +4 -0
- package/dist/elements/rating/rating.css +102 -0
- package/dist/elements/rating/rating.d.ts +38 -0
- package/dist/elements/rating/rating.d.ts.map +1 -0
- package/dist/elements/rating/rating.js +193 -0
- package/dist/elements/skeleton/index.d.ts +8 -0
- package/dist/elements/skeleton/index.d.ts.map +1 -0
- package/dist/elements/skeleton/index.js +4 -0
- package/dist/elements/skeleton/skeleton.d.ts +12 -0
- package/dist/elements/skeleton/skeleton.d.ts.map +1 -0
- package/dist/elements/skeleton/skeleton.js +13 -0
- package/dist/elements/spinner/index.d.ts +8 -0
- package/dist/elements/spinner/index.d.ts.map +1 -0
- package/dist/elements/spinner/index.js +4 -0
- package/dist/elements/spinner/spinner.css +28 -0
- package/dist/elements/spinner/spinner.d.ts +16 -0
- package/dist/elements/spinner/spinner.d.ts.map +1 -0
- package/dist/elements/spinner/spinner.js +37 -0
- package/dist/elements/tabs/index.d.ts +8 -0
- package/dist/elements/tabs/index.d.ts.map +1 -0
- package/dist/elements/tabs/index.js +4 -0
- package/dist/elements/tabs/tabs.d.ts +48 -0
- package/dist/elements/tabs/tabs.d.ts.map +1 -0
- package/dist/elements/tabs/tabs.js +210 -0
- package/dist/elements/toast/index.d.ts +9 -0
- package/dist/elements/toast/index.d.ts.map +1 -0
- package/dist/elements/toast/index.js +5 -0
- package/dist/elements/toast/toast.d.ts +72 -0
- package/dist/elements/toast/toast.d.ts.map +1 -0
- package/dist/elements/toast/toast.js +375 -0
- package/dist/elements/tooltip/index.d.ts +8 -0
- package/dist/elements/tooltip/index.d.ts.map +1 -0
- package/dist/elements/tooltip/index.js +4 -0
- package/dist/elements/tooltip/tooltip.css +37 -0
- package/dist/elements/tooltip/tooltip.d.ts +59 -0
- package/dist/elements/tooltip/tooltip.d.ts.map +1 -0
- package/dist/elements/tooltip/tooltip.js +231 -0
- package/dist/elements/tree/index.d.ts +8 -0
- package/dist/elements/tree/index.d.ts.map +1 -0
- package/dist/elements/tree/index.js +4 -0
- package/dist/elements/tree/tree.css +26 -0
- package/dist/elements/tree/tree.d.ts +76 -0
- package/dist/elements/tree/tree.d.ts.map +1 -0
- package/dist/elements/tree/tree.js +432 -0
- package/dist/elements/tree-item/index.d.ts +8 -0
- package/dist/elements/tree-item/index.d.ts.map +1 -0
- package/dist/elements/tree-item/index.js +4 -0
- package/dist/elements/tree-item/tree-item.css +172 -0
- package/dist/elements/tree-item/tree-item.d.ts +74 -0
- package/dist/elements/tree-item/tree-item.d.ts.map +1 -0
- package/dist/elements/tree-item/tree-item.js +301 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/registry.d.ts +22 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +33 -0
- package/dist/shared/controllers/popover.d.ts +44 -0
- package/dist/shared/controllers/popover.d.ts.map +1 -0
- package/dist/shared/controllers/popover.js +359 -0
- package/dist/shared/luxen-element.d.ts +20 -0
- package/dist/shared/luxen-element.d.ts.map +1 -0
- package/dist/shared/luxen-element.js +23 -0
- package/dist/shared/luxen-form-associated-element.d.ts +49 -0
- package/dist/shared/luxen-form-associated-element.d.ts.map +1 -0
- package/dist/shared/luxen-form-associated-element.js +123 -0
- package/dist/shared/styles/host.css +13 -0
- package/dist/shared/styles/host.styles.d.ts +9 -0
- package/dist/shared/styles/host.styles.d.ts.map +1 -0
- package/dist/shared/styles/host.styles.js +9 -0
- package/dist/skills/luxen-ui/SKILL.md +82 -0
- package/dist/skills/luxen-ui/references/avatar.md +259 -0
- package/dist/skills/luxen-ui/references/badge.md +289 -0
- package/dist/skills/luxen-ui/references/button.md +309 -0
- package/dist/skills/luxen-ui/references/close-button.md +104 -0
- package/dist/skills/luxen-ui/references/dialog.md +435 -0
- package/dist/skills/luxen-ui/references/drawer.md +400 -0
- package/dist/skills/luxen-ui/references/progress.md +133 -0
- package/dist/skills/luxen-ui/references/select.md +100 -0
- package/dist/skills/luxen-ui/references/toast.md +396 -0
- package/dist/skills/luxen-ui/references/tree.md +359 -0
- package/package.json +116 -0
- package/postcss-plugin-prefix.js +63 -0
- 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
|
+
]" />
|