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
+102
View File
@@ -0,0 +1,102 @@
import type { Metadata } from "next";
import Link from "next/link";
import { PublicShell, StatusPill } from "../components/Shells";
import { getPublicCommercialSnapshot } from "@/db/repository";
import { getPublicBetaPresentation } from "@/db/domain";
export const dynamic = "force-dynamic";
export const metadata: Metadata = {
title: "免费公测政策",
description: "NekoNest Cloud 前几个月免费公测,不绑定支付方式,也不创建报价或订单。",
};
export default async function PricingPage() {
const commercial = await getPublicCommercialSnapshot();
const betaActive = Boolean(commercial.beta);
const publicBetaOpen = betaActive && commercial.blockedP0 === 0;
const betaCopy = getPublicBetaPresentation(betaActive);
return (
<PublicShell>
<section className="subpage-hero pricing-hero">
<div className="subpage-hero-inner">
<span className="eyebrow">PUBLIC BETA / </span>
<h1></h1>
<p>
{publicBetaOpen
? "当前面向国内个人用户免费测试,不绑定支付方式、不生成报价或订单,也不会在公测结束时自动扣款。"
: betaActive
? "免费测试政策已经预设,但公开接入仍被冻结;当前仅向管理员明确邀请的闭测账户免费开放。"
: "当前免费公测政策已经结束,但收费功能仍未开放。后续方案确定前不会自动创建订单或扣款。"}
</p>
</div>
</section>
<section className="section pricing-catalog-section">
<div className="pricing-catalog">
<article className="pricing-card beta-card featured-card">
<div className="pricing-card-top">
<StatusPill tone={publicBetaOpen ? "good" : betaActive ? "warn" : "neutral"}>{publicBetaOpen ? betaCopy.cardStatus : betaActive ? "邀请闭测" : betaCopy.cardStatus}</StatusPill>
<span>{betaCopy.cardTitle}</span>
</div>
<h2>{betaCopy.priceValue}</h2>
<p>{betaCopy.cardDescription}</p>
<ul className="plain-list">
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<Link className="button button-light" href="/dashboard">{betaCopy.cta}</Link>
</article>
<article className="pricing-card">
<div className="pricing-card-top">
<StatusPill tone="info"></StatusPill>
<span></span>
</div>
<h2></h2>
<p></p>
<ul className="plain-list">
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<button className="button button-secondary" type="button" disabled></button>
</article>
</div>
</section>
<section className="section policy-section">
<div className="policy-grid">
<div>
<span className="eyebrow">BETA RULES</span>
<h2></h2>
</div>
<dl className="rules-list">
<div><dt></dt><dd></dd></div>
<div><dt></dt><dd></dd></div>
<div><dt></dt><dd></dd></div>
<div><dt>退</dt><dd>退</dd></div>
</dl>
</div>
</section>
<section className="section comparison-section">
<div className="section-heading split-heading">
<div><span className="eyebrow">SELF-HOST OR CLOUD</span><h2></h2></div>
<p>Cloud </p>
</div>
<div className="comparison-table" role="table" aria-label="自托管与 Cloud 比较">
<div role="row" className="comparison-head"><span></span><strong></strong><strong>NekoNest Cloud</strong></div>
<div role="row"><span></span><b> / </b><b>{betaCopy.comparison}</b></div>
<div role="row"><span>VPSDNSTLS</span><b></b><b></b></div>
<div role="row"><span></span><b></b><b></b></div>
<div role="row"><span></span><b></b><b></b></div>
</div>
</section>
</PublicShell>
);
}