Skip to content

Client 设计语言规范

本文档定义了客户端(对外展示)的视觉设计规范。Client 面向终端用户,风格比 Admin 更活泼、更有层次感。


🎨 Design Tokens

所有视觉属性通过 CSS 变量(globals.css)定义,并在 tailwind.config.ts 中映射为工具类。

圆角 Token

TokenTailwind 类用途
--radius-cardrounded-card16px卡片容器
--radius-buttonrounded-button8pxButton
--radius-inputrounded-input8pxInput、搜索框
--radius-dropdownrounded-dropdown12pxDropdownMenu、Popover
--radius-modalrounded-modal24pxDialog、AI 对话弹窗
--radius-badgerounded-badge9999pxBadge、标签

阴影 Token

TokenTailwind 类用途
--shadow-cardshadow-card卡片静态状态
--shadow-card-hovershadow-card-hover卡片 hover 状态
--shadow-dropdownshadow-dropdown下拉菜单、搜索结果面板
--shadow-modalshadow-modalDialog、AI 对话弹窗

过渡 Token

TokenTailwind 类用途
--transition-fastduration-fast150ms颜色、透明度
--transition-normalduration-normal200ms阴影、布局

主题色

Client 支持动态主题色切换,通过 --theme-primary 系列变量控制:

css
--theme-primary: hsl(217, 91%, 60%);       /* 主色 */
--theme-primary-hover: hsl(217, 91%, 55%);  /* hover 态 */
--theme-primary-light: hsl(217, 91%, 95%);  /* 浅色背景 */
--theme-primary-dark: hsl(217, 91%, 50%);   /* 深色强调 */

这些值由后端站点配置动态注入,前端通过 ThemeProvider 应用。


🧩 组件使用规范

Button

通过 variantsize 控制,不在 className 中覆盖圆角和阴影:

tsx
// ✅ 正确
<Button size="lg">开始对话</Button>
<Button variant="outline">取消</Button>
<Button variant="ghost" size="icon-sm"><X className="h-4 w-4" /></Button>

// ❌ 错误
<Button className="rounded-xl shadow-lg shadow-primary/20 hover:scale-[1.02]">

尺寸参考:

size高度用途
smh-9紧凑操作
defaulth-10通用
lgh-11主操作(发送、提交)
iconh-10 w-10标准图标按钮
icon-smh-8 w-8关闭、折叠
icon-xsh-7 w-7紧凑图标

下拉菜单

组件已内置 rounded-dropdownshadow-dropdown

tsx
// ✅ 正确
<DropdownMenuContent align="end" className="w-48">

// ❌ 错误
<DropdownMenuContent className="rounded-xl shadow-xl border-slate-100">

✨ 交互规范

与 Admin 的区别

Client 面向终端用户,允许更丰富的交互效果:

效果ClientAdmin说明
active:scale-95✅ 允许❌ 禁止按钮点击反馈
hover:scale-105✅ 允许❌ 禁止发送按钮、CTA
shadow-lg shadow-primary/20✅ 允许❌ 禁止主操作按钮强调
glass-card✅ 使用❌ 不使用毛玻璃效果

TIP

这些效果仅在业务组件中使用(SiteCardChatWidgetAIChatLanding 等),不要加在 components/ui/ 的基础组件上。

Loading 状态

统一使用 Loader2 图标,不使用 CSS border spinner:

tsx
import { Loader2 } from "lucide-react"

// ✅ 正确
<Loader2 className="h-6 w-6 animate-spin text-primary" />

// ❌ 错误
<div className="animate-spin rounded-full h-6 w-6 border-b-2 border-primary" />

📐 日期格式化

tsx
// ✅ 正确 — 使用 locale 变量
const locale = useLocale()
new Date(date).toLocaleString(locale, { ... })

// ❌ 错误 — 硬编码
new Date(date).toLocaleString('zh-CN', { ... })

📚 相关文档