← 返回提示词库
创意灵感 难度:入门

设计交付说明:AI优先,人类可读

Design Handoff Notes - AI First, Human Readable

一份结构化的交付文档,针对AI实施代理(Claude Code, Cursor, Copilot)进行优化,同时对人类开发者保持清晰。

适用平台: ChatGPTClaudeGemini
# 设计交付说明 — AI优先,人类可读

### 结构化的交付文档,为AI实现代理(Claude Code, Cursor, Copilot)优化,同时对人类开发者保持清晰

---

## 关于此提示

**描述:** 生成一份设计交付文档,作为AI编码代理的直接实现指令。与描述设计“应有感觉”的传统交付说明不同,本文档提供机器可解析的规范,零歧义。每个值都是明确的,每个状态都已定义,每个边缘情况都有规则。文档结构使得AI代理可以从上到下阅读并实现,无需提出澄清问题——同时人类开发者也可以自然阅读。

**核心理念:** 如果AI阅读此文档后需要猜测任何内容,则文档失败。

**何时使用:** 设计定稿后,实现开始前。这取代了Figma交付、设计规范PDF以及“就让它看起来像模型图”的对话。

**谁阅读此文档:**
- 主要:AI编码代理(Claude Code, Cursor, Copilot等)
- 次要:审查或调试AI输出的人类开发者
- 第三:你(设计师),在检查实现是否符合意图时

**与CLAUDE.md的关系:** 本文档假设项目根目录中已存在CLAUDE.md设计系统文件。交付说明引用CLAUDE.md中的令牌,但不重新定义它们。如果不存在CLAUDE.md,请先运行设计系统提取提示。

---

## 提示

```
你是一名设计系统工程师,正在编写实现规范。
你的输出将主要由AI编码代理(Claude Code, Cursor)阅读,
其次由人类开发者阅读。

你的写作必须遵循一个绝对规则:
**如果读者需要猜测、推断或假设任何事情,你就失败了。**

每个值都必须是明确的。每个状态都必须被定义。每个边缘情况都必须有规则。没有“酌情”、“大约”或“类似于”。

## 项目背景
- **项目:** ${name}
- **框架:** [Next.js 14+ / React / 等]
- **样式:** [Tailwind 3.x / CSS Modules / 等]
- **组件库:** [shadcn/ui / 自定义 / 等]
- **CLAUDE.md 位置:** [路径 — 或“尚未创建”]
- **设计来源:** [上传的代码 / 实时 URL / 截图]
- **要规范的页面:** [所有 / 特定页面]

## 输出格式规则

在编写任何规范之前,请严格遵循以下格式规则:

1. **值始终是代码就绪的。**
   错误:“中等间距”
   正确:`p-6` (24px)

2. **颜色始终是令牌引用 + 备用十六进制。**
   错误:“品牌蓝”
   正确:`text-brand-500` (#2563EB) — 来自 CLAUDE.md 令牌

3. **尺寸始终使用项目的单位系统。**
   如果是 Tailwind:主要使用 Tailwind 类,px 作为注释
   如果是 CSS:主要使用 rem,px 作为注释
   错误:“在桌面端做得更大”
   正确:`text-lg` (18px) 在 ≥768px,`text-base` (16px) 在此以下

4. **条件语句使用明确的 if/else,从不使用“根据需要”。**
   错误:“酌情显示加载状态”
   正确:“如果数据获取耗时 >300ms,显示骨架屏。如果获取失败,显示错误状态。如果数据返回空数组,显示空状态。”

5. **文件路径是明确的。**
   错误:“创建一个按钮组件”
   正确:“创建 `src/components/ui/Button.tsx`”

6. **每个视觉属性都已声明,从不通过假设继承。**
   即使“显而易见”——也要声明。AI 代理没有视觉上下文。

---

## 文档结构

生成包含以下部分的交接文档:

### 第一部分:实现路线图

一个按优先级排序的表格,列出所有要构建的内容。
AI 代理应按此顺序实现,以正确解决依赖关系。

| 顺序 | 组件/部分 | 文件路径 | 依赖项 | 复杂度 | 备注 |
|-------|------------------|-----------|-------------|-----------|-------|
| 1 | 设计令牌设置 | `tailwind.config.ts` | 无 | 低 | 必须是第一个——所有其他组件都引用这些 |
| 2 | 排版组件 | `src/components/ui/Text.tsx` | 令牌 | 低 | 标题、正文、说明、标签变体 |
| 3 | 按钮 | `src/components/ui/Button.tsx` | 令牌、排版 | 中 | 3 种变体 × 3 种尺寸 × 6 种状态 |
| ... | ... | ... | ... | ... | ... |

规则:
- 任何内容都不能引用表格中靠后的组件
- 复杂度 = 组件有多少种变体 × 状态
- 备注 = 关于实现任何不明显的地方

---

### 第二部分:全局规范

这些适用于所有地方。AI 代理应在构建任何组件之前配置这些。

#### 2.1 断点
定义精确的行为边界:

```
BREAKPOINTS {
  mobile:  0px    — 767px
  tablet:  768px  — 1023px
  desktop: 1024px — 1279px
  wide:    1280px — ∞
}
```

对于每个断点,说明:
- 容器最大宽度和内边距
- 基本字体大小
- 全局间距乘数(如果更改)
- 导航模式(汉堡包 / 水平 / 等)

#### 2.2 过渡默认值
```
TRANSITIONS {
  default:    duration-200 ease-out
  slow:       duration-300 ease-in-out
  spring:     duration-500 cubic-bezier(0.34, 1.56, 0.64, 1)
  none:       duration-0
}

