From 35871a32bd7a28d1101a5c945eeeb6dee5f256be Mon Sep 17 00:00:00 2001 From: Light1YT Date: Sat, 13 Jun 2026 20:45:08 +0500 Subject: [PATCH] =?UTF-8?q?feat(site-finder):=20=D0=9D=D0=A1=D0=9F=D0=94?= =?UTF-8?q?=20verify=20deep-links=20+=20landing=20GenDesign=20vs=20=D0=9D?= =?UTF-8?q?=D0=A1=D0=9F=D0=94=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0?= =?UTF-8?q?=20(#97=20#100)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #97: nspdLinks helper (nspdMapUrl/pkkSearchUrl, encodeURIComponent) + NspdVerifyLink компонент (var(--accent), rel=noopener) → одноклик-сверка с НСПД/ПКК в Section1 (кадастр/ЕГРН) + Section2 (инж.сети) карточках analyze. #100: landing — сравнительная секция «GenDesign и НСПД» (7-row таблица value-prop: цены ДДУ/остатки/скорость/инвест-балл/прогноз/квартирография/экспорт сверх бесплатной гос-карты) + footer deep-links. Closes #97 Closes #100 --- frontend/src/app/page.tsx | 211 +++++++++++++++++- .../site-finder/analysis/NspdVerifyLink.tsx | 53 +++++ .../analysis/Section1ParcelInfo.tsx | 30 ++- .../analysis/Section2NetworksUtilities.tsx | 31 ++- frontend/src/lib/nspdLinks.ts | 27 +++ 5 files changed, 337 insertions(+), 15 deletions(-) create mode 100644 frontend/src/components/site-finder/analysis/NspdVerifyLink.tsx create mode 100644 frontend/src/lib/nspdLinks.ts diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index dcf48357..066457b1 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -5,10 +5,12 @@ import { useState } from "react"; import { BarChart3, Building2, + Check, ChevronDown, ChevronUp, Database, MapPin, + Minus, RefreshCw, } from "lucide-react"; @@ -43,8 +45,97 @@ const FAQ: { q: string; a: string }[] = [ }, ]; +// ── GenDesign vs НСПД — value-prop differentiation (#100) ──────────────────── +// НСПД (nspd.gov.ru) — бесплатная госкарта пространственных данных. GenDesign +// не заменяет её, а считает поверх: рынок, прогноз, инвест-вердикт. Таблица +// объясняет, за что девелопер платит сверх бесплатного источника. + +interface ComparisonRow { + feature: string; + /** null = нет совсем; string = есть, но в каком виде. */ + nspd: string | null; + gendesign: string; +} + +const COMPARISON_ROWS: ComparisonRow[] = [ + { + feature: "Кадастр, ПЗЗ, ЗОУИТ, границы участка", + nspd: "Карта и атрибуты", + gendesign: "То же + сверка одним кликом", + }, + { + feature: "Цены сделок ДДУ (Росреестр)", + nspd: null, + gendesign: "Медиана по району и классу", + }, + { + feature: "Остатки и скорость продаж новостроек", + nspd: null, + gendesign: "DOM.РФ + Objective, еженедельно", + }, + { + feature: "Инвест-балл участка и объяснение", + nspd: null, + gendesign: "Score 0–100 с разбором факторов", + }, + { + feature: "Прогноз цены и горизонты выхода", + nspd: null, + gendesign: "Прогноз с доверительным интервалом", + }, + { + feature: "Рекомендация квартирографии", + nspd: null, + gendesign: "Mix планировок под спрос района", + }, + { + feature: "Экспорт в PDF / Excel / DXF", + nspd: null, + gendesign: "Отчёт по участку в один клик", + }, +]; + // ── Sub-components ───────────────────────────────────────────────────────── +function ComparisonCell({ value }: { value: string | null }) { + if (value === null) { + return ( + + + нет + + ); + } + return ( + + + {value} + + ); +} + function FaqItem({ q, a }: { q: string; a: string }) { const [open, setOpen] = useState(false); return ( @@ -149,7 +240,6 @@ export default function HomePage() { В dev (401) или до загрузки /me — UserMenu сам рендерит null. */} } /> - {/* ── Hero ───────────────────────────────────────────────────────── */}
+ {/* ── GenDesign vs НСПД (#100) ───────────────────────────────────── */} +
+

+ GenDesign и НСПД +

+

+ НСПД (nspd.gov.ru) — бесплатная государственная карта: кадастр, ПЗЗ, + границы. GenDesign не заменяет её, а считает поверх — добавляет рынок, + прогноз и инвест-вердикт. Любую цифру можно сверить с первоисточником + из карточки участка. +

+ +
+ {/* Header row */} +
+
Возможность
+
НСПД (бесплатно)
+
+ GenDesign +
+
+ + {/* Data rows */} + {COMPARISON_ROWS.map((row, i) => ( +
+
+ {row.feature} +
+ + +
+ ))} +
+
+ {/* ── Pricing ────────────────────────────────────────────────────── */}
/health + + НСПД + + + ПКК Росреестра + GenDesign {new Date().getFullYear()} @@ -542,3 +743,11 @@ const kpiValue: React.CSSProperties = { color: "var(--fg-primary)", fontVariantNumeric: "tabular-nums", }; + +const comparisonHeadCell: React.CSSProperties = { + fontSize: 11, + fontWeight: 600, + textTransform: "uppercase", + letterSpacing: "0.04em", + color: "var(--fg-secondary)", +}; diff --git a/frontend/src/components/site-finder/analysis/NspdVerifyLink.tsx b/frontend/src/components/site-finder/analysis/NspdVerifyLink.tsx new file mode 100644 index 00000000..ca75f0b2 --- /dev/null +++ b/frontend/src/components/site-finder/analysis/NspdVerifyLink.tsx @@ -0,0 +1,53 @@ +"use client"; + +/** + * NspdVerifyLink — tertiary-link «Проверить на НСПД» / «Открыть на ПКК». + * + * Issue #97 — кнопка-верификация: открывает официальный бесплатный госсервис + * (НСПД / ПКК Росреестра) по кадастровому номеру в новой вкладке, чтобы + * пользователь мог сверить данные Site Finder с первоисточником одним кликом. + * + * Tertiary CTA (ui-conventions): text-only link с иконкой, токены, без hex. + */ + +import { ExternalLink } from "lucide-react"; + +import { nspdMapUrl, pkkSearchUrl } from "@/lib/nspdLinks"; + +interface Props { + cadNum: string; + /** Какой источник открывать. nspd — карта-вьюер НСПД, pkk — ПКК Росреестра. */ + source?: "nspd" | "pkk"; + /** Переопределить подпись (по умолчанию зависит от source). */ + label?: string; +} + +export function NspdVerifyLink({ cadNum, source = "nspd", label }: Props) { + if (!cadNum) return null; + + const href = source === "pkk" ? pkkSearchUrl(cadNum) : nspdMapUrl(cadNum); + const text = + label ?? (source === "pkk" ? "Открыть на ПКК" : "Проверить на НСПД"); + + return ( + + + {text} + + ); +} diff --git a/frontend/src/components/site-finder/analysis/Section1ParcelInfo.tsx b/frontend/src/components/site-finder/analysis/Section1ParcelInfo.tsx index 9218e3a7..8d07294c 100644 --- a/frontend/src/components/site-finder/analysis/Section1ParcelInfo.tsx +++ b/frontend/src/components/site-finder/analysis/Section1ParcelInfo.tsx @@ -17,6 +17,7 @@ import { HeadlineBar } from "@/components/ui/HeadlineBar"; import { KpiCard } from "@/components/site-finder/KpiCard"; import { MiniMap } from "./MiniMap"; import { EgrnPropertyTable } from "./EgrnPropertyTable"; +import { NspdVerifyLink } from "./NspdVerifyLink"; import { PoiList2Gis } from "./PoiList2Gis"; import { ExportButtons } from "./ExportButtons"; import { @@ -228,17 +229,32 @@ export function Section1ParcelInfo({ cad }: Props) { marginBottom: 24, }} > - {/* Section title */} -

- 1. Объект -

+

+ 1. Объект +

+
+ + +
+ {/* HeadlineBar — verdict */}
diff --git a/frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx b/frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx index ef5025dd..4c59745d 100644 --- a/frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx +++ b/frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx @@ -23,6 +23,7 @@ import { Info, } from "lucide-react"; import { HeadlineBar } from "@/components/ui/HeadlineBar"; +import { NspdVerifyLink } from "./NspdVerifyLink"; import { useParcelAnalyzeQuery } from "@/lib/site-finder-api"; import type { UtilitySummaryItem } from "@/lib/site-finder-api"; @@ -487,17 +488,33 @@ export function Section2NetworksUtilities({ cad }: Props) { marginBottom: 24, }} > - {/* Section title */} -

