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
Owner

Что и почему

Оба предыдущих раунда (#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 (mono meta-ячейки, пунктирная градиентная линия с акцентной серединой, wordmark на brand.name — white-label не сломан).
  • Контент: status-pill (свежесть данных), source-pill, donut-гейдж качества данных (inline SVG, техника из ObjectSummary.tsx), угловые HUD-скобки на карточках, нумерованные заголовки секций (01-04), пунктирные разделители строк — метрики качества данных считаются из реальных полей 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 (единственная оставшаяся "находка" детектора — подтверждённый false-positive на переносе строки одного заголовка, без реального наложения).

Полный pytest (2265 passed, 6 skipped) + ruff чисты; 1 непроходящий тест (test_search_cache_hit) и 3 ruff-находки (RUF059) подтверждены pre-existing на main (git diff main пуст на этих файлах).

Test plan

  • ruff check — чисто
  • Полный backend pytest — 2265 passed (1 pre-existing failure не связан с этим PR)
  • Docker-рендер + визуальный аудит всех страниц (normal + stress фикстуры)
  • Объективная проверка на наложение текста (PyMuPDF bbox)
  • code-reviewer pass — APPROVE (minor: см. коммит-гигиену, уже применена)
## Что и почему Оба предыдущих раунда (#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` (mono meta-ячейки, пунктирная градиентная линия с акцентной серединой, wordmark на `brand.name` — white-label не сломан). - **Контент**: status-pill (свежесть данных), source-pill, donut-гейдж качества данных (inline SVG, техника из `ObjectSummary.tsx`), угловые HUD-скобки на карточках, нумерованные заголовки секций (01-04), пунктирные разделители строк — метрики качества данных считаются из реальных полей `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 (единственная оставшаяся "находка" детектора — подтверждённый false-positive на переносе строки одного заголовка, без реального наложения). Полный `pytest` (2265 passed, 6 skipped) + `ruff` чисты; 1 непроходящий тест (`test_search_cache_hit`) и 3 ruff-находки (`RUF059`) подтверждены pre-existing на main (`git diff main` пуст на этих файлах). ## Test plan - [x] `ruff check` — чисто - [x] Полный backend `pytest` — 2265 passed (1 pre-existing failure не связан с этим PR) - [x] Docker-рендер + визуальный аудит всех страниц (normal + stress фикстуры) - [x] Объективная проверка на наложение текста (PyMuPDF bbox) - [x] code-reviewer pass — APPROVE (minor: см. коммит-гигиену, уже применена)
lekss361 added 1 commit 2026-07-04 18:35:15 +00:00
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
5dc9abecc9
Оба предыдущих раунда (#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 пуст на этих файлах).
lekss361 merged commit b2d42a631a into main 2026-07-04 18:41:21 +00:00
lekss361 deleted branch feat/pdf-mera-hud-redesign 2026-07-04 18:41:22 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2434
No description provided.