sv5ui 0.0.1
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 +124 -0
- package/dist/Alert/Alert.svelte +120 -0
- package/dist/Alert/Alert.svelte.d.ts +5 -0
- package/dist/Alert/alert.types.d.ts +99 -0
- package/dist/Alert/alert.types.js +1 -0
- package/dist/Alert/alert.variants.d.ts +213 -0
- package/dist/Alert/alert.variants.js +293 -0
- package/dist/Alert/index.d.ts +2 -0
- package/dist/Alert/index.js +1 -0
- package/dist/Avatar/Avatar.svelte +70 -0
- package/dist/Avatar/Avatar.svelte.d.ts +6 -0
- package/dist/Avatar/avatar.types.d.ts +40 -0
- package/dist/Avatar/avatar.types.js +1 -0
- package/dist/Avatar/avatar.variants.d.ts +178 -0
- package/dist/Avatar/avatar.variants.js +28 -0
- package/dist/Avatar/index.d.ts +2 -0
- package/dist/Avatar/index.js +1 -0
- package/dist/AvatarGroup/AvatarGroup.svelte +66 -0
- package/dist/AvatarGroup/AvatarGroup.svelte.d.ts +5 -0
- package/dist/AvatarGroup/avatar-group.types.d.ts +34 -0
- package/dist/AvatarGroup/avatar-group.types.js +1 -0
- package/dist/AvatarGroup/avatar-group.variants.d.ts +173 -0
- package/dist/AvatarGroup/avatar-group.variants.js +45 -0
- package/dist/AvatarGroup/index.d.ts +2 -0
- package/dist/AvatarGroup/index.js +1 -0
- package/dist/Badge/Badge.svelte +74 -0
- package/dist/Badge/Badge.svelte.d.ts +5 -0
- package/dist/Badge/badge.types.d.ts +74 -0
- package/dist/Badge/badge.types.js +1 -0
- package/dist/Badge/badge.variants.d.ts +303 -0
- package/dist/Badge/badge.variants.js +245 -0
- package/dist/Badge/index.d.ts +2 -0
- package/dist/Badge/index.js +1 -0
- package/dist/Button/Button.svelte +103 -0
- package/dist/Button/Button.svelte.d.ts +6 -0
- package/dist/Button/button.types.d.ts +97 -0
- package/dist/Button/button.types.js +1 -0
- package/dist/Button/button.variants.d.ts +388 -0
- package/dist/Button/button.variants.js +461 -0
- package/dist/Button/index.d.ts +2 -0
- package/dist/Button/index.js +1 -0
- package/dist/Card/Card.svelte +53 -0
- package/dist/Card/Card.svelte.d.ts +5 -0
- package/dist/Card/card.types.d.ts +32 -0
- package/dist/Card/card.types.js +1 -0
- package/dist/Card/card.variants.d.ts +108 -0
- package/dist/Card/card.variants.js +32 -0
- package/dist/Card/index.d.ts +2 -0
- package/dist/Card/index.js +1 -0
- package/dist/Chip/Chip.svelte +50 -0
- package/dist/Chip/Chip.svelte.d.ts +5 -0
- package/dist/Chip/chip.types.d.ts +62 -0
- package/dist/Chip/chip.types.js +1 -0
- package/dist/Chip/chip.variants.d.ts +328 -0
- package/dist/Chip/chip.variants.js +58 -0
- package/dist/Chip/index.d.ts +2 -0
- package/dist/Chip/index.js +1 -0
- package/dist/Container/Container.svelte +27 -0
- package/dist/Container/Container.svelte.d.ts +5 -0
- package/dist/Container/container.types.d.ts +19 -0
- package/dist/Container/container.types.js +1 -0
- package/dist/Container/container.variants.d.ts +29 -0
- package/dist/Container/container.variants.js +9 -0
- package/dist/Container/index.d.ts +2 -0
- package/dist/Container/index.js +1 -0
- package/dist/Empty/Empty.svelte +83 -0
- package/dist/Empty/Empty.svelte.d.ts +5 -0
- package/dist/Empty/empty.types.d.ts +74 -0
- package/dist/Empty/empty.types.js +1 -0
- package/dist/Empty/empty.variants.d.ts +288 -0
- package/dist/Empty/empty.variants.js +364 -0
- package/dist/Empty/index.d.ts +2 -0
- package/dist/Empty/index.js +1 -0
- package/dist/Icon/Icon.svelte +40 -0
- package/dist/Icon/Icon.svelte.d.ts +6 -0
- package/dist/Icon/icon.types.d.ts +37 -0
- package/dist/Icon/icon.types.js +1 -0
- package/dist/Icon/index.d.ts +2 -0
- package/dist/Icon/index.js +1 -0
- package/dist/Kbd/Kbd.svelte +35 -0
- package/dist/Kbd/Kbd.svelte.d.ts +5 -0
- package/dist/Kbd/index.d.ts +3 -0
- package/dist/Kbd/index.js +2 -0
- package/dist/Kbd/kbd.types.d.ts +77 -0
- package/dist/Kbd/kbd.types.js +1 -0
- package/dist/Kbd/kbd.variants.d.ts +118 -0
- package/dist/Kbd/kbd.variants.js +96 -0
- package/dist/Kbd/useKbd.svelte.d.ts +29 -0
- package/dist/Kbd/useKbd.svelte.js +245 -0
- package/dist/Link/Link.svelte +117 -0
- package/dist/Link/Link.svelte.d.ts +5 -0
- package/dist/Link/index.d.ts +2 -0
- package/dist/Link/index.js +1 -0
- package/dist/Link/link.types.d.ts +68 -0
- package/dist/Link/link.types.js +1 -0
- package/dist/Link/link.variants.d.ts +138 -0
- package/dist/Link/link.variants.js +145 -0
- package/dist/Progress/Progress.svelte +89 -0
- package/dist/Progress/Progress.svelte.d.ts +6 -0
- package/dist/Progress/index.d.ts +2 -0
- package/dist/Progress/index.js +1 -0
- package/dist/Progress/progress.types.d.ts +63 -0
- package/dist/Progress/progress.types.js +1 -0
- package/dist/Progress/progress.variants.d.ts +483 -0
- package/dist/Progress/progress.variants.js +190 -0
- package/dist/Separator/Separator.svelte +67 -0
- package/dist/Separator/Separator.svelte.d.ts +6 -0
- package/dist/Separator/index.d.ts +2 -0
- package/dist/Separator/index.js +1 -0
- package/dist/Separator/separator.types.d.ts +48 -0
- package/dist/Separator/separator.types.js +1 -0
- package/dist/Separator/separator.variants.d.ts +488 -0
- package/dist/Separator/separator.variants.js +104 -0
- package/dist/Skeleton/Skeleton.svelte +31 -0
- package/dist/Skeleton/Skeleton.svelte.d.ts +5 -0
- package/dist/Skeleton/index.d.ts +2 -0
- package/dist/Skeleton/index.js +1 -0
- package/dist/Skeleton/skeleton.types.d.ts +18 -0
- package/dist/Skeleton/skeleton.types.js +1 -0
- package/dist/Skeleton/skeleton.variants.d.ts +18 -0
- package/dist/Skeleton/skeleton.variants.js +12 -0
- package/dist/Timeline/Timeline.svelte +106 -0
- package/dist/Timeline/Timeline.svelte.d.ts +5 -0
- package/dist/Timeline/index.d.ts +2 -0
- package/dist/Timeline/index.js +1 -0
- package/dist/Timeline/timeline.types.d.ts +130 -0
- package/dist/Timeline/timeline.types.js +1 -0
- package/dist/Timeline/timeline.variants.d.ts +413 -0
- package/dist/Timeline/timeline.variants.js +121 -0
- package/dist/User/User.svelte +94 -0
- package/dist/User/User.svelte.d.ts +5 -0
- package/dist/User/index.d.ts +2 -0
- package/dist/User/index.js +1 -0
- package/dist/User/user.types.d.ts +74 -0
- package/dist/User/user.types.js +1 -0
- package/dist/User/user.variants.d.ts +308 -0
- package/dist/User/user.variants.js +73 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.js +94 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +20 -0
- package/dist/theme.css +410 -0
- package/package.json +104 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
export const alertVariants = tv({
|
|
3
|
+
slots: {
|
|
4
|
+
root: 'relative overflow-hidden w-full rounded-lg p-4 flex gap-2.5',
|
|
5
|
+
wrapper: 'min-w-0 flex-1 flex flex-col',
|
|
6
|
+
title: 'text-sm font-medium',
|
|
7
|
+
description: 'text-sm opacity-90',
|
|
8
|
+
icon: 'shrink-0 size-5',
|
|
9
|
+
avatar: 'shrink-0',
|
|
10
|
+
actions: 'flex flex-wrap gap-1.5 shrink-0',
|
|
11
|
+
close: 'p-0'
|
|
12
|
+
},
|
|
13
|
+
variants: {
|
|
14
|
+
variant: {
|
|
15
|
+
solid: '',
|
|
16
|
+
outline: '',
|
|
17
|
+
soft: '',
|
|
18
|
+
subtle: ''
|
|
19
|
+
},
|
|
20
|
+
color: {
|
|
21
|
+
primary: '',
|
|
22
|
+
secondary: '',
|
|
23
|
+
tertiary: '',
|
|
24
|
+
success: '',
|
|
25
|
+
warning: '',
|
|
26
|
+
error: '',
|
|
27
|
+
info: '',
|
|
28
|
+
surface: ''
|
|
29
|
+
},
|
|
30
|
+
orientation: {
|
|
31
|
+
horizontal: {
|
|
32
|
+
root: 'items-center',
|
|
33
|
+
actions: 'items-center'
|
|
34
|
+
},
|
|
35
|
+
vertical: {
|
|
36
|
+
root: 'items-start',
|
|
37
|
+
actions: 'items-start mt-2.5'
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
title: {
|
|
41
|
+
true: {
|
|
42
|
+
description: 'mt-1'
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
compoundVariants: [
|
|
47
|
+
// ========== SOLID VARIANT (button styling) ==========
|
|
48
|
+
{
|
|
49
|
+
variant: 'solid',
|
|
50
|
+
class: {
|
|
51
|
+
actions: '[&_button]:text-inherit [&_button]:border-current/30 [&_button]:hover:bg-current/10',
|
|
52
|
+
close: 'text-inherit hover:bg-current/10'
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
// ========== SOLID VARIANTS (colors) ==========
|
|
56
|
+
{
|
|
57
|
+
variant: 'solid',
|
|
58
|
+
color: 'primary',
|
|
59
|
+
class: {
|
|
60
|
+
root: 'bg-primary text-on-primary'
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
variant: 'solid',
|
|
65
|
+
color: 'secondary',
|
|
66
|
+
class: {
|
|
67
|
+
root: 'bg-secondary text-on-secondary'
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
variant: 'solid',
|
|
72
|
+
color: 'success',
|
|
73
|
+
class: {
|
|
74
|
+
root: 'bg-success text-on-success'
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
variant: 'solid',
|
|
79
|
+
color: 'warning',
|
|
80
|
+
class: {
|
|
81
|
+
root: 'bg-warning text-on-warning'
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
variant: 'solid',
|
|
86
|
+
color: 'error',
|
|
87
|
+
class: {
|
|
88
|
+
root: 'bg-error text-on-error'
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
variant: 'solid',
|
|
93
|
+
color: 'info',
|
|
94
|
+
class: {
|
|
95
|
+
root: 'bg-info text-on-info'
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
variant: 'solid',
|
|
100
|
+
color: 'tertiary',
|
|
101
|
+
class: {
|
|
102
|
+
root: 'bg-tertiary text-on-tertiary'
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
variant: 'solid',
|
|
107
|
+
color: 'surface',
|
|
108
|
+
class: {
|
|
109
|
+
root: 'bg-inverse-surface text-inverse-on-surface'
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
// ========== OUTLINE VARIANTS ==========
|
|
113
|
+
{
|
|
114
|
+
variant: 'outline',
|
|
115
|
+
color: 'primary',
|
|
116
|
+
class: {
|
|
117
|
+
root: 'text-primary ring ring-inset ring-primary/25'
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
variant: 'outline',
|
|
122
|
+
color: 'secondary',
|
|
123
|
+
class: {
|
|
124
|
+
root: 'text-secondary ring ring-inset ring-secondary/25'
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
variant: 'outline',
|
|
129
|
+
color: 'success',
|
|
130
|
+
class: {
|
|
131
|
+
root: 'text-success ring ring-inset ring-success/25'
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
variant: 'outline',
|
|
136
|
+
color: 'warning',
|
|
137
|
+
class: {
|
|
138
|
+
root: 'text-warning ring ring-inset ring-warning/25'
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
variant: 'outline',
|
|
143
|
+
color: 'error',
|
|
144
|
+
class: {
|
|
145
|
+
root: 'text-error ring ring-inset ring-error/25'
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
variant: 'outline',
|
|
150
|
+
color: 'info',
|
|
151
|
+
class: {
|
|
152
|
+
root: 'text-info ring ring-inset ring-info/25'
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
variant: 'outline',
|
|
157
|
+
color: 'tertiary',
|
|
158
|
+
class: {
|
|
159
|
+
root: 'text-tertiary ring ring-inset ring-tertiary/25'
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
variant: 'outline',
|
|
164
|
+
color: 'surface',
|
|
165
|
+
class: {
|
|
166
|
+
root: 'text-on-surface-variant ring ring-inset ring-outline-variant'
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
// ========== SOFT VARIANTS ==========
|
|
170
|
+
{
|
|
171
|
+
variant: 'soft',
|
|
172
|
+
color: 'primary',
|
|
173
|
+
class: {
|
|
174
|
+
root: 'bg-primary/10 text-primary'
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
variant: 'soft',
|
|
179
|
+
color: 'secondary',
|
|
180
|
+
class: {
|
|
181
|
+
root: 'bg-secondary/10 text-secondary'
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
variant: 'soft',
|
|
186
|
+
color: 'success',
|
|
187
|
+
class: {
|
|
188
|
+
root: 'bg-success/10 text-success'
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
variant: 'soft',
|
|
193
|
+
color: 'warning',
|
|
194
|
+
class: {
|
|
195
|
+
root: 'bg-warning/10 text-warning'
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
variant: 'soft',
|
|
200
|
+
color: 'error',
|
|
201
|
+
class: {
|
|
202
|
+
root: 'bg-error/10 text-error'
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
variant: 'soft',
|
|
207
|
+
color: 'info',
|
|
208
|
+
class: {
|
|
209
|
+
root: 'bg-info/10 text-info'
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
variant: 'soft',
|
|
214
|
+
color: 'tertiary',
|
|
215
|
+
class: {
|
|
216
|
+
root: 'bg-tertiary/10 text-tertiary'
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
variant: 'soft',
|
|
221
|
+
color: 'surface',
|
|
222
|
+
class: {
|
|
223
|
+
root: 'bg-surface-container-highest text-on-surface'
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
// ========== SUBTLE VARIANTS ==========
|
|
227
|
+
{
|
|
228
|
+
variant: 'subtle',
|
|
229
|
+
color: 'primary',
|
|
230
|
+
class: {
|
|
231
|
+
root: 'bg-primary/10 text-primary ring ring-inset ring-primary/25'
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
variant: 'subtle',
|
|
236
|
+
color: 'secondary',
|
|
237
|
+
class: {
|
|
238
|
+
root: 'bg-secondary/10 text-secondary ring ring-inset ring-secondary/25'
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
variant: 'subtle',
|
|
243
|
+
color: 'success',
|
|
244
|
+
class: {
|
|
245
|
+
root: 'bg-success/10 text-success ring ring-inset ring-success/25'
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
variant: 'subtle',
|
|
250
|
+
color: 'warning',
|
|
251
|
+
class: {
|
|
252
|
+
root: 'bg-warning/10 text-warning ring ring-inset ring-warning/25'
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
variant: 'subtle',
|
|
257
|
+
color: 'error',
|
|
258
|
+
class: {
|
|
259
|
+
root: 'bg-error/10 text-error ring ring-inset ring-error/25'
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
variant: 'subtle',
|
|
264
|
+
color: 'info',
|
|
265
|
+
class: {
|
|
266
|
+
root: 'bg-info/10 text-info ring ring-inset ring-info/25'
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
variant: 'subtle',
|
|
271
|
+
color: 'tertiary',
|
|
272
|
+
class: {
|
|
273
|
+
root: 'bg-tertiary/10 text-tertiary ring ring-inset ring-tertiary/25'
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
variant: 'subtle',
|
|
278
|
+
color: 'surface',
|
|
279
|
+
class: {
|
|
280
|
+
root: 'bg-surface-container-highest text-on-surface ring ring-inset ring-outline-variant'
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
],
|
|
284
|
+
defaultVariants: {
|
|
285
|
+
variant: 'solid',
|
|
286
|
+
color: 'primary',
|
|
287
|
+
orientation: 'horizontal'
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
export const alertDefaults = {
|
|
291
|
+
defaultVariants: alertVariants.defaultVariants,
|
|
292
|
+
slots: {}
|
|
293
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Alert } from './Alert.svelte';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { AvatarProps, AvatarSize } from './avatar.types.js'
|
|
3
|
+
|
|
4
|
+
export type Props = AvatarProps
|
|
5
|
+
|
|
6
|
+
const SIZE_PX: Record<AvatarSize, number> = {
|
|
7
|
+
'3xs': 16,
|
|
8
|
+
'2xs': 20,
|
|
9
|
+
xs: 24,
|
|
10
|
+
sm: 28,
|
|
11
|
+
md: 32,
|
|
12
|
+
lg: 36,
|
|
13
|
+
xl: 40,
|
|
14
|
+
'2xl': 44,
|
|
15
|
+
'3xl': 48
|
|
16
|
+
}
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<script lang="ts">
|
|
20
|
+
import { Avatar } from 'bits-ui'
|
|
21
|
+
import { avatarVariants, avatarDefaults } from './avatar.variants.js'
|
|
22
|
+
import { getComponentConfig } from '../config.js'
|
|
23
|
+
import { getContext } from 'svelte'
|
|
24
|
+
|
|
25
|
+
const config = getComponentConfig('avatar', avatarDefaults)
|
|
26
|
+
|
|
27
|
+
let {
|
|
28
|
+
ref = $bindable(null),
|
|
29
|
+
src,
|
|
30
|
+
alt,
|
|
31
|
+
size,
|
|
32
|
+
text,
|
|
33
|
+
delayMs = 0,
|
|
34
|
+
class: className,
|
|
35
|
+
ui,
|
|
36
|
+
children,
|
|
37
|
+
...restProps
|
|
38
|
+
}: Props = $props()
|
|
39
|
+
|
|
40
|
+
const groupContext = getContext<{ size: AvatarSize; baseClass: string } | undefined>('avatarGroup')
|
|
41
|
+
|
|
42
|
+
const resolvedSize = $derived(size ?? groupContext?.size ?? config.defaultVariants.size ?? 'md')
|
|
43
|
+
const sizePx = $derived(SIZE_PX[resolvedSize])
|
|
44
|
+
|
|
45
|
+
const initials = $derived(
|
|
46
|
+
text || (alt ? alt.split(' ').slice(0, 2).map(w => w[0]).join('').toUpperCase() : '')
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
const classes = $derived.by(() => {
|
|
50
|
+
const slots = avatarVariants({ size: resolvedSize })
|
|
51
|
+
return {
|
|
52
|
+
root: slots.root({ class: [config.slots.root, groupContext?.baseClass, className, ui?.root] }),
|
|
53
|
+
image: slots.image({ class: [config.slots.image, ui?.image] }),
|
|
54
|
+
fallback: slots.fallback({ class: [config.slots.fallback, ui?.fallback] })
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<Avatar.Root bind:ref class={classes.root} {delayMs} {...restProps}>
|
|
60
|
+
{#if children}
|
|
61
|
+
{@render children()}
|
|
62
|
+
{:else}
|
|
63
|
+
{#if src}
|
|
64
|
+
<Avatar.Image {src} alt={alt ?? ''} class={classes.image} width={sizePx} height={sizePx} />
|
|
65
|
+
{/if}
|
|
66
|
+
<Avatar.Fallback class={classes.fallback}>
|
|
67
|
+
{initials}
|
|
68
|
+
</Avatar.Fallback>
|
|
69
|
+
{/if}
|
|
70
|
+
</Avatar.Root>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { Avatar } from 'bits-ui';
|
|
3
|
+
import type { ClassNameValue } from 'tailwind-merge';
|
|
4
|
+
import type { AvatarVariantProps, AvatarSlots } from './avatar.variants.js';
|
|
5
|
+
export type AvatarSize = NonNullable<AvatarVariantProps['size']>;
|
|
6
|
+
export type AvatarProps = Omit<Avatar.RootProps, 'children'> & {
|
|
7
|
+
/**
|
|
8
|
+
* Controls the dimensions of the avatar.
|
|
9
|
+
* @default 'md'
|
|
10
|
+
*/
|
|
11
|
+
size?: AvatarSize;
|
|
12
|
+
/**
|
|
13
|
+
* URL of the image to display.
|
|
14
|
+
* The image will be shown once it loads successfully.
|
|
15
|
+
*/
|
|
16
|
+
src?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Alternative text describing the avatar image.
|
|
19
|
+
* Used for accessibility and to auto-generate initials as fallback.
|
|
20
|
+
*/
|
|
21
|
+
alt?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Text to display when no image is available.
|
|
24
|
+
* Overrides auto-generated initials from `alt`.
|
|
25
|
+
*/
|
|
26
|
+
text?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Additional CSS classes for the root element.
|
|
29
|
+
*/
|
|
30
|
+
class?: ClassNameValue;
|
|
31
|
+
/**
|
|
32
|
+
* Override styles for specific avatar slots.
|
|
33
|
+
*/
|
|
34
|
+
ui?: Partial<Record<AvatarSlots, ClassNameValue>>;
|
|
35
|
+
/**
|
|
36
|
+
* Custom content to render inside the avatar.
|
|
37
|
+
* When provided, overrides image, text, and icon.
|
|
38
|
+
*/
|
|
39
|
+
children?: Snippet;
|
|
40
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { type VariantProps } from 'tailwind-variants';
|
|
2
|
+
export declare const avatarVariants: import("tailwind-variants").TVReturnType<{
|
|
3
|
+
size: {
|
|
4
|
+
'3xs': {
|
|
5
|
+
root: string;
|
|
6
|
+
};
|
|
7
|
+
'2xs': {
|
|
8
|
+
root: string;
|
|
9
|
+
};
|
|
10
|
+
xs: {
|
|
11
|
+
root: string;
|
|
12
|
+
};
|
|
13
|
+
sm: {
|
|
14
|
+
root: string;
|
|
15
|
+
};
|
|
16
|
+
md: {
|
|
17
|
+
root: string;
|
|
18
|
+
};
|
|
19
|
+
lg: {
|
|
20
|
+
root: string;
|
|
21
|
+
};
|
|
22
|
+
xl: {
|
|
23
|
+
root: string;
|
|
24
|
+
};
|
|
25
|
+
'2xl': {
|
|
26
|
+
root: string;
|
|
27
|
+
};
|
|
28
|
+
'3xl': {
|
|
29
|
+
root: string;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
}, {
|
|
33
|
+
root: string;
|
|
34
|
+
image: string;
|
|
35
|
+
fallback: string;
|
|
36
|
+
}, undefined, {
|
|
37
|
+
size: {
|
|
38
|
+
'3xs': {
|
|
39
|
+
root: string;
|
|
40
|
+
};
|
|
41
|
+
'2xs': {
|
|
42
|
+
root: string;
|
|
43
|
+
};
|
|
44
|
+
xs: {
|
|
45
|
+
root: string;
|
|
46
|
+
};
|
|
47
|
+
sm: {
|
|
48
|
+
root: string;
|
|
49
|
+
};
|
|
50
|
+
md: {
|
|
51
|
+
root: string;
|
|
52
|
+
};
|
|
53
|
+
lg: {
|
|
54
|
+
root: string;
|
|
55
|
+
};
|
|
56
|
+
xl: {
|
|
57
|
+
root: string;
|
|
58
|
+
};
|
|
59
|
+
'2xl': {
|
|
60
|
+
root: string;
|
|
61
|
+
};
|
|
62
|
+
'3xl': {
|
|
63
|
+
root: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
}, {
|
|
67
|
+
root: string;
|
|
68
|
+
image: string;
|
|
69
|
+
fallback: string;
|
|
70
|
+
}, import("tailwind-variants").TVReturnType<{
|
|
71
|
+
size: {
|
|
72
|
+
'3xs': {
|
|
73
|
+
root: string;
|
|
74
|
+
};
|
|
75
|
+
'2xs': {
|
|
76
|
+
root: string;
|
|
77
|
+
};
|
|
78
|
+
xs: {
|
|
79
|
+
root: string;
|
|
80
|
+
};
|
|
81
|
+
sm: {
|
|
82
|
+
root: string;
|
|
83
|
+
};
|
|
84
|
+
md: {
|
|
85
|
+
root: string;
|
|
86
|
+
};
|
|
87
|
+
lg: {
|
|
88
|
+
root: string;
|
|
89
|
+
};
|
|
90
|
+
xl: {
|
|
91
|
+
root: string;
|
|
92
|
+
};
|
|
93
|
+
'2xl': {
|
|
94
|
+
root: string;
|
|
95
|
+
};
|
|
96
|
+
'3xl': {
|
|
97
|
+
root: string;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
}, {
|
|
101
|
+
root: string;
|
|
102
|
+
image: string;
|
|
103
|
+
fallback: string;
|
|
104
|
+
}, undefined, unknown, unknown, undefined>>;
|
|
105
|
+
export type AvatarVariantProps = VariantProps<typeof avatarVariants>;
|
|
106
|
+
export type AvatarSlots = keyof ReturnType<typeof avatarVariants>;
|
|
107
|
+
export declare const avatarDefaults: {
|
|
108
|
+
defaultVariants: import("tailwind-variants").TVDefaultVariants<{
|
|
109
|
+
size: {
|
|
110
|
+
'3xs': {
|
|
111
|
+
root: string;
|
|
112
|
+
};
|
|
113
|
+
'2xs': {
|
|
114
|
+
root: string;
|
|
115
|
+
};
|
|
116
|
+
xs: {
|
|
117
|
+
root: string;
|
|
118
|
+
};
|
|
119
|
+
sm: {
|
|
120
|
+
root: string;
|
|
121
|
+
};
|
|
122
|
+
md: {
|
|
123
|
+
root: string;
|
|
124
|
+
};
|
|
125
|
+
lg: {
|
|
126
|
+
root: string;
|
|
127
|
+
};
|
|
128
|
+
xl: {
|
|
129
|
+
root: string;
|
|
130
|
+
};
|
|
131
|
+
'2xl': {
|
|
132
|
+
root: string;
|
|
133
|
+
};
|
|
134
|
+
'3xl': {
|
|
135
|
+
root: string;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
}, {
|
|
139
|
+
root: string;
|
|
140
|
+
image: string;
|
|
141
|
+
fallback: string;
|
|
142
|
+
}, {
|
|
143
|
+
size: {
|
|
144
|
+
'3xs': {
|
|
145
|
+
root: string;
|
|
146
|
+
};
|
|
147
|
+
'2xs': {
|
|
148
|
+
root: string;
|
|
149
|
+
};
|
|
150
|
+
xs: {
|
|
151
|
+
root: string;
|
|
152
|
+
};
|
|
153
|
+
sm: {
|
|
154
|
+
root: string;
|
|
155
|
+
};
|
|
156
|
+
md: {
|
|
157
|
+
root: string;
|
|
158
|
+
};
|
|
159
|
+
lg: {
|
|
160
|
+
root: string;
|
|
161
|
+
};
|
|
162
|
+
xl: {
|
|
163
|
+
root: string;
|
|
164
|
+
};
|
|
165
|
+
'2xl': {
|
|
166
|
+
root: string;
|
|
167
|
+
};
|
|
168
|
+
'3xl': {
|
|
169
|
+
root: string;
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
}, {
|
|
173
|
+
root: string;
|
|
174
|
+
image: string;
|
|
175
|
+
fallback: string;
|
|
176
|
+
}>;
|
|
177
|
+
slots: Partial<Record<AvatarSlots, string>>;
|
|
178
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
export const avatarVariants = tv({
|
|
3
|
+
slots: {
|
|
4
|
+
root: 'inline-flex items-center justify-center shrink-0 select-none rounded-full align-middle overflow-hidden bg-surface-container-highest',
|
|
5
|
+
image: 'h-full w-full rounded-[inherit] object-cover',
|
|
6
|
+
fallback: 'font-medium leading-none truncate text-on-surface-variant'
|
|
7
|
+
},
|
|
8
|
+
variants: {
|
|
9
|
+
size: {
|
|
10
|
+
'3xs': { root: 'size-4 text-[8px]' },
|
|
11
|
+
'2xs': { root: 'size-5 text-[10px]' },
|
|
12
|
+
xs: { root: 'size-6 text-xs' },
|
|
13
|
+
sm: { root: 'size-7 text-sm' },
|
|
14
|
+
md: { root: 'size-8 text-base' },
|
|
15
|
+
lg: { root: 'size-9 text-lg' },
|
|
16
|
+
xl: { root: 'size-10 text-xl' },
|
|
17
|
+
'2xl': { root: 'size-11 text-[22px]' },
|
|
18
|
+
'3xl': { root: 'size-12 text-2xl' }
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
defaultVariants: {
|
|
22
|
+
size: 'md'
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
export const avatarDefaults = {
|
|
26
|
+
defaultVariants: avatarVariants.defaultVariants,
|
|
27
|
+
slots: {}
|
|
28
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Avatar } from './Avatar.svelte';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { AvatarGroupProps } from './avatar-group.types.js'
|
|
3
|
+
|
|
4
|
+
export type Props = AvatarGroupProps
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import { avatarGroupVariants, avatarGroupDefaults } from './avatar-group.variants.js'
|
|
9
|
+
import { getComponentConfig } from '../config.js'
|
|
10
|
+
import { setContext } from 'svelte'
|
|
11
|
+
import Avatar from '../Avatar/Avatar.svelte'
|
|
12
|
+
import type { AvatarSize } from '../Avatar/avatar.types.js'
|
|
13
|
+
|
|
14
|
+
const config = getComponentConfig('avatarGroup', avatarGroupDefaults)
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
as = 'div',
|
|
18
|
+
ui,
|
|
19
|
+
size = config.defaultVariants.size ?? 'md',
|
|
20
|
+
avatars,
|
|
21
|
+
max,
|
|
22
|
+
class: className,
|
|
23
|
+
children,
|
|
24
|
+
...restProps
|
|
25
|
+
}: Props = $props()
|
|
26
|
+
|
|
27
|
+
const classes = $derived.by(() => {
|
|
28
|
+
const slots = avatarGroupVariants({ size })
|
|
29
|
+
return {
|
|
30
|
+
root: slots.root({ class: [config.slots.root, className, ui?.root] }),
|
|
31
|
+
base: slots.base({ class: [config.slots.base, ui?.base] })
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
setContext<{ size: AvatarSize; baseClass: string }>('avatarGroup', {
|
|
36
|
+
get size() {
|
|
37
|
+
return size
|
|
38
|
+
},
|
|
39
|
+
get baseClass() {
|
|
40
|
+
return classes.base
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
const visibleAvatars = $derived(
|
|
45
|
+
!avatars ? [] :
|
|
46
|
+
max && max > 0 && avatars.length > max ? avatars.slice(0, max) :
|
|
47
|
+
avatars
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
const overflowCount = $derived(
|
|
51
|
+
avatars && max && max > 0 ? Math.max(0, avatars.length - max) : 0
|
|
52
|
+
)
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
<svelte:element this={as} class={classes.root} {...restProps}>
|
|
56
|
+
{#if avatars}
|
|
57
|
+
{#if overflowCount > 0}
|
|
58
|
+
<Avatar text={`+${overflowCount}`} />
|
|
59
|
+
{/if}
|
|
60
|
+
{#each visibleAvatars as avatar}
|
|
61
|
+
<Avatar {...avatar} />
|
|
62
|
+
{/each}
|
|
63
|
+
{:else if children}
|
|
64
|
+
{@render children()}
|
|
65
|
+
{/if}
|
|
66
|
+
</svelte:element>
|