规则:除非本文档另有规定,否则每个交互元素都使用 `default`。
规则:过渡应用于:background-color、color、border-color、opacity、transform、box-shadow。绝不应用于:width、height、padding、margin(这些会导致布局重新计算)。
```

#### 2.3 Z-Index 范围
```
Z-INDEX {
  base:       0
  dropdown:   10
  sticky:     20
  overlay:    30
  modal:      40
  toast:      50
  tooltip:    60
}

规则:绝不允许使用此范围之外的 z-index 值。
```

#### 2.4 焦点样式
```
FOCUS {
  style:      ring-2 ring-offset-2 ring-brand-500
  applies-to: 每个交互元素(按钮、链接、输入框、选择框、复选框)
  visible:    仅在键盘导航时可见(使用 focus-visible,而不是 focus)
}
```

---

### 第 3 节:页面规范

为每个页面提供完整的实现规范。

#### 页面:${page_name}
**路由:**`/exact-route-path`
**布局:**${which_layout_wrapper_to_use}
**数据要求:**[此页面需要哪些数据,从何处获取]

##### 页面结构(从上到下)

```
页面结构:${page_name}
├── 部分:英雄区
│   ├── 组件:标题 (h1)
│   ├── 组件:副标题 (p)
│   ├── 组件:CTA 按钮 (primary, lg)
│   └── 组件:英雄图片
├── 部分:功能区
│   ├── 组件:部分标题 (h2)
│   └── 组件:功能卡片 × 3 (网格)
├── 部分:用户评价
│   └── 组件:用户评价滑块
└── 部分:CTA
    ├── 组件:标题 (h2)
    └── 组件:CTA 按钮 (primary, lg)
```

##### 各部分规范

对于每个部分:

**${section_name}**

```
布局 {
  容器:    max-w-[1280px] mx-auto px-6 (移动端: px-4)
  方向:    flex-col (移动端) → flex-row (桌面端)
  间距:          gap-8 (32px)
  内边距:      py-16 (64px) (移动端: py-10)
  背景:   bg-white
}

内容 {
  标题 {
    文本:       "${exact_heading_text_or_content_source}"
    元素:    h2
    类名:      text-3xl font-bold text-gray-900 (移动端: text-2xl)
    最大宽度:  max-w-[640px]
  }
  正文 {
    文本:       "${exact_body_text_or_content_source}"
    类名:      text-lg text-gray-600 leading-relaxed (移动端: text-base)
    最大宽度:  max-w-[540px]
  }
}

网格 (如果适用) {
  列:      grid-cols-3 (平板: grid-cols-2) (移动端: grid-cols-1)
  间距:          gap-6 (24px)
  项目:        ${what_component_renders_in_each_cell}
  对齐:    items-start
}

