Communitygithub.com

CDS 前端(设计/实现/重构)

设计、实现或重构 Claude 设计系统(CDS)风格的前端 UI,包括 Claude Desktop 的视觉语言、标记、动效和交互防护。适用于构建或重构聊天/编辑器/侧边栏/Agent工作站界面、选择标记、圆角、密度或动效,或审计 UI 是否符合 CDS 规范。

实现/重构) 是什么?

该技能提供了一个完整的工作流程,用于在 Claude Desktop 生态系统中开发符合 Claude 设计系统(CDS)风格的前端 UI。它基于开源仓库 open-claude-ui,该仓库包含了标记(tokens)、预设(presets)和组件等真相来源。技能涵盖 CDS 1.x 和 2.0 两个基准版本,用户需在任务开始时选择并保持一致。核心原则包括:优先复用现有组件和标记,所有颜色、圆角、持续时间和缓动函数都必须使用 —cds-* CSS 变量或 Tailwind 别名,严禁硬编码值。动效选择有明确的决策规则:基本交互优先使用纯 CSS 结合标记,而依赖速度或布局的动效用 Framer Motion 预设。技能还强调了非协商性防护措施,如 IME 输入处理、流式滚动行为、iframe 安全性、离线持久化、环境不可变性,以及焦点管理。重构和审计部分提供了一个 checklist,用于扫描并替换硬编码值和不安全的模式。最终输出要求明确基准版本、复用的模块、选择的标记/预设及其理由,以及验证结果。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Praying/cds-frontend-skill/tree/HEAD/skills/cds-frontend

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

CDS 前端(设计 / 实现 / 重构)

真相来源是上游仓库 https://github.com/Caho1/open-claude-ui (MIT):AGENTS.md(标记、预设、组件)、code-examples/ 和 docs/v2/(Claude Desktop 2.0,v2.37337.1)。以下路径相对于该仓库;请克隆或打开它,或者直接在 GitHub 上阅读。本技能是工作流,并不重复这些值。当任务涉及 v2 行为(密度、侧边栏、工作量、编辑器动效、离线队列)时,请阅读 references/v2-delta.md。

0. 先选择基准版本

  • CDS 1.x(code-examples/ 中的默认值):暖色粘土强调色、20px 编辑器、8px 圆角、Framer Motion 弹簧动效。
  • CDS 2.0(docs/v2):冷色 #FCFCFB 画布、12/14px 编辑器、6/8px 圆角、24/32px 控件、CSS-编辑器动效。 询问或推断选择哪个版本;不要在同一个界面中混用。许多 v2 标记(--cds-h-control、data-density)在文档中有记录,但尚未在 code-examples/cds-theme.css 中定义:使用前请先定义它们。

1. 工作流

  1. 分类任务:新组件 / 重写样式 / 重构 / 审计。
  2. 先复用再编写:检查 code-examples/(30 个模块,索引见 AGENTS.md §3)和 src/index.ts。组合或扩展,不要重新推导。
  3. 标记:每个颜色、圆角、持续时间和缓动函数都必须来自 --cds-* 变量或 Tailwind 别名。禁止原始十六进制值,禁止临时 ms。
  4. 动效:根据下表选择。
  5. 边缘防护(第 3 节)适用于所有输入、滚动或 iframe 代码。
  6. 验证(第 4 节)。逐字报告失败情况。

2. 决策规则

动效选择

场景使用
悬停/按下/淡入/骨架屏/入场,任何在流式传输期间运行的内容纯 CSS + --cds-dur-* + --cds-ease-*(仅组合器属性:transform、opacity、filter)
拖拽释放、依赖于速度或布局的宽高Framer Motion 并使用 SPRING_BOUNCY / SNAPPY / GENTLE / HEAVY_SNAP 之一
减少动效直接跳转,绝不删除状态变化。遵循 prefers-reduced-motion
绝对不要用 transition: all,绝对不要用 linear,绝对不要硬编码弹簧数值。使用 var(--cds-dur-*) 的 transition 简写在标记未定义时会静默失效,因此请定义全部五个(60ms/120/200/300/450)。

表面和边框:使用 surface-0..3 分层 + 极细 border-subtle(v2 中为 0.5px)。仅一层描边:带边框容器内部的控件设 border-none。使用 color-mix() 从表面派生阴影,而不是固定的 alpha 黑色。永远不要用纯 #000/#fff(代码块 #0d0d0c 除外)。

密度:使用 --cds-h-control / --cds-radius / --cds-icon 控制尺寸,永远不要用固定 px,从而兼容紧凑和舒适两种模式。低于 44px 点击区域的紧凑行使用负外边距触摸扩展(--cmp-chin-touch-grow)。

数字:任何计时器、计数器、标记计量、行号都使用 tabular-nums。

信息设计(v2 立场):一个工作站,而不是聊天玩具。优先使用密集的状态行(28px、分支、PR、运行心跳)而不是宽敞的卡片;明确展示成本和风险(带 Max 警告的工作量层级、使用计量表);将用户输入视为宝贵的资源。

3. 非协商性防护措施

  • IME:在任意 Enter 发送操作之前,必须先执行 if (e.nativeEvent.isComposing || e.keyCode === 229) return;。
  • 流式滚动:如果 Date.now() - lastUserScroll < 150,不要自动固定;仅在距离底部 40px 以内时固定。
  • 模型生成的 HTML 的 iframe:使用不含 allow-same-origin 的沙箱,使用经过来源检查的 postMessage,并通过 navigator.userActivation 进行门控。
  • 零丢失输入:失败的/离线的发送应持久化(IndexedDB 队列)并在重新加载时恢复。
  • 环境不可变性:上下文窗口/工作树/MCP 配置在创建会话后即被冻结;不要构建能在会话中编辑它们的 UI。
  • 无二进制资源(.ttf/.otf/.mp3/.wav);仅使用系统字体栈和 Web Audio 合成。
  • 必须同时检查浅色模式(:root)和深色模式(.dark)。没有冷紫色/霓虹渐变(1.x)。
  • 键盘:列表/网格使用轮播焦点(useClaudeRovingFocus);对话框使用焦点陷阱。

4. 重构 / 审计检查清单

在目标代码中搜索:十六进制字面量、rounded-[…px]、transition-all、ease-linear、duration-[…]、预设外的 stiffness:、缺少 IME 防护的 onKeyDown + Enter、流式代码中的 scrollTo/scrollTop =、allow-same-origin、嵌套在带边框父元素内的 1px 边框。将它们逐个替换为标记/预设/防护措施。保持行为不变;除非另有要求,否则仅更改表现。

然后运行以下命令,所有必须返回 0 退出码:

npm run typecheck && npm run check:tokens && npm run build

如果你向 AGENTS.md 添加了 --cds-* 引用,则 check:tokens 要求该引用必须存在于 cds-theme.css 中。

5. 输出约定

声明所选基准(1.x/2.0)、复用了哪些现有模块、选择了哪些标记/预设及其原因,以及验证结果。标记任何未经验证的内容(例如视觉深色模式检查)为“未验证”。

相关技能