Mockup-to-component pipeline using Google Stitch, 21st.dev, and Storybook MCP. Accepts a screenshot, a description, or a URL and produces production-ready React components, checking existing Storybook components before generating anything new. Use when implementing UI from a mockup or screenshot. To call the MCP tool surface on its own, with no design to convert, use storybook-mcp-integration.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
Claude Code 2.1.220+. Optional: stitch (official Google Stitch), 21st-dev-magic, storybook-mcp (@storybook/addon-mcp) MCP servers.
description
Mockup-to-component pipeline using Google Stitch, 21st.dev, and Storybook MCP. Accepts a screenshot, a description, or a URL and produces production-ready React components, checking existing Storybook components before generating anything new. Use when implementing UI from a mockup or screenshot. To call the MCP tool surface on its own, with no design to convert, use storybook-mcp-integration.
{"keywords":["design to code","mockup to code","screenshot to component","convert design","implement ui from","build from mockup"],"examples":["convert this screenshot into a React component","implement the UI from this Figma mockup","build a component from this design"],"anti-triggers":["explore","assess","review","brainstorm","extract design"]}
Convert visual designs into production-ready React components using a four-stage pipeline: Extract, Match, Adapt, Render.
/ork:design-to-code screenshot of hero section # From description
/ork:design-to-code /tmp/mockup.png # From screenshot
/ork:design-to-code https://example.com/pricing # From URL
Pipeline Overview
Input (screenshot/description/URL)
│
▼
┌─────────────────────────┐
│ Stage 1: EXTRACT │ Stitch MCP → HTML + design context
│ build_site │ Generate up to 5 screens from prompt
│ get_screen_code / _image │ Extract React/HTML + PNG for each
└─────────┬───────────────┘
│
▼
┌─────────────────────────┐
│ Stage 2: MATCH │ 1. Storybook MCP → check existing
│ Storybook-first lookup │ 2. 21st.dev → search public registry
│ Then 21st.dev fallback │ 3. Filesystem → grep codebase
└─────────┬───────────────┘
│
▼
┌─────────────────────────┐
│ Stage 3: ADAPT │ Merge extracted design + matched
│ Apply project tokens │ components into final implementation
│ Customize to codebase │ Tests + types included
└─────────┬───────────────┘
│
▼
┌─────────────────────────┐
│ Stage 4: RENDER │ Register as json-render catalog entry
│ Generate Zod schema │ Same component → PDF, email, video
│ Add to defineCatalog() │ Multi-surface reuse via MCP output
└─────────┬───────────────┘
│
▼
┌─────────────────────────┐
│ Stage 4b: VERIFY │ Storybook MCP → self-healing loop
│ run-story-tests(a11y) │ Fix violations, retry (max 3)
│ preview-stories │ Embed live preview in chat
└─────────────────────────┘
Argument Resolution
INPUT = ""# Full argument string# Detect input type:# - Starts with "/" or "~" or contains ".png"/".jpg" → screenshot file path# - Starts with "http" → URL to screenshot or live page# - Otherwise → natural language description
# Official Stitch MCP tools (stitch.withgoogle.com/docs/mcp):# - build_site(prompt) → multi-screen app, up to 5 interconnected screens# - get_screen_code(screenId) → returns React/HTML for a generated screen# - get_screen_image(screenId) → returns PNG of a generated screen## For screenshot/URL input:# 1. Upload screenshot to Stitch (or pass URL)# 2. Call build_site() with the visual as context# 3. get_screen_code() to retrieve the React/HTML output## For description input:# 1. Call build_site(prompt=<description>)# 2. get_screen_code() / get_screen_image() to retrieve the result## DESIGN.md import (Stitch Pro, Mar 2026+):# Stitch can also import a natural-language DESIGN.md file to regenerate# a layout without starting from scratch. Useful for iterative edits.
If stitch MCP is NOT available (fallback):
# For screenshot: Read the image file directly (Claude is multimodal)# Analyze layout, colors, typography, spacing from the image# For URL: WebFetch the page, extract HTML structure# For description: Skip extraction, proceed to Stage 2 with description
Resolution budget (Opus 5 / CC 2.1.111+): Mockups up to 2,576 px on the long edge (~3.75 MP, 3× prior ceiling) produce better component boundaries and spacing extraction. Full-page desktop mockups at native resolution are now in-budget; previously they had to be resized down and lost fine detail. Only downscale inputs exceeding 2,576 px.
Priority 1 — Check project's own Storybook (if storybook-mcp available):
# Search the project's existing component library first
inventory = list-all-documentation() # Full component + docs manifestfor component in inventory.components:
if component matches extracted_description:
details = get-documentation(id=component.id)
# Returns: props schema, stories, usage patterns# → Existing component found — skip external search
Priority 2 — Search 21st.dev (if no Storybook match and 21st-dev-magic available):
# Search 21st.dev for matching components# Use the component descriptions from Stage 1# Example: "animated pricing table with toggle"# Filter: React, Tailwind CSS, shadcn/ui compatible# If SHADCN_STYLE detected, prefer components matching style's visual language# (e.g., Luma → rounded/pill-shaped, Nova → compact/dense, Lyra → sharp/boxy)
Priority 3 — Filesystem fallback (if no MCP servers available):
# Search for components in the project's existing codebase
Grep(pattern="export.*function|export.*const", glob="**/*.tsx")
# Check for shadcn/ui components
Glob("**/components/ui/*.tsx")
# Generate from scratch if no matches found
Present matches to user:
AskUserQuestion(questions=[{
"question": "Which component approach for {component_name}?",
"header": "Component",
"options": [
{"label": "Reuse from Storybook", "description": "{existing_component} — props: {prop_list}"},
{"label": "Use 21st.dev match", "description": "{matched_component_name} — {match_score}% match"},
{"label": "Adapt from codebase", "description": "Modify existing {existing_component}"},
{"label": "Generate from scratch", "description": "Build new component from extracted design"}
],
"multiSelect": false
}])
Stage 3: Adapt to Project
Merge the extracted design context with matched/generated components:
After ADAPT produces a working React component, register it as a json-render catalog entry for multi-surface reuse.
Generate Zod schema — Derive a Zod schema from the component's TypeScript props
Add catalog entry — Register in the project's defineCatalog() call with props schema and children declaration
Verify rendering — Confirm the component renders correctly through <Render catalog={catalog} /> path
import { z } from'zod'// Zod schema derived from {ComponentName}Propsconst componentSchema = z.object({
title: z.string().max(100),
variant: z.enum(['default', 'featured']).default('default'),
// ... props from the adapted component
})
// Add to project catalogimport { defineCatalog } from'@json-render/core'import { existingCatalog } from'./catalog'exportconst catalog = {
...existingCatalog,
{ComponentName}: {
props: componentSchema,
children: true, // or false for leaf components
},
}
Enables: same component output to PDF, email, video, or MCP response — no reimplementation needed.
Skip condition: If the project has no json-render dependency or catalog, inform the user and skip catalog registration. The component from Stage 3 is still fully usable standalone.
After generating the component, verify it with Storybook MCP:
# 1. Write CSF3 story for the new component
Write("src/components/{Name}/{Name}.stories.tsx", story_code)
# 2. Run tests via MCP (component + a11y)
results = run-story-tests(
stories=[{ "storyId": "{name}--default" }],
a11y=True
)
# 3. Handle failures — self-heal up to 3 attemptsifnot results.all_passed:
for failure in results.failures:
# Read violation details, fix the component
Edit("src/components/{Name}/{Name}.tsx", fix)
# Re-run failing tests
results = run-story-tests(stories=[...], a11y=True)
# 4. Preview — embed live story in chat for user confirmation
previews = preview-stories(stories=[
{ "absoluteStoryPath": "src/components/{Name}/{Name}.stories.tsx",
"exportName": "Default" }
])
# Include preview URLs in response for visual confirmation
Skip condition: If storybook-mcp is not available, skip verification. The component is still usable — just not auto-verified.
Graceful Degradation
stitch
21st-dev-magic
storybook-mcp
Behavior
Available
Available
Available
Full pipeline: extract + Storybook-first match + adapt + render + self-heal verify
Available
Available
Unavailable
Extract + 21st.dev match + adapt + render (no verification)
Manual analysis + generate from scratch (still works)
The skill ALWAYS produces output regardless of MCP availability. Storybook MCP adds component reuse (Stage 2) and self-healing verification (Stage 4b) — skipping them still yields a working component.
Anti-Patterns
NEVER output components with hardcoded colors — use design tokens
NEVER skip TypeScript types — all props must be typed
NEVER generate without checking existing project patterns first
NEVER ignore the project's existing component library structure
Quality Bar
Done means all of these hold:
Generated components carry no hardcoded colors or literal spacing — every visual value resolves through project design tokens.
Every prop is TypeScript-typed; data-bearing props carry Zod validation.
Stage 2 checked existing components (Storybook, then 21st.dev, then filesystem) before generating from scratch, and the chosen match source is named.
When storybook-mcp is available, the component passes run-story-tests (component + a11y) before handoff, self-healing within at most 3 attempts.
Output follows the {ComponentName}/ structure — component, test, and barrel export.
Each skipped stage (json-render catalog, Storybook verify) is taken ONLY when its dependency is absent, and the skip is stated with its reason.