| import * as React from "react" |
| import { cn } from "@/lib/utils" |
|
|
| const TabsContext = React.createContext(null) |
|
|
| const Tabs = ({ defaultValue, value, onValueChange, className, children, ...props }) => { |
| const [internalValue, setInternalValue] = React.useState(defaultValue || "") |
| const currentValue = value !== undefined ? value : internalValue |
| const handleValueChange = onValueChange || setInternalValue |
|
|
| return ( |
| <TabsContext.Provider value={{ value: currentValue, onValueChange: handleValueChange }}> |
| <div className={cn("w-full", className)} {...props}> |
| {children} |
| </div> |
| </TabsContext.Provider> |
| ) |
| } |
|
|
| const TabsList = React.forwardRef(({ className, ...props }, ref) => { |
| return ( |
| <div |
| ref={ref} |
| className={cn( |
| "inline-flex h-10 items-center justify-center rounded-md bg-slate-100 p-1 text-slate-500", |
| className |
| )} |
| {...props} |
| /> |
| ) |
| }) |
| TabsList.displayName = "TabsList" |
|
|
| const TabsTrigger = React.forwardRef(({ className, value, ...props }, ref) => { |
| const context = React.useContext(TabsContext) |
| const isActive = context?.value === value |
|
|
| return ( |
| <button |
| ref={ref} |
| type="button" |
| onClick={() => context?.onValueChange(value)} |
| data-state={isActive ? "active" : "inactive"} |
| className={cn( |
| "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-white transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", |
| isActive ? "bg-white text-slate-950 shadow-sm" : "text-slate-500 hover:text-slate-950", |
| className |
| )} |
| {...props} |
| /> |
| ) |
| }) |
| TabsTrigger.displayName = "TabsTrigger" |
|
|
| const TabsContent = React.forwardRef(({ className, value, ...props }, ref) => { |
| const context = React.useContext(TabsContext) |
| const isActive = context?.value === value |
|
|
| if (!isActive) return null |
|
|
| return ( |
| <div |
| ref={ref} |
| className={cn( |
| "mt-2 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2", |
| className |
| )} |
| {...props} |
| /> |
| ) |
| }) |
| TabsContent.displayName = "TabsContent" |
|
|
| export { Tabs, TabsList, TabsTrigger, TabsContent } |
|
|