/** * Card - Container card with variant support. * * Variants: default | bordered | elevated | flat * Optional header, footer, and hover-lift effect with smooth * transform animation on hover. */ import PropTypes from "prop-types"; const VARIANT_CLASSES = { default: "bg-white shadow-card border border-neutral-200", bordered: "bg-white border-2 border-neutral-300", elevated: "bg-white shadow-card-hover", flat: "bg-neutral-100", }; function Card({ children, variant = "default", header, footer, hoverable = false, padding = true, className = "", onClick, ...rest }) { const isClickable = Boolean(onClick); const shouldLift = hoverable || isClickable; const classes = [ "rounded-xl overflow-hidden", "transition-all duration-200 ease-out", VARIANT_CLASSES[variant] || VARIANT_CLASSES.default, shouldLift ? "hover-lift" : "", isClickable ? "cursor-pointer" : "", className, ] .filter(Boolean) .join(" "); const Tag = isClickable ? "button" : "div"; return ( {header && (
{header}
)}
{children}
{footer && (
{footer}
)}
); } Card.propTypes = { children: PropTypes.node.isRequired, variant: PropTypes.oneOf(["default", "bordered", "elevated", "flat"]), header: PropTypes.node, footer: PropTypes.node, hoverable: PropTypes.bool, padding: PropTypes.bool, className: PropTypes.string, onClick: PropTypes.func, }; export default Card;