diff --git a/.gitignore b/.gitignore index e8f6be0..c520310 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,12 @@ -.env -.env.* -!.env.example -!.env.*.example -*.pem -*.key -node_modules/ -.next/ -__pycache__/ -.venv/ +node_modules/ +.next/ +out/ +.env +.env.* +!.env.example +!.env.*.example +*.pem +*.key +*.tsbuildinfo +__pycache__/ +.venv/ diff --git a/README.md b/README.md index a16aa9a..0e75329 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 考町科技官网暨 AI 工具平台 -当前阶段:V1.1 规划已入库,尚未开始业务代码开发。 +当前阶段:Phase 1 设计系统与官网骨架已完成,真实业务服务尚未接入。 - [产品与技术规划(含分阶段工作清单)](docs/V1_PLAN.md) - [Word 规划书](docs/考町科技官网暨AI工具平台_V1.1.docx) @@ -9,6 +9,7 @@ - [TTS 接口契约](docs/API_CONTRACT.md) - [技术决策](docs/DECISIONS.md) - [后续执行计划](docs/EXECUTION_PLAN.md) +- [Phase 1 阶段报告](docs/phase-1-report.md) 项目根目录:`E:\RD\Kaotings\www_site`,以本次新仓库为准。 diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..29a6289 --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,23 @@ +import { SectionHeading, StatusCard } from "@/components/ui"; + +export const metadata = { title: "关于我们" }; + +export default function AboutPage() { + return ( +
+ +
+ + + +
+
+

Principles

+
+

少一点噪音,多一点重点。

视觉保持深色、克制和留白,让产品和技术本身成为主角。

+

不把占位当事实。

当前缺少的公司信息、产品参数、联系方式和资质不会被编造;正式内容由后续资料和 CMS 发布流程负责。

+
+
+
+ ); +} diff --git a/app/account/page.tsx b/app/account/page.tsx new file mode 100644 index 0000000..a02d28a --- /dev/null +++ b/app/account/page.tsx @@ -0,0 +1,19 @@ +import Link from "next/link"; +import { ArrowRight } from "@/components/icons"; +import { PreviewNotice, StatusCard } from "@/components/ui"; + +export const metadata = { title: "账户中心" }; + +export default function AccountPage() { + return ( +
+

Account

账户中心

未登录状态预览
+
账户数据尚未接入。以下字段只用于检查信息层级,不代表真实用户状态。
+
+
+

Profile

基本资料

邮箱
未登录
手机号
未绑定
角色
user / 待服务返回
前往登录
+

History

TTS 历史

打开工作台

暂无可显示的历史

登录和 TTS 任务服务完成后,历史记录将在此按用户归属显示。

+
+
+ ); +} diff --git a/app/admin/page.tsx b/app/admin/page.tsx new file mode 100644 index 0000000..cc3e799 --- /dev/null +++ b/app/admin/page.tsx @@ -0,0 +1,9 @@ +import Link from "next/link"; +import { ArrowRight } from "@/components/icons"; +import { PreviewNotice, StatusCard } from "@/components/ui"; + +export const metadata = { title: "管理后台" }; + +export default function AdminPage() { + return

Operations

管理后台

role=admin / 预览
管理权限、用户查询、会员和额度操作均未接入。此阶段不提供可执行的管理操作。

01 / Users

用户与会员

布局预览:筛选、状态、Plan 和额度。

打开预览

02 / TTS

TTS 任务与使用量

布局预览:任务状态、耗时和错误。

打开预览
; +} diff --git a/app/admin/tts/page.tsx b/app/admin/tts/page.tsx new file mode 100644 index 0000000..49d28c9 --- /dev/null +++ b/app/admin/tts/page.tsx @@ -0,0 +1,7 @@ +import { PreviewNotice, StatusCard } from "@/components/ui"; + +export const metadata = { title: "TTS 任务管理" }; + +export default function AdminTtsPage() { + return

Admin / TTS

TTS 任务与使用量

用于运营查看任务状态、耗时、错误码和计量消耗,不默认展示完整输入文本。

当前没有真实任务。筛选和统计均为布局占位,不会读取或修改上游服务。
暂无可显示的任务记录。
; +} diff --git a/app/admin/users/page.tsx b/app/admin/users/page.tsx new file mode 100644 index 0000000..9f45222 --- /dev/null +++ b/app/admin/users/page.tsx @@ -0,0 +1,7 @@ +import { PreviewNotice, StatusCard } from "@/components/ui"; + +export const metadata = { title: "用户管理" }; + +export default function AdminUsersPage() { + return

Admin / Users

用户与会员

Phase 4 管理界面结构预览。当前不查询或修改真实用户。

筛选、禁用、VIP 授予和额度调整按钮保持不可用,不会产生任何操作成功提示。
暂无真实用户数据。表格将在 API 与权限模型完成后启用。
; +} diff --git a/app/contact/page.tsx b/app/contact/page.tsx new file mode 100644 index 0000000..828143d --- /dev/null +++ b/app/contact/page.tsx @@ -0,0 +1,24 @@ +import Link from "next/link"; +import { ArrowRight } from "@/components/icons"; +import { PreviewNotice, SectionHeading, StatusCard } from "@/components/ui"; + +export const metadata = { title: "联系我们" }; + +export default function ContactPage() { + return ( +
+ +
联系表单暂不提交数据,也不会显示“发送成功”。待联系方式和服务端处理方案确认后再启用。
+
+ + + +
+
+

需要查看当前项目能力?

+

可以先浏览产品结构或打开 AI Lab 的 TTS 工作台预览。

+
查看产品 查看 AI Lab
+
+
+ ); +} diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..7a4a302 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,268 @@ +@import "tailwindcss"; + +@theme { + --color-ink: #0d0f12; + --color-panel: #14181d; + --color-panel-raised: #1a1d21; + --color-line: #2a2f36; + --color-copy: #f5f7fa; + --color-muted: #9ca3af; + --color-subtle: #4b5563; + --color-orange: #ff6a00; + --color-blue: #1677ff; + --color-cyan: #00d1e6; + --color-success: #22c55e; + --color-warning: #f59e0b; + --color-danger: #ef4444; + --font-sans: var(--font-inter), "PingFang SC", "Microsoft YaHei", sans-serif; +} + +:root { + color-scheme: dark; + background: #0d0f12; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + min-width: 320px; + margin: 0; + background: #0d0f12; + color: #f5f7fa; + font-family: var(--font-inter), "PingFang SC", "Microsoft YaHei", sans-serif; +} + +a, +button, +input, +textarea, +select { + font: inherit; +} + +a { + color: inherit; + text-decoration: none; +} + +button, +a { + -webkit-tap-highlight-color: transparent; +} + +button:focus-visible, +a:focus-visible, +input:focus-visible, +textarea:focus-visible, +select:focus-visible { + outline: 2px solid #00d1e6; + outline-offset: 4px; +} + +::selection { + background: #1677ff; + color: #f5f7fa; +} + +.skip-link { + position: fixed; + z-index: 100; + top: 1rem; + left: 1rem; + transform: translateY(-200%); + border-radius: 999px; + background: #f5f7fa; + color: #0d0f12; + padding: 0.75rem 1rem; + font-size: 0.875rem; + font-weight: 700; + transition: transform 180ms ease; +} + +.skip-link:focus { + transform: translateY(0); +} + +.container-shell { + width: min(1180px, calc(100% - 2.5rem)); + margin-inline: auto; +} + +.section-rule { + border-top: 1px solid rgba(75, 85, 99, 0.42); +} + +.eyebrow { + display: inline-flex; + align-items: center; + gap: 0.75rem; + color: #9ca3af; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.22em; + text-transform: uppercase; +} + +.eyebrow::before { + width: 2.25rem; + height: 2px; + background: #ff6a00; + content: ""; +} + +.eyebrow-cyan::before { + background: #00d1e6; +} + +.eyebrow-blue::before { + background: #1677ff; +} + +.display-heading { + max-width: 10ch; + margin-top: 1.25rem; + font-size: clamp(2.8rem, 7vw, 6.5rem); + font-weight: 650; + letter-spacing: -0.07em; + line-height: 0.98; +} + +.body-copy { + color: #9ca3af; + line-height: 1.8; +} + +.surface-grid { + background-image: linear-gradient(rgba(42, 47, 54, 0.22) 1px, transparent 1px), + linear-gradient(90deg, rgba(42, 47, 54, 0.22) 1px, transparent 1px); + background-size: 64px 64px; + mask-image: linear-gradient(to bottom, black 0%, transparent 80%); +} + +.hero-glow { + background: radial-gradient(circle at 74% 38%, rgba(22, 119, 255, 0.14), transparent 26rem), + radial-gradient(circle at 68% 65%, rgba(0, 209, 230, 0.08), transparent 22rem); +} + +.button-primary, +.button-secondary, +.button-ghost { + display: inline-flex; + min-height: 2.75rem; + align-items: center; + justify-content: center; + gap: 0.7rem; + border-radius: 0.65rem; + padding: 0.75rem 1rem; + font-size: 0.875rem; + font-weight: 700; + transition: transform 180ms ease, background-color 180ms ease, border-color 180ms ease; +} + +.button-primary { + background: #ff6a00; + color: #0d0f12; +} + +.button-primary:hover { + background: #ff812b; + transform: translateY(-2px); +} + +.button-secondary { + border: 1px solid #1677ff; + background: rgba(22, 119, 255, 0.08); + color: #dbeafe; +} + +.button-secondary:hover { + background: rgba(22, 119, 255, 0.18); + transform: translateY(-2px); +} + +.button-ghost { + border: 1px solid #2a2f36; + color: #d1d5db; +} + +.button-ghost:hover { + border-color: #00d1e6; + color: #f5f7fa; +} + +.button-disabled, +button:disabled { + cursor: not-allowed; + opacity: 0.52; +} + +.product-visual { + position: relative; + min-height: 15rem; + overflow: hidden; + border: 1px solid rgba(75, 85, 99, 0.5); + border-radius: 1rem; + background: linear-gradient(135deg, #1a1d21, #101317 68%); +} + +.product-visual::after { + position: absolute; + right: -15%; + bottom: -52%; + width: 80%; + height: 95%; + border: 1px solid rgba(0, 209, 230, 0.36); + border-radius: 50%; + box-shadow: 0 0 80px rgba(0, 209, 230, 0.13); + content: ""; + transform: rotate(-18deg); +} + +.field-label { + display: block; + margin-bottom: 0.5rem; + color: #d1d5db; + font-size: 0.8125rem; + font-weight: 600; +} + +.field-input { + width: 100%; + border: 1px solid #2a2f36; + border-radius: 0.65rem; + background: #14181d; + color: #f5f7fa; + padding: 0.8rem 0.9rem; +} + +.field-input:disabled { + cursor: not-allowed; + color: #6b7280; +} + +@media (max-width: 640px) { + .container-shell { + width: min(100% - 2rem, 1180px); + } + + .display-heading { + max-width: 8ch; + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..d80e2ce --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,40 @@ +import type { Metadata, Viewport } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; +import { SiteFooter } from "@/components/site-footer"; +import { SiteHeader } from "@/components/site-header"; + +const inter = Inter({ + variable: "--font-inter", + subsets: ["latin"], + display: "swap", +}); + +export const metadata: Metadata = { + title: { + default: "考町科技 | 连接技术与日常", + template: "%s | 考町科技", + }, + description: "考町科技专注于蓝牙周边、音频与智能设备,也在 AI Lab 探索可落地的语音能力。", +}; + +export const viewport: Viewport = { + themeColor: "#0D0F12", + width: "device-width", + initialScale: 1, +}; + +export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { + return ( + + + + 跳转到主要内容 + + +
{children}
+ + + + ); +} diff --git a/app/login/page.tsx b/app/login/page.tsx new file mode 100644 index 0000000..29246ba --- /dev/null +++ b/app/login/page.tsx @@ -0,0 +1,8 @@ +import Link from "next/link"; +import { AuthForm } from "@/components/auth-form"; + +export const metadata = { title: "登录" }; + +export default function LoginPage() { + return

Account

欢迎回来。

进入账户中心,管理你的 AI Lab 使用记录。

返回首页
; +} diff --git a/app/not-found.tsx b/app/not-found.tsx new file mode 100644 index 0000000..b737c78 --- /dev/null +++ b/app/not-found.tsx @@ -0,0 +1,5 @@ +import Link from "next/link"; + +export default function NotFound() { + return

404 / Not found

这条路径还没有内容。

页面不存在,或内容仍在准备中。返回首页继续浏览。

返回首页
; +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..e2726de --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,102 @@ +import Link from "next/link"; +import { ArrowRight, BluetoothIcon, ChipIcon, SparkIcon, WaveIcon } from "@/components/icons"; +import { ArrowLink, DevPlaceholder, ProductVisual, SectionHeading } from "@/components/ui"; +import { products } from "@/lib/content"; + +const capabilities = [ + { icon: BluetoothIcon, title: "Bluetooth", copy: "稳定连接" }, + { icon: WaveIcon, title: "Audio", copy: "更好的声音体验" }, + { icon: ChipIcon, title: "Embedded", copy: "可靠的硬件与固件" }, + { icon: SparkIcon, title: "AI", copy: "让设备更智能" }, +]; + +export default function HomePage() { + return ( + <> +
+
+
+
+

Connecting technology with everyday life

+

连接技术与日常。

+

我们专注于蓝牙周边、音频与智能设备,持续把可靠的技术变成简单、可用的产品。

+
+ 了解产品 + 探索技术 +
+
+
+
+ +
+

Product first

+

真实产品资料待补充

+
+
+
+
+ +
+
+
+ + 查看全部产品 +
+
+ {products.map((product) => ( + + +
+ {product.shortLabel} +

{product.category}

+

{product.name}

+

{product.summary}

+ 查看模板 +
+ + ))} +
+
+
+ +
+
+ +
+ {capabilities.map(({ icon: Icon, title, copy }, index) => ( +
+ +

{title}

{copy}

+
+ ))} +
+
+
+ +
+
+
+

AI Lab

+

让设备更懂声音。

+

从文本转语音开始,探索语音能力在真实产品中的应用。完整工具位于独立工作台,不抢占首页的产品叙事。

+ 体验 TTS +
+
+
+ + Voice / exploration +
+
+
+ +
+
+

About Kaotings

把技术做成日常可用的体验。

+ 了解我们 +
+
+ + ); +} diff --git a/app/products/[slug]/page.tsx b/app/products/[slug]/page.tsx new file mode 100644 index 0000000..41d8c20 --- /dev/null +++ b/app/products/[slug]/page.tsx @@ -0,0 +1,45 @@ +import { notFound } from "next/navigation"; +import { ArrowRight } from "@/components/icons"; +import { DevPlaceholder, FeatureList, PreviewNotice, ProductVisual } from "@/components/ui"; +import { products } from "@/lib/content"; + +export function generateStaticParams() { + return products.map((product) => ({ slug: product.slug })); +} + +export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const product = products.find((item) => item.slug === slug); + return { title: product?.name ?? "产品详情" }; +} + +export default async function ProductDetailPage({ params }: { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const product = products.find((item) => item.slug === slug); + if (!product) notFound(); + + return ( +
+ 产品详情模板已完成;当前页面不代表真实产品发布状态。 +
+
+ {product.shortLabel} +

{product.category}

+

{product.name}

+

{product.summary}

+ +
+ +
+
+

Product template

内容结构已就位,事实资料待填。

+
+

产品介绍

正式介绍文案待产品资料确认后录入。

+

核心优势

+

规格

不展示未经核实的型号、参数或认证信息。

+

媒体与 FAQ

媒体素材和问答内容将在 CMS 阶段接入。

+
+
+
+ ); +} diff --git a/app/products/page.tsx b/app/products/page.tsx new file mode 100644 index 0000000..66c679a --- /dev/null +++ b/app/products/page.tsx @@ -0,0 +1,32 @@ +import { SectionHeading, DevPlaceholder, ProductVisual, ArrowLink } from "@/components/ui"; +import { products } from "@/lib/content"; + +export const metadata = { title: "产品中心" }; + +export default function ProductsPage() { + return ( +
+ +
+ 全部 + 无线音频 + 蓝牙配件 + 分类筛选将在 CMS 接入后启用 +
+
+ {products.map((product) => ( +
+ +
+ {product.shortLabel} +

{product.category}

+

{product.name}

+

{product.summary}

+
查看产品模板
+
+
+ ))} +
+
+ ); +} diff --git a/app/register/page.tsx b/app/register/page.tsx new file mode 100644 index 0000000..5bf501d --- /dev/null +++ b/app/register/page.tsx @@ -0,0 +1,8 @@ +import Link from "next/link"; +import { AuthForm } from "@/components/auth-form"; + +export const metadata = { title: "注册" }; + +export default function RegisterPage() { + return

Create account

建立你的账户。

注册和验证流程将在 Phase 2 接入。

返回首页
; +} diff --git a/app/tts/page.tsx b/app/tts/page.tsx new file mode 100644 index 0000000..ab61b41 --- /dev/null +++ b/app/tts/page.tsx @@ -0,0 +1,32 @@ +import Link from "next/link"; +import { ArrowRight, WaveIcon } from "@/components/icons"; +import { DevPlaceholder, PreviewNotice, SectionHeading, StatusCard } from "@/components/ui"; + +export const metadata = { title: "TTS 工作台" }; + +export default function TtsPage() { + return ( +
+
+ + Phase 1 界面预览 +
+
当前不连接真实 TTS 服务,不保存文本,不显示虚假的生成成功状态。
+
+
+

01 / Input

输入文本

0 / 待定字数
+