Compare commits
No commits in common. "1d7702a862e090a733944815c071b356232a678c" and "021cafbb49cb0f85ae9c62b05c4e2c1e84940cfd" have entirely different histories.
1d7702a862
...
021cafbb49
3 changed files with 7 additions and 55 deletions
|
|
@ -5,9 +5,6 @@
|
||||||
/**
|
/**
|
||||||
* HeroSummary — Секция 1 «Сводка» из mockup tradein.html.
|
* HeroSummary — Секция 1 «Сводка» из mockup tradein.html.
|
||||||
* Показывает медиану + достоверность CV + параметры объекта + 2 ценовых бара (объявления / сделки).
|
* Показывает медиану + достоверность CV + параметры объекта + 2 ценовых бара (объявления / сделки).
|
||||||
*
|
|
||||||
* hero-duo__hint под диапазоном сделок несёт юр-требование владельца от
|
|
||||||
* 14.08.2026 (блок 4.1): SHORT_ESTIMATE_DISCLAIMER — см. `lib/legal-copy.ts`.
|
|
||||||
*/
|
*/
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import type { AggregatedEstimate, TradeInEstimateInput, HouseType, RepairState, ConfidenceLevel } from "@/types/trade-in";
|
import type { AggregatedEstimate, TradeInEstimateInput, HouseType, RepairState, ConfidenceLevel } from "@/types/trade-in";
|
||||||
|
|
@ -15,7 +12,6 @@ import { asHouseType, asRepairState } from "@/types/trade-in";
|
||||||
import { useActiveBrandSlug, useBrand } from "@/lib/useBrand";
|
import { useActiveBrandSlug, useBrand } from "@/lib/useBrand";
|
||||||
import { sourceDot, sourceLabel } from "@/lib/source-registry";
|
import { sourceDot, sourceLabel } from "@/lib/source-registry";
|
||||||
import { dealsAsOfLabel } from "@/lib/rosreestr";
|
import { dealsAsOfLabel } from "@/lib/rosreestr";
|
||||||
import { SHORT_ESTIMATE_DISCLAIMER } from "@/lib/legal-copy";
|
|
||||||
import { HeroTransparency } from "./HeroTransparency";
|
import { HeroTransparency } from "./HeroTransparency";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
|
|
@ -482,9 +478,6 @@ export function HeroSummary({ estimate, input, onResubmit, isResubmitting = fals
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<p className="hero-duo__hint">
|
<p className="hero-duo__hint">
|
||||||
{/* Блок 4.1 (владелец, 14.08.2026) — юр-строка идёт первым
|
|
||||||
предложением абзаца-дисклеймера, не отдельным блоком. */}
|
|
||||||
{SHORT_ESTIMATE_DISCLAIMER}{" "}
|
|
||||||
Диапазон отражает разброс цен по рынку, а не погрешность оценки.
|
Диапазон отражает разброс цен по рынку, а не погрешность оценки.
|
||||||
{/* #2209: честное раскрытие точности — замеренное покрытие бэктестом
|
{/* #2209: честное раскрытие точности — замеренное покрытие бэктестом
|
||||||
по реальным ДКП Росреестра (2026-07: n=276, coverage 81.5%).
|
по реальным ДКП Росреестра (2026-07: n=276, coverage 81.5%).
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,9 @@
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
/**
|
|
||||||
* §1.2-дисклеймер под ценовыми карточками несёт юр-требование владельца от
|
|
||||||
* 14.08.2026 (блок 4.1): SHORT_ESTIMATE_DISCLAIMER — см. `lib/legal-copy.ts`.
|
|
||||||
*/
|
|
||||||
import { Fragment } from "react";
|
import { Fragment } from "react";
|
||||||
import type { Ref } from "react";
|
import type { Ref } from "react";
|
||||||
import { tokens } from "./tokens";
|
import { tokens } from "./tokens";
|
||||||
import type { ResultPanelData } from "./mappers";
|
import type { ResultPanelData } from "./mappers";
|
||||||
import { SHORT_ESTIMATE_DISCLAIMER } from "@/lib/legal-copy";
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
accent,
|
accent,
|
||||||
|
|
@ -562,29 +557,20 @@ export default function ResultPanel({
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* §1.2 честный разброс + юр-дисклеймер (владелец, 14.08.2026, блок 4.1):
|
{/* §1.2 честный разброс: диапазоны цен = рыночный спред, НЕ погрешность
|
||||||
SHORT_ESTIMATE_DISCLAIMER идёт первым предложением, "разброс цен"
|
оценки. Ставим сразу под ценовыми карточками, чтобы широкий диапазон
|
||||||
— вторым, один абзац (три отдельных оговорки подряд читались бы
|
не читался как «неуверенность расчёта». */}
|
||||||
как шум). Ставим сразу под ценовыми карточками, чтобы широкий
|
|
||||||
диапазон не читался как «неуверенность расчёта».
|
|
||||||
Компенсация высоты: этот блок стал на строку выше, чем до
|
|
||||||
SHORT_ESTIMATE_DISCLAIMER (776px средняя колонка узкая для двух
|
|
||||||
предложений в одну строку) — lineHeight/marginTop подрезаны, и
|
|
||||||
padding у "ranges + radar" box ниже уменьшен по вертикали, чтобы
|
|
||||||
не сжимать плитки "ИСТОЧНИКИ ДАННЫХ" (flex:1 ниже). Высота
|
|
||||||
артборда (1536×1024, v2/page.tsx) не менялась. */}
|
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
// M3 — было 10px muted-микропринт; повышено до 12px body, чтобы
|
// M3 — было 10px muted-микропринт; повышено до 12px body, чтобы
|
||||||
// ключевая honest-оговорка о разбросе читалась, а не терялась.
|
// ключевая honest-оговорка о разбросе читалась, а не терялась.
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
lineHeight: 1.4,
|
lineHeight: 1.5,
|
||||||
color: body,
|
color: body,
|
||||||
marginTop: -6,
|
marginTop: -4,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{SHORT_ESTIMATE_DISCLAIMER} Диапазоны показывают разброс цен на рынке,
|
Диапазоны показывают разброс цен на рынке, а не погрешность оценки.
|
||||||
а не погрешность оценки.
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* ranges + radar */}
|
{/* ranges + radar */}
|
||||||
|
|
@ -595,9 +581,7 @@ export default function ResultPanel({
|
||||||
backdropFilter: "blur(6px)",
|
backdropFilter: "blur(6px)",
|
||||||
border: `1px solid ${line2}`,
|
border: `1px solid ${line2}`,
|
||||||
borderRadius: 8,
|
borderRadius: 8,
|
||||||
// было "18px 20px" — вертикаль подрезана на 4px сверху/снизу, см.
|
padding: "18px 20px",
|
||||||
// комментарий к дисклеймеру выше (компенсация высоты под #4.1).
|
|
||||||
padding: "14px 20px",
|
|
||||||
display: "grid",
|
display: "grid",
|
||||||
gridTemplateColumns: "1fr 1fr",
|
gridTemplateColumns: "1fr 1fr",
|
||||||
gap: 24,
|
gap: 24,
|
||||||
|
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
/**
|
|
||||||
* Юридические короткие оговорки для экранов расчёта «Меры».
|
|
||||||
*
|
|
||||||
* Источник: юр-требование владельца от 14.08.2026 (блок 4.1) — прямо под
|
|
||||||
* диапазоном цены на экране результата обязана быть строка «Ориентировочный
|
|
||||||
* расчёт. Не является официальной оценкой.».
|
|
||||||
*
|
|
||||||
* Модуль НАМЕРЕННО без импортов (кроме типов) — используется и из закрытого
|
|
||||||
* контура (`components/trade-in/v2/ResultPanel.tsx`,
|
|
||||||
* `components/trade-in/HeroSummary.tsx`), и потенциально из `/mera-public`,
|
|
||||||
* где действует isolation-guard
|
|
||||||
* (`scripts/check-mera-public-isolation.mjs`) — любой транзитивный импорт
|
|
||||||
* закрытого контура (useMe / lib/api / lib/sessionId / isPathAllowed) в
|
|
||||||
* публичный бандл провалит проверку.
|
|
||||||
*
|
|
||||||
* В репозитории уже есть соседние, но НЕ идентичные дисклеймеры — не путать
|
|
||||||
* и не плодить пятый/шестой литерал с той же сутью:
|
|
||||||
* - `src/app/mera-public/content.ts` → DELIVERABLES_DISCLAIMER (135-ФЗ)
|
|
||||||
* - `src/app/mera-public/_components/SiteFooter.tsx:109`
|
|
||||||
* - `src/app/oferta/page.tsx:253`
|
|
||||||
* - `backend/app/services/trade_in_pdf.py` (версия для PDF-отчёта)
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const SHORT_ESTIMATE_DISCLAIMER =
|
|
||||||
"Ориентировочный расчёт. Не является официальной оценкой.";
|
|
||||||
Loading…
Add table
Reference in a new issue