/* Cases, Process, Prices, Limits, FAQ, Contact, Footer */ const CASES = [ { cat: 'SEO · структура', time: '2 рабочих дня', title: 'Техническая чистка статейного раздела и возврат индексации', problem: 'У контентного раздела были дубли, спорные canonical, лишние страницы в индексе и рассыпавшаяся логика sitemap после доработок шаблона.', result: 'Индексация стала чище, редакция получила понятную схему публикации, а новые статьи перестали плодить технический шум.', }, { cat: 'Сервер · деплой', time: '1 рабочий день', title: 'Запуск Python-приложения на VPS с HTTPS и Docker', problem: 'Приложение стартовало нестабильно, было доступно только по IP и не имело понятной схемы деплоя для дальнейших обновлений.', result: 'Проект доступен по домену с HTTPS, обновления перестали быть хаотичными, серверная схема стала понятной для дальнейшей поддержки.', }, { cat: 'PHP · формы', time: 'несколько часов', title: 'Восстановление формы отзывов и email-уведомлений', problem: 'Форма периодически ломалась, часть заявок терялась, а менеджер не получал уведомления о новых сообщениях.', result: 'Форма снова стала рабочим каналом получения обращений, ошибки стало проще диагностировать и не пропускать.', }, { cat: 'Производительность · backend', time: '1–2 дня', title: 'Оптимизация логики корзины на PHP/MySQL', problem: 'Корзина тормозила на большом числе позиций, при пересчёте количества давала сбои и лишние SQL-операции.', result: 'Корзина заметно стабильнее и быстрее в типовых сценариях, обновление состава перестало ломать пользовательский поток.', }, { cat: 'Разметка · SEO', time: '1 рабочий день', title: 'Настройка sitemap и JSON-LD для сайта услуг', problem: 'У сайта не было актуальной карты страниц и валидной schema.org-разметки для услуг, организации и хлебных крошек.', result: 'Страницы стали понятнее для поисковых систем, у владельца появился предсказуемый технический базис для дальнейшего роста.', }, { cat: 'API · интеграции', time: '3 рабочих дня', title: 'Заявки с сайта в CRM и Telegram без потерь', problem: 'Заявки терялись в почте, менеджер не успевал, часть писем уходила в спам, в CRM попадали не все обращения.', result: 'Каждая заявка приходит в Telegram-чат и в CRM в режиме реального времени, ничего не теряется, есть журнал событий.', }, ]; function plainText(value, fallback = '') { const source = value || fallback || ''; if (!source) return ''; const tmp = document.createElement('div'); tmp.innerHTML = source; return (tmp.textContent || tmp.innerText || source).trim(); } function Cases() { const publicCases = window.__PUBLIC_DATA__?.cases; const items = publicCases?.length ? publicCases.map((c) => ({ cat: c.category, time: c.timeline, title: c.title, problem: plainText(c.problem_html, c.problem), result: plainText(c.result_html, c.result), href: c.href || `/cases/${c.slug}/`, })) : CASES.map((c) => ({ ...c, href: '#cases' })); return (
// примеры задач Кейсы · что обычно нужно починить Это не «маркетинг под ключ с гарантиями позиций», а понятные примеры того, какие технические задачи можно решить точечно. У каждого кейса виден исходный симптом и итог.
{items.map((c, i) => (
{c.cat} {c.time}

{c.title}

FROM

{c.problem}

TO

{c.result}

))}
); } /* ========== Process ========== */ function Process() { const steps = [ { n: '01', t: 'Вы описываете задачу', d: 'Коротко рассказываете, что нужно исправить или запустить. Можно прислать скриншот, ссылку, текст ошибки.' }, { n: '02', t: 'Я оцениваю объём', d: 'Если задача понятная — называю стоимость и срок. Если нет — задам уточняющие вопросы.' }, { n: '03', t: 'Выполняю работу', d: 'Исправляю ошибку, настраиваю сайт, сервер или интеграцию. Показываю промежуточные результаты.' }, { n: '04', t: 'Передаю результат', d: 'Что сделано, что проверить, что улучшить дальше. Короткие рекомендации в свободной форме.' }, ]; return (
// как проходит работа Простой рабочий процесс Без брифов на десять страниц. Один разговор, понятная оценка, спокойная работа. {steps.map((s, i) => (
{s.n} step

{s.t}

{s.d}

))}
); } /* ========== Prices ========== */ const PRICES = [ { name: 'Технический SEO-аудит', desc: 'мини-аудит / расширенный аудит с приоритетами', from: '2 000', to: '4 990' }, { name: 'Микроразметка schema.org', desc: 'одна страница / расширенная настройка для каталога', from: '2 500', to: '7 990' }, { name: 'Карта сайта, robots, canonical', desc: 'правильная структура для индексации', from: '2 500', to: null }, { name: 'Доработка PHP/MySQL-сайтов', desc: 'формы, запросы, админки, старые сайты', from: '3 000', to: null }, { name: 'VPS · Docker · Nginx · SSL', desc: 'базовый запуск / стандарт с Docker / с бэкапом и инструкцией', from: '4 000', to: '12 000' }, { name: 'API-интеграции и автоматизация', desc: 'CRM, Telegram, выгрузки, импорты', from: '15 000', to: null }, { name: 'Готовые сайты и шаблоны', desc: 'лендинги, статейники, каталоги с админкой', from: '19 990', to: null }, ]; function Prices({ setRoute }) { return (
// стартовые ориентиры Цены от — без скрытых строк Финальная цена зависит от объёма. На созвоне или в переписке всегда называю конкретную сумму до старта. {PRICES.map((p, i) => (
{p.name}
{p.desc}
от{p.from}{p.to && — {p.to}} ₽
))}
); } /* ========== Limits ========== */ function Limits() { const no = [ 'продвижение под ключ с гарантиями позиций', 'рекламу и закупку ссылок', 'большие проекты без предварительной оценки', 'поддержку 24/7', 'срочные аварийные работы без доступа к логам', 'восстановление после взлома без отдельной оценки', ]; const yes = [ 'диагностика, аудит, точечный фикс', 'разовая настройка сервера с инструкцией', 'интеграция с конкретной CRM или мессенджером', 'оптимизация одного узкого места', 'микроразметка под конкретные страницы', 'консультация по коду / стеку', ]; return (
// ограничения Что входит и что нет Прозрачно: вот форматы, в которых я работаю хорошо, и вот те, в которые лучше не идти — чтобы не разочаровать ни вас, ни себя.

✓ хорошо подходит

    {yes.map((t, i) =>
  • +{t}
  • )}

✗ не мой формат

    {no.map((t, i) =>
  • {t}
  • )}
); } /* ========== FAQ ========== */ const FAQ = [ { q: 'Можно ли начать с одной небольшой задачи?', a: 'Да, это самый частый формат. Один аудит, одна форма, одна ошибка или один модуль. Так и заказчику спокойнее, и я быстрее понимаю проект.' }, { q: 'Работаете только с новыми проектами?', a: 'Нет. Часто прихожу к старым самописным сайтам, где нужно разобраться в текущем коде, найти причину ошибки и аккуратно починить — без переписывания всего.' }, { q: 'Что нужно для старта?', a: 'Краткое описание задачи, ссылка на сайт, доступы (при необходимости — FTP/панель/SSH), ожидание по срочности. Если есть скриншоты или текст ошибки — ещё лучше.' }, { q: 'Как происходит оплата?', a: 'Можно напрямую — по реквизитам или на карту, акт по запросу. Можно через безопасную сделку на фриланс-площадке — комфортнее, если работаем впервые.' }, { q: 'Даёте ли гарантии на работу?', a: 'На точечную задачу — да: если в течение 14 дней что-то сломалось из того, что я делал, чиню бесплатно. На SEO-позиции в выдаче гарантий не даю — это нечестно.' }, { q: 'Подписываете NDA?', a: 'Да, без проблем. Чаще всего это и не нужно — но если у вас принято, подпишу до получения доступов.' }, ]; function FaqSection() { const [open, setOpen] = React.useState(0); return (
// частые вопросы FAQ · что обычно спрашивают {FAQ.map((f, i) => (

{f.a}

))}
); } window.Cases = Cases; window.Process = Process; window.Prices = Prices; window.Limits = Limits; window.FaqSection = FaqSection;