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 (
{img ? ( {article.title} ) : ( )}
{tags.slice(0, 3).map(t => ( #{t} ))}

{article.title}

{article.excerpt && (

{article.excerpt}

)}
{formatDate(article.published_at)} {article.reading_time && ( {article.reading_time} мин )}
); } if (effectiveSize === 'compact') { return (
{img ? ( {article.title} ) : ( )}

{article.title}

{formatDate(article.published_at)} {article.reading_time && ( {article.reading_time} мин )}
); } // regular return (
{img ? ( {article.title} ) : ( )}
{tags.slice(0, 2).map(t => ( #{t} ))}

{article.title}

{article.excerpt && (

{article.excerpt}

)}
{formatDate(article.published_at)} {article.reading_time && ( {article.reading_time} мин )}
); }