69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
import { ArrowUpRightIcon, Clock3Icon } from "lucide-react"
|
||
|
||
import { Button } from "@/components/ui/button"
|
||
import {
|
||
Card,
|
||
CardContent,
|
||
CardDescription,
|
||
CardHeader,
|
||
CardTitle,
|
||
} from "@/components/ui/card"
|
||
|
||
type DashboardPlaceholderProps = {
|
||
eyebrow: string
|
||
title: string
|
||
description: string
|
||
nextSteps: string[]
|
||
}
|
||
|
||
export function DashboardPlaceholder({
|
||
eyebrow,
|
||
title,
|
||
description,
|
||
nextSteps,
|
||
}: DashboardPlaceholderProps) {
|
||
return (
|
||
<div className="flex flex-1 flex-col gap-6 p-4 pt-4 lg:p-6 lg:pt-6">
|
||
<Card className="border-dashed">
|
||
<CardHeader className="gap-3">
|
||
<span className="text-xs font-medium tracking-[0.24em] uppercase text-muted-foreground">
|
||
{eyebrow}
|
||
</span>
|
||
<CardTitle className="text-3xl">{title}</CardTitle>
|
||
<CardDescription className="max-w-2xl text-sm leading-6">
|
||
{description}
|
||
</CardDescription>
|
||
</CardHeader>
|
||
<CardContent className="grid gap-4 md:grid-cols-[1.2fr_0.8fr]">
|
||
<div className="rounded-2xl border bg-muted/40 p-5">
|
||
<p className="text-sm font-medium">建议下一步</p>
|
||
<div className="mt-4 grid gap-3">
|
||
{nextSteps.map((item) => (
|
||
<div
|
||
key={item}
|
||
className="flex items-start gap-3 rounded-xl bg-background p-3"
|
||
>
|
||
<Clock3Icon className="mt-0.5 size-4 text-muted-foreground" />
|
||
<p className="text-sm">{item}</p>
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
<div className="flex flex-col justify-between rounded-2xl border bg-background p-5">
|
||
<div>
|
||
<p className="text-sm font-medium">状态</p>
|
||
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
||
当前模块已完成页面骨架,可直接接入真实 API、表单弹窗与列表查询。
|
||
</p>
|
||
</div>
|
||
<Button variant="outline" className="mt-6 justify-between">
|
||
进入下一阶段开发
|
||
<ArrowUpRightIcon />
|
||
</Button>
|
||
</div>
|
||
</CardContent>
|
||
</Card>
|
||
</div>
|
||
)
|
||
}
|