/** * Процедурно-сгенерированная SVG-обложка в стиле сайта. * Не требует AI — рендерится сразу, выглядит достойно вместо плоского градиента. * * Идея: используем seed (id статьи) для воспроизводимой композиции. * Каждая статья получает свой уникальный, но узнаваемый узор. */ // псевдо-рандом по seed (mulberry32) function rng(seed) { let t = seed + 0x6D2B79F5; return () => { t = Math.imul(t ^ (t >>> 15), t | 1); t ^= t + Math.imul(t ^ (t >>> 7), t | 61); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; } // Палитры — приглушённые, чтобы не спорить с UI const PALETTES = [ { bg: '#ecfdf5', accent: '#10b981', soft: '#a7f3d0', dark: '#065f46' }, // emerald { bg: '#f0fdfa', accent: '#14b8a6', soft: '#99f6e4', dark: '#115e59' }, // teal { bg: '#fefce8', accent: '#eab308', soft: '#fef08a', dark: '#854d0e' }, // yellow { bg: '#eff6ff', accent: '#3b82f6', soft: '#bfdbfe', dark: '#1e40af' }, // blue { bg: '#fdf4ff', accent: '#a855f7', soft: '#e9d5ff', dark: '#6b21a8' }, // purple { bg: '#fff7ed', accent: '#f97316', soft: '#fed7aa', dark: '#9a3412' }, // orange ]; export default function ArticleCoverSVG({ article, className = '', aspect = '16/9', priority = false }) { const seed = (article?.id || 1) * 9301 + 49297; const rand = rng(seed); const palette = PALETTES[Math.floor(rand() * PALETTES.length)]; // Композиция: 3-5 «слоёв» геометрии const layers = 3 + Math.floor(rand() * 3); const shapes = []; for (let i = 0; i < layers; i++) { const kind = ['curve', 'circle', 'arc', 'rect'][Math.floor(rand() * 4)]; const opacity = 0.35 + rand() * 0.5; const colors = [palette.accent, palette.soft, palette.dark]; const fill = colors[Math.floor(rand() * colors.length)]; shapes.push({ kind, opacity, fill, r: rand }); } // тег (первый) — мелкая метка в углу const tag = (article?.tags?.[0] || 'zeropost').toString().slice(0, 18); return (