feat(tradein/pdf): редизайн отчёта в реальном языке МЕРА (v2 HUD) #2434

Merged
lekss361 merged 1 commit from feat/pdf-mera-hud-redesign into main 2026-07-04 18:41:21 +00:00

1 commit

Author SHA1 Message Date
bot-backend
5dc9abecc9 feat(tradein/pdf): редизайн отчёта в реальном языке МЕРА (v2 HUD), не в PRINZIP-референсе
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 50s
Оба предыдущих раунда (#2327, #2427) опирались на frontend/public/tradein.html +
trade-in.css — старый демо-мокап «PRINZIP», стилизованный под Брусника-конкурента
(footer файла: `data: brusnika-obmen-style`). Реальный бренд «МЕРА» — это
/trade-in/v2, HUD/blueprint-дэшборд с другой палитрой (v2/tokens.ts),
другими шрифтами (Manrope + IBM Plex Mono вместо PT Sans/Serif) и другим
словарём компонентов (glass-карточки с угловыми HUD-скобками, нумерованные
секции, donut-гейдж качества данных, пунктирные разделители, source-pill).

- Шрифты: Manrope (инстансирован из variable-файла через fonttools
  varLib.instancer, т.к. WeasyPrint не поддерживает variable-font @font-face)
  + IBM Plex Mono 400/500, embedded тем же _font_data_url()-паттерном, что
  PT Sans/Serif в #2427.
- Палитра/chrome: _ACCENT*/_BORDER* заменены на полный набор токенов 1:1 из
  v2/tokens.ts; _page_header/_page_footer переписаны по мотивам HeroBar.tsx/
  Footer.tsx (мono meta-ячейки, пунктирная градиентная линия с акцентной
  серединой, wordmark на brand.name — white-label не сломан).
- Контент: status-pill (свежесть данных), source-pill, donut-гейдж качества
  (inline SVG, техника из ObjectSummary.tsx), угловые HUD-скобки на
  карточках, нумерованные заголовки секций (01-04), пунктирные разделители
  строк — метрики качества данных (источники/CV/разброс) считаются из
  реальных полей AggregatedEstimate, не выдуманы.
- Overflow-hardening (главная жалоба к прошлому прототипу — «текст
  залезает друг на друга»): overflow-wrap:anywhere на всех
  data-производных строках (адрес, brand.name, названия аналогов, диск-
  лаймер с UUID), никакого nowrap кроме заведомо ограниченных полей
  (даты/номер отчёта/короткие лейблы), table-layout:fixed на таблице
  примеров, break-inside:avoid на карточках преимуществ.
- Верификация: реальный рендер в Docker (WeasyPrint) на normal + stress
  фикстурах (длинный адрес, длинный white-label бренд, экстремальные
  цены) + объективный PyMuPDF bbox-overlap детектор поверх текста —
  2 итерации fix (переполнение страницы на cover, перенос wordmark
  посреди слова в футере), 3-я verify — ALL_CLEAR. Полный pytest (2265
  passed) + ruff чисты; 1 непроходящий тест и 3 ruff-находки подтверждены
  pre-existing на main (git diff main пуст на этих файлах).
2026-07-04 21:34:26 +03:00