# UI-аудит портала Лидерра — находки, починки и хэндофф следующей сессии

**Дата:** 21.06.2026. **Кодовая фраза стены:** «роутер-наставник».
**Зачем файл:** зафиксировать сквозной UI-аудит портала (что просмотрено, что найдено, что починено и выкачено) и дать **жёсткий промт** следующей сессии, чтобы она продолжила — **сама протыкивая каждый экран и каждую форму в Playwright** (заполнить/сохранить/отменить/изменить/снова сохранить, все варианты и комбинации), а не только смотрела 10–15 центральных страниц.

---

## ✅ Что УЖЕ ПОЧИНЕНО и ВЫКАЧЕНО на прод (этот UI-проход)

Все правки на боевом liderra.ru + в gitea. Коммиты (UI-часть):

| Коммит | Что |
|---|---|
| `1cc81975` | dev-индексы (`data-dx`) не текут в прод (гейт `command`) + двойной «+» + очистка региона + перенос кнопок попапа |
| `8ce6b366` | **DevIndexBadge** скрыт в проде (гейт `import.meta.env.DEV`) — убрал зелёные бейджи «16 Проекты»/«18 NewProjectDialog» на ВСЕХ экранах + dev-код подтверждения email скрыт |
| `536681a5` | **Дашборд без мок-данных** (был фейк 247 лидов / 14 250₽ / фейк-график → нули; F5) |
| `511203de` | гард деления на ноль «NaN%» (карточка проекта при лимите 0) + битый класс `gap-N`→`ga-N` (Vuetify, кнопки слипались) |
| `95359d4a` | **фейк-данные убраны**: ErrorView (`REQ-3F8A2-0007`/`INC-2026-0507-0034` + фейк-статус Telegram/YooKassa) скрыты; фейк-фильтры отчётов («Окна Москва»/«Иван Петров») убраны; эмодзи 🌍📅🎯⏸▶🗄✕→mdi; англ-статусы импорта→рус; пустой «ИНН »; склонение «2 канала»; формат денег ChargesTab; англ. заголовки колонок→рус; мёртвая кнопка «Сменить» (профиль) |
| `49bc3233` | **русская локаль Vuetify** (таблицы/пагинация были по-английски: «No data available», «Items per page», «0-0 of 0» → «Отсутствуют данные», «Записей на странице», «0-0 из 0» — НА ВСЕХ ТАБЛИЦАХ) + плюрал-хелпер `utils/plural.ts` (1 лид/2 лида/5 лидов; 1 день/2 дня/5 дней) + русский Sync-статус карточек |

**Главный урок:** часть багов видна ТОЛЬКО глазами в браузере — англ. дефолты Vuetify на каждой таблице, неверное склонение «2 лидов», обрезки/налезания. Код-ревью их не ловит. **Следующая сессия ОБЯЗАНА протыкивать всё Playwright'ом.**

---

## 👁 Что ПРОСМОТРЕНО

**Глазами (Playwright, под входом `admin@demo.local`), только просмотр (не интерактив):**
- Дашборд, Проекты, Сделки, Биллинг.

**Статически по коду (4 суб-агента, чек-лист ui-ux-pro-max) — все 38 view-компонентов:**
- client: Projects/Deals/Kanban/Dashboard/Billing/ChargesTab + диалоги проектов + ProjectCard/Drawer/BulkActionsBar
- secondary: Reports/Import/Help/Settings + 5 вкладок (Api/Notifications/Profile/Requisites/Security)
- auth: Login/Register/ConfirmEmail/Forgot/Reset/TwoFactor/Recovery/Legal/Error + layouts
- admin: все 12 admin-view

---

## 🟡 НАЙДЕНО, но ещё НЕ ПОЧИНЕНО (минор / нужен вход или решение)

