AirShelf/app/page.tsx
iye 086d92991e
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 7s
统一 Airshelf 界面组件与图标
2026-05-27 12:29:41 +08:00

182 lines
6.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Link from "next/link";
import Topbar from "@/components/Topbar";
import Icon from "@/components/Icon";
interface Recent {
name: string;
meta: string;
prog: ("done" | "cur" | "fail" | "")[];
pill: { kind: "info" | "ok" | "err"; label: string };
action: { label: string; href: string };
}
const RECENT: Recent[] = [
{
name: "补水面膜 · 痛点种草",
meta: "补水面膜 / AI 全生 / 6 镜",
prog: ["done", "done", "cur", "", ""],
pill: { kind: "info", label: "故事板 待确认" },
action: { label: "继续", href: "/pipeline?stage=3" },
},
{
name: "蓝牙耳机 · 开箱测评",
meta: "南卡 Lite Pro / 自带脚本 / 5 镜",
prog: ["done", "done", "done", "done", "done"],
pill: { kind: "ok", label: "已完成" },
action: { label: "打开", href: "/pipeline?stage=5" },
},
{
name: "速食牛肉面 · 一句话主题",
meta: "滋啦速食 / 一句话 / 4 镜",
prog: ["done", "cur", "", "", ""],
pill: { kind: "info", label: "资产生成中" },
action: { label: "继续", href: "/pipeline?stage=2" },
},
{
name: "防晒霜 · 对比展示",
meta: "透真防晒 / AI 全生 / 6 镜",
prog: ["done", "done", "done", "cur", ""],
pill: { kind: "info", label: "视频生成 4/6" },
action: { label: "继续", href: "/pipeline?stage=4" },
},
{
name: "咖啡冻干粉 · 剧情带货",
meta: "三顿半同款 / 一句话 / 5 镜",
prog: ["done", "done", "fail", "", ""],
pill: { kind: "err", label: "故事板失败" },
action: { label: "查看", href: "/pipeline?stage=3" },
},
];
export default function WorkspacePage() {
return (
<>
<Topbar />
<section className="content">
<div className="welcome page-head">
<div>
<h1></h1>
<div className="sub">
<span className="mono-sub">// 05.13 · 周三</span>
<span>·</span>
<b style={{ color: "var(--ink)" }}>3 </b>
</div>
</div>
<div className="actions">
<Link className="btn btn-create" href="/products">
<Icon name="product-plus" size={16} />
</Link>
<Link className="btn btn-primary btn-create" href="/projects/new">
<Icon name="clapperboard" size={16} />
</Link>
</div>
</div>
<div className="stats has-corners" style={{ marginBottom: 36 }}>
<span className="corner-tr" aria-hidden />
<span className="corner-bl" aria-hidden />
<div className="stat">
<div className="lbl"> <span className="badge">ALL</span></div>
<div className="v">12</div>
<div className="delta up"> +3</div>
</div>
<div className="stat">
<div className="lbl"> <span className="badge">WIP</span></div>
<div className="v">3</div>
<div className="delta">2 </div>
</div>
<div className="stat">
<div className="lbl"> <span className="badge">DONE</span></div>
<div className="v">8</div>
<div className="delta up"> +33%</div>
</div>
<div className="stat">
<div className="lbl"> <span className="badge">¥</span></div>
<div className="v">¥327<small>.40</small></div>
<div className="usage-bar"><span /></div>
<div className="sub-mono"> ¥162.60 / ¥500</div>
</div>
</div>
<div className="grid2">
<div>
<div className="section-h">
<h2></h2>
<Link className="more" href="/projects">[ ALL · 12 ] </Link>
</div>
<div className="list-card">
{RECENT.map((r) => (
<div className="recent-row" key={r.name}>
<div className="thumb">9:16</div>
<div className="r-meta">
<div className="name">{r.name}</div>
<div className="sub">{r.meta}</div>
</div>
<div className="prog">
{r.prog.map((p, i) => <span key={i} className={p || undefined} />)}
</div>
<span className={`pill pill-${r.pill.kind}`}><span className="dot" />{r.pill.label}</span>
<Link className="btn btn-sm" href={r.action.href}>{r.action.label}</Link>
</div>
))}
</div>
</div>
<div style={{ display: "flex", flexDirection: "column", gap: 24 }}>
<div>
<div className="section-h">
<h2></h2>
<span className="more">[ /shortcuts ]</span>
</div>
<div className="shortcuts">
<Link className="shortcut" href="/products">
<div className="ic"><Icon name="package" /></div>
<div>
<div className="t"></div>
<div className="d">12 SKU</div>
</div>
</Link>
<Link className="shortcut" href="/library">
<div className="ic"><Icon name="images" /></div>
<div>
<div className="t"></div>
<div className="d"> 8 · 14 · 8</div>
</div>
</Link>
<Link className="shortcut" href="/account">
<div className="ic"><Icon name="credit-card" /></div>
<div>
<div className="t"></div>
<div className="d">¥327.40</div>
</div>
</Link>
<Link className="shortcut" href="/projects">
<div className="ic"><Icon name="clapperboard" /></div>
<div>
<div className="t"></div>
<div className="d">12 </div>
</div>
</Link>
</div>
</div>
<div>
<div className="section-h">
<h2></h2>
<span className="more">[ FAQ ]</span>
</div>
<div className="tip">
<strong></strong>
{" "}
<span className="mono-pill">[ ]</span> token
</div>
</div>
</div>
</div>
</section>
</>
);
}