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,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
|
+
]" />
|