前言 — 三个值得深度研究的 Design System
当前最值得研究的三套 Design System,分别代表消费级硬件生态、AI 对话界面、和全球最大 AI 产品的设计演进。本手册通过直接提取真实源码,呈现它们背后的设计决策。
三产品概览
世界上执行最一致的消费级 Design System。覆盖 iPhone、iPad、Mac、Watch、Apple TV、visionOS,16 亿台设备统一体验。Liquid Glass 材质(2025)重新定义了 UI 层级感。
AI 时代对话界面的设计范本。内部系统名 CDS(Claude Design System),使用私有品牌字体 Anthropic Sans / Serif / Mono,简洁而有深度。
快速迭代下的设计系统演进。拥有完整的语义 Token 体系、多主题系统(8种颜色主题)、精密的春季动画函数库,以及极完整的交互状态定义。
为何研究这三者
| 维度 | Apple HIG | Claude (CDS) | ChatGPT |
|---|---|---|---|
| 代表性 | 消费级 UI 最高标准,行业教科书 | AI 对话界面的设计先锋 | 全球 2 亿日活的真实 A/B 验证 |
| 文档完整度 | ◉◉◉◉◉ 完全公开 | ◉◉◉ 部分公开(CSS 实际可提取) | ◉◉◉ 部分公开(CSS 实际可提取) |
| Token 体系 | 语义色最成熟,Swift 原生 | HSL 三层 Token,CDS 命名空间 | 完整语义 Token,多主题支持 |
| 字体策略 | SF Pro 私有字体族 | Anthropic Sans/Serif/Mono 私有 | 系统字体 -apple-system-body |
| 动效 | Spring + Fluid 动画 | Tailwind 过渡 + 自定义 | 完整 Spring 函数库(5种) |
| Dark Mode | Dynamic Color 自动适配 | CSS Token 层切换 | CSS class + Token 切换 |
Design System 的本质与层级
Design System 不是 UI Kit,也不是 Style Guide。它是组织内部共享的设计语言体系——既是工具,也是协作协议,更是产品价值观的物化表达。
定义与原则
三个设计哲学层面的差异
「用户不应感知到 UI 的存在」
所有设计服务于内容本身。Liquid Glass 材质、Dynamic Color、SF Symbols——每一个都是为了让 UI 退后,让信息和功能自然呈现。
关键词:Clarity · Deference · Depth
「对话即产品,排版即内容」
Claude 的对话界面用 Anthropic Serif 渲染 AI 回复(衬线字体增加可读性),用 Anthropic Sans 渲染用户输入(无衬线更现代)。字体本身就是设计决策。
关键词:Readable · Calm · Depth
「快速迭代,Token 先行」
ChatGPT 的 Token 体系设计得极为完整(发现 8 种颜色主题、300+ 语义 Token),为快速上线新功能提供了稳定的设计基础设施。
关键词:Scalable · Themeable · Complete
完整层级:Foundation → Page
三产品如何组织各自的 DS
| 维度 | 🍎 Apple HIG | ⬡ Claude CDS | ◎ ChatGPT |
|---|---|---|---|
| 文档入口 | developer.apple.com/design | 无公开文档(源码可反推) | 无公开文档(源码可反推) |
| Token 命名空间 | Swift API 命名(.label, .systemBlue) | --cds-* / --_palette-* / --semantic | --gray-* / --interactive-* / --text-* |
| 工具链 | Xcode + SwiftUI + SF Symbols | Tailwind CSS + 私有 CDS 组件 | Tailwind CSS v4 + 私有组件库 |
| 多平台 | iOS/iPadOS/macOS/watchOS/tvOS/visionOS | Web 为主 (iOS/Android App) | Web 为主 (iOS/Android App) |
| 主题化 | Light/Dark + Increased Contrast | Light/Dark + 字体偏好 | 8种颜色主题 + Light/Dark |
Design Token — 三产品真实数据对比实时提取
本章所有 Token 数据均通过浏览器直接从 claude.ai 和 chatgpt.com 提取(2025年5月),以及从 Apple HIG 文档获取。这是真实的工程实现,不是推测。
Token 是什么
Design Token 是设计决策的原子化存储单元。它将「颜色」、「字体」、「间距」等视觉决策从硬编码值中解耦,用有语义的名称存储,让设计与代码共享同一套语言。
--text-primary 而不是 #0d0d0d,你在传递「这是主文本色」的意图,而不是一个特定的颜色值。这让主题切换、Dark Mode、多品牌等成为可能。
Token 三层架构
Claude.ai 真实 Token 体系 claude.ai 实时提取
🎨 调色板 — Global Token(HSL 格式)
Claude 使用 HSL 色彩空间(非 Hex),方便在不同亮度下调整色调。调色板以双下划线前缀 --_ 标识为私有(不直接用于组件),包含:aqua、blue、gray、green、magenta、orange、red、violet、yellow 九个系列,每系列约 50 个阶梯(0–900)。
Aqua / 主品牌色(真实提取 HSL 值)
Gray 系列(真实提取)
🏷️ 语义 Token — Alias Layer(真实提取)
/* ===== Claude.ai 真实提取 CSS Variables (2025.05) ===== */ /* 来源:直接从 claude.ai :root 提取,非推测 */ :root { /* --- 品牌 / Brand --- */ --accent-brand: hsl(14.8 63.1% 59.6%); /* 品牌主色:暖珊瑚 */ --_brand-clay: 14.8 63.1% 59.6%; /* Global Token 原始值 */ --_brand-clay-emphasized: 15.1 54.2% 51.2%; /* 强调变体 */ /* --- 字体 / Typography --- */ --font-anthropic-sans: "Anthropic Sans", system-ui, "Segoe UI", Roboto, sans-serif; --font-anthropic-serif: "Anthropic Serif", Georgia, "Times New Roman", serif; --font-anthropic-mono: "Anthropic Mono", ui-monospace, monospace; --font-claude-response: var(--font-anthropic-serif); /* AI 回复用衬线字体 */ --font-user-message: var(--font-anthropic-sans); /* 用户输入用无衬线 */ /* --- 背景层级 / Background Hierarchy --- */ --bg-000: hsl(0 0% 100%); /* 纯白(最表层)*/ --bg-100: hsl(60 14% 97%); /* 极浅米色 */ --bg-200: hsl(60 11% 95%); /* 浅灰背景 */ --bg-300: hsl(45 12% 93%); /* 卡片背景 */ --bg-400: hsl(50 11% 89%); /* 悬浮状态背景 */ --bg-500: hsl(50 11% 89%); /* 深色背景 */ /* --- 文本层级 / Text Hierarchy --- */ --text-000: hsl(0 0% 7%); /* 最重要文本(近黑)*/ --text-100: hsl(0 0% 7%); /* 主体文本 */ --text-200: hsl(60 3% 21%); /* 次要文本 */ --text-300: hsl(60 3% 21%); /* 三级文本 */ --text-400: hsl(43 3% 47%); /* 辅助文本(中灰)*/ --text-500: hsl(43 3% 47%); /* 占位符文本 */ /* --- 语义功能色 / Semantic Function Colors --- */ --accent-000: hsl(214 72% 34%); /* 深蓝(按钮/链接)*/ --accent-100: hsl(213 68% 50%); /* 标准蓝 */ --danger-000: hsl(0 58% 35%); /* 深红(错误状态)*/ --danger-100: hsl(0 61% 52%); /* 标准红 */ --success-000: hsl(87 100% 18%); /* 深绿(成功状态)*/ --success-100: hsl(82 100% 27%); /* 标准绿 */ --warning-000: hsl(36 100% 23%); /* 深橙(警告)*/ --warning-100: hsl(38 100% 33%); /* 标准橙 */ /* --- CDS 基础 Token / Component Design System --- */ --cds-radius: .25rem; /* 全局基础圆角 */ --cds-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / .05); --cds-shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1); --cds-ease-out: cubic-bezier(0, 0, .2, 1); }
// W3C DTCG 格式 (Design Token Community Group Standard) { "brand": { "clay": { "$value": "hsl(14.8 63.1% 59.6%)", "$type": "color", "$description": "Claude 品牌主色,暖珊瑚色调" } }, "font": { "claude-response": { "$value": "\"Anthropic Serif\", Georgia, serif", "$type": "fontFamily", "$description": "AI 回复专用字体:衬线体提升长文可读性" }, "user-message": { "$value": "\"Anthropic Sans\", system-ui, sans-serif", "$type": "fontFamily" } }, "bg": { "000": { "$value": "hsl(0 0% 100%)", "$type": "color" }, "100": { "$value": "hsl(60 14% 97%)", "$type": "color" }, "200": { "$value": "hsl(60 11% 95%)", "$type": "color" } } }
ChatGPT 真实 Token 体系 chatgpt.com 实时提取
🎨 品牌绿色板(真实 Hex 值)
★ #04b84c = --green-400 = ChatGPT 品牌绿(按钮/高亮色)
/* ===== ChatGPT 真实提取 CSS Variables (2025.05) ===== */ :root { /* --- 背景层级 --- */ --bg-primary: #fff; --bg-secondary: #e8e8e8; --bg-secondary-surface: #f9f9f9; --bg-tertiary: #f3f3f3; --bg-elevated-primary: #fff; --bg-elevated-secondary: #f9f9f9; /* --- 文本层级 --- */ --text-primary: #0d0d0d; /* 主文本(近黑)*/ --text-secondary: #5d5d5d; /* 辅助文本 */ --text-tertiary: #8f8f8f; /* 提示文本 */ --text-inverted: #fff; /* 反色文本 */ --text-danger: #e02e2a; /* 错误状态文本 */ --text-accent: #66b5ff; /* Dark Mode 蓝色强调 */ /* --- 品牌色 --- */ --brand-purple: #ab68ff; /* 品牌紫(GPT-4o 等) */ --bg-accent-static: #0285ff; /* 蓝色强调背景 */ --icon-accent: #0285ff; /* --- Sidebar --- */ --sidebar-surface: #fcfcfc; --sidebar-surface-primary: #f9f9f9; --sidebar-body-primary: #0d0d0d; /* --- 圆角 --- */ --radius-xs: .125rem; /* 2px */ --radius-sm: .25rem; /* 4px */ --radius-md: .375rem; /* 6px */ --radius-lg: .5rem; /* 8px */ --radius-xl: .75rem; /* 12px */ --radius-2xl: 1rem; /* 16px */ --radius-3xl: 1.5rem; /* 24px */ --radius-4xl: 2rem; /* 32px */ }
/* ChatGPT Interactive Token 体系(极完整,每个状态独立 Token)*/ :root { /* Primary 按钮的全状态 Token */ --interactive-bg-primary-default: #0d0d0d; /* 默认:近黑 */ --interactive-bg-primary-hover: #0d0d0dcc; /* Hover:80% 透明 */ --interactive-bg-primary-press: #0d0d0de5; /* Press:90% 透明 */ --interactive-bg-primary-inactive: #0d0d0d; /* Disabled */ /* Secondary 按钮 */ --interactive-bg-secondary-default: #0d0d0d00; /* 透明 */ --interactive-bg-secondary-hover: #0d0d0d05; /* 极浅灰背景 */ --interactive-bg-secondary-press: #0d0d0d0d; /* 浅灰按下 */ /* Accent (蓝色) 按钮 */ --interactive-bg-accent-default: #e5f3ff; /* 浅蓝背景 */ --interactive-bg-accent-hover: #cce6ff; /* 中蓝 Hover */ --interactive-bg-accent-press: #99ceff; /* 深蓝 Press */ /* Danger 按钮 */ --interactive-bg-danger-primary-default: #e02e2a; --interactive-bg-danger-primary-hover: #ba2623; --interactive-bg-danger-primary-press: #fa423e; /* Focus Ring */ --interactive-focus-ring-primary: #0d0d0d29; --interactive-focus-ring-secondary: #0d0d0d1f; --interactive-focus-ring-danger: #e02e2a; --interactive-border-focus: #0d0d0d; }
/* ChatGPT Typography Token(真实提取,完整字阶)*/ :root { /* 字体族 */ --font-sans: "-apple-system-body", "ui-sans-serif", "-apple-system", "system-ui", "Segoe UI", "Helvetica", "Apple Color Emoji", "Arial", "sans-serif"; --font-mono: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "monospace"; /* 字号阶梯(含行高比例)*/ --text-xs: .75rem; --text-xs--line-height: calc(1/.75); /* 12px */ --text-sm: .875rem; --text-sm--line-height: calc(1.25/.875); /* 14px */ --text-base: 1rem; --text-base--line-height: calc(1.5/1); /* 16px */ --text-lg: 1.125rem;--text-lg--line-height: calc(1.75/1.125); /* 18px */ --text-xl: 1.25rem; --text-xl--line-height: calc(1.75/1.25); /* 20px */ --text-2xl: 1.5rem; --text-2xl--line-height: calc(2/1.5); /* 24px */ --text-3xl: 1.875rem;--text-3xl--line-height: calc(2.25/1.875); --text-4xl: 2.25rem; --text-4xl--line-height: calc(2.5/2.25); --text-6xl: 3.75rem; --text-6xl--line-height: 1; /* 语义化字阶 */ --text-body-regular: 1rem; --text-body-regular--font-weight: 400; --text-body-emphasized: 1rem; --text-body-emphasized--font-weight: 600; --text-body-small-regular: .875rem; --text-body-small-regular--font-weight: 400; --text-caption-regular: .75rem; --text-caption-regular--font-weight: 400; --text-heading-2: 1.5rem; --text-heading-2--font-weight: 600; --text-heading-app: 1.75rem; --text-heading-app--font-weight: 500; --text-monospace: .9375rem;--text-monospace--font-weight: 400; /* 字重阶梯 */ --font-weight-thin: 100; --font-weight-light: 300; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --font-weight-extrabold: 800; --font-weight-black: 900; }
Apple 语义色体系(HIG 文档)
iOS / iPadOS Semantic Colors(UIKit API)
| 语义名称 | UIKit API | 用途 | 自适应 |
|---|---|---|---|
| Label | label | 主体文本内容 | ✅ Light/Dark 自动 |
| Secondary Label | secondaryLabel | 次要文本(说明、副标题) | ✅ |
| Tertiary Label | tertiaryLabel | 第三级文本 | ✅ |
| Quaternary Label | quaternaryLabel | 第四级文本(水印、占位) | ✅ |
| Placeholder Text | placeholderText | 输入框 placeholder | ✅ |
| System Background | systemBackground | 整体视图背景(最底层) | ✅ 白/黑 |
| Secondary System Background | secondarySystemBackground | 视图内分组背景 | ✅ |
| Tertiary System Background | tertiarySystemBackground | 第三层嵌套背景 | ✅ |
| Separator | separator | 可见分割线 | ✅ |
| Link | link | 超链接文本 | ✅ |
| System Blue | systemBlue | 默认交互强调色(按钮、链接) | ✅ |
关键洞察(事实):Apple 从不硬编码颜色值。所有颜色通过语义 API 定义,系统在 Light/Dark/Increased Contrast 模式下自动切换对应的实际颜色值。这是 Apple Dynamic Color 的本质。
三产品 Token 命名规范对比
| 维度 | 🍎 Apple HIG | ⬡ Claude CDS | ◎ ChatGPT |
|---|---|---|---|
| 命名空间 | 系统原生 API(无前缀) | --cds-* / --_palette / 语义直接命名 | --interactive-* / --text-* / --bg-* |
| 颜色格式 | Dynamic(编译时决定) | HSL 格式(H S% L%) | Hex + RGBA 混合 |
| 层级深度 | 2层(系统色 + 语义色) | 3层(--_palette / --semantic / --component) | 3层(--gray-* / --bg-* / --interactive-bg-*) |
| 命名风格 | camelCase (secondaryLabel) | kebab-case (--text-400) | kebab-case + 修饰符 (--interactive-bg-primary-hover) |
| 私有标识 | 无需(框架封装) | --_double-underscore 私有 | 无特别私有标记 |
| 主题化 | System 自动(traitCollection) | CSS class 切换 [data-theme="dark"] | 完整多主题系统(8 个颜色主题) |
| 状态表达 | 状态通过 UIControl.State | Tailwind 伪类修饰符 | Token 名称内嵌状态(-hover, -press, -inactive) |
颜色系统 Color System
颜色系统的核心不是「哪些颜色好看」,而是「如何让颜色在不同平台、模式、设备上保持一致且可预测」。三产品用不同策略解决了同一个问题。
颜色模型三层结构
Apple Dynamic Color — 自适应颜色系统
Apple 的颜色系统核心是 Dynamic Color:一个颜色对象内部包含多个变体,系统根据当前 trait(Light/Dark、Standard/Increased Contrast、Regular/Compact)自动选择正确的值。开发者永远只使用颜色名称,不关心具体 RGB 值。
Apple 的灰色在 Dark Mode 下方向反转:最深的 systemGray 在亮色下偏深,在暗色下偏浅——这是经过精心设计的层级关系。
// SwiftUI Dynamic Color 使用方式 struct ContentView: View { var body: some View { VStack { // ✅ 推荐:使用语义色,自动适配 Light/Dark Text("主标题") .foregroundColor(.label) // 自动黑/白 Text("副标题") .foregroundColor(.secondaryLabel) // 灰色,自动深浅 // ✅ 背景层级 RoundedRectangle(cornerRadius: 12) .fill(Color(.secondarySystemBackground)) // ✅ 系统强调色 Button("确认") { } .tint(.blue) // .systemBlue 自动适配 Dark Mode // ❌ 不推荐:硬编码颜色 Text("错误示例") .foregroundColor(Color(red: 0, green: 0, blue: 0)) } } }
/* Web 模拟 Apple Dynamic Color 策略 */ :root { /* 语义色定义(Light Mode)*/ --label: #000000; --secondary-label: rgba(60,60,67,.6); --tertiary-label: rgba(60,60,67,.3); --system-background: #ffffff; --secondary-system-background: #f2f2f7; --system-blue: #007AFF; } @media (prefers-color-scheme: dark) { :root { /* 相同名称,不同值——无需改动任何组件代码 */ --label: #ffffff; --secondary-label: rgba(235,235,245,.6); --tertiary-label: rgba(235,235,245,.3); --system-background: #000000; --secondary-system-background: #1c1c1e; --system-blue: #0A84FF; /* 暗色下蓝色略亮 */ } }
Claude 色板分析 真实提取
Claude.ai 的颜色系统有几个值得关注的设计决策:
--accent-brand。温暖、友好、有辨识度。与 AI 助手的「亲和力」定位一致。
100-500 阶梯,UI 交互色。介于青绿色与薄荷绿之间,清爽、专注。
选择 HSL 而非 Hex 的好处:可以通过调整 L(亮度) 生成 Dark Mode 变体,保持色调一致。
hsl(157 52% 65%) /* Dark: L+16 */
ChatGPT 色板分析 真实提取
ChatGPT 有一个精心设计的多主题系统——8 种颜色主题(default/green/blue/orange/pink/purple/red/yellow),每个主题改变用户消息气泡和 Submit 按钮的颜色,而全局语义色不变。
/* ChatGPT 多主题系统(真实提取,8 种颜色方案)*/ :root { /* Default Theme(默认黑色)*/ --theme-user-msg-bg: #e9e9e980; /* 用户消息背景 */ --theme-submit-btn-bg: #000; /* 发送按钮 */ /* Green Theme(品牌绿)*/ --green-theme-user-msg-bg: #d9f4e4; /* 用户消息:浅绿 */ --green-theme-submit-btn-bg: #04b84c; /* 发送按钮:品牌绿 */ /* Blue Theme */ --blue-theme-user-msg-bg: #e5f3ff; /* 浅蓝 */ --blue-theme-submit-btn-bg: #0285ff; /* 蓝色发送按钮 */ /* Purple Theme */ --purple-theme-user-msg-bg: #efe5fe; --purple-theme-submit-btn-bg: #924ff7; /* ...以及 orange, pink, red, yellow 共 8 种 */ }
Dark Mode 实现策略对比
| 策略 | 🍎 Apple | ⬡ Claude | ◎ ChatGPT |
|---|---|---|---|
| 触发机制 | 系统 traitCollection 自动 | CSS media query + data 属性 | CSS class .dark + media query |
| 切换层 | Dynamic Color 对象内部 | :root CSS Variables 重新定义 | .dark 类下 CSS Variables 覆盖 |
| 手动控制 | overrideUserInterfaceStyle | data-theme="dark" 属性 | 添加 .dark class 到 html 元素 |
| 图片处理 | Asset Catalog 双套图 | CSS filter / 多套变量 | CSS filter 或 SVG currentColor |
| 背景关系 | Light: 白底层叠灰 / Dark: 黑底层叠深 | Light: 暖白 / Dark: 暖黑(保留 HSL 色相) | Light: 纯白 / Dark: #212121 近黑 |
Typography 字体排版
排版是 UI 的灵魂。三产品对字体的选择揭示了各自的品牌性格:Apple 的 SF Pro 代表极致工程打磨,Claude 的 Anthropic Serif 是 AI 内容的阅读哲学,ChatGPT 选择系统字体是务实与速度的体现。
Apple — SF Pro 字体家族
主字体,覆盖 iOS/macOS/tvOS。Text 变体用于 <20pt,Display 变体用于 ≥20pt。字体自动切换,开发者无感。
代码块和等宽场景。等宽字符间距设计精细,在 Xcode 和 Terminal 中使用。
Apple 的无障碍字体系统。用户可在设置中调整整体字号,应用中所有文字按比例缩放。
| largeTitle | 34pt/41pt |
| title1 | 28pt/34pt |
| headline | 17pt/22pt SemiBold |
| body | 17pt/22pt |
| footnote | 13pt/18pt |
| caption1 | 12pt/16pt |
Claude — Anthropic 私有字体族 真实提取
• AI 回复(--font-claude-response)= Anthropic Serif(衬线体)— 提升长文可读性
• 用户消息(--font-user-message)= Anthropic Sans(无衬线)— 输入更自然
• 代码块(--font-anthropic-mono)= Anthropic Mono — 专为代码优化
为什么用衬线字体?研究表明,衬线字体在长段落阅读中引导视线更流畅(横线连接字母形成阅读轨道)。Claude 的回复通常是多段长文,衬线体降低阅读疲劳。这是一个刻意的、有研究支撑的设计决策。
字体即区分:用户输入和 AI 回复使用不同字体,形成视觉区分,无需依赖气泡颜色来分辨「谁在说话」。这是对话界面设计的巧妙解法。
ChatGPT — 系统字体策略 真实提取
/* ChatGPT 字体声明(真实提取)*/ --font-sans: "-apple-system-body", "ui-sans-serif", "-apple-system", "system-ui", "Segoe UI", "Helvetica", "Apple Color Emoji", "Arial", "sans-serif", "Segoe UI Emoji", "Segoe UI Symbol"; /* 注意:-apple-system-body 是首选项 */ /* 它是 Apple 的 Dynamic Type body 字号的特殊引用符 */ /* 在 iOS 上会跟随用户的「文字大小」设置自动调整 */ --font-mono: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", "monospace";
策略解读(观点):ChatGPT 不使用私有字体,原因可能是:① 全球化 = 多语言,系统字体对 CJK 等非拉丁字体有原生支持;② 减少加载时间(字体文件 0 字节);③ 用户在各平台上看到的是「最熟悉」的字体,降低认知负担。代价是牺牲了品牌辨识度。
Markdown 渲染排版对比
| 元素 | ⬡ Claude | ◎ ChatGPT |
|---|---|---|
| 正文 | Anthropic Serif 16px/1.7 — 书籍质感 | 系统字体 16px/1.625 — 现代感 |
| H1/H2 | Anthropic Sans(切换回无衬线) | 系统字体 + font-weight: 600 |
| 代码块 | Anthropic Mono — 深色背景 | SF Mono/Menlo — 深色背景 |
| 行内代码 | Anthropic Mono + bg-100 背景 | SF Mono + #f3f3f3 背景 |
| 引用块 | 左侧 3px 品牌橙色线 + 左缩进 | 左侧灰色线 + 斜体 |
| 表格 | 圆角 + 斑马纹 + 边框 | 简洁边框 + hover 高亮 |
间距与布局 Spacing & Layout
间距是设计中最容易被忽视却最影响「感觉」的元素。8px 网格不是规则,是一种对齐哲学。对话界面的间距逻辑与传统 UI 存在本质差异。
8px Grid 原理
8px 基准网格的核心逻辑:大多数设备屏幕的物理像素是 8 的倍数,8px 的倍数间距在任何缩放比例下都不会产生「半像素」模糊。同时 8 可被 2、4 整除,方便建立清晰的层级关系。
0.5×
1×
1.5×
2×
3×
4×
5×
6×
8×
10×
对话界面布局哲学
对话区域居中布局,最大宽度约 680px(约 75 字符/行,阅读最优宽度)。侧边栏固定 260px,主内容区留白充分。
260px
相似的居中布局,Composer(输入区)设计更复杂——内置工具栏(文件/图片/搜索/语音),底部有辅助功能行。
260px
间距 Token 对比 真实数据
| 场景 | 🍎 Apple HIG | ⬡ Claude | ◎ ChatGPT |
|---|---|---|---|
| 基础单位 | 4pt (屏幕 = 8px) | --cds-radius: 0.25rem (4px) | --spacing: 0.25rem (4px) = 1 unit |
| 消息气泡 Padding | 16pt 内边距(推荐) | 约 12px 垂直 / 16px 水平 | user-msg: ~12px 16px,圆角 24px |
| 消息间距 | N/A(非对话产品) | 连续回复约 8px,大段约 16px | 约 16px 消息间距 |
| 输入框高度 | 44pt 最小触控高度 | min-height: 44px 至多行自增 | min-height: 52px,含工具行 |
| 侧边栏宽度 | 320pt(iPhone 全屏) | 约 260px (w-64 in Tailwind) | 260px(--sidebar-surface-primary) |
组件体系 Component System
按 Atomic Design 方法论,从最小原子到完整有机体,逐层解析三产品的组件设计决策。每个组件包含解剖图、状态集和真实代码。
Atomic Design 五层
Input / Prompt Bar 对比
⬡ Claude Prompt Bar
◎ ChatGPT Composer
Message Bubble — 核心对话组件
AI:无气泡,左对齐 · 用户:浅灰气泡,右对齐。字体差异区分角色。
AI:无气泡,左对齐 · 用户:--message-surface 气泡,右对齐。均使用系统字体。
状态与反馈 States & Feedback
AI 产品的「状态」比传统 UI 更复杂——有一种传统产品从未有过的状态:Streaming(实时生成中)。本章重点解析打字机效果的实现原理。
交互状态完整体系
| 状态 | 触发条件 | 视觉表现 | ChatGPT Token(真实) |
|---|---|---|---|
| Default | 初始静止 | 标准外观 | --interactive-bg-primary-default: #0d0d0d |
| Hover | 鼠标悬浮 | 背景变亮/深,光标 pointer | --interactive-bg-primary-hover: #0d0d0dcc |
| Focus | 键盘 Tab 聚焦 | Focus Ring(无障碍必需) | --interactive-focus-ring-primary: #0d0d0d29 |
| Active/Press | 鼠标按下 | 轻微缩放 + 背景变深 | --interactive-bg-primary-press: #0d0d0de5 |
| Disabled | 功能不可用 | opacity 0.4,cursor not-allowed | --interactive-bg-primary-inactive |
| Loading | 异步请求中 | Spinner 或 Skeleton | 自定义动画 |
| Streaming | AI 生成中(AI 产品专有) | 文字流入 + 光标闪烁 | 无专用 Token,JS 控制 |
| Error | 操作失败 | 红色边框/文字 + 错误提示 | --interactive-bg-danger-*系列 |
Loading & Skeleton
HIG 规定:少于 2 秒的等待不需要进度指示;2-10 秒用 Activity Indicator(转圈);超过 10 秒必须用 Progress View(进度条)并允许取消。
Skeleton 比 Spinner 体验更好:用户能看到内容「形状」,感知到即将加载的内容结构,减少焦虑感。
Streaming 打字机效果 — AI 专属状态
Streaming 是 AI 产品特有的 UX 模式:服务端实时推送 token,前端逐字渲染。它不只是「显示 Loading」,而是让用户感知到 AI「正在思考和表达」,减少等待焦虑,同时允许用户提前阅读和判断是否需要中止。
/* 打字机光标 CSS */ .streaming-cursor { display: inline-block; width: 2px; height: 1em; background: currentColor; /* 继承文本颜色 */ vertical-align: text-bottom; margin-left: 1px; animation: blink 1s step-end infinite; } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } /* 生成完毕后隐藏光标 */ .streaming-cursor.done { display: none; } /* 尊重用户减少动效偏好 */ @media (prefers-reduced-motion: reduce) { .streaming-cursor { animation: none; opacity: 1; } }
// Streaming 文字渲染核心逻辑(基于 SSE / ReadableStream) async function streamResponse(prompt, container) { const cursor = container.querySelector('.streaming-cursor'); let buffer = ''; // 使用 fetch + ReadableStream 接收流式数据 const response = await fetch('/api/stream', { method: 'POST', body: JSON.stringify({ prompt }) }); const reader = response.body.getReader(); const decoder = new TextDecoder(); while (true) { const { done, value } = await reader.read(); if (done) break; // 解析 SSE 格式: "data: {token}\n\n" const chunk = decoder.decode(value); const lines = chunk.split('\n'); for (const line of lines) { if (line.startsWith('data: ')) { const token = JSON.parse(line.slice(6)).text; buffer += token; // 直接追加文本,不 re-render 整体(性能关键) container.insertBefore( document.createTextNode(token), cursor ); // 自动滚动到最新内容 container.scrollIntoView({ block: 'end', behavior: 'smooth' }); } } } // 完成:隐藏光标,触发 Markdown 渲染 cursor.classList.add('done'); renderMarkdown(container, buffer); }
/* Claude vs ChatGPT Streaming 渲染策略对比 */ /* ┌─────────────────────┬─────────────────────────────┬─────────────────────────────┐ │ 维度 │ Claude │ ChatGPT │ ├─────────────────────┼─────────────────────────────┼─────────────────────────────┤ │ 字体 │ Anthropic Serif(衬线) │ 系统字体(无衬线) │ │ Markdown 时机 │ 流式逐渐渲染标题/列表 │ 完成后统一渲染 │ │ 代码块处理 │ 流式显示原始文本,完成后高亮 │ 相同策略 │ │ 停止按钮 │ ■ Stop generating │ ■ Stop(全圆按钮) │ │ 消息追加 │ createTextNode 插入光标前 │ innerHTML 或类似策略 │ │ 动效 │ 无额外动效,纯文字流入 │ 文字淡入(极轻微) │ └─────────────────────┴─────────────────────────────┴─────────────────────────────┘ */ /* ChatGPT 专用:Stop 按钮在 Streaming 时替换 Send 按钮 */ .send-btn[data-streaming="true"] { background: var(--interactive-bg-primary-default); /* 内部图标从 ↑ 切换为 ■ */ }
Dark Mode 实现
Dark Mode 不是「把白色改成黑色」——它是一套完整的颜色系统切换。三产品的实现策略各有特点,本章给出完整的可用代码。
三产品策略对比
| 策略层面 | 🍎 Apple | ⬡ Claude | ◎ ChatGPT |
|---|---|---|---|
| 自动检测 | UITraitCollection.userInterfaceStyle | prefers-color-scheme CSS media | prefers-color-scheme + JS 同步 |
| 手动切换 | overrideUserInterfaceStyle | html[data-theme="dark"] | html.dark class |
| 背景色策略 | Light:#fff → Dark:#000 (不对称) | Light:暖白(60,14%,97%) → Dark:暖黑 | Light:#fff → Dark:#212121 |
| 文本对比度 | Increased Contrast 模式单独支持 | HSL 亮度微调 | 独立深色文本 Token |
| 颜色「翻转」 | Dynamic Color 内置逻辑(非简单翻转) | HSL 保持色相,改变 L 值 | 完整独立 Token 集 |
Token 层切换实现
--text-primary),在 :root 中根据主题更新 Token 的值。这样组件代码本身 0 修改。
完整 Dark Mode Token 系统
/* 方案一:Media Query(自动跟随系统,无手动切换)*/ :root { /* Light Mode Tokens */ --bg-primary: #ffffff; --text-primary: #0d0d0d; --text-secondary: #5d5d5d; --border-default: rgba(13,13,13,0.15); --surface-1: #f9f9f9; --surface-2: #f3f3f3; } @media (prefers-color-scheme: dark) { :root { /* Dark Mode:相同 Token 名,不同值 */ --bg-primary: #212121; /* ChatGPT 深色背景 */ --text-primary: #ececec; /* 近白文本 */ --text-secondary: #9b9b9b; /* 灰色辅助文本 */ --border-default: rgba(255,255,255,0.1); --surface-1: #2f2f2f; --surface-2: #424242; } }
/* 方案二:CSS Class(支持手动切换,ChatGPT 策略)*/ :root { --bg-primary: #ffffff; --text-primary: #0d0d0d; /* ...其他 Light Token */ } /* html.dark 时覆盖 Token */ html.dark { --bg-primary: #212121; --text-primary: #ececec; /* ...其他 Dark Token */ } /* JavaScript 切换逻辑 */ /* function toggleDark() { document.documentElement.classList.toggle('dark'); localStorage.setItem('theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light' ); } // 页面加载时恢复偏好 const saved = localStorage.getItem('theme'); if (saved === 'dark' || (!saved && matchMedia('(prefers-color-scheme:dark)').matches)) { document.documentElement.classList.add('dark'); } */
/* 方案三:混合方案(推荐)= Class 覆盖 + Media 兜底 */ :root { /* Light tokens... */ --bg-primary: #fff; --text-primary: #0d0d0d; } /* 手动选择亮色(强制覆盖系统偏好)*/ html[data-theme="light"] { --bg-primary: #fff; --text-primary: #0d0d0d; } /* 手动选择暗色 */ html[data-theme="dark"] { --bg-primary: #212121; --text-primary: #ececec; } /* 未手动设置时跟随系统(兜底)*/ @media (prefers-color-scheme: dark) { html:not([data-theme]) { --bg-primary: #212121; --text-primary: #ececec; } } /* HSL 版本(Claude 策略:保持色相)*/ html[data-theme="dark"] { --bg-100: hsl(60 3% 10%); /* Light: hsl(60,14%,97%) → Dark: 同色相,L:97→10 */ --text-100: hsl(0 0% 93%); /* Light: hsl(0,0%,7%) → Dark: L:7→93(翻转)*/ }
Motion & Animation 动效
ChatGPT 拥有迄今发现最精密的 Spring 动画函数库(5种变体),从 CSS 直接提取。Apple 的 Fluid Animation 是物理引擎级别的动效。本章完整收录真实数据。
动效设计原则
动画应该感觉物理真实。Spring 动画(弹簧物理)比 ease 曲线更自然——物体不会突然停止,而是弹跳减速。response(响应速度)+ damping(阻尼)两个参数控制。
克制的动效。侧边栏展开、消息淡入使用标准 ease(--cds-ease-out: cubic-bezier(0,0,.2,1))。不追求炫技,专注于引导注意力。
完整的 Spring 函数库(5种:fast/common/slow-bounce/bounce/fast-bounce),使用 CSS linear() 函数模拟物理弹簧。每种 spring 有对应 duration Token,精度极高。
ChatGPT Spring 动画库 真实提取
/* ===== ChatGPT Spring Animation Library(真实提取,2025.05)===== */ /* 使用 CSS linear() 函数精确模拟物理弹簧运动曲线 */ :root { /* 1. Fast Spring — 快速响应,0.667s,无弹跳 */ --spring-fast-duration: .667s; --spring-fast: linear(0, .01942 1.83%, .07956 4.02%, .47488 13.851%, .65981 19.572%, .79653 25.733%, .84834 29.083%, .89048 32.693%, .9246 36.734%, .95081 41.254%, .97012 46.425%, .98361 52.535%, .99665 68.277%, .99988); /* 2. Common Spring — 标准动效,0.667s,轻微弹跳 */ --spring-common-duration: .667s; --spring-common: linear(0, .00506 1.18%, .02044 2.46%, .08322 5.391%, .46561 17.652%, .63901 24.342%, .76663 31.093%, .85981 38.454%, .89862 42.934%, .92965 47.845%, .95366 53.305%, .97154 59.516%, .99189 74.867%, .9991); /* 3. Slow Bounce — 慢速弹跳,1.167s,明显超调 */ --spring-slow-bounce-duration: 1.167s; --spring-slow-bounce: linear(0, .00172 0.51%, .06135 3.29%, .59552 14.171%, .79359 18.962%, .92924 23.822%, 1.01 29.083%, 1.0264 31.043%, 1.04411 35.404%, 1.04597 37.944%, 1.04058 42.454%, 1.01119 55.646%, .99791 74.127%, .99988); /* 4. Bounce — 常规弹跳,0.833s */ --spring-bounce-duration: .833s; /* 5. Fast Bounce — 快速弹跳,1s */ --spring-fast-bounce-duration: 1s; /* 6. Elegant Spring(超精密,0.58s)— 用于页面级过渡 */ --easing-spring-elegant-duration: .58171s; /* linear() 参数长达 400+ 个数据点,精度极高 */ } /* 使用示例 */ .sidebar-open { transition: transform var(--spring-common-duration) var(--spring-common); } .modal-enter { animation: modal-scale var(--spring-slow-bounce-duration) var(--spring-slow-bounce); }
常见动效模式
| 场景 | 🍎 Apple | ⬡ Claude | ◎ ChatGPT |
|---|---|---|---|
| 侧边栏展开 | Spring(response:0.35, damping:0.8) | --cds-ease-out, 300ms | --spring-common, 0.667s |
| 页面切换 | Fluid slide + fade | Tailwind fade-in | --easing-spring-elegant, 0.58s |
| 弹出框 | Scale + opacity spring | scale(0.95)→scale(1) + opacity | --spring-slow-bounce(1.167s,弹跳感) |
| 按钮按下 | scale(0.97) spring | transform scale CSS | background color transition only |
| Toast/通知 | Slide + spring | translate-y + fade | --spring-fast-bounce(1s) |
Accessibility 无障碍
Apple 是无障碍领域的行业领先者,连续多年获得无障碍奖项。WCAG 2.1 是 Web 无障碍的法律基础。AI 对话界面有其特殊的无障碍挑战。
WCAG 2.1 核心标准
Apple 无障碍领先体系
内置屏幕朗读器,覆盖全平台。SwiftUI 组件自动获得正确的无障碍描述,开发者几乎无需额外工作。
.accessibilityHint("双击以发送")
用户在设置中调整「文字大小」,所有 App 文字等比缩放。还包括「辅助大号文字」可达 310% 大小。要求:不截断文字,布局要适配。
「增强对比度」模式下,系统颜色自动切换到更高对比度变体。Apple 为每个 Dynamic Color 提供了 4 个变体(Light/Dark × Standard/HighContrast)。
对话界面的特殊无障碍挑战
对话界面 ARIA 代码示例
<!-- 对话界面无障碍完整实现 --> <!-- 消息列表:使用 log 角色,polite 模式(新消息朗读不打断)--> <main role="log" aria-label="对话消息" aria-live="polite" aria-relevant="additions"> <!-- 每条消息 --> <article role="article" aria-label="Claude 的回复"> <p>这是 AI 的回复内容...</p> </article> <!-- Streaming 区域:assertive 让屏幕阅读器实时朗读 --> <div aria-live="assertive" aria-label="Claude 正在生成回复" role="status"> <!-- 流式内容追加到这里 --> </div> </main> <!-- 输入区域 --> <form role="form" aria-label="发送消息"> <label for="message-input" class="sr-only"> 输入消息 </label> <textarea id="message-input" aria-multiline="true" aria-label="输入消息,按 Enter 发送,Shift+Enter 换行" placeholder="Message Claude..." ></textarea> <button type="submit" aria-label="发送消息"> <svg aria-hidden="true">...</svg> <!-- 图标隐藏于 AT --> </button> </form> <!-- 屏幕阅读器专用样式 --> .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
行业标准完整对照矩阵
五大设计系统的全维度横向对比,帮助决策「学习什么」、「采用什么标准」。
五产品完整对比矩阵
| 维度 | 🍎 Apple HIG | ⬡ Claude | ◎ ChatGPT | ☁ Google Material | 🐜 Ant Design |
|---|---|---|---|---|---|
| Token 架构 | ★★★★★ | ★★★★ | ★★★★★ | ★★★★★ | ★★★ |
| 颜色系统 | ★★★★★ Dynamic Color | ★★★★ HSL 语义色 | ★★★★★ 8主题+语义 | ★★★★★ Material Color | ★★★ Less 变量 |
| 字体体系 | ★★★★★ SF Pro 私有 | ★★★★★ Anthropic 三套 | ★★★ 系统字体 | ★★★★ Roboto | ★★★ 系统字体 |
| 组件命名 | ★★★★★ SwiftUI API | ★★★★ CDS 规范 | ★★★★★ 完整状态命名 | ★★★★★ Material 组件 | ★★★★★ React 组件 |
| Dark Mode | ★★★★★ Dynamic Color | ★★★★ Token 切换 | ★★★★ Class 切换 | ★★★★★ 完整支持 | ★★★ 部分支持 |
| Motion/动效 | ★★★★★ Spring 物理 | ★★★ 标准 ease | ★★★★★ Spring 函数库 | ★★★★ Material Motion | ★★★ 基础过渡 |
| Accessibility | ★★★★★ 行业最佳 | ★★★★ 良好 | ★★★★ 良好 | ★★★★★ WCAG 完整 | ★★★ 部分 |
| 文档完整度 | ★★★★★ 完全公开 | ★★ 源码反推 | ★★ 源码反推 | ★★★★★ 完全公开 | ★★★★★ 完全公开 |
| AI/对话场景 | ★ 无原生支持 | ★★★★★ 专为 AI 设计 | ★★★★★ 专为 AI 设计 | ★★ 通用 | ★★ 通用 |
| 多主题化 | ★★★★ Accent Color | ★★★ 字体/颜色偏好 | ★★★★★ 8 种颜色主题 | ★★★★★ Material You | ★★★★ CSS 变量 |
分析解读
实战 — 从三产品提炼可复用模式
基于前 11 章的研究,提炼出可直接应用于 AI 对话产品的设计模式,并提供一套完整的「AI 对话产品 Design System 模板」。
向 Claude 学:对话界面的间距与字体哲学
/* 可复用模式:对话字体区分 */ .message-ai { font-family: var(--font-serif); /* 衬线:AI 长文可读 */ font-size: 1rem; line-height: 1.75; /* 宽松行距,减少疲劳 */ } .message-user { font-family: var(--font-sans); /* 无衬线:输入自然 */ font-size: 1rem; line-height: 1.6; } /* 消息容器最大宽度 = 约 75 字符 */ .chat-content { max-width: 680px; margin: 0 auto; padding: 0 1.5rem; }
向 Apple 学:语义化颜色的最佳实践
/* AI 对话产品最小语义 Token 集(参考三产品提炼)*/ :root { /* 背景 */ --color-bg: #ffffff; /* 页面底层 */ --color-surface-1: #f9f9f9; /* 侧边栏、卡片 */ --color-surface-2: #f3f3f3; /* 悬浮元素 */ /* 文本 */ --color-text-primary: #0d0d0d; --color-text-secondary: #5d5d5d; --color-text-muted: #9b9b9b; /* 边框 */ --color-border: rgba(13,13,13,0.12); --color-border-focus: #0d0d0d; /* 交互 */ --color-accent: #0285ff; /* 链接/按钮/焦点 */ --color-user-msg-bg: #e9e9e980; /* 用户消息气泡 */ /* 状态 */ --color-danger: #e02e2a; --color-success: #04b84c; --color-warning: #e25507; } @media (prefers-color-scheme: dark) { :root { --color-bg: #212121; --color-surface-1: #2f2f2f; --color-surface-2: #424242; --color-text-primary: #ececec; --color-text-secondary: #9b9b9b; --color-text-muted: #5d5d5d; --color-border: rgba(255,255,255,0.1); --color-border-focus: #ececec; --color-user-msg-bg: #2f2f2f; } }
向 ChatGPT 学:快速迭代下保持设计一致性
| 策略 | 实现方式 | 适用规模 |
|---|---|---|
| Token 命名内嵌状态 | --btn-bg-primary-hover 而非猜测颜色 | 中大型团队,快速迭代 |
| 多主题预设 | 定义 --theme-* 变量,运行时切换 | 需要品牌定制的 B2B 产品 |
| 完整 Interactive Token | 每个交互元素所有状态 Token 预定义 | 设计-研发协作紧密的团队 |
| Spring 动画 Token 化 | 统一 duration + easing 变量,禁止散写 | 追求动效一致性的产品 |
AI 对话产品 Design System 完整模板
/* * AI 对话产品 Design System Template * 综合 Apple · Claude · ChatGPT 最佳实践 * 基于三产品真实 Token 提炼 */ :root { /* ========== FOUNDATION ========== */ /* 字体(参考 Claude:区分 AI 与用户)*/ --font-ai-response: Georgia, "Times New Roman", serif; --font-user-input: -apple-system, system-ui, sans-serif; --font-ui: -apple-system, system-ui, sans-serif; --font-code: ui-monospace, "SF Mono", Menlo, monospace; /* 字阶(参考 ChatGPT Token)*/ --text-xs: .75rem; /* 12px */ --text-sm: .875rem; /* 14px */ --text-base: 1rem; /* 16px */ --text-lg: 1.125rem; /* 18px */ --text-xl: 1.25rem; /* 20px */ --text-2xl: 1.5rem; /* 24px */ /* 圆角(参考 ChatGPT Token)*/ --radius-sm: .25rem; /* 按钮/小元素 */ --radius-md: .5rem; /* 卡片/输入框 */ --radius-lg: 1rem; /* 模态框 */ --radius-full: 999px; /* 胶囊按钮/头像 */ --radius-msg: 18px 18px 4px 18px; /* 消息气泡(右下角截断)*/ /* 动效(参考 ChatGPT Spring)*/ --ease-standard: cubic-bezier(0.4, 0, 0.2, 1); --ease-decelerate: cubic-bezier(0, 0, 0.2, 1); --duration-fast: 150ms; --duration-normal: 250ms; --duration-slow: 400ms; /* ========== SEMANTIC TOKENS (Light) ========== */ /* 背景层级(参考 Apple 三层)*/ --bg: #ffffff; --bg-1: #f9f9f9; /* 侧边栏/卡片 */ --bg-2: #f3f3f3; /* 嵌套卡片 */ --bg-inverse: #0d0d0d; /* 深色背景按钮 */ /* 文本层级 */ --text-1: #0d0d0d; /* 主文本 */ --text-2: #5d5d5d; /* 辅助文本 */ --text-3: #9b9b9b; /* 占位/禁用 */ --text-on-dark: #ffffff; /* 深色背景上的文本 */ /* 对话专用 */ --msg-user-bg: rgba(233,233,233,0.5); /* 用户气泡背景 */ --msg-ai-bg: transparent; /* AI 无背景 */ --composer-bg: rgba(233,233,233,0.5); /* 输入框背景 */ --sidebar-bg: #f9f9f9; /* 交互颜色(参考 ChatGPT Interactive Token)*/ --btn-primary-bg: #0d0d0d; --btn-primary-bg-hover: rgba(13,13,13,0.8); --btn-primary-bg-active: rgba(13,13,13,0.9); --btn-primary-text: #ffffff; /* 边框 */ --border: rgba(13,13,13,0.1); --border-heavy: rgba(13,13,13,0.2); --border-focus: #0d0d0d; /* 状态色 */ --color-error: #e02e2a; --color-success: #04b84c; --color-warning: #e25507; --color-info: #0285ff; /* 阴影 */ --shadow-sm: 0 1px 3px rgba(0,0,0,0.1); --shadow-md: 0 4px 12px rgba(0,0,0,0.15); --shadow-lg: 0 10px 24px rgba(0,0,0,0.15); } @media (prefers-color-scheme: dark) { :root:not([data-theme]), [data-theme="dark"] { --bg: #212121; --bg-1: #2f2f2f; --bg-2: #424242; --bg-inverse: #ffffff; --text-1: #ececec; --text-2: #9b9b9b; --text-3: #5d5d5d; --text-on-dark: #0d0d0d; --msg-user-bg: rgba(255,255,255,0.07); --composer-bg: rgba(255,255,255,0.07); --sidebar-bg: #171717; --btn-primary-bg: #ffffff; --btn-primary-bg-hover: rgba(255,255,255,0.8); --btn-primary-text: #0d0d0d; --border: rgba(255,255,255,0.08); --border-heavy: rgba(255,255,255,0.15); --border-focus: #ececec; } }
Design System 手册 v2 · Apple · Claude · ChatGPT 真实案例版
所有 Token 数据通过浏览器直接提取(2025年5月)· Apple HIG 文档原文引用
由 Wayne (ai2way) 委托 Claude 研究和编写 · wwei.ai