// FAQ + финальный CTA + футер const TG_LINK = @ai_mng; const FAQ = [ { q: 'В каком формате будут уроки?', a: 'Ты получишь доступ к платформе с уроками в записи — смотри в любое удобное время, пересматривай сколько нужно. Групповые созвоны проходят онлайн раз в две недели, записи приходят в чат. На про- и vip-тарифах есть личная обратная связь по твоим работам — присылаешь, получаешь разбор.' }, { q: 'На какое время у меня будет доступ?', a: '12 месяцев с момента старта — ко всем урокам, материалам и чату потока. За это время ты успеешь пройти программу 2–3 раза, если захочешь возвращаться к сложным модулям. На vip-тарифе доступ бессрочный.' }, { q: 'Если я новичок и никогда не писал код — мне подойдёт?', a: 'Да, программа построена с нуля. В m01 мы ставим софт и знакомимся с агентом, в m02 учимся ему правильно объяснять задачи. Кода ты руками писать не будешь — ты учишься управлять моделью, а не печатать символы. Главное условие — умение пользоваться компьютером и желание разбираться. Никакой математики, никаких алгоритмов.' }, { q: 'А если я уже опытный — не будет ли скучно?', a: 'Не будет. Модули с m12 (vibecode-pro) — про продвинутую сборку AI-агентов, интеграции с CRM, базы знаний, мультиязычные сценарии. Это уровень, на котором сейчас не работает 90% разработчиков. Плюс — на vip-тарифе мы строим программу под твой опыт: если базу ты знаешь, мы пропускаем m01–m05 и идём сразу в продвинутые модули и стратегию масштабирования.' }, { q: 'Из каких стран есть оплата и можно ли в рассрочку?', a: 'Оплата — из любой страны мира. Рассрочка 0% × 12–24 месяца через банки-партнёры доступна в России, Казахстане, Беларуси. Для остального мира (США, ЕС, ОАЭ, Узбекистан, Украина, Кыргызстан, Грузия, Армения и др.) — внутренняя рассрочка от школы до 3 месяцев в USD/EUR, без банков и скоринга. Оформление заявки — 5 минут онлайн.' }, { q: 'Сколько ещё нужно будет вложений кроме курса?', a: 'Минимум. Подписка на Claude — $20/мес. Хостинг для первых проектов — бесплатный (Vercel, Railway free tier). Домен по желанию — $10–15 в год. Итого: $20–30 в месяц на инструменты. Ни компьютера мощного, ни лицензий, ни платного софта. Всё, что нужно для первых клиентов — ты можешь запустить в первый месяц обучения.' }, { q: 'А вдруг через год AI станет настолько умным, что эта профессия уйдёт?', a: 'Наоборот. Чем мощнее становятся модели — тем больше людей и компаний хотят их встроить в свои процессы, но сами не знают как. Ты учишься быть переводчиком между бизнесом и AI: понимать задачу клиента, разбивать на шаги, собирать решение через агента. Это навык, который дорожает, а не дешевеет. Программа обновляется каждый поток — мы добавляем то, что появилось в индустрии за последние месяцы.' }, { q: 'Сколько времени в неделю это займёт?', a: 'Комфортный темп — 5–7 часов в неделю: 2–3 часа на уроки и 3–4 часа на практику. Если хочешь идти быстрее — можно вкладывать 10–12 часов и пройти программу за 2–2.5 месяца вместо 4. Медленнее тоже можно — доступ 12 месяцев, у тебя есть время. Большинство учеников учатся параллельно с основной работой.' }, { q: 'А если я не найду клиентов после курса?', a: 'В m11 — целый модуль про поиск клиентов и продажи. Где искать, что писать, как считать чек, как вести переговоры. На про- и vip-тарифах куратор разбирает твою воронку и первые сделки — помогает докрутить оффер, скрипты, цены. В работах учеников ты видишь реальные кейсы: ребята находят клиентов через свой telegram, instagram, kwork, upwork, через знакомых. Ниша широкая — у любого малого бизнеса сейчас задача "встроить AI", и они готовы платить.' }, { q: 'Чем это отличается от других курсов по AI и no-code?', a: 'Три вещи. Первое: программа фокусируется не на одном инструменте (как «курс по make» или «курс по zapier»), а на подходе — ты учишься собирать что угодно через диалог с моделью. Второе: поток на 10 человек, а не 500 — каждого видно, у каждого есть обратная связь. Третье: к концу программы у тебя в портфолио собранный с нуля проект, который можно показывать клиентам и который реально работает в интернете.' }, { q: 'Можно посмотреть один урок или фрагмент бесплатно?', a: <>Да. Напиши менеджеру в telegram — {TG_LINK} — пришлём демо-урок из m02 (про общение с агентом) и пример практического задания. Так ты поймёшь формат и стиль до того, как принять решение. }]; function FAQItem({ item, i, open, onToggle }) { return (
{open &&
{item.a}
уточнить условия → @ai_mng
}
); } function FAQSection() { const [open, setOpen] = React.useState(0); return (
{FAQ.map((f, i) => setOpen(open === i ? -1 : i)} /> )}
); } // Keycap 1:1 with reference photo: pillow-shape white keys with a soft drop // shadow underneath (the key looks like it's floating above the board), // label centered, matte face with a gentle top-to-bottom gradient. // The orange spacebar uses the same geometry but in a warm red-orange. function KeyCap({ c, label, width = 64, height = 64, orange, onClick, href, glow, glowDelay = 0, forcePressed = false, autoGlow = false }) { const [pressed, setPressed] = React.useState(false); const [hover, setHover] = React.useState(false); const isOrange = !!orange; const text = label || c || ''; const isPressed = pressed || forcePressed; const letterGlow = glow || autoGlow; // Palette — frosted glass keycaps; orange = yellow highlight button const faceGrad = isOrange ? 'linear-gradient(180deg, rgba(255,225,70,0.92) 0%, rgba(255,200,20,0.95) 55%, rgba(220,160,10,0.98) 100%)' : 'linear-gradient(180deg, rgba(255,255,255,0.22) 0%, rgba(255,255,255,0.10) 55%, rgba(255,255,255,0.06) 100%)'; const textColor = isOrange ? '#1a1200' : letterGlow ? '#3ee08a' : '#f2f2f4'; const radius = Math.min(width, height) * 0.28; const click = (e) => { setPressed(true); setTimeout(() => setPressed(false), 140); if (onClick) onClick(e); if (href) { if (href.startsWith('#')) { const el = document.querySelector(href); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { window.open(href, '_blank', 'noopener'); } } }; const translate = isPressed ? 3 : hover ? 2 : 0; // hover shadow compression matches real keyboard feel const shadowCompress = isPressed ? 0.4 : hover ? 0.6 : 1; // Text sizing: smaller for single letters (they live on a smaller area), larger for labels const fontSize = label ? Math.min(height * 0.26, 17) : Math.min(height * 0.24, 15); return (
setPressed(true)} onMouseUp={() => setPressed(false)} onMouseEnter={() => setHover(true)} onMouseLeave={() => {setHover(false);setPressed(false);}} onClick={click} role="button" aria-label={text} style={{ position: 'relative', width, height, flexShrink: 0, cursor: 'pointer', userSelect: 'none' }}> {/* Soft drop shadow pool under the key — gives the 'floating pillow' look */}
{/* Key face — frosted glass */}
{/* specular highlight streak */}
{text}
); } function Keyboard() { // Responsive sizing const [scale, setScale] = React.useState(1); React.useEffect(() => { const compute = () => { const w = window.innerWidth; if (w < 480) setScale(0.55);else if (w < 768) setScale(0.72);else if (w < 1100) setScale(0.85);else setScale(1); }; compute(); window.addEventListener('resize', compute); return () => window.removeEventListener('resize', compute); }, []); // Auto-type animation: types "intgrtr vibecd 2.0" char by char in a terminal // line above, and simultaneously lights up the corresponding key on the keyboard. // Letters scattered across the keyboard — no duplicates. // 2, . and 0 each get their own key. const row1 = ['R', 'T', 'I', 'N', 'G', 'V', 'B']; const row2 = ['E', 'C', 'D', '2', '.', '0']; // Typing order "intgrtr vibecd 2.0" mapped to unique key positions. const sequence = React.useMemo(() => [ { ch: 'i', id: 'r1-2' }, { ch: 'n', id: 'r1-3' }, { ch: 't', id: 'r1-1' }, { ch: 'g', id: 'r1-4' }, { ch: 'r', id: 'r1-0' }, { ch: 't', id: 'r1-1' }, { ch: 'r', id: 'r1-0' }, { ch: ' ', id: null }, { ch: 'v', id: 'r1-5' }, { ch: 'i', id: 'r1-2' }, { ch: 'b', id: 'r1-6' }, { ch: 'e', id: 'r2-0' }, { ch: 'c', id: 'r2-1' }, { ch: 'd', id: 'r2-2' }, { ch: ' ', id: null }, { ch: '2', id: 'r2-3' }, { ch: '.', id: 'r2-4' }, { ch: '0', id: 'r2-5' }], []); const [pressedSet, setPressedSet] = React.useState(() => new Set()); const [typed, setTyped] = React.useState(''); React.useEffect(() => { let cancelled = false; let timers = []; const clearAll = () => {timers.forEach(clearTimeout);timers = [];}; const addTimer = (fn, ms) => {const t = setTimeout(fn, ms);timers.push(t);return t;}; const pressKey = (id) => { if (!id) return; setPressedSet((s) => {const n = new Set(s);n.add(id);return n;}); addTimer(() => { setPressedSet((s) => {const n = new Set(s);n.delete(id);return n;}); }, 180 + Math.random() * 80); }; const loop = () => { if (cancelled) return; setTyped(''); let i = 0; const typeNext = () => { if (cancelled) return; if (i >= sequence.length) { // full string typed — pause, then clear and loop addTimer(() => { if (cancelled) return; setTyped(''); addTimer(loop, 500); }, 1400); return; } const step = sequence[i++]; setTyped((t) => t + step.ch); pressKey(step.id); // pacing: space is a tiny pause, regular char = fast, "2.0" slightly longer const delay = step.ch === ' ' ? 160 : step.ch === '2.0' ? 260 : 90 + Math.random() * 60; addTimer(typeNext, delay); }; typeNext(); }; const start = addTimer(loop, 400); return () => {cancelled = true;clearAll();}; // eslint-disable-next-line }, []); const kb = (n) => Math.round(n * scale); const keyH = kb(62); const gap = kb(8); const unit = kb(62); // standard 1u key width // Actions const scrollTo = (sel) => () => { const el = document.querySelector(sel); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); }; const openTG = () => window.open('https://t.me/ai_mng', '_blank', 'noopener'); // Layout: // Row 1: 7 буквенных клавиш — INTGRTR // Row 2: 6 букв VIBECD + "2.0" (все ширины unit) // Row 3: ПРОГРАММА (wide) + НАЧАТЬ (orange, остаток) const totalRow1 = unit * 7 + gap * 6; const row3Wide = unit * 2.5 + gap * 1.5; const row3Huge = totalRow1 - row3Wide - gap; // Terminal line dimensions — match keyboard width const kbWidth = totalRow1 + kb(44); // inner width + horizontal padding (22*2) return (
{/* Terminal line */}
$ {typed}
{/* inner rim */}
{/* Row 1 */}
{row1.map((ch, i) => { const id = `r1-${i}`; const down = pressedSet.has(id); return ; })}
{/* Row 2 — offset slightly right like a real keyboard stagger */}
{row2.map((ch, i) => { const id = `r2-${i}`; const down = pressedSet.has(id); return ; })}
{/* Row 3 — action keys */}
); } function FinalCTA() { const openTG = () => window.open('https://t.me/ai_mng', '_blank', 'noopener'); return (

ты со мной?

залетаю на обуч
); } function Footer() { const linkStyle = { color: 'var(--fg-dim)', textDecoration: 'underline', textDecorationColor: 'var(--line-2)', textDecorationThickness: '1px', textUnderlineOffset: '3px', transition: 'color .15s, text-decoration-color .15s' }; const onHover = (e, on) => { e.currentTarget.style.color = on ? 'var(--yellow)' : 'var(--fg-dim)'; e.currentTarget.style.textDecorationColor = on ? 'var(--yellow)' : 'var(--line-2)'; }; return ( ); } function StatusBar() { const [t, setT] = React.useState('—'); React.useEffect(() => { const id = setInterval(() => { const d = new Date(); setT(`${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`); }, 1000); return () => clearInterval(id); }, []); return (
● READY | поток #2 | 7/10 мест | UTF-8 Ln 1, Col 1 | {t}
); } Object.assign(window, { FAQSection, FinalCTA, Footer, StatusBar });