Seed: event template (15 files)

This commit is contained in:
2026-07-23 22:11:10 +00:00
parent ef5dec9c70
commit e71450633f
+46
View File
@@ -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<HTMLDivElement> & { 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 (
<TabsContext.Provider value={{ value, setValue }}>
<div className={cn("w-full", className)} {...props}>{children}</div>
</TabsContext.Provider>
);
}
export function TabsList({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
return <div className={cn("inline-flex items-center justify-center rounded-lg bg-slate-100 p-1", className)} {...props} />;
}
export function TabsTrigger({ value, className, children, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string }) {
const ctx = React.useContext(TabsContext);
const active = ctx.value === value;
return (
<button
type="button"
onClick={() => ctx.setValue(value)}
className={cn(
"inline-flex items-center justify-center rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
active ? "bg-white text-slate-950 shadow-sm" : "text-slate-500 hover:text-slate-900",
className
)}
{...props}
>
{children}
</button>
);
}
export function TabsContent({ value, className, children, ...props }: React.HTMLAttributes<HTMLDivElement> & { value: string }) {
const ctx = React.useContext(TabsContext);
if (ctx.value !== value) return null;
return <div className={cn("mt-2", className)} {...props}>{children}</div>;
}
export default Tabs;