'use client'
/**
* 最近项目布局组件集
* 5 种不同的排版方式,使用系统实际的卡片设计风格
*/
import { AppIcon, IconGradientDefs } from '@/components/ui/icons'
import type { MockProject } from './shared'
import { formatTimeAgo } from './shared'
/** 通用的项目统计行 — 模仿系统真实卡片中的渐变统计 */
function ProjectStats({ project, t }: { project: MockProject; t: (key: string) => string }) {
return (
{project.stats.episodes > 0 && (
{project.stats.episodes}
)}
{project.stats.images > 0 && (
{project.stats.images}
)}
{project.stats.videos > 0 && (
{project.stats.videos}
)}
)
}
/**
* 排版1: 网格卡片
* 标准 5 列网格,卡片内容模仿系统真实结构(标题+描述+统计+时间)
*/
export function LayoutGrid({ projects, t }: { projects: MockProject[]; t: (key: string, params?: Record) => string }) {
return (
{t('recentProjects')}
{projects.map((p) => (
{p.name}
{formatTimeAgo(p.updatedAt, t)}
))}
)
}
/**
* 排版2: 横向滚动
* 一排横滚大卡片,更有沉浸感
*/
export function LayoutScroll({ projects, t }: { projects: MockProject[]; t: (key: string, params?: Record) => string }) {
return (
{t('recentProjects')}
{projects.map((p) => (
{p.name}
{formatTimeAgo(p.updatedAt, t)}
))}
)
}
/**
* 排版3: 紧凑列表
* 左右布局的一行式列表,信息紧凑
*/
export function LayoutList({ projects, t }: { projects: MockProject[]; t: (key: string, params?: Record) => string }) {
return (
{t('recentProjects')}
{projects.map((p) => (
{formatTimeAgo(p.updatedAt, t)}
))}
)
}
/**
* 排版4: 突出首项
* 第一个项目大卡片占满左侧,右侧两列堆叠小卡片
*/
export function LayoutFeatured({ projects, t }: { projects: MockProject[]; t: (key: string, params?: Record) => string }) {
const [first, ...rest] = projects
return (
{t('recentProjects')}
{/* 大卡片 */}
{first && (
{t('latestUpdate')}
{first.name}
{formatTimeAgo(first.updatedAt, t)}
)}
{/* 小卡片网格 */}
{rest.map((p) => (
{p.name}
{p.description}
{formatTimeAgo(p.updatedAt, t)}
))}
)
}
/**
* 排版5: 极简圆点列表
* 和输入框同宽的极简列表,仅显示项目名和关键数据
*/
export function LayoutMinimalList({ projects, t }: { projects: MockProject[]; t: (key: string, params?: Record) => string }) {
return (
{t('recentProjects')}
{projects.map((p) => (
{p.name}
{p.stats.episodes} {t('episodes')}
{p.stats.images} {t('images')}
{formatTimeAgo(p.updatedAt, t)}
))}
)
}