Seed: real-estate template (18 files)

This commit is contained in:
2026-07-23 22:11:56 +00:00
parent 43abe8832d
commit 1553d0f57e
+40
View File
@@ -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;