-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathtabs.tsx
More file actions
100 lines (86 loc) · 3.12 KB
/
tabs.tsx
File metadata and controls
100 lines (86 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
'use client'
import * as React from 'react'
import * as TabsPrimitive from '@radix-ui/react-tabs'
import { cva, type VariantProps } from 'class-variance-authority'
import { createRequiredContext } from '../../hooks/internals/create-required-context'
import { cn } from '../../utils/cn'
type Variants = 'default' | 'underline'
const tabListVariants = cva<{ variant: Record<Variants, any> }>(
'w-full items-center justify-center',
{
variants: {
variant: {
default: 'bg-muted text-muted-foreground inline-flex rounded-lg p-[3px]',
underline: 'border-b',
},
},
defaultVariants: {
variant: 'default',
},
}
)
const tabVariants = cva<{ variant: Record<Variants, any> }>(
"inline-flex flex-1 items-center justify-center text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:text-text-disabled [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-8",
{
variants: {
variant: {
default:
'h-[calc(100%-1px)] gap-3 data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:ring-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground rounded-md border border-transparent px-4 py-2 focus-visible:ring-[2px] data-[state=active]:shadow-sm ',
underline: [
'relative data-[state=active]:text-primary px-3 pb-5 focus-visible:ring-[2px] focus-visible:ring-ring focus-visible:ring-offset-2',
'before:absolute before:block before:content-[""] data-[state=active]:before:w-full before:h-1 before:bg-primary before:-bottom-px',
],
},
},
defaultVariants: {
variant: 'default',
},
}
)
const [TabsContextProvider, useTabsContext] =
createRequiredContext<VariantProps<typeof tabVariants>>('Tabs context')
function Tabs({
className,
variant,
...props
}: React.ComponentProps<typeof TabsPrimitive.Root> & VariantProps<typeof tabVariants>) {
return (
<TabsContextProvider variant={variant}>
<TabsPrimitive.Root
data-slot="tabs"
className={cn('flex flex-col gap-4', className)}
{...props}
/>
</TabsContextProvider>
)
}
function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {
const ctx = useTabsContext()
return (
<TabsPrimitive.List
data-slot="tabs-list"
className={cn(tabListVariants({ variant: ctx.variant }), className)}
{...props}
/>
)
}
function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
const ctx = useTabsContext()
return (
<TabsPrimitive.Trigger
data-slot="tabs-trigger"
className={cn(tabVariants({ variant: ctx.variant }), className)}
{...props}
/>
)
}
function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {
return (
<TabsPrimitive.Content
data-slot="tabs-content"
className={cn('flex-1 outline-none', className)}
{...props}
/>
)
}
export { Tabs, TabsContent, TabsList, TabsTrigger }