Орientируется на Дарью 35-45, soft orange (как голова робота), photo-emotion вместо эффектов
Используются Bootstrap Icons (как и должно быть в production). Никаких эмодзи.
Не дизайнерская, а маркетинговая. Дизайн = инструмент конверсии.
#ec9b44 (голова робота), не #ec9b44. Hard orange = «реклама»; soft = «премиум».
border 1.5px orange вместо bg orange.
Soft orange (#ec9b44 — как голова робота) + navy + neutrals + 1 success accent.
Текущий #ec9b44 остаётся как алиас для совместимости, но в новых компонентах используем #ec9b44 (50950 шкала выше).
«Реклама», агрессивно, крикливо
«Премиум», спокойно, как у Apple/Stripe
Mobile-first шкала. На десктопе — те же размеры × 1.2-1.5.
Минимум на мобилке: 16px для body. Меньше — только caption/label/disclaimer.
3 уровня + правило: fill ТОЛЬКО для primary CTA. Остальное — outline/ghost.
Soft orange fill. Только для конверсии.
Outline orange + text dark.
Лёгкий border, для tertiary actions.
Каждый блок имеет тип. Info = navy/white, без orange. Conv = soft orange accent.
Правило: 1 главная точка внимания на блок. Если 2 — глаз прыгает, конверсия падает.
| Блок | Главная точка | Чем привлекаем | Что НЕ должно конкурировать |
|---|---|---|---|
| Hero | Лицо мальчика + Phone в header | Эмоция фото + soft orange phone | Никаких других orange акцентов |
| Age picker | 4 кнопки возраста | Soft orange ring/border | Никаких баннеров рядом |
| Shifts | Цена + «Выбрать» | Bold price + soft orange CTA | Не выделять иконки rating ярко |
| Reviews | rating + лица | Yellow stars + photo | Не делать orange CTA «Все отзывы» |
| About | 3 ключевых факта | Bold цифры (navy, не orange) | Никаких CTA |
| FAQ | Список вопросов | Tight typography, читаемость | Никаких иллюстраций |
| BookingBar | Phone number + Submit | Phone bold + soft orange button | Не делать форму с 5 полями |
| Footer | Контакты | Phone, email, адрес | Не дублировать CTA |
Mobile-first: сначала проектируем 390px, затем upscale до 1280px+.
| Параметр | Mobile (≤768px) | Desktop (≥1024px) |
|---|---|---|
| Hero H1 | 38px / 800 / -0.03em | 56px / 800 / -0.04em |
| Section H2 | 26px | 36px |
| Body | 16px (мин!) | 16px (тот же — читаемость) |
| Section padding | 40px (py-10) | 64px (py-16) |
| Container max-width | full width | 1280px (max-w-[1280px]) |
| Cards в row | 1 col (stacked) | 2-3 cols (grid) |
| Header CTA | Phone icon + burger | Phone full + nav-links + CTA |
| Hero photo | Full bleed bg, soft mask | Right column 50%, left text |
| Touch target | 44×44 min | 32×32 ok (mouse) |
Каждый блок должен быть оптимизирован под Google/Yandex (SEO), AI-search (Perplexity/ChatGPT — GEO) и featured snippets (AEO).
| Блок | Schema type | Что внутри |
|---|---|---|
| Header / Footer | Organization + LocalBusiness | name, url, logo, telephone, address, sameAs (соцсети), aggregateRating |
| Hero | WebPage + BreadcrumbList | name, description, primaryImageOfPage, breadcrumbs |
| Shifts (программы) | Course + Offer | name, description, provider, offers (price, priceCurrency, availability, validFrom/validThrough) |
| Reviews | Review + AggregateRating | author, reviewBody, reviewRating, datePublished — minimum 5 reviews для rich snippet |
| FAQ | FAQPage | mainEntity[] с Question/Answer — для Google FAQ rich snippet |
| Mentors / Team | Person | name, jobTitle, image, sameAs |
| Articles (блог) | Article + Person author | headline, datePublished, dateModified, author, image, articleSection |
| Stay / Размещение | Place + LodgingBusiness | name, address, geo, amenityFeature |
| Contacts | ContactPoint | telephone, email, contactType, areaServed, availableLanguage |
| Tag | Правила | Пример |
|---|---|---|
| title | 50-65 chars, ключ + бренд | Летний IT-лагерь в Подмосковье 2026 — АйДаКемп |
| description | 140-160 chars, USP + цена + CTA | Программирование, AI, бассейн. Смены с 30 мая. От 48 000 ₽. Налоговый вычет 13%. |
| canonical | Абсолютный URL, без trailing slash mismatch | <link rel="canonical" href="https://aidacamp.ru/" /> |
| og:image | 1200×630 webp, под 100kB | /images/og-default.webp |
| og:title / og:description | Может отличаться от meta для соцсетей | — |
| twitter:card | summary_large_image | — |
| robots | index,follow для всех публичных. noindex для /demo/, /admin/ | — |
| html lang | ru | <html lang="ru"> |
| Тег | Сколько | Что внутри |
|---|---|---|
| H1 | 1 на страницу (НЕ больше) | Главное ключевое слово + описание услуги: «Летний IT-лагерь в Подмосковье 2026» |
| H2 | 5-10 на страницу | Названия секций: «Как проходит смена», «Отзывы», «FAQ» — должны содержать LSI-ключи |
| H3 | 10-30 | Подсекции, заголовки карточек смен/отзывов/FAQ-вопросов |
Mobile + Desktop hero — оба H1 в потоке (visible по соответствующему breakpoint). НЕ скакать через уровень (H1 H3 без H2).
| Правило | Что |
|---|---|
| Format priority | AVIF WebP JPEG fallback (через <picture>) |
| Hero LCP image | loading="eager" fetchpriority="high" + <link rel="preload"> |
| Below-fold images | loading="lazy" decoding="async" |
| Alt text | Все meaningful images. Декоративные — alt="" + aria-hidden="true" |
| Width/height | Обязательно для предотвращения CLS |
| Srcset для responsive | Минимум 2 размера: -600w и -900w |
| Alt example | alt="Дети программируют на занятии в IT-лагере АйДаКемп, лето 2026" — описание + ключи |
RelatedPages компонент).
| Контекст | Куда вести |
|---|---|
| Hero CTA | #shifts — выбор смены |
| В тексте «программирование» | /programmirovanie-dlya-detei/ |
| В тексте «возраст 12 лет» | /it-lager-12-let/ |
| FAQ ответы | На статьи /stati/ и спец. landing |
| Footer | Карта сайта, политики, документы |
| Метрика | Цель Google | Наш SLA |
|---|---|---|
| LCP (Largest Contentful Paint) | < 2.5s | < 2.0s — hero photo preload |
| INP (Interaction to Next Paint) | < 200ms | < 150ms — нет тяжёлых JS |
| CLS (Cumulative Layout Shift) | < 0.1 | < 0.05 — все img с width/height |
| TTFB | < 0.8s | SSR на VPS, nginx с brotli |
Person author в Schema.org + видимый автор в HTMLdateModified на статьях (AI предпочитает свежие)| Тип snippet | Как попадаем |
|---|---|
| Paragraph snippet | Прямой ответ в 40-60 словах сразу под H2-вопросом |
| List snippet | Нумерованный/маркированный список под вопросом «Как…» |
| Table snippet | HTML <table> для сравнений (цены смен, возрастные группы) |
| Video snippet | YouTube embed + VideoObject Schema с transcript |
| FAQ Schema rich snippet | Только если > 4 вопросов с реальными ответами |
| People Also Ask | Включаем в FAQ типичные «А правда что…», «Можно ли…», «Как…» |
| Файл | Что должно быть |
|---|---|
| robots.txt | Allow: /, Disallow: /demo/, /admin/, /api/. Sitemap: /sitemap.xml |
| sitemap.xml | Auto-generated через @astrojs/sitemap. Все public pages с lastmod |
| 404.html | Custom + ссылки на главные страницы |
| htaccess / nginx | 301 redirects старых URL, brotli/gzip compression |
| hreflang | Не нужен (только ru) |
| IndexNow | API ping в Yandex/Bing при добавлении новых страниц |
Воронка за 30 дней: 2827 человек вошли в hero 692 (24%) выбрали возраст 6 (0.2%) отправили форму. Перестраиваем block order под реальное поведение.
| Действие | Reaches | % от entered | Тип |
|---|---|---|---|
| Scroll 25% (entered hero) | 2827 | 100% | baseline |
| Scroll 90% (full view) | 1445 | 51% | engagement |
| Выбор возраста | 692 | 24% | conv #1 — главная цель оптимизации |
| Открыл инфо о смене | 221 | 7% | conv #2 |
| Посмотреть смены | 185 | 6% | conv #3 |
| «Выбрать смену» | 115 | 4% | conv #4 |
| Нижняя плашка возраста | 76 | 3% | conv #5 |
| FAQ открыто | 74 | 2% | info high |
| Открытие фото | 60 | 2% | info |
| Клик телефон (auto+manual) | 48 | 1.7% | conv #6 |
| Открытие видео | 25 | 0.9% | info low |
| Отправка заявки | 6 | 0.2% | conv DEAD |
| Videos | 0.9% conv. Если нет, освобождаем место для важного |
| BookingBar #2 (дубль) | Один достаточно. Дублирование = распределение клика 50/50 |
| Mentors отдельно от Team | Объединить — оба про людей, экономия скролла |
| SoftStart, SummerCta, Hackathon | Под вопросом — измерять отдельно. Возможно объединить в 1 блок «что в смене» |
Каждое действие = trackable goal. Без событий — нет данных для оптимизации Директа/VK.
| Цель | ID | Что отслеживает | Где навешано |
|---|---|---|---|
| Выбор возраста-new | 541048270 | Главная цель оптимизации Директа | Age picker (4 кнопки), Нижняя плашка |
| Открыл инфо о смене | — | Клик карточки смены | Shifts cards |
| Посмотреть смены | — | Клик «Подробнее» | Shifts |
| Кнопка «Выбрать смену» | — | Финальное действие | Shifts CTA |
| Открытие FAQ-new | — | Клик аккордеона | FAQ |
| Открытие видео-new / фото-new | — | Lightbox open | Gallery / Videos |
| Автоцель: клик по номеру телефона | auto | Любой tel: link | Header, Footer, BookingBar |
{Действие}-{Контекст}-{Версия}. Пример: «Клик-БотCTA-v3», «Открытие-AgePopup-v2». Версия меняется при изменении дизайна — старые данные сохраняются.
data-analytics-goal="goal_name" атрибутdata-analytics-label="context" для сегментацииЯзык — главный носитель ощущения «я хорошая мама». Каждое слово работает на это.
| Параметр | Уровень | Пояснение |
|---|---|---|
| Формальность | Низкая | На «вы», но как подруга, не как банк |
| Эмоциональность | Средняя | Тёплая забота, без слащавости |
| Юмор | Лёгкий | Уместная ирония, никогда сарказм |
| Экспертность | Скрытая | Не говорим «эксперты», показываем фактами |
| Срочность | Точечная | «Осталось 14 мест», но не «СПЕШИТЕ!!» |
| Назидание | Запрещено | Никогда не учим маму как воспитывать |
Принцип Пивоварова: «Решение всегда остаётся за вами. Мы посоветуем, расскажем, поможем — но выбор ваш. Мы вас за это ценим». Не давим, не звонят, не торопим — уважаем взрослого человека.
| Контекст | Шаблон |
|---|---|
| CTA primary | «Глагол + объект» — «Выбрать смену», «Узнать цены», «Спросить про…» |
| CTA secondary | Подтверждение действия — «Узнать больше», «Посмотреть фото» |
| Form labels | Что-нужно-сделать вместо что-это-такое: «Как вас зовут?» вместо «Имя*» |
| Error messages | «Похоже, телефон не записался — проверим?» вместо «Ошибка: invalid input» |
| Empty states | «Тут пока пусто — посмотрите смены лета 2026» вместо «No data» |
| Loading | «Считаем места…» вместо «Loading…» |
| Confirmation | «Отлично! Перезвоним за 10 минут» вместо «Спасибо, заявка принята» |
«безусловно», «качественный», «настоящий», «каждый ребёнок», «современный», «инновационный», «гарантия», «эксклюзивный», «уникальный», «лидер», «топовый» — все эти слова сигнализируют о слабом продукте.
a11y = accessibility (a + 11 букв + y = «доступность»). Сайт должен работать для людей с инвалидностью: слабовидящих, слепых, моторных нарушений.
| Критерий | Что значит | Как проверить |
|---|---|---|
| Contrast 4.5:1 | Обычный текст должен иметь контраст ≥4.5:1 с фоном | WebAIM Color Checker |
| Contrast 3:1 | Большой текст (18px+ или 14px+ bold) — минимум 3:1 | Тоже WebAIM |
| Touch targets 44×44 | Кнопки на мобиле минимум 44×44px (Apple HIG) | Просто измерить |
| Alt text | Все meaningful images имеют alt | Lighthouse a11y audit |
| Focus visible | Tab по клавиатуре подсвечивает элемент | Tab в браузере |
| aria-label | Кнопки только с иконкой имеют aria-label | Code review |
| Form labels | Каждый input имеет связанный | Lighthouse |
| Heading hierarchy | H1 H2 H3 без перескоков | headingsMap extension |
| Lang attribute | <html lang="ru"> | View source |
| Reduced motion | Уважать prefers-reduced-motion | System preference тест |
text-white/35, text-white/45 — контраст FAIL (исправлено в DESIGN_SYSTEM.md, но не везде в коде)Принцип: анимация работает на UX (даёт feedback, обозначает состояние), а не на «красиво».
| Где | Что | Длительность |
|---|---|---|
| Hover на кнопках | Tailwind hover:-translate-y-[1px] + shadow | 200ms ease-out |
| Active на кнопках | active:translate-y-0 + opacity 0.9 | 100ms |
| Открытие FAQ accordion | height 0 auto + chevron rotate 180° | 250ms ease-in-out |
| Modal появление | opacity 01 + scale(0.951) + backdrop fade | 200ms |
| Fade-in при scroll | IntersectionObserver, opacity 01 + translateY 120 | 400ms ease-out |
| Cycling text в боте | opacity 01 со сменой слова | 200ms, цикл 2.2s |
| Pulse на «Запись открыта» | opacity 0.6↔1 + scale(1↔1.3) | 1.5s infinite, но ТОЛЬКО 1 элемент |
| Animatable properties | Только transform (translate/scale/rotate) и opacity |
| FPS target | 60 FPS на iPhone SE 1st gen (8 лет старого устройства) |
| Длительность | 150-300ms для micro, 400-600ms для большие переходы |
| Easing | ease-out для появления, ease-in-out для toggle |
| prefers-reduced-motion | Все анимации respect @media (prefers-reduced-motion: reduce) и отключаются для пользователей с настройкой «уменьшать движение» в системе |
3 штуки которые отличают нас от 100 других лагерей. Везде и всегда.
| USP | Где | Как |
|---|---|---|
| Отрыв от телефонов | Hero subtitle, About, отдельный блок «Наша философия», в FAQ | Не «без телефонов» (звучит как наказание), а «другая сторона» (звучит как опыт) |
| Налоговый вычет | Hero (микро-метка), Shifts (под ценой), Economy (отдельный блок), FAQ | Конкретные суммы по сменам: ~2 800 / 4 800 / 5 434 ₽ |
| AI-проект | Hero subtitle, Journey, Hackathon (что в финале) | Показывать реальные проекты прошлых смен с фото/видео |
Каждый блок заканчивается крючком — вопросом, который заставляет идти дальше. Цель: чтобы мама не остановилась, а проскользнула до конца.
Принцип Пивоварова: просто называем что дальше. Без «Сомневаетесь?», «А вы знали?», «Хотите узнать?». Прямая коммуникация — взрослые сами решат идти или нет.
| Блок | Заканчивается на | Ведёт к |
|---|---|---|
| Hero | Возраст ребёнка | Age picker |
| Age picker | Подходящие смены | Shifts (filtered) |
| Shifts | Как проходит день в смене | Journey |
| Journey | Хакатон в финале смены | Hackathon / About |
| About | Команда и менторы | Team+Mentors |
| Team+Mentors | Размещение и безопасность | Stay + Trust |
| Stay+Trust | Отзывы родителей | Reviews |
| Reviews | Стоимость и налоговый вычет | Economy |
| Economy | Частые вопросы | FAQ |
| FAQ | Не нашли ответ — спросите анонимно | Anon Q&A CTA |
| Путь | Сценарий | Длина |
|---|---|---|
| 1. Быстрый (~24% — главный) | Hero Age picker Shifts Звонок | 3-4 экрана, 1-2 минуты |
| 2. Глубокий (~7%) | Hero Age Shifts Journey Reviews FAQ Звонок | 10-15 минут |
| 3. Параноик (~3%) | Hero Все блоки FAQ Анон бот Яндекс.Карты Звонок мужу | 2-3 сессии |
Сейчас в меню часть пунктов важных, часть нет, и не все блоки представлены. Пересобираем по приоритетам.
| Пункт | Есть в меню? | Нужен? |
|---|---|---|
| О лагере | Да | Да |
| Смены | Да | Да |
| Фото | Да | На отдельную страницу |
| Как проходит смена | Да (под more) | Да |
| Видео | Да (под more) | На отдельную страницу + редко |
| Отзывы | Да | Да |
| FAQ | Да | Да |
| Команда | Да | Да (с менторами вместе) |
| Размещение | Да | Да |
| Контакты | Да | Да |
| Цены / Налоговый вычет | НЕТ | Должно быть! |
| Философия / Без телефонов | НЕТ | Должно быть! USP #1 |
| Документы / Лицензия | НЕТ | Должно быть (страх безопасности) |
| Поиск по сайту | НЕТ | Полезно для глубокого пути |
| Уровень | Пункты |
|---|---|
| Top (mobile + desktop) | Смены · Цены · Философия · Спросить анонимно |
| 📂 More (dropdown) | О лагере · Как проходит смена · Команда · Размещение · Отзывы · FAQ · Документы |
| 📁 Footer (sitemap) | Все основные + Фото · Видео · Контакты · Политика · Пользовательское |
| Search | Иконка лупа в header — поиск по статьям/FAQ/смене |
Чтобы главная грузилась быстрее (LCP < 2s) и была сфокусирована — выносим тяжёлый контент.
| Блок | Куда | Зачем |
|---|---|---|
| Gallery (фото) | /foto/ или /galereya/ | 10-30 фото лагеря, занимает много места + load time |
| Videos | /video/ | YouTube embed = тяжёлый load. Конверсия 0.9% — не оправдывает место на главной |
| Mentors (детально) | /komanda/ | На главной кратко (3-4 фото), полная команда — внутри |
| Документы / Лицензия | /dokumenty/ (уже есть!) | Просто ссылка из trust-блока + footer |
| Stay (детально) | /razmeshenie/ | На главной — 1 фото + ключи. Полная инфа — внутри |
Эффект: главная сократится с ~21 блока до ~12. Time to interactive улучшится в 1.5-2x.
Убираем BookingBar (2 шт. сейчас на главной). Бронирование появляется ТОЛЬКО внутри выбранной смены, после выбора возраста.
| Шаг | Что показываем |
|---|---|
| 1. Hero Age picker | «Подходит ли возраст?» 4 кнопки |
| 2. Shifts (filtered) | Карточки смен подходящих по возрасту |
| 3. Клик на смену Modal | Детали + цена + что включено |
| 4. Inside Modal | «Забронировать» кнопка появляется ТУТ, не раньше |
| 5. Booking form | Минимум полей. Имя + телефон + email опционально |
42% россиян не оставляют контакты на сайтах из-за страха спама. Слово «бот» = «опять менеджер заберёт телефон». Используем «спросите анонимно».
| Запрещено | Нужно |
|---|---|
| «Спросите бота» | «Спросите анонимно» |
| «Чат-бот ответит» | «Получите ответ за минуту» |
| «AI-помощник» | «Узнайте всё про лагерь» |
| «Telegram-бот» | «Через мессенджер» |
| «Напишите боту» | «Спросите про лагерь / еду / минусы» |
СПРОСИТЕ ПРО
минусы
Анонимно, без регистрации
Cycling words (нейтральные, без провокаций любопытства): лагерь · еду · бассейн · размещение · стоимость · программу · безопасность. Убрали: «минусы», «косяки», «правду о ценах» — это провокация любопытства, не наш tone. Просто перечисляем темы.
Список конкретных UX-улучшений из обратной связи — что важно для нашего сайта.
Skeleton = серые placeholder'ы (полоски и круги) которые показываются пока контент грузится. Создаёт ощущение что страница «жива», даже если интернет медленный.
Где НЕ нужны:
Где нужны:
| Параметр | Значение |
|---|---|
| Когда появляется | После прокрутки > 800px |
| Где | Sticky right bottom (mobile: bottom-right; desktop: bottom-right с margin) |
| Размер | 44×44px (touch-friendly), круглая |
| Иконка | bi-arrow-up (Bootstrap Icons) |
| Стиль | Soft white/glass, не яркая (ненавязчивая) |
| Анимация | Fade-in 200ms когда появляется. Smooth scroll-to-top при клике |
| Что должно быть |
|---|
| 1. Большой H1: «Эта страница переехала или удалена» |
| 2. «Возможно вы искали:» список из 5-7 популярных страниц |
| 3. Поиск по сайту (input) |
| 4. Кнопка «На главную» |
| 5. Phone в header (если хочет позвонить) |
html { height: 100%; } body { min-height: 100svh; } + visualViewport API для критичных форм.
<details/summary> часто не работает (dead clicks). Используем <button data-faq-toggle> + JS для accordion'ов.
| URL | /foto/ |
| Layout | Masonry grid (Pinterest-style), 2 col mobile / 4 col desktop |
| Lightbox | Swipe для переключения, pinch zoom, ESC для закрытия |
| Lazy loading | Intersection Observer, грузить по мере скролла |
| Image format | AVIF + WebP fallback, multiple sizes (300w/600w/1200w) |
| Категории | Tabs: «Занятия», «Бассейн», «Природа», «Хакатон», «Команда» |
| Performance | Initial load: только превью первого экрана |
@media print stylesheet. Скрываем nav/footer/CTA, оставляем только программу с большими полями для заметок.
| Неправильно | Правильно |
|---|---|
| 30.05.2026 | 30 мая 2026 |
| May 30 | 30 мая |
| 30/05 | 30 мая |
| 2026-05-30 | 30 мая 2026 (для людей) |
В <time datetime="2026-05-30">30 мая 2026</time> — ISO в атрибуте, человеческий формат внутри.
НЕ менять порядок! Telegram всегда перед WhatsApp.
ShiftOccupancy.astro — «Осталось N мест» — компонент уже работает. Не дублируем функционал.
#ec9b44 в новых компонентах. Используй #ec9b44 (soft).
style="color:...". Только Tailwind tokens.
v3 · 2026-05-01 · Soft Orange + Attention-driven · АйДаКемп
Сколько лет ребёнку? — покажем смену с ровесниками