import { forwardRef, useId, useMemo } from 'react' import Block from '../Primitives/Block/Block' import { type CardProps } from './types' import type { CardTokenType } from './card.tokens' import { useResponsiveTokens } from '../../hooks/useResponsiveTokens' import { toPixels } from '../../global-utils/GlobalUtils' import { getCardVariant, isDefaultCard, isAlignedCard, isCustomCard, } from './utils' import { DefaultCard, AlignedCard, CustomCard } from './CardComponents' import CardSkeleton from './CardSkeleton' const Card = forwardRef( ({ maxWidth = 'auto', minHeight, maxHeight, skeleton, ...props }, ref) => { const cardToken = useResponsiveTokens('CARD') const variant = getCardVariant( 'variant' in props ? props.variant : undefined ) // Generate unique IDs for ARIA relationships const baseId = useId() const cardId = `${baseId}-card` const headerTitle = 'headerTitle' in props ? props.headerTitle : undefined // Generate accessible label for the card const cardLabel = useMemo(() => { const parts: string[] = [] if ('headerTitle' in props && props.headerTitle) { parts.push(props.headerTitle) } if ('bodyTitle' in props && props.bodyTitle) { parts.push(props.bodyTitle) } return parts.length > 0 ? parts.join(' - ') : undefined }, [props]) const renderCardContent = () => { if (isDefaultCard(variant)) { return ( } cardToken={cardToken} maxHeight={maxHeight} baseId={baseId} /> ) } if (isAlignedCard(variant)) { return ( } cardToken={cardToken} maxHeight={maxHeight} baseId={baseId} /> ) } if (isCustomCard(variant)) { return ( } cardToken={cardToken} maxHeight={maxHeight} baseId={baseId} /> ) } return null } const handleMouseEnter = (e: React.MouseEvent) => { const target = e.currentTarget as HTMLElement target.style.outline = cardToken.border as string target.style.backgroundColor = cardToken.backgroundColor as string } const handleMouseLeave = (e: React.MouseEvent) => { const target = e.currentTarget as HTMLElement target.style.outline = cardToken.border as string target.style.backgroundColor = cardToken.backgroundColor as string } return ( {skeleton?.show ? ( ) : ( renderCardContent() )} ) } ) Card.displayName = 'Card' export default Card