import Link from 'next/link'; import { formatDate } from '@/lib/markdown'; import { Clock } from 'lucide-react'; import ArticleCoverSVG from './ArticleCoverSVG'; const CATEGORY_META = { 'ai-tools': { label: 'AI Tools', cls: 'bg-emerald-50 dark:bg-emerald-950/60 text-emerald-700 dark:text-emerald-300 border-emerald-200 dark:border-emerald-900' }, 'cybersec': { label: 'Cybersec', cls: 'bg-red-50 dark:bg-red-950/60 text-red-700 dark:text-red-300 border-red-200 dark:border-red-900' }, 'automation': { label: 'Automation', cls: 'bg-amber-50 dark:bg-amber-950/60 text-amber-700 dark:text-amber-300 border-amber-200 dark:border-amber-900' }, 'ai-dev': { label: 'AI Dev', cls: 'bg-blue-50 dark:bg-blue-950/60 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-900' }, }; /** * Отдать список «человеческих» тегов без дублей и без category-slug. */ function cleanTags(tags, category) { if (!Array.isArray(tags)) return []; const seen = new Set(); const out = []; const catLower = (category || '').toLowerCase(); for (const raw of tags) { if (typeof raw !== 'string') continue; const t = raw.trim(); if (!t) continue; const lower = t.toLowerCase(); if (lower === catLower) continue; if (seen.has(lower)) continue; seen.add(lower); out.push(t); } return out; } function CategoryBadge({ category }) { if (!category) return null; const meta = CATEGORY_META[category] || { label: category, cls: 'bg-neutral-100 dark:bg-neutral-800 text-neutral-700 dark:text-neutral-300 border-neutral-200 dark:border-neutral-700' }; // Просто бейдж без вложенной ссылки — карточка целиком кликабельна. return ( {meta.label} ); } function imageUrl(article) { if (!article.cover_url) return null; return article.cover_url; } /** * ArticleCard — карточка статьи в трёх размерах. * - size="hero": большая, 5/3 grid (для главной) * - size="regular": обычная карточка (для сеток 3-в-ряд) * - size="compact": плотная (для вертикальных лент / sidebar) * * featured prop оставлен для обратной совместимости (= size="hero"). */ export default function ArticleCard({ article, featured = false, size = 'regular' }) { const effectiveSize = featured ? 'hero' : size; const img = imageUrl(article); const tags = cleanTags(article.tags, article.category); if (effectiveSize === 'hero') { return (
{article.excerpt}
)}{article.excerpt}
)}