'use client'; import React, { ReactNode } from 'react'; import { cn } from '@/lib/utils'; import { LoadingSkeleton } from '@/components/ui'; // CardGrid column options export type GridColumns = 1 | 2 | 3 | 4; // CardGrid gap options export type GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; // CardGrid props interface export interface CardGridProps { /** Card items to render */ items?: ReactNode[]; /** Number of columns */ columns?: GridColumns; /** Gap spacing */ gap?: GridGap; /** Loading state */ loading?: boolean; /** Empty state message */ emptyMessage?: string; /** Empty state component */ emptyComponent?: ReactNode; /** Loading skeleton count */ skeletonCount?: number; /** Additional classes */ className?: string; /** Children (alternative to items) */ children?: ReactNode; } // Helper function to get gap classes const getGapClasses = (gap: GridGap): string => { const gapMap = { xs: 'gap-2', sm: 'gap-4', md: 'gap-6', lg: 'gap-8', xl: 'gap-12', }; return gapMap[gap]; }; // Helper function to get column classes const getColumnClasses = (columns: GridColumns): string => { const columnMap = { 1: 'grid-cols-1', 2: 'grid-cols-1 md:grid-cols-2', 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3', 4: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4', }; return columnMap[columns]; }; // Skeleton loader component const GridSkeleton = ({ count, columns, gap }: { count: number; columns: GridColumns; gap: GridGap; }) => { const gapClasses = getGapClasses(gap); const columnClasses = getColumnClasses(columns); return (