gendesign/frontend/src/app/page.tsx

188 lines
5.8 KiB
TypeScript
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.

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. Свердл рынок &amp;
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>
);
}