({
diff --git a/frontend/src/lib/nspdLinks.ts b/frontend/src/lib/nspdLinks.ts
index 773ada1a..7e7918d2 100644
--- a/frontend/src/lib/nspdLinks.ts
+++ b/frontend/src/lib/nspdLinks.ts
@@ -7,7 +7,7 @@
* и иметь один безопасный канал кодирования кадастрового номера.
*
* Существующие потребители паттерна (до централизации): NspdZoningBlock,
- * NspdOpportunityBlock, ParcelDrawer, AnalysisSidebar.
+ * NspdOpportunityBlock, ParcelDrawer.
*/
/**
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 ae5e824b..9092eeee 100644
--- a/tradein-mvp/frontend/src/components/trade-in/v2/AnalyticsView.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/v2/AnalyticsView.tsx
@@ -1,18 +1,20 @@
"use client";
// Overlay 06 "АНАЛИТИКА ДОМА" — markup port from the МЕРА Оценка pixel design.
-// Accepts one composite `data` prop (default = the design fixture); page.tsx
-// feeds mapAnalytics(...) output. The price-history dots navigate to the
-// "Аналогичные объявления" overlay via onNavigate?.(2).
+// Accepts one composite `data` prop; page.tsx feeds mapAnalytics(...) output.
+// The price-history dots navigate to the "Аналогичные объявления" overlay via
+// onNavigate?.(2).
import { useMemo, useState } from "react";
import { tokens } from "./tokens";
-import { analytics as ANALYTICS_FIXTURE } from "./fixtures";
import { phYearX as histYearX, PH_GRID_Y } from "./mappers";
import type { Analytics, SellTimeTier } from "./types";
interface AnalyticsViewProps {
- data?: Analytics;
+ // Required on the app path (v2/page.tsx -> SectionOverlay always supplies
+ // mapAnalytics output) — an omitted prop must be a TS error, not a silent
+ // fallback to fabricated house-analytics numbers.
+ data: Analytics;
onNavigate?: (i: number) => void;
}
@@ -130,7 +132,7 @@ function sellTimeTierValid(tier: SellTimeTier): boolean {
}
export default function AnalyticsView({
- data = ANALYTICS_FIXTURE,
+ data,
onNavigate,
}: AnalyticsViewProps) {
const [hoverHist, setHoverHist] = useState(false);
diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/CacheView.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/CacheView.tsx
index 92158c73..1c699b66 100644
--- a/tradein-mvp/frontend/src/components/trade-in/v2/CacheView.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/v2/CacheView.tsx
@@ -1,13 +1,10 @@
// OVERLAY 07: ПРЕДЫДУЩИЕ ОЦЕНКИ (cache view).
// Faithful markup port of МЕРА Оценка.dc.html lines 593-613.
-// Data via `data` prop (mapCache output); defaults to fixtures (cacheKpi + cacheRows).
+// Data via the required `data` prop (mapCache output).
import { tokens } from "./tokens";
-import { cacheKpi, cacheRows } from "./fixtures";
import type { CacheData } from "./mappers";
-const FIXTURE_CACHE: CacheData = { kpis: cacheKpi, rows: cacheRows };
-
/**
* M8 — ВРЕМЯ column normalizer. `r.time` arrives PRE-FORMATTED as a string from
* mapCache (CacheRow.time, produced by fmtCacheTime), one of:
@@ -34,13 +31,16 @@ function normTime(raw: string | null | undefined): string {
}
interface CacheViewProps {
- data?: CacheData;
+ // Required on the app path (v2/page.tsx -> SectionOverlay always supplies
+ // mapCache output) — an omitted prop must be a TS error, not a silent
+ // fallback to fabricated «Предыдущие оценки» rows.
+ data: CacheData;
/** Row-click handler (#2420) — navigates to the full report for that
- * historical estimate. Optional: unwired/storybook usage leaves rows inert. */
+ * historical estimate. Optional: leaves rows inert when absent. */
onSelectRow?: (id: string) => void;
}
-export function CacheView({ data = FIXTURE_CACHE, onSelectRow }: CacheViewProps) {
+export function CacheView({ data, onSelectRow }: CacheViewProps) {
const showSrc = data.rows.some((r) => r.src && r.src !== "—");
// #2420 — ПАРАМЕТРЫ column inserted right after АДРЕС.
const gridCols = showSrc
diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/Footer.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/Footer.tsx
index cf79a55e..01ab9d22 100644
--- a/tradein-mvp/frontend/src/components/trade-in/v2/Footer.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/v2/Footer.tsx
@@ -1,20 +1,23 @@
// Report footer for the /trade-in/v2 "МЕРА Оценка" design port.
// Faithful markup port of the design footer (МЕРА Оценка.dc.html, lines 426-439):
// report id / date / valid-until on the left, a decorative centre line, and the
-// МЕРА v2.0.6 wordmark on the right. Static markup, data from fixtures.
+// МЕРА v2.0.6 wordmark on the right. Static markup, id/date/validUntil via `data`.
import { tokens } from "./tokens";
-import { report, version } from "./fixtures";
+import { version } from "./fixtures";
import type { Report } from "./types";
interface FooterProps {
- data?: Report;
+ // Required on the app path (v2/page.tsx always supplies mapReport output or
+ // EMPTY_REPORT, never the design fixtures) — an omitted prop must be a TS
+ // error, not a silent fallback to a fabricated report id/date.
+ data: Report;
// M4: hide the «ДЕЙСТВИТЕЛЕН ДО» validity line when there is no real estimate
// (mirrors HeroBar). Optional → unwired/fixture usage keeps showing it.
hasEstimate?: boolean;
}
-export function Footer({ data = report, hasEstimate }: FooterProps) {
+export function Footer({ data, hasEstimate }: FooterProps) {
return (
SectionOverlay always supplies
+ // mapHistory output) — an omitted prop must be a TS error, not a silent
+ // fallback to fabricated house-sale/deal rows.
+ data: HistoryData;
}
-export default function HistoryView({
- data = HISTORY_FIXTURE,
-}: HistoryViewProps) {
+export default function HistoryView({ data }: HistoryViewProps) {
const showAsk = data.dkpRows.some((r) => r.ask && r.ask !== "—");
const dkpGridCols = showAsk
? "2.2fr 1fr 1.3fr 1fr .9fr 2fr"
diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/ObjectSummary.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/ObjectSummary.tsx
index bcdffa01..04a8c13b 100644
--- a/tradein-mvp/frontend/src/components/trade-in/v2/ObjectSummary.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/v2/ObjectSummary.tsx
@@ -1,20 +1,20 @@
// 03 СВОДКА ОБЪЕКТА — right-rail summary card for the /trade-in/v2 "МЕРА Оценка"
// design port. Faithful markup port of МЕРА Оценка.dc.html lines 397-422:
// address + "В РАСЧЁТЕ" badge, four clickable per-section totals, and a
-// "КАЧЕСТВО ДАННЫХ" block with a donut. Data from fixtures; clicks fire
-// onNavigate(row.nav) only — no API, no fetching.
+// "КАЧЕСТВО ДАННЫХ" block with a donut. Data arrives via the `data` prop
+// (mapObject/mapSummary output); clicks fire onNavigate(row.nav) only — no
+// API, no fetching in this component itself.
"use client";
import { tokens } from "./tokens";
-import { object, summary } from "./fixtures";
import type { ObjectSummaryData } from "./mappers";
-// Default presentation data (unwired usage): the existing design fixtures.
-const OBJECT_SUMMARY_FIXTURE: ObjectSummaryData = { object, summary };
-
interface ObjectSummaryProps {
- data?: ObjectSummaryData;
+ // Required on the app path (v2/page.tsx always supplies mapObject/mapSummary
+ // output) — an omitted prop must be a TS error, not a silent fallback to
+ // fabricated per-section totals.
+ data: ObjectSummaryData;
onNavigate: (i: number) => void;
}
@@ -38,7 +38,7 @@ function rowHint(label: string): string {
}
export function ObjectSummary({
- data = OBJECT_SUMMARY_FIXTURE,
+ data,
onNavigate,
}: ObjectSummaryProps) {
return (
diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/ResultPanel.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/ResultPanel.tsx
index 6bb5bc15..e2d50e8d 100644
--- a/tradein-mvp/frontend/src/components/trade-in/v2/ResultPanel.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/v2/ResultPanel.tsx
@@ -3,13 +3,6 @@
import { Fragment } from "react";
import type { Ref } from "react";
import { tokens } from "./tokens";
-import {
- ranges,
- resultCards,
- resultMeta,
- scatterMini,
- sources,
-} from "./fixtures";
import type { ResultPanelData } from "./mappers";
const {
@@ -39,17 +32,11 @@ const {
font,
} = tokens;
-// Default presentation data (unwired usage): the existing design fixtures.
-const RESULT_FIXTURE: ResultPanelData = {
- cards: resultCards,
- meta: resultMeta,
- ranges,
- scatterMini,
- sources,
-};
-
interface ResultPanelProps {
- data?: ResultPanelData;
+ // Required on the app path (v2/page.tsx always supplies mapResultPanel
+ // output) — an omitted prop must be a TS error, not a silent fallback to
+ // fabricated price/analytics numbers on a paid estimate screen.
+ data: ResultPanelData;
onNavigate: (i: number) => void;
// #2264 C7: after a successful estimate the page moves focus here (a labelled,
// programmatically-focusable region) so keyboard/SR users land on the result
@@ -92,7 +79,7 @@ function sourceName(name: string) {
}
export default function ResultPanel({
- data = RESULT_FIXTURE,
+ data,
onNavigate,
regionRef,
}: ResultPanelProps) {
diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/SectionOverlay.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/SectionOverlay.tsx
index 8a995065..b4ecdc72 100644
--- a/tradein-mvp/frontend/src/components/trade-in/v2/SectionOverlay.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/v2/SectionOverlay.tsx
@@ -23,12 +23,13 @@ interface SectionOverlayProps {
onClose: () => void;
onNavigate: (i: number) => void;
// Mapped overlay data, fed by page.tsx (mapHistory / mapSources / mapAnalytics
- // / mapCache). Optional so unwired/storybook usage falls back to each view's
- // fixture default.
- history?: HistoryData;
- sources?: SourcesData;
- analytics?: Analytics;
- cache?: CacheData;
+ // / mapCache) — always computed unconditionally (never undefined), and
+ // required here in lockstep with the child views' own required `data` prop
+ // (no more silent fallback to design fixtures on a missing value).
+ history: HistoryData;
+ sources: SourcesData;
+ analytics: Analytics;
+ cache: CacheData;
// Raw current estimate — threaded straight to SourcesView's SourcesMap
// (real per-lot lat/lon; sources/SourcesData above is pre-mapped display
// strings with no geometry). Optional/null: no estimate yet -> map degrades
diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/SourcesView.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/SourcesView.tsx
index 7d1dc26d..fb9ceffc 100644
--- a/tradein-mvp/frontend/src/components/trade-in/v2/SourcesView.tsx
+++ b/tradein-mvp/frontend/src/components/trade-in/v2/SourcesView.tsx
@@ -4,7 +4,6 @@ import type { CSSProperties, ReactNode } from "react";
import { safeUrl } from "@/lib/safeUrl";
import type { AggregatedEstimate } from "@/types/trade-in";
import { tokens } from "./tokens";
-import { adRows, dealRows, marketAds, marketDeals } from "./fixtures";
import type { AdRowData, DealRowData, SourcesData } from "./mappers";
import { SourcesMap } from "./SourcesMap";
@@ -12,9 +11,9 @@ import { SourcesMap } from "./SourcesMap";
// Faithful markup port from "МЕРА Оценка.dc.html" (lines 492-537).
// Card A: объявления в продаже (3 KPI + filter chips + adRows table).
// Card B: фактические сделки (3 KPI + dealRows table).
-// Markup is data-driven via the `data` prop; the design fixtures stay as the
-// DEFAULT for unwired/storybook usage. (M11 below may hide an all-«—» column,
-// so the storybook render can differ from the design HTML by a dead column.)
+// Markup is data-driven via the required `data` prop (mapSources output).
+// (M11 below may hide an all-«—» column, so the render can differ from the
+// design HTML by a dead column.)
//
// M7 — the two "tables" are CSS grids of s. They now carry real table
// semantics via ARIA roles (table / row / columnheader / cell) layered onto the
@@ -485,26 +484,20 @@ function DataTable({
);
}
-// Default presentation data (unwired/storybook usage): the existing design
-// fixtures. AdRow[]/DealRow[] satisfy AdRowData[]/DealRowData[] (extras optional).
-const SOURCES_FIXTURE: SourcesData = {
- adRows,
- dealRows,
- marketAds,
- marketDeals,
-};
-
interface SourcesViewProps {
- data?: SourcesData;
+ // Required on the app path (v2/page.tsx -> SectionOverlay always supplies
+ // mapSources output) — an omitted prop must be a TS error, not a silent
+ // fallback to fabricated listing/deal rows.
+ data: SourcesData;
// Raw estimate (real lat/lon per lot) — the table rows above are pre-mapped
// display strings with no geometry, so SourcesMap needs the source object
- // directly. Optional: unwired/storybook usage (no estimate) renders the
- // tables only, same honest-empty contract as the rest of the mappers.
+ // directly. Optional: no estimate yet renders the tables only, same honest-
+ // empty contract as the rest of the mappers.
estimate?: AggregatedEstimate | null;
}
export default function SourcesView({
- data = SOURCES_FIXTURE,
+ data,
estimate = null,
}: SourcesViewProps) {
const adCols = visibleCols(AD_COLS, data.adRows);