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,400 @@
|
|
|
1
|
+
---
|
|
2
|
+
outline: deep
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Drawer
|
|
6
|
+
|
|
7
|
+
Drawers display supplementary content in a panel that slides in from a screen edge. Commonly used for navigation menus, filters, and detail views without leaving the current page.
|
|
8
|
+
|
|
9
|
+
<ElementSpec
|
|
10
|
+
tag="l-drawer"
|
|
11
|
+
type="shadow"
|
|
12
|
+
/>
|
|
13
|
+
|
|
14
|
+
## Options
|
|
15
|
+
|
|
16
|
+
### Basic
|
|
17
|
+
|
|
18
|
+
Open with `command="--show"` on a trigger button. Slides in from the left.
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<button
|
|
22
|
+
type="button"
|
|
23
|
+
class="l-button"
|
|
24
|
+
command="--show"
|
|
25
|
+
commandfor="drawer-default"
|
|
26
|
+
>
|
|
27
|
+
Open drawer
|
|
28
|
+
</button>
|
|
29
|
+
|
|
30
|
+
<l-drawer
|
|
31
|
+
id="drawer-default"
|
|
32
|
+
title="Drawer"
|
|
33
|
+
>
|
|
34
|
+
<button
|
|
35
|
+
slot="close"
|
|
36
|
+
type="button"
|
|
37
|
+
class="l-close"
|
|
38
|
+
data-appearance="ring"
|
|
39
|
+
aria-label="Close"
|
|
40
|
+
command="--hide"
|
|
41
|
+
commandfor="drawer-default"
|
|
42
|
+
></button>
|
|
43
|
+
<p>This drawer slides in from the left.</p>
|
|
44
|
+
</l-drawer>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Placement
|
|
48
|
+
|
|
49
|
+
Set `placement` to control which edge the drawer slides from. Defaults to `start` (inline-start). Use `placement="end"` for the inline-end edge or `placement="bottom"` for the block-end edge.
|
|
50
|
+
|
|
51
|
+
#### End
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<button
|
|
55
|
+
type="button"
|
|
56
|
+
class="l-button"
|
|
57
|
+
command="--show"
|
|
58
|
+
commandfor="drawer-end"
|
|
59
|
+
>
|
|
60
|
+
Open right drawer
|
|
61
|
+
</button>
|
|
62
|
+
|
|
63
|
+
<l-drawer
|
|
64
|
+
id="drawer-end"
|
|
65
|
+
title="Drawer"
|
|
66
|
+
placement="end"
|
|
67
|
+
>
|
|
68
|
+
<button
|
|
69
|
+
slot="close"
|
|
70
|
+
type="button"
|
|
71
|
+
class="l-close"
|
|
72
|
+
data-appearance="ring"
|
|
73
|
+
aria-label="Close"
|
|
74
|
+
command="--hide"
|
|
75
|
+
commandfor="drawer-end"
|
|
76
|
+
></button>
|
|
77
|
+
<p>This drawer slides in from the right.</p>
|
|
78
|
+
</l-drawer>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### Bottom
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<button
|
|
85
|
+
type="button"
|
|
86
|
+
class="l-button"
|
|
87
|
+
command="--show"
|
|
88
|
+
commandfor="drawer-bottom"
|
|
89
|
+
>
|
|
90
|
+
Open bottom drawer
|
|
91
|
+
</button>
|
|
92
|
+
|
|
93
|
+
<l-drawer
|
|
94
|
+
id="drawer-bottom"
|
|
95
|
+
title="Drawer"
|
|
96
|
+
placement="bottom"
|
|
97
|
+
>
|
|
98
|
+
<button
|
|
99
|
+
slot="close"
|
|
100
|
+
type="button"
|
|
101
|
+
class="l-close"
|
|
102
|
+
data-appearance="ring"
|
|
103
|
+
aria-label="Close"
|
|
104
|
+
command="--hide"
|
|
105
|
+
commandfor="drawer-bottom"
|
|
106
|
+
></button>
|
|
107
|
+
<p>This drawer slides in from the bottom.</p>
|
|
108
|
+
</l-drawer>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Light dismiss
|
|
112
|
+
|
|
113
|
+
Add `light-dismiss` to close when the backdrop is clicked.
|
|
114
|
+
|
|
115
|
+
```html
|
|
116
|
+
<button
|
|
117
|
+
type="button"
|
|
118
|
+
class="l-button"
|
|
119
|
+
command="--show"
|
|
120
|
+
commandfor="drawer-light-dismiss"
|
|
121
|
+
>
|
|
122
|
+
Open drawer
|
|
123
|
+
</button>
|
|
124
|
+
|
|
125
|
+
<l-drawer
|
|
126
|
+
id="drawer-light-dismiss"
|
|
127
|
+
title="Drawer"
|
|
128
|
+
light-dismiss
|
|
129
|
+
>
|
|
130
|
+
<button
|
|
131
|
+
slot="close"
|
|
132
|
+
type="button"
|
|
133
|
+
class="l-close"
|
|
134
|
+
data-appearance="ring"
|
|
135
|
+
aria-label="Close"
|
|
136
|
+
command="--hide"
|
|
137
|
+
commandfor="drawer-light-dismiss"
|
|
138
|
+
></button>
|
|
139
|
+
<p>Click the backdrop or press Escape to close.</p>
|
|
140
|
+
</l-drawer>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Examples
|
|
144
|
+
|
|
145
|
+
### Navigation
|
|
146
|
+
|
|
147
|
+
Mobile navigation menu with link items.
|
|
148
|
+
|
|
149
|
+
```html
|
|
150
|
+
<button
|
|
151
|
+
type="button"
|
|
152
|
+
class="l-button"
|
|
153
|
+
command="--show"
|
|
154
|
+
commandfor="drawer-nav"
|
|
155
|
+
>
|
|
156
|
+
Menu
|
|
157
|
+
</button>
|
|
158
|
+
|
|
159
|
+
<l-drawer
|
|
160
|
+
id="drawer-nav"
|
|
161
|
+
title="Navigation"
|
|
162
|
+
>
|
|
163
|
+
<button
|
|
164
|
+
slot="close"
|
|
165
|
+
type="button"
|
|
166
|
+
class="l-close"
|
|
167
|
+
data-appearance="ring"
|
|
168
|
+
aria-label="Close"
|
|
169
|
+
command="--hide"
|
|
170
|
+
commandfor="drawer-nav"
|
|
171
|
+
></button>
|
|
172
|
+
<nav>
|
|
173
|
+
<ul class="flex flex-col gap-1">
|
|
174
|
+
<li>
|
|
175
|
+
<a
|
|
176
|
+
href="#"
|
|
177
|
+
class="flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-100"
|
|
178
|
+
>Home</a
|
|
179
|
+
>
|
|
180
|
+
</li>
|
|
181
|
+
<li>
|
|
182
|
+
<a
|
|
183
|
+
href="#"
|
|
184
|
+
class="flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-100"
|
|
185
|
+
>Products</a
|
|
186
|
+
>
|
|
187
|
+
</li>
|
|
188
|
+
<li>
|
|
189
|
+
<a
|
|
190
|
+
href="#"
|
|
191
|
+
class="flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-100"
|
|
192
|
+
>Orders</a
|
|
193
|
+
>
|
|
194
|
+
</li>
|
|
195
|
+
<li>
|
|
196
|
+
<a
|
|
197
|
+
href="#"
|
|
198
|
+
class="flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-100"
|
|
199
|
+
>Customers</a
|
|
200
|
+
>
|
|
201
|
+
</li>
|
|
202
|
+
<li>
|
|
203
|
+
<a
|
|
204
|
+
href="#"
|
|
205
|
+
class="flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-100"
|
|
206
|
+
>Settings</a
|
|
207
|
+
>
|
|
208
|
+
</li>
|
|
209
|
+
</ul>
|
|
210
|
+
</nav>
|
|
211
|
+
</l-drawer>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Filters
|
|
215
|
+
|
|
216
|
+
Right-side filter panel with a footer for actions.
|
|
217
|
+
|
|
218
|
+
```html
|
|
219
|
+
<button
|
|
220
|
+
type="button"
|
|
221
|
+
class="l-button"
|
|
222
|
+
command="--show"
|
|
223
|
+
commandfor="drawer-filters"
|
|
224
|
+
>
|
|
225
|
+
Filters
|
|
226
|
+
</button>
|
|
227
|
+
|
|
228
|
+
<l-drawer
|
|
229
|
+
id="drawer-filters"
|
|
230
|
+
title="Filters"
|
|
231
|
+
placement="end"
|
|
232
|
+
style="--size: 380px"
|
|
233
|
+
>
|
|
234
|
+
<button
|
|
235
|
+
slot="close"
|
|
236
|
+
type="button"
|
|
237
|
+
class="l-close"
|
|
238
|
+
data-appearance="ring"
|
|
239
|
+
aria-label="Close"
|
|
240
|
+
command="--hide"
|
|
241
|
+
commandfor="drawer-filters"
|
|
242
|
+
></button>
|
|
243
|
+
<div class="flex flex-col gap-6">
|
|
244
|
+
<fieldset>
|
|
245
|
+
<legend class="text-sm font-medium mb-2">Category</legend>
|
|
246
|
+
<div class="flex flex-col gap-2">
|
|
247
|
+
<label class="flex items-center gap-2 text-sm"
|
|
248
|
+
><input
|
|
249
|
+
type="checkbox"
|
|
250
|
+
checked
|
|
251
|
+
/>
|
|
252
|
+
Electronics</label
|
|
253
|
+
>
|
|
254
|
+
<label class="flex items-center gap-2 text-sm"><input type="checkbox" /> Clothing</label>
|
|
255
|
+
<label class="flex items-center gap-2 text-sm"><input type="checkbox" /> Books</label>
|
|
256
|
+
</div>
|
|
257
|
+
</fieldset>
|
|
258
|
+
<fieldset>
|
|
259
|
+
<legend class="text-sm font-medium mb-2">Price range</legend>
|
|
260
|
+
<div class="flex flex-col gap-2">
|
|
261
|
+
<label class="flex items-center gap-2 text-sm"
|
|
262
|
+
><input
|
|
263
|
+
type="radio"
|
|
264
|
+
name="price"
|
|
265
|
+
checked
|
|
266
|
+
/>
|
|
267
|
+
All prices</label
|
|
268
|
+
>
|
|
269
|
+
<label class="flex items-center gap-2 text-sm"
|
|
270
|
+
><input
|
|
271
|
+
type="radio"
|
|
272
|
+
name="price"
|
|
273
|
+
/>
|
|
274
|
+
Under $50</label
|
|
275
|
+
>
|
|
276
|
+
<label class="flex items-center gap-2 text-sm"
|
|
277
|
+
><input
|
|
278
|
+
type="radio"
|
|
279
|
+
name="price"
|
|
280
|
+
/>
|
|
281
|
+
$50 – $100</label
|
|
282
|
+
>
|
|
283
|
+
<label class="flex items-center gap-2 text-sm"
|
|
284
|
+
><input
|
|
285
|
+
type="radio"
|
|
286
|
+
name="price"
|
|
287
|
+
/>
|
|
288
|
+
Over $100</label
|
|
289
|
+
>
|
|
290
|
+
</div>
|
|
291
|
+
</fieldset>
|
|
292
|
+
</div>
|
|
293
|
+
<menu slot="footer">
|
|
294
|
+
<button
|
|
295
|
+
type="button"
|
|
296
|
+
class="l-button"
|
|
297
|
+
command="--hide"
|
|
298
|
+
commandfor="drawer-filters"
|
|
299
|
+
>
|
|
300
|
+
Cancel
|
|
301
|
+
</button>
|
|
302
|
+
<button
|
|
303
|
+
type="button"
|
|
304
|
+
class="l-button"
|
|
305
|
+
data-variant="primary"
|
|
306
|
+
>
|
|
307
|
+
Apply
|
|
308
|
+
</button>
|
|
309
|
+
</menu>
|
|
310
|
+
</l-drawer>
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Accessibility
|
|
314
|
+
|
|
315
|
+
### Criteria
|
|
316
|
+
|
|
317
|
+
| Check | Description |
|
|
318
|
+
|-------|-------------|
|
|
319
|
+
| Role | Rendered as a native `<dialog>` in the shadow root — built-in `dialog` role and modal semantics |
|
|
320
|
+
| Accessible name | The `title` property is rendered as an `<h2>` inside the drawer header |
|
|
321
|
+
| Focus management | Focus is trapped inside the modal; moves to the first focusable element on open |
|
|
322
|
+
| Focus restoration | Focus returns to the trigger element when the drawer closes |
|
|
323
|
+
| Close button | Consumer provides the close button via `slot="close"` with `aria-label="Close"` |
|
|
324
|
+
| Motion | Slide animation respects `prefers-reduced-motion` |
|
|
325
|
+
|
|
326
|
+
### Rules
|
|
327
|
+
- Always set a meaningful `title` — it becomes the drawer heading and accessible name
|
|
328
|
+
- Put the close button in `slot="close"` with `class="l-close"` and `command="--hide"` `commandfor="<id>"`
|
|
329
|
+
- Use `command="--show"` and `command="--hide"` with `commandfor` pointing at the drawer id. The `--` prefix is mandatory for custom elements
|
|
330
|
+
|
|
331
|
+
### Keyboard interactions
|
|
332
|
+
|
|
333
|
+
| Key | Description |
|
|
334
|
+
|-----|-------------|
|
|
335
|
+
| Escape | Closes the drawer |
|
|
336
|
+
| Tab | Cycles focus through focusable elements inside the drawer |
|
|
337
|
+
| Shift + Tab | Cycles focus backward through focusable elements inside the drawer |
|
|
338
|
+
|
|
339
|
+
## API reference
|
|
340
|
+
|
|
341
|
+
### Importing
|
|
342
|
+
|
|
343
|
+
```js
|
|
344
|
+
import 'luxen-ui/drawer';
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Attributes & Properties
|
|
348
|
+
|
|
349
|
+
<ApiTable :data="[
|
|
350
|
+
{ Attribute: 'title', Description: 'Drawer title rendered in the header as an `<h2>`' },
|
|
351
|
+
{ Attribute: 'open', Description: 'Whether the drawer is open. Reflects to attribute' },
|
|
352
|
+
{ Attribute: 'light-dismiss', Description: 'Close when the backdrop is clicked' },
|
|
353
|
+
{ Attribute: 'placement', Description: 'Edge the drawer slides from: `start` (default), `end`, or `bottom`' },
|
|
354
|
+
]" />
|
|
355
|
+
|
|
356
|
+
### Commands
|
|
357
|
+
|
|
358
|
+
Open and close the drawer by toggling its `open` property, or via the [Invoker Commands API](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) from any light-DOM button. Custom commands must start with `--`.
|
|
359
|
+
|
|
360
|
+
<ApiTable :data="[
|
|
361
|
+
{ Command: '--show', Description: 'Sets `open = true`' },
|
|
362
|
+
{ Command: '--hide', Description: 'Sets `open = false`' },
|
|
363
|
+
]" />
|
|
364
|
+
|
|
365
|
+
### Events
|
|
366
|
+
|
|
367
|
+
<ApiTable :data="[
|
|
368
|
+
{ Event: 'show', Description: 'Fired when the drawer opens' },
|
|
369
|
+
{ Event: 'after-show', Description: 'Fired after the open animation completes' },
|
|
370
|
+
{ Event: 'hide', Description: 'Fired when the drawer is about to close. Cancelable — call `event.preventDefault()` to keep it open' },
|
|
371
|
+
{ Event: 'after-hide', Description: 'Fired after the close animation completes' },
|
|
372
|
+
]" />
|
|
373
|
+
|
|
374
|
+
### Slots
|
|
375
|
+
|
|
376
|
+
<ApiTable :data="[
|
|
377
|
+
{ Slot: '(default)', Description: 'Body content' },
|
|
378
|
+
{ Slot: 'close', Description: 'Close button (typically `<button class="l-close">`)' },
|
|
379
|
+
{ Slot: 'footer', Description: 'Footer actions' },
|
|
380
|
+
]" />
|
|
381
|
+
|
|
382
|
+
### CSS parts
|
|
383
|
+
|
|
384
|
+
<ApiTable :data="[
|
|
385
|
+
{ Part: 'dialog', Description: 'The native `<dialog>` element' },
|
|
386
|
+
{ Part: 'header', Description: 'The header wrapper containing the title and close slot' },
|
|
387
|
+
{ Part: 'title', Description: 'The drawer title heading' },
|
|
388
|
+
{ Part: 'body', Description: 'The body wrapper around the default slot' },
|
|
389
|
+
{ Part: 'footer', Description: 'The footer wrapper around the footer slot' },
|
|
390
|
+
]" />
|
|
391
|
+
|
|
392
|
+
### CSS custom properties
|
|
393
|
+
|
|
394
|
+
<ApiTable :data="[
|
|
395
|
+
{ Name: '--size', Description: 'Drawer size on the axis perpendicular to its edge (width for `start`/`end`, height for `bottom`). Default `320px`' },
|
|
396
|
+
{ Name: '--border-radius', Description: 'Border radius on the inner edges. Default `0.75rem`' },
|
|
397
|
+
{ Name: '--show-duration', Description: 'Open transition duration. Default `200ms`' },
|
|
398
|
+
{ Name: '--hide-duration', Description: 'Close transition duration. Default `200ms`' },
|
|
399
|
+
{ Name: '--backdrop', Description: 'Backdrop color' },
|
|
400
|
+
]" />
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
outline: deep
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Progress
|
|
6
|
+
|
|
7
|
+
Progress bars are used to indicate the completion status of a task. Commonly used for file uploads, multi-step processes, and loading indicators with a known duration.
|
|
8
|
+
|
|
9
|
+
<ElementSpec
|
|
10
|
+
tag="progress"
|
|
11
|
+
type="native"
|
|
12
|
+
/>
|
|
13
|
+
|
|
14
|
+
## Options
|
|
15
|
+
|
|
16
|
+
### With value
|
|
17
|
+
|
|
18
|
+
Set the `value` attribute between `0` and `1`.
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<progress
|
|
22
|
+
class="l-progress"
|
|
23
|
+
aria-label="Loading content…"
|
|
24
|
+
value="0.6"
|
|
25
|
+
/>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Indeterminate
|
|
29
|
+
|
|
30
|
+
Omit the `value` attribute for an indeterminate animation.
|
|
31
|
+
|
|
32
|
+
```html
|
|
33
|
+
<progress
|
|
34
|
+
class="l-progress"
|
|
35
|
+
aria-label="Loading content…"
|
|
36
|
+
/>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Vertical
|
|
40
|
+
|
|
41
|
+
Add `data-orientation="vertical"` attribute.
|
|
42
|
+
|
|
43
|
+
```html
|
|
44
|
+
<style>
|
|
45
|
+
@scope (#demo-vertical) {
|
|
46
|
+
.l-progress {
|
|
47
|
+
--track-color: var(--color-purple-200);
|
|
48
|
+
--indicator-color: var(--color-purple-800);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
</style>
|
|
52
|
+
|
|
53
|
+
<ul
|
|
54
|
+
id="demo-vertical"
|
|
55
|
+
class="grid w-full"
|
|
56
|
+
>
|
|
57
|
+
<li class="flex px-3 py-2 h-16 bg-white">
|
|
58
|
+
<progress
|
|
59
|
+
class="l-progress"
|
|
60
|
+
aria-label="Loading content…"
|
|
61
|
+
data-orientation="vertical"
|
|
62
|
+
value="1"
|
|
63
|
+
></progress>
|
|
64
|
+
<div class="flex-1 px-4 content-center text-sm font-semibold">Paiement acceptée</div>
|
|
65
|
+
</li>
|
|
66
|
+
|
|
67
|
+
<li class="flex px-3 py-2 h-16 bg-purple-100">
|
|
68
|
+
<progress
|
|
69
|
+
class="l-progress"
|
|
70
|
+
aria-label="Loading content…"
|
|
71
|
+
data-orientation="vertical"
|
|
72
|
+
></progress>
|
|
73
|
+
<div class="flex-1 px-4 content-center text-sm font-semibold">
|
|
74
|
+
Première récurrence en cours de traitement
|
|
75
|
+
</div>
|
|
76
|
+
</li>
|
|
77
|
+
|
|
78
|
+
<li class="flex px-3 py-2 h-16 bg-white">
|
|
79
|
+
<progress
|
|
80
|
+
class="l-progress"
|
|
81
|
+
aria-label="Loading content…"
|
|
82
|
+
data-orientation="vertical"
|
|
83
|
+
value="0"
|
|
84
|
+
></progress>
|
|
85
|
+
<div class="flex-1 px-4 content-center text-sm font-semibold">Transaction Terminée</div>
|
|
86
|
+
</li>
|
|
87
|
+
</ul>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Accessibility
|
|
91
|
+
|
|
92
|
+
### Criteria
|
|
93
|
+
|
|
94
|
+
| Check | Description |
|
|
95
|
+
|-------|-------------|
|
|
96
|
+
| Role | Uses native `<progress>` — implicit `progressbar` role |
|
|
97
|
+
| Accessible name | Must have an associated `<label>` or `aria-label` |
|
|
98
|
+
| Color | Indicator and track colors meet non-text contrast ratio |
|
|
99
|
+
| Motion | Indeterminate animation respects `prefers-reduced-motion` |
|
|
100
|
+
|
|
101
|
+
### Rules
|
|
102
|
+
- Always pair the `<progress>` element with a visible `<label>` or `aria-label`
|
|
103
|
+
- Set `value` for determinate progress; omit for indeterminate
|
|
104
|
+
|
|
105
|
+
## API reference
|
|
106
|
+
|
|
107
|
+
### Importing
|
|
108
|
+
|
|
109
|
+
```css
|
|
110
|
+
@import 'luxen-ui/css/progress';
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Attributes & Properties
|
|
114
|
+
|
|
115
|
+
<ApiTable :data="[
|
|
116
|
+
{ Attribute: 'value', Description: 'Current progress between `0` and `1` (omit for indeterminate)' },
|
|
117
|
+
{ Attribute: 'data-orientation="vertical"', Description: 'Vertical orientation' },
|
|
118
|
+
]" />
|
|
119
|
+
|
|
120
|
+
### CSS classes
|
|
121
|
+
|
|
122
|
+
<ApiTable :data="[
|
|
123
|
+
{ Class: '.l-progress', Description: 'Base progress bar style' },
|
|
124
|
+
]" />
|
|
125
|
+
|
|
126
|
+
### CSS custom properties
|
|
127
|
+
|
|
128
|
+
<ApiTable :data="[
|
|
129
|
+
{ Name: '--size', Description: 'Bar thickness (default: 4px)' },
|
|
130
|
+
{ Name: '--track-color', Description: 'Track background color' },
|
|
131
|
+
{ Name: '--indicator-color', Description: 'Fill/indicator color' },
|
|
132
|
+
{ Name: '--indeterminate-animation', Description: 'Animation name for indeterminate state' },
|
|
133
|
+
]" />
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
outline: deep
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Select
|
|
6
|
+
|
|
7
|
+
Selects are used to pick a single option from a dropdown list. Commonly used in forms for choosing categories, countries, or any predefined set of values.
|
|
8
|
+
|
|
9
|
+
<ElementSpec
|
|
10
|
+
tag="select"
|
|
11
|
+
type="native"
|
|
12
|
+
/>
|
|
13
|
+
|
|
14
|
+
## Options
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<select class="l-select">
|
|
18
|
+
<button class="l-button">
|
|
19
|
+
<selectedcontent> </selectedcontent>
|
|
20
|
+
<svg
|
|
21
|
+
width="24"
|
|
22
|
+
height="24"
|
|
23
|
+
viewBox="0 0 24 24"
|
|
24
|
+
>
|
|
25
|
+
<path
|
|
26
|
+
fill="currentColor"
|
|
27
|
+
d="m7 10l5 5l5-5z"
|
|
28
|
+
/>
|
|
29
|
+
</svg>
|
|
30
|
+
</button>
|
|
31
|
+
<option class="l-select-item">
|
|
32
|
+
<span class="option-text">Item 1</span>
|
|
33
|
+
</option>
|
|
34
|
+
<option class="l-select-item">
|
|
35
|
+
<span class="option-text">Item 2</span>
|
|
36
|
+
</option>
|
|
37
|
+
<option class="l-select-item">
|
|
38
|
+
<span class="option-text">Item 3</span>
|
|
39
|
+
</option>
|
|
40
|
+
</select>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
### Criteria
|
|
46
|
+
|
|
47
|
+
| Check | Description |
|
|
48
|
+
|-------|-------------|
|
|
49
|
+
| Role | Uses native `<select>` — built-in `combobox`/`listbox` semantics |
|
|
50
|
+
| Accessible name | Must have an associated `<label>` element |
|
|
51
|
+
| Disabled state | Native `disabled` attribute prevents interaction and announces as disabled |
|
|
52
|
+
| Required state | Native `required` attribute communicates mandatory field to assistive tech |
|
|
53
|
+
|
|
54
|
+
### Rules
|
|
55
|
+
- Always pair the `<select>` with a visible `<label>` element using `for`/`id`
|
|
56
|
+
- Use native `<option>` elements for choices — the browser handles all ARIA semantics
|
|
57
|
+
|
|
58
|
+
### Keyboard interactions
|
|
59
|
+
|
|
60
|
+
| Key | Description |
|
|
61
|
+
|-----|-------------|
|
|
62
|
+
| Enter | Opens the option list or confirms selection |
|
|
63
|
+
| Space | Opens the option list |
|
|
64
|
+
| ArrowDown | Moves to the next option |
|
|
65
|
+
| ArrowUp | Moves to the previous option |
|
|
66
|
+
| Tab | Moves focus to the next focusable element |
|
|
67
|
+
|
|
68
|
+
## API reference
|
|
69
|
+
|
|
70
|
+
### Importing
|
|
71
|
+
|
|
72
|
+
```css
|
|
73
|
+
@import 'luxen-ui/css/select';
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Attributes & Properties
|
|
77
|
+
|
|
78
|
+
<ApiTable :data="[
|
|
79
|
+
{ Attribute: 'disabled', Description: 'Disables the select' },
|
|
80
|
+
{ Attribute: 'required', Description: 'Marks the field as required' },
|
|
81
|
+
{ Attribute: 'multiple', Description: 'Allows multiple selections' },
|
|
82
|
+
]" />
|
|
83
|
+
|
|
84
|
+
### Events
|
|
85
|
+
|
|
86
|
+
<ApiTable :data="events" />
|
|
87
|
+
|
|
88
|
+
### CSS classes
|
|
89
|
+
|
|
90
|
+
<ApiTable :data="[
|
|
91
|
+
{ Class: '.l-select', Description: 'Base select element with `appearance: base-select`' },
|
|
92
|
+
{ Class: '.l-select-item', Description: 'Option styling with checkmark indicator' },
|
|
93
|
+
]" />
|
|
94
|
+
|
|
95
|
+
### CSS custom properties
|
|
96
|
+
|
|
97
|
+
<ApiTable :data="[
|
|
98
|
+
{ Name: '--radius', Description: 'Border radius (default: 4px)' },
|
|
99
|
+
{ Name: '--border-color', Description: 'Border color (adapts to light/dark)' },
|
|
100
|
+
]" />
|