@octanejs/shadcn 0.0.52 → 0.0.53

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 (83) hide show
  1. package/package.json +9 -9
  2. package/src/bases/base-ui/ui/accordion.tsrx +3 -1
  3. package/src/bases/base-ui/ui/alert-dialog.tsrx +6 -5
  4. package/src/bases/base-ui/ui/alert.tsrx +3 -2
  5. package/src/bases/base-ui/ui/aspect-ratio.tsrx +5 -3
  6. package/src/bases/base-ui/ui/badge.tsrx +2 -1
  7. package/src/bases/base-ui/ui/breadcrumb.tsrx +4 -4
  8. package/src/bases/base-ui/ui/button.tsrx +17 -10
  9. package/src/bases/base-ui/ui/context-menu.tsrx +37 -29
  10. package/src/bases/base-ui/ui/dialog.tsrx +6 -4
  11. package/src/bases/base-ui/ui/dropdown-menu.tsrx +37 -29
  12. package/src/bases/base-ui/ui/empty.tsrx +1 -1
  13. package/src/bases/base-ui/ui/field.tsrx +17 -11
  14. package/src/bases/base-ui/ui/hover-card.tsrx +15 -16
  15. package/src/bases/base-ui/ui/item.tsrx +3 -2
  16. package/src/bases/base-ui/ui/kbd.tsrx +1 -1
  17. package/src/bases/base-ui/ui/menubar.tsrx +38 -34
  18. package/src/bases/base-ui/ui/native-select.tsrx +3 -4
  19. package/src/bases/base-ui/ui/navigation-menu.tsrx +113 -87
  20. package/src/bases/base-ui/ui/pagination.tsrx +6 -2
  21. package/src/bases/base-ui/ui/popover.tsrx +15 -16
  22. package/src/bases/base-ui/ui/radio-group.tsrx +1 -3
  23. package/src/bases/base-ui/ui/scroll-area.tsrx +33 -27
  24. package/src/bases/base-ui/ui/select.tsrx +138 -106
  25. package/src/bases/base-ui/ui/sheet.tsrx +6 -4
  26. package/src/bases/base-ui/ui/sidebar.tsrx +65 -44
  27. package/src/bases/base-ui/ui/slider.tsrx +1 -3
  28. package/src/bases/base-ui/ui/tabs.tsrx +1 -1
  29. package/src/bases/base-ui/ui/toggle-group.tsrx +3 -3
  30. package/src/bases/base-ui/ui/toggle.tsrx +3 -2
  31. package/src/bases/base-ui/ui/tooltip.tsrx +17 -17
  32. package/src/bases/radix/ui/accordion.tsrx +3 -1
  33. package/src/bases/radix/ui/alert-dialog.tsrx +1 -1
  34. package/src/bases/radix/ui/alert.tsrx +15 -14
  35. package/src/bases/radix/ui/badge.tsrx +2 -1
  36. package/src/bases/radix/ui/button.tsrx +17 -10
  37. package/src/bases/radix/ui/context-menu.tsrx +20 -10
  38. package/src/bases/radix/ui/dropdown-menu.tsrx +16 -9
  39. package/src/bases/radix/ui/empty.tsrx +1 -1
  40. package/src/bases/radix/ui/field.tsrx +17 -11
  41. package/src/bases/radix/ui/item.tsrx +3 -2
  42. package/src/bases/radix/ui/menubar.tsrx +17 -14
  43. package/src/bases/radix/ui/native-select.tsrx +8 -8
  44. package/src/bases/radix/ui/navigation-menu.tsrx +2 -3
  45. package/src/bases/radix/ui/pagination.tsrx +6 -2
  46. package/src/bases/radix/ui/radio-group.tsrx +1 -3
  47. package/src/bases/radix/ui/scroll-area.tsrx +8 -2
  48. package/src/bases/radix/ui/select.tsrx +10 -5
  49. package/src/bases/radix/ui/sidebar.tsrx +61 -42
  50. package/src/bases/radix/ui/slider.tsrx +9 -7
  51. package/src/bases/radix/ui/tabs.tsrx +11 -5
  52. package/src/bases/radix/ui/toggle.tsrx +3 -2
  53. package/src/bases/radix/ui/tooltip.tsrx +2 -1
  54. package/src/bases/react-aria/ui/accordion.tsrx +58 -47
  55. package/src/bases/react-aria/ui/alert-dialog.tsrx +118 -92
  56. package/src/bases/react-aria/ui/alert.tsrx +39 -32
  57. package/src/bases/react-aria/ui/aspect-ratio.tsrx +12 -8
  58. package/src/bases/react-aria/ui/avatar.tsrx +73 -57
  59. package/src/bases/react-aria/ui/badge.tsrx +19 -12
  60. package/src/bases/react-aria/ui/breadcrumb.tsrx +66 -57
  61. package/src/bases/react-aria/ui/button.tsrx +17 -10
  62. package/src/bases/react-aria/ui/card.tsrx +63 -49
  63. package/src/bases/react-aria/ui/checkbox.tsrx +25 -19
  64. package/src/bases/react-aria/ui/dialog.tsrx +103 -83
  65. package/src/bases/react-aria/ui/empty.tsrx +58 -44
  66. package/src/bases/react-aria/ui/field.tsrx +142 -100
  67. package/src/bases/react-aria/ui/input.tsrx +2 -3
  68. package/src/bases/react-aria/ui/item.tsrx +98 -78
  69. package/src/bases/react-aria/ui/kbd.tsrx +1 -1
  70. package/src/bases/react-aria/ui/label.tsrx +12 -10
  71. package/src/bases/react-aria/ui/native-select.tsrx +38 -30
  72. package/src/bases/react-aria/ui/pagination.tsrx +76 -60
  73. package/src/bases/react-aria/ui/popover.tsrx +32 -22
  74. package/src/bases/react-aria/ui/radio-group.tsrx +30 -23
  75. package/src/bases/react-aria/ui/scroll-area.tsrx +12 -8
  76. package/src/bases/react-aria/ui/sheet.tsrx +92 -73
  77. package/src/bases/react-aria/ui/skeleton.tsrx +7 -5
  78. package/src/bases/react-aria/ui/slider.tsrx +44 -38
  79. package/src/bases/react-aria/ui/switch.tsrx +28 -20
  80. package/src/bases/react-aria/ui/table.tsrx +67 -51
  81. package/src/bases/react-aria/ui/tabs.tsrx +40 -31
  82. package/src/bases/react-aria/ui/textarea.tsrx +2 -3
  83. 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({ className, children, ...props }: Omit<
25
- ModalOverlayPrimitiveProps,
26
- 'className' | 'children'
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 <ModalOverlayPrimitive
32
- data-slot="alert-dialog-overlay"
33
- className={cn(
34
- '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',
35
- className,
36
- )}
37
- {...props}
38
- >{children}</ModalOverlayPrimitive>;
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({ className, size = 'default', children, ...props }: Omit<
42
- ModalOverlayPrimitiveProps,
43
- 'className' | 'children'
44
- > & { isDismissable?: boolean } & {
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 <AlertDialogOverlay {...props}>
50
- <ModalPrimitive
51
- data-slot="alert-dialog-content"
52
- data-size={size}
53
- className={cn(
54
- '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',
55
- className,
56
- )}
57
- >
58
- <AlertDialogPrimitive
59
- data-slot="alert-dialog"
60
- role="alertdialog"
61
- className="[display:inherit] [gap:inherit] outline-none"
62
- >{children}</AlertDialogPrimitive>
63
- </ModalPrimitive>
64
- </AlertDialogOverlay>;
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({ className, size = 'default', children, ...props }: Record<
68
- string,
69
- any
70
- >) {
71
- return <AlertDialog className={className} size={size} {...props}>{children}</AlertDialog>;
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 <div
76
- data-slot="alert-dialog-header"
77
- className={cn(
78
- '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]',
79
- className,
80
- )}
81
- {...props}
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 <div
87
- data-slot="alert-dialog-footer"
88
- className={cn(
89
- '-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',
90
- className,
91
- )}
92
- {...props}
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 <div
98
- data-slot="alert-dialog-media"
99
- className={cn(
100
- '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',
101
- className,
102
- )}
103
- {...props}
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 <Heading
109
- slot="title"
110
- data-slot="alert-dialog-title"
111
- className={cn(
112
- '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',
113
- className,
114
- )}
115
- {...props}
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 <div
121
- data-slot="alert-dialog-description"
122
- className={cn(
123
- 'text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground',
124
- className,
125
- )}
126
- {...props}
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 <Button
132
- slot="close"
133
- data-slot="alert-dialog-action"
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 <Button
146
- slot="close"
147
- data-slot="alert-dialog-cancel"
148
- className={cn(className)}
149
- variant={variant}
150
- size={size}
151
- {...props}
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
- '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',
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: 'bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current',
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({ className, variant, ...props }: HostProps<'div'> & VariantProps<
22
- typeof alertVariants
23
- >) {
24
- return <div
25
- data-slot="alert"
26
- role="alert"
27
- className={cn(alertVariants({ variant }), className)}
28
- {...props}
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 <div
34
- data-slot="alert-title"
35
- className={cn(
36
- 'font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground',
37
- className,
38
- )}
39
- {...props}
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 <div
45
- data-slot="alert-description"
46
- className={cn(
47
- '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',
48
- className,
49
- )}
50
- {...props}
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 <div
56
- data-slot="alert-action"
57
- className={cn('absolute top-2 right-2', className)}
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 <div
6
- data-slot="aspect-ratio"
7
- style={{
8
- '--ratio': ratio,
9
- } as Record<string, string | number>}
10
- className={cn('relative aspect-(--ratio)', className)}
11
- {...props}
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({ className, size = 'default', ...props }: HostProps<'div'> & {
6
+ export function Avatar({
7
+ className,
8
+ size = 'default',
9
+ ...props
10
+ }: HostProps<'div'> & {
7
11
  size?: 'default' | 'sm' | 'lg';
8
12
  }) {
9
- return <div
10
- data-slot="avatar"
11
- data-size={size}
12
- className={cn(
13
- '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',
14
- className,
15
- )}
16
- {...props}
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 <img
25
- data-slot="avatar-image"
26
- alt={props.alt || ''}
27
- data-state={state}
28
- onLoad={() => setState('loaded')}
29
- onError={() => setState('error')}
30
- className={cn(
31
- 'peer aspect-square size-full rounded-full object-cover data-[state=error]:hidden',
32
- className,
33
- )}
34
- {...props}
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 <div
40
- data-slot="avatar-fallback"
41
- className={cn(
42
- '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',
43
- className,
44
- )}
45
- {...props}
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 <span
51
- data-slot="avatar-badge"
52
- className={cn(
53
- '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',
54
- 'group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden',
55
- 'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2',
56
- 'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2',
57
- className,
58
- )}
59
- {...props}
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 <div
65
- data-slot="avatar-group"
66
- className={cn(
67
- 'group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background',
68
- className,
69
- )}
70
- {...props}
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 <div
76
- data-slot="avatar-group-count"
77
- className={cn(
78
- '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',
79
- className,
80
- )}
81
- {...props}
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: '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',
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({ className, variant = 'default', render, ...props }: HostProps<
27
- 'span'
28
- > & VariantProps<typeof badgeVariants> & {
29
- render?: (props: Record<string, unknown>) => OctaneNode;
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 <span
43
- data-slot="badge"
44
- data-variant={variant}
45
- className={cn(badgeVariants({ variant }), className)}
46
- {...props}
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
  }