mcpField
D
design-guide

design-guide

github.com/paperclipai设计与 UI108.3k372 次安装今天更新
代码仓库

关于 design-guide

Paperclip UI 的设计规范技能,面向构建和维护其界面的开发者。它规定了深色优先、键盘操作、设计令牌、组件层级及一致的交互模式。

主要功能

  1. 01信息密集且易扫读的布局
  2. 02键盘优先的交互规范
  3. 03深色主题与语义设计令牌
  4. 04组件层级和复用规则
  5. 05统一的状态、优先级与排版样式

适用场景

  1. 01实现 Paperclip 界面页面
  2. 02新增可复用 UI 组件
  3. 03保持状态与优先级展示一致
  4. 04更新组件时同步设计指南

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/paperclipai/paperclip --skill design-guide

安装后在 Claude Code 中输入/design-guide确认已加载。

附带文件references/component-index.md

详细介绍

Paperclip 设计指南

Paperclip 的 UI 是专业级控制平面——信息密集、以键盘操作为主,默认采用深色主题。每个像素都有其用处。

始终搭配使用: frontend-design(视觉润色)和 web-design-guidelines(Web 最佳实践)。


1. 设计原则

  • 信息密集,但易于浏览。 无需点击即可呈现尽可能多的信息。留白用于分隔,而不是填充。
  • 键盘优先。 全局快捷键(Cmd+K、C、[、])。高级用户很少使用鼠标。
  • 注重上下文,而非模态弹窗。 使用行内编辑,而不是对话框;使用下拉菜单,而不是页面跳转。
  • 默认采用深色主题。 使用中性灰色(OKLCH),而非纯黑。强调色仅用于状态和优先级。文本是主要的视觉元素。
  • 组件驱动。 优先使用能够体现样式约定的可复用组件。选择恰当的抽象粒度——既不要过于细碎,也不要过于庞大。

2. 技术栈

  • React 19 + TypeScript + Vite
  • 使用 CSS 变量的 Tailwind CSS v4(OKLCH 色彩空间)
  • shadcn/ui(new-york 风格、中性色基底、启用 CSS 变量)
  • Radix UI 基元(无障碍支持、焦点管理)
  • Lucide React 图标(导航图标为 16px,行内图标为 14px)
  • 使用 class-variance-authority(CVA)定义组件变体
  • 通过 cn() 工具函数使用 clsx + tailwind-merge

配置:ui/components.json(别名:@/components、@/components/ui、@/lib、@/hooks)


3. 设计令牌

所有令牌均以 CSS 变量的形式定义在 ui/src/index.css 中。浅色和深色主题均使用 OKLCH。

颜色

使用语义化令牌名称,不要使用原始颜色值:

令牌用途
--background / --foreground页面背景和主要文本
--card / --card-foreground卡片表面
--primary / --primary-foreground主要操作、强调内容
--secondary / --secondary-foreground次要表面
--muted / --muted-foreground弱化文本、标签
--accent / --accent-foreground悬停状态、当前导航项
--destructive危险操作
--border所有边框
--ring焦点环
--sidebar-*侧边栏专用变体
--chart-1 至 --chart-5数据可视化
圆角

使用单一的 --radius 变量(0.625rem),并派生出以下尺寸:

  • rounded-sm — 小型输入框、胶囊标签
  • rounded-md — 按钮、输入框、小型组件
  • rounded-lg — 卡片、对话框
  • rounded-xl — 卡片容器、大型组件
  • rounded-full — 徽章、头像、状态圆点
阴影

阴影应保持轻微:shadow-xs(轮廓按钮)、shadow-sm(卡片)。不要使用厚重的阴影。


4. 字体排印层级

使用以下精确样式模式,不要自行创造新的模式:

模式类名用途
页面标题text-xl font-bold页面顶部
分区标题text-lg font-semibold主要分区
分区小标题text-sm font-semibold text-muted-foreground uppercase tracking-wide设计指南、侧边栏中的分区标题
卡片标题text-sm font-medium 或 text-sm font-semibold卡片标题、列表项标题
正文text-sm默认正文文本
弱化文本text-sm text-muted-foreground描述、次要文本
微型标签text-xs text-muted-foreground元数据、时间戳、属性标签
等宽标识符text-xs font-mono text-muted-foreground问题键(PAP-001)、CSS 变量
大型统计数据text-2xl font-bold仪表板指标值
代码/日志font-mono text-xs日志输出、代码片段

