+ {/* ── §1.1 «Одна цифра + честный разброс»: expected_sold — цифра-герой
+ («оценка» / ожидаемая цена продажи), median — вторичный ориентир
+ «рекомендованная цена в объявлении», НЕ конкурирует за внимание.
+ При hasSold=false (старые оценки / пустая ratio) median остаётся
+ единственной честной цифрой. Empty-state при insufficientData. */}
+
{insufficientData ? (
Оценка недоступна
@@ -404,11 +412,50 @@ export function HeroSummary({ estimate, input, onResubmit, isResubmitting = fals
снова.
- ) : (
+ ) : hasSold ? (
<>
- {/* Левая ячейка: «Выставить в объявлении» */}
+ {/* Цифра-герой: «оценка» = ожидаемая цена продажи (expected_sold) */}
+
+
+ Оценка · ожидаемая цена продажи
+ {showDiscount && (
+
+ −{discountPct}% к объявлению
+
+ )}
+
+
{formatMln(sold as number)} ₽
+ {typeof soldLo === "number" && typeof soldHi === "number" && (
+
+ рыночный разброс: {formatMln(soldLo)} – {formatMln(soldHi)} ₽
+
+ )}
+ {typeof soldPerM2 === "number" && (
+
+ {soldPerM2.toLocaleString("ru-RU")} ₽/м²
+
+ )}
+
+ Диапазон отражает разброс цен по рынку, а не погрешность оценки.
+
+ {estimate.ratio_basis === "global_fallback" ? (
+
+ Ср.-городской коэффициент (мало сделок в сегменте)
+
+ ) : estimate.ratio_basis === "per_rooms" ? (
+
+ Коэффициент по сделкам той же планировки
+
+ ) : null}
+
+
+ {/* Вторичный ориентир: рекомендованная цена в объявлении (median) */}
-
Выставить в объявлении
+
Рекомендованная цена в объявлении
{formatMln(m)} ₽
{formatMln(lo)} – {formatMln(hi)} ₽
@@ -417,44 +464,18 @@ export function HeroSummary({ estimate, input, onResubmit, isResubmitting = fals
{estimate.median_price_per_m2.toLocaleString("ru-RU")} ₽/м²
-
- {/* Правая ячейка: «Получить (ожидаемая сделка)» — только при hasSold */}
- {hasSold && (
-
-
- Получить (ожидаемая сделка)
- {showDiscount && (
-
- −{discountPct}%
-
- )}
-
-
{formatMln(sold as number)} ₽
- {typeof soldLo === "number" && typeof soldHi === "number" && (
-
- {formatMln(soldLo)} – {formatMln(soldHi)} ₽
-
- )}
- {typeof soldPerM2 === "number" && (
-
- {soldPerM2.toLocaleString("ru-RU")} ₽/м²
-
- )}
- {estimate.ratio_basis === "global_fallback" ? (
-
- Ср.-городской коэффициент (мало сделок в сегменте)
-
- ) : estimate.ratio_basis === "per_rooms" ? (
-
- Коэффициент по сделкам той же планировки
-
- ) : null}
-
- )}
>
+ ) : (
+
+
Рекомендованная цена в объявлении
+
{formatMln(m)} ₽
+
+ {formatMln(lo)} – {formatMln(hi)} ₽
+
+
+ {estimate.median_price_per_m2.toLocaleString("ru-RU")} ₽/м²
+
+
)}
diff --git a/tradein-mvp/frontend/src/components/trade-in/OfferCard.tsx b/tradein-mvp/frontend/src/components/trade-in/OfferCard.tsx
index 57afae91..0bc96998 100644
--- a/tradein-mvp/frontend/src/components/trade-in/OfferCard.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/OfferCard.tsx
@@ -58,7 +58,7 @@ export function OfferCard({ estimate, brandSlug }: Props) {