Files
cunkebao_v3/Cunkebao/app/components-docs/page.tsx
笔记本里的永平 5ff15472f5 feat: 本次提交更新内容如下
场景获客列表搞定
2025-07-07 17:08:27 +08:00

376 lines
14 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.

"use client"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Badge } from "@/components/ui/badge"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Separator } from "@/components/ui/separator"
/**
* 组件文档页面
* 提供详细的组件使用文档和API说明
*/
export default function ComponentsDocs() {
return (
<div className="container mx-auto py-8 space-y-8">
<div className="space-y-4">
<h1 className="text-3xl font-bold"></h1>
<p className="text-gray-600">使API文档和最佳实践</p>
</div>
<Tabs defaultValue="getting-started" className="space-y-6">
<TabsList className="grid w-full grid-cols-5">
<TabsTrigger value="getting-started"></TabsTrigger>
<TabsTrigger value="basic-components"></TabsTrigger>
<TabsTrigger value="custom-components"></TabsTrigger>
<TabsTrigger value="best-practices"></TabsTrigger>
<TabsTrigger value="changelog"></TabsTrigger>
</TabsList>
{/* 快速开始 */}
<TabsContent value="getting-started" className="space-y-6">
<Card>
<CardHeader>
<CardTitle></CardTitle>
<CardDescription>使</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<div className="bg-gray-900 text-gray-100 p-4 rounded-lg">
<pre>{`// 导入基础UI组件
import { Button, Card, Input } from "@/components/ui"
// 导入自定义组件
import { PageHeader, StatCard } from "@/app/components/common"
// 使用组件
function MyComponent() {
return (
<Card>
<PageHeader title="标题" description="描述" />
<Button>点击我</Button>
</Card>
)
}`}</pre>
</div>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<div className="bg-gray-50 p-4 rounded-lg">
<pre>{`app/
├── components/
│ ├── ui/ # 基础UI组件
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ └── ...
│ └── common/ # 自定义业务组件
│ ├── PageHeader.tsx
│ ├── StatCard.tsx
│ └── ...
├── lib/
│ └── utils.ts # 工具函数
└── types/ # 类型定义`}</pre>
</div>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<p className="text-gray-600 mb-3">使 Tailwind CSS </p>
<div className="bg-gray-900 text-gray-100 p-4 rounded-lg">
<pre>{`// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
primary: {
50: '#eff6ff',
500: '#3b82f6',
900: '#1e3a8a',
}
}
}
}
}`}</pre>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 基础组件文档 */}
<TabsContent value="basic-components" className="space-y-6">
<ComponentDoc
name="Button"
description="按钮组件,支持多种样式和状态"
props={[
{
name: "variant",
type: "'default' | 'secondary' | 'outline' | 'ghost' | 'destructive'",
default: "'default'",
description: "按钮样式变体",
},
{ name: "size", type: "'sm' | 'default' | 'lg'", default: "'default'", description: "按钮大小" },
{ name: "disabled", type: "boolean", default: "false", description: "是否禁用" },
{ name: "onClick", type: "() => void", default: "-", description: "点击事件处理函数" },
]}
example={`<Button variant="primary" size="lg" onClick={() => alert('clicked')}>
点击我
</Button>`}
/>
<ComponentDoc
name="Card"
description="卡片容器组件,用于包装内容"
props={[
{ name: "className", type: "string", default: "-", description: "自定义CSS类名" },
{ name: "children", type: "ReactNode", default: "-", description: "卡片内容" },
]}
example={`<Card>
<CardHeader>
<CardTitle>标题</CardTitle>
<CardDescription>描述</CardDescription>
</CardHeader>
<CardContent>
内容区域
</CardContent>
</Card>`}
/>
<ComponentDoc
name="Input"
description="输入框组件,支持多种类型"
props={[
{
name: "type",
type: "'text' | 'email' | 'password' | 'number'",
default: "'text'",
description: "输入类型",
},
{ name: "placeholder", type: "string", default: "-", description: "占位符文本" },
{ name: "disabled", type: "boolean", default: "false", description: "是否禁用" },
{ name: "value", type: "string", default: "-", description: "输入值" },
{ name: "onChange", type: "(e: ChangeEvent) => void", default: "-", description: "值变化回调" },
]}
example={`<Input
type="email"
placeholder="请输入邮箱"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>`}
/>
</TabsContent>
{/* 自定义组件文档 */}
<TabsContent value="custom-components" className="space-y-6">
<ComponentDoc
name="PageHeader"
description="页面头部组件,提供统一的页面标题和描述布局"
props={[
{ name: "title", type: "string", default: "-", description: "页面标题" },
{ name: "description", type: "string", default: "-", description: "页面描述" },
{ name: "actions", type: "ReactNode", default: "-", description: "操作按钮区域" },
{ name: "breadcrumb", type: "ReactNode", default: "-", description: "面包屑导航" },
]}
example={`<PageHeader
title="设备管理"
description="管理所有连接的设备"
actions={<Button>添加设备</Button>}
/>`}
/>
<ComponentDoc
name="StatCard"
description="统计卡片组件,用于展示关键指标"
props={[
{ name: "title", type: "string", default: "-", description: "统计标题" },
{ name: "value", type: "string | number", default: "-", description: "统计值" },
{ name: "icon", type: "ReactNode", default: "-", description: "图标" },
{ name: "trend", type: "{ value: number; isPositive: boolean }", default: "-", description: "趋势信息" },
{ name: "description", type: "string", default: "-", description: "描述信息" },
]}
example={`<StatCard
title="总设备数"
value="1,234"
icon={<Smartphone className="h-6 w-6" />}
trend={{ value: 12, isPositive: true }}
/>`}
/>
</TabsContent>
{/* 最佳实践 */}
<TabsContent value="best-practices" className="space-y-6">
<Card>
<CardHeader>
<CardTitle></CardTitle>
<CardDescription>使</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div>
<h3 className="text-lg font-semibold mb-3">使</h3>
<ul className="space-y-2 text-gray-600">
<li> 使</li>
<li> </li>
<li> 使TypeScript确保类型安全</li>
<li> </li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<ul className="space-y-2 text-gray-600">
<li> 使React.memo优化组件渲染</li>
<li> 使useCallback和useMemo</li>
<li> render中创建新对象</li>
<li> 使</li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3">访</h3>
<ul className="space-y-2 text-gray-600">
<li> ARIA标签</li>
<li> </li>
<li> </li>
<li> alt属性</li>
<li> 使HTML标签</li>
</ul>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 更新日志 */}
<TabsContent value="changelog" className="space-y-6">
<Card>
<CardHeader>
<CardTitle></CardTitle>
<CardDescription></CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-6">
<div>
<div className="flex items-center gap-2 mb-2">
<Badge>v1.2.0</Badge>
<span className="text-sm text-gray-500">2024-01-15</span>
</div>
<h4 className="font-medium mb-2"></h4>
<ul className="text-sm text-gray-600 space-y-1">
<li> FileUploader </li>
<li> Wizard </li>
<li> NotificationSystem </li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<div className="flex items-center gap-2 mb-2">
<Badge variant="secondary">v1.1.0</Badge>
<span className="text-sm text-gray-500">2024-01-10</span>
</div>
<h4 className="font-medium mb-2"></h4>
<ul className="text-sm text-gray-600 space-y-1">
<li> DeviceSelector </li>
<li> DataTable </li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<div className="flex items-center gap-2 mb-2">
<Badge variant="outline">v1.0.0</Badge>
<span className="text-sm text-gray-500">2024-01-01</span>
</div>
<h4 className="font-medium mb-2"></h4>
<ul className="text-sm text-gray-600 space-y-1">
<li> UI组件库</li>
<li> </li>
<li> </li>
</ul>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
</Tabs>
</div>
)
}
// 组件文档展示组件
function ComponentDoc({
name,
description,
props,
example,
}: {
name: string
description: string
props: Array<{
name: string
type: string
default: string
description: string
}>
example: string
}) {
return (
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2">
{name}
<Badge variant="outline"></Badge>
</CardTitle>
<CardDescription>{description}</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div>
<h4 className="font-medium mb-3"> (Props)</h4>
<Table>
<TableHeader>
<TableRow>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{props.map((prop) => (
<TableRow key={prop.name}>
<TableCell className="font-mono text-sm">{prop.name}</TableCell>
<TableCell className="font-mono text-sm text-blue-600">{prop.type}</TableCell>
<TableCell className="font-mono text-sm">{prop.default}</TableCell>
<TableCell>{prop.description}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</div>
<div>
<h4 className="font-medium mb-3">使</h4>
<div className="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto">
<pre className="text-sm">{example}</pre>
</div>
</div>
</CardContent>
</Card>
)
}