---
name: tbr-v2-redesign
description: "Редизайн сайта лотов «Торги без риска» (lots.zbrcheck.ru / tbr-frontend) — прототип одобрен владельцем, реализуем в один проход с проверками. Брать при работе над фронтом tbr-frontend / лентой лотов / фильтрами / карточкой / AI-отчётом сайта."
metadata: 
  node_type: memory
  type: project
  originSessionId: d0c6c5aa-4d05-42e2-a1f9-034482b88603
---

**Статус (2026-06-27): редизайн v2 РЕАЛИЗОВАН в проде и проверен (Playwright E2E + бот-кап на живой БД, 0 console-ошибок).** Деталь в Obsidian Changelog «2026-06-27 — Редизайн v2». Полный план + аудит: `~/.claude/plans/soft-crunching-ember.md`.

**Что реально в проде (маркер `TR-V2-2026`, бэкапы `.bak-v2-20260627-*`):** сайдбар-фильтры слева (`components/FilterBar.tsx`) + поиск региона typeahead (`components/RegionSelect.tsx`) + мобильная шторка с «Показать N» (FAB) + count-up/скелетоны + тосты брони (`components/Toast.tsx`, чинят молчаливые провалы аудит #6/#9/#11) + карточка по достоверности (high→золотой «−X% к рынку», region→мягкий «Ориентир рынка ≈», аудит #2) + кабинет AI-панель error/timeout + сумма на кнопке оплаты (аудит #3/#7/#10) + бот «Горячие лоты» кап дисконта (`bot/handlers.py`, аудит #8). **Палитра ПРИВЕДЕНА к артефакту (2026-06-27, маркер `TR-V2-ARTIFACT`):** тёплая бумага `#F0EEE8` + белые карточки + форест-зелёный `#1E6B40` + золото `#A9771A` + системный шрифт (отменяет прежнее «бренд не меняем», см. Decisions **D-v2-design-REVISED**). accent перекрашен в зелёный. **Логотип — исключение, пиксель-в-пиксель прежний:** цвета (оливковый `#3D6B2A`/синий `#1E7FB5`) и Unbounded зашиты прямо в `Logo.tsx`, не через токены. Если правишь палитру — лого не трогается автоматически, это by design.

**Полная E2E-проверка «безотказно» (2026-06-27):** 5 блоков реальным прогоном (Playwright :20151 + curl + tg-web-e2e), всё PASS. Найден+исправлен латентный баг **paid-race** (`tbr/web/api.py`, маркер `TR-FIX-PAIDRACE`, бэкап `.bak-paidrace-*`, см. Decisions D-v2-paidrace): при гонке `try_book`→`("paid", чужая_бронь)` фронт считал успехом → молча вёл в кабинет без брони; фикс — бэк отдаёт `taken`, если оплаченная бронь принадлежит ДРУГОМУ. Бронь tester1 за баланс проверена с откатом (booking #43+Deal удалены, free 7 восстановлен, БД=базовая точка). Скрипты проверок: `~/.../scratchpad/verify_{anon,authed,admin,collapse}.py`. Бот @TorgiBezRiska_bot — только просмотр/алерты (бронь развязана DC1); кнопка ленты = «📍 Лоты по областям» (НЕ «🔥 Лоты» — то admin-инлайн). Тест-аккаунты: tester1..5/`TbrTest2026` (uid 5..9), Admin (creds .env). MAX_ACTIVE_LOCKS=5.

region-тир чинится на отображении, valuation.py не трогали (D-v2-region-display). **Бронь за баланс:** статус `free_confirmed` = успех → `/dashboard` (был баг: показывался ошибкой; runBook теперь перечисляет ОТКАЗЫ, не успехи). Тост — сплошной цвет + белый текст (не прозрачный). PWA уже работает (manifest+sw.js+InstallPrompt в шапке). **НЕ тронуто:** вход LOGPASS_ONLY (проверено — тестировщики входят), оплата (выключена), визуал участка на карточке.

**Верхние блоки СВЁРНУТЫ (2026-06-27, маркер `TR-V2-CLEAN`):** 4 шага «как это работает» + реф-панель → тонкие кликабельные полоски под героем (`useState howOpen/refOpen`, дефолт закрыты), раскрытие одним кликом (`animate-fade-in`), шеврон ▾ крутится. Чистый герой как в артефакте, но ничего не потеряно. Ключевой trust-message («мы не продаём — продаёт государство») и баланс броней («🎟 Бесплатные брони: N») видны прямо в свёрнутых заголовках → ребёнок понимает с одного взгляда. Реф-полоска только для авторизованных. Проверено Playwright (17/17 PASS: аноним+tester1, desktop+mobile, 0 console-ошибок) + скриншоты. Бэкап `page.tsx.bak-v2-clean-20260627-100953`.

**Что делаем (фронт `~/Services/tbr-frontend`, бэк точечно):** новый визуал воронки + анимации (Framer/CSS), **фильтры в постоянном сайдбаре слева** (на мобиле — нижняя шторка) с **поиском региона** (typeahead), кнопкой «Показать N лотов», сохранением фильтров; карточка лота **data-only** (без визуала участка); карта = вторичный **«Поиск рядом»** по радиусу, **без пинов лотов**; поток бронь→раскрытие→панель AI-отчёта; онбординг «Как это работает» доступен всем.

**Жёсткие правила:**
- **Логотип — существующий `components/Logo.tsx`** (наковальня + «Торги без риска / проект Земля без риска»). Мок-марка `◢` из прототипа НЕ переносится.
- **НЕ трогать вход** (LOGPASS_ONLY — тест-режим, не проблема) и **оплату** (временно выключена — платёжные находки сейчас не актуальны).
- **Визуал участка / НСПД-скрин / пины / точная карта на карточке — НЕЛЬЗЯ** (раскрывает расположение → бронь мимо нас на torgi.gov.ru; координаты лота `наружу не отдаём`). Спутник+контур остаётся ПЛАТНЫМ (в AI-отчёте, движок `zemlya-bot/bot/services/nspd_snapshot.py`). Предпросмотр лота до брони — тоже НЕТ.
- Деплой: `.bak-v2-<ts>` → чистая сборка из папки приложения (`rm -rf .next && npm run build`, см. [[kodoceh_web_build_gotcha]]) → рестарт `local.tbr-frontend` → Playwright desktop+mobile → регресс брони/онбординга → Obsidian.

**В тот же проход — багфиксы аудита** (77 находок, см. план): молчаливые провалы брони→понятные тосты (`app/page.tsx` runBook), истёкший лок, AI-отчёт без error/timeout (`app/dashboard/page.tsx`), **кап завышенной оценки region-тира** в ленте (`tbr/valuation.py`+`config.py` SUSPICIOUS_DISCOUNT_CAP) и в боте «🔥 Горячие лоты» (`tbr/bot/handlers.py:163`), обработка ошибок инлайн-кнопок админки, закрыть `/bookings/*` (`tbr/web/api.py:241`), дисклеймеры/ЗОУИТ-тултип/контраст.

**Стенд:** SSH `cebers_mini@Cebers-mini.local`; фронт `:20151`/lots.zbrcheck.ru, API `:20152`, бот `@TorgiBezRiska_bot`, админ `Admin` (creds в `~/Services/tbr/.env`). Связано: [[tbr_overview]], [[zemlya_web_overview]].
