/** * Utility functions for the Card component. */ /** * Combines multiple className strings into a single string, filtering out falsy values. * * This utility provides a cleaner alternative to template literals for className composition, * avoiding unnecessary string allocation on every render. * * @param classes - Array of class names (can include undefined/null/empty strings) * @returns Combined className string * * @example * ```tsx * cn('card-title', className) // "card-title custom-class" * cn('card-title', undefined) // "card-title" * cn('card-title', '', 'extra') // "card-title extra" * ``` */ export function cn(...classes: (string | undefined | null | false)[]): string { return classes.filter(Boolean).join(' ') } /** * CSS class name constants for Card components. * Centralizing these prevents typos and enables easier refactoring. */ export const CARD_CLASSES = { CARD: 'card', TITLE: 'card-title', CONTENT: 'card-content', FOOTER: 'card-footer', } as const /** * Handles keyboard events for interactive cards. * Triggers click handler on Enter or Space key press. * * @param event - Keyboard event * @param onClick - Click handler to invoke * * @example * ```tsx *