--- title: "第二篇:基础原子组件与交互控件" part: 2 category: cds-manual domain: "Foundational Atoms & Controls" ---

[⬅️ 上一篇:第一篇:设计哲学与设计令牌体系](01-设计哲学与设计令牌体系.md) · [📚 返回总目录](Claude%20Design%20System%20(CDS).md) · [下一篇:第三篇:会话核心流与指令交互引擎 ➡️](03-会话核心流与指令交互引擎.md)

--- ## 第二篇:基础原子组件与交互控件 > **技术领域与英文指代**:`Foundational Atoms & Controls` 依托 **REA (Reverse Engineer Anything) v6.5.0** 对官方最新版 Claude Desktop (`/Applications/Claude.app`,`@ant/desktop v2.37337.1`,ASAR 证据 `ev_e0bd89cee50a5b7d0dbf9e75cef5dfbca2bcb1699df4d4371449dd08452a8358`) 的逆向取证,本篇系统性拆解 Claude 基础交互控件的生产级 DOM 结构、CSS 实用类组合与原生物理微交互算法。 --- ### 2.1 全能按钮控件阶梯 > **技术领域与英文指代**:`Buttons & Controls - CdsButton / [data-cds="Button"]` #### 2.1.1 控件高度标尺与排版尺寸矩阵 依据 REA 对 `shared-frame-BfjMqbuN.js` 与 `c6a992d55-sXiDGMFQ.css` 的逆向提取,Claude 绝非使用粗放的 4 级尺寸,而是构建了严苛的 **5 阶高度标尺**,并通过桌面端光学缩放因子 `--cds-rem-scale: calc(16 / 17)`(≈ 0.941176)进行亚像素对齐: | 尺寸代号 | CSS 表达式 (Rem Scale) | 桌面端实际像素 | 内边距 (`padding`) | 圆角 (`radius`) | 字体与排版角色 | | :--- | :--- | :--- | :--- | :--- | :--- | | **`xxs`** (`data-step="1"`) | `calc(1.25rem * scale)` | **18.82px (约 19px)** | `px-1.5 py-0` | `--radius-sm` (4px) | `11px` Caption,极紧凑行内重试、次级小动作 | | **`xs`** | `calc(1.5rem * scale)` | **22.59px (约 23px / 24px)**| `px-2 py-0.5` | `--radius-md` (6px) | `11.5px` Footnote,标签删除、代码块辅助栏 | | **`sm`** | `calc(1.75rem * scale)` | **26.35px (约 26px / 28px)**| `px-2.5 py-1` | `--radius-lg` (8px) | `12.5px`,下拉菜单项、输入框内操作胶囊 | | **`md` (官方默认)** | `calc(2rem * scale)` | **30.12px (约 32px)** | `px-3.5 py-1.5` | `--radius-lg` (8px) | `13.5px` Body,**标准交互动作、表单确认** | | **`lg`** | `calc(2.5rem * scale)` | **37.65px (约 40px)** | `px-5 py-2` | `--radius-xl` (12px) | `15px` Heading,全局首要引导、登录主操作 | | **`icon`** (纯图标) | 固定正方形宽高比 | `aspect-square w-control` | `p-0` | `--radius-lg` (8px) | 工具栏独立图标操作(如关闭、复制、更多) | > [!NOTE] > **嵌套控件高度衰减公式 (`--cds-h-control-nested`)**: > 当按钮被嵌套在 Composer 或工具栏容器中时,Claude 自动切换为嵌套高度变量: > `nested-xs: calc(1.125rem * scale)` (17px) / `nested-sm: calc(1.25rem * scale)` (18.8px) / `nested-default: calc(1.375rem * scale)` (20.7px) / `nested-lg: calc(1.75rem * scale)` (26.35px)。 --- #### 2.1.2 生产级 6 大核心变体契约 (Variants Architecture) REA 逆向揭示,Claude 的按钮组件由两层结构正交构成:**外层交互重置壳** + **内层独立绘景层 (`data-cds-part="paint"`)**。这一架构彻底解耦了外轮廓焦点环、内阴影与背景渐变,杜绝了传统 CSS 按钮在 Hover/Active 时内外尺寸微抖的缺陷。 ```mermaid graph LR Outer["Button 外层容器
[data-cds='Button'] .cds-btn-squish"] --> Paint["独立绘景图层
[data-cds-part='paint'] -z-10"] Outer --> Content["内容排版层
Icon + Children + Kbd"] Outer --> Indicator["状态微标插槽
[data-cds-part='indicator'] Pulse"] ``` ```javascript /* 提取自官方生产包 shared-frame-BfjMqbuN.js 原生变体映射 */ const Il = "cds-reset group/btn relative isolate inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap select-none cursor-[var(--cds-cursor-interactive)] aria-disabled:cursor-default data-[disabled]:cursor-default border-0 outline-none focus-visible:outline-hidden rounded h-control font-sans text-body transition-shadow duration-fast"; ``` | 变体代号 | 视觉语义角色 | 文字排版与前景色 | 绘景图层样式 (`data-cds-part="paint"`) | 交互状态与物理特征 | | :--- | :--- | :--- | :--- | :--- | | **`secondary`**
(**Claude 官方默认**) | 卡片内次级操作,**绝不带硬边框**,严格遵循单闭合边框原则 | `text-primary font-normal font-control aria-pressed:text-accent` | `bg-fill-secondary group-hover/btn:bg-fill-secondary-hover dark:bg-white/10 dark:hover:bg-white/15` | `shadow-field group-aria-pressed/btn:shadow-field-pressed` | | **`primary`** | 关键正向提交、发送提示词 | `text-on-primary font-medium font-control` | `bg-fill-primary group-hover/btn:bg-fill-primary-hover` (陶土实色) | `shadow-2xs active:brightness-95` | | **`ghost`** | 工具栏图标、内联微操作、次级折叠条 | `text-primary font-normal font-control aria-pressed:text-accent` | `bg-transparent group-hover/btn:bg-fill-ghost-hover` | 悬停渐入 5% 灰度,激活 `bg-fill-ghost-selected` | | **`danger`** | 模态确认删除、清空项目等毁灭性动作 | `text-on-danger font-medium font-control` | `bg-fill-danger group-hover/btn:bg-fill-danger-hover` (警示深红) | `focus-visible:shadow-focus-danger` 专用红光晕 | | **`brand`** | 桌面端官方品牌高亮操作 | `text-on-brand font-medium font-control` | `bg-fill-brand group-hover/btn:bg-fill-brand-hover` (`--brand: #c6613f`) | 官方深陶土桌面品牌色 | | **`onContent`** | 浮动于复杂代码、图片或全屏视频上方的覆层操作 | `text-primary font-medium font-control` | `bg-[var(--cds-button-on-content)] backdrop-blur-md shadow-[inset_0_0_0_1px_var(--cds-button-on-content-ring)]` | 4px 毛玻璃羽化,深色半透明抗背景干扰 | --- #### 2.1.3 按钮动态阻尼物理学与 15 阶纯 CSS 弹簧 (`.cds-btn-squish`) REA 对 `c6a992d55-sXiDGMFQ.css` 进行逆向取证时,发现了 Claude 极其惊艳的**真实物理弹簧形变系统**:它绝非传统前端写死的硬性 `scale(0.98)`,而是结合运行时按钮高度自适应计算阻尼系数,并在松开瞬间触发 **15 阶 CSS `linear()` 弹簧曲线**: ```css /* 提取自 c6a992d55-sXiDGMFQ.css 真实生产定义 */ :root { --cds-btn-spring: linear( 0, .2459, .6526, .9468, 1.0764, 1.0915, 1.0585, 1.0219, .9993, .9914, .9921, .9957, .9988, 1.0004, 1 ); } .cds-btn-squish { --cds-btn-press-sx: 0.975; --cds-btn-press-sy: 0.975; transform-origin: 50%; transition: transform var(--cds-dur-slow) var(--cds-btn-spring); } .cds-btn-squish:active, :active > .cds-btn-squish { transform: scale(var(--cds-btn-press-sx), var(--cds-btn-press-sy)); transition: transform var(--cds-dur-fast) ease-out; } ``` > [!TIP] > **弹簧数学分析 (Spring Physics Analysis)**: > 在 `--cds-btn-spring` 曲线中,按压释放瞬间先在 40% 时间点冲出至 `1.0915`(**+9.15% 物理过冲**),随后微回弹至 `0.9914`,并在 `1.0004` 处精准阻尼收敛。配合 JS 动态微调: > `Bl(h) = Math.min(1.5, Math.max(0.5, h * (1 / 32)))`,保证小按钮微缩放细腻,大按钮扎实回弹。 --- #### 2.1.4 组合按钮组协议 (Joined Buttons) 当多个按钮以组合条形态并排出现时(如分段视图切换、撤销/重做组),外层注入 `joined` 拓扑控制,自动剔除内侧圆角并消除双重中缝边框: * **首项 (`start`)**:`rounded-e-none`(右侧直角) * **中间项 (`middle`)**:`rounded-none`(两侧直角) * **末项 (`end`)**:`rounded-s-none`(左侧直角) > **生产级独立组件实现**:[`code-examples/CdsButton.tsx`](../code-examples/CdsButton.tsx)(已全量同步 5 阶尺寸、6 大变体、绘景层分离与 `.cds-btn-squish` 15 阶弹簧物理算法)。 --- ### 2.2 分段滑动选择胶囊 > **技术领域与英文指代**:`Segmented Control & Pills - .df-pills[data-segmented]` Claude 桌面端顶部导航与设置中的滑动 Tab 采用 **999px 全圆角轨道 + 纯几何等分滑块 + 双断点容器查询自适应折叠** 架构。 #### 2.2.1 轨道与滑动指示器精确几何参数 ```css /* 提取自 shared-styles-Bl9zqrv-.css 与 frame-window-BEI3vR8Q.css */ .df-pills[data-segmented] { padding: 1px; /* 严格 1px 环绕间距,杜绝 2px 的笨拙感 */ container-type: inline-size; border-radius: 999px; background: var(--cds-segmented-control-track, rgba(0, 0, 0, 0.06)); } .df-pills[data-segmented] .df-pill-indicator { position: absolute; top: 1px; bottom: 1px; border-radius: calc(var(--cds-radius) - 1px); will-change: transform; transition: transform var(--cds-dur-snap) var(--cds-ease-snap), background-color var(--df-dur-slow) var(--df-ease-out); } ``` * **纯几何等分比例公式 (Pure Geometric Allocation)**: 滑块水平位置与宽度严丝合缝匹配轨道内 1px 间隙: ```css left: calc(1px + var(--active-index) * (100% - 2px) / var(--total-tabs)); width: calc((100% - 2px) / var(--total-tabs)); ``` * **光学双层弥散投影 (Dual-Layer Optical Shadow)**: - **浅色模式**: `background: var(--cds-neutral-20); box-shadow: inset 0 0 0 0.5px var(--cds-border), 0 1px 2px #0000000f, 0 2px 6px -1px #0000000d;` - **深色模式**: `background: var(--cds-segmented-control-thumb); box-shadow: inset 0 0 0 0.5px #ffffff14, 0 1px 2px #0000004d, 0 2px 6px -1px #00000040;` --- #### 2.2.2 双断点容器查询自适应折叠协议 (@container) 当容器宽度被窄侧边栏或窗口拉伸挤压时,Claude 绝不生硬换行,而是依托 `@container` 逐级收缩未激活项标签: ```css /* 提取自 c6a992d55-sXiDGMFQ.css 真实生产容器断点 */ /* 1. 两项分段控制器:容器宽度 <= 180px 时折叠 */ @container (width <= 180px) { .df-pills[data-segmented][data-pills="2"] .df-pill:not([data-active]) .df-pill-label { display: none; } .df-pills[data-segmented][data-pills="2"] .df-pill:not([data-active]) { padding: 0; } .df-pills[data-segmented][data-pills="2"] .df-pill[data-active] { flex: none; padding: 0 16px; } } /* 2. 三项分段控制器:容器宽度 <= 254px 时折叠 */ @container (width <= 254px) { .df-pills[data-segmented][data-pills="3"] .df-pill:not([data-active]) .df-pill-label { display: none; } .df-pills[data-segmented][data-pills="3"] .df-pill:not([data-active]) { padding: 0; } .df-pills[data-segmented][data-pills="3"] .df-pill[data-active] { flex: none; padding: 0 16px; } } ``` > **生产级独立组件实现**:[`code-examples/SegmentedControl.tsx`](../code-examples/SegmentedControl.tsx)(支持 1px 严苛轨道定位、双断点容器自适应折叠与 Framer Motion 物理弹簧双模式)。 --- ### 2.3 状态指示灯与微动效套件 > **技术领域与英文指代**:`Status Indicators & Shimmer` 在 Claude 界面中,微型指示灯与扫光条承担着系统实时状态(运行中、思考中、空闲、就绪)的关键传达职责: #### 2.3.1 官方标准 6px 状态指示灯矩阵 (`.status-dot`) REA 逆向从 `shared-styles-Bl9zqrv-.css` 中提取到的官方状态灯基准类为 `.status-dot`(**严格 6px 直径圆形**): ```css .status-dot { width: 6px; height: 6px; border-radius: 50%; display: block; position: relative; } ``` | 状态代号 | 视觉颜色 | 动画时序与关键帧 | 业务承载场景 | | :--- | :--- | :--- | :--- | | **`ready`** | `var(--cds-fill-accent)` | 静态常亮,无额外消耗 | 桌面端就绪、会话同步完成、模型待命 | | **`running`** | `var(--cds-fill-accent)` | `1.2s ease-in-out infinite dframe-dot-blink` (透明度 0.3 $\leftrightarrow$ 1.0) | 后台活动通信中、工件代码构建中 | | **`error`** | `var(--cds-fill-danger)` | 静态深红高亮 | 连接超时、MCP 工具执行失败 | | **`clay`** | `var(--cds-clay)` | **`3.0s ease-in-out infinite dframe-clay-breathe`** | Extended Thinking 深度推理与模型核心算力脉冲 | ```css /* 陶土呼吸关键帧提取自 shared-styles-Bl9zqrv-.css */ @keyframes dframe-clay-breathe { 0%, 100% { filter: brightness(0.96); transform: scale(0.86); } 50% { filter: brightness(1.06); transform: scale(1); } } ``` --- #### 2.3.2 思考波浪三点跳跃规范 (`.timeline-quiet-dots`) 在思考链或消息输出等待态,Claude 渲染专有的 3 点波浪脉冲: * **容器几何**:`gap: 3.5px; display: inline-flex; position: relative; top: 0.26em;` * **单点几何**:`width: 3px; height: 3px; border-radius: 50%; background: var(--cds-clay, #d97757);` * **三阶延迟与运动轨迹**: - 周期:**`1.9s cubic-bezier(0.4, 0, 0.2, 1) infinite`** - 阶梯相位差:点 1 为 `0s`,点 2 为 `0.15s`,点 3 为 `0.3s` - 运动关键帧: ```css @keyframes timeline-quiet-dot { 0%, 8% { opacity: 0; transform: translateY(2px); } 22% { opacity: 1; transform: translateY(-2.5px); } 36%, 70% { opacity: 1; transform: translateY(0); } 90%, 100%{ opacity: 0; transform: translateY(0); } } ``` --- #### 2.3.3 骨架屏 105° 倾角平移扫光 (`cds-skeleton-sweep`) 在卡片、正文骨架加载阶段,Claude 采用极具质感的非对称角度扫光: * **周期与缓动**:`animation: cds-skeleton-sweep 2s linear infinite;`(严格 2.0s 匀速,非 1.6s)。 * **光带倾角**: - LTR 模式:`linear-gradient(105deg, transparent 35%, var(--cds-skeleton-sheen) 50%, transparent 65%)` - RTL 镜像模式:`linear-gradient(255deg, transparent 35%, var(--cds-skeleton-sheen) 50%, transparent 65%)` * **关键帧**: ```css @keyframes cds-skeleton-sweep { 0% { transform: translate(-100%); } 100% { transform: translate(100%); } } ``` > **生产级独立组件实现**:[`code-examples/StatusIndicators.tsx`](../code-examples/StatusIndicators.tsx)。 --- ### 2.4 模态确认对话框 > **技术领域与英文指代**:`Confirmation Dialog - [data-cds="Dialog"]` 在执行清空会话、删除项目、重置密钥或高风险 MCP 工具调用时呼出的模态确认对话框: #### 2.4.1 6 阶弹窗标尺与视口安全上限 依据 REA 对 `shared-frame-BfjMqbuN.js` 生产 Dialog 控制器的提取,Claude 构建了系统级 6 阶弹窗矩阵: ```javascript /* 提取自官方生产包 shared-frame-BfjMqbuN.js 原生 Qg 尺寸表 */ const Qg = { sm: "max-w-[400px]", // 极简确认、单项授权 md: "max-w-[520px]", // 标准确认模态框(默认) lg: "max-w-[720px]", // 复杂表单、环境配置 xl: "max-w-[880px]", // 代码对比确认 "2xl": "max-w-[1024px]", // 宽屏工件预览 "3xl": "max-w-[1152px]" // 全功能工作区看板 }; ``` * **视口高度自适应截断安全公式 (`--environment-dialog-cap`)**: ```css --environment-dialog-cap: calc( 100dvh - max(2rem, 2 * var(--desktop-titlebar-inset, 0px)) - 2 * max(env(safe-area-inset-top, 0px), env(safe-area-inset-bottom, 0px)) ); ``` 保证弹窗在所有桌面端(macOS 信号灯刘海屏、Windows 标题栏)下均不溢出视口。 --- #### 2.4.2 嵌套弹窗防御体系 (Nested Dialog Blurring Protocol) 当模态对话框内部再次唤起二级子弹窗时(如在确认弹窗中点击“查看详情”弹窗),Claude 通过属性选择器自动对底层父弹窗进行物理虚化与暗化拦截: ```javascript /* 提取自 shared-frame-BfjMqbuN.js */ const Xg = "after:pointer-events-none after:absolute after:inset-0 after:rounded-[inherit] after:bg-backdrop after:opacity-0 after:z-50 after:transition-opacity after:duration-base after:ease-out data-[nested-dialog-open]:after:opacity-100"; const Zg = "data-[nested-dialog-open]:blur-[2px]"; ``` 当父弹窗检测到 `data-[nested-dialog-open]` 时: 1. 立即触发 `blur-[2px]`,消除文字高频细节; 2. 伪元素 `after` 透明度从 0 平滑过渡至 100%,覆盖一层半透明微遮罩; 3. 视线焦点绝对聚焦于最新呼出的二级模态框。 --- #### 2.4.3 原生滚动时间轴与双环弥散投影 * **双环 Popover 投影 (`--cds-shadow-popover`)**: 外层高斯模糊与内层倒角物理顶光反光,外轮廓不带任何 1px 生硬黑线。 * **滚动时间轴驱动**: 容器内置 `[scroll-timeline:--cds-dialog-scroll_block]` 与 `.scroll-fade-y`,内容超长产生纵向滚动时,自动触发 Chapter 1 提取的 28px 相对色彩渐隐遮罩。 > **生产级独立组件实现**:[`code-examples/ConfirmationDialog.tsx`](../code-examples/ConfirmationDialog.tsx)。 --- ### 2.5 附件磁贴与上下文胶囊 > **技术领域与英文指代**:`Attachment Cards & Inline Chips - [data-cds="MessageAttachmentsFile"]` 用户在对话流中发送文件或在输入框中暂存附件时呈现的卡片控件: #### 2.5.1 严苛正方形 7.5rem 磁贴架构与自适应同心圆角 REA 对生产包 `shared-2-Cb74JByF.js` 的全量提取彻底纠正了社区普遍猜测的“128px × 96px 扁长矩形”,官方真实类名如下: ```javascript /* 提取自 shared-2-Cb74JByF.js 原生 Yf 磁贴容器类名 */ const Yf = "group/tile relative isolate size-[calc(7.5rem*var(--cds-rem-scale,1))] shrink-0 rounded-card outline-none focus-visible:shadow-focus"; ``` * **真实几何规格**: `size-[calc(7.5rem * var(--cds-rem-scale, 1))]`:基础为 **严格正方形 120px**,经桌面缩放因子校准后为 **112.94px × 112.94px**。 * **同心圆角**:采用 Chapter 1 确立的 `rounded-card`(`--radius-card`),内嵌元素曲率与外框保持绝对同心。 * **立体漫射**:外嵌 `shadow-field-drop`,Hover 时微抬升过渡至 `hover:shadow-xs`。 --- #### 2.5.2 浮动微圆形移除按钮协议 (`data-cds-attachment-remove`) 移除按钮并不占位内部网格,而是以极高精度悬浮于右上角: ```javascript /* 提取自 shared-2-Cb74JByF.js 原生 _p 移除按钮 */ const removeBtnClasses = "cds-reset absolute -end-2 -top-2 z-[1] inline-flex size-5 items-center justify-center rounded-full bg-surface-3 text-secondary shadow-card-ring hover:text-primary outline-none focus-visible:shadow-focus"; ``` * **绝对定位**:`absolute -end-2 -top-2 z-[1]`(向右上方悬浮超出 8px)。 * **微型圆点**:`size-5`(严格 20px 直径),底色为最高层级 `Surface 3`。 * **物理防呆**:配备 `shadow-card-ring` 发丝保护环,按压触发 `active:scale-90` 触觉回馈。 --- #### 2.5.3 双向中间智能截断算法 (Bi-Directional Mid-Truncation) 在长文件名显示场景中,传统单向省略(`truncate` / `text-overflow: ellipsis`)会将文件末尾的扩展名硬生生截断为 `long_filename_final...`,导致用户无法判断文件类型。Claude 采用精密的**双向智能中间截断算法**: ```html {head} {tailStem} {tailExt} ``` 无论文件名多长(如 `deep_reinforcement_learning_policy_gradient_v3.tsx`),扩展名 `.tsx` 永远以 `shrink-0` 锁定展示,中间自动由 `before:content-['…']` 动态连接。 --- #### 2.5.4 动态全大写类型徽标 (Uppercase Badge) 磁贴左上角自动解析文件后缀并转为大写无衬线徽标(如 `TS`, `PY`, `PDF`, `CSV`, `SQL`),使用等宽字形与高对比度微弱背景胶囊展现,保证文件类型在一瞥之间清晰可辨。 > **生产级独立组件实现**:[`code-examples/AttachmentCard.tsx`](../code-examples/AttachmentCard.tsx)(已全量同步 7.5rem 正方形、双向中间智能截断算法与浮动移除按钮协议)。 ---

[⬅️ 第一篇:设计哲学与设计令牌体系](01-设计哲学与设计令牌体系.md) · [📚 目录](Claude%20Design%20System%20(CDS).md) · [第三篇:会话核心流与指令交互引擎 ➡️](03-会话核心流与指令交互引擎.md)