Seed: portfolio template (18 files)
This commit is contained in:
@@ -0,0 +1,40 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
|
const ItemContext = React.createContext<{ open: boolean; toggle: () => void }>({ open: false, toggle: () => {} });
|
||||||
|
|
||||||
|
export function Accordion({ className, children, type, collapsible, ...props }: React.HTMLAttributes<HTMLDivElement> & { type?: string; collapsible?: boolean }) {
|
||||||
|
return <div className={cn("w-full", className)} {...props}>{children}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function AccordionItem({ className, children, value, ...props }: React.HTMLAttributes<HTMLDivElement> & { value?: string }) {
|
||||||
|
const [open, setOpen] = React.useState(false);
|
||||||
|
return (
|
||||||
|
<ItemContext.Provider value={{ open, toggle: () => setOpen(o => !o) }}>
|
||||||
|
<div className={cn("border-b border-slate-200", className)} {...props}>{children}</div>
|
||||||
|
</ItemContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function AccordionTrigger({ className, children, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>) {
|
||||||
|
const ctx = React.useContext(ItemContext);
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={ctx.toggle}
|
||||||
|
className={cn("flex w-full items-center justify-between py-4 text-left text-sm font-medium hover:underline", className)}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
<span className={cn("ml-2 transition-transform", ctx.open && "rotate-180")}>⌄</span>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function AccordionContent({ className, children, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
|
const ctx = React.useContext(ItemContext);
|
||||||
|
if (!ctx.open) return null;
|
||||||
|
return <div className={cn("pb-4 text-sm text-slate-600", className)} {...props}>{children}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Accordion;
|
||||||
Reference in New Issue
Block a user