Seed: education 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