- **`1000.00₽` vs `1 000 ₽`** — `components/billing/BalanceCapacityIndicator.vue:37` формат без разделителя тысяч (строка «Баланс: 1000.00₽ = до N лидов»).
- **US-формат даты `mm/dd/yyyy`** в Сделках (нативный `<input type=date>`, зависит от локали браузера — нужен кастомный date-picker или принять).
- **«Активные проекты 3 / 0 лимит тарифа»** (Дашборд) — «/ 0» при незаданном лимите выглядит сломанным; скрывать «/ N» когда лимит 0.
- **«Реестр лидов от crm.bp»** (Сделки, подзаголовок) — похоже на обрезанный домен (проверить).
- **ApiTab eye-toggle без aria-label** (`settings/ApiTab.vue:192,278`) — ограничение Vuetify `append-inner-icon`; нужен кастомный слот.
- **Нативные `confirm()`/`alert()`** вместо v-dialog: `admin/AdminSupplierIntegrationView.vue:121,130`, `admin/AdminPdSubjectRequestsView.vue:130` — рефактор на v-dialog/v-snackbar (паттерн как PricingTiers G10).
- **HelpView fallback email `support@liderra.app`** — проверить домен (продукт на liderra.ru).
- **AdminTenantsView `monthlyRevenueRub`** (стр.34) — объявлен, но не заполняется из API → возможный ложный 0 (проверить рендер в TenantsStatsHeader).
- **NotificationsTab комментарий** (стр.3-4) рассинхрон «3 канала» vs код 2 канала (косметика, не user-facing).

---

## ⛔ ОСОЗНАННО НЕ ТРОГАТЬ (by-design)
- **LegalDocView «Финальная редакция документа готовится…»** — юр-заглушка до регистрации ООО (аудит A7, юридический риск показать фейк-оферту). НЕ удалять без слова владельца.

---

## 🚪 Что ЕЩЁ НЕ ПРОЙДЕНО ГЛАЗАМИ (и тем более не протыкано интерактивно)

**Клиент:** Канбан, Отчёты, Импорт (+ мастер импорта), Настройки (5 вкладок), Помощь.
**Диалоги/формы (НИ ОДИН не протыкан — заполнение/сохранение/отмена/валидация):** Новый проект (3 типа: сайт/звонок/смс), Редактировать проект, ProjectDetailsDrawer, BulkActionsBar-диалоги (регионы/дни/лимит), ProjectLimitOverloadDialog, диалоги отчётов, импорт-визард, формы настроек (профиль/уведомления/api-ключи/реквизиты/безопасность/2FA/смена пароля), пополнение баланса, смена тарифа.
**Админка (12 экранов) — вообще не пройдена глазами** (нужен nginx basic-auth: логин `admin`, пароль у владельца в `.htpasswd-admin`).
**Auth-флоу:** регистрация (капча!), вход, забыл-пароль, сброс, 2FA, recovery-код, подтверждение email.

---

## 🔑 ТЕСТ-ОКРУЖЕНИЕ для Playwright (как поднять вход)

1. **Колонка пароля = `password_hash`** (НЕ `password`!). Логин — по email+password, тротлинг есть, капчи на входе нет.
2. Тест-юзер уже заведён: **`admin@demo.local` / `password123`** (tenant=1 «demo», 3 проекта + 5 сделок). Если сбросился:
   ```php
   php artisan tinker --execute='$u=\App\Models\User::where("email","admin@demo.local")->first();$u->password_hash=\Hash::make("password123");$u->is_active=true;$u->email_verified_at=now();$u->save();'
   ```
3. **Локальный сервер** (отдаёт собранные ассеты, т.к. нет `public/hot`):
   `php artisan serve --host=127.0.0.1 --port=8123` (в фоне).
   Перед прогоном фронт собрать с sitekey: `VITE_YANDEX_SMARTCAPTCHA_SITEKEY="ysc1_…" npm run build` (иначе на /register капча уйдёт в стаб — для остальных экранов неважно).