动画 (如果适用) {
  类型:         滚动时淡入上滑
  触发器:      当区块进入视口时 (阈值: 0.2)
  交错:      每个子元素比前一个延迟 100ms
  持续时间:     duration-500
  缓动:       ease-out
  运行:         一次 (向上滚动时不重新触发)
}
```

---

### 第 4 节:组件规范

对于每个组件,提供完整的实现契约。

#### 组件: ${componentname}
**文件:** `src/components/${path}/${componentname}.tsx`
**目的:** [一句话 — 此组件的功能]

##### Props 接口
```typescript
interface ${componentname}Props {
  variant: 'primary' | 'secondary' | 'ghost'     // 视觉样式
  size: 'sm' | 'md' | 'lg'                        // 尺寸
  disabled?: boolean                                // 默认值: false
  loading?: boolean                                 // 默认值: false
  icon?: React.ReactNode                           // 可选的前置图标
  children: React.ReactNode                         // 标签内容
  onClick?: () => void                              // 点击事件处理器
}
```

##### 变体 × 尺寸矩阵
为每种组合定义精确值:

```
VARIANT: primary
  SIZE: sm
    height:           h-8 (32px)
    padding:          px-3 (12px)
    font:             text-sm font-medium (14px)
    background:       bg-brand-500 (#2563EB)
    text:             text-white (#FFFFFF)
    border:           none
    border-radius:    rounded-md (6px)
    shadow:           none

  SIZE: md
    height:           h-10 (40px)
    padding:          px-4 (16px)
    font:             text-sm font-medium (14px)
    background:       bg-brand-500 (#2563EB)
    text:             text-white (#FFFFFF)
    border:           none
    border-radius:    rounded-lg (8px)
    shadow:           shadow-sm

  SIZE: lg
    height:           h-12 (48px)
    padding:          px-6 (24px)
    font:             text-base font-semibold (16px)
    background:       bg-brand-500 (#2563EB)
    text:             text-white (#FFFFFF)
    border:           none
    border-radius:    rounded-lg (8px)
    shadow:           shadow-sm

VARIANT: secondary
  [结构相同,值不同]

VARIANT: ghost
  [结构相同,值不同]
```

##### 状态规范
每种状态都必须为每个变体定义:

```
STATES(除非被覆盖,否则适用于所有变体):

  hover {
    background:     ${token} — 比默认颜色暗一个色阶
    transform:      none (悬停时无缩放/平移)
    shadow:         ${token_or_none}
    cursor:         pointer
    transition:     default (duration-200 ease-out)
  }

  active {
    background:     ${token} — 比默认颜色暗两个色阶
    transform:      scale-[0.98]
    transition:     duration-75
  }

  focus-visible {
    ring:           ring-2 ring-offset-2 ring-brand-500
    all other:      与默认状态相同
  }

  disabled {
    opacity:        opacity-50
    cursor:         not-allowed
    pointer-events: none
    ALL hover/active/focus states: 不适用
  }

  loading {
    content:        用 spinner 替换子元素 (16px, animate-spin)
    width:          保持与非加载状态相同的宽度 (防止布局偏移)
    pointer-events: none
    opacity:        opacity-80
  }
```

##### 图标行为
```
ICON RULES {
  position:       标签文本左侧 (始终)
  size:           16px (sm), 16px (md), 20px (lg)
  gap:            gap-1.5 (sm), gap-2 (md), gap-2 (lg)
  color:          继承文本颜色 (currentColor)
  when loading:   图标隐藏,spinner 占据其位置
  icon-only:      如果没有子元素,组件变为正方形 (width = height)
                  添加 aria-label 属性要求
}
```

---

### 第 5 节:交互流程

对于每个用户流程,提供分步实现:

#### 流程:[流程名称,例如,“用户注册”]
```
TRIGGER:     用户点击头部“注册”按钮

步骤 1: 模态框打开
             动画: 渐入(不透明度 0→1,持续时间 200 毫秒)
             背景: bg-black/50,点击外部关闭模态框
             焦点: 将焦点限制在模态框内,自动聚焦第一个输入框
             主体: 滚动锁定(防止背景滚动)

步骤 2: 用户填写表单
             字段: ${list_exact_fields_with_validation_rules}
             验证: 失去焦点时验证(而不是改变时验证 — 减少干扰)
             
             字段: email {
               类型: email
               必填: true
               验证: 正则表达式模式 + “必须包含 @ 和域名”
               错误: “这看起来不像电子邮件 — 检查是否有拼写错误”
               成功: 绿色对勾图标出现(渐入,持续时间 150 毫秒)
             }
             
             字段: password {
               类型: password(带显示/隐藏切换)
               必填: true
               验证: 最小 8 个字符,1 个大写字母,1 个数字
               错误: 显示要求清单,突出显示未满足的要求
               强度: 显示强度条(弱/中/强)
             }

步骤 3: 用户提交
             按钮: 显示加载状态(参见 Button 组件规范)
             请求: POST /api/auth/signup
             持续时间: 预计 1-3 秒

步骤 4a: 成功
             模态框: 内容过渡到成功消息(交叉淡入,持续时间 200 毫秒)
             消息: “账户已创建!请检查您的电子邮件进行验证。”
             操作: “知道了”按钮关闭模态框
             重定向: 关闭后,重定向到 /dashboard
             提示: 无(模态框即是确认)

步骤 4b:错误 — 邮箱已存在
             字段:邮箱输入框显示错误状态
             消息:“此邮箱已有账户 — 要登录吗?”
             操作:“登录”链接将模态框切换到登录表单
             按钮:返回默认状态(未加载)

步骤 4c:错误 — 网络故障
             显示:模态框顶部显示错误横幅(非浮动提示)
             消息:“我们这边出了点问题。再试一次?”
             操作:“再试一次”按钮重新提交
             按钮:返回默认状态

步骤 4d:错误 — 频率限制
             显示:错误横幅
             消息:“尝试次数过多。请等待 60 秒后重试。”
             按钮:禁用 60 秒,并显示倒计时

```

---

### 第 6 节:响应式行为规则

不要描述变化,请指定确切的规则:

```
响应式规则:

规则 1:导航
  ≥1024px:水平导航,所有项目可见
  <1024px:汉堡图标,从右侧滑入式抽屉
              抽屉宽度:80vw (max-w-[320px])
              动画:translate-x (duration-300 ease-out)
              背景:bg-black/50,点击外部关闭

规则 2:网格部分
  ≥1024px:grid-cols-3
  768-1023px:grid-cols-2(如果项目数为奇数,则最后一个项目占满整行)
  <768px:grid-cols-1

规则 3:英雄部分
  ≥1024px:两列(文本左,图片右)— 55/45 分割
  <1024px:单列(文本上,图片下)
              图片最大高度:400px,object-cover

规则 4:排版缩放
  ≥1024px:h1=text-5xl, h2=text-3xl, h3=text-xl, body=text-base
  <1024px:h1=text-3xl, h2=text-2xl, h3=text-lg, body=text-base

```

规则 5:间距缩放
  ≥1024px: section-padding: py-16, container-padding: px-8
  768-1023px:section-padding: py-12, container-padding: px-6
  <768px:    section-padding: py-10, container-padding: px-4

规则 6:触摸目标
  <1024px:所有交互元素最小点击区域为 44×44px
              如果视觉尺寸 < 44px,使用不可见填充达到 44px

规则 7:图片
  所有图片:使用 next/image 并带有响应式 sizes 属性
  英雄图:    sizes="(max-width: 1024px) 100vw, 50vw"
  网格项:    sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"
```

---

### 第 7 节:边缘情况和边界条件

本节旨在解决“那会发生什么……”的问题:

```
边缘情况:

文本溢出 {
  标题:     最多 2 行,然后用 text-ellipsis 截断(添加 title 属性显示完整文本)
  正文:    允许自然换行,不截断
  按钮标签: 仅单行,最多 30 个字符,不截断(设计约束)
  导航项:   单行,移动端超过 16 个字符则截断
  表格单元格:悬停时显示工具提示截断
}

空状态 {
  列表/网格无项目:显示 ${emptystate} 组件
    - 插图: ${describe_or_reference_asset}
    - 标题: "${exact_text}"
    - 正文: "${exact_text}"
    - CTA: "${exact_text}" → ${action}
  
  用户头像缺失:在彩色背景上显示首字母
    - 背景:根据用户名哈希生成(确定性)
    - 首字母:姓氏和名字的首字母,大写
    - 字体:text-sm font-medium text-white
  
  图片加载失败:显示带有图片图标的灰色占位符
    - 背景:bg-gray-100
    - 图标:来自 lucide-react 的 ImageOff,text-gray-400,24px
}

加载状态 {
  页面加载: 全屏骨架屏 (非加载转圈)
  组件加载: 组件级骨架屏,尺寸与最终内容匹配
  按钮操作: 按钮内嵌加载转圈 (参见按钮规范)
  无限列表: 底部显示 3 行骨架屏,同时获取下一页数据
  
  骨架屏样式: bg-gray-200 rounded animate-pulse
  骨架屏规则: 骨架屏形状必须与最终内容形状匹配
                  (文本为矩形,头像为圆形,卡片为圆角矩形)
}

错误状态 {
  API 错误 (500): 显示内联错误横幅,带重试按钮
  网络错误: 顶部显示“您似乎已离线”横幅 (重新连接时自动消失)
  404 内容: 显示自定义 404 组件 (非 Next.js 默认)
  权限拒绝: 重定向到 /login,带返回 URL 参数
  表单验证: 内联字段级验证 (参见流程规范),绝不使用 alert()
}

数据极端情况 {
  用户名 1 个字符: 正常显示
  用户名 50 个字符: 导航栏截断为 20 个字符,个人资料页显示完整
  价格 $0.00: 显示“免费”
  价格 $999,999.99: 确保布局不中断 (使用格式化数字测试)
  列表有 1 项: 布局与多项相同 (无特殊情况)
  列表有 500 项: 每页 20 项,显示“加载更多”按钮
  日期今天: 显示“今天”而非具体日期
  日期今年: 显示“3 月 13 日”而非“2026 年 3 月 13 日”
  日期其他年份: 显示“2025 年 3 月 13 日”
}
```

---

### 第 8 节:实施验证清单

实施后,AI 代理(或人工开发者)应验证:

```
验证:

□ 每个组件都与变体 × 尺寸矩阵精确匹配
□ 所有状态(悬停、激活、焦点、禁用、加载)都正常工作
□ Tab 键顺序在所有页面上都遵循视觉顺序
□ 焦点可见环在键盘导航时出现,而不是在鼠标点击时出现
□ 所有过渡都使用指定的持续时间和缓动(而不是浏览器默认值)
□ 页面加载期间没有布局偏移(检查 CLS)
□ 骨架状态与最终内容尺寸匹配
□ 处理了第 7 节中的所有边缘情况
□ 移动断点上的触摸目标 ≥ 44×44px
□ 在任何断点都没有水平滚动
□ 所有图像都使用 next/image 并带有正确的 sizes 属性
□ Z-index 值只使用定义的比例
□ 错误状态显示正确(使用网络限流测试)
□ 空状态显示正确(使用空数据测试)
□ 文本截断在边界长度处起作用
□ 暗模式令牌(如果适用)都已映射
```

---

## AI 代理应如何使用此文档

将此指令包含在生成的交接文档顶部,以便实施 AI 知道如何使用它:

```
AI 实施代理指令:

1. 在编写任何代码之前,请完整阅读本文档。
2. 按照第 1 节(实现图)中指定的顺序进行实现。
3. 参考 CLAUDE.md 获取 token 值。如果此处引用的 token
   不在 CLAUDE.md 中,请标记它并使用提供的备用值。
4. 本文档中的每个值都是有意的。不要用“差不多”的值代替。
   `gap-6` 就是 `gap-6`,而不是 `gap-5`。
5. 必须实现每个状态。如果某个组件未指定状态,
   那是规范中的一个空白——请标记它,不要猜测。
6. 在实现每个组件后,运行其状态矩阵并验证所有状态
   都正常工作,然后再转到下一个组件。
7. 遇到歧义时,优先选择更明确的解释。
   如果仍然模棱两可,请添加 TODO 注释:“// HANDOFF-AMBIGUITY: [描述]”
```
```

---

## 自定义说明

**如果您不使用 Tailwind:** 将提示中所有 Tailwind 类引用替换为您系统中的等效项。结构保持不变——只有值格式发生变化。告诉 Claude:“使用 CSS 自定义属性作为主要,px 值作为注释。”

**如果您要交给特定的 AI 工具:** 添加工具特定的说明。例如,对于 Cursor:“生成实现时,以对现有文件的逐步编辑形式,而不是完整的文件重写。” 对于 Claude Code:“将每个组件创建为一个完整的文件,测试它,然后转到下一个。”

**如果 CLAUDE.md 尚不存在:** 告诉提示在交接文档顶部生成一个最小的 token 部分,仅涵盖本次交接所需的 token。它不会是一个完整的设计系统,但可以防止硬编码值。

**对于多页项目:** 每个页面运行一次提示词,但第 1 节(实现地图)和第 2 节(全局规范)仅在首次运行时包含。后续页面引用相同的全局变量。