Show «Ориентир запроса» (asking median) and «Ожидаемая цена продажи»
(expected sold, S3 rosreestr ДКП) as two EQUAL-weight figures (same value
typography; sold card gets a subtle accent tint only), each with range +
₽/м², plus a tasteful −N% discount chip (aria-labelled, Unicode minus) and
an explainer. Graceful: expected_sold null/0 (old estimates / empty ratio
table) → single asking figure, no empty card/rows. Tokens-only CSS, responsive.
tsc --noEmit clean (TS strict); npm run build passes.
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.
UI-баги, замеченные при обзоре результата оценки:
- HeroSummary: блок hero-photo был пустым серым плейсхолдером (в
макете там фото, в коде слот не подключён). Теперь показывает фото
первого аналога с картинкой; onError → fallback на плейсхолдер.
- SourcesProgress: источники без данных после завершения оценки
оставались в статусе idle с подписью «ожидает запрос» — выглядело
как зависший запрос. Теперь после готовности → «нет данных»
(терминальный статус).