关于 ui-component-patterns
面向前端团队的技能,用于确定可复用 UI 组件的范围与组合方式,并生成精简架构说明,将相关问题分流给其他技能。
主要功能
- 01分类可复用组件需求
- 02选择范围明确的组件方案
- 03厘清共享与局部职责
- 04分流相邻前端问题
适用场景
- 01整合重复的按钮或对话框
- 02审查不断扩大的组件 API
- 03决定采用基础组件还是包装器
- 04规划组件示例与验证
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ akillness/ jeo-skills --skill ui-component-patterns安装后在 Claude Code 中输入/ui-component-patterns确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
SKILL.toonevals/evals.jsonreferences/component-api-checklist.mdhandoff-boundaries.mdintake-packets-and-route-outs.md详细介绍
UI 组件模式
当任务是对可复用组件问题进行分类,选择一个主要组件方案,并留下简短的组件架构说明,而不是堆砌大量 React 模式时,请使用此技能。
任务不是罗列所有可能的组件模式。 任务是:
- 首先识别可复用组件方面的主要需求,
- 选择一个范围明确的方案,
- 明确共享与局部、父级与组件之间的所有权划分,
- 将替代根节点组合与更广泛的系统或无障碍工作分开,
- 如实转交相邻的前端问题。
请先阅读以下支持文档:
- references/intake-packets-and-route-outs.md
- references/component-api-checklist.md
- references/handoff-boundaries.md
何时使用此技能
- 团队中有太多相似的按钮、卡片、对话框、字段包装器或导航模式,需要一个共享的基础组件或组件族边界。
- 请求混合了变体、插槽、受控与非受控行为、包装器和文档要求,需要在实现前进行分流。
- 你需要判断某个组件应保留为产品局部组件、成为共享基础组件,还是拆分为基础组件加包装器。
- 组件 API 正在不断增加变通入口,需要有人将其收敛为一个合理的方案。
- 难点在于替代根节点组合(
button与a/路由器Link、插槽子元素、自定义包装器),而不是纯粹的样式设计。 - 已有 Storybook/示例,但状态、使用规则或边缘情况的文档/验证方案仍不明确。
何时不使用此技能
- 主要任务是令牌治理、视觉语言规则、基础组件命名策略或跨产品系统方向 →
design-system - 主要任务是键盘/焦点行为、语义、标签、播报、对比度或手动无障碍整改 →
web-accessibility - 主要任务是视口/容器适配、断点策略、重排或响应式媒体 →
responsive-design - 主要任务是更广泛的应用/工作流状态所有权、服务端/客户端边界或跨屏幕状态协调 →
state-management - 主要任务是重复渲染、注水、路由性能或包/运行时行为 →
react-best-practices - 可复用组件的边界已确定,实际工作只是实现它;在这种情况下,直接实现,不要重新讨论架构决策
说明
第 1 步:在命名属性前,先明确可复用组件任务
首先记录最小需求信息。
component_intake:
surface: button-action | form-field | dialog-overlay | nav-menu | card-list-item | table-toolbar | mixed | unknown
workflow_type: new-primitive | duplicate-cleanup | api-review | wrapper-split | docs-verification | unknown
primary_packet: primitive-boundary | slot-anatomy | controlled-ownership | alternate-root-composition | docs-verification | mixed | unknown
ownership_pressure: shared-vs-local | parent-state | wrapper-proliferation | type-safety | docs-drift | mixed | unknown
signal_source: repeated-components | bug-report | code-review | storybook-gap | design-review | migration | mixed | unknown
confidence: high | medium | low
规则:不要从“添加一个属性”开始。首先标明可复用组件方面的主要需求。
第 2 步:恰好选择一个主要组件方案
使用 references/intake-packets-and-route-outs.md 中的路由规则。
主要方案:
primitive-boundaryslot-anatomycontrolled-ownershipalternate-root-compositiondocs-verification
选择能够解决当前决策的方案。将其他事项列为后续工作,而不要将它们视为同等的共同负责人。
第 3 步:明确各项不变量
每个严谨的答复都应遵循以下规则:
- 共享组件应解决重复工作,而不是为单个屏幕创建一个局部框架
- 产品专属文案、分析、工作流规则和布局特例通常应属于包装器,而非基础组件
- 变体应表达稳定含义(
tone、size、density、state),而不是一次性的屏幕特例 - 插槽/子组件用于提供结构化的灵活性,而不是掩盖混乱的 API
- 如果同时提供受控和非受控行为,契约必须明确且一致
- 替代根节点组合会改变语义和无障碍责任;应明确说明这一点
- Storybook/示例是展示证据的载体,但不能证明组件边界设计合理
第 4 步:构建组件方案包
返回以下结构:
# Component Architecture Packet
## Scope
- Surface:
- Workflow type:
- Primary packet:
- Confidence: high | medium | low
## Current signal
- Main symptom:
- Ownership pressure:
- What is already known:
- What still needs direct verification:
## Recommended first slice
1. ...
2. ...
3. ...
## Component decisions
- Shared vs local:
- Primitive / wrapper split:
- Variants or slots:
- Controlled vs uncontrolled:
- Alternate-root or wrapper rules:
## Docs and verification
- Stories/examples required:
- State / variant matrix:
- Accessibility follow-up:
- Responsive follow-up:
## Ownership and route-outs
- Primary owner:
- Adjacent skills / teams:
第 5 步:使用方案包,而不是庞大的模式图库
从 references/intake-packets-and-route-outs.md 中提取方案包。
方案包规则:
primitive-boundary→ 确定共享范围与局部范围、原语与包装器的拆分方式,以及哪些内容绝不能纳入共享 APIslot-anatomy→ 定义子组件/插槽、变体边界、组合规则,以及可复用结构的解剖结构预期controlled-ownership→ 确定由父级状态、工作流状态还是组件本地默认值负责生命周期alternate-root-composition→ 当原语必须组合到其他元素上时,处理asChild/component/ 包装器根节点行为、属性展开、引用和语义约束docs-verification→ 定义 Storybook/示例、状态矩阵、反面用法说明,以及该组件系列最小但可信的验证范围
第 6 步:将机制选择与归属选择分开
在严肃的回答中使用以下划分:
- 机制 — 变体、插槽、子组件、受控属性、多态根节点、包装器拆分、文档矩阵
- 归属 —
ui-component-patterns、design-system、web-accessibility、responsive-design、state-management或react-best-practices
如果请求始于屏幕截图、Storybook 偏差或代码差异,请明确说明这些产物只是信号,并非最终的组件决策。
第 7 步:明确分流相邻工作
问题跨越边界时,使用以下分流方式:
- 设计令牌治理、原语命名、贡献政策或跨产品组件标准 →
design-system - 键盘/焦点修复、标签/播报问题、ARIA、对比度、减少动态效果或手动无障碍验证 →
web-accessibility - 视口/容器适配、重排、响应式媒体或密集数据布局策略 →
responsive-design - 应用/工作流状态归属、服务端/客户端状态边界、URL/表单/全局存储决策 →
state-management - 重渲染频繁、注水、包/运行时性能或路由级性能行为 →
react-best-practices
出现混合请求时,让 ui-component-patterns 负责可复用组件方案包,并明确指出后续工作应分流到何处。
第 8 步:优先划清合理边界,避免过度泛化属性
当组件不断累积布尔属性、逃生舱或特定产品规则时:
- 检查 API 是否应拆分为原语加包装器,
- 将意外出现的变体收敛为更少的语义类别,
- 将布局或工作流专属行为移出原语,
- 将系统性或需要大量修复的后续工作分流出去,而不是不断扩大技能范围。
示例
示例 1:按钮系列逐渐偏离
输入:“我们有五种按钮实现,而且大家还在不断添加一次性属性。”
良好的输出方向:
- 选择
primitive-boundary作为主要方案包 - 保留一个共享操作原语,并视需要提供更精简的图标/按钮组包装器
- 将零散的布尔属性收敛为少量变体/色调/尺寸类别
- 将分析功能和特定屏幕的布局包装器留在原语之外
- 将令牌命名问题分流到
design-system
示例 2:模态框状态归属不清
输入:“模态框应该管理自己的状态,还是始终由父级工作流控制?”
良好的输出方向:
- 选择
controlled-ownership作为主要方案包 - 将模态框归类为可复用的复合模式
- 当工作流状态、路由或异步提交逻辑很重要时,建议由外部控制状态
- 仅当契约仍然明确时,才提供非受控的便捷用法
- 将键盘/焦点修复细节分流到
web-accessibility
示例 3:链接按钮组合
输入:“我们的设计系统按钮有时需要渲染为路由链接。如何支持这一点,同时不破坏类型或语义?”
良好输出方向:
- 选择
alternate-root-composition作为主要方案包 - 明确属性展开、ref 转发以及语义和无障碍约束
- 将路由级导航策略或令牌治理排除在基础组件决策之外
- 留下边界明确的包装器/根组件契约,而不是含糊地回答“只需添加一个
as属性”
示例 4:Storybook 内容偏差
输入:“组件已经存在,但各团队的用法不一致,而且 Storybook 缺少边缘情况。”
良好输出方向:
- 选择
docs-verification作为主要方案包 - 定义最小状态/变体矩阵和示例集
- 添加避免误用说明和包装器预期
- 将仅涉及无障碍或仅涉及响应式的后续方案包转至其他方向
最佳实践
- 优先选择能够减少重复工作、又不会凭空创建本地框架的最小可复用基础组件。
- 明确选择方案包;一个组件决策不应悄然涵盖治理、修复、响应式策略和运行时调优。
- 将插槽和子组件视为结构化 API 工具,而不是逃避归属决策的方式。
- 将受控与非受控行为明确写入契约,避免意外形成半受控的混合状态。
- 对替代根组件组合如实说明 ref、属性展开和语义方面的要求。
- 将 Storybook/示例作为证据的一部分,但仍要写明文档/验证方案包。
- 当使用者反复需要逃生口或特定应用的包装器才能使用组件时,重新审视抽象设计。