From c618a5dfe8be341eb4ef82c16a04d44b905c0f21 Mon Sep 17 00:00:00 2001 From: jyswee Date: Thu, 23 Jul 2026 22:09:56 +0000 Subject: [PATCH] Seed: portfolio template (18 files) --- src/components/ui/accordion.tsx | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/components/ui/accordion.tsx diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx new file mode 100644 index 0000000..cb06fe7 --- /dev/null +++ b/src/components/ui/accordion.tsx @@ -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 & { type?: string; collapsible?: boolean }) { + return
{children}
; +} + +export function AccordionItem({ className, children, value, ...props }: React.HTMLAttributes & { value?: string }) { + const [open, setOpen] = React.useState(false); + return ( + setOpen(o => !o) }}> +
{children}
+
+ ); +} + +export function AccordionTrigger({ className, children, ...props }: React.ButtonHTMLAttributes) { + const ctx = React.useContext(ItemContext); + return ( + + ); +} + +export function AccordionContent({ className, children, ...props }: React.HTMLAttributes) { + const ctx = React.useContext(ItemContext); + if (!ctx.open) return null; + return
{children}
; +} + +export default Accordion;