188 lines
5.8 KiB
TypeScript
188 lines
5.8 KiB
TypeScript
import Link from "next/link";
|
||
|
||
interface Route {
|
||
href: string;
|
||
label: string;
|
||
desc: string;
|
||
}
|
||
|
||
const SECTIONS: { title: string; routes: Route[] }[] = [
|
||
{
|
||
title: "Аналитика",
|
||
routes: [
|
||
{
|
||
href: "/analytics",
|
||
label: "Свердл рынок",
|
||
desc: "Динамика 14 мес · парадокс «строят vs покупают» · pipeline · районы ЕКБ.",
|
||
},
|
||
{
|
||
href: "/analytics/prinzip",
|
||
label: "PRINZIP drill-down",
|
||
desc: "Velocity vs benchmark · gap-bar к рынку · ЖК с sparkline · инсайты.",
|
||
},
|
||
{
|
||
href: "/analytics/developers",
|
||
label: "Топ девелоперов",
|
||
desc: "Sortable leaderboard · velocity scatter · сравнение sold% по месяцам.",
|
||
},
|
||
{
|
||
href: "/analytics/objects/60160",
|
||
label: "Карточка ЖК (пример: Парк Победы)",
|
||
desc: "KPI · sale-chart · корпуса ЖК (cad_quarter + buildings) · POI-таблица · фото-галерея. /analytics/objects/{obj_id}.",
|
||
},
|
||
{
|
||
href: "/analytics/recommend",
|
||
label: "Рекомендатор квартирографии",
|
||
desc: "Район + площадь + класс → распределение по 5 бакетам, цены p25/median/p75, выручка, comparable ЖК. Слайдеры под проект.",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: "Site Finder",
|
||
routes: [
|
||
{
|
||
href: "/site-finder",
|
||
label: "Анализ участка по cad-номеру",
|
||
desc: "Вводишь кадастр → карта + score соц-инфраструктуры (школы/сады/магазины/парки +вес, трамваи −вес) + 20 ближайших конкурентов с подсветкой района. Данные: OSM POI обновляются еженедельно.",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: "Админка (Token-protected)",
|
||
routes: [
|
||
{
|
||
href: "/admin/scrape/all",
|
||
label: "Скрапер — единая панель",
|
||
desc: "Все джобы (kn/nspd_geo/objective) в одном месте · job_settings inline-edit · bulk Свердл geo backfill · ScrapeLogsPanel.",
|
||
},
|
||
{
|
||
href: "/admin/leads",
|
||
label: "Лиды PRINZIP CRM",
|
||
desc: "Воронка Sankey · конверсия по месяцам · KPI · таблица лидов с фильтрами.",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: "Generative (WIP)",
|
||
routes: [
|
||
{
|
||
href: "/concept",
|
||
label: "Concept (Stage 1)",
|
||
desc: "Импорт полигона → 3 варианта застройки. WIP — Stage 1a-c.",
|
||
},
|
||
],
|
||
},
|
||
];
|
||
|
||
export default function HomePage() {
|
||
return (
|
||
<main
|
||
style={{
|
||
padding: 24,
|
||
maxWidth: 980,
|
||
margin: "0 auto",
|
||
fontFamily:
|
||
"system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
|
||
}}
|
||
>
|
||
<header style={{ marginBottom: 24 }}>
|
||
<h1 style={{ margin: 0, fontSize: 28 }}>GenDesign</h1>
|
||
<p style={{ margin: "6px 0 0", color: "#5b6066", fontSize: 14 }}>
|
||
Generative Design + Site Finder — Discovery MVP. Свердл рынок &
|
||
PRINZIP.
|
||
</p>
|
||
</header>
|
||
|
||
{SECTIONS.map((section) => (
|
||
<section key={section.title} style={{ marginTop: 24 }}>
|
||
<h2
|
||
style={{
|
||
fontSize: 13,
|
||
textTransform: "uppercase",
|
||
letterSpacing: 0.6,
|
||
color: "#5b6066",
|
||
margin: "0 0 8px",
|
||
}}
|
||
>
|
||
{section.title}
|
||
</h2>
|
||
<div
|
||
style={{
|
||
display: "grid",
|
||
gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))",
|
||
gap: 12,
|
||
}}
|
||
>
|
||
{section.routes.map((r) => (
|
||
<Link
|
||
key={r.href}
|
||
href={r.href}
|
||
style={{
|
||
display: "block",
|
||
padding: "14px 16px",
|
||
border: "1px solid #e6e8ec",
|
||
borderRadius: 12,
|
||
background: "#fff",
|
||
textDecoration: "none",
|
||
color: "#1f2937",
|
||
transition: "all 0.15s",
|
||
}}
|
||
>
|
||
<div
|
||
style={{
|
||
fontFamily: "monospace",
|
||
fontSize: 12,
|
||
color: "#1d4ed8",
|
||
marginBottom: 4,
|
||
}}
|
||
>
|
||
{r.href}
|
||
</div>
|
||
<div style={{ fontWeight: 600, fontSize: 15 }}>{r.label}</div>
|
||
<div
|
||
style={{
|
||
fontSize: 12,
|
||
color: "#5b6066",
|
||
marginTop: 6,
|
||
lineHeight: 1.4,
|
||
}}
|
||
>
|
||
{r.desc}
|
||
</div>
|
||
</Link>
|
||
))}
|
||
</div>
|
||
</section>
|
||
))}
|
||
|
||
<footer
|
||
style={{
|
||
marginTop: 48,
|
||
paddingTop: 20,
|
||
borderTop: "1px solid #e6e8ec",
|
||
fontSize: 12,
|
||
color: "#73767e",
|
||
}}
|
||
>
|
||
<a
|
||
href="/api/v1/docs"
|
||
style={{ color: "#1d4ed8", textDecoration: "none", marginRight: 16 }}
|
||
>
|
||
OpenAPI / Swagger
|
||
</a>
|
||
<a
|
||
href="/health"
|
||
style={{ color: "#1d4ed8", textDecoration: "none", marginRight: 16 }}
|
||
>
|
||
/health
|
||
</a>
|
||
<a
|
||
href="https://github.com/lekss361/-gendesign"
|
||
style={{ color: "#1d4ed8", textDecoration: "none" }}
|
||
>
|
||
GitHub
|
||
</a>
|
||
</footer>
|
||
</main>
|
||
);
|
||
}
|