init:初始化项目

This commit is contained in:
2026-04-07 15:21:27 +08:00
commit 1b494b6029
366 changed files with 11461 additions and 0 deletions
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+116
View File
@@ -0,0 +1,116 @@
import Link from "next/link";
import { getDictionary, type Locale } from "@/lib/site-content";
export default async function ConsolePage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const dictionary = getDictionary(locale as Locale);
return (
<div className="page-stack">
<section className="section-panel">
<div className="dashboard-top">
<div>
<div className="eyebrow">{dictionary.console.tag}</div>
<h1>{dictionary.console.title}</h1>
<p>{dictionary.console.subtitle}</p>
</div>
<div className="dashboard-actions">
<Link className="button button-light" href={`/${locale}/pricing`}>
{dictionary.console.billingCta}
</Link>
<Link className="button button-dark" href={`/${locale}/login`}>
{dictionary.console.loginCta}
</Link>
</div>
</div>
<div className="stats-grid">
{dictionary.console.metrics.map((metric) => (
<article className="stat-card" key={metric.label}>
<strong>{metric.value}</strong>
<span>{metric.label}</span>
</article>
))}
</div>
</section>
<section className="dashboard-grid">
<article className="dashboard-card">
<div className="section-heading compact">
<div className="eyebrow">{dictionary.console.skillsTag}</div>
<h2>{dictionary.console.skillsTitle}</h2>
</div>
<div className="table-list">
{dictionary.console.officialSkills.map((skill) => (
<div className="table-row" key={skill.name}>
<div>
<strong>{skill.name}</strong>
<span>{skill.routeKey}</span>
</div>
<p>{skill.status}</p>
</div>
))}
</div>
</article>
<article className="dashboard-card">
<div className="section-heading compact">
<div className="eyebrow">{dictionary.console.keysTag}</div>
<h2>{dictionary.console.keysTitle}</h2>
</div>
<div className="table-list">
{dictionary.console.apiKeys.map((key) => (
<div className="table-row" key={key.name}>
<div>
<strong>{key.name}</strong>
<span>{key.masked}</span>
</div>
<p>{key.scope}</p>
</div>
))}
</div>
</article>
</section>
<section className="dashboard-grid">
<article className="dashboard-card">
<div className="section-heading compact">
<div className="eyebrow">{dictionary.console.usageTag}</div>
<h2>{dictionary.console.usageTitle}</h2>
</div>
<div className="table-list">
{dictionary.console.usageRows.map((row) => (
<div className="table-row" key={row.name}>
<div>
<strong>{row.name}</strong>
<span>{row.count}</span>
</div>
<p>{row.cost}</p>
</div>
))}
</div>
</article>
<article className="dashboard-card billing-card">
<div className="section-heading compact">
<div className="eyebrow">{dictionary.console.planTag}</div>
<h2>{dictionary.console.planTitle}</h2>
</div>
<p className="billing-copy">{dictionary.console.planDescription}</p>
<ul className="bullet-list">
{dictionary.console.planBenefits.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
<Link className="button button-dark" href={`/${locale}/pricing`}>
{dictionary.console.planCta}
</Link>
</article>
</section>
</div>
);
}
Binary file not shown.
+72
View File
@@ -0,0 +1,72 @@
import { getDictionary, type Locale } from "@/lib/site-content";
export default async function DocsPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const dictionary = getDictionary(locale as Locale);
return (
<div className="page-stack">
<section className="section-panel hero-tight">
<div className="section-heading">
<div className="eyebrow">{dictionary.docs.tag}</div>
<h1>{dictionary.docs.title}</h1>
<p>{dictionary.docs.intro}</p>
</div>
</section>
<section className="docs-layout">
<article className="docs-card">
<h2>{dictionary.docs.quickStartTitle}</h2>
<ol className="number-list">
{dictionary.docs.quickSteps.map((step) => (
<li key={step.title}>
<strong>{step.title}</strong>
<p>{step.description}</p>
<pre>
<code>{step.code}</code>
</pre>
</li>
))}
</ol>
</article>
<article className="docs-card">
<h2>{dictionary.docs.envTitle}</h2>
<div className="docs-table">
{dictionary.docs.envVars.map((item) => (
<div className="docs-row" key={item.name}>
<div>
<strong>{item.name}</strong>
<span>{item.required}</span>
</div>
<p>{item.description}</p>
</div>
))}
</div>
</article>
</section>
<section className="section-panel">
<div className="section-heading">
<div className="eyebrow">{dictionary.docs.skillsTag}</div>
<h2>{dictionary.docs.skillsTitle}</h2>
</div>
<div className="card-grid">
{dictionary.docs.skills.map((skill) => (
<article className="feature-card" key={skill.name}>
<h3>{skill.name}</h3>
<pre>
<code>{skill.command}</code>
</pre>
<p>{skill.description}</p>
</article>
))}
</div>
</section>
</div>
);
}
+25
View File
@@ -0,0 +1,25 @@
import { notFound } from "next/navigation";
import { SiteChrome } from "@/components/site-chrome";
import { getDictionary, isLocale, type Locale } from "@/lib/site-content";
export default async function LocaleLayout({
children,
params,
}: Readonly<{
children: React.ReactNode;
params: Promise<{ locale: string }>;
}>) {
const { locale } = await params;
if (!isLocale(locale)) {
notFound();
}
const dictionary = getDictionary(locale as Locale);
return (
<SiteChrome dictionary={dictionary} locale={locale}>
{children}
</SiteChrome>
);
}
Binary file not shown.
+47
View File
@@ -0,0 +1,47 @@
import Link from "next/link";
import { getDictionary, type Locale } from "@/lib/site-content";
export default async function LoginPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const dictionary = getDictionary(locale as Locale);
return (
<div className="page-stack">
<section className="login-shell">
<div className="login-panel">
<div className="eyebrow">{dictionary.login.tag}</div>
<h1>{dictionary.login.title}</h1>
<p>{dictionary.login.subtitle}</p>
<div className="login-actions">
<button className="button button-dark" type="button">
{dictionary.login.primaryProvider}
</button>
<button className="button button-light" type="button">
{dictionary.login.secondaryProvider}
</button>
</div>
<p className="legal-copy">
{dictionary.login.termsPrefix}{" "}
<Link href={`/${locale}/pricing`}>{dictionary.login.termsLink}</Link>{" "}
{dictionary.login.and}{" "}
<Link href={`/${locale}/docs`}>{dictionary.login.privacyLink}</Link>
</p>
</div>
<div className="login-benefits">
{dictionary.login.benefits.map((benefit) => (
<article className="benefit-card" key={benefit.title}>
<span className="card-kicker">{benefit.kicker}</span>
<h2>{benefit.title}</h2>
<p>{benefit.description}</p>
</article>
))}
</div>
</section>
</div>
);
}
+98
View File
@@ -0,0 +1,98 @@
import Link from "next/link";
import { getDictionary, type Locale } from "@/lib/site-content";
export default async function HomePage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const dictionary = getDictionary(locale as Locale);
return (
<div className="page-stack">
<section className="hero-panel">
<div className="hero-copy">
<div className="eyebrow">{dictionary.home.tag}</div>
<h1>{dictionary.home.title}</h1>
<p className="hero-description">{dictionary.home.subtitle}</p>
<div className="hero-actions">
<Link className="button button-dark" href={`/${locale}/login`}>
{dictionary.home.primaryCta}
</Link>
<Link className="button button-light" href={`/${locale}/docs`}>
{dictionary.home.secondaryCta}
</Link>
</div>
<div className="hero-proof">
<span>{dictionary.home.freeTrial}</span>
<span>{dictionary.home.socialProof}</span>
</div>
</div>
<div className="hero-stage">
<div className="stage-card stage-card-primary">
<div className="stage-label">{dictionary.home.stageLabel}</div>
<div className="stage-stat">{dictionary.home.stageValue}</div>
<p>{dictionary.home.stageDescription}</p>
</div>
<div className="stage-card">
<div className="stage-mini-grid">
{dictionary.home.heroPhrases.map((phrase) => (
<span key={phrase}>{phrase}</span>
))}
</div>
</div>
</div>
</section>
<section className="section-panel">
<div className="section-heading">
<div className="eyebrow">{dictionary.home.scenesTag}</div>
<h2>{dictionary.home.scenesTitle}</h2>
<p>{dictionary.home.scenesSubtitle}</p>
</div>
<div className="card-grid card-grid-three">
{dictionary.home.scenes.map((scene) => (
<article className="feature-card" key={scene.name}>
<span className="card-kicker">{scene.category}</span>
<h3>{scene.name}</h3>
<p>{scene.description}</p>
</article>
))}
</div>
</section>
<section className="section-panel section-panel-accent">
<div className="section-heading">
<div className="eyebrow">{dictionary.home.flowTag}</div>
<h2>{dictionary.home.flowTitle}</h2>
<p>{dictionary.home.flowSubtitle}</p>
</div>
<div className="steps-grid">
{dictionary.home.flowSteps.map((step, index) => (
<article className="step-card" key={step.title}>
<div className="step-number">0{index + 1}</div>
<h3>{step.title}</h3>
<p>{step.description}</p>
</article>
))}
</div>
</section>
<section className="section-panel">
<div className="section-heading">
<div className="eyebrow">{dictionary.home.trustTag}</div>
<h2>{dictionary.home.trustTitle}</h2>
</div>
<div className="stats-grid">
{dictionary.home.trustStats.map((stat) => (
<article className="stat-card" key={stat.label}>
<strong>{stat.value}</strong>
<span>{stat.label}</span>
</article>
))}
</div>
</section>
</div>
);
}
Binary file not shown.
+67
View File
@@ -0,0 +1,67 @@
import Link from "next/link";
import { getDictionary, type Locale } from "@/lib/site-content";
export default async function PricingPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const dictionary = getDictionary(locale as Locale);
return (
<div className="page-stack">
<section className="section-panel hero-tight">
<div className="section-heading">
<div className="eyebrow">{dictionary.pricing.tag}</div>
<h1>{dictionary.pricing.title}</h1>
<p>{dictionary.pricing.subtitle}</p>
</div>
</section>
<section className="pricing-grid">
{dictionary.pricing.plans.map((plan) => (
<article
className={`pricing-card ${plan.highlight ? "pricing-card-highlight" : ""}`}
key={plan.name}
>
<div className="pricing-top">
<div>
<span className="card-kicker">{plan.badge}</span>
<h2>{plan.name}</h2>
</div>
<div className="price-line">
<strong>{plan.price}</strong>
<span>{plan.cadence}</span>
</div>
</div>
<p className="pricing-summary">{plan.summary}</p>
<ul className="bullet-list">
{plan.features.map((feature) => (
<li key={feature}>{feature}</li>
))}
</ul>
<Link className="button button-dark" href={`/${locale}/login`}>
{plan.cta}
</Link>
</article>
))}
</section>
<section className="section-panel">
<div className="section-heading">
<div className="eyebrow">{dictionary.pricing.faqTag}</div>
<h2>{dictionary.pricing.faqTitle}</h2>
</div>
<div className="faq-grid">
{dictionary.pricing.faqs.map((faq) => (
<article className="faq-card" key={faq.question}>
<h3>{faq.question}</h3>
<p>{faq.answer}</p>
</article>
))}
</div>
</section>
</div>
);
}