import { ChevronUp, ChevronDown, Eye, Zap, Shield, FileText, Brain, StopCircle } from 'lucide-react' import { ModelInfo, SortConfig } from '../types' import { formatPrice, formatContextLength, truncateText } from '../utils/formatters' interface ModelTableProps { models: ModelInfo[] selectedModel?: string onModelSelect: (modelId: string) => void sortConfig: SortConfig onSort: (key: keyof ModelInfo | null, direction?: 'asc' | 'desc') => void } export function ModelTable({ models, selectedModel, onModelSelect, sortConfig, onSort }: ModelTableProps) { const getSortIcon = (key: keyof ModelInfo) => { if (sortConfig.key !== key) { return } return sortConfig.direction === 'asc' ? : } const getFeatureIcon = (feature: string) => { const iconStyle = { width: '0.75rem', height: '0.75rem' } switch (feature.toLowerCase()) { case 'vision': return case 'reasoning': return case 'stream cancel': return case 'fast': return case 'moderated': return case 'long context': return default: return null } } const renderFeatureTags = (features?: string[]) => { if (!features || features.length === 0) return null const visibleFeatures = features.slice(0, 3) const hiddenCount = features.length - 3 return (
{visibleFeatures.map((feature, index) => ( {getFeatureIcon(feature)} {feature} ))} {hiddenCount > 0 && ( +{hiddenCount} more )}
) } return (
{models.map((model) => ( onModelSelect(model.id)} className={selectedModel === model.id ? 'selected' : ''} > ))}
Features Description
{model.name} {model.id}
{model.provider}
{model.costTier.charAt(0).toUpperCase() + model.costTier.slice(1)} {model.pricing && (
In: {formatPrice(model.pricing.input)} | Out: {formatPrice(model.pricing.output)}
)}
{formatContextLength(model.context)} {renderFeatureTags(model.features)}

{truncateText(model.description, 100)}

{models.length === 0 && (
No models found

Try adjusting your search terms or clearing some filters to see more results.

)}
) }