Все секции (Кабинеты, Деньги, Цель, Аудитория, География, Расписание) — в одинаковых `
` карточках с background `--bg-elevated`, padding 20-24px, header с icon + name + meta + border-bottom.
Bigcards с описаниями
Распределение бюджета (CBO/ABO), Стратегия ставки (Cost cap / Bid cap / Target / Lowest), Цель Meta (Лиды / Трафик / Конверсии / Узнаваемость), Распределение креативов (Свой каждому / Один набор / По кругу / Ручной) — все идут как большие карточки с title + 1-2 строчным описанием вместо тонких pill'ов.
Кабинеты — детальная карточка
Каждый кабинет = row с:
- Имя
BM223-A05 + pill «Рабочий» (зелёный) или «Сломан» / «Есть проблемы» / etc.
- act_id · валюта
- Баланс ($1 850)
- Сегодня спущено / лимит ($32 / $50)
- Last sync (4 мин назад)
- Право: лимит $/день
- × remove
Аудитория + События жизни в одной карточке
Объединённая секция. Pol/Возраст в первой row (`grid-template-columns: auto 1fr` чтобы пол был узким, возраст с +/− counter — шире). Под ними — Языки/интересы tags. Под ними — DOB events tags (selected + suggestions).
Возраст с +/− counter
`[−] [25] [+] — [−] [55] [+] лет` — кнопки сами увеличивают/уменьшают (clamp 13-65). Прямой ввод тоже работает.
География compact
Search input «Регион или город — Алматы, Караганда, Шымкент…» + selected tags (Казахстан country-pill, Алматы [+20%], Астана [+15%] с bid-modifier badges) + suggestion chips («+ Шымкент / + Караганда / + Актобе / + ещё 9»).
4Эволюция v4 → v10
v4 · 2026-06-01 (утро)
Базовая структура
Целостная страница в dashboard chrome
- Добавлен sidebar (64px узкий, иконочный — позже сменён)
- Topbar с breadcrumb + direction picker
- Workspace 2-col: canvas LEFT broad / settings RIGHT narrow (~440px)
- 8 секций настроек: Структура / Деньги / Цель / Аудитория / Гео / DOB / Тексты / NB tracker
v5 · 2026-06-01 (день)
Sync с staging chrome
Реальный chrome из staging
- Залогинился на staging, сделал screenshot реального chrome
- Sidebar расширена до 220px текстовая с группами «ВЕРТИКАЛЬ / ГЛАВНОЕ / СЦЕНАРИИ / УПРАВЛЕНИЕ»
- Brand «7leads · DS 2.0 · V2 · STAGING»
- Topbar redesigned: Search + Health pill + last-updated + bell
- Quickbar floating bottom: 4 actions (Запустить / Добавить кабинет / Загрузить / Сгенерировать)
- Source tabs Facebook/NewsBreak/SmartNews под page-head
v6 · 2026-06-01 (день)
Pyramid + swap
Пирамидальная диаграмма + swap колонок
- Tree-list заменён на горизонтальную пирамиду с CSS connectors
- Smart condensed rendering для больших counts
- Колонки swapped: settings LEFT 400px / struct-zone RIGHT broad
- Bigcards для CBO/ABO, bid strategy, цель Meta — с описаниями
- Возраст: range slider → input От/До
- «Дата рождения» → «События жизни», checkbox-grid → tags
v7 · 2026-06-01 (вечер)
Свайп обратно + scroll page
Settings LEFT broad / Ads zone RIGHT narrow + page scroll
- Колонки swap-нуты обратно: struct-zone + settings LEFT broad, Тексты+Пул RIGHT narrow
- Body больше не lock viewport — страница скроллится как другие staging-страницы
- Sidebar и ads-zone — sticky к viewport
v8 · 2026-06-01 (вечер)
Card unification + reorder
Все секции в карточках + Кабинеты наверх
- Все `.cB4-sec` получили унифицированные card-styles (background, padding, radius)
- Кабинеты перемещены в начало с расширенной информацией (balance/spent/sync)
- Ads-zone: Пул креативов перемещён НАВЕРХ над Текстами
- Ads-zone расширена до 440px
- Описания режимов распределения расширены с примерами (По кругу: A B C A B C)
v9 · 2026-06-01 (ночь)
Reorder + merge + drafts
Цель ↑, Расписание ↓, Аудитория+События merge + Modal черновиков
- Цель Meta поднята выше Денег
- Расписание ушло в самый низ
- Аудитория и События жизни объединены в одну card
- Возраст: input → counter `[−] [25] [+] — [−] [55] [+]` с JS step handlers
- Пол: padding увеличен (`cB4-seg-tall`) для соответствия высоте age counter
- География compact: search input + selected tags с bid-pills + suggestions
- Modal черновиков visual mock: 2 draft cards с продолжить/удалить + actions «Закрыть» / «Начать новый запуск»
- «Черновики 2» pill в topbar открывает modal
v10 · 2026-06-01 (день)
P0 закрыто + interactive drafts
Все P0 задачи + relative-time + buttons на странице
- Кнопки «Сбросить» и «Черновики» в page-head (рядом с rocket icon)
- Modal: 4 cards с разным relative-time («5 минут назад» / «2 дня назад» / «3 месяца назад» / «2 года назад»)
- Все modal-actions работают: Continue / Delete / Start-new → toast notifications
- Auto-open modal on first load (sessionStorage flag)
- Empty-state когда нет кабинетов — все остальные секции disabled-overlay с подсказкой «Сначала выбери кабинеты ↑»
- Scroll fix: overscroll-behavior: contain + max-height для ads-zone
- Спека черновиков обновлена под правило «draft создаётся только после взаимодействия со структурой»
v11 · 2026-06-01 (FINAL)
P1+P2+P3+P4 закрыто
29/29 задач реализовано — концепт готов к интеграции
- P1 lifecycle (7): inline-rename input в page-head + auto-save indicator с live tick + `cB4MarkSaving()` debounce 800ms + relative-time formatter с русским склонением + `hasInteractedWithStructure` flag + dynamic drafts pill count + reset functionality
- P2 связь Pool↔Структура (4): раскраска ad-dots под mode (per_slot/single_set/round_robin/manual) + подсветка слотов с pulse animation при выборе pool thumb + manual flyout (modal с pool thumbs для выбора в конкретный slot) + bigcards conditional fields (Lowest cost → скрыть Cost cap row, Bid cap → переименовать label)
- P3 интерактив (11): tag-add → активный tag, tag-remove с fade-out, geo autocomplete dropdown (12 городов), pool search filter, pool folders mock-filter, pool thumb selection с pyramid highlight, direction picker dropdown (5 вертикалей с checkmark), sidebar nav switch, source tabs switch, toggle «Показать недоступные» раскрывает 4 inactive cabinet rows, cabinet × remove с empty-state propagation
- P4 polish (3): topbar sticky к viewport (top:65, z:18), quickbar offset с учётом ads-zone 440px (centered в main-content area), pool grid с hover meta overlay в стиле staging /Креативы
5Интерактив и real-time
Counter Кампаний / Адсетов / Объявлений → live pyramid
JS `setupCB4Pyramid()` слушает все `[data-cb4-counter]` кнопки. На каждый клик:
- Update state {cmp, ads, ad}
- Recalculate
totalAds = cabs.length × cmp × ads × ad
- Re-render HTML пирамиды в `#cB4-pyr`
- Update badge «N объявл.»
- Update «Размер шаблона: N×N×N» в header
- Update «Запустить · N объявл.» в Quickbar
Описания режимов распределения
| Режим | Описание | Пример |
| Свой каждому | Каждое объявление получает уникальный креатив. Полный A/B охват | 6 объявл + 6 креативов → каждый креатив в одном слоте |
| Один набор | Все адсеты получают одинаковый набор. Отличия в результате только из-за аудиторий | Креативы CR1, CR2 во всех адсетах одинаково |
| По кругу | Циклически распределяются по слотам. Каждый креатив встречается в разных адсетах | 3 креатива A·B·C и 6 объявл → A B C A B C |
| Ручной | Слоты пустые. Клик на слот → flyout с пулом → выбор. Контроль над комбинациями | Топ-перформер CR18 в Адсет 1, новая гипотеза CR67 в Адсет 3 |
Modal черновиков
- Автооткрытие при первом заходе на B (sessionStorage flag)
- Открытие через «Черновики 2» pill в topbar или кнопку «Черновики» в page-head
- 4 mock draft cards с разными relative-time: 5 мин / 2 дня / 3 месяца / 2 года
- Каждая card имеет: имя + source-pill + meta + кнопки «Продолжить →» / 🗑 delete
- Footer: «Закрыть» / «Начать новый запуск» (primary)
- Backdrop click = close
- Все actions работают: continue → toast «Загружен черновик: X», delete → fade-out animation + count update, start-new → close + toast «Создан новый запуск · DD.MM.YYYY · HH:MM»
Empty-state «нет кабинетов»
- При удалении последнего кабинета через × — все остальные секции получают `cB4-disabled-overlay` (opacity 0.4 + не кликаются)
- Подсказка «Сначала выбери кабинеты ↑» появляется поверх каждой disabled-секции
- При добавлении кабинета обратно — overlay автоматически снимается
6Система черновиков (UX)
Правило создания (после правки Тимура от 2026-06-01):
Черновик не создаётся при простом заходе на страницу или выборе кабинетов.
POST /launches/drafts/ вызывается только после того, как пользователь явно начал взаимодействовать со структурой и распределением — клик на counter Кампания/Адсет/Объявление или выбор режима распределения.
До этого — состояние держится в `localStorage`.
После первого взаимодействия — флаг `hasInteractedWithStructure = true`, дальше работает обычный auto-save через debounced PATCH.
Имя черновика по умолчанию
Новый запуск · DD.MM.YYYY · HH:MM (локальная дата создания). Пользователь может переименовать через inline-edit в page-head.
Relative-time формат
| Возраст | Формат |
| < 60 секунд | только что |
| 1-59 минут | 5 минут назад |
| 1-23 часа | 2 часа назад |
| 1-29 дней | 15 дней назад |
| 1-11 месяцев | 3 месяца назад |
| ≥ 12 месяцев | 2 года назад |
Локализация на русский с правильным склонением через Intl.PluralRules.
Кнопки управления
- «Черновики» (page-head + topbar pill) — открывает modal со списком
- «Сбросить» (page-head) — confirm + DELETE current draft + reload page
- «Запустить» (Quickbar) — POST /launches/drafts/:id/publish → запускает Meta API pipeline через все cabinets
7Backend-спека
Полная спека для партнёра: 2026-06-01-launch-drafts-system.md (rendered как HTML).
Модель LaunchDraft
id uuid primary
name text (default: "Новый запуск · DD.MM.YYYY · HH:MM")
user_id uuid fk
direction_id uuid fk nullable
source enum('fb', 'nb', 'sn')
state jsonb (полное состояние формы)
is_published boolean
published_launch_job_id uuid fk nullable
created_at timestamptz
updated_at timestamptz
Endpoints
| Метод | Route | Описание |
POST | /launches/drafts/ | Создать пустой черновик |
GET | /launches/drafts/ | Список (фильтр по direction_id) |
GET | /launches/drafts/:id | Один черновик с state |
PATCH | /launches/drafts/:id | Partial update (debounced auto-save с frontend) |
DELETE | /launches/drafts/:id | Удалить |
POST | /launches/drafts/:id/publish | Финализировать → /launch/jobs pipeline |
8Backlog · 29 задач
Полный backlog в 2026-06-01-concept-B-backlog.md. Краткая сводка по приоритетам:
P0
Критичное (блокирует оценку концепта)
4 задачи · ✓ закрыто в v10
- Scroll-баг ads-zone — overscroll-behavior: contain + max-height fix
- Modal actions (Continue / Delete / Start-new) — JS handlers + toast
- Auto-open modal on B load — sessionStorage flag
- Empty-state когда нет кабинетов — disabled-overlay на остальные секции
P1
Lifecycle черновиков
7 задач · ✓ закрыто в v11
- ✓ Inline-rename draft name (`#cB4-rename` input в page-head)
- ✓ Auto-save indicator («Сохранено · 5 минут назад» с live tick через `setInterval`)
- ✓ Auto-save JS (`cB4MarkSaving()` debounce 800ms, тригерится на counter/budget/mode/text/tag)
- ✓ Drafts pill dynamic count (`updateCount()` после CRUD draft cards)
- ✓ Условие создания: `cB4State.hasInteractedWithStructure` flag, save игнорится до flag=true
- ✓ Reset functionality (confirm → clear thumbs/counters → reload)
- ✓ Relative-time formatter `cB4RelativeTime()` с русским склонением
P2
Pool ↔ Структура связь
4 задачи · ✓ закрыто в v11
- ✓ Раскраска ad-dots под mode (`col-0..5` классы, `pickColorForSlot()`):
- Свой каждому → каждый slot rotating цветом из selectedCreatives
- Один набор → все одного цвета (первый из selected)
- По кругу → `sel[slotIdx % sel.length]` циклически
- Ручной → пустые `is-empty` слоты, заполняются через flyout
- ✓ Подсветка слотов при клике на pool thumb (`cB4HighlightSlotsForColor` + CSS `is-highlighted` animation)
- ✓ Manual flyout (`#cB4-flyout` modal) — клик на ad-dot когда mode=manual → grid креативов → выбор → ad-dot перекрашивается
- ✓ Bigcards conditional fields: при «Lowest cost» Cost cap row скрывается, при «Bid cap»/«Target cost» меняется label
P3
Кликабельность mock-элементов
11 задач · ✓ закрыто в v11
- ✓ Tag-add → активный tag (event delegation на `.cB4-tag-add`)
- ✓ Tag-remove ✕ → fade-out animation + remove
- ✓ Geo autocomplete dropdown с suggestions (Алматы, Астана, Шымкент, …, 12 городов)
- ✓ Pool search input → filter thumbs по input
- ✓ Pool folders chips → mock filter (Все/Топ/Sale/Архив)
- ✓ Pool thumb selection → toggle + update count в meta + highlight в pyramid
- ✓ Direction picker dropdown (5 вертикалей с checkmark)
- ✓ Sidebar nav items click → mock switch active state
- ✓ Source tabs FB/NB/SN → switch active
- ✓ Toggle «Показать недоступные» → раскрывает 4 inactive кабинета с problem/broken/disabled states
- ✓ Cabinet × remove → fade-out + recompute empty-state
P4
Полировка
3 задачи · ✓ закрыто в v11
- ✓ Topbar sticky: `position: sticky; top: 65px; z-index: 18` — остаётся при page scroll
- ✓ Quickbar offset под ads-zone: `calc(220px + ((100vw - 220px - 440px - 32px) / 2) + 16px)` — центрируется в main-content без overlap
- ✓ Pool grid в стиле staging /Креативы (hover meta overlay через pseudo .pool-meta)
9Что дальше
Все 29 задач backlog'а закрыты в v11. Следующие шаги — про интеграцию и backend:
- Approval концепта Тимуром → отдать партнёру для интеграции в `dashboard-v2.html`
- Backend implementation — endpoints по спеке (LaunchDraft model, CRUD endpoints, publish flow)
- Frontend wiring в реальном staging — заменить mock-state на live API calls с debounced PATCH
- QA после интеграции — full walkthrough на staging.openclaw.../launch-new
- Прод-rollout когда staging stable
UX-аудит и X-аудит — отложено на «потом, в будущих видео» (формулировка Тимура от 2026-06-01). Текущий концепт готов к интеграции — все 29 пунктов backlog'а реализованы (P0+P1+P2+P3+P4).