From 95beb0059c3193c4a85254e7b86fbd1d52a4e1f9 Mon Sep 17 00:00:00 2001 From: jyswee Date: Thu, 23 Jul 2026 22:08:40 +0000 Subject: [PATCH] Seed: saas template (34 files) --- src/components/ui/tabs.tsx | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/components/ui/tabs.tsx diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx new file mode 100644 index 0000000..45dbf27 --- /dev/null +++ b/src/components/ui/tabs.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import { cn } from "@/lib/utils"; + +const TabsContext = React.createContext<{ value: string; setValue: (v: string) => void }>({ value: "", setValue: () => {} }); + +export function Tabs({ defaultValue = "", value: controlled, onValueChange, className, children, ...props }: React.HTMLAttributes & { defaultValue?: string; value?: string; onValueChange?: (v: string) => void }) { + const [internal, setInternal] = React.useState(defaultValue); + const value = controlled ?? internal; + const setValue = (v: string) => { setInternal(v); onValueChange?.(v); }; + return ( + +
{children}
+
+ ); +} + +export function TabsList({ className, ...props }: React.HTMLAttributes) { + return
; +} + +export function TabsTrigger({ value, className, children, ...props }: React.ButtonHTMLAttributes & { value: string }) { + const ctx = React.useContext(TabsContext); + const active = ctx.value === value; + return ( + + ); +} + +export function TabsContent({ value, className, children, ...props }: React.HTMLAttributes & { value: string }) { + const ctx = React.useContext(TabsContext); + if (ctx.value !== value) return null; + return
{children}
; +} + +export default Tabs;