feat: establish NekoNest Cloud control and relay

This commit is contained in:
2026-08-12 23:25:43 +08:00
commit f27606b709
222 changed files with 71456 additions and 0 deletions
+92
View File
@@ -0,0 +1,92 @@
import type { Metadata } from "next";
import Link from "next/link";
import { PublicShell, StatusPill } from "../components/Shells";
import { CONTROL_PLANE_EXCLUSIONS, DATA_INVENTORY } from "./data-inventory";
export const metadata: Metadata = {
title: "公测数据说明",
description: "NekoNest Cloud 免费公测当前保存的数据、用途、退出方式和尚未完成的保存与删除边界。",
};
const statusCopy = {
active: { label: "公测使用", tone: "good" },
security: { label: "安全必需", tone: "info" },
operational: { label: "运维必需", tone: "neutral" },
dormant: { label: "未启用", tone: "warn" },
} as const;
export default function PrivacyPage() {
return (
<PublicShell>
<section className="subpage-hero privacy-hero">
<div className="subpage-hero-inner">
<span className="eyebrow">BETA DATA MAP / </span>
<h1></h1>
<p></p>
</div>
</section>
<section className="section data-map-section">
<div className="section-heading split-heading">
<div><span className="eyebrow">CURRENT INVENTORY</span><h2></h2></div>
<p></p>
</div>
<div className="data-map-grid">
{DATA_INVENTORY.map((group) => {
const status = statusCopy[group.status];
return (
<article className={`data-map-card data-map-${group.status}`} key={group.id}>
<div className="data-map-card-heading">
<span>{group.id.toUpperCase()}</span>
<StatusPill tone={status.tone}>{status.label}</StatusPill>
</div>
<h3>{group.title}</h3>
<p>{group.summary}</p>
<ul className="data-example-list">
{group.examples.map((example) => <li key={example}>{example}</li>)}
</ul>
<dl className="data-map-details">
<div><dt></dt><dd>{group.purpose}</dd></div>
<div><dt></dt><dd>{group.retention}</dd></div>
<div><dt></dt><dd>{group.userControl}</dd></div>
</dl>
</article>
);
})}
</div>
</section>
<section className="section not-collected-section">
<div className="policy-grid">
<div><span className="eyebrow">CONTROL-PLANE BOUNDARY</span><h2></h2></div>
<div>
<ul className="not-collected-list">
{CONTROL_PLANE_EXCLUSIONS.map((entry) => <li key={entry.item}><strong>{entry.item}</strong><span>{entry.boundary}</span></li>)}
</ul>
<p className="privacy-boundary-note">sealed </p>
</div>
</div>
</section>
<section className="section privacy-actions-section">
<div className="section-heading split-heading">
<div><span className="eyebrow">YOUR CONTROLS</span><h2>使</h2></div>
<p> JSON</p>
</div>
<div className="privacy-action-grid">
<article><span>01</span><h3> Cloud </h3><p></p><Link href="/dashboard/security"> </Link></article>
<article><span>02</span><h3></h3><p></p><Link href="/dashboard/hosts"> </Link></article>
<article><span>03</span><h3></h3><p></p><Link href="/dashboard/security"> </Link></article>
</div>
</section>
<section className="privacy-open-items" aria-labelledby="privacy-open-heading">
<div>
<span className="eyebrow">STILL BLOCKING PUBLIC BETA</span>
<h2 id="privacy-open-heading"></h2>
</div>
<p></p>
</section>
</PublicShell>
);
}