shadcn/ui Code Review
Quick Reference
| Issue Type | Reference |
|---|
| className in CVA, missing VariantProps, compound variants | references/cva-patterns.md |
| asChild without Slot, missing Context, component composition |
references/composition.md |
| Missing focus-visible, aria-invalid, disabled states |
references/accessibility.md |
| Missing data-slot, incorrect CSS targeting |
references/data-slot.md |
Review Checklist
- - [ ]
cn() receives className, not CVA variants - [ ]
VariantProps<typeof variants> exported for consumers - [ ] Compound variants used for complex state combinations
- [ ]
asChild pattern uses INLINECODE3 - [ ] Context used for component composition (Card, Accordion, etc.)
- [ ]
focus-visible: states, not just INLINECODE5 - [ ]
aria-invalid, aria-disabled for form states - [ ]
disabled: variants for all interactive elements - [ ]
sr-only for screen reader text - [ ]
data-slot attributes for targetable composition parts - [ ] CSS uses
has() selectors for state-based styling - [ ] No direct className overrides of variant styles
Valid Patterns (Do NOT Flag)
These are correct patterns that should NOT be flagged as issues:
- -
max-h-(--var) - correct Tailwind v4 CSS variable syntax (NOT v3 bracket notation) - INLINECODE13 - valid arbitrary value syntax
- Copying shadcn component code into project - intended usage pattern
- Not documenting copied shadcn components - library internals, not custom code
- Using cn() with many arguments - composition is the pattern
- Conditional classes in cn() arrays - valid Tailwind pattern
- Extending primitive components without additional docs - well-known base
Context-Sensitive Rules
Apply these rules with appropriate context awareness:
- - Flag accessibility issues ONLY IF not handled by Radix primitives underneath
- Flag missing aria labels ONLY IF component isn't using accessible radix primitive
- Flag variant proliferation ONLY IF variants could be composed from existing
- Flag component documentation ONLY IF it's custom code, not copied shadcn
Library Convention Note
shadcn/ui components are designed to be copied and modified. Code review should focus on:
- - Custom modifications made to copied components
- Integration with application state/data
- Accessibility in custom usage contexts
Do NOT flag:
- - Standard shadcn component internals
- Radix primitive usage patterns
- Default variant implementations
When to Load References
- - Reviewing variant definitions → cva-patterns.md
- Reviewing component composition with asChild → composition.md
- Reviewing form components or interactive elements → accessibility.md
- Reviewing multi-part components (Card, Select, etc.) → data-slot.md
Review Questions
- 1. Are CVA variants properly separated from className props?
- Does asChild composition work correctly with Slot?
- Are all accessibility states (focus, invalid, disabled) handled?
- Are data-slot attributes used for component part targeting?
- Can consumers extend variants without breaking composition?
Before Submitting Findings
Load and follow review-verification-protocol before reporting any issue.
shadcn/ui 代码审查
快速参考
references/composition.md |
| 缺少focus-visible、aria-invalid、disabled状态 |
references/accessibility.md |
| 缺少data-slot、错误的CSS定位 |
references/data-slot.md |
审查清单
- - [ ] cn()接收的是className,而非CVA变体
- [ ] 为消费者导出VariantProps
- [ ] 对复杂状态组合使用复合变体
- [ ] asChild模式使用@radix-ui/react-slot
- [ ] 对组件组合(Card、Accordion等)使用Context
- [ ] 使用focus-visible:状态,而非仅:focus
- [ ] 表单状态使用aria-invalid、aria-disabled
- [ ] 所有交互元素使用disabled:变体
- [ ] 屏幕阅读器文本使用sr-only
- [ ] 为可定位的组合部分使用data-slot属性
- [ ] CSS使用has()选择器进行基于状态的样式设置
- [ ] 没有直接覆盖变体样式的className
有效模式(请勿标记)
以下为正确模式,不应标记为问题:
- - max-h-(--var) - 正确的Tailwind v4 CSS变量语法(非v3方括号表示法)
- text-[color:var(--x)] - 有效的任意值语法
- 将shadcn组件代码复制到项目中 - 预期的使用模式
- 不记录复制的shadcn组件 - 库内部实现,非自定义代码
- 使用带多个参数的cn() - 组合是标准模式
- cn()数组中的条件类 - 有效的Tailwind模式
- 扩展基础组件而不添加额外文档 - 已知的基础组件
上下文敏感规则
在适当的上下文感知下应用以下规则:
- - 仅当底层Radix原语未处理时,才标记无障碍问题
- 仅当组件未使用可访问的Radix原语时,才标记缺少aria标签
- 仅当变体可以从现有变体组合时,才标记变体过度增长
- 仅当是自定义代码而非复制的shadcn时,才标记组件文档
库约定说明
shadcn/ui组件设计为可复制和修改。代码审查应关注:
- - 对复制组件所做的自定义修改
- 与应用程序状态/数据的集成
- 自定义使用场景中的无障碍性
请勿标记:
- - 标准shadcn组件内部实现
- Radix原语使用模式
- 默认变体实现
何时加载参考文档
- - 审查变体定义 → cva-patterns.md
- 审查使用asChild的组件组合 → composition.md
- 审查表单组件或交互元素 → accessibility.md
- 审查多部分组件(Card、Select等) → data-slot.md
审查问题
- 1. CVA变体是否与className属性正确分离?
- asChild组合是否能与Slot正确配合?
- 是否处理了所有无障碍状态(焦点、无效、禁用)?
- 是否使用data-slot属性进行组件部分定位?
- 消费者是否能在不破坏组合的情况下扩展变体?
提交发现前
在报告任何问题前,请加载并遵循审查验证协议。