@octanejs/shadcn 0.0.51 → 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
@@ -3,12 +3,16 @@ import type { HostProps } from '../../../lib/types';
3
3
 
4
4
  export function ScrollArea({ className, children, ...props }: HostProps<'div'>) {
5
5
  // Use native scrollbar-width and scrollbar-color to customize the scrollbar.
6
- return <div
7
- data-slot="scroll-area"
8
- className={cn(
9
- 'relative [scrollbar-width:thin] [scrollbar-color:var(--color-border)_transparent] overflow-auto outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1',
10
- className,
11
- )}
12
- {...props}
13
- >{children}</div>;
6
+ return (
7
+ <div
8
+ data-slot="scroll-area"
9
+ className={cn(
10
+ 'relative [scrollbar-width:thin] [scrollbar-color:var(--color-border)_transparent] overflow-auto outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1',
11
+ className,
12
+ )}
13
+ {...props}
14
+ >
15
+ {children}
16
+ </div>
17
+ );
14
18
  }
@@ -22,36 +22,45 @@ export function SheetTrigger({ ...props }: SheetTriggerPrimitiveProps) {
22
22
  return <SheetTriggerPrimitive data-slot="sheet-trigger" {...props} />;
23
23
  }
24
24
 
25
- export function SheetClose({ className, variant = 'outline', size = 'default', ...props }: Record<
26
- string,
27
- any
28
- >) {
29
- return <Button
30
- slot="close"
31
- data-slot="sheet-close"
32
- variant={variant}
33
- size={size}
34
- className={cn(className)}
35
- {...props}
36
- />;
25
+ export function SheetClose({
26
+ className,
27
+ variant = 'outline',
28
+ size = 'default',
29
+ ...props
30
+ }: Record<string, any>) {
31
+ return (
32
+ <Button
33
+ slot="close"
34
+ data-slot="sheet-close"
35
+ variant={variant}
36
+ size={size}
37
+ className={cn(className)}
38
+ {...props}
39
+ />
40
+ );
37
41
  }
38
42
 
39
- function SheetOverlay({ className, children, ...props }: Omit<
40
- ModalOverlayPrimitiveProps,
41
- 'className' | 'children'
42
- > & {
43
+ function SheetOverlay({
44
+ className,
45
+ children,
46
+ ...props
47
+ }: Omit<ModalOverlayPrimitiveProps, 'className' | 'children'> & {
43
48
  className?: string;
44
49
  children: OctaneNode;
45
50
  }) {
46
- return <ModalOverlayPrimitive
47
- data-slot="sheet-overlay"
48
- isDismissable
49
- className={cn(
50
- 'fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-entering:opacity-0 data-exiting:opacity-0 supports-backdrop-filter:backdrop-blur-xs',
51
- className,
52
- )}
53
- {...props}
54
- >{children}</ModalOverlayPrimitive>;
51
+ return (
52
+ <ModalOverlayPrimitive
53
+ data-slot="sheet-overlay"
54
+ isDismissable
55
+ className={cn(
56
+ 'fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-entering:opacity-0 data-exiting:opacity-0 supports-backdrop-filter:backdrop-blur-xs',
57
+ className,
58
+ )}
59
+ {...props}
60
+ >
61
+ {children}
62
+ </ModalOverlayPrimitive>
63
+ );
55
64
  }
56
65
 
57
66
  export function Sheet({
@@ -66,28 +75,31 @@ export function Sheet({
66
75
  side?: 'top' | 'right' | 'bottom' | 'left';
67
76
  showCloseButton?: boolean;
68
77
  }) {
69
- return <SheetOverlay {...props}>
70
- <ModalPrimitive
71
- data-slot="sheet-content"
72
- data-side={side}
73
- className={cn(
74
- 'fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-entering:opacity-0 data-exiting:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-entering:translate-y-[2.5rem] data-[side=bottom]:data-exiting:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-entering:translate-x-[-2.5rem] data-[side=left]:data-exiting:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-entering:translate-x-[2.5rem] data-[side=right]:data-exiting:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-entering:translate-y-[-2.5rem] data-[side=top]:data-exiting:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',
75
- className,
76
- )}
77
- >
78
- <SheetPrimitive
79
- data-slot="sheet"
80
- className="[display:inherit] h-full max-h-[inherit] [flex-direction:inherit] [gap:inherit] outline-none"
78
+ return (
79
+ <SheetOverlay {...props}>
80
+ <ModalPrimitive
81
+ data-slot="sheet-content"
82
+ data-side={side}
83
+ className={cn(
84
+ 'fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-entering:opacity-0 data-exiting:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-entering:translate-y-[2.5rem] data-[side=bottom]:data-exiting:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-entering:translate-x-[-2.5rem] data-[side=left]:data-exiting:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-entering:translate-x-[2.5rem] data-[side=right]:data-exiting:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-entering:translate-y-[-2.5rem] data-[side=top]:data-exiting:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',
85
+ className,
86
+ )}
81
87
  >
82
- {children}
83
- {showCloseButton &&
84
- <SheetClose variant="ghost" className="absolute top-3 right-3" size="icon-sm">
85
- <XIcon />
86
- <span className="sr-only">Close</span>
87
- </SheetClose>}
88
- </SheetPrimitive>
89
- </ModalPrimitive>
90
- </SheetOverlay>;
88
+ <SheetPrimitive
89
+ data-slot="sheet"
90
+ className="[display:inherit] h-full max-h-[inherit] [flex-direction:inherit] [gap:inherit] outline-none"
91
+ >
92
+ {children}
93
+ {showCloseButton && (
94
+ <SheetClose variant="ghost" className="absolute top-3 right-3" size="icon-sm">
95
+ <XIcon />
96
+ <span className="sr-only">Close</span>
97
+ </SheetClose>
98
+ )}
99
+ </SheetPrimitive>
100
+ </ModalPrimitive>
101
+ </SheetOverlay>
102
+ );
91
103
  }
92
104
 
93
105
  export function SheetContent({
@@ -100,43 +112,50 @@ export function SheetContent({
100
112
  side?: 'top' | 'right' | 'bottom' | 'left';
101
113
  showCloseButton?: boolean;
102
114
  }) {
103
- return <Sheet
104
- className={className}
105
- side={side}
106
- showCloseButton={showCloseButton}
107
- {...props}
108
- >{children}</Sheet>;
115
+ return (
116
+ <Sheet className={className} side={side} showCloseButton={showCloseButton} {...props}>
117
+ {children}
118
+ </Sheet>
119
+ );
109
120
  }
110
121
 
111
122
  export function SheetHeader({ className, ...props }: HostProps<'div'>) {
112
- return <div
113
- data-slot="sheet-header"
114
- className={cn('flex flex-col gap-0.5 p-4', className)}
115
- {...props}
116
- />;
123
+ return (
124
+ <div
125
+ data-slot="sheet-header"
126
+ className={cn('flex flex-col gap-0.5 p-4', className)}
127
+ {...props}
128
+ />
129
+ );
117
130
  }
118
131
 
119
132
  export function SheetFooter({ className, ...props }: HostProps<'div'>) {
120
- return <div
121
- data-slot="sheet-footer"
122
- className={cn('mt-auto flex flex-col gap-2 p-4', className)}
123
- {...props}
124
- />;
133
+ return (
134
+ <div
135
+ data-slot="sheet-footer"
136
+ className={cn('mt-auto flex flex-col gap-2 p-4', className)}
137
+ {...props}
138
+ />
139
+ );
125
140
  }
126
141
 
127
142
  export function SheetTitle({ className, ...props }: Omit<HeadingProps, 'slot'>) {
128
- return <Heading
129
- slot="title"
130
- data-slot="sheet-title"
131
- className={cn('text-base font-medium text-foreground', className)}
132
- {...props}
133
- />;
143
+ return (
144
+ <Heading
145
+ slot="title"
146
+ data-slot="sheet-title"
147
+ className={cn('text-base font-medium text-foreground', className)}
148
+ {...props}
149
+ />
150
+ );
134
151
  }
135
152
 
136
153
  export function SheetDescription({ className, ...props }: Omit<HostProps<'div'>, 'slot'>) {
137
- return <div
138
- data-slot="sheet-description"
139
- className={cn('text-sm text-muted-foreground', className)}
140
- {...props}
141
- />;
154
+ return (
155
+ <div
156
+ data-slot="sheet-description"
157
+ className={cn('text-sm text-muted-foreground', className)}
158
+ {...props}
159
+ />
160
+ );
142
161
  }
@@ -2,9 +2,11 @@ import { cn } from 'cn';
2
2
  import type { HostProps } from '../../../lib/types';
3
3
 
4
4
  export function Skeleton({ className, ...props }: HostProps<'div'>) {
5
- return <div
6
- data-slot="skeleton"
7
- className={cn('animate-pulse rounded-md bg-muted', className)}
8
- {...props}
9
- />;
5
+ return (
6
+ <div
7
+ data-slot="skeleton"
8
+ className={cn('animate-pulse rounded-md bg-muted', className)}
9
+ {...props}
10
+ />
11
+ );
10
12
  }
@@ -14,43 +14,49 @@ import {
14
14
  import { cn } from 'cn';
15
15
 
16
16
  type SliderValue = number | number[];
17
- type SliderProps<T extends SliderValue = SliderValue> =
18
- Omit<SliderPrimitiveProps<T>, 'className'> & {
19
- className?: string;
20
- };
17
+ type SliderProps<T extends SliderValue = SliderValue> = Omit<
18
+ SliderPrimitiveProps<T>,
19
+ 'className'
20
+ > & {
21
+ className?: string;
22
+ };
21
23
 
22
- export function Slider<T extends SliderValue = SliderValue>({ className, ...props }: SliderProps<
23
- T
24
- >) {
25
- return <SliderPrimitive
26
- className={cn(
27
- 'group relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col',
28
- className,
29
- )}
30
- data-slot="slider"
31
- {...props}
32
- >
33
- {({ state }: SliderRenderProps) => {
34
- return <>
35
- <SliderTrack
36
- data-slot="slider-track"
37
- className="relative grow overflow-hidden rounded-full bg-muted select-none data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1"
38
- >
39
- <SliderFill
40
- data-slot="slider-range"
41
- className="absolute bg-primary select-none data-horizontal:h-full data-vertical:w-full"
42
- />
43
- </SliderTrack>
44
- {state.values.map(
45
- (_: number, index: number) =>
46
- <SliderThumb
47
- data-slot="slider-thumb"
48
- key={index}
49
- index={index}
50
- className="relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none group-data-horizontal:top-[50%] group-data-vertical:left-[50%] after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50"
51
- />,
52
- )}
53
- </>;
54
- }}
55
- </SliderPrimitive>;
24
+ export function Slider<T extends SliderValue = SliderValue>({
25
+ className,
26
+ ...props
27
+ }: SliderProps<T>) {
28
+ return (
29
+ <SliderPrimitive
30
+ className={cn(
31
+ 'group relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col',
32
+ className,
33
+ )}
34
+ data-slot="slider"
35
+ {...props}
36
+ >
37
+ {({ state }: SliderRenderProps) => {
38
+ return (
39
+ <>
40
+ <SliderTrack
41
+ data-slot="slider-track"
42
+ className="relative grow overflow-hidden rounded-full bg-muted select-none data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1"
43
+ >
44
+ <SliderFill
45
+ data-slot="slider-range"
46
+ className="absolute bg-primary select-none data-horizontal:h-full data-vertical:w-full"
47
+ />
48
+ </SliderTrack>
49
+ {state.values.map((_: number, index: number) => (
50
+ <SliderThumb
51
+ data-slot="slider-thumb"
52
+ key={index}
53
+ index={index}
54
+ className="relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none group-data-horizontal:top-[50%] group-data-vertical:left-[50%] after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50"
55
+ />
56
+ ))}
57
+ </>
58
+ );
59
+ }}
60
+ </SliderPrimitive>
61
+ );
56
62
  }
@@ -13,26 +13,34 @@ import {
13
13
 
14
14
  import { cn } from 'cn';
15
15
 
16
- export function Switch({ className, size = 'default', children, ...props }: SwitchPrimitiveProps & {
16
+ export function Switch({
17
+ className,
18
+ size = 'default',
19
+ children,
20
+ ...props
21
+ }: SwitchPrimitiveProps & {
17
22
  size?: 'sm' | 'default';
18
23
  }) {
19
- return <SwitchPrimitive
20
- data-slot="switch"
21
- data-size={size}
22
- className={cn(
23
- 'peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none not-data-selected:bg-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-focus-visible:border-ring data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-invalid:border-destructive data-invalid:ring-3 data-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:not-data-selected:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:data-invalid:border-destructive/50 dark:data-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-selected:bg-primary data-disabled:cursor-not-allowed data-disabled:opacity-50',
24
- className,
25
- )}
26
- {...props}
27
- >{composeRenderProps(
28
- children,
29
- (children, { isSelected }: SwitchRenderProps) => <>
30
- <span
31
- data-slot="switch-thumb"
32
- data-selected={isSelected || undefined}
33
- className="pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=default]/switch:not-data-selected:translate-x-0 group-data-[size=sm]/switch:size-3 group-data-[size=sm]/switch:not-data-selected:translate-x-0 dark:not-data-selected:bg-foreground group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground group-data-[size=default]/switch:data-selected:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-selected:translate-x-[calc(100%-2px)] dark:data-selected:bg-primary-foreground"
34
- />
35
- {children}
36
- </>,
37
- )}</SwitchPrimitive>;
24
+ return (
25
+ <SwitchPrimitive
26
+ data-slot="switch"
27
+ data-size={size}
28
+ className={cn(
29
+ 'peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none not-data-selected:bg-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-focus-visible:border-ring data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-invalid:border-destructive data-invalid:ring-3 data-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:not-data-selected:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:data-invalid:border-destructive/50 dark:data-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-selected:bg-primary data-disabled:cursor-not-allowed data-disabled:opacity-50',
30
+ className,
31
+ )}
32
+ {...props}
33
+ >
34
+ {composeRenderProps(children, (children, { isSelected }: SwitchRenderProps) => (
35
+ <>
36
+ <span
37
+ data-slot="switch-thumb"
38
+ data-selected={isSelected || undefined}
39
+ className="pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=default]/switch:not-data-selected:translate-x-0 group-data-[size=sm]/switch:size-3 group-data-[size=sm]/switch:not-data-selected:translate-x-0 dark:not-data-selected:bg-foreground group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground group-data-[size=default]/switch:data-selected:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-selected:translate-x-[calc(100%-2px)] dark:data-selected:bg-primary-foreground"
40
+ />
41
+ {children}
42
+ </>
43
+ ))}
44
+ </SwitchPrimitive>
45
+ );
38
46
  }
@@ -23,76 +23,92 @@ import { cn } from 'cn';
23
23
  import type { HostProps } from '../../../lib/types';
24
24
 
25
25
  export function Table({ className, ...props }: TableProps) {
26
- return <div data-slot="table-container" className="relative w-full overflow-x-auto">
27
- <TablePrimitive
28
- data-slot="table"
29
- className={cn('w-full caption-bottom text-sm', className)}
30
- {...props}
31
- />
32
- </div>;
26
+ return (
27
+ <div data-slot="table-container" className="relative w-full overflow-x-auto">
28
+ <TablePrimitive
29
+ data-slot="table"
30
+ className={cn('w-full caption-bottom text-sm', className)}
31
+ {...props}
32
+ />
33
+ </div>
34
+ );
33
35
  }
34
36
 
35
37
  export function TableHeader<T extends object>({ className, ...props }: TableHeaderProps<T>) {
36
- return <TableHeaderPrimitive
37
- data-slot="table-header"
38
- className={cn('[&_tr]:border-b', className)}
39
- {...props}
40
- />;
38
+ return (
39
+ <TableHeaderPrimitive
40
+ data-slot="table-header"
41
+ className={cn('[&_tr]:border-b', className)}
42
+ {...props}
43
+ />
44
+ );
41
45
  }
42
46
 
43
47
  export function TableBody<T extends object>({ className, ...props }: TableBodyProps<T>) {
44
- return <TableBodyPrimitive
45
- data-slot="table-body"
46
- className={cn('data-empty:h-24 data-empty:text-center [&_tr:last-child]:border-0', className)}
47
- {...props}
48
- />;
48
+ return (
49
+ <TableBodyPrimitive
50
+ data-slot="table-body"
51
+ className={cn('data-empty:h-24 data-empty:text-center [&_tr:last-child]:border-0', className)}
52
+ {...props}
53
+ />
54
+ );
49
55
  }
50
56
 
51
57
  export function TableFooter<T extends object>({ className, ...props }: TableFooterProps<T>) {
52
- return <TableFooterPrimitive
53
- data-slot="table-footer"
54
- className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}
55
- {...props}
56
- />;
58
+ return (
59
+ <TableFooterPrimitive
60
+ data-slot="table-footer"
61
+ className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}
62
+ {...props}
63
+ />
64
+ );
57
65
  }
58
66
 
59
67
  export function TableRow<T extends object>({ className, ...props }: RowProps<T>) {
60
- return <RowPrimitive
61
- data-slot="table-row"
62
- className={cn(
63
- 'border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted data-selected:bg-muted',
64
- className,
65
- )}
66
- {...props}
67
- />;
68
+ return (
69
+ <RowPrimitive
70
+ data-slot="table-row"
71
+ className={cn(
72
+ 'border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted data-selected:bg-muted',
73
+ className,
74
+ )}
75
+ {...props}
76
+ />
77
+ );
68
78
  }
69
79
 
70
80
  export function TableHead({ className, ...props }: ColumnProps) {
71
- return <ColumnPrimitive
72
- data-slot="table-head"
73
- className={cn(
74
- 'h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([data-slot=checkbox])]:pr-0 [&:has([role=checkbox])]:pr-0',
75
- className,
76
- )}
77
- {...props}
78
- />;
81
+ return (
82
+ <ColumnPrimitive
83
+ data-slot="table-head"
84
+ className={cn(
85
+ 'h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([data-slot=checkbox])]:pr-0 [&:has([role=checkbox])]:pr-0',
86
+ className,
87
+ )}
88
+ {...props}
89
+ />
90
+ );
79
91
  }
80
92
 
81
93
  export function TableCell({ className, ...props }: CellProps) {
82
- return <CellPrimitive
83
- data-slot="table-cell"
84
- className={cn(
85
- 'p-2 align-middle whitespace-nowrap [&:has([data-slot=checkbox])]:pr-0 [&:has([role=checkbox])]:pr-0',
86
- className,
87
- )}
88
- {...props}
89
- />;
94
+ return (
95
+ <CellPrimitive
96
+ data-slot="table-cell"
97
+ className={cn(
98
+ 'p-2 align-middle whitespace-nowrap [&:has([data-slot=checkbox])]:pr-0 [&:has([role=checkbox])]:pr-0',
99
+ className,
100
+ )}
101
+ {...props}
102
+ />
103
+ );
90
104
  }
91
105
 
92
106
  export function TableCaption({ className, ...props }: HostProps<'figcaption'>) {
93
- return <figcaption
94
- data-slot="table-caption"
95
- className={cn('mt-4 text-center text-sm text-muted-foreground', className)}
96
- {...props}
97
- />;
107
+ return (
108
+ <figcaption
109
+ data-slot="table-caption"
110
+ className={cn('mt-4 text-center text-sm text-muted-foreground', className)}
111
+ {...props}
112
+ />
113
+ );
98
114
  }
@@ -10,11 +10,13 @@ import type { TabPanelProps, TabProps, TabsProps } from '@octanejs/aria/componen
10
10
  import { cn } from 'cn';
11
11
 
12
12
  export function Tabs({ className, ...props }: TabsProps) {
13
- return <TabsPrimitive
14
- data-slot="tabs"
15
- className={cn('group/tabs flex gap-2 data-horizontal:flex-col', className)}
16
- {...props}
17
- />;
13
+ return (
14
+ <TabsPrimitive
15
+ data-slot="tabs"
16
+ className={cn('group/tabs flex gap-2 data-horizontal:flex-col', className)}
17
+ {...props}
18
+ />
19
+ );
18
20
  }
19
21
 
20
22
  export const tabsListVariants = cva(
@@ -32,36 +34,43 @@ export const tabsListVariants = cva(
32
34
  },
33
35
  );
34
36
 
35
- export function TabsList({ className, variant = 'default', ...props }: Record<
36
- string,
37
- any
38
- > & VariantProps<typeof tabsListVariants>) {
39
- return <TabListPrimitive
40
- data-slot="tabs-list"
41
- data-variant={variant}
42
- className={cn(tabsListVariants({ variant }), className)}
43
- {...props}
44
- />;
37
+ export function TabsList({
38
+ className,
39
+ variant = 'default',
40
+ ...props
41
+ }: Record<string, any> & VariantProps<typeof tabsListVariants>) {
42
+ return (
43
+ <TabListPrimitive
44
+ data-slot="tabs-list"
45
+ data-variant={variant}
46
+ className={cn(tabsListVariants({ variant }), className)}
47
+ {...props}
48
+ />
49
+ );
45
50
  }
46
51
 
47
52
  export function TabsTrigger({ className, ...props }: TabProps) {
48
- return <TabPrimitive
49
- data-slot="tabs-trigger"
50
- className={cn(
51
- 'relative inline-flex h-[calc(100%-1px)] flex-1 cursor-default items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-selected:shadow-sm group-data-[variant=line]/tabs-list:data-selected:shadow-none group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
52
- 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-selected:bg-transparent dark:group-data-[variant=line]/tabs-list:data-selected:border-transparent dark:group-data-[variant=line]/tabs-list:data-selected:bg-transparent',
53
- 'data-selected:bg-background data-selected:text-foreground dark:data-selected:border-input dark:data-selected:bg-input/30 dark:data-selected:text-foreground',
54
- 'after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-selected:after:opacity-100',
55
- className,
56
- )}
57
- {...props}
58
- />;
53
+ return (
54
+ <TabPrimitive
55
+ data-slot="tabs-trigger"
56
+ className={cn(
57
+ "relative inline-flex h-[calc(100%-1px)] flex-1 cursor-default items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-selected:shadow-sm group-data-[variant=line]/tabs-list:data-selected:shadow-none group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
58
+ 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-selected:bg-transparent dark:group-data-[variant=line]/tabs-list:data-selected:border-transparent dark:group-data-[variant=line]/tabs-list:data-selected:bg-transparent',
59
+ 'data-selected:bg-background data-selected:text-foreground dark:data-selected:border-input dark:data-selected:bg-input/30 dark:data-selected:text-foreground',
60
+ 'after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-selected:after:opacity-100',
61
+ className,
62
+ )}
63
+ {...props}
64
+ />
65
+ );
59
66
  }
60
67
 
61
68
  export function TabsContent({ className, ...props }: TabPanelProps) {
62
- return <TabPanelPrimitive
63
- data-slot="tabs-content"
64
- className={cn('flex-1 text-sm outline-none', className)}
65
- {...props}
66
- />;
69
+ return (
70
+ <TabPanelPrimitive
71
+ data-slot="tabs-content"
72
+ className={cn('flex-1 text-sm outline-none', className)}
73
+ {...props}
74
+ />
75
+ );
67
76
  }
@@ -14,9 +14,8 @@ export interface TextareaProps extends TextareaPrimitiveProps {}
14
14
  export function Textarea({ className, ...props }: TextareaProps) @{
15
15
  <TextareaPrimitive
16
16
  data-slot="textarea"
17
- className={composeRenderProps(
18
- className,
19
- (resolved: string | undefined) => cn(
17
+ className={composeRenderProps(className, (resolved: string | undefined) =>
18
+ cn(
20
19
  'flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 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',
21
20
  resolved,
22
21
  ),