@octanejs/shadcn 0.0.52 → 0.0.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -9
- package/src/bases/base-ui/ui/accordion.tsrx +3 -1
- package/src/bases/base-ui/ui/alert-dialog.tsrx +6 -5
- package/src/bases/base-ui/ui/alert.tsrx +3 -2
- package/src/bases/base-ui/ui/aspect-ratio.tsrx +5 -3
- package/src/bases/base-ui/ui/badge.tsrx +2 -1
- package/src/bases/base-ui/ui/breadcrumb.tsrx +4 -4
- package/src/bases/base-ui/ui/button.tsrx +17 -10
- package/src/bases/base-ui/ui/context-menu.tsrx +37 -29
- package/src/bases/base-ui/ui/dialog.tsrx +6 -4
- package/src/bases/base-ui/ui/dropdown-menu.tsrx +37 -29
- package/src/bases/base-ui/ui/empty.tsrx +1 -1
- package/src/bases/base-ui/ui/field.tsrx +17 -11
- package/src/bases/base-ui/ui/hover-card.tsrx +15 -16
- package/src/bases/base-ui/ui/item.tsrx +3 -2
- package/src/bases/base-ui/ui/kbd.tsrx +1 -1
- package/src/bases/base-ui/ui/menubar.tsrx +38 -34
- package/src/bases/base-ui/ui/native-select.tsrx +3 -4
- package/src/bases/base-ui/ui/navigation-menu.tsrx +113 -87
- package/src/bases/base-ui/ui/pagination.tsrx +6 -2
- package/src/bases/base-ui/ui/popover.tsrx +15 -16
- package/src/bases/base-ui/ui/radio-group.tsrx +1 -3
- package/src/bases/base-ui/ui/scroll-area.tsrx +33 -27
- package/src/bases/base-ui/ui/select.tsrx +138 -106
- package/src/bases/base-ui/ui/sheet.tsrx +6 -4
- package/src/bases/base-ui/ui/sidebar.tsrx +65 -44
- package/src/bases/base-ui/ui/slider.tsrx +1 -3
- package/src/bases/base-ui/ui/tabs.tsrx +1 -1
- package/src/bases/base-ui/ui/toggle-group.tsrx +3 -3
- package/src/bases/base-ui/ui/toggle.tsrx +3 -2
- package/src/bases/base-ui/ui/tooltip.tsrx +17 -17
- package/src/bases/radix/ui/accordion.tsrx +3 -1
- package/src/bases/radix/ui/alert-dialog.tsrx +1 -1
- package/src/bases/radix/ui/alert.tsrx +15 -14
- package/src/bases/radix/ui/badge.tsrx +2 -1
- package/src/bases/radix/ui/button.tsrx +17 -10
- package/src/bases/radix/ui/context-menu.tsrx +20 -10
- package/src/bases/radix/ui/dropdown-menu.tsrx +16 -9
- package/src/bases/radix/ui/empty.tsrx +1 -1
- package/src/bases/radix/ui/field.tsrx +17 -11
- package/src/bases/radix/ui/item.tsrx +3 -2
- package/src/bases/radix/ui/menubar.tsrx +17 -14
- package/src/bases/radix/ui/native-select.tsrx +8 -8
- package/src/bases/radix/ui/navigation-menu.tsrx +2 -3
- package/src/bases/radix/ui/pagination.tsrx +6 -2
- package/src/bases/radix/ui/radio-group.tsrx +1 -3
- package/src/bases/radix/ui/scroll-area.tsrx +8 -2
- package/src/bases/radix/ui/select.tsrx +10 -5
- package/src/bases/radix/ui/sidebar.tsrx +61 -42
- package/src/bases/radix/ui/slider.tsrx +9 -7
- package/src/bases/radix/ui/tabs.tsrx +11 -5
- package/src/bases/radix/ui/toggle.tsrx +3 -2
- package/src/bases/radix/ui/tooltip.tsrx +2 -1
- package/src/bases/react-aria/ui/accordion.tsrx +58 -47
- package/src/bases/react-aria/ui/alert-dialog.tsrx +118 -92
- package/src/bases/react-aria/ui/alert.tsrx +39 -32
- package/src/bases/react-aria/ui/aspect-ratio.tsrx +12 -8
- package/src/bases/react-aria/ui/avatar.tsrx +73 -57
- package/src/bases/react-aria/ui/badge.tsrx +19 -12
- package/src/bases/react-aria/ui/breadcrumb.tsrx +66 -57
- package/src/bases/react-aria/ui/button.tsrx +17 -10
- package/src/bases/react-aria/ui/card.tsrx +63 -49
- package/src/bases/react-aria/ui/checkbox.tsrx +25 -19
- package/src/bases/react-aria/ui/dialog.tsrx +103 -83
- package/src/bases/react-aria/ui/empty.tsrx +58 -44
- package/src/bases/react-aria/ui/field.tsrx +142 -100
- package/src/bases/react-aria/ui/input.tsrx +2 -3
- package/src/bases/react-aria/ui/item.tsrx +98 -78
- package/src/bases/react-aria/ui/kbd.tsrx +1 -1
- package/src/bases/react-aria/ui/label.tsrx +12 -10
- package/src/bases/react-aria/ui/native-select.tsrx +38 -30
- package/src/bases/react-aria/ui/pagination.tsrx +76 -60
- package/src/bases/react-aria/ui/popover.tsrx +32 -22
- package/src/bases/react-aria/ui/radio-group.tsrx +30 -23
- package/src/bases/react-aria/ui/scroll-area.tsrx +12 -8
- package/src/bases/react-aria/ui/sheet.tsrx +92 -73
- package/src/bases/react-aria/ui/skeleton.tsrx +7 -5
- package/src/bases/react-aria/ui/slider.tsrx +44 -38
- package/src/bases/react-aria/ui/switch.tsrx +28 -20
- package/src/bases/react-aria/ui/table.tsrx +67 -51
- package/src/bases/react-aria/ui/tabs.tsrx +40 -31
- package/src/bases/react-aria/ui/textarea.tsrx +2 -3
- package/src/bases/react-aria/ui/toggle.tsrx +11 -8
|
@@ -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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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({
|
|
52
|
-
|
|
53
|
-
'
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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:
|
|
73
|
-
image:
|
|
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({
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
128
|
-
data-slot="item-actions"
|
|
129
|
-
|
|
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
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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 =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
7
|
-
|
|
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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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({
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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({
|
|
73
|
+
export function PaginationNext({
|
|
74
|
+
className,
|
|
75
|
+
text = 'Next',
|
|
76
|
+
...props
|
|
77
|
+
}: Record<string, any> & {
|
|
66
78
|
text?: string;
|
|
67
79
|
}) {
|
|
68
|
-
return
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
}
|