Components.build Specification
Comprehensive guidelines for building modern, composable, and accessible UI components. Contains 16 rule categories covering everything from core principles to distribution, co-authored by Hayden Bleasel and shadcn.
This repository (Asymmetric-al/core)
These repo-owned sections are intentionally kept on top of the vendored
components.build skill. If upstream refreshes replace this file, reconcile this
overlay before running bun run skills:sync.
Base UI only: shared primitives come from @base-ui/react via the shadcn
base-maia style in packages/ui. Where the vendored spec references Radix
or asChild, use Base UI's render prop instead and never add
radix-ui/@radix-ui/*. See docs/ai/rules/frontend.md.
Triggers
- Creating, reviewing, or refactoring reusable React components, component APIs, slots, or composition patterns.
- Design-system work in
packages/ui/, shadcn-compatible primitives, or shared app UI surfaces.
- Accessibility, controlled/uncontrolled state, polymorphism, or TypeScript prop contract decisions for components.
Workflow
- Read
docs/ai/rules/frontend.md and any nested AGENTS.md for the target package/app.
- Search existing shared components before adding a new primitive or abstraction.
- Prefer repo patterns and shadcn-compatible composition over bespoke APIs.
- Keep behavior and accessibility test coverage proportional to the component's reuse surface.
- Run focused type/lint/unit checks for touched component packages.
Checklist
When to Apply
Reference these guidelines when:
- Creating new React components or component libraries
- Designing component APIs and prop interfaces
- Implementing accessibility features (keyboard, ARIA, focus management)
- Building composable component architectures
- Styling components with Tailwind CSS and CVA
- Publishing components to registries or npm
Rule Categories by Priority
| Priority |
Category |
Focus |
Prefix |
| 1 |
Overview |
Specification scope and goals |
overview |
| 2 |
Principles |
Core design philosophy |
principles |
| 3 |
Definitions |
Common terminology |
definitions |
| 4 |
Composition |
Breaking down complex components |
composition |
| 5 |
Accessibility |
Keyboard, screen readers, ARIA |
accessibility |
| 6 |
State |
Controlled/uncontrolled patterns |
state |
| 7 |
Types |
TypeScript props and interfaces |
types |
| 8 |
Polymorphism |
Element switching with as prop |
polymorphism |
| 9 |
As-Child |
Slot composition (this repo: Base UI render) |
as-child |
| 10 |
Data Attributes |
data-state and data-slot |
data-attributes |
| 11 |
Styling |
Tailwind CSS, cn utility, CVA |
styling |
| 12 |
Design Tokens |
CSS variables and theming |
design-tokens |
| 13 |
Documentation |
Component documentation |
documentation |
| 14 |
Registry |
Component registries |
registry |
| 15 |
NPM |
Publishing to npm |
npm |
| 16 |
Marketplaces |
Component marketplaces |
marketplaces |
Quick Reference
1. Overview
overview - Specification scope, goals, and philosophy
2. Principles
principles - Composability, accessibility, customization, transparency
3. Definitions
definitions - Common terminology (primitive, compound, headless, etc.)
4. Composition
composition-root - Root component with Context for shared state
composition-item - Item wrapper components
composition-trigger - Interactive trigger components
composition-content - Content display components
composition-export - Namespace export pattern
5. Accessibility
accessibility-semantic-html - Use appropriate HTML elements
accessibility-keyboard - Full keyboard navigation support
accessibility-aria - Proper ARIA roles, states, and properties
accessibility-focus - Focus management and restoration
accessibility-live-regions - Screen reader announcements
accessibility-contrast - Color contrast requirements
6. State
state-uncontrolled - Internal state management
state-controlled - External state delegation
state-controllable - Support both patterns with useControllableState
7. Types
types-extend-html - Extend native HTML attributes
types-export - Export prop types for consumers
types-single-element - One component wraps one element
8. Polymorphism
polymorphism-as-prop - Change rendered element type
polymorphism-typescript - Type-safe polymorphic components
polymorphism-defaults - Semantic element defaults
9. As-Child
as-child-slot - Slot-style prop merging (in this repo use Base UI's render prop)
as-child-composition - Compose with child components
10. Data Attributes
data-attributes-state - Use data-state for styling states
data-attributes-slot - Use data-slot for targeting sub-components
11. Styling
styling-cn-utility - Use the shared cn() utility backed by cnfast
styling-order - Base -> Variants -> Conditionals -> User overrides
styling-cva - Class Variance Authority for variants
styling-css-variables - Dynamic values with CSS variables
12. Design Tokens
design-tokens-css-variables - Define tokens as CSS variables
design-tokens-theming - Support light/dark modes and themes
13. Documentation
documentation-props - Document all props with JSDoc
documentation-examples - Provide usage examples
14. Registry
registry-structure - Registry file structure
registry-schema - Component metadata schema
15. NPM
npm-package-json - Package configuration
npm-exports - Module exports
16. Marketplaces
marketplaces-distribution - Component distribution strategies
How to Use
Read individual rule files for detailed explanations and code examples:
rules/composition/SKILL.md
rules/accessibility/SKILL.md
rules/styling/SKILL.md
Each rule file contains:
- Brief explanation of why it matters
- Incorrect code example with explanation
- Correct code example with explanation
- Best practices and common pitfalls
Full Compiled Document
For the complete guide with all rules expanded: AGENTS.md
Key Principles
- Composition over Configuration - Break components into composable sub-components
- Accessibility by Default - Not an afterthought, but a requirement
- Single Element Wrapping - Each component wraps one HTML element
- Extend HTML Attributes - Always extend native element props
- Export Types - Make prop types available to consumers
- Support Both State Patterns - Controlled and uncontrolled
- Intelligent Class Merging - Use
cn() utility backed by cnfast
Authors
Co-authored by:
Adapted as an AI skill by:
Based on the components.build specification.
1---2name: components-build3description: Build modern, composable, and accessible React UI components following the components.build specification. Use when creating, reviewing, or refactoring component libraries, design systems, or any reusable UI components. Triggers on tasks involving component APIs, composition patterns, accessibility, styling systems, or TypeScript props.4license: MIT5---67# Components.build Specification89Comprehensive guidelines for building modern, composable, and accessible UI components. Contains 16 rule categories covering everything from core principles to distribution, co-authored by Hayden Bleasel and shadcn.1011## This repository (Asymmetric-al/core)1213These repo-owned sections are intentionally kept on top of the vendored14components.build skill. If upstream refreshes replace this file, reconcile this15overlay before running `bun run skills:sync`.1617**Base UI only:** shared primitives come from `@base-ui/react` via the shadcn18`base-maia` style in `packages/ui`. Where the vendored spec references Radix19or `asChild`, use Base UI's `render` prop instead and never add20`radix-ui`/`@radix-ui/*`. See `docs/ai/rules/frontend.md`.2122### Triggers2324- Creating, reviewing, or refactoring reusable React components, component APIs, slots, or composition patterns.25- Design-system work in `packages/ui/`, shadcn-compatible primitives, or shared app UI surfaces.26- Accessibility, controlled/uncontrolled state, polymorphism, or TypeScript prop contract decisions for components.2728### Workflow29301. Read `docs/ai/rules/frontend.md` and any nested `AGENTS.md` for the target package/app.312. Search existing shared components before adding a new primitive or abstraction.323. Prefer repo patterns and shadcn-compatible composition over bespoke APIs.334. Keep behavior and accessibility test coverage proportional to the component's reuse surface.345. Run focused type/lint/unit checks for touched component packages.3536### Checklist3738- [ ] Existing components and exports were checked before adding new API surface.39- [ ] Composition, keyboard, ARIA, focus, and disabled/loading states were considered.40- [ ] Props/types follow the local package's public export pattern.41- [ ] Styling uses repo tokens/utilities and avoids layout-shifting dynamic content.42- [ ] Verification covered the touched component behavior or contract.4344## When to Apply4546Reference these guidelines when:4748- Creating new React components or component libraries49- Designing component APIs and prop interfaces50- Implementing accessibility features (keyboard, ARIA, focus management)51- Building composable component architectures52- Styling components with Tailwind CSS and CVA53- Publishing components to registries or npm5455## Rule Categories by Priority5657| Priority | Category | Focus | Prefix |58| -------- | --------------- | ---------------------------------------------- | ----------------- |59| 1 | Overview | Specification scope and goals | `overview` |60| 2 | Principles | Core design philosophy | `principles` |61| 3 | Definitions | Common terminology | `definitions` |62| 4 | Composition | Breaking down complex components | `composition` |63| 5 | Accessibility | Keyboard, screen readers, ARIA | `accessibility` |64| 6 | State | Controlled/uncontrolled patterns | `state` |65| 7 | Types | TypeScript props and interfaces | `types` |66| 8 | Polymorphism | Element switching with `as` prop | `polymorphism` |67| 9 | As-Child | Slot composition (this repo: Base UI `render`) | `as-child` |68| 10 | Data Attributes | `data-state` and `data-slot` | `data-attributes` |69| 11 | Styling | Tailwind CSS, cn utility, CVA | `styling` |70| 12 | Design Tokens | CSS variables and theming | `design-tokens` |71| 13 | Documentation | Component documentation | `documentation` |72| 14 | Registry | Component registries | `registry` |73| 15 | NPM | Publishing to npm | `npm` |74| 16 | Marketplaces | Component marketplaces | `marketplaces` |7576## Quick Reference7778### 1. Overview7980- `overview` - Specification scope, goals, and philosophy8182### 2. Principles8384- `principles` - Composability, accessibility, customization, transparency8586### 3. Definitions8788- `definitions` - Common terminology (primitive, compound, headless, etc.)8990### 4. Composition9192- `composition-root` - Root component with Context for shared state93- `composition-item` - Item wrapper components94- `composition-trigger` - Interactive trigger components95- `composition-content` - Content display components96- `composition-export` - Namespace export pattern9798### 5. Accessibility99100- `accessibility-semantic-html` - Use appropriate HTML elements101- `accessibility-keyboard` - Full keyboard navigation support102- `accessibility-aria` - Proper ARIA roles, states, and properties103- `accessibility-focus` - Focus management and restoration104- `accessibility-live-regions` - Screen reader announcements105- `accessibility-contrast` - Color contrast requirements106107### 6. State108109- `state-uncontrolled` - Internal state management110- `state-controlled` - External state delegation111- `state-controllable` - Support both patterns with useControllableState112113### 7. Types114115- `types-extend-html` - Extend native HTML attributes116- `types-export` - Export prop types for consumers117- `types-single-element` - One component wraps one element118119### 8. Polymorphism120121- `polymorphism-as-prop` - Change rendered element type122- `polymorphism-typescript` - Type-safe polymorphic components123- `polymorphism-defaults` - Semantic element defaults124125### 9. As-Child126127- `as-child-slot` - Slot-style prop merging (in this repo use Base UI's `render` prop)128- `as-child-composition` - Compose with child components129130### 10. Data Attributes131132- `data-attributes-state` - Use `data-state` for styling states133- `data-attributes-slot` - Use `data-slot` for targeting sub-components134135### 11. Styling136137- `styling-cn-utility` - Use the shared `cn()` utility backed by cnfast138- `styling-order` - Base -> Variants -> Conditionals -> User overrides139- `styling-cva` - Class Variance Authority for variants140- `styling-css-variables` - Dynamic values with CSS variables141142### 12. Design Tokens143144- `design-tokens-css-variables` - Define tokens as CSS variables145- `design-tokens-theming` - Support light/dark modes and themes146147### 13. Documentation148149- `documentation-props` - Document all props with JSDoc150- `documentation-examples` - Provide usage examples151152### 14. Registry153154- `registry-structure` - Registry file structure155- `registry-schema` - Component metadata schema156157### 15. NPM158159- `npm-package-json` - Package configuration160- `npm-exports` - Module exports161162### 16. Marketplaces163164- `marketplaces-distribution` - Component distribution strategies165166## How to Use167168Read individual rule files for detailed explanations and code examples:169170```171rules/composition/SKILL.md172rules/accessibility/SKILL.md173rules/styling/SKILL.md174```175176Each rule file contains:177178- Brief explanation of why it matters179- Incorrect code example with explanation180- Correct code example with explanation181- Best practices and common pitfalls182183## Full Compiled Document184185For the complete guide with all rules expanded: `AGENTS.md`186187## Key Principles1881891. **Composition over Configuration** - Break components into composable sub-components1902. **Accessibility by Default** - Not an afterthought, but a requirement1913. **Single Element Wrapping** - Each component wraps one HTML element1924. **Extend HTML Attributes** - Always extend native element props1935. **Export Types** - Make prop types available to consumers1946. **Support Both State Patterns** - Controlled and uncontrolled1957. **Intelligent Class Merging** - Use `cn()` utility backed by cnfast196197## Authors198199Co-authored by:200201- **Hayden Bleasel** ([@haydenbleasel](https://x.com/haydenbleasel))202- **shadcn** ([@shadcn](https://x.com/shadcn))203204Adapted as an AI skill by:205206- **Jordan Gilliam** ([@nolansym](https://x.com/nolansym))207208Based on the [components.build](https://components.build) specification.