'use client' import { Badge } from '@thedaviddias/design-system/badge' import { cn } from '@thedaviddias/design-system/lib/utils' import Link from 'next/link' import { Card } from '@/components/ui/card' import { FaviconWithFallback } from '@/components/ui/favicon-with-fallback' import { FavoriteButton } from '@/components/ui/favorite-button' import type { WebsiteMetadata } from '@/lib/content-loader' import { getRoute } from '@/lib/routes' import { stripHtmlTags } from '@/lib/utils' interface LLMGridProps { items: WebsiteMetadata[] variant?: 'default' | 'compact' className?: string maxItems?: number animateIn?: boolean analyticsSource?: string overrideGrid?: boolean } /** * Grid component for displaying LLM/website items with favorites functionality * Features: Staggered fade-in animations, hover lift effects, responsive grid */ export function LLMGrid({ items = [], variant = 'default', className, maxItems, animateIn = true, analyticsSource, overrideGrid = false }: LLMGridProps) { if (!items?.length) { return null } /** * Get stagger animation class based on index (capped at 8) * @param index - The item index * @returns The stagger class name */ const getStaggerClass = (index: number) => { const staggerIndex = Math.min(index, 7) + 1 return `stagger-${staggerIndex}` } if (variant === 'compact') { return (
{items.map((item, index) => { if (!item?.slug) return null return (

{item.name}

{item.isUnofficial && ( Unofficial )}

{stripHtmlTags(item.description)}

) })}
) } return (
{items.map((item, index) => { if (!item?.slug) return null const isVisible = !maxItems || index < maxItems // Hide items 7 and 8 (index 6, 7) on screens smaller than 4xl const isExtraItem = index >= 6 return (

{item.name}

{item.isUnofficial && ( Unofficial )}

{stripHtmlTags(item.description)}

) })}
) }