import { Slot } from '@radix-ui/react-slot' import { forwardRef } from 'react' import { tv } from 'tailwind-variants' import type { Merge } from 'type-fest' const card = tv({ slots: { root: 'rounded-xl border bg-surface shadow p-6', title: 'font-semibold leading-none tracking-tight', description: 'mt-1.5 text-sm text-fg-weaker', actions: 'mt-6 flex items-center', }, }) const CardRoot = forwardRef< HTMLDivElement, Merge< React.HTMLAttributes, { asChild?: boolean } > >(({ asChild, ...props }, ref) => { const { root } = card() const Comp = asChild ? Slot : 'div' return }) CardRoot.displayName = 'Card' const CardTitle = forwardRef< HTMLParagraphElement, Merge< React.HTMLAttributes, { asChild?: boolean } > >(({ asChild, ...props }, ref) => { const { title } = card() const Comp = asChild ? Slot : 'h3' return }) CardTitle.displayName = 'CardTitle' const CardDescription = forwardRef< HTMLParagraphElement, Merge< React.HTMLAttributes, { asChild?: boolean } > >(({ asChild, ...props }, ref) => { const { description } = card() const Comp = asChild ? Slot : 'p' return }) CardDescription.displayName = 'CardDescription' const CardActions = forwardRef< HTMLDivElement, Merge< React.HTMLAttributes, { asChild?: boolean } > >(({ asChild, ...props }, ref) => { const { actions } = card() const Comp = asChild ? Slot : 'div' return }) CardActions.displayName = 'CardActions' const Card = Object.assign(CardRoot, { Title: CardTitle, Description: CardDescription, Actions: CardActions, }) export default Card export { card }