Commit graph

5 commits

Author SHA1 Message Date
lekss361
81dd103cb4 fix(tradein-ui): replace Tailwind with OKLCH tokens + a11y on disclaimer
Review-bot feedback on #517:
- tradein-mvp/frontend doesn't use Tailwind — classes (rounded-lg, bg-amber-50, …)
  rendered as plain unstyled text. Replace with inline styles using project's
  OKLCH design tokens (--accent-2, --accent-2-soft, --surface-2, --radius, --fg).
- Add role=status aria-live=polite on disclaimer for screen readers
- Move handleResubmit below resultData declaration (ESLint no-use-before-define)
2026-05-24 15:47:40 +03:00
lekss361
765b172cd6 feat(tradein-ui): mock-disclaimer + progressive enrichment + UX polish
- Plaque «адрес распознан неточно» when target_address has 'Склад|Гараж|…'
  prefix or confidence_explanation starts with address_not_geocoded
- Inline form to fill house_type/repair_state if NULL → POST /estimate re-run
- Hide actual_deals section if empty
- 'нет данных' label for est_days_on_market when null

Source: estimate a0a0b820-e8a8-4eee-aa73-0ab3b98ac233 — UI fallouts from
backend roadmap (PR 7 of 8).
2026-05-24 15:23:54 +03:00
9b2a54788b fix(tradein): восстановленная оценка показывает этаж/площадь, не 0/0
AggregatedEstimate не нёс параметры целевой квартиры (площадь, этаж,
комнаты, год, тип дома). HeroSummary брал их из формы-инпута — у
свежей оценки работало, но при открытии оценки по ссылке (?id=, из
Истории) формы нет → «Сводка» показывала «ЭТАЖ 0/0, Площадь 0 м²».

Параметры теперь проходят сквозь весь стек:
- AggregatedEstimate + TS-тип получили area_m2/rooms/floor/
  total_floors/year_built/house_type/repair_state/has_balcony;
- estimate_quality заполняет их из payload, get_estimate — из строки
  trade_in_estimates (колонки там уже есть);
- HeroSummary читает из estimate с откатом на input.

Заодно в TS-тип добавлен пропущенный est_days_on_market.
2026-05-22 15:50:19 +05:00
TradeIn Deploy
1941c3d7df fix(tradein): фото аналога в Сводке + честный статус источников
UI-баги, замеченные при обзоре результата оценки:

- HeroSummary: блок hero-photo был пустым серым плейсхолдером (в
  макете там фото, в коде слот не подключён). Теперь показывает фото
  первого аналога с картинкой; onError → fallback на плейсхолдер.

- SourcesProgress: источники без данных после завершения оценки
  оставались в статусе idle с подписью «ожидает запрос» — выглядело
  как зависший запрос. Теперь после готовности → «нет данных»
  (терминальный статус).
2026-05-22 12:02:56 +05:00
lekss361
02267d0306 feat: add tradein-mvp subproject (Trade-In Estimator под /trade-in)
- FastAPI backend: PostGIS estimator + 3 scrapers (Avito/Cian/Yandex)
- Next.js 15 frontend: tradein.html mockup design, basePath=/trade-in
- WeasyPrint PDF (Брусника-style 4-page report)
- Address autocomplete с typo-tolerance + 6 EKB presets
- Изолированный docker stack gendesign-tradein (отдельная postgres БД)
- Caddy inline routes: gendsgn.ru/trade-in/* и /trade-in/api/v1/*
- Forgejo Actions: .forgejo/workflows/deploy-tradein.yml (shell-based GHCR login)
- Триггер только по paths: tradein-mvp/** (не пересекается с deploy.yml)
- Образы: ghcr.io/lekss361/gendesign-tradein-{backend,frontend}:latest

Первый запуск на сервере (вручную, один раз):
  - создать /opt/gendesign/tradein-mvp/.env.runtime (postgres pwd, contact email)
  - docker network create gendesign_shared (если нет)
  - docker compose -p gendesign-tradein up -d
  - docker compose -p gendesign exec caddy caddy reload
2026-05-21 00:25:39 +03:00