Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate production-ready, accessible, token-driven component code for ANY framework — React+Tailwind, Next.js, SwiftUI, Vue, Svelte, Angular, Solid, Web Components/Lit, React Native, Flutter, Jetpack Compose, vanilla CSS, or CSS-in-JS. Use when the user wants working UI code for a component or screen in a specific stack.
.claude/skills/plugin87-design-code/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 177% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 201% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 127% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 67% | 0% |
Render components into a target framework via the adapter system.
frameworks/adapter-protocol.md (the universal contract: token resolution, component contract, styling, dark mode, motion + output rules).frameworks/react-tailwind.md, frameworks/nextjs.md, frameworks/swiftui.md.frameworks/adapters/{vue,svelte,angular,solid,web-components-lit,react-native,flutter,jetpack-compose,vanilla-css,css-in-js}.md.components/* and the ARIA pattern from accessibility/aria-patterns.md.tokens/*.json); apply aesthetic direction if requested (apply-aesthetic skill).Use tokens (never hardcode) · include a11y on every interactive element · handle all applicable of the 8 states · support dark mode at the semantic layer · mobile-first · honor reduced motion · deliver complete files, no placeholders (workflows/redesign-audit.md → Output Completeness).
Code is the highest-stakes output — self-check every time:
scripts/lint_hardcodes.py over the output; zero raw hex/px/ms AND zero raw Tailwind palette utilities (bg-gray-500, text-blue-600) — use semantic utilities/tokens (bg-surface, text-primary). Run scripts/validate_theme_refs.py so every var(--…) resolves to a defined theme token (no floating tokens). One allowed exception: 3rd-party theme-config (MUI/Mantine) mapping our tokens INTO their API.aria-busy), Error, Selected — or justified N/A.accessibility/aria-patterns.md, keyboard model, focus management, ≥24px target; verify contrast (scripts/contrast.py) for any new color pair.prefers-reduced-motion fallback; layout is mobile-first.// ...; if asked for N, deliver N. If any check fails, fix before returning (run a11y-audit if unsure).Button, Input, Modal, Badge via cva/equivalent); never repeat utility-class clusters inline across files or hand-roll a div-as-modal per screen. Overlays reuse the single Modal primitive: focus trap, role="dialog", aria-modal="true", aria-labelledby, Escape, return focus on close, backdrop (WCAG 2.4.3 + 2.1.2). See examples/golden/Button.tsx + examples/golden/Modal.tsx.@import web fonts in CSS (render-blocking). Use a framework loader (next/font) or <link rel="preconnect"> + <link rel="preload"> with font-display: swap; self-host when possible. Font family comes from a token (--font-sans), never a literal.action.destructive (danger), never action.primary; secondary = neutral outline/transparent with dark text (never a colored fill → no dark-text-on-blue). The SAME action uses the SAME variant everywhere (a trigger button and its confirm button must match — not red in one place and blue in another). Gates don't catch this — you must.currentColor; never an emoji, including in JS that swaps a label (swap the <svg>, not a text/emoji string). Mentally run scripts/lint_taste.py (it flags emoji-as-icon).examples/sample-app/preview.html and content/voice-tone.md.taste/design-taste.md and, for any rendered HTML, node scripts/taste_audit.mjs <file> (render-based: flags timid type-scale contrast, uniform repetition, over-wide measure, palette sprawl). Taste is heuristic — treat findings as a strong signal and pair with a real screenshot review; it is NOT auto-provable like correctness.node scripts/verify_states.mjs <file> + --dark (every element, default/hover/focus) and node scripts/accuracy_report.mjs; report their actual output. Never type a contrast number or "100%" you didn't just measure (CLAUDE.md → Verification Protocol).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 35,110 | 36,246 | +3% | 1 | 1 | 0% | 6,216 | 7,665 | +23% | 0 | 0 | — |
case-02 | fail→fail | 30,575 | 29,259 | -4% | 1 | 1 | 0% | 6,210 | 7,659 | +23% | 0 | 0 | — |
case-03 | fail→fail | 29,223 | 30,944 | +6% | 1 | 1 | 0% | 6,210 | 7,659 | +23% | 0 | 0 | — |
case-04 | pass→pass | 8,541 | 13,204 | +55% | 1 | 1 | 0% | 1,600 | 3,832 | +140% | 0 | 0 | — |
case-05 | pass→pass | 11,592 | 19,622 | +69% | 1 | 1 | 0% | 2,468 | 5,704 | +131% | 0 | 0 | — |
case-12 | fail→fail | 15,721 | 28,821 | +83% | 1 | 1 | 0% | 3,185 | 7,611 | +139% | 0 | 0 | — |
case-06 | pass→pass | 21,437 | 45,997 | +115% | 1 | 1 | 0% | 4,250 | 7,617 | +79% | 0 | 0 | — |
case-07 | fail→pass | 13,914 | 28,379 | +104% | 1 | 1 | 0% | 2,746 | 7,619 | +177% | 0 | 0 | — |
case-08 | fail→pass | 12,348 | 29,803 | +141% | 1 | 1 | 0% | 2,485 | 7,478 | +201% | 0 | 0 | — |
case-09 | fail→pass | 14,583 | 24,462 | +68% | 1 | 1 | 0% | 2,782 | 6,309 | +127% | 0 | 0 | — |
case-10 | fail→pass | 28,806 | 28,299 | -2% | 1 | 1 | 0% | 6,177 | 7,626 | +23% | 0 | 0 | — |
case-11 | fail→fail | 32,329 | 32,273 | -0% | 1 | 1 | 0% | 6,172 | 7,621 | +23% | 0 | 0 | — |
case-13 | fail→fail | 14,027 | 30,108 | +115% | 1 | 1 | 0% | 3,165 | 7,617 | +141% | 0 | 0 | — |
case-14 | pass→pass | 19,528 | 28,658 | +47% | 1 | 1 | 0% | 4,109 | 7,564 | +84% | 0 | 0 | — |
case-15 | pass→pass | 22,487 | 23,918 | +6% | 1 | 1 | 0% | 4,167 | 5,958 | +43% | 0 | 0 | — |
case-16 | fail→pass | 22,442 | 27,041 | +20% | 1 | 1 | 0% | 4,544 | 7,608 | +67% | 0 | 0 | — |
case-17 | fail→fail | 20,371 | 28,860 | +42% | 1 | 1 | 0% | 4,355 | 7,621 | +75% | 0 | 0 | — |
case-18 | pass→pass | 13,979 | 28,051 | +101% | 1 | 1 | 0% | 2,795 | 7,616 | +172% | 0 | 0 | — |
case-19 | fail→fail | 21,000 | 28,454 | +35% | 1 | 1 | 0% | 4,362 | 7,616 | +75% | 0 | 0 | — |
case-20 | fail→fail | 21,874 | 30,712 | +40% | 1 | 1 | 0% | 4,039 | 7,610 | +88% | 0 | 0 | — |
case-21 | fail→fail | 16,016 | 29,910 | +87% | 1 | 1 | 0% | 3,382 | 7,613 | +125% | 0 | 0 | — |
case-22 | fail→pass | 11,172 | 55,846 | +400% | 1 | 1 | 0% | 1,817 | 7,620 | +319% | 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. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.