Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/asymmetric-al-components-build/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✓→✗ | ▼ Worse | -45% | 0% |
| case-22 | ✓→✗ | ▼ Worse | 62% | 0% |
| case-15 | ✓→✗ | ▼ Worse | -47% | 0% |
| case-16 | ✓→✗ | ▼ Worse | -38% | 0% |
| case-20 | ✓→✗ | ▼ Worse | -16% | 0% |
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.
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.
packages/ui/, shadcn-compatible primitives, or shared app UI surfaces.docs/ai/rules/frontend.md and any nested AGENTS.md for the target package/app.Reference these guidelines when:
| 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 |
overview - Specification scope, goals, and philosophyprinciples - Composability, accessibility, customization, transparencydefinitions - Common terminology (primitive, compound, headless, etc.)composition-root - Root component with Context for shared statecomposition-item - Item wrapper componentscomposition-trigger - Interactive trigger componentscomposition-content - Content display componentscomposition-export - Namespace export patternaccessibility-semantic-html - Use appropriate HTML elementsaccessibility-keyboard - Full keyboard navigation supportaccessibility-aria - Proper ARIA roles, states, and propertiesaccessibility-focus - Focus management and restorationaccessibility-live-regions - Screen reader announcementsaccessibility-contrast - Color contrast requirementsstate-uncontrolled - Internal state managementstate-controlled - External state delegationstate-controllable - Support both patterns with useControllableStatetypes-extend-html - Extend native HTML attributestypes-export - Export prop types for consumerstypes-single-element - One component wraps one elementpolymorphism-as-prop - Change rendered element typepolymorphism-typescript - Type-safe polymorphic componentspolymorphism-defaults - Semantic element defaultsas-child-slot - Slot-style prop merging (in this repo use Base UI's render prop)as-child-composition - Compose with child componentsdata-attributes-state - Use data-state for styling statesdata-attributes-slot - Use data-slot for targeting sub-componentsstyling-cn-utility - Use the shared cn() utility backed by cnfaststyling-order - Base -> Variants -> Conditionals -> User overridesstyling-cva - Class Variance Authority for variantsstyling-css-variables - Dynamic values with CSS variablesdesign-tokens-css-variables - Define tokens as CSS variablesdesign-tokens-theming - Support light/dark modes and themesdocumentation-props - Document all props with JSDocdocumentation-examples - Provide usage examplesregistry-structure - Registry file structureregistry-schema - Component metadata schemanpm-package-json - Package configurationnpm-exports - Module exportsmarketplaces-distribution - Component distribution strategiesRead individual rule files for detailed explanations and code examples:
rules/composition/SKILL.md
rules/accessibility/SKILL.md
rules/styling/SKILL.mdEach rule file contains:
For the complete guide with all rules expanded: AGENTS.md
cn() utility backed by cnfastCo-authored by:
Adapted as an AI skill by:
Based on the components.build specification.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 20,865 | 6,492 | -69% | 1 | 1 | 0% | 4,392 | 2,223 | -49% | 0 | 0 | — |
case-02 | fail→fail | 24,468 | 5,226 | -79% | 1 | 1 | 0% | 4,952 | 2,052 | -59% | 0 | 0 | — |
case-03 | fail→fail | 18,745 | 11,816 | -37% | 1 | 1 | 0% | 3,396 | 4,181 | +23% | 0 | 0 | — |
case-04 | pass→pass | 17,441 | 13,133 | -25% | 1 | 1 | 0% | 3,214 | 4,411 | +37% | 0 | 0 | — |
case-21 | pass→pass | 9,295 | 6,107 | -34% | 1 | 1 | 0% | 1,941 | 3,067 | +58% | 0 | 0 | — |
case-05 | pass→pass | 12,298 | 6,724 | -45% | 1 | 1 | 0% | 2,547 | 3,114 | +22% | 0 | 0 | — |
case-06 | pass→pass | 18,402 | 10,935 | -41% | 1 | 1 | 0% | 3,525 | 3,960 | +12% | 0 | 0 | — |
case-07 | pass→pass | 16,072 | 16,737 | +4% | 1 | 1 | 0% | 3,344 | 5,096 | +52% | 0 | 0 | — |
case-08 | pass→pass | 8,080 | 5,838 | -28% | 1 | 1 | 0% | 1,397 | 2,869 | +105% | 0 | 0 | — |
case-09 | pass→pass | 16,433 | 15,599 | -5% | 1 | 1 | 0% | 2,870 | 4,618 | +61% | 0 | 0 | — |
case-10 | pass→pass | 11,028 | 8,242 | -25% | 1 | 1 | 0% | 2,007 | 3,313 | +65% | 0 | 0 | — |
case-11 | pass→fail | 18,050 | 4,439 | -75% | 1 | 1 | 0% | 3,756 | 2,050 | -45% | 0 | 0 | — |
case-12 | pass→pass | 21,101 | 16,587 | -21% | 1 | 1 | 0% | 3,835 | 5,007 | +31% | 0 | 0 | — |
case-22 | pass→fail | 6,558 | 3,937 | -40% | 1 | 1 | 0% | 1,263 | 2,049 | +62% | 0 | 0 | — |
case-13 | pass→pass | 15,741 | 15,057 | -4% | 1 | 1 | 0% | 2,841 | 4,685 | +65% | 0 | 0 | — |
case-14 | pass→pass | 19,819 | 19,960 | +1% | 1 | 1 | 0% | 4,059 | 5,917 | +46% | 0 | 0 | — |
case-15 | pass→fail | 19,318 | 4,952 | -74% | 1 | 1 | 0% | 3,976 | 2,119 | -47% | 0 | 0 | — |
case-16 | pass→fail | 15,019 | 4,417 | -71% | 1 | 1 | 0% | 3,517 | 2,184 | -38% | 0 | 0 | — |
case-17 | pass→pass | 16,160 | 15,446 | -4% | 1 | 1 | 0% | 3,604 | 5,700 | +58% | 0 | 0 | — |
case-18 | pass→pass | 15,744 | 25,826 | +64% | 1 | 1 | 0% | 3,564 | 7,619 | +114% | 0 | 0 | — |
case-19 | pass→pass | 17,320 | 24,464 | +41% | 1 | 1 | 0% | 3,798 | 7,672 | +102% | 0 | 0 | — |
case-20 | pass→fail | 11,013 | 4,884 | -56% | 1 | 1 | 0% | 2,532 | 2,122 | -16% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 15 counted toward the lift figure. The other 7 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -23 percentage points is the difference between those two pass rates over the 15 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Other measured skills in the registry, with their headline benchmark lift.