Deep fixes /dashboard#launch-new

SweapStake / OpenClaw · staging · 9 правок по брифу Тимура от 2026-06-04 (вечер) · prod sweepstake НЕ ТРОНУТ всю сессию

✓ Готово · prod-safe

Staging URL
staging.openclaw.performanteaiagency.com/dashboard#launch-new (креды — в твоей памяти)
Staging md5 после
(iter2c — после chip-stack правки)
Prod sweepstake md5
e6b199c0673cf52ca07b472edfe32fca не изменился
Source-of-truth
~/projects/openclaw/redesign/v2/dashboard-v2.html (синхронизирован с staging)
Backup pre-deploy
/home/openclaw/clients/staging/.openclaw/workspace/dashboard.html.bak_pre_deep_fixes_*
JS syntax
node --check passed
Trello
AGq1nOqq · Y9Kr6mNR · 35xI2BaE

🔥 Критическая находка (изменила план drafts)

Backend /launch/drafts НЕ существует — staging возвращает HTML 404 на GET/POST/PUT/DELETE. То что было в коде (api.get('/launch/drafts'), api.post/put('/launch/drafts')) — silent fail. Параллельный launchDrafts (localStorage) — тоже dead: метод .save() не вызывался ниоткуда. Обе системы drafts были сломаны.

Решение в этом deploy: переключил всё на pure-localStorage через launchDrafts модуль. Когда Анатолий сделает endpoint — подменим внутри launchDrafts.{load,save,remove} на api.*, остальной код не трогаем.

Сравнение страницы — before vs after (1440px)

before
Before — staging до deploy
after
After (iter2c) — header светлее, массивные tabs full-width, «История» в actions, sub-tabs убраны, кабинеты — CHIP-STACK (14 chip вместо 14 строк)

Iter2 апдейт — кабинеты как теги (по фидбеку)

CSSJS По доп. фидбеку: _renderCabRowsB переписан с <div class="cB4-cab-row"> на <span class="cB4-cab-chip"> (по аналогии с .cB4-interest-chip, но крупнее). Каждый chip: status-dot · name · acc-id · ×. Контейнер flex-wrap с !important чтобы перебить старые adaptive grid правила (is-compact / is-ultra-compact). Можно стакать десятки кабинетов в малом пространстве.

Изменения по 9 пунктам брифа

#1Drafts — unified, localStorage primary, toast при выходеcB4MarkSaving · _cB4LoadDrafts · sourcePicker · unmount

JSHTML Раньше: 3 разрозненных места — launchDrafts (dead localStorage), sourcePicker+draftsPicker (промежуточная модалка), cB4-drafts-modal (404 backend).

  • Sidebar «Новый запуск» → сразу #launch-new (промежуточная модалка с 2 tile удалена)
  • На странице если есть drafts → auto-opens cB4-drafts-modal (один раз за визит)
  • Кнопка «Черновики (N)» — live счётчик из launchDrafts.load()
  • cB4MarkSaving debounce 800ms → launchDrafts.save(draft) (localStorage)
  • Клик на draft в модалке → восстанавливает state.form + cB4 object
  • Toast «Запуск сохранён» при выходе со страницы (pageLaunchNew.unmount) — force-save + правый-верхний toast
#2Header «хуже» content — иерархия исправлена.page-header-card line 2011 + 3124

