gendesign/frontend/public/site-finder-analysis.html
lekss361 6d9eddc8e9 chore: refresh preview pages + add tradein landing
Заменяем устаревшие preview-странички (старая landing.html из PR #279) на
новый набор из аудита gendsgn.ru:

- public/analytics.html (44KB)
- public/developers.html (37KB)
- public/index.html (30KB)
- public/landing.html (41KB, replaces PR #279 version)
- public/site-finder.html (31KB)
- public/site-finder-analysis.html (86KB)
- public/tradein.html (85KB) — новая страничка trade-in

Все 7 файлов self-contained HTML (inline assets) → доступны после deploy
по URL https://gendsgn.ru/<filename>.html. Не пересекаются с Next.js
routes (расширение .html — public/ wins).
2026-05-17 15:37:28 +03:00

1112 lines
84 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>/site-finder/анализ — 66:41:0701045:42 · gendsgn</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
<style>
:root {
--bg-app:#F6F7F9; --bg-card:#FFFFFF; --bg-card-alt:#FAFBFC; --bg-headline:#0F172A;
--border-soft:#EEF0F3; --border-card:#E6E8EC; --border-strong:#D1D5DB;
--fg-primary:#111111; --fg-secondary:#5B6066; --fg-tertiary:#73767E;
--fg-on-dark:#E2E8F0; --fg-on-dark-muted:#94A3B8;
--accent:#1D4ED8; --accent-hover:#1E40AF; --accent-soft:#DBEAFE; --accent-2:#F2994A;
--success:#0A7A3A; --success-soft:#DCFCE7;
--warn:#9A6700; --warn-soft:#FEF3C7;
--danger:#B3261E; --danger-soft:#FEE2E2;
--viz-1:#1D4ED8; --viz-2:#0EA5E9; --viz-3:#14B8A6; --viz-4:#F59E0B; --viz-5:#8B5CF6;
--prediction-band: rgba(14,165,233,0.18);
--font-body:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
}
* { box-sizing:border-box; margin:0; padding:0; }
html { background:var(--bg-app); }
body { font-family:var(--font-body); font-size:14px; line-height:1.5; color:var(--fg-primary); font-variant-numeric:tabular-nums; font-feature-settings:"tnum"; -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; }
a { color:inherit; text-decoration:none; }
button { font:inherit; cursor:pointer; }
.mono { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; }
/* === dev nav === */
.dev-nav { position:sticky; top:0; z-index:200; display:flex; align-items:center; gap:18px; height:38px; padding:0 18px; background:#0b0f1a; color:rgba(255,255,255,0.92); font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:11.5px; letter-spacing:0.04em; border-bottom:1px solid rgba(255,255,255,0.08); }
.dev-nav .dev-label { display:inline-flex; align-items:center; gap:8px; color:#fbbf24; font-weight:600; letter-spacing:0.18em; text-transform:uppercase; white-space:nowrap; }
.dev-nav .dev-label::before { content:''; width:6px; height:6px; border-radius:50%; background:#fbbf24; box-shadow:0 0 0 3px rgba(251,191,36,0.22); }
.dev-nav .dev-tabs { display:inline-flex; gap:2px; align-items:center; flex-wrap:nowrap; overflow:auto; }
.dev-nav .dev-sep { width:1px; height:16px; background:rgba(255,255,255,0.16); margin:0 6px; flex:none; }
.dev-nav .dev-tabs a { padding:5px 10px; border-radius:5px; color:rgba(255,255,255,0.62); transition:background .12s,color .12s; white-space:nowrap; }
.dev-nav .dev-tabs a:hover { color:#fff; background:rgba(255,255,255,0.08); }
.dev-nav .dev-tabs a[aria-current="page"] { color:#0b0f1a; background:#fbbf24; font-weight:600; }
.dev-nav .dev-hint { margin-left:auto; color:rgba(255,255,255,0.36); white-space:nowrap; }
@media print { .dev-nav { display:none !important; } }
/* === topbar === */
.topbar { background:var(--bg-card); border-bottom:1px solid var(--border-card); }
.topbar-inner { display:flex; align-items:center; justify-content:space-between; height:56px; padding:0 24px; }
.topbar-left { display:flex; align-items:center; gap:32px; }
.brand { display:inline-flex; align-items:center; gap:8px; font-weight:700; font-size:15px; color:var(--fg-primary); letter-spacing:-0.01em; }
.brand-mark { width:22px; height:22px; border-radius:6px; background:var(--accent); display:grid; place-items:center; color:#fff; font-size:11px; font-weight:700; }
.brand-mark::before { content:'gd'; }
.topbar nav.main { display:flex; gap:18px; font-size:13px; color:var(--fg-secondary); }
.topbar nav.main a { padding:6px 0; border-bottom:2px solid transparent; }
.topbar nav.main a[aria-current="page"] { color:var(--accent); border-bottom-color:var(--accent); font-weight:600; }
.topbar nav.main a:hover { color:var(--fg-primary); }
.topbar-user { display:flex; align-items:center; gap:12px; font-size:13px; color:var(--fg-secondary); }
.topbar-user .who { display:flex; align-items:center; gap:8px; padding:6px 12px; border-radius:6px; background:var(--bg-card-alt); border:1px solid var(--border-card); }
.topbar-user .avatar { width:22px; height:22px; border-radius:50%; background:var(--accent-soft); color:var(--accent); display:grid; place-items:center; font-weight:600; font-size:10px; }
/* === crumbs === */
.crumbs-wrap { background:var(--bg-card); border-bottom:1px solid var(--border-card); }
.crumbs { display:flex; gap:10px; align-items:center; padding:14px 24px; font-size:12.5px; color:var(--fg-secondary); }
.crumbs a { color:var(--fg-secondary); }
.crumbs a:hover { color:var(--accent); text-decoration:underline; text-underline-offset:3px; }
.crumbs .sep { color:var(--fg-tertiary); }
.crumbs .last { color:var(--fg-primary); font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px; }
.crumbs .pill { margin-left:auto; display:inline-flex; align-items:center; gap:6px; padding:4px 10px; border-radius:999px; background:var(--success-soft); color:var(--success); font-size:11.5px; font-weight:600; }
.crumbs .pill::before { content:''; width:6px; height:6px; border-radius:50%; background:var(--success); }
/* === layout === */
.layout { display:grid; grid-template-columns:300px 1fr; gap:0; align-items:stretch; min-height:calc(100vh - 38px - 56px - 49px); }
/* === sidebar === */
.side { background:var(--bg-card); border-right:1px solid var(--border-card); position:sticky; top:0; align-self:start; }
.side-hd { padding:18px 20px 12px; }
.side-hd .eyebrow { font-size:10.5px; letter-spacing:0.14em; text-transform:uppercase; color:var(--fg-tertiary); font-weight:600; }
.side-hd h2 { font-size:13px; font-weight:600; margin-top:4px; }
.side ul { list-style:none; padding:0 12px 12px; display:grid; gap:2px; }
.side > ul > li > a, .side > ul > li > button.sec-toggle { display:grid; grid-template-columns:26px 1fr; gap:10px; align-items:center; padding:10px 12px; border-radius:8px; font-size:13.5px; color:var(--fg-primary); text-align:left; border:0; background:transparent; width:100%; transition:background .12s; }
.side > ul > li > a:hover, .side > ul > li > button.sec-toggle:hover { background:var(--bg-card-alt); }
.side > ul > li > a.active, .side > ul > li > button.sec-toggle.active { background:var(--accent-soft); color:var(--accent); font-weight:600; }
.side > ul > li > a .n, .side > ul > li > button.sec-toggle .n { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:11.5px; color:var(--fg-tertiary); font-weight:500; display:inline-grid; place-items:center; height:22px; border-radius:5px; }
.side > ul > li > a.active .n, .side > ul > li > button.sec-toggle.active .n { color:var(--accent); background:rgba(29,78,216,0.12); }
.side .sub-list { list-style:none; padding:4px 0 4px 38px; display:grid; gap:2px; }
.side .sub-list li a { display:block; padding:6px 12px; border-radius:6px; font-size:12.5px; color:var(--fg-secondary); }
.side .sub-list li a:hover { background:var(--bg-card-alt); color:var(--fg-primary); }
.side .sub-list li a.active { color:var(--accent); font-weight:500; }
.side-foot { padding:14px 20px; border-top:1px solid var(--border-soft); font-size:12px; color:var(--fg-tertiary); line-height:1.5; }
.side-foot b { color:var(--fg-secondary); font-weight:500; }
/* === main === */
.main { padding:24px 28px 64px; min-width:0; }
/* === pane visibility === */
.pane { display:none; }
.pane.active { display:block; }
/* === headline bar === */
.page-head { display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-bottom:16px; }
.page-head h1 { font-size:22px; line-height:1.25; font-weight:600; letter-spacing:-0.01em; }
.page-head .sub { font-size:13px; color:var(--fg-secondary); margin-top:4px; }
.page-head .right { display:flex; gap:8px; align-items:center; }
.headline-bar { background:var(--bg-headline); color:var(--fg-on-dark); border-radius:12px; padding:16px 20px; display:flex; align-items:center; gap:16px; margin-bottom:16px; }
.headline-bar .tag { font-size:10.5px; letter-spacing:0.08em; text-transform:uppercase; font-weight:600; color:var(--accent-2); white-space:nowrap; }
.headline-bar .verdict { font-size:15px; font-weight:500; line-height:1.4; color:var(--fg-on-dark); }
.headline-bar .verdict b { color:#fff; font-weight:600; }
.headline-bar .caveat { margin-left:auto; font-size:11.5px; color:var(--fg-on-dark-muted); white-space:nowrap; }
/* === KPI === */
.kpi-row { display:grid; gap:12px; margin-bottom:24px; }
.kpi-row-4 { grid-template-columns:repeat(4,1fr); }
.kpi-row-3 { grid-template-columns:repeat(3,1fr); }
.kpi { background:var(--bg-card); border:1px solid var(--border-card); border-radius:12px; padding:16px 18px; }
.kpi .label { font-size:11px; letter-spacing:0.04em; text-transform:uppercase; color:var(--fg-secondary); font-weight:500; }
.kpi .value { font-size:28px; line-height:1.15; font-weight:600; color:var(--fg-primary); letter-spacing:-0.015em; margin-top:8px; }
.kpi .value small { font-size:14px; color:var(--fg-secondary); font-weight:500; margin-left:4px; }
.kpi .hint { font-size:12.5px; color:var(--fg-secondary); margin-top:6px; }
.delta { display:inline-flex; align-items:center; gap:3px; font-size:11.5px; font-weight:600; padding:2px 6px; border-radius:4px; margin-left:6px; vertical-align:middle; }
.delta.pos { background:var(--success-soft); color:var(--success); }
.delta.neg { background:var(--danger-soft); color:var(--danger); }
.delta.neu { background:var(--bg-card-alt); color:var(--fg-tertiary); }
/* === section === */
.section { background:var(--bg-card); border:1px solid var(--border-card); border-radius:12px; padding:20px; margin-bottom:16px; }
.section-hd { display:flex; justify-content:space-between; align-items:flex-end; gap:16px; margin-bottom:16px; }
.section-hd h2 { font-size:18px; font-weight:600; letter-spacing:-0.005em; }
.section-hd .sub { font-size:12.5px; color:var(--fg-secondary); margin-top:4px; }
.section-hd .right { display:flex; gap:8px; align-items:center; }
.btn { display:inline-flex; align-items:center; justify-content:center; gap:6px; height:36px; padding:0 14px; border:0; border-radius:6px; font-weight:600; font-size:13px; transition:background .12s, color .12s; white-space:nowrap; }
.btn-primary { background:var(--accent); color:#fff; }
.btn-primary:hover { background:var(--accent-hover); }
.btn-secondary { background:var(--accent-2); color:#fff; height:32px; padding:0 12px; font-size:12.5px; }
.btn-secondary:hover { filter:brightness(0.95); }
.btn-ghost { background:transparent; color:var(--fg-primary); border:1px solid var(--border-card); height:32px; padding:0 12px; font-size:12.5px; font-weight:500; }
.btn-ghost:hover { border-color:var(--border-strong); background:var(--bg-card-alt); }
/* === pane 1: parcel info === */
.grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:16px; }
.grid-3 { display:grid; grid-template-columns:1fr 1fr 1fr; gap:16px; }
.minimap { background:var(--bg-card-alt); border:1px solid var(--border-soft); border-radius:8px; aspect-ratio:16/10; overflow:hidden; position:relative; }
.minimap svg { width:100%; height:100%; display:block; }
.meta-list { list-style:none; }
.meta-list li { display:grid; grid-template-columns:1fr auto; gap:8px; padding:10px 0; border-top:1px solid var(--border-soft); font-size:13px; }
.meta-list li:first-child { border-top:0; padding-top:0; }
.meta-list .l { color:var(--fg-secondary); }
.meta-list .v { color:var(--fg-primary); font-weight:500; font-variant-numeric:tabular-nums; }
.meta-list .v.good { color:var(--success); }
.meta-list .v.warn { color:var(--warn); }
.poi-list { display:grid; gap:8px; }
.poi { display:grid; grid-template-columns:32px 1fr auto auto; gap:10px; align-items:center; padding:10px 12px; border:1px solid var(--border-soft); border-radius:8px; font-size:12.5px; background:var(--bg-card-alt); }
.poi .ico { width:28px; height:28px; border-radius:6px; background:var(--bg-card); display:grid; place-items:center; font-size:14px; color:var(--accent); border:1px solid var(--border-soft); }
.poi .name { color:var(--fg-primary); font-weight:500; }
.poi .desc { color:var(--fg-secondary); font-size:11.5px; margin-top:1px; }
.poi .d { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:11.5px; color:var(--fg-secondary); }
.poi .walk { font-size:11px; color:var(--fg-tertiary); }
/* === pane 2: utility schematic === */
.util-schem { background:var(--bg-card-alt); border:1px solid var(--border-soft); border-radius:10px; padding:18px; }
.util-schem svg { width:100%; height:auto; display:block; }
.util-table { width:100%; border-collapse:collapse; font-size:13px; }
.util-table th { text-align:left; font-weight:600; color:var(--fg-secondary); font-size:11px; letter-spacing:0.04em; text-transform:uppercase; padding:10px 12px; border-bottom:1px solid var(--border-card); background:var(--bg-card-alt); }
.util-table td { padding:12px; border-bottom:1px solid var(--border-soft); vertical-align:middle; }
.util-table tr:last-child td { border-bottom:0; }
.util-table tbody tr:hover { background:var(--bg-card-alt); }
.util-table .util-name { display:flex; align-items:center; gap:8px; font-weight:500; }
.util-table .util-name i { width:10px; height:10px; border-radius:3px; }
.util-table .num { font-variant-numeric:tabular-nums; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; }
.util-table .owner { color:var(--fg-secondary); font-size:12px; }
.util-table .status-ok { color:var(--success); font-weight:600; }
.util-table .status-warn { color:var(--warn); font-weight:600; }
.util-table .status-bad { color:var(--danger); font-weight:600; }
/* === pane 3: competitors detail (Screen 3 = 8 sections) === */
.settings-bar { background:var(--bg-card); border:1px solid var(--border-card); border-radius:12px; padding:16px 18px; margin-bottom:16px; }
.settings-bar h3 { font-size:11px; letter-spacing:0.06em; text-transform:uppercase; color:var(--fg-secondary); font-weight:600; margin-bottom:14px; display:flex; align-items:center; gap:8px; }
.settings-bar h3::after { content:''; flex:1; height:1px; background:var(--border-soft); }
.settings-bar h3 .n { display:inline-grid; place-items:center; width:18px; height:18px; border-radius:4px; background:var(--accent-soft); color:var(--accent); font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:10.5px; font-weight:700; letter-spacing:0; }
.settings-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:18px; }
.set { padding:0; }
.set .lab { font-size:11px; letter-spacing:0.04em; text-transform:uppercase; color:var(--fg-secondary); font-weight:600; margin-bottom:8px; display:flex; align-items:center; gap:6px; }
.set .lab .num { display:inline-grid; place-items:center; width:18px; height:18px; border-radius:4px; background:var(--bg-card-alt); border:1px solid var(--border-soft); color:var(--fg-tertiary); font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:10px; font-weight:700; }
.set .val { font-size:15px; font-weight:600; color:var(--fg-primary); margin-bottom:6px; font-variant-numeric:tabular-nums; }
.set .val small { color:var(--fg-secondary); font-weight:400; font-size:12.5px; margin-left:4px; }
/* slider */
.slider { position:relative; height:24px; }
.slider-track { position:absolute; top:11px; left:0; right:0; height:3px; background:var(--border-card); border-radius:2px; }
.slider-fill { position:absolute; top:11px; left:0; height:3px; background:var(--accent); border-radius:2px; }
.slider-thumb { position:absolute; top:7px; width:12px; height:12px; background:#fff; border:2px solid var(--accent); border-radius:50%; transform:translateX(-6px); }
.slider-ticks { display:flex; justify-content:space-between; font-size:10.5px; color:var(--fg-tertiary); margin-top:4px; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; }
/* toggle */
.toggle-row { display:flex; gap:8px; align-items:center; padding:4px 0; }
.toggle { width:34px; height:20px; border-radius:10px; background:var(--accent); position:relative; flex:none; }
.toggle::after { content:''; position:absolute; top:2px; right:2px; width:16px; height:16px; border-radius:50%; background:#fff; box-shadow:0 1px 2px rgba(0,0,0,0.18); }
.toggle.off { background:var(--border-card); }
.toggle.off::after { right:auto; left:2px; }
.toggle-row .t { font-size:13px; color:var(--fg-primary); font-weight:500; }
.toggle-row .d { font-size:11px; color:var(--fg-tertiary); margin-top:2px; }
.note { display:flex; gap:6px; align-items:flex-start; margin-top:6px; padding:6px 8px; background:var(--warn-soft); border-radius:4px; font-size:11px; color:var(--warn); line-height:1.4; }
.note::before { content:'i'; flex:none; width:14px; height:14px; border-radius:50%; background:var(--warn); color:#fff; display:grid; place-items:center; font-size:9px; font-weight:700; margin-top:1px; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-style:italic; }
/* output sections numbered chip */
.out-h { display:flex; align-items:center; gap:10px; }
.out-h .num { display:inline-grid; place-items:center; width:26px; height:26px; border-radius:6px; background:var(--bg-headline); color:#fff; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px; font-weight:700; }
/* planning grid */
.planning-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; }
.plan { background:var(--bg-card); border:1px solid var(--border-card); border-radius:10px; overflow:hidden; transition:border-color .12s, transform .12s; cursor:pointer; }
.plan:hover { border-color:var(--border-strong); }
.plan-img { aspect-ratio:1/1; background:var(--bg-card-alt); border-bottom:1px solid var(--border-soft); display:grid; place-items:center; position:relative; overflow:hidden; }
.plan-img svg { width:78%; height:78%; }
.plan-img .badge { position:absolute; top:8px; left:8px; padding:3px 8px; border-radius:4px; font-size:10.5px; font-weight:600; background:rgba(255,255,255,0.94); color:var(--fg-primary); }
.plan-img .badge.hot { background:var(--success); color:#fff; }
.plan-img .badge.cold { background:var(--danger); color:#fff; }
.plan-img .price-tag { position:absolute; bottom:8px; right:8px; padding:3px 8px; border-radius:4px; background:rgba(15,23,42,0.84); color:#fff; font-size:10.5px; font-weight:600; font-variant-numeric:tabular-nums; }
.plan-info { padding:10px 12px 12px; }
.plan-info .title { font-size:13px; font-weight:600; }
.plan-info .meta { font-size:11.5px; color:var(--fg-secondary); margin-top:2px; }
.plan-info .row { display:flex; justify-content:space-between; align-items:baseline; margin-top:8px; font-size:11.5px; }
.plan-info .row b { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-weight:600; }
.plan-info .sold-bar { margin-top:6px; height:4px; background:var(--bg-card-alt); border-radius:2px; overflow:hidden; }
.plan-info .sold-bar i { display:block; height:100%; background:var(--success); border-radius:2px; }
/* остатки table */
.stock-table { width:100%; border-collapse:collapse; font-size:13px; }
.stock-table th { text-align:left; font-weight:600; color:var(--fg-secondary); font-size:11px; letter-spacing:0.04em; text-transform:uppercase; padding:10px 12px; border-bottom:1px solid var(--border-card); background:var(--bg-card-alt); white-space:nowrap; }
.stock-table th.r { text-align:right; }
.stock-table td { padding:12px; border-bottom:1px solid var(--border-soft); vertical-align:middle; }
.stock-table td.r { text-align:right; font-variant-numeric:tabular-nums; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; }
.stock-table tr:last-child td { border-bottom:0; }
.stock-table tbody tr:hover { background:var(--bg-card-alt); }
.stock-table .jk { display:flex; align-items:center; gap:10px; }
.stock-table .jk-mark { width:32px; height:32px; border-radius:6px; background:var(--accent-soft); color:var(--accent); display:grid; place-items:center; font-weight:700; font-size:11px; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; flex:none; }
.stock-table .jk-name { font-weight:600; font-size:13px; }
.stock-table .jk-dev { font-size:11.5px; color:var(--fg-secondary); }
.left-bar { display:inline-flex; align-items:center; gap:6px; }
.left-bar .bar { width:80px; height:5px; background:var(--bg-card-alt); border-radius:3px; overflow:hidden; }
.left-bar .bar i { display:block; height:100%; background:var(--viz-4); }
.left-bar .bar i.high { background:var(--danger); }
.left-bar .bar i.low { background:var(--success); }
/* velocity chart */
.vchart { display:grid; grid-template-columns:1fr; gap:0; }
.vchart svg { width:100%; height:auto; }
/* recommendation card */
.reco { background:linear-gradient(135deg, var(--bg-headline) 0%, #1e293b 100%); color:var(--fg-on-dark); border-radius:14px; padding:24px 26px; }
.reco .eyebrow { font-size:10.5px; letter-spacing:0.14em; text-transform:uppercase; color:var(--accent-2); font-weight:700; margin-bottom:10px; }
.reco h2 { font-size:22px; color:#fff; line-height:1.3; font-weight:600; letter-spacing:-0.005em; margin-bottom:6px; }
.reco .lede { font-size:14px; color:var(--fg-on-dark); line-height:1.55; max-width:780px; }
.reco-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:0; margin-top:18px; border-top:1px solid rgba(255,255,255,0.12); padding-top:16px; }
.reco-stat { padding:0 18px; border-right:1px solid rgba(255,255,255,0.12); }
.reco-stat:first-child { padding-left:0; }
.reco-stat:last-child { border-right:0; }
.reco-stat .l { font-size:10.5px; letter-spacing:0.06em; text-transform:uppercase; color:var(--fg-on-dark-muted); font-weight:600; }
.reco-stat .v { font-size:24px; font-weight:600; color:#fff; margin-top:6px; font-variant-numeric:tabular-nums; letter-spacing:-0.01em; }
.reco-stat .v small { font-size:13px; color:var(--fg-on-dark-muted); font-weight:500; margin-left:4px; }
.reco-stat .h { font-size:11.5px; color:var(--fg-on-dark-muted); margin-top:4px; }
.reco-foot { display:flex; gap:10px; margin-top:20px; }
.reco-foot .btn-primary { background:var(--accent-2); color:#fff; }
.reco-foot .btn-primary:hover { filter:brightness(0.96); }
.reco-foot .btn-ghost { background:rgba(255,255,255,0.05); color:#fff; border-color:rgba(255,255,255,0.12); }
.reco-foot .btn-ghost:hover { background:rgba(255,255,255,0.12); border-color:rgba(255,255,255,0.22); }
/* pane 4: оценка */
.score-hero { display:grid; grid-template-columns:200px 1fr; gap:24px; align-items:center; }
.score-ring { width:180px; height:180px; }
.score-ring text.num { font-family:var(--font-body); font-size:46px; font-weight:600; fill:var(--fg-primary); letter-spacing:-0.02em; }
.score-ring text.lab { font-family:var(--font-body); font-size:11px; fill:var(--fg-secondary); font-weight:600; letter-spacing:0.06em; text-transform:uppercase; }
.breakdown { list-style:none; display:grid; gap:10px; }
.breakdown li { display:grid; grid-template-columns:200px 1fr 56px; gap:14px; align-items:center; font-size:13px; }
.breakdown .name { color:var(--fg-primary); font-weight:500; }
.breakdown .name small { color:var(--fg-tertiary); font-size:11px; font-weight:400; display:block; margin-top:1px; }
.breakdown .bar { height:8px; background:var(--bg-card-alt); border-radius:4px; overflow:hidden; }
.breakdown .bar i { display:block; height:100%; background:var(--viz-1); border-radius:4px; }
.breakdown .bar i.warn { background:var(--viz-4); }
.breakdown .bar i.bad { background:var(--danger); }
.breakdown .val { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:13px; font-weight:600; color:var(--fg-primary); text-align:right; }
.gate-banner { display:flex; align-items:flex-start; gap:14px; padding:16px 18px; border-radius:10px; background:var(--success-soft); border:1px solid rgba(10,122,58,0.25); margin-top:18px; }
.gate-banner .ico { width:32px; height:32px; border-radius:8px; background:var(--success); color:#fff; display:grid; place-items:center; font-size:18px; font-weight:700; flex:none; }
.gate-banner .body h4 { font-size:14px; font-weight:600; color:var(--success); margin-bottom:4px; }
.gate-banner .body p { font-size:12.5px; color:var(--fg-primary); line-height:1.5; }
/* pane 5: environment */
.aqi-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; }
.aqi { background:var(--bg-card); border:1px solid var(--border-card); border-radius:12px; padding:16px 18px; }
.aqi .lab { font-size:11px; letter-spacing:0.04em; text-transform:uppercase; color:var(--fg-secondary); font-weight:500; }
.aqi .val { font-size:24px; font-weight:600; margin-top:8px; font-variant-numeric:tabular-nums; letter-spacing:-0.01em; }
.aqi .val small { font-size:12px; color:var(--fg-secondary); font-weight:500; margin-left:4px; }
.aqi .grade { display:inline-flex; align-items:center; gap:4px; padding:2px 8px; border-radius:4px; font-size:11px; font-weight:600; margin-top:6px; }
.aqi .grade.good { background:var(--success-soft); color:var(--success); }
.aqi .grade.warn { background:var(--warn-soft); color:var(--warn); }
.aqi .grade.bad { background:var(--danger-soft); color:var(--danger); }
.wind-rose { aspect-ratio:1; background:var(--bg-card-alt); border:1px solid var(--border-soft); border-radius:10px; padding:14px; }
.wind-rose svg { width:100%; height:100%; }
.season-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:10px; }
.season { padding:12px; background:var(--bg-card-alt); border:1px solid var(--border-soft); border-radius:8px; }
.season .s { font-size:11px; letter-spacing:0.04em; text-transform:uppercase; color:var(--fg-secondary); font-weight:600; }
.season .t { font-size:22px; font-weight:600; margin-top:4px; font-variant-numeric:tabular-nums; }
.season .t small { font-size:11px; color:var(--fg-secondary); font-weight:500; margin-left:4px; }
.season .d { font-size:11.5px; color:var(--fg-secondary); margin-top:4px; line-height:1.4; }
/* helper colors */
.c-supply { color:var(--fg-secondary); }
.c-demand { color:var(--success); }
/* === responsive === */
/* ≤1280px: tighter grids */
@media (max-width:1280px) {
.layout { grid-template-columns:260px 1fr; }
.main { padding:20px 22px 52px; }
.reco-grid { grid-template-columns:repeat(2,1fr); }
.reco-stat { padding:14px 0 0; border-right:0; border-top:1px solid rgba(255,255,255,0.12); }
.reco-stat:first-child { padding-left:0; border-top:0; padding-top:0; }
.reco-stat:nth-child(2) { border-top:0; padding-top:0; }
.reco-stat:nth-child(odd) { padding-right:18px; }
}
/* ≤1080px: turn sidebar into horizontal tabs above main */
@media (max-width:1080px) {
.layout { display:block; min-height:0; }
.side { position:relative; top:auto; align-self:auto; border-right:0; border-bottom:1px solid var(--border-card); }
.side-hd { display:none; }
.side > ul { display:flex; gap:6px; padding:10px 16px; overflow-x:auto; overflow-y:hidden; flex-wrap:nowrap; -webkit-overflow-scrolling:touch; }
.side > ul::-webkit-scrollbar { height:0; }
.side > ul > li { flex:none; }
.side > ul > li > a, .side > ul > li > button.sec-toggle { grid-template-columns:22px auto; padding:8px 12px; font-size:12.5px; white-space:nowrap; border:1px solid var(--border-card); }
.side > ul > li > a.active, .side > ul > li > button.sec-toggle.active { background:var(--accent); color:#fff; border-color:var(--accent); }
.side > ul > li > a.active .n, .side > ul > li > button.sec-toggle.active .n { color:#fff; background:rgba(255,255,255,0.18); }
.side .sub-list { display:none; }
.side-foot { display:none; }
.main { padding:20px 22px 52px; }
.planning-grid { grid-template-columns:repeat(3,1fr); }
.settings-grid { grid-template-columns:repeat(2,1fr); gap:14px; }
.grid-2, .grid-3 { grid-template-columns:1fr 1fr; }
.aqi-grid { grid-template-columns:repeat(2,1fr); }
.season-grid { grid-template-columns:repeat(2,1fr); }
}
/* ≤860px: collapse to single column, wrap headline + page head */
@media (max-width:860px) {
.topbar-inner { padding:0 16px; height:52px; }
.topbar nav.main { display:none; }
.topbar-user .who { font-size:12px; padding:5px 10px; }
.crumbs { padding:12px 16px; flex-wrap:wrap; gap:6px 10px; font-size:12px; }
.crumbs .pill { margin-left:0; }
.main { padding:16px 14px 48px; }
.page-head { flex-direction:column; align-items:stretch; gap:10px; }
.page-head .right { justify-content:flex-start; flex-wrap:wrap; }
.page-head h1 { font-size:20px; }
.headline-bar { flex-direction:column; align-items:flex-start; gap:8px; padding:14px 16px; }
.headline-bar .caveat { margin-left:0; white-space:normal; }
.kpi-row-4, .kpi-row-3 { grid-template-columns:repeat(2,1fr); }
.section { padding:16px; }
.section-hd { flex-direction:column; align-items:stretch; gap:10px; }
.section-hd .right { justify-content:flex-start; flex-wrap:wrap; }
.planning-grid { grid-template-columns:repeat(2,1fr); }
.grid-2, .grid-3 { grid-template-columns:1fr; }
.score-hero { grid-template-columns:1fr; gap:18px; justify-items:center; text-align:center; }
.score-hero .breakdown { width:100%; text-align:left; }
.breakdown li { grid-template-columns:140px 1fr 48px; gap:10px; font-size:12.5px; }
/* tables: horizontal scroll on the containing section */
.section:has(> .util-table), .section:has(> .stock-table) { overflow-x:auto; -webkit-overflow-scrolling:touch; }
.util-table, .stock-table { min-width:560px; }
.stock-table .jk-name { font-size:12.5px; }
.stock-table .jk-dev { font-size:11px; }
.reco { padding:18px 18px; border-radius:12px; }
.reco h2 { font-size:19px; }
.reco-grid { grid-template-columns:1fr 1fr; }
.reco-stat { padding:12px 14px 0 0; }
.reco-stat:nth-child(odd) { padding-right:14px; }
.reco-stat .v { font-size:20px; }
.reco-foot { flex-direction:column; }
.reco-foot .btn { width:100%; }
}
/* ≤520px: phone */
@media (max-width:520px) {
.dev-nav { gap:10px; padding:0 10px; }
.dev-nav .dev-hint { display:none; }
.topbar-inner { padding:0 12px; }
.topbar-user .who .avatar { display:none; }
.brand { font-size:14px; }
.crumbs { font-size:11.5px; }
.main { padding:14px 12px 40px; }
.page-head h1 { font-size:18px; }
.kpi-row-4, .kpi-row-3 { grid-template-columns:1fr; }
.kpi .value { font-size:24px; }
.planning-grid { grid-template-columns:1fr; }
.aqi-grid { grid-template-columns:1fr 1fr; }
.season-grid { grid-template-columns:1fr 1fr; }
.reco-grid { grid-template-columns:1fr; }
.reco-stat { padding:12px 0 0 0; }
.reco-stat:nth-child(odd) { padding-right:0; }
.breakdown li { grid-template-columns:1fr; gap:4px; padding:8px 0; border-top:1px solid var(--border-soft); }
.breakdown li:first-child { border-top:0; }
.breakdown .val { text-align:left; }
.section-hd h2 { font-size:16px; }
.settings-grid { grid-template-columns:1fr; }
}
</style>
</head>
<body>
<div class="dev-nav">
<span class="dev-label">Превью · gendsgn</span>
<nav class="dev-tabs" aria-label="Превью страницы">
<a href="index.html">обзор</a>
<a href="landing.html">лендинг</a>
<a href="analytics.html">/analytics</a>
<a href="site-finder.html">/site-finder</a>
<a href="site-finder-analysis.html" aria-current="page">/site-finder/анализ</a>
<span class="dev-sep" aria-hidden="true"></span>
<a href="developers.html">/developers</a>
</nav>
</div>
<header class="topbar">
<div class="topbar-inner">
<div class="topbar-left">
<a href="landing.html" class="brand"><span class="brand-mark" aria-hidden="true"></span> gendsgn</a>
<nav class="main">
<a href="site-finder.html" aria-current="page">Поиск участка</a>
<a href="analytics.html">Аналитика рынка</a>
<a href="developers.html">Девелоперы</a>
<a>Мои подборки</a>
</nav>
</div>
<div class="topbar-user">
<span class="who"><span class="avatar">АК</span> Алексей К. · PRINZIP</span>
</div>
</div>
</header>
<div class="crumbs-wrap">
<div class="crumbs">
<a href="site-finder.html">К карте</a>
<span class="sep">·</span>
<span class="last">66:41:0701045:42</span>
<span class="sep">·</span>
<span>Академический район</span>
<span class="sep">·</span>
<span>0,82&nbsp;га</span>
<span class="pill">анализ свежий · 8 мин</span>
</div>
</div>
<div class="layout">
<!-- ============ SIDEBAR ============ -->
<aside class="side">
<header class="side-hd">
<div class="eyebrow">анализ</div>
<h2>66:41:0701045:42</h2>
</header>
<ul role="navigation">
<li><a href="#" class="nav-link active" data-pane="p1"><span class="n">1</span><span>Инфо об участке</span></a></li>
<li><a href="#" class="nav-link" data-pane="p2"><span class="n">2</span><span>Сети и точки подключения</span></a></li>
<li>
<button type="button" class="sec-toggle nav-link" data-pane="p3"><span class="n">3</span><span>Продажи конкурентов</span></button>
<ul class="sub-list">
<li><a href="#" data-pane="p3" data-sub="3.1">3.1 Настройки выборки</a></li>
<li><a href="#" data-pane="p3" data-sub="3.2">3.2 Планировки</a></li>
<li><a href="#" data-pane="p3" data-sub="3.3">3.3 Остатки и скорость</a></li>
</ul>
</li>
<li><a href="#" class="nav-link" data-pane="p4"><span class="n">4</span><span>Оценка участка</span></a></li>
<li><a href="#" class="nav-link" data-pane="p5"><span class="n">5</span><span>Атмосфера / воздух</span></a></li>
</ul>
<footer class="side-foot">
<b>Источники</b><br>
ЕГРН · DOM.РФ · Rosreestr ДДУ · НСПД · Open-Meteo · 2GIS POI
</footer>
</aside>
<!-- ============ MAIN ============ -->
<main class="main">
<!-- ===== PANE 1: ИНФО ОБ УЧАСТКЕ ===== -->
<section class="pane active" id="p1">
<div class="page-head">
<div>
<h1>1. Инфо об участке</h1>
<p class="sub">Кадастровые данные ЕГРН · POI 2GIS · ВРИ из НСПД</p>
</div>
<div class="right">
<button type="button" class="btn btn-secondary">↗ Export PDF</button>
</div>
</div>
<div class="headline-bar">
<span class="tag">подходит</span>
<span class="verdict">Участок <b>0,82&nbsp;га</b> в Академическом · <b>комфорт-класс</b> · собственность ООО «УралЗем» · sold% соседей <b>62%</b> при медиане города 48%.</span>
<span class="caveat">данные ЕГРН на 16.05.2026</span>
</div>
<div class="kpi-row kpi-row-4">
<div class="kpi">
<div class="label">Площадь</div>
<div class="value">0,82 <small>га</small></div>
<div class="hint">8 200 м² · ВРИ 2.6 многоэтажка</div>
</div>
<div class="kpi">
<div class="label">Район</div>
<div class="value" style="font-size:22px;">Академический</div>
<div class="hint">8 км до центра · трамвай 23</div>
</div>
<div class="kpi">
<div class="label">Медиана цены</div>
<div class="value">186 <small>тыс ₽/м²</small></div>
<div class="hint">+11% за 6 мес <span class="delta pos">+11%</span></div>
</div>
<div class="kpi">
<div class="label">Score участка</div>
<div class="value">78<small>/100</small></div>
<div class="hint">верхний квартиль по району <span class="delta pos">+12</span></div>
</div>
</div>
<div class="section">
<div class="section-hd">
<div>
<h2>Расположение</h2>
<p class="sub">Граница участка по ЕГРН + ключевые POI в радиусе 1 км</p>
</div>
<div class="right">
<button type="button" class="btn btn-ghost">Смотреть в большой карте ↗</button>
</div>
</div>
<div class="grid-2" style="align-items:start;">
<div class="minimap">
<svg viewBox="0 0 600 380" preserveAspectRatio="xMidYMid slice">
<defs>
<pattern id="g1" width="30" height="30" patternUnits="userSpaceOnUse"><line x1="0" y1="0" x2="30" y2="0" stroke="#dde2ea" stroke-width="0.5"/><line x1="0" y1="0" x2="0" y2="30" stroke="#dde2ea" stroke-width="0.5"/></pattern>
</defs>
<rect width="600" height="380" fill="#f0f2f5"/>
<rect width="600" height="380" fill="url(#g1)"/>
<!-- streets -->
<path d="M0,180 L600,200" stroke="#dde2ea" stroke-width="9" fill="none"/>
<path d="M0,180 L600,200" stroke="#fff" stroke-width="6" fill="none"/>
<path d="M280,0 L300,380" stroke="#dde2ea" stroke-width="7" fill="none"/>
<path d="M280,0 L300,380" stroke="#fff" stroke-width="4.5" fill="none"/>
<!-- parcel highlighted -->
<polygon points="230,170 380,160 390,260 240,280" fill="#DCFCE7" stroke="#0F172A" stroke-width="2.5"/>
<text x="310" y="225" text-anchor="middle" font-size="10" font-weight="600" fill="#0F172A" font-family="Inter">66:41:0701045:42</text>
<!-- POIs -->
<g font-family="Inter" font-size="9" fill="#5b6066">
<circle cx="120" cy="100" r="6" fill="#1D4ED8"/><text x="132" y="103">м. Чкаловская (4 мин)</text>
<circle cx="460" cy="80" r="6" fill="#14B8A6"/><text x="472" y="83">Парк УрФУ (8 мин)</text>
<circle cx="180" cy="320" r="6" fill="#F2994A"/><text x="192" y="323">Школа №197 (6 мин)</text>
<circle cx="500" cy="300" r="6" fill="#F2994A"/><text x="450" y="320">МЦК «Орбита»</text>
<circle cx="80" cy="240" r="6" fill="#8B5CF6"/><text x="92" y="243">Перекрёсток</text>
</g>
<!-- 1km radius -->
<circle cx="310" cy="220" r="170" fill="none" stroke="#1D4ED8" stroke-width="1" stroke-dasharray="4 4" opacity="0.5"/>
</svg>
</div>
<div>
<ul class="meta-list">
<li><span class="l">Кадастровый номер</span><span class="v mono">66:41:0701045:42</span></li>
<li><span class="l">Адрес</span><span class="v">ул. Краснолесья, уч. 14</span></li>
<li><span class="l">Площадь</span><span class="v">8 234 м² (0,82 га)</span></li>
<li><span class="l">Категория земель</span><span class="v">Земли населённых пунктов</span></li>
<li><span class="l">ВРИ (актуальный)</span><span class="v">2.6 Многоэтажная застройка</span></li>
<li><span class="l">Форма собственности</span><span class="v">Частная</span></li>
<li><span class="l">Правообладатель</span><span class="v">ООО «УралЗем»</span></li>
<li><span class="l">Дата регистрации</span><span class="v">14.03.2022</span></li>
<li><span class="l">Обременения</span><span class="v good">Нет</span></li>
<li><span class="l">Красные линии в границах</span><span class="v warn">Касание с СЗО ВЛ-110</span></li>
</ul>
</div>
</div>
</div>
<div class="section">
<div class="section-hd">
<div><h2>Точки притяжения (POI) в радиусе 1 км</h2><p class="sub">2GIS · OpenStreetMap · сортировка по weighted score</p></div>
<div class="right"><button type="button" class="btn btn-secondary">↗ Export CSV</button></div>
</div>
<div class="poi-list">
<div class="poi"><div class="ico">M</div><div><div class="name">Станция метро «Чкаловская»</div><div class="desc">Зелёная линия, северный вход</div></div><div class="d">420 м</div><div class="walk">4 мин пеш.</div></div>
<div class="poi"><div class="ico">P</div><div><div class="name">Парк УрФУ</div><div class="desc">7,2 га · детская инфраструктура</div></div><div class="d">680 м</div><div class="walk">8 мин пеш.</div></div>
<div class="poi"><div class="ico">S</div><div><div class="name">Школа №197</div><div class="desc">МАОУ · 1240 учеников · рейтинг 4.2</div></div><div class="d">540 м</div><div class="walk">6 мин пеш.</div></div>
<div class="poi"><div class="ico">S</div><div><div class="name">Гимназия «Корифей»</div><div class="desc">Частная · 380 учеников</div></div><div class="d">820 м</div><div class="walk">10 мин пеш.</div></div>
<div class="poi"><div class="ico">K</div><div><div class="name">Детсад №524</div><div class="desc">Муницип · 240 мест · очередь 18 чел.</div></div><div class="d">310 м</div><div class="walk">3 мин пеш.</div></div>
<div class="poi"><div class="ico">$</div><div><div class="name">Перекрёсток</div><div class="desc">2 400 м² · 7:0023:00</div></div><div class="d">470 м</div><div class="walk">5 мин пеш.</div></div>
<div class="poi"><div class="ico">H</div><div><div class="name">ГКБ №40</div><div class="desc">Многопрофильная больница</div></div><div class="d">1,1 км</div><div class="walk">13 мин пеш.</div></div>
</div>
</div>
</section>
<!-- ===== PANE 2: СЕТИ И ТОЧКИ ПОДКЛЮЧЕНИЯ ===== -->
<section class="pane" id="p2">
<div class="page-head">
<div>
<h1>2. Сети и точки подключения</h1>
<p class="sub">Энергетическая, тепловая, водопроводная, газовая в радиусе 11,5 км · НСПД + reverse-engineered энергоплан</p>
</div>
<div class="right">
<button type="button" class="btn btn-secondary">↗ Export DWG</button>
</div>
</div>
<div class="headline-bar">
<span class="tag">подключаемо</span>
<span class="verdict">Все 4 ресурса в зоне <b>≤ 320 м</b>. Узкое место — <b>газ 1,4 км</b>, но для жилого многоквартирного не критично (центральное отопление от ТГК-9).</span>
<span class="caveat">данные НСПД на Q1 2026</span>
</div>
<div class="kpi-row kpi-row-4">
<div class="kpi"><div class="label">Теплоснабжение</div><div class="value">240<small> м</small></div><div class="hint">ТГК-9 · магистраль Ø500 <span class="delta pos">резерв 18 Гкал/ч</span></div></div>
<div class="kpi"><div class="label">Водоснабжение</div><div class="value">180<small> м</small></div><div class="hint">МУП «Водоканал» · колодец ВК-241</div></div>
<div class="kpi"><div class="label">Электричество</div><div class="value">320<small> м</small></div><div class="hint">ПС 110/10 «Академ» <span class="delta pos">резерв 9 МВт</span></div></div>
<div class="kpi"><div class="label">Газ</div><div class="value">1,4<small> км</small></div><div class="hint">ГРС-3 «Уралмаш» <span class="delta neu">для МКД не требуется</span></div></div>
</div>
<div class="section">
<div class="section-hd">
<div><h2>Схема сетей в радиусе 1,5 км</h2><p class="sub">Условные обозначения по СП 18.13330.2019</p></div>
<div class="right">
<button type="button" class="btn btn-ghost">Слои</button>
<button type="button" class="btn btn-secondary">↗ Открыть в НСПД</button>
</div>
</div>
<div class="util-schem">
<svg viewBox="0 0 1100 460" preserveAspectRatio="xMidYMid meet" aria-label="Схема сетей">
<defs>
<pattern id="g2" width="40" height="40" patternUnits="userSpaceOnUse"><line x1="0" y1="0" x2="40" y2="0" stroke="#e6e8ec" stroke-width="0.5"/><line x1="0" y1="0" x2="0" y2="40" stroke="#e6e8ec" stroke-width="0.5"/></pattern>
</defs>
<rect width="1100" height="460" fill="#fafbfc"/>
<rect width="1100" height="460" fill="url(#g2)"/>
<!-- radius rings -->
<circle cx="550" cy="230" r="120" fill="none" stroke="#cbd5e1" stroke-width="1" stroke-dasharray="3 4"/>
<circle cx="550" cy="230" r="240" fill="none" stroke="#cbd5e1" stroke-width="1" stroke-dasharray="3 4"/>
<text x="675" y="232" font-family="Inter" font-size="10" fill="#94a3b8">1 км</text>
<text x="795" y="232" font-family="Inter" font-size="10" fill="#94a3b8">1,5 км</text>
<!-- утилиты: тепло (красная), вода (синяя), электро (жёлтая), газ (оранжевая) -->
<!-- тепло -->
<path d="M40,140 L1060,160" stroke="#B3261E" stroke-width="3.5" fill="none"/>
<path d="M520,140 L550,225" stroke="#B3261E" stroke-width="2.5" fill="none" stroke-dasharray="4 3"/>
<circle cx="520" cy="140" r="6" fill="#B3261E"/>
<text x="500" y="128" font-family="Inter" font-size="10" font-weight="600" fill="#B3261E">ТК-118 · 240 м</text>
<!-- вода -->
<path d="M0,300 L1100,290" stroke="#0EA5E9" stroke-width="3" fill="none"/>
<path d="M550,295 L550,232" stroke="#0EA5E9" stroke-width="2.5" fill="none" stroke-dasharray="4 3"/>
<circle cx="550" cy="295" r="6" fill="#0EA5E9"/>
<text x="560" y="312" font-family="Inter" font-size="10" font-weight="600" fill="#0EA5E9">ВК-241 · 180 м</text>
<!-- электро -->
<path d="M820,80 L820,460" stroke="#F59E0B" stroke-width="3" fill="none" stroke-dasharray="8 4"/>
<path d="M820,228 L555,228" stroke="#F59E0B" stroke-width="2.5" fill="none" stroke-dasharray="4 3"/>
<polygon points="820,228 810,222 810,234" fill="#F59E0B"/>
<text x="780" y="76" font-family="Inter" font-size="10" font-weight="600" fill="#F59E0B">ВЛ-110 «Академ» · 320 м</text>
<!-- газ (за пределы рамки уходит) -->
<path d="M40,440 L1060,440" stroke="#8B5CF6" stroke-width="2.5" fill="none" opacity="0.5" stroke-dasharray="6 3"/>
<text x="900" y="430" font-family="Inter" font-size="10" font-weight="600" fill="#8B5CF6" opacity="0.7">ГРС «Уралмаш» · 1,4 км ↓</text>
<!-- участок -->
<polygon points="500,200 600,200 605,255 495,260" fill="#DCFCE7" stroke="#0F172A" stroke-width="2"/>
<text x="550" y="234" text-anchor="middle" font-family="Inter" font-size="11" font-weight="600" fill="#0F172A">участок</text>
<text x="550" y="248" text-anchor="middle" font-family="Inter" font-size="9" fill="#0F172A">0,82 га</text>
<!-- legend bottom -->
<g font-family="Inter" font-size="11" transform="translate(40,420)">
<rect width="14" height="3" y="3" fill="#B3261E"/><text x="22" y="9" fill="#5b6066">тепло</text>
<rect width="14" height="3" y="3" x="100" fill="#0EA5E9"/><text x="122" y="9" fill="#5b6066">вода</text>
<rect width="14" height="3" y="3" x="200" fill="#F59E0B"/><text x="222" y="9" fill="#5b6066">электро 10 кВ</text>
<rect width="14" height="3" y="3" x="330" fill="#8B5CF6"/><text x="352" y="9" fill="#5b6066">газ</text>
</g>
</svg>
</div>
</div>
<div class="section">
<div class="section-hd">
<div><h2>Точки подключения</h2><p class="sub">Координаты, владелец сети, доступный резерв, оценка стоимости подключения</p></div>
<div class="right"><button type="button" class="btn btn-secondary">↗ Export CSV</button></div>
</div>
<table class="util-table">
<thead><tr><th>Ресурс</th><th>Точка</th><th>Координаты</th><th>Владелец</th><th>Расстояние</th><th>Резерв</th><th>Стоимость подкл.</th><th>Статус</th></tr></thead>
<tbody>
<tr><td><div class="util-name"><i style="background:#B3261E;"></i>Тепло</div></td><td class="num">ТК-118</td><td class="num">56,838 / 60,597</td><td class="owner">ТГК-9</td><td class="num">240 м</td><td class="num">18 Гкал/ч</td><td class="num">3,4 млн ₽</td><td class="status-ok">подключаемо</td></tr>
<tr><td><div class="util-name"><i style="background:#0EA5E9;"></i>Вода</div></td><td class="num">ВК-241</td><td class="num">56,839 / 60,598</td><td class="owner">МУП «Водоканал»</td><td class="num">180 м</td><td class="num">280 м³/сут</td><td class="num">1,8 млн ₽</td><td class="status-ok">подключаемо</td></tr>
<tr><td><div class="util-name"><i style="background:#F59E0B;"></i>Электро 10 кВ</div></td><td class="num">ПС «Академ»</td><td class="num">56,840 / 60,600</td><td class="owner">МРСК Урала</td><td class="num">320 м</td><td class="num">9 МВт</td><td class="num">12,6 млн ₽</td><td class="status-ok">подключаемо</td></tr>
<tr><td><div class="util-name"><i style="background:#8B5CF6;"></i>Газ среднего давл.</div></td><td class="num">ГРС-3</td><td class="num">56,832 / 60,612</td><td class="owner">Газпром Е-бург</td><td class="num">1,4 км</td><td class="num">недостаточно</td><td class="num">≈ 28 млн ₽</td><td class="status-warn">альтернатива</td></tr>
<tr><td><div class="util-name"><i style="background:#5B6066;"></i>Канализация</div></td><td class="num">КК-89</td><td class="num">56,839 / 60,599</td><td class="owner">МУП «Водоканал»</td><td class="num">210 м</td><td class="num">240 м³/сут</td><td class="num">2,1 млн ₽</td><td class="status-ok">подключаемо</td></tr>
<tr><td><div class="util-name"><i style="background:#14B8A6;"></i>Ливневая</div></td><td class="num">ЛК-32</td><td class="num">56,838 / 60,594</td><td class="owner">Адм. Е-бурга</td><td class="num">280 м</td><td class="num"></td><td class="num">0,9 млн ₽</td><td class="status-ok">подключаемо</td></tr>
</tbody>
</table>
</div>
</section>
<!-- ===== PANE 3: ПРОДАЖИ КОНКУРЕНТОВ (Screen 3 — 8 секций: 1-4 настройки + 5-8 вывод) ===== -->
<section class="pane" id="p3">
<div class="page-head">
<div>
<h1>3. Продажи конкурентов</h1>
<p class="sub">DOM.РФ ДДУ-выгрузка + Rosreestr 6,83 млн ДДУ · обновление еженедельно</p>
</div>
<div class="right">
<button type="button" class="btn btn-ghost">Сравнить с другим участком</button>
<button type="button" class="btn btn-secondary">↗ Export Excel</button>
</div>
</div>
<div class="headline-bar">
<span class="tag">окно дефицита открыто</span>
<span class="verdict">В выборке <b>7 ЖК</b> · <b>1 482 квартиры в продаже</b> · средняя скорость <b>22 ДДУ/мес</b> · 80+ м² составляют <b>11% портфеля</b>, но <b>37% спроса</b> → конкурент Forum даёт <b>+86% уход</b>.</span>
<span class="caveat">данные на 16.05.2026</span>
</div>
<!-- ===== SETTINGS (1-4) ===== -->
<div class="settings-bar">
<h3><span class="n"></span> Настройки выборки <span style="margin-left:auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:0;text-transform:none;font-size:11px;color:var(--fg-tertiary);">пп. 14</span></h3>
<div class="settings-grid">
<div class="set">
<div class="lab"><span class="num">1</span> Радиус выборки</div>
<div class="val">2,5<small> км</small></div>
<div class="slider"><div class="slider-track"></div><div class="slider-fill" style="width:38%;"></div><div class="slider-thumb" style="left:38%;"></div></div>
<div class="slider-ticks"><span>1</span><span>2</span><span>3</span><span>4</span><span>5 км</span></div>
</div>
<div class="set">
<div class="lab"><span class="num">2</span> Только строящиеся</div>
<div class="toggle-row"><span class="toggle"></span><span><span class="t">включено</span><div class="d">+3 мес от срока ввода</div></span></div>
<div class="toggle-row" style="margin-top:6px;"><span class="toggle"></span><span><span class="t">не показывать сданное</span><div class="d">скрыто 4 ЖК · 312 квартир</div></span></div>
</div>
<div class="set">
<div class="lab"><span class="num">3</span> Период продаж</div>
<div class="val">6 мес <small>от 16.11.2025</small></div>
<div class="slider"><div class="slider-track"></div><div class="slider-fill" style="width:50%;"></div><div class="slider-thumb" style="left:50%;"></div></div>
<div class="slider-ticks"><span>3</span><span>6</span><span>9</span><span>12</span><span>24 мес</span></div>
</div>
<div class="set">
<div class="lab"><span class="num">4</span> Только квартиры</div>
<div class="toggle-row"><span class="toggle"></span><span><span class="t">flat_type = «Квартира»</span><div class="d">машиноместа, кладовые, апартам. — скрыто</div></span></div>
<div class="note">данных по парковкам — есть, но по этому ЖК и Брусника не разделяют. Дам знать когда подключим.</div>
</div>
</div>
</div>
<!-- ===== OUTPUTS (5-8) ===== -->
<!-- 5. Планировки -->
<div class="section">
<div class="section-hd">
<div>
<h2 class="out-h"><span class="num">5</span> Планировки конкурентов</h2>
<p class="sub">12 уникальных типов · сгруппированы по комнатности и площади · картинки из DOM.РФ скрапера</p>
</div>
<div class="right">
<button type="button" class="btn btn-ghost">Все 12 →</button>
<button type="button" class="btn btn-secondary">↗ Export PNG</button>
</div>
</div>
<div class="planning-grid">
<!-- 1 -->
<div class="plan">
<div class="plan-img">
<span class="badge cold">47%</span>
<svg viewBox="0 0 100 100"><rect x="5" y="5" width="90" height="90" fill="none" stroke="#0F172A" stroke-width="2"/><line x1="55" y1="5" x2="55" y2="95" stroke="#0F172A" stroke-width="1.4"/><line x1="55" y1="50" x2="95" y2="50" stroke="#0F172A" stroke-width="1.4"/><text x="28" y="55" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">кухня-гост</text><text x="75" y="32" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">спальня</text><text x="75" y="74" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">с/у</text></svg>
<span class="price-tag">7,8 млн</span>
</div>
<div class="plan-info">
<div class="title">1-комн «евро» 38 м²</div>
<div class="meta">встречается у 5 из 7 ЖК · 312 шт</div>
<div class="row"><span class="c-supply">предложение</span><b>312</b></div>
<div class="row"><span class="c-demand">продано/мес</span><b>9</b></div>
<div class="sold-bar"><i style="width:31%;background:var(--danger);"></i></div>
</div>
</div>
<!-- 2 -->
<div class="plan">
<div class="plan-img">
<span class="badge">±0</span>
<svg viewBox="0 0 100 100"><rect x="5" y="5" width="90" height="90" fill="none" stroke="#0F172A" stroke-width="2"/><line x1="50" y1="5" x2="50" y2="95" stroke="#0F172A" stroke-width="1.4"/><line x1="50" y1="50" x2="95" y2="50" stroke="#0F172A" stroke-width="1.4"/><text x="28" y="55" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">гост</text><text x="73" y="32" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">спальня</text><text x="73" y="74" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">кухня</text></svg>
<span class="price-tag">10,1 млн</span>
</div>
<div class="plan-info">
<div class="title">1-комн классика 46 м²</div>
<div class="meta">встречается у 4 из 7 ЖК · 184 шт</div>
<div class="row"><span class="c-supply">предложение</span><b>184</b></div>
<div class="row"><span class="c-demand">продано/мес</span><b>16</b></div>
<div class="sold-bar"><i style="width:52%;"></i></div>
</div>
</div>
<!-- 3 -->
<div class="plan">
<div class="plan-img">
<span class="badge">+12%</span>
<svg viewBox="0 0 100 100"><rect x="5" y="5" width="90" height="90" fill="none" stroke="#0F172A" stroke-width="2"/><line x1="45" y1="5" x2="45" y2="95" stroke="#0F172A" stroke-width="1.4"/><line x1="45" y1="55" x2="95" y2="55" stroke="#0F172A" stroke-width="1.4"/><line x1="70" y1="55" x2="70" y2="95" stroke="#0F172A" stroke-width="1.4"/><text x="25" y="55" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">кухня-гост</text><text x="68" y="32" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">сп.1</text><text x="58" y="78" text-anchor="middle" font-family="Inter" font-size="5.5" fill="#5b6066">сп.2</text><text x="83" y="78" text-anchor="middle" font-family="Inter" font-size="5.5" fill="#5b6066">с/у</text></svg>
<span class="price-tag">14,4 млн</span>
</div>
<div class="plan-info">
<div class="title">2-комн «евро» 62 м²</div>
<div class="meta">встречается у 6 из 7 ЖК · 238 шт</div>
<div class="row"><span class="c-supply">предложение</span><b>238</b></div>
<div class="row"><span class="c-demand">продано/мес</span><b>24</b></div>
<div class="sold-bar"><i style="width:71%;background:var(--success);"></i></div>
</div>
</div>
<!-- 4 — HOT -->
<div class="plan">
<div class="plan-img">
<span class="badge hot">+86%</span>
<svg viewBox="0 0 100 100"><rect x="5" y="5" width="90" height="90" fill="none" stroke="#0F172A" stroke-width="2"/><line x1="42" y1="5" x2="42" y2="95" stroke="#0F172A" stroke-width="1.4"/><line x1="42" y1="50" x2="95" y2="50" stroke="#0F172A" stroke-width="1.4"/><line x1="68" y1="5" x2="68" y2="50" stroke="#0F172A" stroke-width="1.4"/><line x1="65" y1="50" x2="65" y2="95" stroke="#0F172A" stroke-width="1.4"/><text x="22" y="48" text-anchor="middle" font-family="Inter" font-size="5.5" fill="#5b6066">кухня</text><text x="22" y="58" text-anchor="middle" font-family="Inter" font-size="5.5" fill="#5b6066">-гост</text><text x="55" y="32" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">сп.1</text><text x="82" y="32" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">сп.2</text><text x="52" y="74" text-anchor="middle" font-family="Inter" font-size="6" fill="#5b6066">сп.3</text><text x="82" y="74" text-anchor="middle" font-family="Inter" font-size="5.5" fill="#5b6066">с/у</text></svg>
<span class="price-tag">19,2 млн</span>
</div>
<div class="plan-info">
<div class="title">3-комн 84 м²</div>
<div class="meta">только у 2 из 7 ЖК · 38 шт</div>
<div class="row"><span class="c-supply">предложение</span><b>38</b></div>
<div class="row"><span class="c-demand">продано/мес</span><b>14</b></div>
<div class="sold-bar"><i style="width:96%;background:var(--success);"></i></div>
</div>
</div>
</div>
</div>
<!-- 6. Остатки -->
<div class="section">
<div class="section-hd">
<div>
<h2 class="out-h"><span class="num">6</span> Остатки (нераспроданное)</h2>
<p class="sub">flats_total flats_sold по каждому ЖК в выборке · сортировка по абс. остатку</p>
</div>
<div class="right">
<button type="button" class="btn btn-ghost">Только 80+ м²</button>
<button type="button" class="btn btn-secondary">↗ Export CSV</button>
</div>
</div>
<table class="stock-table">
<thead><tr><th>ЖК</th><th>Срок ввода</th><th class="r">Всего, шт</th><th class="r">Продано</th><th class="r">Остаток</th><th>Доля остатка</th><th class="r">Sold%</th><th class="r">Δ за 14 мес</th></tr></thead>
<tbody>
<tr><td><div class="jk"><div class="jk-mark">ФР</div><div><div class="jk-name">Forum &laquo;Краснолесье&raquo;</div><div class="jk-dev">Форум-групп · 2 очередь</div></div></div></td><td>IV кв 2026</td><td class="r">412</td><td class="r">266</td><td class="r">146</td><td><span class="left-bar"><span class="bar"><i style="width:35%;" class="low"></i></span> 35%</span></td><td class="r">64%</td><td class="r"><span class="delta pos">+18 пп</span></td></tr>
<tr><td><div class="jk"><div class="jk-mark">БР</div><div><div class="jk-name">Брусника «Академ-парк»</div><div class="jk-dev">Брусника · 3 очередь</div></div></div></td><td>II кв 2026</td><td class="r">368</td><td class="r">280</td><td class="r">88</td><td><span class="left-bar"><span class="bar"><i style="width:24%;" class="low"></i></span> 24%</span></td><td class="r">76%</td><td class="r"><span class="delta pos">+24 пп</span></td></tr>
<tr><td><div class="jk"><div class="jk-mark">ЭТ</div><div><div class="jk-name">Эталон «Чкаловский»</div><div class="jk-dev">Эталон · 1 очередь</div></div></div></td><td>I кв 2027</td><td class="r">284</td><td class="r">112</td><td class="r">172</td><td><span class="left-bar"><span class="bar"><i style="width:61%;" class="high"></i></span> 61%</span></td><td class="r">39%</td><td class="r"><span class="delta neg">6 пп</span></td></tr>
<tr><td><div class="jk"><div class="jk-mark">КР</div><div><div class="jk-name">Кортрос «Преображенский»</div><div class="jk-dev">КОРТРОС · 2 очередь</div></div></div></td><td>III кв 2026</td><td class="r">196</td><td class="r">138</td><td class="r">58</td><td><span class="left-bar"><span class="bar"><i style="width:30%;" class="low"></i></span> 30%</span></td><td class="r">70%</td><td class="r"><span class="delta pos">+12 пп</span></td></tr>
<tr><td><div class="jk"><div class="jk-mark">УН</div><div><div class="jk-name">Унистрой «Юг-1»</div><div class="jk-dev">Унистрой · 4 очередь</div></div></div></td><td>IV кв 2026</td><td class="r">142</td><td class="r">38</td><td class="r">104</td><td><span class="left-bar"><span class="bar"><i style="width:73%;" class="high"></i></span> 73%</span></td><td class="r">27%</td><td class="r"><span class="delta neg">14 пп</span></td></tr>
<tr><td><div class="jk"><div class="jk-mark">АС</div><div><div class="jk-name">Атомстрой «Уралмаш»</div><div class="jk-dev">Атомстройкомплекс · 1 очередь</div></div></div></td><td>I кв 2027</td><td class="r">80</td><td class="r">26</td><td class="r">54</td><td><span class="left-bar"><span class="bar"><i style="width:68%;" class="high"></i></span> 68%</span></td><td class="r">32%</td><td class="r"><span class="delta pos">+4 пп</span></td></tr>
</tbody>
</table>
</div>
<!-- 7. Ассортимент и скорость продаж -->
<div class="section">
<div class="section-hd">
<div>
<h2 class="out-h"><span class="num">7</span> Ассортимент и скорость продаж</h2>
<p class="sub">6 мес от сегодня · разрез по room_bucket × area_bin · ось Y — ДДУ/мес</p>
</div>
<div class="right"><button type="button" class="btn btn-secondary">↗ Export PNG</button></div>
</div>
<div class="vchart">
<svg viewBox="0 0 980 320" preserveAspectRatio="xMidYMid meet" aria-label="Скорость продаж по сегментам">
<!-- Y axis grid -->
<g font-family="Inter" font-size="10" fill="#73767e">
<line x1="60" y1="20" x2="60" y2="280" stroke="#e6e8ec"/>
<line x1="60" y1="280" x2="960" y2="280" stroke="#e6e8ec"/>
<line x1="60" y1="220" x2="960" y2="220" stroke="#eef0f3" stroke-dasharray="2 3"/>
<line x1="60" y1="160" x2="960" y2="160" stroke="#eef0f3" stroke-dasharray="2 3"/>
<line x1="60" y1="100" x2="960" y2="100" stroke="#eef0f3" stroke-dasharray="2 3"/>
<line x1="60" y1="40" x2="960" y2="40" stroke="#eef0f3" stroke-dasharray="2 3"/>
<text x="50" y="284" text-anchor="end">0</text>
<text x="50" y="224" text-anchor="end">10</text>
<text x="50" y="164" text-anchor="end">20</text>
<text x="50" y="104" text-anchor="end">30</text>
<text x="50" y="44" text-anchor="end">40</text>
<text x="20" y="155" text-anchor="middle" transform="rotate(-90 20,155)" fill="#5b6066" font-weight="500">ДДУ / мес</text>
</g>
<!-- bars: groups by room_bucket; supply (grey) + demand (emerald) -->
<!-- group 1: 1-комн до 40 -->
<g>
<rect x="100" y="160" width="34" height="120" fill="#94A3B8"/>
<rect x="138" y="240" width="34" height="40" fill="#0A7A3A"/>
<text x="155" y="298" text-anchor="middle" font-family="Inter" font-size="10.5" fill="#5b6066">1к до 40</text>
</g>
<!-- group 2: 1-комн 40-50 -->
<g>
<rect x="220" y="200" width="34" height="80" fill="#94A3B8"/>
<rect x="258" y="216" width="34" height="64" fill="#0A7A3A"/>
<text x="275" y="298" text-anchor="middle" font-family="Inter" font-size="10.5" fill="#5b6066">1к 40-50</text>
</g>
<!-- group 3: 2-комн до 55 -->
<g>
<rect x="340" y="180" width="34" height="100" fill="#94A3B8"/>
<rect x="378" y="184" width="34" height="96" fill="#0A7A3A"/>
<text x="395" y="298" text-anchor="middle" font-family="Inter" font-size="10.5" fill="#5b6066">2к до 55</text>
</g>
<!-- group 4: 2-комн евро 55-70 -->
<g>
<rect x="460" y="100" width="34" height="180" fill="#94A3B8"/>
<rect x="498" y="136" width="34" height="144" fill="#0A7A3A"/>
<text x="515" y="298" text-anchor="middle" font-family="Inter" font-size="10.5" fill="#5b6066">2к евро 55-70</text>
</g>
<!-- group 5: 3-комн 70-85 -->
<g>
<rect x="580" y="220" width="34" height="60" fill="#94A3B8"/>
<rect x="618" y="196" width="34" height="84" fill="#0A7A3A"/>
<text x="635" y="298" text-anchor="middle" font-family="Inter" font-size="10.5" fill="#5b6066">3к 70-85 ⚡</text>
</g>
<!-- group 6: 3-комн 85-110 -->
<g>
<rect x="700" y="240" width="34" height="40" fill="#94A3B8"/>
<rect x="738" y="208" width="34" height="72" fill="#0A7A3A"/>
<text x="755" y="298" text-anchor="middle" font-family="Inter" font-size="10.5" fill="#5b6066">3к 85-110 ⚡</text>
</g>
<!-- group 7: 4+ комн 110+ -->
<g>
<rect x="820" y="260" width="34" height="20" fill="#94A3B8"/>
<rect x="858" y="232" width="34" height="48" fill="#0A7A3A"/>
<text x="875" y="298" text-anchor="middle" font-family="Inter" font-size="10.5" fill="#5b6066">4к+ 110+ ⚡</text>
</g>
<!-- legend -->
<g font-family="Inter" font-size="11" transform="translate(680,30)">
<rect width="12" height="12" fill="#94A3B8"/><text x="18" y="10" fill="#5b6066">предложение, шт ×0.1</text>
<rect x="160" width="12" height="12" fill="#0A7A3A"/><text x="178" y="10" fill="#5b6066">ДДУ / мес</text>
</g>
<!-- annotation -->
<g>
<line x1="650" y1="60" x2="650" y2="190" stroke="#F2994A" stroke-dasharray="3 3"/>
<text x="660" y="60" font-family="Inter" font-size="10.5" font-weight="600" fill="#F2994A">окно дефицита 70+ м²</text>
<text x="660" y="74" font-family="Inter" font-size="10.5" fill="#F2994A">спрос &gt; предложение</text>
</g>
</svg>
</div>
</div>
<!-- 8. Рекомендация -->
<div class="reco">
<div class="eyebrow">🜂 рекомендация — наша</div>
<h2>Строить комфорт-микс с креном в 3-комн евро 7085 м² (35% портфеля)</h2>
<p class="lede">Дефицит 80+ м² в радиусе 2,5 км — реальный (37% спроса при 11% предложения). Forum «Краснолесье» забирает 86% этого спроса с одной типологии «3-комн 84 м²». Своя конкурентная позиция: тот же бакет с лучшей кухней-гостиной (24+ м²) и панорамным остеклением спальни. Цену держать 230 тыс ₽/м² против 215 тыс у Forum — рынок проглотит, sold % сохранится &gt; 60% к месяцу 14.</p>
<div class="reco-grid">
<div class="reco-stat"><div class="l">Площадь застройки</div><div class="v">12 600<small> м²</small></div><div class="h">≈ 180 квартир</div></div>
<div class="reco-stat"><div class="l">Прогноз выручки</div><div class="v">2,4<small> млрд ₽</small></div><div class="h">из них 1,1 млрд — 3к</div></div>
<div class="reco-stat"><div class="l">Срок 80% продаж</div><div class="v">22<small> мес</small></div><div class="h">от старта продаж</div></div>
<div class="reco-stat"><div class="l">Liquidity score</div><div class="v">B+</div><div class="h">медиана городa: B</div></div>
</div>
<div class="reco-foot">
<button type="button" class="btn btn-primary">→ Передать в Generative Design</button>
<button type="button" class="btn btn-ghost">↗ Export сценарий (PDF)</button>
<button type="button" class="btn btn-ghost">Сохранить в подборку</button>
</div>
</div>
</section>
<!-- ===== PANE 4: ОЦЕНКА УЧАСТКА ===== -->
<section class="pane" id="p4">
<div class="page-head">
<div>
<h1>4. Оценка участка</h1>
<p class="sub">Композитный score 0100 · веса калибруются под класс жилья</p>
</div>
<div class="right">
<button type="button" class="btn btn-secondary">↗ Export PDF</button>
</div>
</div>
<div class="headline-bar">
<span class="tag">верхний квартиль</span>
<span class="verdict">Score <b>78/100</b> · верхний квартиль по Свердл (медиана города 56) · единственное узкое место — <b>касание с СЗО ВЛ-110</b>, требует согласования.</span>
<span class="caveat">калибровка на 2 142 ДДУ</span>
</div>
<div class="section">
<div class="score-hero">
<svg class="score-ring" viewBox="0 0 200 200">
<circle cx="100" cy="100" r="84" fill="none" stroke="#eef0f3" stroke-width="14"/>
<circle cx="100" cy="100" r="84" fill="none" stroke="#1D4ED8" stroke-width="14" stroke-dasharray="412.6" stroke-dashoffset="91" transform="rotate(-90 100 100)" stroke-linecap="round"/>
<text class="num" x="100" y="106" text-anchor="middle">78</text>
<text class="lab" x="100" y="135" text-anchor="middle">из 100</text>
</svg>
<div>
<ul class="breakdown">
<li><span class="name">Локация и транспорт<small>метро 420 м · школа 540 м · парк 680 м</small></span><div class="bar"><i style="width:88%;"></i></div><span class="val">88</span></li>
<li><span class="name">Спрос в районе<small>sold % 62% · окно 80+ м² открыто</small></span><div class="bar"><i style="width:84%;"></i></div><span class="val">84</span></li>
<li><span class="name">Инженерные сети<small>тепло/вода/электро ≤ 320 м</small></span><div class="bar"><i style="width:80%;"></i></div><span class="val">80</span></li>
<li><span class="name">Конкуренция<small>7 ЖК в 1 км · Forum доминирует</small></span><div class="bar"><i class="warn" style="width:64%;"></i></div><span class="val">64</span></li>
<li><span class="name">Цена / маржинальность<small>+11% за 6 мес · потолок 230 тыс ₽/м²</small></span><div class="bar"><i style="width:74%;"></i></div><span class="val">74</span></li>
<li><span class="name">Юр-ограничения<small>СЗО ВЛ-110 в границах</small></span><div class="bar"><i class="bad" style="width:52%;"></i></div><span class="val">52</span></li>
<li><span class="name">Экология / атмосфера<small>AQI 38 · преобл. ЮЗ ветер</small></span><div class="bar"><i style="width:82%;"></i></div><span class="val">82</span></li>
</ul>
</div>
</div>
<div class="gate-banner">
<div class="ico"></div>
<div class="body">
<h4>Gate: ПРОЙДЕНО (по умолчанию для комфорт-класса)</h4>
<p>Все 4 обязательных критерия выполнены: ВРИ совместим (1), все 4 ресурса в 1,5 км (2), sold % района &gt; 45% (3), score &gt; 65 (4). Замечание: СЗО ВЛ-110 — требует согласования с МРСК Урала до начала проектирования (1216 недель).</p>
</div>
</div>
</div>
</section>
<!-- ===== PANE 5: АТМОСФЕРА / ВОЗДУХ ===== -->
<section class="pane" id="p5">
<div class="page-head">
<div>
<h1>5. Атмосфера и климат</h1>
<p class="sub">Open-Meteo · ФГБУ «УГМС-Урал» · roza vetrov по последним 5 годам</p>
</div>
<div class="right">
<button type="button" class="btn btn-secondary">↗ Export CSV</button>
</div>
</div>
<div class="headline-bar">
<span class="tag">пригодно</span>
<span class="verdict">AQI <b>38</b> (good) · преобладающий ветер <b>ЮЗ</b> (38% времени) → промзона Уралмаш в наветренной стороне → <b>низкий риск</b> износа от выбросов.</span>
<span class="caveat">5-летний период</span>
</div>
<div class="aqi-grid">
<div class="aqi"><div class="lab">AQI индекс</div><div class="val">38</div><span class="grade good">good</span><div class="hint" style="font-size:12.5px;color:var(--fg-secondary);margin-top:6px;">медиана города 52</div></div>
<div class="aqi"><div class="lab">PM2.5</div><div class="val">9 <small>мкг/м³</small></div><span class="grade good">≤ 12</span><div class="hint" style="font-size:12.5px;color:var(--fg-secondary);margin-top:6px;">норма ВОЗ — 15</div></div>
<div class="aqi"><div class="lab">NO₂</div><div class="val">28 <small>мкг/м³</small></div><span class="grade warn">умерен.</span><div class="hint" style="font-size:12.5px;color:var(--fg-secondary);margin-top:6px;">влияние трамвайной линии</div></div>
<div class="aqi"><div class="lab">Шум днём</div><div class="val">54 <small>дБА</small></div><span class="grade good">в норме</span><div class="hint" style="font-size:12.5px;color:var(--fg-secondary);margin-top:6px;">СН 2.2.4/2.1.8.562-96 ≤ 55</div></div>
</div>
<div class="grid-2" style="margin-top:16px;">
<div class="section" style="margin-bottom:0;">
<div class="section-hd"><div><h2>Роза ветров</h2><p class="sub">направление преобладающего ветра · 5-летняя статистика УГМС</p></div></div>
<div class="wind-rose">
<svg viewBox="0 0 220 220" aria-label="Роза ветров">
<circle cx="110" cy="110" r="90" fill="none" stroke="#eef0f3"/>
<circle cx="110" cy="110" r="60" fill="none" stroke="#eef0f3" stroke-dasharray="2 3"/>
<circle cx="110" cy="110" r="30" fill="none" stroke="#eef0f3" stroke-dasharray="2 3"/>
<!-- 8 directions -->
<g font-family="Inter" font-size="10" fill="#5b6066" font-weight="600">
<text x="110" y="16" text-anchor="middle">С</text>
<text x="204" y="114" text-anchor="middle">В</text>
<text x="110" y="212" text-anchor="middle">Ю</text>
<text x="16" y="114" text-anchor="middle">З</text>
<text x="178" y="46" text-anchor="middle">СВ</text>
<text x="178" y="182" text-anchor="middle">ЮВ</text>
<text x="42" y="182" text-anchor="middle">ЮЗ</text>
<text x="42" y="46" text-anchor="middle">СЗ</text>
</g>
<!-- petals (sample distribution) -->
<path d="M110,110 L100,40 Q110,20 120,40 Z" fill="#1D4ED8" opacity="0.6"/><!-- N 12% -->
<path d="M110,110 L160,60 Q172,60 165,75 Z" fill="#1D4ED8" opacity="0.5"/><!-- NE 9% -->
<path d="M110,110 L195,100 Q204,110 195,120 Z" fill="#1D4ED8" opacity="0.45"/><!-- E 7% -->
<path d="M110,110 L165,165 Q170,178 152,170 Z" fill="#1D4ED8" opacity="0.4"/><!-- SE 6% -->
<path d="M110,110 L120,180 Q110,200 100,180 Z" fill="#1D4ED8" opacity="0.55"/><!-- S 10% -->
<path d="M110,110 L52,168 Q40,160 50,148 Z" fill="#1D4ED8" opacity="0.95"/><!-- SW 38% — dominant -->
<path d="M110,110 L20,110 Q14,98 28,92 Z" fill="#1D4ED8" opacity="0.5"/><!-- W 8% -->
<path d="M110,110 L48,52 Q60,42 70,55 Z" fill="#1D4ED8" opacity="0.4"/><!-- NW 6% -->
<circle cx="110" cy="110" r="6" fill="#0F172A"/>
</svg>
</div>
<p class="hint" style="font-size:12.5px;color:var(--fg-secondary);margin-top:10px;">Доминирует ЮЗ (38%) — комбинат «Уралмаш» в наветренной стороне → выбросы уходят на восток, в направлении ЕКАД. Для участка это <b style="color:var(--success);">благоприятный фактор</b>.</p>
</div>
<div class="section" style="margin-bottom:0;">
<div class="section-hd"><div><h2>Сезонная погода</h2><p class="sub">средние значения за 5 лет · Open-Meteo</p></div></div>
<div class="season-grid">
<div class="season"><div class="s">зима</div><div class="t">12<small>°C</small></div><div class="d">снежн. покров 87 дн · риск гололёда на парковке</div></div>
<div class="season"><div class="s">весна</div><div class="t">+6<small>°C</small></div><div class="d">паводок 1,2 м · район выше отметки 295</div></div>
<div class="season"><div class="s">лето</div><div class="t">+22<small>°C</small></div><div class="d">волны жары до +34 — нужно остекл. ≤ 35% юж. фасадов</div></div>
<div class="season"><div class="s">осень</div><div class="t">+8<small>°C</small></div><div class="d">осадки 180 мм · нагрузка на ливневую</div></div>
</div>
<ul class="meta-list" style="margin-top:16px;">
<li><span class="l">Солнечных дней / год</span><span class="v">118</span></li>
<li><span class="l">Глубина промерзания</span><span class="v">1,8 м (фундамент свайно-плитный)</span></li>
<li><span class="l">Расчётная сейсмика</span><span class="v">5 баллов MSK · норма по СП 14.13330</span></li>
<li><span class="l">Уровень грунтовых вод</span><span class="v">5,6 м (норма для свайного)</span></li>
</ul>
</div>
</div>
</section>
</main>
</div>
<script>
// sidebar pane switching
const links = document.querySelectorAll('[data-pane]');
const panes = document.querySelectorAll('.pane');
links.forEach(a => {
a.addEventListener('click', (e) => {
e.preventDefault();
const id = a.getAttribute('data-pane');
panes.forEach(p => p.classList.toggle('active', p.id === id));
document.querySelectorAll('.nav-link').forEach(n => n.classList.remove('active'));
const topNav = document.querySelector('.nav-link[data-pane="' + id + '"]');
if (topNav) topNav.classList.add('active');
// sub-link styling
document.querySelectorAll('.sub-list a').forEach(s => s.classList.remove('active'));
if (a.classList.contains('sub-list-anchor') || a.closest('.sub-list')) {
a.classList.add('active');
}
window.scrollTo({ top: 0, behavior: 'smooth' });
});
});
</script>
</body>
</html>