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
+67
View File
@@ -0,0 +1,67 @@
"use client";
import Link from "next/link";
export function RouteLoadingState({
area,
description,
}: {
area: string;
description: string;
}) {
return (
<main className="route-state-shell" aria-busy="true" aria-live="polite">
<section className="route-state-card route-loading-card">
<span className="route-state-kicker">{area}</span>
<h1></h1>
<p>{description}</p>
<div className="route-loading-lines" aria-hidden="true">
<span />
<span />
<span />
</div>
</section>
</main>
);
}
export function RouteErrorState({
area,
title,
description,
reset,
dashboard = false,
}: {
area: string;
title: string;
description: string;
reset: () => void;
dashboard?: boolean;
}) {
return (
<main className="route-state-shell">
<section className="route-state-card route-error-card" role="alert">
<span className="route-state-kicker">{area}</span>
<h1>{title}</h1>
<p>{description}</p>
<p className="route-state-note">
线
</p>
<div className="route-state-actions">
<button className="button button-primary" type="button" onClick={reset}>
</button>
<Link className="button button-secondary" href="/status">
</Link>
<Link
className="route-state-link"
href={dashboard ? "/dashboard/feedback" : "/"}
>
{dashboard ? "仍有问题,提交反馈" : "返回首页"}
</Link>
</div>
</section>
</main>
);
}