@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.
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
@@ -6,24 +6,28 @@ import type { HostProps } from '../../../lib/types';
6
6
  import { Separator } from './separator.tsrx';
7
7
 
8
8
  export function ItemGroup({ className, ...props }: HostProps<'div'>) {
9
- return <div
10
- role="list"
11
- data-slot="item-group"
12
- className={cn(
13
- 'group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2',
14
- className,
15
- )}
16
- {...props}
17
- />;
9
+ return (
10
+ <div
11
+ role="list"
12
+ data-slot="item-group"
13
+ className={cn(
14
+ 'group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2',
15
+ className,
16
+ )}
17
+ {...props}
18
+ />
19
+ );
18
20
  }
19
21
 
20
22
  export function ItemSeparator({ className, ...props }: Record<string, any>) {
21
- return <Separator
22
- data-slot="item-separator"
23
- orientation="horizontal"
24
- className={cn('my-2', className)}
25
- {...props}
26
- />;
23
+ return (
24
+ <Separator
25
+ data-slot="item-separator"
26
+ orientation="horizontal"
27
+ className={cn('my-2', className)}
28
+ {...props}
29
+ />
30
+ );
27
31
  }
28
32
 
29
33
  const itemVariants = cva(
@@ -48,19 +52,22 @@ const itemVariants = cva(
48
52
  },
49
53
  );
50
54
 
