Files

93 lines
5.1 KiB
TypeScript

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>
);
}