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,82 @@
1
+ ---
2
+ name: luxen-ui
3
+ description: >-
4
+ Generate UI with Luxen UI, a CSS-first web component library.
5
+ Provides CSS classes for native HTML elements (button, select, progress,
6
+ close-button) and custom elements (l-badge, l-dialog, l-toast). Use when
7
+ building interfaces with Luxen UI.
8
+ metadata:
9
+ version: "0.1.0"
10
+ ---
11
+
12
+ # Luxen UI
13
+
14
+ A CSS-first web component library built on web standards. Most elements are plain CSS classes applied to native HTML elements — no JavaScript required. Custom elements (like `<l-badge>`) use Lit with minimal Shadow DOM.
15
+
16
+ ## Installation
17
+
18
+ Import per-element CSS:
19
+
20
+ ```css
21
+ @import 'luxen-ui/css/button';
22
+ @import 'luxen-ui/css/close-button/ring';
23
+ ```
24
+
25
+ Or import all elements:
26
+
27
+ ```css
28
+ @import 'luxen-ui/css';
29
+ ```
30
+
31
+ For custom elements, also import the JavaScript:
32
+
33
+ ```js
34
+ import 'luxen-ui';
35
+ ```
36
+
37
+ ## Available Elements
38
+
39
+ | Element | Type | Selector | Reference |
40
+ |---------|------|----------|-----------|
41
+ | Avatar | Custom element | `<l-avatar>` | [references/avatar.md](references/avatar.md) |
42
+ | Badge | Custom element | `<l-badge>` | [references/badge.md](references/badge.md) |
43
+ | Button | CSS class | `.l-button` | [references/button.md](references/button.md) |
44
+ | Close button | CSS class | `.l-close` | [references/close-button.md](references/close-button.md) |
45
+ | Dialog | Custom element | `<l-dialog>` | [references/dialog.md](references/dialog.md) |
46
+ | Drawer | Custom element | `<l-drawer>` | [references/drawer.md](references/drawer.md) |
47
+ | Select | CSS class | `.l-select` | [references/select.md](references/select.md) |
48
+ | Progress | CSS class | `.l-progress` | [references/progress.md](references/progress.md) |
49
+ | Toast | Custom element | `<l-toast>` | [references/toast.md](references/toast.md) |
50
+ | Tree | Custom element | `<l-tree>` | [references/tree.md](references/tree.md) |
51
+
52
+ ## Quick Patterns
53
+
54
+ A button:
55
+
56
+ ```html
57
+ <button class="l-button">Label</button>
58
+ <button class="l-button" data-variant="primary">Primary</button>
59
+ ```
60
+
61
+ A badge:
62
+
63
+ ```html
64
+ <l-badge>Default</l-badge>
65
+ <l-badge style="--variant: success">Success</l-badge>
66
+ ```
67
+
68
+ A dialog:
69
+
70
+ ```html
71
+ <button class="l-button" command="--show" commandfor="my-dialog">Open</button>
72
+ <l-dialog id="my-dialog" title="Dialog title">
73
+ <button slot="close" class="l-close" data-appearance="ring" aria-label="Close"
74
+ command="--hide" commandfor="my-dialog"></button>
75
+ <p>Dialog content</p>
76
+ <div slot="footer">
77
+ <button class="l-button" command="--hide" commandfor="my-dialog">Close</button>
78
+ </div>
79
+ </l-dialog>
80
+ ```
81
+
82
+ For full usage details, see the reference files for each element.
@@ -0,0 +1,259 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Avatar
6
+
7
+ Avatars are used to represent a user or entity with a profile image, initials, or icon fallback. Commonly used in headers, comments, contact lists, and user cards.
8
+
9
+ <ElementSpec
10
+ tag="l-avatar"
11
+ type="shadow"
12
+ />
13
+
14
+ ## Options
15
+
16
+ ### Image
17
+
18
+ Set `src` and `name` attributes. Falls back to initials if the image fails to load.
19
+
20
+ ```html
21
+ <l-avatar
22
+ src="https://i.pravatar.cc/150?img=58"
23
+ name="John Doe"
24
+ ></l-avatar>
25
+ <l-avatar
26
+ src="https://i.pravatar.cc/150?img=32"
27
+ name="Jane Smith"
28
+ ></l-avatar>
29
+ <l-avatar
30
+ src="https://i.pravatar.cc/150?img=11"
31
+ name="Alex Chen"
32
+ ></l-avatar>
33
+ ```
34
+
35
+ ### Initials
36
+
37
+ Set `name` to auto-extract initials, or slot custom text content.
38
+
39
+ ```html
40
+ <l-avatar name="John Doe"></l-avatar>
41
+ <l-avatar name="Jane Smith"></l-avatar>
42
+ <l-avatar name="Alex"></l-avatar>
43
+ <l-avatar>+5</l-avatar>
44
+ ```
45
+
46
+ ### Custom colors
47
+
48
+ Set `--color` to a base color. Text is auto-derived via relative color syntax.
49
+
50
+ ```html
51
+ <div class="flex items-end gap-3">
52
+ <l-avatar
53
+ style="--color: var(--color-red-200)"
54
+ name="Anna Bell"
55
+ ></l-avatar>
56
+ <l-avatar
57
+ style="--color: var(--color-orange-200)"
58
+ name="Bob Chen"
59
+ ></l-avatar>
60
+ <l-avatar
61
+ style="--color: var(--color-yellow-200)"
62
+ name="Cleo Dane"
63
+ ></l-avatar>
64
+ <l-avatar
65
+ style="--color: var(--color-green-200)"
66
+ name="Dan Evans"
67
+ ></l-avatar>
68
+ <l-avatar
69
+ style="--color: var(--color-blue-200)"
70
+ name="Eve Fox"
71
+ ></l-avatar>
72
+ <l-avatar
73
+ style="--color: var(--color-purple-200)"
74
+ name="Fay Grant"
75
+ ></l-avatar>
76
+ </div>
77
+ ```
78
+
79
+ ### Sizes
80
+
81
+ Add the `size` attribute: `xs`, `sm`, `md` (default), `lg`, or `xl`.
82
+
83
+ ```html
84
+ <div class="flex items-end gap-3">
85
+ <l-avatar
86
+ size="xs"
87
+ name="John Doe"
88
+ ></l-avatar>
89
+ <l-avatar
90
+ size="sm"
91
+ name="John Doe"
92
+ ></l-avatar>
93
+ <l-avatar name="John Doe"></l-avatar>
94
+ <l-avatar
95
+ size="lg"
96
+ name="John Doe"
97
+ ></l-avatar>
98
+ <l-avatar
99
+ size="xl"
100
+ name="John Doe"
101
+ ></l-avatar>
102
+ </div>
103
+ ```
104
+
105
+ ### Circle
106
+
107
+ Set `--appearance: circle` for a fully circular shape. Default is a rounded square.
108
+
109
+ ```html
110
+ <l-avatar
111
+ style="--appearance: circle"
112
+ src="https://i.pravatar.cc/150?img=58"
113
+ name="John Doe"
114
+ ></l-avatar>
115
+ <l-avatar
116
+ style="--appearance: circle"
117
+ name="Jane Smith"
118
+ ></l-avatar>
119
+ <l-avatar style="--appearance: circle"></l-avatar>
120
+ ```
121
+
122
+ ### Badge
123
+
124
+ Set `badge` to a number to show a count indicator at the bottom-right corner.
125
+
126
+ ```html
127
+ <l-avatar
128
+ badge="3"
129
+ src="https://i.pravatar.cc/150?img=58"
130
+ name="John Doe"
131
+ ></l-avatar>
132
+ <l-avatar
133
+ badge="25"
134
+ src="https://i.pravatar.cc/150?img=32"
135
+ name="Jane Smith"
136
+ ></l-avatar>
137
+ <l-avatar
138
+ badge="99"
139
+ name="Alex Chen"
140
+ ></l-avatar>
141
+ ```
142
+
143
+ ### Interactive
144
+
145
+ Add the `interactive` attribute to render the avatar as a `<button>`. Includes focus ring and hover state.
146
+
147
+ ```html
148
+ <l-avatar
149
+ interactive
150
+ src="https://i.pravatar.cc/150?img=58"
151
+ name="John Doe"
152
+ ></l-avatar>
153
+ <l-avatar
154
+ interactive
155
+ name="Jane Smith"
156
+ ></l-avatar>
157
+ <l-avatar
158
+ interactive
159
+ style="--appearance: circle"
160
+ src="https://i.pravatar.cc/150?img=32"
161
+ name="Alex Chen"
162
+ ></l-avatar>
163
+ ```
164
+
165
+ ### Group
166
+
167
+ Wrap avatars in `.l-avatar-group` for an overlapping stack with a surface-colored ring.
168
+
169
+ ```html
170
+ <div class="grid gap-4">
171
+ <div class="l-avatar-group">
172
+ <l-avatar
173
+ src="https://i.pravatar.cc/150?img=58"
174
+ name="John Doe"
175
+ ></l-avatar>
176
+ <l-avatar
177
+ src="https://i.pravatar.cc/150?img=32"
178
+ name="Jane Smith"
179
+ ></l-avatar>
180
+ <l-avatar
181
+ src="https://i.pravatar.cc/150?img=12"
182
+ name="Alex Chen"
183
+ ></l-avatar>
184
+ <l-avatar name="Sam Wilson"></l-avatar>
185
+ </div>
186
+ <div class="l-avatar-group">
187
+ <l-avatar
188
+ style="--appearance: circle"
189
+ src="https://i.pravatar.cc/150?img=58"
190
+ name="John Doe"
191
+ ></l-avatar>
192
+ <l-avatar
193
+ style="--appearance: circle"
194
+ src="https://i.pravatar.cc/150?img=32"
195
+ name="Jane Smith"
196
+ ></l-avatar>
197
+ <l-avatar
198
+ style="--appearance: circle"
199
+ src="https://i.pravatar.cc/150?img=12"
200
+ name="Alex Chen"
201
+ ></l-avatar>
202
+ <l-avatar
203
+ style="--appearance: circle"
204
+ name="Sam Wilson"
205
+ ></l-avatar>
206
+ </div>
207
+ </div>
208
+ ```
209
+
210
+ ## Accessibility
211
+
212
+ ### Criteria
213
+
214
+ | Check | Description |
215
+ |-------|-------------|
216
+ | Role | Default `role="img"` communicates the avatar as an image |
217
+ | Accessible name | `aria-label` is set automatically from the `name` attribute |
218
+ | Interactive mode | When `interactive` is set, renders as a `<button>` with focus ring and hover states |
219
+ | Decorative elements | Badge count is hidden from assistive tech with `aria-hidden="true"` |
220
+ | Image fallback | Falls back to initials (then default icon) if image fails to load |
221
+
222
+ ### Rules
223
+ - Always provide the `name` attribute — it drives both `aria-label` and the initials fallback
224
+ - Add `interactive` only when the avatar triggers an action (e.g., opens a profile menu)
225
+
226
+ ### Keyboard interactions
227
+
228
+ When `interactive` is set:
229
+
230
+ | Key | Description |
231
+ |-----|-------------|
232
+ | Enter | Activates the avatar button |
233
+ | Space | Activates the avatar button |
234
+ | Tab | Moves focus to the next focusable element |
235
+
236
+ ## API reference
237
+
238
+ ### Importing
239
+
240
+ ```js
241
+ import 'luxen-ui/avatar';
242
+ ```
243
+
244
+ ### Attributes & Properties
245
+
246
+ <ApiTable :data="attributes" />
247
+
248
+ ### CSS classes
249
+
250
+ <ApiTable :data="[
251
+ { Class: '.l-avatar-group', Description: 'Flex container with negative margins and surface-colored ring for overlapping avatars' },
252
+ ]" />
253
+
254
+ ### CSS custom properties
255
+
256
+ <ApiTable :data="[
257
+ { Property: '--color', Description: 'Base color for initials/icon background. Text color is auto-derived via relative color syntax' },
258
+ { Property: '--appearance', Description: 'Set to `circle` for a fully circular shape (default is rounded square)' },
259
+ ]" />
@@ -0,0 +1,289 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Badge
6
+
7
+ Badges are used to draw attention and display statuses or counts. Commonly used in tabular data, lists, and navigation to indicate state or category.
8
+
9
+ <ElementSpec
10
+ tag="l-badge"
11
+ type="custom"
12
+ />
13
+
14
+ ## Options
15
+
16
+ ### Appearance
17
+
18
+ Add `appearance="filled"` (tinted background, no border), `appearance="filled-outlined"` (tinted background with border), or `appearance="accent"` (strong background, contrast text). Default is outlined (border, no background).
19
+
20
+ ```html
21
+ <div class="flex flex-col gap-3">
22
+ <div class="flex flex-wrap items-center gap-2">
23
+ <span class="text-sm text-color-tertiary w-28">Outlined</span>
24
+ <l-badge>Default</l-badge>
25
+ <l-badge variant="info">Info</l-badge>
26
+ <l-badge variant="success">Success</l-badge>
27
+ <l-badge variant="warning">Warning</l-badge>
28
+ <l-badge variant="danger">Danger</l-badge>
29
+ </div>
30
+ <div class="flex flex-wrap items-center gap-2">
31
+ <span class="text-sm text-color-tertiary w-28">Filled</span>
32
+ <l-badge appearance="filled">Default</l-badge>
33
+ <l-badge
34
+ appearance="filled"
35
+ variant="info"
36
+ >Info</l-badge
37
+ >
38
+ <l-badge
39
+ appearance="filled"
40
+ variant="success"
41
+ >Success</l-badge
42
+ >
43
+ <l-badge
44
+ appearance="filled"
45
+ variant="warning"
46
+ >Warning</l-badge
47
+ >
48
+ <l-badge
49
+ appearance="filled"
50
+ variant="danger"
51
+ >Danger</l-badge
52
+ >
53
+ </div>
54
+ <div class="flex flex-wrap items-center gap-2">
55
+ <span class="text-sm text-color-tertiary w-28">Filled outlined</span>
56
+ <l-badge appearance="filled-outlined">Default</l-badge>
57
+ <l-badge
58
+ appearance="filled-outlined"
59
+ variant="info"
60
+ >Info</l-badge
61
+ >
62
+ <l-badge
63
+ appearance="filled-outlined"
64
+ variant="success"
65
+ >Success</l-badge
66
+ >
67
+ <l-badge
68
+ appearance="filled-outlined"
69
+ variant="warning"
70
+ >Warning</l-badge
71
+ >
72
+ <l-badge
73
+ appearance="filled-outlined"
74
+ variant="danger"
75
+ >Danger</l-badge
76
+ >
77
+ </div>
78
+ <div class="flex flex-wrap items-center gap-2">
79
+ <span class="text-sm text-color-tertiary w-28">Accent</span>
80
+ <l-badge appearance="accent">Default</l-badge>
81
+ <l-badge
82
+ appearance="accent"
83
+ variant="info"
84
+ >Info</l-badge
85
+ >
86
+ <l-badge
87
+ appearance="accent"
88
+ variant="success"
89
+ >Success</l-badge
90
+ >
91
+ <l-badge
92
+ appearance="accent"
93
+ variant="warning"
94
+ >Warning</l-badge
95
+ >
96
+ <l-badge
97
+ appearance="accent"
98
+ variant="danger"
99
+ >Danger</l-badge
100
+ >
101
+ </div>
102
+ </div>
103
+ ```
104
+
105
+ ### Pill
106
+
107
+ Add the `pill` attribute for a fully rounded shape.
108
+
109
+ ```html
110
+ <div class="flex flex-col gap-3">
111
+ <div class="flex flex-wrap items-center gap-2">
112
+ <span class="text-sm text-color-tertiary w-28">Outlined</span>
113
+ <l-badge pill>Default</l-badge>
114
+ <l-badge
115
+ pill
116
+ variant="info"
117
+ >Info</l-badge
118
+ >
119
+ <l-badge
120
+ pill
121
+ variant="success"
122
+ >Success</l-badge
123
+ >
124
+ <l-badge
125
+ pill
126
+ variant="warning"
127
+ >Warning</l-badge
128
+ >
129
+ <l-badge
130
+ pill
131
+ variant="danger"
132
+ >Danger</l-badge
133
+ >
134
+ </div>
135
+ <div class="flex flex-wrap items-center gap-2">
136
+ <span class="text-sm text-color-tertiary w-28">Filled</span>
137
+ <l-badge
138
+ pill
139
+ appearance="filled"
140
+ >Default</l-badge
141
+ >
142
+ <l-badge
143
+ pill
144
+ appearance="filled"
145
+ variant="info"
146
+ >Info</l-badge
147
+ >
148
+ <l-badge
149
+ pill
150
+ appearance="filled"
151
+ variant="success"
152
+ >Success</l-badge
153
+ >
154
+ <l-badge
155
+ pill
156
+ appearance="filled"
157
+ variant="warning"
158
+ >Warning</l-badge
159
+ >
160
+ <l-badge
161
+ pill
162
+ appearance="filled"
163
+ variant="danger"
164
+ >Danger</l-badge
165
+ >
166
+ </div>
167
+ <div class="flex flex-wrap items-center gap-2">
168
+ <span class="text-sm text-color-tertiary w-28">Filled outlined</span>
169
+ <l-badge
170
+ pill
171
+ appearance="filled-outlined"
172
+ >Default</l-badge
173
+ >
174
+ <l-badge
175
+ pill
176
+ appearance="filled-outlined"
177
+ variant="info"
178
+ >Info</l-badge
179
+ >
180
+ <l-badge
181
+ pill
182
+ appearance="filled-outlined"
183
+ variant="success"
184
+ >Success</l-badge
185
+ >
186
+ <l-badge
187
+ pill
188
+ appearance="filled-outlined"
189
+ variant="warning"
190
+ >Warning</l-badge
191
+ >
192
+ <l-badge
193
+ pill
194
+ appearance="filled-outlined"
195
+ variant="danger"
196
+ >Danger</l-badge
197
+ >
198
+ </div>
199
+ <div class="flex flex-wrap items-center gap-2">
200
+ <span class="text-sm text-color-tertiary w-28">Accent</span>
201
+ <l-badge
202
+ pill
203
+ appearance="accent"
204
+ >Default</l-badge
205
+ >
206
+ <l-badge
207
+ pill
208
+ appearance="accent"
209
+ variant="info"
210
+ >Info</l-badge
211
+ >
212
+ <l-badge
213
+ pill
214
+ appearance="accent"
215
+ variant="success"
216
+ >Success</l-badge
217
+ >
218
+ <l-badge
219
+ pill
220
+ appearance="accent"
221
+ variant="warning"
222
+ >Warning</l-badge
223
+ >
224
+ <l-badge
225
+ pill
226
+ appearance="accent"
227
+ variant="danger"
228
+ >Danger</l-badge
229
+ >
230
+ </div>
231
+ </div>
232
+ ```
233
+
234
+ ### Sizes
235
+
236
+ Add `size="sm"` or `size="lg"`. Default is md.
237
+
238
+ ```html
239
+ <l-badge size="sm">Small</l-badge>
240
+ <l-badge>Medium</l-badge>
241
+ <l-badge size="lg">Large</l-badge>
242
+ ```
243
+
244
+ ### Variants
245
+
246
+ Add `variant="info"`, `variant="success"`, `variant="warning"`, or `variant="danger"`. Default is neutral.
247
+
248
+ ```html
249
+ <l-badge>Neutral</l-badge>
250
+ <l-badge variant="info">Info</l-badge>
251
+ <l-badge variant="success">Success</l-badge>
252
+ <l-badge variant="warning">Warning</l-badge>
253
+ <l-badge variant="danger">Danger</l-badge>
254
+ ```
255
+
256
+ ## Accessibility
257
+
258
+ ### Criteria
259
+
260
+ | Check | Description |
261
+ |-------|-------------|
262
+ | Color contrast | Text and background meet minimum contrast ratio across all appearances and variants |
263
+ | Non-text contrast | Badge borders meet non-text contrast minimum against adjacent surfaces |
264
+ | Not color alone | Do not rely on badge color alone to convey status — always include a text label |
265
+
266
+ ### Rules
267
+ - Always include visible text inside the badge — do not use color alone to convey meaning
268
+ - When a badge conveys dynamic status, wrap it in a `role="status"` container so screen readers announce changes
269
+
270
+ ## API reference
271
+
272
+ ### Importing
273
+
274
+ ```js
275
+ import 'luxen-ui/badge';
276
+ ```
277
+
278
+ ```css
279
+ @import 'luxen-ui/css/badge';
280
+ ```
281
+
282
+ ### Attributes & Properties
283
+
284
+ <ApiTable :data="[
285
+ { Attribute: 'size', Description: 'Badge size (`sm`, `lg`). Default is md.' },
286
+ { Attribute: 'appearance', Description: 'Visual appearance (`filled`, `filled-outlined`, `accent`). Default is outlined.' },
287
+ { Attribute: 'variant', Description: 'Style variant (`info`, `success`, `warning`, `danger`). Default is neutral.' },
288
+ { Attribute: 'pill', Description: 'Fully rounded pill shape' },
289
+ ]" />