51
- export function Item({ className, variant = 'default', size = 'default', ...props }: Omit<
52
- LinkProps,
53
- 'children'
54
- > & Record<string, unknown> & VariantProps<typeof itemVariants>) {
55
- const Element =
56
- 'href' in props ? LinkPrimitive : 'div';
57
- return <Element
58
- data-slot="item"
59
- data-variant={variant}
60
- data-size={size}
61
- className={cn(itemVariants({ variant, size, className }))}
62
- {...props}
63
- />;
55
+ export function Item({
56
+ className,
57
+ variant = 'default',
58
+ size = 'default',
59
+ ...props
60
+ }: Omit<LinkProps, 'children'> & Record<string, unknown> & VariantProps<typeof itemVariants>) {
61
+ const Element = 'href' in props ? LinkPrimitive : 'div';
62
+ return (
63
+ <Element
64
+ data-slot="item"
65
+ data-variant={variant}
66
+ data-size={size}
67
+ className={cn(itemVariants({ variant, size, className }))}
68
+ {...props}
69
+ />
70
+ );
64
71
  }
65
72
 
66
73
  const itemMediaVariants = cva(
@@ -69,8 +76,9 @@ const itemMediaVariants = cva(
69
76
  variants: {
70
77
  variant: {
71
78
  default: 'bg-transparent',
72
- icon: '[&_svg:not([class*=\'size-\'])]:size-4',
73
- image: 'size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover',
79
+ icon: "[&_svg:not([class*='size-'])]:size-4",
80
+ image:
81
+ 'size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover',
74
82
  },
75
83
  },
76
84
  defaultVariants: {
@@ -79,70 +87,82 @@ const itemMediaVariants = cva(
79
87
  },
80
88
  );
81
89
 
82
- export function ItemMedia({ className, variant = 'default', ...props }: HostProps<
83
- 'div'
84
- > & VariantProps<typeof itemMediaVariants>) {
85
- return <div
86
- data-slot="item-media"
87
- data-variant={variant}
88
- className={cn(itemMediaVariants({ variant, className }))}
89
- {...props}
90
- />;
90
+ export function ItemMedia({
91
+ className,
92
+ variant = 'default',
93
+ ...props
94
+ }: HostProps<'div'> & VariantProps<typeof itemMediaVariants>) {
95
+ return (
96
+ <div
97
+ data-slot="item-media"
98
+ data-variant={variant}
99
+ className={cn(itemMediaVariants({ variant, className }))}
100
+ {...props}
101
+ />
102
+ );
91
103
  }
92
104
 
93
105
  export function ItemContent({ className, ...props }: HostProps<'div'>) {
94
- return <div
95
- data-slot="item-content"
96
- className={cn(
97
- 'flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none',
98
- className,
99
- )}
100
- {...props}
101
- />;
106
+ return (
107
+ <div
108
+ data-slot="item-content"
109
+ className={cn(
110
+ 'flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none',
111
+ className,
112
+ )}
113
+ {...props}
114
+ />
115
+ );
102
116
  }
103
117
 
104
118
  export function ItemTitle({ className, ...props }: HostProps<'div'>) {
105
- return <div
106
- data-slot="item-title"
107
- className={cn(
108
- 'line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4',
109
- className,
110
- )}
111
- {...props}
112
- />;
119
+ return (
120
+ <div
121
+ data-slot="item-title"
122
+ className={cn(
123
+ 'line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4',
124
+ className,
125
+ )}
126
+ {...props}
127
+ />
128
+ );
113
129
  }
114
130
 
115
131
  export function ItemDescription({ className, ...props }: HostProps<'p'>) {
116
- return <p
117
- data-slot="item-description"
118
- className={cn(
119
- 'line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
120
- className,
121
- )}
122
- {...props}
123
- />;
132
+ return (
133
+ <p
134
+ data-slot="item-description"
135
+ className={cn(
136
+ 'line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
137
+ className,
138
+ )}
139
+ {...props}
140
+ />
141
+ );
124
142
  }
125
143
 
126
144
  export function ItemActions({ className, ...props }: HostProps<'div'>) {
127
- return <div
128
- data-slot="item-actions"
129
- className={cn('flex items-center gap-2', className)}
130
- {...props}
131
- />;
145
+ return (
146
+ <div data-slot="item-actions" className={cn('flex items-center gap-2', className)} {...props} />
147
+ );
132
148
  }
133
149
 
134
150
  export function ItemHeader({ className, ...props }: HostProps<'div'>) {
135
- return <div
136
- data-slot="item-header"
137
- className={cn('flex basis-full items-center justify-between gap-2', className)}
138
- {...props}
139
- />;
151
+ return (
152
+ <div
153
+ data-slot="item-header"
154
+ className={cn('flex basis-full items-center justify-between gap-2', className)}
155
+ {...props}
156
+ />
157
+ );
140
158
  }
141
159
 
142
160
  export function ItemFooter({ className, ...props }: HostProps<'div'>) {
143
- return <div
144
- data-slot="item-footer"
145
- className={cn('flex basis-full items-center justify-between gap-2', className)}
146
- {...props}
147
- />;
161
+ return (
162
+ <div
163
+ data-slot="item-footer"
164
+ className={cn('flex basis-full items-center justify-between gap-2', className)}
165
+ {...props}
166
+ />
167
+ );
148
168
  }
@@ -14,7 +14,7 @@ export function Kbd({ className, ...props }: KbdProps) @{
14
14
  <KbdPrimitive
15
15
  data-slot="kbd"
16
16
  className={cn(
17
- 'pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*=\'size-\'])]:size-3',
17
+ "pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3",
18
18
  className,
19
19
  )}
20
20
  {...props}
@@ -3,16 +3,18 @@ import { LabelContext, Label as LabelPrimitive, type LabelProps } from '@octanej
3
3
  import { cn } from 'cn';
4
4
 
5
5
  export function Label({ className, htmlFor, slot, ...props }: LabelProps) {
6
- const label = <LabelPrimitive
7
- data-slot="label"
8
- className={cn(
9
- 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50 peer-data-disabled:opacity-50',
10
- className,
11
- )}
12
- {...props}
13
- htmlFor={htmlFor}
14
- slot={slot}
15
- />;
6
+ const label = (
7
+ <LabelPrimitive
8
+ data-slot="label"
9
+ className={cn(
10
+ 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50 peer-data-disabled:opacity-50',
11
+ className,
12
+ )}
13
+ {...props}
14
+ htmlFor={htmlFor}
15
+ slot={slot}
16
+ />
17
+ );
16
18
 
17
19
  if (htmlFor && slot === undefined) {
18
20
  return <LabelContext value={null}>{label}</LabelContext>;
@@ -2,43 +2,51 @@ import { cn } from 'cn';
2
2
  import type { HostProps } from '../../../lib/types';
3
3
  import { ChevronDownIcon } from '@octanejs/lucide';
4
4
 
5
- type NativeSelectProps =
6
- Omit<HostProps<'select'>, 'size'> & {
7
- size?: 'sm' | 'default';
8
- };
5
+ type NativeSelectProps = Omit<HostProps<'select'>, 'size'> & {
6
+ size?: 'sm' | 'default';
7
+ };
9
8
 
10
9
  export function NativeSelect({ className, size = 'default', ...props }: NativeSelectProps) {
11
- return <div
12
- className={cn('group/native-select relative w-fit has-[select:disabled]:opacity-50', className)}
13
- data-slot="native-select-wrapper"
14
- data-size={size}
15
- >
16
- <select
17
- data-slot="native-select"
10
+ return (
11
+ <div
12
+ className={cn(
13
+ 'group/native-select relative w-fit has-[select:disabled]:opacity-50',
14
+ className,
15
+ )}
16
+ data-slot="native-select-wrapper"
18
17
  data-size={size}
19
- className="h-8 w-full min-w-0 appearance-none rounded-lg border border-input bg-transparent py-1 pr-8 pl-2.5 text-sm transition-colors outline-none select-none selection:bg-primary selection:text-primary-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 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-[size=sm]:py-0.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40"
20
- {...props}
21
- />
22
- <ChevronDownIcon
23
- className="pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none"
24
- aria-hidden="true"
25
- data-slot="native-select-icon"
26
- />
27
- </div>;
18
+ >
19
+ <select
20
+ data-slot="native-select"
21
+ data-size={size}
22
+ className="h-8 w-full min-w-0 appearance-none rounded-lg border border-input bg-transparent py-1 pr-8 pl-2.5 text-sm transition-colors outline-none select-none selection:bg-primary selection:text-primary-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 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-[size=sm]:py-0.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40"
23
+ {...props}
24
+ />
25
+ <ChevronDownIcon
26
+ className="pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none"
27
+ aria-hidden="true"
28
+ data-slot="native-select-icon"
29
+ />
30
+ </div>
31
+ );
28
32
  }
29
33
 
30
34
  export function NativeSelectOption({ className, ...props }: HostProps<'option'>) {
31
- return <option
32
- data-slot="native-select-option"
33
- className={cn('bg-[Canvas] text-[CanvasText]', className)}
34
- {...props}
35
- />;
35
+ return (
36
+ <option
37
+ data-slot="native-select-option"
38
+ className={cn('bg-[Canvas] text-[CanvasText]', className)}
39
+ {...props}
40
+ />
41
+ );
36
42
  }
37
43
 
38
44
  export function NativeSelectOptGroup({ className, ...props }: HostProps<'optgroup'>) {
39
- return <optgroup
40
- data-slot="native-select-optgroup"
41
- className={cn('bg-[Canvas] text-[CanvasText]', className)}
42
- {...props}
43
- />;
45
+ return (
46
+ <optgroup
47
+ data-slot="native-select-optgroup"
48
+ className={cn('bg-[Canvas] text-[CanvasText]', className)}
49
+ {...props}
50
+ />
51
+ );
44
52
  }
@@ -4,31 +4,34 @@ import { LinkButton } from './button.tsrx';
4
4
  import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from '@octanejs/lucide';
5
5
 
6
6
  export function Pagination({ className, ...props }: HostProps<'nav'>) {
7
- return <nav
8
- role="navigation"
9
- aria-label="pagination"
10
- data-slot="pagination"
11
- className={cn('mx-auto flex w-full justify-center', className)}
12
- {...props}
13
- />;
7
+ return (
8
+ <nav
9
+ role="navigation"
10
+ aria-label="pagination"
11
+ data-slot="pagination"
12
+ className={cn('mx-auto flex w-full justify-center', className)}
13
+ {...props}
14
+ />
15
+ );
14
16
  }
15
17
 
16
18
  export function PaginationContent({ className, ...props }: HostProps<'ul'>) {
17
- return <ul
18
- data-slot="pagination-content"
19
- className={cn('flex items-center gap-0.5', className)}
20
- {...props}
21
- />;
19
+ return (
20
+ <ul
21
+ data-slot="pagination-content"
22
+ className={cn('flex items-center gap-0.5', className)}
23
+ {...props}
24
+ />
25
+ );
22
26
  }
23
27
 
24
28
  export function PaginationItem({ ...props }: HostProps<'li'>) {
25
29
  return <li data-slot="pagination-item" {...props} />;
26
30
  }
27
31
 
28
- type PaginationLinkProps =
29
- {
30
- isActive?: boolean;
31
- } & Omit<Record<string, any>, 'variant'>;
32
+ type PaginationLinkProps = {
33
+ isActive?: boolean;
34
+ } & Omit<Record<string, any>, 'variant'>;
32
35
 
33
36
  export function PaginationLink({
34
37
  className,
@@ -36,57 +39,70 @@ export function PaginationLink({
36
39
  size = 'icon',
37
40
  ...props
38
41
  }: PaginationLinkProps) {
39
- return <LinkButton
40
- variant={isActive ? 'outline' : 'ghost'}
41
- size={size}
42
- className={cn(className)}
43
- aria-current={isActive ? 'page' : undefined}
44
- data-slot="pagination-link"
45
- data-active={isActive}
46
- {...props}
47
- />;
42
+ return (
43
+ <LinkButton
44
+ variant={isActive ? 'outline' : 'ghost'}
45
+ size={size}
46
+ className={cn(className)}
47
+ aria-current={isActive ? 'page' : undefined}
48
+ data-slot="pagination-link"
49
+ data-active={isActive}
50
+ {...props}
51
+ />
52
+ );
48
53
  }
49
54
 
50
- export function PaginationPrevious({ className, text = 'Previous', ...props }: Record<
51
- string,
52
- any
53
- > & { text?: string }) {
54
- return <PaginationLink
55
- aria-label="Go to previous page"
56
- size="default"
57
- className={cn('pl-1.5!', className)}
58
- {...props}
59
- >
60
- <ChevronLeftIcon data-icon="inline-start" />
61
- <span className="hidden sm:block">{text}</span>
62
- </PaginationLink>;
55
+ export function PaginationPrevious({
56
+ className,
57
+ text = 'Previous',
58
+ ...props
59
+ }: Record<string, any> & { text?: string }) {
60
+ return (
61
+ <PaginationLink
62
+ aria-label="Go to previous page"
63
+ size="default"
64
+ className={cn('pl-1.5!', className)}
65
+ {...props}
66
+ >
67
+ <ChevronLeftIcon data-icon="inline-start" />
68
+ <span className="hidden sm:block">{text}</span>
69
+ </PaginationLink>
70
+ );
63
71
  }
64
72
 
65
- export function PaginationNext({ className, text = 'Next', ...props }: Record<string, any> & {
73
+ export function PaginationNext({
74
+ className,
75
+ text = 'Next',
76
+ ...props
77
+ }: Record<string, any> & {
66
78
  text?: string;
67
79
  }) {
68
- return <PaginationLink
69
- aria-label="Go to next page"
70
- size="default"
71
- className={cn('pr-1.5!', className)}
72
- {...props}
73
- >
74
- <span className="hidden sm:block">{text}</span>
75
- <ChevronRightIcon data-icon="inline-end" />
76
- </PaginationLink>;
80
+ return (
81
+ <PaginationLink
82
+ aria-label="Go to next page"
83
+ size="default"
84
+ className={cn('pr-1.5!', className)}
85
+ {...props}
86
+ >
87
+ <span className="hidden sm:block">{text}</span>
88
+ <ChevronRightIcon data-icon="inline-end" />
89
+ </PaginationLink>
90
+ );
77
91
  }
78
92
 
79
93
  export function PaginationEllipsis({ className, ...props }: HostProps<'span'>) {
80
- return <span
81
- aria-hidden
82
- data-slot="pagination-ellipsis"
83
- className={cn(
84
- 'flex size-8 items-center justify-center [&_svg:not([class*=\'size-\'])]:size-4',
85
- className,
86
- )}
87
- {...props}
88
- >
89
- <MoreHorizontalIcon />
90
- <span className="sr-only">More pages</span>
91
- </span>;
94
+ return (
95
+ <span
96
+ aria-hidden
97
+ data-slot="pagination-ellipsis"
98
+ className={cn(
99
+ "flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4",
100
+ className,
101
+ )}
102
+ {...props}
103
+ >
104
+ <MoreHorizontalIcon />
105
+ <span className="sr-only">More pages</span>
106
+ </span>
107
+ );
92
108
  }
@@ -11,7 +11,11 @@ import { cn } from 'cn';
11
11
  import type { HostProps } from '../../../lib/types';
12
12
 
13
13
  export function PopoverTrigger({ children, ...props }: DialogTriggerProps) {
14
- return <DialogTrigger data-slot="popover-trigger" {...props}>{children}</DialogTrigger>;
14
+ return (
15
+ <DialogTrigger data-slot="popover-trigger" {...props}>
16
+ {children}
17
+ </DialogTrigger>
18
+ );
15
19
  }
16
20
 
17
21
  export function Popover({
@@ -23,25 +27,29 @@ export function Popover({
23
27
  }: Omit<PopoverPrimitiveProps, 'className'> & {
24
28
  className?: string;
25
29
  }) {
26
- return <PopoverPrimitive
27
- data-slot="popover-content"
28
- placement={placement}
29
- offset={offset}
30
- crossOffset={crossOffset}
31
- className={cn(
32
- 'z-50 flex w-72 origin-(--trigger-anchor-point) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2',
33
- className,
34
- )}
35
- {...props}
36
- />;
30
+ return (
31
+ <PopoverPrimitive
32
+ data-slot="popover-content"
33
+ placement={placement}
34
+ offset={offset}
35
+ crossOffset={crossOffset}
36
+ className={cn(
37
+ 'z-50 flex w-72 origin-(--trigger-anchor-point) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 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-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2',
38
+ className,
39
+ )}
40
+ {...props}
41
+ />
42
+ );
37
43
  }
38
44
 
39
45
  export function PopoverHeader({ className, ...props }: HostProps<'div'>) {
40
- return <div
41
- data-slot="popover-header"
42
- className={cn('flex flex-col gap-0.5 text-sm', className)}
43
- {...props}
44
- />;
46
+ return (
47
+ <div
48
+ data-slot="popover-header"
49
+ className={cn('flex flex-col gap-0.5 text-sm', className)}
50
+ {...props}
51
+ />
52
+ );
45
53
  }
46
54
 
47
55
  export function PopoverTitle({ className, ...props }: HeadingProps) {
@@ -49,9 +57,11 @@ export function PopoverTitle({ className, ...props }: HeadingProps) {
49
57
  }
50
58
 
51
59
  export function PopoverDescription({ className, ...props }: HostProps<'div'>) {
52
- return <div
53
- data-slot="popover-description"
54
- className={cn('text-muted-foreground', className)}
55
- {...props}
56
- />;
60
+ return (
61
+ <div
62
+ data-slot="popover-description"
63
+ className={cn('text-muted-foreground', className)}
64
+ {...props}
65
+ />
66
+ );
57
67
  }
@@ -16,31 +16,38 @@ import {
16
16
  import { cn } from 'cn';
17
17
 
18
18
  export function RadioGroup({ className, ...props }: RadioGroupProps) {
19
- return <RadioGroupPrimitive
20
- data-slot="radio-group"
21
- className={cn('grid w-full gap-2', className)}
22
- {...props}
23
- />;
19
+ return (
20
+ <RadioGroupPrimitive
21
+ data-slot="radio-group"
22
+ className={cn('grid w-full gap-2', className)}
23
+ {...props}
24
+ />
25
+ );
24
26
  }
25
27
 
26
28
  export function RadioGroupItem({ className, children, ...props }: RadioProps) {
27
- return <RadioPrimitive
28
- data-slot="radio-group-item"
29
- className={cn(
30
- 'group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none 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 aria-invalid:aria-checked:border-primary 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-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 dark:bg-input/30 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:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary data-selected:border-primary data-selected:bg-primary data-selected:text-primary-foreground data-invalid:data-selected:border-primary dark:data-selected:bg-primary',
31
- className,
32
- )}
33
- {...props}
34
- >{composeRenderProps(
35
- children,
36
- (children, { isSelected }: RadioRenderProps) => <>
37
- <span data-slot="radio-group-indicator" className="flex size-4 items-center justify-center">
38
- {isSelected &&
29
+ return (
30
+ <RadioPrimitive
31
+ data-slot="radio-group-item"
32
+ className={cn(
33
+ 'group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none 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 aria-invalid:aria-checked:border-primary 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-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 dark:bg-input/30 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:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary data-selected:border-primary data-selected:bg-primary data-selected:text-primary-foreground data-invalid:data-selected:border-primary dark:data-selected:bg-primary',
34
+ className,
35
+ )}
36
+ {...props}
37
+ >
38
+ {composeRenderProps(children, (children, { isSelected }: RadioRenderProps) => (
39
+ <>
39
40
  <span
40
- className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground"
41
- />}
42
- </span>
43
- {children}
44
- </>,
45
- )}</RadioPrimitive>;
41
+ data-slot="radio-group-indicator"
42
+ className="flex size-4 items-center justify-center"
43
+ >
44
+ {isSelected && (
45
+ <span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" />
46
+ )}
47
+ </span>
48
+ {children}
49
+ </>
50
+ ))}
51
+ </RadioPrimitive>
52
+ );
46
53
  }