Разработка нестандартного по дизайну сайта

Бюджет: по договоренности
 ТЗ: одностраничный сайт бизнес-коуча (HTML/CSS/JS)

1) Цель и идея

Цель: довести до одного действия — **контакт** через CTA в конце.
Главная мысль: **«Не решу за тебя. Научу так, чтобы проблема не возникала.»** (формулировку можно варьировать, смысл сохранить).

### 2) Технологии

* **Vanilla HTML/CSS/JS**, без фреймворков и тяжёлых библиотек.
* Быстро, лёгкие стили/скрипты, оптимизированные изображения.
* Адаптив: мобила/десктоп.
* Доступность: клавиатура, aria, focus-trap в модалке, ESC.

### 3) Структура (4 секции)

#### 3.1 Hero (100vh)

* Маленький бренд капсом + крупный заголовок (h1):
  **«Не решу за тебя. Научу так, чтобы проблема не возникала.»**
* Подзаголовок 1–2 строки про систему/мышление/профилактику хаоса.
* **2–3 фото**: монохром (grayscale), высокий контраст; одно основное, 1–2 “накладкой” (смещение + поворот 2–4°). Лёгкий grain/film (по желанию).
* Кнопки: максимум 2 (например: “Связаться”, “Коротко описать задачу”).

#### 3.2 Scroll-driven тезисы (главная механика)

* Контейнер высотой **N * 100vh** (N=10–14 тезисов).
* Внутри sticky-карточка на весь экран: `position: sticky; top:0; height:100vh;`
* На карточке:

  * крупный тезис
  * снизу тонкий прогресс-бар (градиент **жёлтый→фиолетовый**)
  * микро-лейбл капсом (например “ДАЛЬШЕ ХУЖЕ / ЕЩЁ 1 ШАГ / СМОТРИ ВПЕРЁД”)
* **Смена тезисов без явных переходов** (без fade/slide).
* “Нагнетание”: каждый следующий тезис жёстче; последние 2–3 — призыв.
* **Последний тезис** появляется только под конец и “раскрывается” на последних процентах прокрутки (см. алгоритм).

**Оригинальность прокрутки (без анимаций):**

* При каждом новом тезисе слегка рандомизировать (значения фиксированы для тезиса, не дёргаются):

  * размер шрифта: десктоп 36–56px, мобила 26–40px
  * смещение X/Y: ±10–14% области

#### 3.3 Финальный блок

* Заголовок: “Ок. Хочешь научиться избегать этого?”
* Текст: “Один короткий разговор… я показываю, где рождается проблема и чему научиться, чтобы не повторялась.”

#### 3.4 Footer

* Минимум: год / имя / одна строка контакта.

### 4) Визуальный стиль

* Фон: почти чёрный `#05050a`/`#0a0a14`, деликатные `radial-gradient` подсветки фиолет/жёлт (opacity ~0.08–0.16).
* Текст: `#f6f7fb`, вторичный `rgba(...,0.68)`.
* Акценты только:

  * жёлтый `#f6d445`
  * фиолетовый `#7c3aed`
* Типографика: современный гротеск, жирные заголовки; микро-лейблы капсом с трекингом (`letter-spacing ~0.18em`).
* Фото: строго монохром через CSS, без цветных пятен; grain через лёгкий overlay (noise png/svg) с низкой прозрачностью.

### 5) CTA (важно)

* Одна **floating CTA-кнопка** (fixed), **скрыта** по умолчанию.
* **Появляется только почти в конце**: когда футер (или sentinel) виден в viewport ~15–25%.
* Реализация: `IntersectionObserver` (добавлять/убирать класс видимости).

### 6) Модалка (по CTA)

* Поля: “Имя” (input), “Коротко опиши ситуацию” (textarea).
* Действия:

  * “Написать в Telegram” → ссылка `t.me/<user>?text=< encodeU...
  * “Позвонить” → `tel:`
* Доступность:

  * `role="dialog"`, `aria-modal="true"`, `aria-labelledby`
  * закрытие по ESC, по клику на backdrop, по кнопке “×”
  * focus-trap внутри, возврат фокуса на CTA после закрытия
  * блокировка скролла фона при открытой модалке

### 7) Алгоритм скролла (JS)

* Рассчитать прогресс секции:
  `p = clamp((scrollY – start) / (end – start), 0..1)`
* Индекс тезиса: `i = min(N-1, floor(p * N))` (подкрутить, чтобы последний не появлялся рано).
* Рандомизацию (fontSize, offsetX/Y, label) **предвычислить** на старте и хранить в массиве по тезисам.
* Раскрытие последнего тезиса: если `p > 0.90`, показывать подстроку по `tail = (p-0.90)/0.10`.

### 8) prefers-reduced-motion

Если `prefers-reduced-motion: reduce`:

* не использовать sticky/scroll-механику;
* показать тезисы обычным списком блоков.

### 9) Приёмка

* Стили и структура соответствуют.
* Scroll-карточка работает, тезисы меняются без переходов, прогресс-бар корректен.
* Последний тезис поздний и раскрывается в конце.
* Floating CTA появляется только у футера.
* Модалка доступная (ESC, focus-trap, aria), Telegram-ссылка корректно формируется.
* В режиме reduced-motion — список вместо sticky.
Опубликован 18.02.2026 в 18:11

Выберите способ верификации:

Обновите страницу после прохождения верификации.