@redbamboo/ui 0.1.0
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/LICENSE +21 -0
- package/README.md +78 -0
- package/dist/components/app-header.d.ts +14 -0
- package/dist/components/app-header.d.ts.map +1 -0
- package/dist/components/badge.d.ts +8 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/button.d.ts +9 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/card.d.ts +12 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/collapsible.d.ts +6 -0
- package/dist/components/collapsible.d.ts.map +1 -0
- package/dist/components/dialog.d.ts +18 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dropdown-menu.d.ts +25 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/input.d.ts +4 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/json-highlight.d.ts +4 -0
- package/dist/components/json-highlight.d.ts.map +1 -0
- package/dist/components/label.d.ts +4 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/modal.d.ts +33 -0
- package/dist/components/modal.d.ts.map +1 -0
- package/dist/components/popover.d.ts +10 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/scroll-area.d.ts +5 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/select.d.ts +13 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/separator.d.ts +4 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/slider.d.ts +4 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/switch.d.ts +6 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/table.d.ts +11 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/tabs.d.ts +11 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tooltip.d.ts +7 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/index.css +2 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2648 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +49 -0
- package/src/components/app-header.css +40 -0
- package/src/components/app-header.tsx +57 -0
- package/src/components/badge.tsx +52 -0
- package/src/components/button.tsx +58 -0
- package/src/components/card.tsx +103 -0
- package/src/components/collapsible.tsx +21 -0
- package/src/components/dialog.tsx +155 -0
- package/src/components/dropdown-menu.tsx +240 -0
- package/src/components/input.tsx +20 -0
- package/src/components/json-highlight.tsx +84 -0
- package/src/components/label.tsx +21 -0
- package/src/components/modal.tsx +114 -0
- package/src/components/popover.tsx +90 -0
- package/src/components/scroll-area.tsx +52 -0
- package/src/components/select.tsx +145 -0
- package/src/components/separator.tsx +23 -0
- package/src/components/slider.tsx +41 -0
- package/src/components/switch.tsx +30 -0
- package/src/components/table.tsx +114 -0
- package/src/components/tabs.tsx +80 -0
- package/src/components/tooltip.tsx +64 -0
- package/src/index.ts +141 -0
- package/src/tokens.css +397 -0
- package/src/utils.ts +6 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Select as SelectPrimitive } from "@base-ui/react/select"
|
|
2
|
+
import { cn } from "../utils"
|
|
3
|
+
|
|
4
|
+
function Select({
|
|
5
|
+
...props
|
|
6
|
+
}: React.ComponentProps<typeof SelectPrimitive.Root>) {
|
|
7
|
+
return <SelectPrimitive.Root data-slot="select" {...props} />
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function SelectValue({
|
|
11
|
+
...props
|
|
12
|
+
}: SelectPrimitive.Value.Props) {
|
|
13
|
+
return <SelectPrimitive.Value data-slot="select-value" {...props} />
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function SelectTrigger({
|
|
17
|
+
className,
|
|
18
|
+
size = "default",
|
|
19
|
+
children,
|
|
20
|
+
...props
|
|
21
|
+
}: SelectPrimitive.Trigger.Props & {
|
|
22
|
+
size?: "sm" | "default"
|
|
23
|
+
}) {
|
|
24
|
+
return (
|
|
25
|
+
<SelectPrimitive.Trigger
|
|
26
|
+
data-slot="select-trigger"
|
|
27
|
+
data-size={size}
|
|
28
|
+
className={cn(
|
|
29
|
+
"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
30
|
+
className
|
|
31
|
+
)}
|
|
32
|
+
{...props}
|
|
33
|
+
>
|
|
34
|
+
{children}
|
|
35
|
+
<SelectPrimitive.Icon data-slot="select-icon">
|
|
36
|
+
<i className="fa-solid fa-chevron-down pointer-events-none size-4 text-muted-foreground" />
|
|
37
|
+
</SelectPrimitive.Icon>
|
|
38
|
+
</SelectPrimitive.Trigger>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function SelectContent({
|
|
43
|
+
className,
|
|
44
|
+
children,
|
|
45
|
+
side = "bottom",
|
|
46
|
+
align = "start",
|
|
47
|
+
...props
|
|
48
|
+
}: SelectPrimitive.Popup.Props &
|
|
49
|
+
Pick<SelectPrimitive.Positioner.Props, "align" | "side">) {
|
|
50
|
+
return (
|
|
51
|
+
<SelectPrimitive.Portal>
|
|
52
|
+
<SelectPrimitive.Positioner
|
|
53
|
+
align={align}
|
|
54
|
+
side={side}
|
|
55
|
+
sideOffset={4}
|
|
56
|
+
className="z-50"
|
|
57
|
+
>
|
|
58
|
+
<SelectPrimitive.Popup
|
|
59
|
+
data-slot="select-content"
|
|
60
|
+
className={cn(
|
|
61
|
+
"min-w-36 origin-(--transform-origin) overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
62
|
+
className
|
|
63
|
+
)}
|
|
64
|
+
{...props}
|
|
65
|
+
>
|
|
66
|
+
{children}
|
|
67
|
+
</SelectPrimitive.Popup>
|
|
68
|
+
</SelectPrimitive.Positioner>
|
|
69
|
+
</SelectPrimitive.Portal>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function SelectItem({
|
|
74
|
+
className,
|
|
75
|
+
children,
|
|
76
|
+
...props
|
|
77
|
+
}: SelectPrimitive.Item.Props) {
|
|
78
|
+
return (
|
|
79
|
+
<SelectPrimitive.Item
|
|
80
|
+
data-slot="select-item"
|
|
81
|
+
className={cn(
|
|
82
|
+
"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
83
|
+
className
|
|
84
|
+
)}
|
|
85
|
+
{...props}
|
|
86
|
+
>
|
|
87
|
+
<span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center">
|
|
88
|
+
<SelectPrimitive.ItemIndicator>
|
|
89
|
+
<i className="fa-solid fa-check pointer-events-none" />
|
|
90
|
+
</SelectPrimitive.ItemIndicator>
|
|
91
|
+
</span>
|
|
92
|
+
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
|
|
93
|
+
</SelectPrimitive.Item>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function SelectSeparator({
|
|
98
|
+
className,
|
|
99
|
+
...props
|
|
100
|
+
}: React.ComponentProps<"div">) {
|
|
101
|
+
return (
|
|
102
|
+
<div
|
|
103
|
+
data-slot="select-separator"
|
|
104
|
+
className={cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)}
|
|
105
|
+
{...props}
|
|
106
|
+
/>
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function SelectLabel({
|
|
111
|
+
className,
|
|
112
|
+
...props
|
|
113
|
+
}: React.ComponentProps<"div">) {
|
|
114
|
+
return (
|
|
115
|
+
<div
|
|
116
|
+
data-slot="select-label"
|
|
117
|
+
className={cn("px-1.5 py-1 text-xs text-muted-foreground", className)}
|
|
118
|
+
{...props}
|
|
119
|
+
/>
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function SelectGroup({
|
|
124
|
+
className,
|
|
125
|
+
...props
|
|
126
|
+
}: SelectPrimitive.Group.Props) {
|
|
127
|
+
return (
|
|
128
|
+
<SelectPrimitive.Group
|
|
129
|
+
data-slot="select-group"
|
|
130
|
+
className={cn("scroll-my-1 p-1", className)}
|
|
131
|
+
{...props}
|
|
132
|
+
/>
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export {
|
|
137
|
+
Select,
|
|
138
|
+
SelectContent,
|
|
139
|
+
SelectGroup,
|
|
140
|
+
SelectItem,
|
|
141
|
+
SelectLabel,
|
|
142
|
+
SelectSeparator,
|
|
143
|
+
SelectTrigger,
|
|
144
|
+
SelectValue,
|
|
145
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Separator as SeparatorPrimitive } from "@base-ui/react/separator"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../utils"
|
|
4
|
+
|
|
5
|
+
function Separator({
|
|
6
|
+
className,
|
|
7
|
+
orientation = "horizontal",
|
|
8
|
+
...props
|
|
9
|
+
}: SeparatorPrimitive.Props) {
|
|
10
|
+
return (
|
|
11
|
+
<SeparatorPrimitive
|
|
12
|
+
data-slot="separator"
|
|
13
|
+
orientation={orientation}
|
|
14
|
+
className={cn(
|
|
15
|
+
"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
|
|
16
|
+
className
|
|
17
|
+
)}
|
|
18
|
+
{...props}
|
|
19
|
+
/>
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { Separator }
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Slider as SliderPrimitive } from "@base-ui/react/slider"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../utils"
|
|
4
|
+
|
|
5
|
+
function Slider({
|
|
6
|
+
className,
|
|
7
|
+
defaultValue,
|
|
8
|
+
value,
|
|
9
|
+
...props
|
|
10
|
+
}: SliderPrimitive.Root.Props) {
|
|
11
|
+
return (
|
|
12
|
+
<SliderPrimitive.Root
|
|
13
|
+
data-slot="slider"
|
|
14
|
+
defaultValue={defaultValue}
|
|
15
|
+
value={value}
|
|
16
|
+
className={cn(
|
|
17
|
+
"relative flex w-full touch-none items-center select-none data-disabled:opacity-50",
|
|
18
|
+
className
|
|
19
|
+
)}
|
|
20
|
+
{...props}
|
|
21
|
+
>
|
|
22
|
+
<SliderPrimitive.Control data-slot="slider-control" className="flex w-full items-center">
|
|
23
|
+
<SliderPrimitive.Track
|
|
24
|
+
data-slot="slider-track"
|
|
25
|
+
className="relative h-1 w-full grow overflow-hidden rounded-full bg-muted"
|
|
26
|
+
>
|
|
27
|
+
<SliderPrimitive.Indicator
|
|
28
|
+
data-slot="slider-indicator"
|
|
29
|
+
className="absolute h-full bg-primary"
|
|
30
|
+
/>
|
|
31
|
+
<SliderPrimitive.Thumb
|
|
32
|
+
data-slot="slider-thumb"
|
|
33
|
+
className="relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none 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"
|
|
34
|
+
/>
|
|
35
|
+
</SliderPrimitive.Track>
|
|
36
|
+
</SliderPrimitive.Control>
|
|
37
|
+
</SliderPrimitive.Root>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { Slider }
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Switch as SwitchPrimitive } from "@base-ui/react/switch"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../utils"
|
|
4
|
+
|
|
5
|
+
function Switch({
|
|
6
|
+
className,
|
|
7
|
+
size = "default",
|
|
8
|
+
...props
|
|
9
|
+
}: SwitchPrimitive.Root.Props & {
|
|
10
|
+
size?: "sm" | "default"
|
|
11
|
+
}) {
|
|
12
|
+
return (
|
|
13
|
+
<SwitchPrimitive.Root
|
|
14
|
+
data-slot="switch"
|
|
15
|
+
data-size={size}
|
|
16
|
+
className={cn(
|
|
17
|
+
"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all 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 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
|
|
18
|
+
className
|
|
19
|
+
)}
|
|
20
|
+
{...props}
|
|
21
|
+
>
|
|
22
|
+
<SwitchPrimitive.Thumb
|
|
23
|
+
data-slot="switch-thumb"
|
|
24
|
+
className="pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 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"
|
|
25
|
+
/>
|
|
26
|
+
</SwitchPrimitive.Root>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { Switch }
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../utils"
|
|
4
|
+
|
|
5
|
+
function Table({ className, ...props }: React.ComponentProps<"table">) {
|
|
6
|
+
return (
|
|
7
|
+
<div
|
|
8
|
+
data-slot="table-container"
|
|
9
|
+
className="relative w-full overflow-x-auto"
|
|
10
|
+
>
|
|
11
|
+
<table
|
|
12
|
+
data-slot="table"
|
|
13
|
+
className={cn("w-full caption-bottom text-sm", className)}
|
|
14
|
+
{...props}
|
|
15
|
+
/>
|
|
16
|
+
</div>
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
|
|
21
|
+
return (
|
|
22
|
+
<thead
|
|
23
|
+
data-slot="table-header"
|
|
24
|
+
className={cn("[&_tr]:border-b", className)}
|
|
25
|
+
{...props}
|
|
26
|
+
/>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
|
|
31
|
+
return (
|
|
32
|
+
<tbody
|
|
33
|
+
data-slot="table-body"
|
|
34
|
+
className={cn("[&_tr:last-child]:border-0", className)}
|
|
35
|
+
{...props}
|
|
36
|
+
/>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
|
|
41
|
+
return (
|
|
42
|
+
<tfoot
|
|
43
|
+
data-slot="table-footer"
|
|
44
|
+
className={cn(
|
|
45
|
+
"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
|
|
46
|
+
className
|
|
47
|
+
)}
|
|
48
|
+
{...props}
|
|
49
|
+
/>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
|
|
54
|
+
return (
|
|
55
|
+
<tr
|
|
56
|
+
data-slot="table-row"
|
|
57
|
+
className={cn(
|
|
58
|
+
"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",
|
|
59
|
+
className
|
|
60
|
+
)}
|
|
61
|
+
{...props}
|
|
62
|
+
/>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function TableHead({ className, ...props }: React.ComponentProps<"th">) {
|
|
67
|
+
return (
|
|
68
|
+
<th
|
|
69
|
+
data-slot="table-head"
|
|
70
|
+
className={cn(
|
|
71
|
+
"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",
|
|
72
|
+
className
|
|
73
|
+
)}
|
|
74
|
+
{...props}
|
|
75
|
+
/>
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function TableCell({ className, ...props }: React.ComponentProps<"td">) {
|
|
80
|
+
return (
|
|
81
|
+
<td
|
|
82
|
+
data-slot="table-cell"
|
|
83
|
+
className={cn(
|
|
84
|
+
"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0",
|
|
85
|
+
className
|
|
86
|
+
)}
|
|
87
|
+
{...props}
|
|
88
|
+
/>
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function TableCaption({
|
|
93
|
+
className,
|
|
94
|
+
...props
|
|
95
|
+
}: React.ComponentProps<"caption">) {
|
|
96
|
+
return (
|
|
97
|
+
<caption
|
|
98
|
+
data-slot="table-caption"
|
|
99
|
+
className={cn("mt-4 text-sm text-muted-foreground", className)}
|
|
100
|
+
{...props}
|
|
101
|
+
/>
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export {
|
|
106
|
+
Table,
|
|
107
|
+
TableHeader,
|
|
108
|
+
TableBody,
|
|
109
|
+
TableFooter,
|
|
110
|
+
TableHead,
|
|
111
|
+
TableRow,
|
|
112
|
+
TableCell,
|
|
113
|
+
TableCaption,
|
|
114
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Tabs as TabsPrimitive } from "@base-ui/react/tabs"
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
3
|
+
|
|
4
|
+
import { cn } from "../utils"
|
|
5
|
+
|
|
6
|
+
function Tabs({
|
|
7
|
+
className,
|
|
8
|
+
orientation = "horizontal",
|
|
9
|
+
...props
|
|
10
|
+
}: TabsPrimitive.Root.Props) {
|
|
11
|
+
return (
|
|
12
|
+
<TabsPrimitive.Root
|
|
13
|
+
data-slot="tabs"
|
|
14
|
+
data-orientation={orientation}
|
|
15
|
+
className={cn(
|
|
16
|
+
"group/tabs flex gap-2 data-horizontal:flex-col",
|
|
17
|
+
className
|
|
18
|
+
)}
|
|
19
|
+
{...props}
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const tabsListVariants = cva(
|
|
25
|
+
"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",
|
|
26
|
+
{
|
|
27
|
+
variants: {
|
|
28
|
+
variant: {
|
|
29
|
+
default: "bg-muted",
|
|
30
|
+
line: "gap-1 bg-transparent",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
defaultVariants: {
|
|
34
|
+
variant: "default",
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
function TabsList({
|
|
40
|
+
className,
|
|
41
|
+
variant = "default",
|
|
42
|
+
...props
|
|
43
|
+
}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {
|
|
44
|
+
return (
|
|
45
|
+
<TabsPrimitive.List
|
|
46
|
+
data-slot="tabs-list"
|
|
47
|
+
data-variant={variant}
|
|
48
|
+
className={cn(tabsListVariants({ variant }), className)}
|
|
49
|
+
{...props}
|
|
50
|
+
/>
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {
|
|
55
|
+
return (
|
|
56
|
+
<TabsPrimitive.Tab
|
|
57
|
+
data-slot="tabs-trigger"
|
|
58
|
+
className={cn(
|
|
59
|
+
"relative inline-flex h-[calc(100%-1px)] flex-1 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 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground 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",
|
|
60
|
+
"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent",
|
|
61
|
+
"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground",
|
|
62
|
+
"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-active:after:opacity-100",
|
|
63
|
+
className
|
|
64
|
+
)}
|
|
65
|
+
{...props}
|
|
66
|
+
/>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {
|
|
71
|
+
return (
|
|
72
|
+
<TabsPrimitive.Panel
|
|
73
|
+
data-slot="tabs-content"
|
|
74
|
+
className={cn("flex-1 text-sm outline-none", className)}
|
|
75
|
+
{...props}
|
|
76
|
+
/>
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../utils"
|
|
4
|
+
|
|
5
|
+
function TooltipProvider({
|
|
6
|
+
delay = 0,
|
|
7
|
+
...props
|
|
8
|
+
}: TooltipPrimitive.Provider.Props) {
|
|
9
|
+
return (
|
|
10
|
+
<TooltipPrimitive.Provider
|
|
11
|
+
data-slot="tooltip-provider"
|
|
12
|
+
delay={delay}
|
|
13
|
+
{...props}
|
|
14
|
+
/>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function Tooltip({ ...props }: TooltipPrimitive.Root.Props) {
|
|
19
|
+
return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {
|
|
23
|
+
return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function TooltipContent({
|
|
27
|
+
className,
|
|
28
|
+
side = "top",
|
|
29
|
+
sideOffset = 4,
|
|
30
|
+
align = "center",
|
|
31
|
+
alignOffset = 0,
|
|
32
|
+
children,
|
|
33
|
+
...props
|
|
34
|
+
}: TooltipPrimitive.Popup.Props &
|
|
35
|
+
Pick<
|
|
36
|
+
TooltipPrimitive.Positioner.Props,
|
|
37
|
+
"align" | "alignOffset" | "side" | "sideOffset"
|
|
38
|
+
>) {
|
|
39
|
+
return (
|
|
40
|
+
<TooltipPrimitive.Portal>
|
|
41
|
+
<TooltipPrimitive.Positioner
|
|
42
|
+
align={align}
|
|
43
|
+
alignOffset={alignOffset}
|
|
44
|
+
side={side}
|
|
45
|
+
sideOffset={sideOffset}
|
|
46
|
+
className="isolate z-50"
|
|
47
|
+
>
|
|
48
|
+
<TooltipPrimitive.Popup
|
|
49
|
+
data-slot="tooltip-content"
|
|
50
|
+
className={cn(
|
|
51
|
+
"z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
52
|
+
className
|
|
53
|
+
)}
|
|
54
|
+
{...props}
|
|
55
|
+
>
|
|
56
|
+
{children}
|
|
57
|
+
<TooltipPrimitive.Arrow className="z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" />
|
|
58
|
+
</TooltipPrimitive.Popup>
|
|
59
|
+
</TooltipPrimitive.Positioner>
|
|
60
|
+
</TooltipPrimitive.Portal>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Utilities
|
|
2
|
+
export { cn } from "./utils"
|
|
3
|
+
|
|
4
|
+
// Components
|
|
5
|
+
export { Button, buttonVariants } from "./components/button"
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
Badge,
|
|
9
|
+
badgeVariants,
|
|
10
|
+
} from "./components/badge"
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
Card,
|
|
14
|
+
CardHeader,
|
|
15
|
+
CardFooter,
|
|
16
|
+
CardTitle,
|
|
17
|
+
CardAction,
|
|
18
|
+
CardDescription,
|
|
19
|
+
CardContent,
|
|
20
|
+
} from "./components/card"
|
|
21
|
+
|
|
22
|
+
export { Input } from "./components/input"
|
|
23
|
+
export { Label } from "./components/label"
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
Tabs,
|
|
27
|
+
TabsList,
|
|
28
|
+
TabsTrigger,
|
|
29
|
+
TabsContent,
|
|
30
|
+
tabsListVariants,
|
|
31
|
+
} from "./components/tabs"
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
Select,
|
|
35
|
+
SelectContent,
|
|
36
|
+
SelectGroup,
|
|
37
|
+
SelectItem,
|
|
38
|
+
SelectLabel,
|
|
39
|
+
SelectSeparator,
|
|
40
|
+
SelectTrigger,
|
|
41
|
+
SelectValue,
|
|
42
|
+
} from "./components/select"
|
|
43
|
+
|
|
44
|
+
export { Separator } from "./components/separator"
|
|
45
|
+
export { Switch } from "./components/switch"
|
|
46
|
+
export { Slider } from "./components/slider"
|
|
47
|
+
|
|
48
|
+
export {
|
|
49
|
+
Popover,
|
|
50
|
+
PopoverContent,
|
|
51
|
+
PopoverDescription,
|
|
52
|
+
PopoverHeader,
|
|
53
|
+
PopoverTitle,
|
|
54
|
+
PopoverTrigger,
|
|
55
|
+
} from "./components/popover"
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
DropdownMenu,
|
|
59
|
+
DropdownMenuTrigger,
|
|
60
|
+
DropdownMenuContent,
|
|
61
|
+
DropdownMenuGroup,
|
|
62
|
+
DropdownMenuItem,
|
|
63
|
+
DropdownMenuCheckboxItem,
|
|
64
|
+
DropdownMenuRadioGroup,
|
|
65
|
+
DropdownMenuRadioItem,
|
|
66
|
+
DropdownMenuLabel,
|
|
67
|
+
DropdownMenuSeparator,
|
|
68
|
+
DropdownMenuShortcut,
|
|
69
|
+
DropdownMenuSub,
|
|
70
|
+
DropdownMenuSubTrigger,
|
|
71
|
+
DropdownMenuSubContent,
|
|
72
|
+
} from "./components/dropdown-menu"
|
|
73
|
+
|
|
74
|
+
export {
|
|
75
|
+
Collapsible,
|
|
76
|
+
CollapsibleTrigger,
|
|
77
|
+
CollapsibleContent,
|
|
78
|
+
} from "./components/collapsible"
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
Table,
|
|
82
|
+
TableHeader,
|
|
83
|
+
TableBody,
|
|
84
|
+
TableFooter,
|
|
85
|
+
TableHead,
|
|
86
|
+
TableRow,
|
|
87
|
+
TableCell,
|
|
88
|
+
TableCaption,
|
|
89
|
+
} from "./components/table"
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
ModalBase,
|
|
93
|
+
ModalHeader,
|
|
94
|
+
ModalSection,
|
|
95
|
+
ModalFooter,
|
|
96
|
+
} from "./components/modal"
|
|
97
|
+
|
|
98
|
+
export type {
|
|
99
|
+
ModalSize,
|
|
100
|
+
ModalBaseProps,
|
|
101
|
+
ModalHeaderProps,
|
|
102
|
+
ModalSectionProps,
|
|
103
|
+
ModalFooterProps,
|
|
104
|
+
} from "./components/modal"
|
|
105
|
+
|
|
106
|
+
export {
|
|
107
|
+
Tooltip,
|
|
108
|
+
TooltipTrigger,
|
|
109
|
+
TooltipContent,
|
|
110
|
+
TooltipProvider,
|
|
111
|
+
} from "./components/tooltip"
|
|
112
|
+
|
|
113
|
+
export {
|
|
114
|
+
ScrollArea,
|
|
115
|
+
ScrollBar,
|
|
116
|
+
} from "./components/scroll-area"
|
|
117
|
+
|
|
118
|
+
export {
|
|
119
|
+
Dialog,
|
|
120
|
+
DialogClose,
|
|
121
|
+
DialogContent,
|
|
122
|
+
DialogDescription,
|
|
123
|
+
DialogFooter,
|
|
124
|
+
DialogHeader,
|
|
125
|
+
DialogOverlay,
|
|
126
|
+
DialogPortal,
|
|
127
|
+
DialogTitle,
|
|
128
|
+
DialogTrigger,
|
|
129
|
+
} from "./components/dialog"
|
|
130
|
+
|
|
131
|
+
export { JsonHighlight } from "./components/json-highlight"
|
|
132
|
+
|
|
133
|
+
export {
|
|
134
|
+
AppHeader,
|
|
135
|
+
AppHeaderBrand,
|
|
136
|
+
} from "./components/app-header"
|
|
137
|
+
|
|
138
|
+
export type {
|
|
139
|
+
AppHeaderProps,
|
|
140
|
+
AppHeaderBrandProps,
|
|
141
|
+
} from "./components/app-header"
|