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,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=&quot;l-close&quot;>`)' },
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=&quot;vertical&quot;', 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
+ ]" />