Spaces:
Sleeping
Sleeping
File size: 1,995 Bytes
3786a3f | 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 | 'use client';
import * as React from 'react';
import { cn } from '@/lib/utils';
interface TabsContext {
value: string;
setValue: (v: string) => void;
}
const TabsCtx = React.createContext<TabsContext>({ value: '', setValue: () => {} });
export function Tabs({
value: controlled,
onValueChange,
defaultValue,
children,
className,
}: {
value?: string;
onValueChange?: (v: string) => void;
defaultValue?: string;
children: React.ReactNode;
className?: string;
}) {
const [internal, setInternal] = React.useState(defaultValue || '');
const value = controlled ?? internal;
const setValue = (v: string) => {
if (!controlled) setInternal(v);
onValueChange?.(v);
};
return (
<TabsCtx.Provider value={{ value, setValue }}>
<div className={className}>{children}</div>
</TabsCtx.Provider>
);
}
export function TabsList({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
return (
<div
className={cn('inline-flex items-center justify-center gap-1 rounded-md bg-bg-elevated p-1', className)}
{...props}
/>
);
}
export function TabsTrigger({
value,
className,
...props
}: React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string }) {
const { value: active, setValue } = React.useContext(TabsCtx);
return (
<button
onClick={() => setValue(value)}
className={cn(
'inline-flex items-center justify-center whitespace-nowrap rounded px-3 py-1.5 text-sm font-medium transition-all',
active === value
? 'bg-accent-violet text-white shadow'
: 'text-text-secondary hover:text-text-primary',
className
)}
{...props}
/>
);
}
export function TabsContent({
value,
className,
...props
}: React.HTMLAttributes<HTMLDivElement> & { value: string }) {
const { value: active } = React.useContext(TabsCtx);
if (active !== value) return null;
return <div className={cn('mt-3 animate-fade-in', className)} {...props} />;
}
|