// Hero — 2 варианта: classic (лево текст / право фото) и bold (всё едино, код сверху + фото встроено) function ExpertPhoto({ size = 400, name = 'Алексей', tagline = 'founder / агент', style = {} }) { return (
{/* Blue glow — top-left behind photo */}
{/* Yellow glow — bottom-right behind photo */} {/* removed per user request */} {/* Photo — transparent cutout, clean, just soft bottom fade */} {name} {/* Warm color-grade overlay */} {/* removed per user request */} {/* Name card — removed per user request */} {/* Live tag — floating top */}
LIVE
); } function CodeLine({ n, indent = 0, children, hl = false }) { return (
{String(n).padStart(2, '0')} {children}
); } const syn = { kw: { color: '#c678dd' }, str: { color: '#98c379' }, num: { color: '#d19a66' }, fn: { color: '#61afef' }, cmt: { color: '#5c6370', fontStyle: 'italic' }, var: { color: '#e06c75' }, prop: { color: '#e5c07b' }, y: { color: 'var(--yellow)' }, b: { color: 'var(--blue)' } }; // Анимация живого набора Python-скрипта (gspread / Google Sheets автоматизация) function TypingCode({ syn }) { // Каждая строка: массив токенов { t: тип, s: текст }. Тип 'pl' — без подсветки. const lines = [ [{ t: 'kw', s: 'def' }, { t: 'pl', s: ' ' }, { t: 'fn', s: 'main' }, { t: 'pl', s: '() -> ' }, { t: 'kw', s: 'None' }, { t: 'pl', s: ':' }], [{ t: 'pl', s: ' creds = ' }, { t: 'fn', s: 'Credentials' }, { t: 'pl', s: '.' }, { t: 'fn', s: 'from_service_account_file' }, { t: 'pl', s: '(' }, { t: 'str', s: '"google_creds.json"' }, { t: 'pl', s: ', scopes=' }, { t: 'var', s: 'SCOPES' }, { t: 'pl', s: ')' }], [{ t: 'pl', s: ' gc = gspread.' }, { t: 'fn', s: 'authorize' }, { t: 'pl', s: '(creds)' }], [{ t: 'pl', s: '' }], [{ t: 'pl', s: ' ' }, { t: 'kw', s: 'try' }, { t: 'pl', s: ':' }], [{ t: 'pl', s: ' ss = gc.' }, { t: 'fn', s: 'open' }, { t: 'pl', s: '(' }, { t: 'var', s: 'OLD_NAME' }, { t: 'pl', s: ')' }], [{ t: 'pl', s: ' ' }, { t: 'fn', s: 'print' }, { t: 'pl', s: '(' }, { t: 'str', s: 'f"найдена таблица \'{OLD_NAME}\'"' }, { t: 'pl', s: ')' }], [{ t: 'pl', s: ' ' }, { t: 'kw', s: 'except' }, { t: 'pl', s: ' gspread.' }, { t: 'fn', s: 'SpreadsheetNotFound' }, { t: 'pl', s: ':' }], [{ t: 'pl', s: ' ss = gc.' }, { t: 'fn', s: 'create' }, { t: 'pl', s: '(' }, { t: 'var', s: 'NEW_NAME' }, { t: 'pl', s: ')' }], [{ t: 'pl', s: ' ' }, { t: 'fn', s: 'print' }, { t: 'pl', s: '(' }, { t: 'str', s: 'f"создана: id={ss.id}"' }, { t: 'pl', s: ')' }], [{ t: 'pl', s: '' }], [{ t: 'pl', s: ' ' }, { t: 'kw', s: 'if' }, { t: 'pl', s: ' ss.title != ' }, { t: 'var', s: 'NEW_NAME' }, { t: 'pl', s: ':' }], [{ t: 'pl', s: ' ss.' }, { t: 'fn', s: 'update_title' }, { t: 'pl', s: '(' }, { t: 'var', s: 'NEW_NAME' }, { t: 'pl', s: ')' }], [{ t: 'pl', s: '' }], [{ t: 'pl', s: ' ' }, { t: 'fn', s: 'print' }, { t: 'pl', s: '(' }, { t: 'str', s: 'f"✓ готово. Таблица \'{NEW_NAME}\' чистая."' }, { t: 'pl', s: ')' }]]; // Вычисляем длину каждой строки в символах const lineLens = lines.map((l) => l.reduce((a, tk) => a + tk.s.length, 0)); const totalChars = lineLens.reduce((a, b) => a + b, 0); const N = lines.length; const PAUSE_BETWEEN = 6; // паузы между строками (в "тиках") const PAUSE_LOOP = 120; // пауза перед рестартом const CHAR_MS = 28; // скорость печати const totalTicks = totalChars + PAUSE_BETWEEN * (N - 1) + PAUSE_LOOP; const [tick, setTick] = React.useState(0); React.useEffect(() => { const id = setInterval(() => { setTick((t) => (t + 1) % totalTicks); }, CHAR_MS); return () => clearInterval(id); }, [totalTicks]); // Распределяем tick по строкам let remaining = tick; const shown = new Array(N).fill(0); for (let i = 0; i < N; i++) { if (remaining <= 0) break; const take = Math.min(remaining, lineLens[i]); shown[i] = take; remaining -= take; if (shown[i] === lineLens[i] && i < N - 1) { remaining -= PAUSE_BETWEEN; } } // Какая строка "активна" let activeLine = 0; for (let i = 0; i < N; i++) { if (shown[i] < lineLens[i]) {activeLine = i;break;} activeLine = i; } const allDone = shown[N - 1] === lineLens[N - 1]; const renderLine = (idx) => { const line = lines[idx]; const visible = shown[idx]; let used = 0; const out = []; for (let j = 0; j < line.length; j++) { const tk = line[j]; if (used >= visible) break; const take = Math.min(tk.s.length, visible - used); const piece = tk.s.slice(0, take); const style = tk.t === 'pl' ? null : syn[tk.t]; out.push( ); used += take; if (used >= visible) break; } const showCursor = activeLine === idx && !allDone || allDone && idx === N - 1; return (
{idx + 1} {out} {showCursor && }
); }; // Auto-scroll to active line — keep it in view inside fixed-height window const scrollerRef = React.useRef(null); React.useEffect(() => { const el = scrollerRef.current; if (!el) return; const lineEl = el.children[activeLine]; if (!lineEl) return; const target = Math.max(0, lineEl.offsetTop - el.clientHeight * 0.55); el.scrollTo({ top: target, behavior: 'smooth' }); }, [activeLine]); return ( <>
{lines.map((_, i) => renderLine(i))}
); } // --- VARIANT 1: CLASSIC --- function HeroClassic() { return (
{/* glow */}
{/* LEFT — text */}
NEW поток #2 · набор на май открыт осталось 7 мест из 10