5. 状态与优先级系统

状态颜色(所有实体保持一致)

在 StatusBadge.tsx 和 StatusIcon.tsx 中定义:

状态颜色实体类型
active、achieved、completed、succeeded、approved、done绿色系Agent、目标、问题、审批
running青色Agent
paused橙色Agent
idle、pending黄色Agent、审批
failed、error、rejected、blocked红色系运行、Agent、审批、问题
archived、planned、backlog、cancelled中性灰各类
todo蓝色问题
in_progress靛蓝色问题
in_review紫罗兰色问题
优先级图标

在 PriorityIcon.tsx 中定义:critical(红色/AlertTriangle)、high(橙色/ArrowUp)、medium(黄色/Minus)、low(蓝色/ArrowDown)。

Agent 状态圆点

行内彩色圆点:running(青色,animate-pulse)、active(绿色)、paused(黄色)、error(红色)、offline(中性)。


6. 组件层级

分为三个层级:

  1. shadcn/ui 基础组件(ui/src/components/ui/)—— Button、Card、Input、Badge、Dialog、Tabs 等。不要直接修改这些组件;应通过组合进行扩展。
  2. 自定义组合组件(ui/src/components/)—— StatusBadge、EntityRow、MetricCard 等。这些组件体现了 Paperclip 特有的设计语言。
  3. 页面组件(ui/src/pages/)—— 将基础组件和组合组件组合成完整视图。

完整组件清单及使用指南请参阅 references/component-index.md。

何时创建新组件

在以下情况下创建可复用组件:

  • 相同的视觉模式出现在 2 个或更多位置
  • 该模式包含交互行为(状态更改、行内编辑)
  • 该模式包含领域逻辑(状态颜色、优先级图标)

以下情况不要创建组件:

  • 仅适用于单个页面的一次性布局
  • 简单的 className 组合(直接使用 Tailwind)
  • 没有增加语义价值的薄封装

7. 组合模式

这些模式描述组件如何协同工作。它们不一定是独立组件,但必须在整个应用中保持一致。

带状态和优先级的问题行

问题及类似实体的标准列表项:

<EntityRow
  leading={<><StatusIcon status="in_progress" /><PriorityIcon priority="high" /></>}
  identifier="PAP-001"
  title="Implement authentication flow"
  subtitle="Assigned to Agent Alpha"
  trailing={<StatusBadge status="in_progress" />}
  onClick={() => {}}
/>

前置槽位始终先放 StatusIcon,再放 PriorityIcon。后置槽位放 StatusBadge 或时间戳。

分组列表

按状态标题和实体行对问题进行分组:

<div className="flex items-center gap-2 px-4 py-2 bg-muted/50 rounded-t-md">
  <StatusIcon status="in_progress" />
  <span className="text-sm font-medium">In Progress</span>
  <span className="text-xs text-muted-foreground ml-1">2</span>
</div>
<div className="border border-border rounded-b-md">
  <EntityRow ... />
  <EntityRow ... />
</div>
属性行

属性面板中的键值对:

<div className="flex items-center justify-between py-1.5">
  <span className="text-xs text-muted-foreground">Status</span>
  <StatusBadge status="active" />
</div>

标签始终使用 text-xs text-muted-foreground,值靠右显示。将其放在带有 space-y-1 的容器中。

指标卡片网格

响应式网格中的仪表板指标:

<div className="grid md:grid-cols-2 xl:grid-cols-4 gap-4">
  <MetricCard icon={Bot} value={12} label="Active Agents" description="+3 this week" />
  ...
</div>
进度条(预算)

根据阈值设置颜色:绿色(<60%)、黄色(60-85%)、红色(>85%):

<div className="w-full h-2 bg-muted rounded-full overflow-hidden">
  <div className="h-full rounded-full bg-green-400" style={{ width: `${pct}%` }} />
</div>
评论串

作者标题栏(姓名 + 时间戳)后接正文,置于带边框且使用 space-y-3 的卡片中。在下方添加评论文本区域和按钮。

费用表格

使用标准 <table>,设置 text-xs,标题行使用 bg-accent/20,数值使用 font-mono。

