@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
@@ -4,22 +4,26 @@ import { cn } from 'cn';
4
4
  import type { HostProps } from '../../../lib/types';
5
5
 
6
6
  export function Empty({ className, ...props }: HostProps<'div'>) {
7
- return <div
8
- data-slot="empty"
9
- className={cn(
10
- 'flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance',
11
- className,
12
- )}
13
- {...props}
14
- />;
7
+ return (
8
+ <div
9
+ data-slot="empty"
10
+ className={cn(
11
+ 'flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance',
12
+ className,
13
+ )}
14
+ {...props}
15
+ />
16
+ );
15
17
  }
16
18
 
17
19
  export function EmptyHeader({ className, ...props }: HostProps<'div'>) {
18
- return <div
19
- data-slot="empty-header"
20
- className={cn('flex max-w-sm flex-col items-center gap-2', className)}
21
- {...props}
22
- />;
20
+ return (
21
+ <div
22
+ data-slot="empty-header"
23
+ className={cn('flex max-w-sm flex-col items-center gap-2', className)}
24
+ {...props}
25
+ />
26
+ );
23
27
  }
24
28
 
25
29
  const emptyMediaVariants = cva(
@@ -28,7 +32,7 @@ const emptyMediaVariants = cva(
28
32
  variants: {
29
33
  variant: {
30
34
  default: 'bg-transparent',
31
- icon: 'flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*=\'size-\'])]:size-4',
35
+ icon: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4",
32
36
  },
33
37
  },
34
38
  defaultVariants: {
@@ -37,43 +41,53 @@ const emptyMediaVariants = cva(
37
41
  },
38
42
  );
39
43
 
40
- export function EmptyMedia({ className, variant = 'default', ...props }: HostProps<
41
- 'div'
42
- > & VariantProps<typeof emptyMediaVariants>) {
43
- return <div
44
- data-slot="empty-icon"
45
- data-variant={variant}
46
- className={cn(emptyMediaVariants({ variant, className }))}
47
- {...props}
48
- />;
44
+ export function EmptyMedia({
45
+ className,
46
+ variant = 'default',
47
+ ...props
48
+ }: HostProps<'div'> & VariantProps<typeof emptyMediaVariants>) {
49
+ return (
50
+ <div
51
+ data-slot="empty-icon"
52
+ data-variant={variant}
53
+ className={cn(emptyMediaVariants({ variant, className }))}
54
+ {...props}
55
+ />
56
+ );
49
57
  }
50
58
 
51
59
  export function EmptyTitle({ className, ...props }: HostProps<'div'>) {
52
- return <div
53
- data-slot="empty-title"
54
- className={cn('text-sm font-medium tracking-tight', className)}
55
- {...props}
56
- />;
60
+ return (
61
+ <div
62
+ data-slot="empty-title"
63
+ className={cn('text-sm font-medium tracking-tight', className)}
64
+ {...props}
65
+ />
66
+ );
57
67
  }
58
68
 
59
69
  export function EmptyDescription({ className, ...props }: HostProps<'p'>) {
60
- return <div
61
- data-slot="empty-description"
62
- className={cn(
63
- 'text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
64
- className,
65
- )}
66
- {...props}
67
- />;
70
+ return (
71
+ <div
72
+ data-slot="empty-description"
73
+ className={cn(
74
+ 'text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
75
+ className,
76
+ )}
77
+ {...props}
78
+ />
79
+ );
68
80
  }
69
81
 
70
82
  export function EmptyContent({ className, ...props }: HostProps<'div'>) {
71
- return <div
72
- data-slot="empty-content"
73
- className={cn(
74
- 'flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance',
75
- className,
76
- )}
77
- {...props}
78
- />;
83
+ return (
84
+ <div
85
+ data-slot="empty-content"
86
+ className={cn(
87
+ 'flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance',
88
+ className,
89
+ )}
90
+ {...props}
91
+ />
92
+ );
79
93
  }
@@ -7,47 +7,59 @@ import { Label } from './label.tsrx';
7
7
  import { Separator } from './separator.tsrx';
8
8
 
9
9
  export function FieldSet({ className, ...props }: HostProps<'fieldset'>) {
10
- return <fieldset
11
- data-slot="field-set"
12
- className={cn(
13
- 'flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3',
14
- className,
15
- )}
16
- {...props}
17
- />;
10
+ return (
11
+ <fieldset
12
+ data-slot="field-set"
13
+ className={cn(
14
+ 'flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3',
15
+ className,
16
+ )}
17
+ {...props}
18
+ />
19
+ );
18
20
  }
19
21
 
20
- export function FieldLegend({ className, variant = 'legend', ...props }: HostProps<'legend'> & {
22
+ export function FieldLegend({
23
+ className,
24
+ variant = 'legend',
25
+ ...props
26
+ }: HostProps<'legend'> & {
21
27
  variant?: 'legend' | 'label';
22
28
  }) {
23
- return <legend
24
- data-slot="field-legend"
25
- data-variant={variant}
26
- className={cn(
27
- 'mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base',
28
- className,
29
- )}
30
- {...props}
31
- />;
29
+ return (
30
+ <legend
31
+ data-slot="field-legend"
32
+ data-variant={variant}
33
+ className={cn(
34
+ 'mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base',
35
+ className,
36
+ )}
37
+ {...props}
38
+ />
39
+ );
32
40
  }
33
41
 
34
42
  export function FieldGroup({ className, ...props }: HostProps<'div'>) {
35
- return <div
36
- data-slot="field-group"
37
- className={cn(
38
- 'group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4',
39
- className,
40
- )}
41
- {...props}
42
- />;
43
+ return (
44
+ <div
45
+ data-slot="field-group"
46
+ className={cn(
47
+ 'group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4',
48
+ className,
49
+ )}
50
+ {...props}
51
+ />
52
+ );
43
53
  }
44
54
 
45
55
  const fieldVariants = cva('group/field flex w-full gap-2 data-[invalid=true]:text-destructive', {
46
56
  variants: {
47
57
  orientation: {
48
58
  vertical: 'flex-col *:w-full [&>.sr-only]:w-auto',
49
- horizontal: 'flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',
50
- responsive: 'flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',
59
+ horizontal:
60
+ 'flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',
61
+ responsive:
62
+ 'flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',
51
63
  },
52
64
  },
53
65
  defaultVariants: {
@@ -55,84 +67,110 @@ const fieldVariants = cva('group/field flex w-full gap-2 data-[invalid=true]:tex
55
67
  },
56
68
  });
57
69
 
58
- export function Field({ className, orientation = 'vertical', ...props }: HostProps<
59
- 'div'
60
- > & VariantProps<typeof fieldVariants>) {
61
- return <div
62
- role="group"
63
- data-slot="field"
64
- data-orientation={orientation}
65
- className={cn(fieldVariants({ orientation }), className)}
66
- {...props}
67
- />;
70
+ export function Field({
71
+ className,
72
+ orientation = 'vertical',
73
+ ...props
74
+ }: HostProps<'div'> & VariantProps<typeof fieldVariants>) {
75
+ return (
76
+ <div
77
+ role="group"
78
+ data-slot="field"
79
+ data-orientation={orientation}
80
+ className={cn(fieldVariants({ orientation }), className)}
81
+ {...props}
82
+ />
83
+ );
68
84
  }
69
85
 
70
86
  export function FieldContent({ className, ...props }: HostProps<'div'>) {
71
- return <div
72
- data-slot="field-content"
73
- className={cn('group/field-content flex flex-1 flex-col gap-0.5 leading-snug', className)}
74
- {...props}
75
- />;
87
+ return (
88
+ <div
89
+ data-slot="field-content"
90
+ className={cn('group/field-content flex flex-1 flex-col gap-0.5 leading-snug', className)}
91
+ {...props}
92
+ />
93
+ );
76
94
  }
77
95
 
78
96
  export function FieldLabel({ className, ...props }: Record<string, any>) {
79
- return <Label
80
- data-slot="field-label"
81
- className={cn(
82
- 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-data-selected:border-primary/30 has-data-selected:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10 dark:has-data-selected:border-primary/20 dark:has-data-selected:bg-primary/10',
83
- 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col',
84
- className,
85
- )}
86
- {...props}
87
- />;
97
+ return (
98
+ <Label
99
+ data-slot="field-label"
100
+ className={cn(
101
+ 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-data-selected:border-primary/30 has-data-selected:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10 dark:has-data-selected:border-primary/20 dark:has-data-selected:bg-primary/10',
102
+ 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col',
103
+ className,
104
+ )}
105
+ {...props}
106
+ />
107
+ );
88
108
  }
89
109
 
90
110
  export function FieldTitle({ className, ...props }: HostProps<'div'>) {
91
- return <div
92
- data-slot="field-label"
93
- className={cn(
94
- 'flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50',
95
- className,
96
- )}
97
- {...props}
98
- />;
111
+ return (
112
+ <div
113
+ data-slot="field-label"
114
+ className={cn(
115
+ 'flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50',
116
+ className,
117
+ )}
118
+ {...props}
119
+ />
120
+ );
99
121
  }
100
122
 
101
123
  export function FieldDescription({ className, ...props }: HostProps<'p'>) {
102
- return <p
103
- data-slot="field-description"
104
- className={cn(
105
- 'text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5',
106
- 'last:mt-0 nth-last-2:-mt-1',
107
- '[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
108
- className,
109
- )}
110
- {...props}
111
- />;
124
+ return (
125
+ <p
126
+ data-slot="field-description"
127
+ className={cn(
128
+ 'text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5',
129
+ 'last:mt-0 nth-last-2:-mt-1',
130
+ '[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
131
+ className,
132
+ )}
133
+ {...props}
134
+ />
135
+ );
112
136
  }
113
137
 
114
- export function FieldSeparator({ children, className, ...props }: HostProps<'div'> & {
138
+ export function FieldSeparator({
139
+ children,
140
+ className,
141
+ ...props
142
+ }: HostProps<'div'> & {
115
143
  children?: OctaneNode;
116
144
  }) {
117
- return <div
118
- data-slot="field-separator"
119
- data-content={!!children}
120
- className={cn(
121
- 'relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2',
122
- className,
123
- )}
124
- {...props}
125
- >
126
- <Separator className="absolute inset-0 top-1/2" />
127
- {children &&
128
- <span
129
- className="relative mx-auto block w-fit bg-background px-2 text-muted-foreground"
130
- data-slot="field-separator-content"
131
- >{children}</span>}
132
- </div>;
145
+ return (
146
+ <div
147
+ data-slot="field-separator"
148
+ data-content={!!children}
149
+ className={cn(
150
+ 'relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2',
151
+ className,
152
+ )}
153
+ {...props}
154
+ >
155
+ <Separator className="absolute inset-0 top-1/2" />
156
+ {children && (
157
+ <span
158
+ className="relative mx-auto block w-fit bg-background px-2 text-muted-foreground"
159
+ data-slot="field-separator-content"
160
+ >
161
+ {children}
162
+ </span>
163
+ )}
164
+ </div>
165
+ );
133
166
  }
134
167
 
135
- export function FieldError({ className, children, errors, ...props }: HostProps<'div'> & {
168
+ export function FieldError({
169
+ className,
170
+ children,
171
+ errors,
172
+ ...props
173
+ }: HostProps<'div'> & {
136
174
  errors?: Array<{ message?: string } | undefined>;
137
175
  }) {
138
176
  const content = useMemo(() => {
@@ -144,27 +182,31 @@ export function FieldError({ className, children, errors, ...props }: HostProps<
144
182
  return null;
145
183
  }
146
184
 
147
- const uniqueErrors = [
148
- ...new Map(errors.map((error) => [error?.message, error])).values(),
149
- ];
185
+ const uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()];
150
186
 
151
187
  if (uniqueErrors?.length == 1) {
152
188
  return uniqueErrors[0]?.message;
153
189
  }
154
190
 
155
- return <ul className="ml-4 flex list-disc flex-col gap-1">{uniqueErrors.map(
156
- (error, index) => error?.message && <li key={index}>{error.message}</li>,
157
- )}</ul>;
191
+ return (
192
+ <ul className="ml-4 flex list-disc flex-col gap-1">
193
+ {uniqueErrors.map((error, index) => error?.message && <li key={index}>{error.message}</li>)}
194
+ </ul>
195
+ );
158
196
  }, [children, errors]);
159
197
 
160
198
  if (!content) {
161
199
  return null;
162
200
  }
163
201
 
164
- return <div
165
- role="alert"
166
- data-slot="field-error"
167
- className={cn('text-sm font-normal text-destructive', className)}
168
- {...props}
169
- >{content}</div>;
202
+ return (
203
+ <div
204
+ role="alert"
205
+ data-slot="field-error"
206
+ className={cn('text-sm font-normal text-destructive', className)}
207
+ {...props}
208
+ >
209
+ {content}
210
+ </div>
211
+ );
170
212
  }
@@ -16,9 +16,8 @@ export function Input({ className, type, ...props }: InputProps) @{
16
16
  <InputPrimitive
17
17
  type={type}
18
18
  data-slot="input"
19
- className={composeRenderProps(
20
- className,
21
- (resolved: string | undefined) => cn(
19
+ className={composeRenderProps(className, (resolved: string | undefined) =>
20
+ cn(
22
21
  'h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40',
23
22
  resolved,
24
23
  ),