4. **Playwright-ввод капризен** (`browser_type` требует `target` и матчится по селектору). Надёжно — заполнять Vue-инпуты через `browser_evaluate`:
   ```js
   () => { const set=(el,v)=>{const d=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value').set;d.call(el,v);el.dispatchEvent(new Event('input',{bubbles:true}));el.dispatchEvent(new Event('change',{bubbles:true}));}; /* querySelector + set */ }
   ```
   Клик по кнопке — тоже через evaluate по `textContent`.
5. **Скриншоты** сохраняются в корень репо (`./walk-*.png`) — НЕ коммитить, чистить после.

---

## 🧭 ПРОМТ СЛЕДУЮЩЕЙ СЕССИИ (вставить как есть)

> Кодовая фраза «роутер-наставник». Продолжаем UI-аудит портала Лидерра — **жёстко через Playwright, протыкивая ВСЁ сам**. Прочитай первым: `docs/superpowers/specs/2026-06-21-ui-audit-findings-and-next-session.md` (что уже просмотрено/починено + тест-вход).
>
> **ОБЯЗАТЕЛЬНО вызови скилы (жёсткий акцент, не пропускать):**
> 1. `ui-ux-pro-max` — чек-лист §1–§10 (a11y, touch, контраст, выравнивание, иконки, формы).
> 2. `design:design-critique` — критика каждого экрана.
> 3. `superpowers:systematic-debugging` — на КАЖДЫЙ найденный баг (root cause до фикса).
> 4. `superpowers:test-driven-development` — фикс с тестом (где есть логика; фронт-vitest сломан → верификация type-check+build+Playwright).
> 5. `frontend-design` — если правка визуала/вёрстки.
>
> **МЕТОД (никаких отмазок «по коду» — только глазами в браузере):**
> - Подними локальный вход (раздел «Тест-окружение» в файле) и **пройди КАЖДЫЙ экран** (не 10–15 центральных — ВСЕ 38 + админка + все диалоги).
> - На каждом экране **ПРОТЫКАЙ ВСЁ**: открой каждую форму, **заполни все поля** (валидные/невалидные/пустые/граничные), **сохрани**, проверь успех/ошибку/тосты, **отмени**, **измени и сохрани снова**, проверь все **комбинации** (типы проектов сайт/звонок/смс; регионы один/несколько/Вся РФ; дни будни/все/выборочно; лимит 0/обычный/превышающий баланс → попап; bulk-действия pause/resume/delete/регионы/дни/лимит; пагинация; фильтры все комбинации; сортировки; пополнение баланса; смена тарифа; отчёты create/retry/cancel/destroy/download; импорт-визард со всеми ветками; настройки profile/notifications/api-keys regenerate/requisites/security/2FA enable-disable/смена пароля; колокольчик; помощь-форма). **Ничего не пропускать.**
> - Скриншоть до/после, **смотри глазами** (англ. дефолты Vuetify, склонения, налезания, обрезки, US-даты, мок-числа, мёртвые кнопки, контраст).
> - Для админки попроси у владельца nginx basic-auth (логин `admin`).
> - Каждый найденный баг: systematic-debugging → root cause → фикс → `npm run build` → выкат бандла на прод через бастион (`tar -cz build | ssh liderra-prod 'sudo tar -xz -C /var/www/liderra/app/public'`) → **переоткрой экран Playwright'ом и подтверди глазами**.
> - Жёсткие правила прода: фронт собирать с sitekey; observer-файлы расстейдживать; коммит — спрашивать; пуш в gitea; github мёртв (403).
>
> Начни с непройденных: Канбан → Настройки (все вкладки, протыкать формы) → Отчёты → Импорт → Помощь → админка. Параллельно добери минор из раздела «Найдено, но не починено».

---

## 🧹 Уборка этой сессии
- Тест-пароль на `admin@demo.local` (dev-БД) — оставлен для следующей сессии (см. тест-вход).
- Скриншоты `walk-*.png`/`verify-*.png` в корне — удалить (не коммитить).
- `php artisan serve` (порт 8123) — фоновый, можно оставить или убить.