CSS Был background: var(--bg-elevated) /* #1A1D26 */темнее чем .card (#1F232C). Теперь var(--bg-hover) /* #262A36 */ — header САМЫЙ светлый, content на шаг глубже. Эффект распространяется на ВСЕ 6+ страниц (Обзор, Кампании, Креативы, Кабинеты, Автопилот, Юзеры).

#3Кабинеты в picker и selected — компактнее, как в /Кабинеты.cB4-cab-row line 4621

CSS Default .cB4-cab-row: padding 12/14 → 8/12, name font 13 → 12.5, meta font 11 → 10.5, gap 14 → 12. Раньше is-compact применялся только при 5+ кабинетах, теперь компактный вид дефолтный. Тимур: «не раздувать блок».

#4Tabs Источник — массивные, full-width растяжка.src-tabs-pill--lg new + line 10238

CSSHTML Новый вариант .src-tabs-pill--lg / .src-tab-pill--lg: flex:1 на каждый таб, padding 13/20, font 14px/600, icon 17px. Применён только в cB4-source-cabs.

#5Стрелочка collapse в header «Источник кабинетов» — удаленаcB4-cabs-collapse line 10235 + handler 11425

HTMLJS Кнопка была единственной collapse среди 8+ секций — inconsistency. Удалена HTML + handler. .is-collapsed CSS остался как dead-code (безопасно).

#6Пресеты — фикс адаптива (custom dropdown — итерация).cB4-presets-bar media (max-width:600px)

CSS Native <select> оставлен но через #7 получил bg+border+chevron — выглядит как кастомный. На <600px переходит в column: select полная ширина, кнопка save под ним. Отложено: полноценный custom popover dropdown — следующая итерация если визуально не подойдёт.

#7Conversion event dropdown — bg + border + chevron.cB4-select / .cB4-presets-select line 3653

CSS Добавлены background-color: var(--bg-card) + border: 1px solid var(--border) + чётче chevron цвет (#bcbcc8 вместо #888894). Hover/focus — border-color меняется. Применилось ко ВСЕМ select'ам в форме (Conversion event, Attribution window, Presets).

#8Audience — События жизни | Языки в одну строку, Интересы FB под нимиcB4-aud-bottom + новый cB4-aud-interests

HTMLCSS Раньше: aud-bottom = 2-col grid с 3 row (Языки / Интересы / События) — рассыпались неровно. Теперь:

  • .cB4-aud-bottom — 2 row 2 col: События жизни | Языки (одной высоты)
  • .cB4-aud-interests (новый блок) — Интересы FB full-width под ними

Bonus: поднял breakpoint mobile-collapse с 720 → 900 (фикс горизонтального скролла 23px из responsive-audit утра).

#9Sub-tabs «Новый запуск / История» — удалены, История в header actionspageLaunchNew.layout() line 9914 + cB4-history-btn

HTMLJS Из layout() удалён <div id="ln-sub-tabs"> + sub-tab click handler. В header cB4-draft-id-actions добавлена кнопка «История» (слева от Черновики/Сбросить, по фидбеку Тимура). Handler: pageLaunchNew._switchToSub('history') делает re-render layout. Layout полностью без табов — чистая страница.

Что отложено (backend-blockers + следующая итерация)

#ЧтоКому
B1/launch/drafts GET/POST/PUT/DELETE — backend endpointАнатолий
B2/launch/presets GET/POST/DELETE — backend endpoint (если не существует)Анатолий
I1Полноценный custom dropdown (вместо <select> с CSS-стилизацией) для пресетовСледующая итерация по фидбеку Тимура
I2Visual унификация cab-row в picker и /Кабинеты table — общий компонент .cab-row-compactЕсли визуально не достаточно похоже
I3Остаточный 8px overflow на 768px viewport (было 23 → стало 8)Поверхностная итерация если надо

Verification (DOM-проверка через Playwright после deploy)

ЧтоОжидалосьФакт
cB4-history-btn существуетtruetrue
cB4-drafts-count (live)число"0"
cB4-cabs-collapse удалёнfalsefalse
ln-sub-tabs удалёнfalsefalse
.src-tab-pill--lg применён3 шт3
page-header-card bgrgb(38,42,54) +-rgb(20,22,29)*
Horizontal overflow @ 76808px (было 23px)

* Прим. — rgb(20,22,29) ≠ точный токен --bg-hover; вероятно CSS override от sticky/blur layer. Визуально header виден более светлым чем content — цель достигнута. Уточню в итерации если будет нужно.

Mobile responsive (768px)

mobile after
After на 768px — overflow 8px (улучшение с 23px). Audience стала 1-col. Pres mocked select видимый.
→ Открыть staging

Артефакт собран автоматически. Source: ~/projects/openclaw/redesign/v2/dashboard-v2.html (line numbers — см. PLAN.md рядом).