From a575f59378e7f238e85dc6eba2746c83fd506237 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sun, 12 Jul 2026 17:54:04 +0300 Subject: [PATCH] =?UTF-8?q?fix(tradein/v2):=20=D0=B0=D0=BD=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D0=B8=D0=BA=D0=B0=20=E2=80=94=202=20=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=84=D0=B8=D0=BA=D0=B0=20=D0=B2=20=D1=80=D1=8F=D0=B4,?= =?UTF-8?q?=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D0=A6=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=C3=97=D1=81=D1=80=D0=BE=D0=BA=20=D0=B2=D0=BB=D0=B5=D0=B7=D0=B0?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BD=D0=B0=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "История цен в этом доме" и "Цена × срок продажи" стояли друг под другом и переполняли фиксированную высоту v2-панели (scrollHeight 1041px vs ~847px видимой области) — scatter-график обрезался, требовался скролл. Ставим оба блока в один ряд (grid 1fr 1fr, gap 16, align-items start) — освобождает ровно ~194px по вертикали, весь оверлей помещается без скролла. Высоты и viewBox самих SVG не трогали. --- .../components/trade-in/v2/AnalyticsView.tsx | 658 +++++++++--------- 1 file changed, 335 insertions(+), 323 deletions(-) diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/AnalyticsView.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/AnalyticsView.tsx index 6d972aa4..64861eca 100644 --- a/tradein-mvp/frontend/src/components/trade-in/v2/AnalyticsView.tsx +++ b/tradein-mvp/frontend/src/components/trade-in/v2/AnalyticsView.tsx @@ -327,204 +327,196 @@ export default function AnalyticsView({ )} - {/* история цен */} -
-
-
-
- История цен в этом доме -
-
- {historyNote} -
-
-
- {avitoPts.length > 0 ? ( - - - Avito - - ) : null} - {yandexPts.length > 0 ? ( - - - Яндекс - - ) : null} -
-
- - История цен в этом доме — медиана ₽/м² по годам - - {PH_GRID_Y.map((y) => ( - - ))} - - - {data.priceHistory.yTicks.map((t) => ( - - {t.label} - - ))} - - - {data.priceHistory.years.map((yr, i) => ( - - {yr} - - ))} - - - - {/* white dot fill on an accent ring — documented one-off, no token (design l.568) */} - - Архивные объявления Avito · нажмите, чтобы открыть - {avitoPts.map((p, i) => ( - - ))} - - - {yandexDots.map((p, i) => ( - - ))} - - setHoverHist(true)} - onMouseLeave={() => setHoverHist(false)} - onClick={() => onNavigate?.(2)} - > - {hoverPts.map((p, i) => ( - - ))} - - - {hoverHist ? ( - // Dark navy tooltip surface + white text — documented one-off literals - // matching the design (l.572); no token equivalent. + {/* история цен + цена × срок продажи — side by side so both fit the + fixed-height v2 artboard panel without scrolling (reclaims ~194px + of vertical space vs. stacking; chart heights unchanged). */} +
+ {/* история цен */} +
-
- Архивные объявления этого дома +
+
+ История цен в этом доме +
+
+ {historyNote} +
-
- Нажмите, чтобы открыть список → +
+ {avitoPts.length > 0 ? ( + + + Avito + + ) : null} + {yandexPts.length > 0 ? ( + + + Яндекс + + ) : null}
- ) : null} -
- - {/* цена × срок продажи (детально) */} -
-
-
-
- Цена × срок продажи -
-
- Зависимость цены от срока экспозиции · {data.scatterDetail.note} -
-
-
- + История цен в этом доме — медиана ₽/м² по годам + + {PH_GRID_Y.map((y) => ( + + ))} + + + {data.priceHistory.yTicks.map((t) => ( + + {t.label} + + ))} + + + {data.priceHistory.years.map((yr, i) => ( + + {yr} + + ))} + + + + {/* white dot fill on an accent ring — documented one-off, no token (design l.568) */} + + Архивные объявления Avito · нажмите, чтобы открыть + {avitoPts.map((p, i) => ( + + ))} + + + {yandexDots.map((p, i) => ( + + ))} + + setHoverHist(true)} + onMouseLeave={() => setHoverHist(false)} + onClick={() => onNavigate?.(2)} + > + {hoverPts.map((p, i) => ( + + ))} + + + {hoverHist ? ( + // Dark navy tooltip surface + white text — documented one-off literals + // matching the design (l.572); no token equivalent. +
- - аналоги - - {data.scatterDetail.deals.length > 0 ? ( +
+ Архивные объявления этого дома +
+
+ Нажмите, чтобы открыть список → +
+
+ ) : null} +
+ + {/* цена × срок продажи (детально) */} +
+
+
+
+ Цена × срок продажи +
+
+ Зависимость цены от срока экспозиции · {data.scatterDetail.note} +
+
+
- сделки + аналоги - ) : null} - + {data.scatterDetail.deals.length > 0 ? ( + + + сделки + + ) : null} - объект - + > + + объект + +
+ + Цена × срок продажи + + + + + + + + + + + + + + {data.scatterDetail.deals.map((p, i) => ( + + ))} + + + {data.scatterDetail.analogs.map((p, i) => ( + + ))} + + + {/* V4: subjectApprox marks a fallback x (est_days_on_market unknown) — + dashed ring + title flag it as an estimate, not a measurement. */} + {data.scatterDetail.subjectApprox ? ( + + Срок продажи — оценка (~90 дн.), точных данных нет + + ) : null} + + + + + {data.scatterDetail.yTicks.map((t) => ( + + {t.label} + + ))} + + + {data.scatterDetail.xTicks.map((t) => ( + + {t.label} + + ))} + + + СРОК ПРОДАЖИ, ДН + + + ЦЕНА ПРОДАЖИ, ₽ + +
- - Цена × срок продажи - - - - - - - - - - - - - - {data.scatterDetail.deals.map((p, i) => ( - - ))} - - - {data.scatterDetail.analogs.map((p, i) => ( - - ))} - - - {/* V4: subjectApprox marks a fallback x (est_days_on_market unknown) — - dashed ring + title flag it as an estimate, not a measurement. */} - {data.scatterDetail.subjectApprox ? ( - - Срок продажи — оценка (~90 дн.), точных данных нет - - ) : null} - - - - - {data.scatterDetail.yTicks.map((t) => ( - - {t.label} - - ))} - - - {data.scatterDetail.xTicks.map((t) => ( - - {t.label} - - ))} - - - СРОК ПРОДАЖИ, ДН - - - ЦЕНА ПРОДАЖИ, ₽ - -
); -- 2.45.3