import React, { ReactNode, forwardRef } from 'react'; import { Heading } from './Heading'; export interface CardProps { children: ReactNode; variant?: 'default' | 'muted' | 'outline' | 'glass' | 'dark' | any; title?: string | ReactNode; footer?: ReactNode; padding?: 'none' | 'sm' | 'md' | 'lg' | number | any; className?: string; style?: React.CSSProperties; bg?: string; p?: number; onClick?: () => void; responsiveColSpan?: { lg: number }; overflow?: string; rounded?: string | boolean; borderLeft?: boolean; borderColor?: string; center?: boolean; transition?: string | boolean; hoverBorderColor?: string; border?: boolean; position?: string; mb?: number; display?: string; alignItems?: string; gap?: number; py?: number; backgroundColor?: string; } /** * Card - Redesigned for "Modern Precision" theme. * Includes extensive compatibility props to prevent app-wide breakage. */ export const Card = forwardRef(({ children, variant = 'default', title, footer, padding = 'md', className, style, bg, p, onClick, responsiveColSpan, overflow, rounded, borderLeft, borderColor, center, transition, hoverBorderColor, border, position, mb, display, alignItems, gap, py, backgroundColor, }, ref) => { const variantClasses = { default: 'bg-[var(--ui-color-bg-surface)] border-[var(--ui-color-border-default)] shadow-sm', muted: 'bg-[var(--ui-color-bg-surface-muted)] border-[var(--ui-color-border-muted)]', outline: 'bg-transparent border-[var(--ui-color-border-default)]', glass: 'bg-white/[0.03] backdrop-blur-md border-white/[0.05]', dark: 'bg-[var(--ui-color-bg-base)] border-[var(--ui-color-border-default)]', }; const paddingClasses = { none: 'p-0', sm: 'p-2', md: 'p-4', lg: 'p-8', }; const getPaddingClass = (pad: any) => { if (typeof pad === 'string') return paddingClasses[pad as keyof typeof paddingClasses] || paddingClasses.md; return ''; // Handled in style }; const combinedStyle: React.CSSProperties = { ...style, ...(bg ? { backgroundColor: bg.startsWith('bg-') ? undefined : bg } : {}), ...(backgroundColor ? { backgroundColor } : {}), ...(p !== undefined ? { padding: `${p * 0.25}rem` } : {}), ...(py !== undefined ? { paddingTop: `${py * 0.25}rem`, paddingBottom: `${py * 0.25}rem` } : {}), ...(typeof padding === 'number' ? { padding: `${padding * 0.25}rem` } : {}), ...(responsiveColSpan?.lg ? { gridColumn: `span ${responsiveColSpan.lg} / span ${responsiveColSpan.lg}` } : {}), ...(overflow ? { overflow } : {}), ...(borderColor ? { borderColor: borderColor.startsWith('border-') ? undefined : borderColor } : {}), ...(borderLeft ? { borderLeft: `4px solid ${borderColor || 'var(--ui-color-intent-primary)'}` } : {}), ...(center ? { display: 'flex', alignItems: 'center', justifyContent: 'center' } : {}), ...(typeof transition === 'string' ? { transition } : {}), ...(position ? { position: position as any } : {}), ...(mb !== undefined ? { marginBottom: `${mb * 0.25}rem` } : {}), ...(display ? { display } : {}), ...(alignItems ? { alignItems } : {}), ...(gap !== undefined ? { gap: `${gap * 0.25}rem` } : {}), ...(border === false ? { border: 'none' } : {}), }; return (
{title && (
{typeof title === 'string' ? ( {title} ) : title}
)}
{children}
{footer && (
{footer}
)}
); }); Card.displayName = 'Card'; export const CardHeader = ({ title, children }: { title?: string, children?: ReactNode }) => (
{title && {title}} {children}
); export const CardContent = ({ children }: { children: ReactNode }) => (
{children}
); export const CardFooter = ({ children }: { children: ReactNode }) => (
{children}
);