/** * Component: Series Grid * Documentation: documentation/frontend/components.md * * Grid layout for series cards with loading skeletons and empty state. * Uses the same responsive column system as AudiobookGrid since * series cards use rectangular (2:3) aspect ratios like book covers. */ 'use client'; import React from 'react'; import { SeriesCard } from './SeriesCard'; import { SeriesSummary } from '@/lib/hooks/useSeries'; interface SeriesGridProps { series: SeriesSummary[]; isLoading?: boolean; emptyMessage?: string; cardSize?: number; squareCovers?: boolean; } function getGridClasses(size: number): string { const sizeMap: Record = { 1: 'grid-cols-4 sm:grid-cols-5 md:grid-cols-6 lg:grid-cols-8 xl:grid-cols-10', 2: 'grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-7 xl:grid-cols-9', 3: 'grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 xl:grid-cols-8', 4: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-7', 5: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6', 6: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5', 7: 'grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4', 8: 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3', 9: 'grid-cols-1 sm:grid-cols-2', }; return sizeMap[size] || sizeMap[5]; } export function SeriesGrid({ series, isLoading = false, emptyMessage = 'No series found', cardSize = 5, squareCovers = false, }: SeriesGridProps) { const gridClasses = getGridClasses(cardSize); if (isLoading) { return (
{Array.from({ length: 10 }).map((_, i) => ( ))}
); } if (series.length === 0) { return (

{emptyMessage}

); } return (
{series.map(s => ( ))}
); } function SeriesSkeletonCard({ index = 0, squareCovers = false }: { index?: number; squareCovers?: boolean }) { return (
{/* Rectangular cover skeleton */}
{/* Text skeleton */}
); }