日志查看器

使用 bg-neutral-950 rounded-lg p-3 font-mono text-xs 容器。按级别为日志行着色:默认(前景色)、WARN(yellow-400)、ERROR(red-400)、SYS(blue-300)。流式传输时显示实时状态圆点。


8. 交互模式

悬停状态
  • 实体行:hover:bg-accent/50
  • 导航项:hover:bg-accent/50 hover:text-accent-foreground
  • 当前导航项:bg-accent text-accent-foreground
焦点

focus-visible:ring-ring focus-visible:ring-[3px] —— 标准 Tailwind focus-visible 焦点环。

禁用状态

disabled:opacity-50 disabled:pointer-events-none

行内编辑

使用 InlineEditor 组件——点击文本进行编辑,按 Enter 保存,按 Escape 取消。

弹出选择器

StatusIcon 和 PriorityIcon 使用 Radix Popover 进行行内选择。对于任何点击后会打开选择器的属性,都遵循此模式。

9. 布局系统

在 Layout.tsx 中定义的三区域布局:

┌──────────┬──────────────────────────────┬──────────────────────┐
│ Sidebar  │  Breadcrumb bar              │                      │
│ (w-60)   ├──────────────────────────────┤  Properties panel    │
│          │  Main content (flex-1)       │  (w-80, optional)    │
└──────────┴──────────────────────────────┴──────────────────────┘
  • 侧边栏:w-60,可折叠,包含 CompanySwitcher + SidebarSections
  • 属性面板:w-80,在详情视图中显示,在列表视图中隐藏
  • 主内容区:可滚动,flex-1

10. /design-guide 页面

位置:ui/src/pages/DesignGuide.tsx 路由:/design-guide

这是应用中所有组件和模式的动态展示页,也是界面外观的权威参考。

规则
  1. **添加新的可复用组件时,必须将其添加到设计指南页面。**展示所有变体、尺寸和状态。
  2. 修改现有组件的 API 时,更新其设计指南部分。
  3. 添加新的组合模式时,添加一个展示该模式的章节。
  4. 遵循现有结构:使用 <Section title="..."> 包装,并使用 <SubSection> 进行分组。
  5. 按逻辑顺序排列章节:先介绍基础内容(颜色、字体排印),再介绍基本组件、复合组件,最后介绍模式。
添加新章节
<Section title="My New Component">
  <SubSection title="Variants">
    {/* Show all variants */}
  </SubSection>
  <SubSection title="Sizes">
    {/* Show all sizes */}
  </SubSection>
  <SubSection title="States">
    {/* Show interactive/disabled states */}
  </SubSection>
</Section>

11. 组件索引

完整组件清单请参阅 references/component-index.md。

创建新的可复用组件时:

  1. 将其添加到组件索引参考文件
  2. 将其添加到 /design-guide 页面
  3. 遵循现有的命名和文件规范

12. 文件规范

  • shadcn 基本组件:ui/src/components/ui/{component}.tsx — 小写,使用 kebab-case
  • 自定义组件:ui/src/components/{ComponentName}.tsx — PascalCase
  • 页面:ui/src/pages/{PageName}.tsx — PascalCase
  • 实用工具:ui/src/lib/{name}.ts
  • Hooks:ui/src/hooks/{useName}.ts
  • API 模块:ui/src/api/{entity}.ts
  • 上下文提供程序:ui/src/context/{Name}Context.tsx

所有组件都使用 @/lib/utils 中的 cn() 合并 className。具有多个视觉变体的组件都使用 CVA 定义变体。


13. 应避免的常见错误

  • 使用原始的十六进制/RGB 颜色,而不是 CSS 变量令牌
  • 不使用既定的字体排印比例,而是创建临时字体样式
  • 硬编码状态颜色,而不是使用 StatusBadge/StatusIcon
  • 在已有可复用组件的情况下,仍创建一次性样式元素
  • 添加组件时未更新设计指南页面
  • 使用 shadow-md 或更强的阴影 — 阴影应尽量轻微(仅 xs、sm)
  • 使用 rounded-2xl 或更大的圆角 — 最大为 rounded-xl(药丸形元素的 rounded-full 除外)
  • 忽略深色模式 — 始终使用语义令牌,绝不硬编码浅色/深色值

评论

支持 Markdown