- 2. Сети и точки подключения -

+

+ 2. Сети и точки подключения +

+ +
{/* HeadlineBar */}
diff --git a/frontend/src/lib/nspdLinks.ts b/frontend/src/lib/nspdLinks.ts new file mode 100644 index 00000000..773ada1a --- /dev/null +++ b/frontend/src/lib/nspdLinks.ts @@ -0,0 +1,27 @@ +/** + * Deep-links на официальные государственные источники (НСПД, ПКК Росреестра). + * + * Issue #97 — пользователь должен мочь верифицировать любые данные Site Finder + * на бесплатном официальном сервисе одним кликом. Единая точка построения URL, + * чтобы не дублировать литералы `nspd.gov.ru` / `pkk.rosreestr.ru` по компонентам + * и иметь один безопасный канал кодирования кадастрового номера. + * + * Существующие потребители паттерна (до централизации): NspdZoningBlock, + * NspdOpportunityBlock, ParcelDrawer, AnalysisSidebar. + */ + +/** + * НСПД (Национальная система пространственных данных) — карта-вьюер по + * кадастровому номеру. Базовый сервис «посмотреть участок на госкарте». + */ +export function nspdMapUrl(cadNum: string): string { + return `https://nspd.gov.ru/map?cadastralNumber=${encodeURIComponent(cadNum)}`; +} + +/** + * Публичная кадастровая карта Росреестра (ПКК) — поиск по кадастровому номеру. + * Используется как fallback / cross-check к НСПД. + */ +export function pkkSearchUrl(cadNum: string): string { + return `https://pkk.rosreestr.ru/#/search/${encodeURIComponent(cadNum)}`; +} -- 2.45.3