@octanejs/shadcn 0.0.52 → 0.0.54
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/package.json +9 -9
- package/src/bases/base-ui/ui/accordion.tsrx +3 -1
- package/src/bases/base-ui/ui/alert-dialog.tsrx +6 -5
- package/src/bases/base-ui/ui/alert.tsrx +3 -2
- package/src/bases/base-ui/ui/aspect-ratio.tsrx +5 -3
- package/src/bases/base-ui/ui/badge.tsrx +2 -1
- package/src/bases/base-ui/ui/breadcrumb.tsrx +4 -4
- package/src/bases/base-ui/ui/button.tsrx +17 -10
- package/src/bases/base-ui/ui/context-menu.tsrx +37 -29
- package/src/bases/base-ui/ui/dialog.tsrx +6 -4
- package/src/bases/base-ui/ui/dropdown-menu.tsrx +37 -29
- package/src/bases/base-ui/ui/empty.tsrx +1 -1
- package/src/bases/base-ui/ui/field.tsrx +17 -11
- package/src/bases/base-ui/ui/hover-card.tsrx +15 -16
- package/src/bases/base-ui/ui/item.tsrx +3 -2
- package/src/bases/base-ui/ui/kbd.tsrx +1 -1
- package/src/bases/base-ui/ui/menubar.tsrx +38 -34
- package/src/bases/base-ui/ui/native-select.tsrx +3 -4
- package/src/bases/base-ui/ui/navigation-menu.tsrx +113 -87
- package/src/bases/base-ui/ui/pagination.tsrx +6 -2
- package/src/bases/base-ui/ui/popover.tsrx +15 -16
- package/src/bases/base-ui/ui/radio-group.tsrx +1 -3
- package/src/bases/base-ui/ui/scroll-area.tsrx +33 -27
- package/src/bases/base-ui/ui/select.tsrx +138 -106
- package/src/bases/base-ui/ui/sheet.tsrx +6 -4
- package/src/bases/base-ui/ui/sidebar.tsrx +65 -44
- package/src/bases/base-ui/ui/slider.tsrx +1 -3
- package/src/bases/base-ui/ui/tabs.tsrx +1 -1
- package/src/bases/base-ui/ui/toggle-group.tsrx +3 -3
- package/src/bases/base-ui/ui/toggle.tsrx +3 -2
- package/src/bases/base-ui/ui/tooltip.tsrx +17 -17
- package/src/bases/radix/ui/accordion.tsrx +3 -1
- package/src/bases/radix/ui/alert-dialog.tsrx +1 -1
- package/src/bases/radix/ui/alert.tsrx +15 -14
- package/src/bases/radix/ui/badge.tsrx +2 -1
- package/src/bases/radix/ui/button.tsrx +17 -10
- package/src/bases/radix/ui/context-menu.tsrx +20 -10
- package/src/bases/radix/ui/dropdown-menu.tsrx +16 -9
- package/src/bases/radix/ui/empty.tsrx +1 -1
- package/src/bases/radix/ui/field.tsrx +17 -11
- package/src/bases/radix/ui/item.tsrx +3 -2
- package/src/bases/radix/ui/menubar.tsrx +17 -14
- package/src/bases/radix/ui/native-select.tsrx +8 -8
- package/src/bases/radix/ui/navigation-menu.tsrx +2 -3
- package/src/bases/radix/ui/pagination.tsrx +6 -2
- package/src/bases/radix/ui/radio-group.tsrx +1 -3
- package/src/bases/radix/ui/scroll-area.tsrx +8 -2
- package/src/bases/radix/ui/select.tsrx +10 -5
- package/src/bases/radix/ui/sidebar.tsrx +61 -42
- package/src/bases/radix/ui/slider.tsrx +9 -7
- package/src/bases/radix/ui/tabs.tsrx +11 -5
- package/src/bases/radix/ui/toggle.tsrx +3 -2
- package/src/bases/radix/ui/tooltip.tsrx +2 -1
- package/src/bases/react-aria/ui/accordion.tsrx +58 -47
- package/src/bases/react-aria/ui/alert-dialog.tsrx +118 -92
- package/src/bases/react-aria/ui/alert.tsrx +39 -32
- package/src/bases/react-aria/ui/aspect-ratio.tsrx +12 -8
- package/src/bases/react-aria/ui/avatar.tsrx +73 -57
- package/src/bases/react-aria/ui/badge.tsrx +19 -12
- package/src/bases/react-aria/ui/breadcrumb.tsrx +66 -57
- package/src/bases/react-aria/ui/button.tsrx +17 -10
- package/src/bases/react-aria/ui/card.tsrx +63 -49
- package/src/bases/react-aria/ui/checkbox.tsrx +25 -19
- package/src/bases/react-aria/ui/dialog.tsrx +103 -83
- package/src/bases/react-aria/ui/empty.tsrx +58 -44
- package/src/bases/react-aria/ui/field.tsrx +142 -100
- package/src/bases/react-aria/ui/input.tsrx +2 -3
- package/src/bases/react-aria/ui/item.tsrx +98 -78
- package/src/bases/react-aria/ui/kbd.tsrx +1 -1
- package/src/bases/react-aria/ui/label.tsrx +12 -10
- package/src/bases/react-aria/ui/native-select.tsrx +38 -30
- package/src/bases/react-aria/ui/pagination.tsrx +76 -60
- package/src/bases/react-aria/ui/popover.tsrx +32 -22
- package/src/bases/react-aria/ui/radio-group.tsrx +30 -23
- package/src/bases/react-aria/ui/scroll-area.tsrx +12 -8
- package/src/bases/react-aria/ui/sheet.tsrx +92 -73
- package/src/bases/react-aria/ui/skeleton.tsrx +7 -5
- package/src/bases/react-aria/ui/slider.tsrx +44 -38
- package/src/bases/react-aria/ui/switch.tsrx +28 -20
- package/src/bases/react-aria/ui/table.tsrx +67 -51
- package/src/bases/react-aria/ui/tabs.tsrx +40 -31
- package/src/bases/react-aria/ui/textarea.tsrx +2 -3
- package/src/bases/react-aria/ui/toggle.tsrx +11 -8
|
@@ -21,119 +21,143 @@ export function AlertDialogTrigger({ ...props }: AlertDialogTriggerPrimitiveProp
|
|
|
21
21
|
return <AlertDialogTriggerPrimitive data-slot="alert-dialog-trigger" {...props} />;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export function AlertDialogOverlay({
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
export function AlertDialogOverlay({
|
|
25
|
+
className,
|
|
26
|
+
children,
|
|
27
|
+
...props
|
|
28
|
+
}: Omit<ModalOverlayPrimitiveProps, 'className' | 'children'> & {
|
|
28
29
|
className?: string;
|
|
29
30
|
children: OctaneNode;
|
|
30
31
|
}) {
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
return (
|
|
33
|
+
<ModalOverlayPrimitive
|
|
34
|
+
data-slot="alert-dialog-overlay"
|
|
35
|
+
className={cn(
|
|
36
|
+
'fixed inset-0 isolate z-50 bg-black/10 duration-100 data-entering:animate-in data-entering:fade-in-0 data-exiting:animate-out data-exiting:fade-out-0 supports-backdrop-filter:backdrop-blur-xs',
|
|
37
|
+
className,
|
|
38
|
+
)}
|
|
39
|
+
{...props}
|
|
40
|
+
>
|
|
41
|
+
{children}
|
|
42
|
+
</ModalOverlayPrimitive>
|
|
43
|
+
);
|
|
39
44
|
}
|
|
40
45
|
|
|
41
|
-
export function AlertDialog({
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
export function AlertDialog({
|
|
47
|
+
className,
|
|
48
|
+
size = 'default',
|
|
49
|
+
children,
|
|
50
|
+
...props
|
|
51
|
+
}: Omit<ModalOverlayPrimitiveProps, 'className' | 'children'> & { isDismissable?: boolean } & {
|
|
45
52
|
className?: string;
|
|
46
53
|
size?: 'default' | 'sm';
|
|
47
54
|
children: OctaneNode;
|
|
48
55
|
}) {
|
|
49
|
-
return
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
return (
|
|
57
|
+
<AlertDialogOverlay {...props}>
|
|
58
|
+
<ModalPrimitive
|
|
59
|
+
data-slot="alert-dialog-content"
|
|
60
|
+
data-size={size}
|
|
61
|
+
className={cn(
|
|
62
|
+
'group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-entering:animate-in data-entering:fade-in-0 data-entering:zoom-in-95 data-exiting:animate-out data-exiting:fade-out-0 data-exiting:zoom-out-95 data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm',
|
|
63
|
+
className,
|
|
64
|
+
)}
|
|
65
|
+
>
|
|
66
|
+
<AlertDialogPrimitive
|
|
67
|
+
data-slot="alert-dialog"
|
|
68
|
+
role="alertdialog"
|
|
69
|
+
className="[display:inherit] [gap:inherit] outline-none"
|
|
70
|
+
>
|
|
71
|
+
{children}
|
|
72
|
+
</AlertDialogPrimitive>
|
|
73
|
+
</ModalPrimitive>
|
|
74
|
+
</AlertDialogOverlay>
|
|
75
|
+
);
|
|
65
76
|
}
|
|
66
77
|
|
|
67
|
-
export function AlertDialogContent({
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
export function AlertDialogContent({
|
|
79
|
+
className,
|
|
80
|
+
size = 'default',
|
|
81
|
+
children,
|
|
82
|
+
...props
|
|
83
|
+
}: Record<string, any>) {
|
|
84
|
+
return (
|
|
85
|
+
<AlertDialog className={className} size={size} {...props}>
|
|
86
|
+
{children}
|
|
87
|
+
</AlertDialog>
|
|
88
|
+
);
|
|
72
89
|
}
|
|
73
90
|
|
|
74
91
|
export function AlertDialogHeader({ className, ...props }: HostProps<'div'>) {
|
|
75
|
-
return
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
92
|
+
return (
|
|
93
|
+
<div
|
|
94
|
+
data-slot="alert-dialog-header"
|
|
95
|
+
className={cn(
|
|
96
|
+
'grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]',
|
|
97
|
+
className,
|
|
98
|
+
)}
|
|
99
|
+
{...props}
|
|
100
|
+
/>
|
|
101
|
+
);
|
|
83
102
|
}
|
|
84
103
|
|
|
85
104
|
export function AlertDialogFooter({ className, ...props }: HostProps<'div'>) {
|
|
86
|
-
return
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
105
|
+
return (
|
|
106
|
+
<div
|
|
107
|
+
data-slot="alert-dialog-footer"
|
|
108
|
+
className={cn(
|
|
109
|
+
'-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end',
|
|
110
|
+
className,
|
|
111
|
+
)}
|
|
112
|
+
{...props}
|
|
113
|
+
/>
|
|
114
|
+
);
|
|
94
115
|
}
|
|
95
116
|
|
|
96
117
|
export function AlertDialogMedia({ className, ...props }: HostProps<'div'>) {
|
|
97
|
-
return
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
118
|
+
return (
|
|
119
|
+
<div
|
|
120
|
+
data-slot="alert-dialog-media"
|
|
121
|
+
className={cn(
|
|
122
|
+
"mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6",
|
|
123
|
+
className,
|
|
124
|
+
)}
|
|
125
|
+
{...props}
|
|
126
|
+
/>
|
|
127
|
+
);
|
|
105
128
|
}
|
|
106
129
|
|
|
107
130
|
export function AlertDialogTitle({ className, ...props }: Omit<HeadingProps, 'slot'>) {
|
|
108
|
-
return
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
131
|
+
return (
|
|
132
|
+
<Heading
|
|
133
|
+
slot="title"
|
|
134
|
+
data-slot="alert-dialog-title"
|
|
135
|
+
className={cn(
|
|
136
|
+
'text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2',
|
|
137
|
+
className,
|
|
138
|
+
)}
|
|
139
|
+
{...props}
|
|
140
|
+
/>
|
|
141
|
+
);
|
|
117
142
|
}
|
|
118
143
|
|
|
119
144
|
export function AlertDialogDescription({ className, ...props }: Omit<HostProps<'div'>, 'slot'>) {
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
145
|
+
return (
|
|
146
|
+
<div
|
|
147
|
+
data-slot="alert-dialog-description"
|
|
148
|
+
className={cn(
|
|
149
|
+
'text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground',
|
|
150
|
+
className,
|
|
151
|
+
)}
|
|
152
|
+
{...props}
|
|
153
|
+
/>
|
|
154
|
+
);
|
|
128
155
|
}
|
|
129
156
|
|
|
130
157
|
export function AlertDialogAction({ className, ...props }: Record<string, any>) {
|
|
131
|
-
return
|
|
132
|
-
slot="close"
|
|
133
|
-
|
|
134
|
-
className={cn(className)}
|
|
135
|
-
{...props}
|
|
136
|
-
/>;
|
|
158
|
+
return (
|
|
159
|
+
<Button slot="close" data-slot="alert-dialog-action" className={cn(className)} {...props} />
|
|
160
|
+
);
|
|
137
161
|
}
|
|
138
162
|
|
|
139
163
|
export function AlertDialogCancel({
|
|
@@ -142,12 +166,14 @@ export function AlertDialogCancel({
|
|
|
142
166
|
size = 'default',
|
|
143
167
|
...props
|
|
144
168
|
}: Record<string, any>) {
|
|
145
|
-
return
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
169
|
+
return (
|
|
170
|
+
<Button
|
|
171
|
+
slot="close"
|
|
172
|
+
data-slot="alert-dialog-cancel"
|
|
173
|
+
className={cn(className)}
|
|
174
|
+
variant={variant}
|
|
175
|
+
size={size}
|
|
176
|
+
{...props}
|
|
177
|
+
/>
|
|
178
|
+
);
|
|
153
179
|
}
|
|
@@ -4,12 +4,13 @@ import { cn } from 'cn';
|
|
|
4
4
|
import type { HostProps } from '../../../lib/types';
|
|
5
5
|
|
|
6
6
|
const alertVariants = cva(
|
|
7
|
-
|
|
7
|
+
"group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
|
|
8
8
|
{
|
|
9
9
|
variants: {
|
|
10
10
|
variant: {
|
|
11
11
|
default: 'bg-card text-card-foreground',
|
|
12
|
-
destructive:
|
|
12
|
+
destructive:
|
|
13
|
+
'bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current',
|
|
13
14
|
},
|
|
14
15
|
},
|
|
15
16
|
defaultVariants: {
|
|
@@ -18,43 +19,49 @@ const alertVariants = cva(
|
|
|
18
19
|
},
|
|
19
20
|
);
|
|
20
21
|
|
|
21
|
-
export function Alert({
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
export function Alert({
|
|
23
|
+
className,
|
|
24
|
+
variant,
|
|
25
|
+
...props
|
|
26
|
+
}: HostProps<'div'> & VariantProps<typeof alertVariants>) {
|
|
27
|
+
return (
|
|
28
|
+
<div
|
|
29
|
+
data-slot="alert"
|
|
30
|
+
role="alert"
|
|
31
|
+
className={cn(alertVariants({ variant }), className)}
|
|
32
|
+
{...props}
|
|
33
|
+
/>
|
|
34
|
+
);
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
export function AlertTitle({ className, ...props }: HostProps<'div'>) {
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
return (
|
|
39
|
+
<div
|
|
40
|
+
data-slot="alert-title"
|
|
41
|
+
className={cn(
|
|
42
|
+
'font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground',
|
|
43
|
+
className,
|
|
44
|
+
)}
|
|
45
|
+
{...props}
|
|
46
|
+
/>
|
|
47
|
+
);
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
export function AlertDescription({ className, ...props }: HostProps<'div'>) {
|
|
44
|
-
return
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
return (
|
|
52
|
+
<div
|
|
53
|
+
data-slot="alert-description"
|
|
54
|
+
className={cn(
|
|
55
|
+
'text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4',
|
|
56
|
+
className,
|
|
57
|
+
)}
|
|
58
|
+
{...props}
|
|
59
|
+
/>
|
|
60
|
+
);
|
|
52
61
|
}
|
|
53
62
|
|
|
54
63
|
export function AlertAction({ className, ...props }: HostProps<'div'>) {
|
|
55
|
-
return
|
|
56
|
-
data-slot="alert-action"
|
|
57
|
-
|
|
58
|
-
{...props}
|
|
59
|
-
/>;
|
|
64
|
+
return (
|
|
65
|
+
<div data-slot="alert-action" className={cn('absolute top-2 right-2', className)} {...props} />
|
|
66
|
+
);
|
|
60
67
|
}
|
|
@@ -2,12 +2,16 @@ import { cn } from 'cn';
|
|
|
2
2
|
import type { HostProps } from '../../../lib/types';
|
|
3
3
|
|
|
4
4
|
export function AspectRatio({ ratio, className, ...props }: HostProps<'div'> & { ratio: number }) {
|
|
5
|
-
return
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
return (
|
|
6
|
+
<div
|
|
7
|
+
data-slot="aspect-ratio"
|
|
8
|
+
style={
|
|
9
|
+
{
|
|
10
|
+
'--ratio': ratio,
|
|
11
|
+
} as Record<string, string | number>
|
|
12
|
+
}
|
|
13
|
+
className={cn('relative aspect-(--ratio)', className)}
|
|
14
|
+
{...props}
|
|
15
|
+
/>
|
|
16
|
+
);
|
|
13
17
|
}
|
|
@@ -3,81 +3,97 @@ import { useState } from 'octane';
|
|
|
3
3
|
import { cn } from 'cn';
|
|
4
4
|
import type { HostProps } from '../../../lib/types';
|
|
5
5
|
|
|
6
|
-
export function Avatar({
|
|
6
|
+
export function Avatar({
|
|
7
|
+
className,
|
|
8
|
+
size = 'default',
|
|
9
|
+
...props
|
|
10
|
+
}: HostProps<'div'> & {
|
|
7
11
|
size?: 'default' | 'sm' | 'lg';
|
|
8
12
|
}) {
|
|
9
|
-
return
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
return (
|
|
14
|
+
<div
|
|
15
|
+
data-slot="avatar"
|
|
16
|
+
data-size={size}
|
|
17
|
+
className={cn(
|
|
18
|
+
'group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten',
|
|
19
|
+
className,
|
|
20
|
+
)}
|
|
21
|
+
{...props}
|
|
22
|
+
/>
|
|
23
|
+
);
|
|
18
24
|
}
|
|
19
25
|
|
|
20
26
|
type ImageState = 'loading' | 'loaded' | 'error';
|
|
21
27
|
|
|
22
28
|
export function AvatarImage({ className, ...props }: HostProps<'img'>) {
|
|
23
29
|
const [state, setState] = useState<ImageState>(props.src ? 'loading' : 'error');
|
|
24
|
-
return
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
return (
|
|
31
|
+
<img
|
|
32
|
+
data-slot="avatar-image"
|
|
33
|
+
alt={props.alt || ''}
|
|
34
|
+
data-state={state}
|
|
35
|
+
onLoad={() => setState('loaded')}
|
|
36
|
+
onError={() => setState('error')}
|
|
37
|
+
className={cn(
|
|
38
|
+
'peer aspect-square size-full rounded-full object-cover data-[state=error]:hidden',
|
|
39
|
+
className,
|
|
40
|
+
)}
|
|
41
|
+
{...props}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
36
44
|
}
|
|
37
45
|
|
|
38
46
|
export function AvatarFallback({ className, ...props }: HostProps<'div'>) {
|
|
39
|
-
return
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
return (
|
|
48
|
+
<div
|
|
49
|
+
data-slot="avatar-fallback"
|
|
50
|
+
className={cn(
|
|
51
|
+
'flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs peer-data-[state=error]:flex peer-[*]:hidden',
|
|
52
|
+
className,
|
|
53
|
+
)}
|
|
54
|
+
{...props}
|
|
55
|
+
/>
|
|
56
|
+
);
|
|
47
57
|
}
|
|
48
58
|
|
|
49
59
|
export function AvatarBadge({ className, ...props }: HostProps<'span'>) {
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
return (
|
|
61
|
+
<span
|
|
62
|
+
data-slot="avatar-badge"
|
|
63
|
+
className={cn(
|
|
64
|
+
'absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none',
|
|
65
|
+
'group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden',
|
|
66
|
+
'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2',
|
|
67
|
+
'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2',
|
|
68
|
+
className,
|
|
69
|
+
)}
|
|
70
|
+
{...props}
|
|
71
|
+
/>
|
|
72
|
+
);
|
|
61
73
|
}
|
|
62
74
|
|
|
63
75
|
export function AvatarGroup({ className, ...props }: HostProps<'div'>) {
|
|
64
|
-
return
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
76
|
+
return (
|
|
77
|
+
<div
|
|
78
|
+
data-slot="avatar-group"
|
|
79
|
+
className={cn(
|
|
80
|
+
'group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background',
|
|
81
|
+
className,
|
|
82
|
+
)}
|
|
83
|
+
{...props}
|
|
84
|
+
/>
|
|
85
|
+
);
|
|
72
86
|
}
|
|
73
87
|
|
|
74
88
|
export function AvatarGroupCount({ className, ...props }: HostProps<'div'>) {
|
|
75
|
-
return
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
89
|
+
return (
|
|
90
|
+
<div
|
|
91
|
+
data-slot="avatar-group-count"
|
|
92
|
+
className={cn(
|
|
93
|
+
'relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3',
|
|
94
|
+
className,
|
|
95
|
+
)}
|
|
96
|
+
{...props}
|
|
97
|
+
/>
|
|
98
|
+
);
|
|
83
99
|
}
|
|
@@ -11,7 +11,8 @@ export const badgeVariants = cva(
|
|
|
11
11
|
variant: {
|
|
12
12
|
default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80',
|
|
13
13
|
secondary: 'bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80',
|
|
14
|
-
destructive:
|
|
14
|
+
destructive:
|
|
15
|
+
'bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20',
|
|
15
16
|
outline: 'border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground',
|
|
16
17
|
ghost: 'hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50',
|
|
17
18
|
link: 'text-primary underline-offset-4 hover:underline',
|
|
@@ -23,11 +24,15 @@ export const badgeVariants = cva(
|
|
|
23
24
|
},
|
|
24
25
|
);
|
|
25
26
|
|
|
26
|
-
export function Badge({
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
render
|
|
30
|
-
|
|
27
|
+
export function Badge({
|
|
28
|
+
className,
|
|
29
|
+
variant = 'default',
|
|
30
|
+
render,
|
|
31
|
+
...props
|
|
32
|
+
}: HostProps<'span'> &
|
|
33
|
+
VariantProps<typeof badgeVariants> & {
|
|
34
|
+
render?: (props: Record<string, unknown>) => OctaneNode;
|
|
35
|
+
}) {
|
|
31
36
|
if (render) {
|
|
32
37
|
const renderProps = {
|
|
33
38
|
'data-slot': 'badge',
|
|
@@ -39,10 +44,12 @@ export function Badge({ className, variant = 'default', render, ...props }: Host
|
|
|
39
44
|
return render(renderProps);
|
|
40
45
|
}
|
|
41
46
|
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
return (
|
|
48
|
+
<span
|
|
49
|
+
data-slot="badge"
|
|
50
|
+
data-variant={variant}
|
|
51
|
+
className={cn(badgeVariants({ variant }), className)}
|
|
52
|
+
{...props}
|
|
53
|
+
/>
|
|
54
|
+
);
|
|
48
55
|
}
|