стань
AI-разрабом ;

Собирай сайты, приложения и ai-агентов через диалог с помощью ии. Закрывай клиентов на $500–2000 за проект.

{/* Pills */}
Начать обучение
{/* Stats */}
{[ ['1000+', 'учеников'], ['$500', 'средний чек'], ['17', 'модулей']]. map(([n, l], i) =>
{n}
{l}
)}
{/* RIGHT — terminal with typing animation */}
{/* Caption above terminal */}
код пишется за тебя сам
{/* Terminal window */}
{/* Subtle yellow glow */}
{/* Title bar */}
agent.ts
{/* Terminal ticker — marquee of learner incomes */}
$ tail -f /learners/income.log {/* marquee */}
{Array.from({ length: 3 }).flatMap((_, j) => ['$1500', '$500', '$450', '$610', '$2100', '$980', '$1250', '$370', '$1800', '$540', '$1120', '$760'] ).map((v, i) => {v} )}
LIVE
); } // --- VARIANT 2: BOLD — огромный заголовок-монолит сверху, композиция снизу --- function HeroBold() { return (
{/* Meta row */}
NEW vibecode/autоmatizator.mdx поток #2 · 7 мест из 10 scroll ↓ or press Space
{/* Mega heading */}

INTGRTR 2.0 NEW LEVEL </>

{/* Three-column: expert | subtitle/cta | code */}
{/* Expert */}
{/* Center — subtitle + CTA */}
// README.md

Получи самый востребованный навык автоматизаций через вайбкодинг и зарабатывай на этом от $1000, без знаний программирования.

Начать обучение
горячая клавиша
{/* Code column */}
your_first_project.vibe
/* твой путь в автоматизацию */ import {'{ agent, money }'} from 'vibecode'   const you = newLevel({'{'} skill: 'vibe-coding', experience: 0, // любой уровень goal: '$1000+/mo' {'}'})   await you.ship() ✓ first client in 2 weeks
compiled successfully +$1200 avg
{/* Bottom: stats + marquee */}
{[ ['1000+', 'учеников выпустили'], ['$500', 'средний чек на первом проекте'], ['17', 'модулей · от нуля до продаж'], ['12 мес', 'доступа и поддержки']]. map(([n, l], i) =>
{n}
{l}
)}
); } Object.assign(window, { HeroClassic, HeroBold, ExpertPhoto, CodeLine, syn });