Extract and recreate all button styles from this UI: Generate React components for: 1. Primary button 2. Secondary button 3. Ghost/text button 4. Icon button (if present) Each button should include: - All states (default, hover, active, disabled) - Proper TypeScript props interface - Tailwind CSS styling matching the original - Size variants (sm, md, lg)
Prebuilt workflow · Design → code
UI Component Extractor
Pull every button, card, and form input out of a screenshot as composable React components with all states.
· You bring UI screenshot· Button.tsx· Card.tsx· FormInputs.tsx
A real run, unedited3 generations · $0.87 of walletBrand and inputs are fictional, made in Vmotif · 2026-09-24
What came back
Straight off the canvas.
Everything below is what this run returned, untouched.
- Button.tsxtsx
import React, { useState } from 'react'; import { PrimaryButton } from './PrimaryButton'; import { SecondaryButton } from './SecondaryButton'; import { GhostButton } from './GhostButton'; import { IconButton } from './IconButton'; import { WatchIcon, BookmarkIcon, ExpandIcon, CloseIcon, ChevronDownIcon } from './icons'; import type { ButtonSize } from './types'; const sizes: ButtonSize[] = ['sm', 'md', 'lg']; const Section: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => ( <section className="rounded-xl border border-[#E8E5DD] bg-white p-6" aria-labelledby={title}> <h2 id={title} className="mb-4 text-lg font-semibold text-[#1B3A34]">{title}</h2> <div className="space-y-4">{children}</div> - Card.tsxtsx
import React from 'react'; import { TrailCard } from './TrailCard'; import { RouteDetailCard } from './RouteDetailCard'; import { Tag, Trail } from './types'; const tags: Tag[] = [ { label: 'Dirt', variant: 'dirt' }, { label: 'Loop', variant: 'loop' }, { label: 'Low traffic', variant: 'traffic' } ]; const trails: Trail[] = [ { id: 'leigh', name: 'Leigh Woods Loop', location: 'Bristol, UK', distance: '8.4 km', climb: '280 m', tags, mapLabel: 'Leigh Woods', description: 'Shaded woodland trails with river views and quiet singletrack.', routePath: 'M140 60 Q175 50 200 70 Q235 90 240 120 Q230 160 190 175 Q150 200 110 180 Q90 150 105 120 Q120 80 140 60Z' }, { id: 'chew', name: 'Chew Valley Circuit', location: 'Chew Magna, UK', distance: '9.8 km', climb: '190 m', tags, mapLabel: 'Chew Valley Lake', description: 'A peaceful lap around the lake with open views and woodland sections.', lakePath: 'M40 70 Q90 60 110 110 Q130 170 110 190 Q70 200 50 150 Q30 110 40 70Z', routePath: 'M90 80 Q140 55 190 70 Q240 75 260 110 Q240 160 200 175 Q170 195 150 185 Q110 190 100 150 Q70 110 90 80Z' }, - FormInputs.tsxtsx
import React, { useState } from 'react'; import { TextInput, SearchIcon } from './TextInput'; import { Select } from './Select'; import { FilterChipGroup } from './FilterChip'; import { RadioGroup } from './RadioGroup'; const filters = [ { value: 'under10', label: 'Under 10 km' }, { value: 'dirt', label: 'Dirt' }, { value: 'lowtraffic', label: 'Low traffic' }, { value: 'loop', label: 'Loop' }, ]; const sortOptions = [
How it runs
One stage, all at once.
What each stage reads, what it makes and what it cost on this run. Steps inside a stage don’t wait on each other, so they run side by side.
- 01
3 files
Reads your inputs
- Extract Buttons
- Extract Cards
- Extract Form Inputs
From your agent
Or let your agent run it.
This run went through the Vmotif MCP server, the way Claude Code, Cursor or any MCP client drives it: seed the canvas, fill the inputs, run the graph.
create_canvas({ premade_workflow_id: "ui-component-extractor" })
update_canvas({ canvas_id, updates: [/* your inputs */] })
run_workflow({ workflow_id: canvas_id })MCP docs Where it fits
Part of a bigger job.
More in Design → code
Drop in a screenshot, a live URL, or a brand reference and get production-ready front-end code back.
Component ExtractorTurn a UI design into a typed React component — plus a Storybook story to document it.In — UI designOut — Component.tsx · stories.tsxApp ScreensFrom one brand reference, render live, on-brand HTML screens side by side — landing, pricing, and dashboard.In — Brand referenceOut — Landing · Pricing · DashboardWireframe FlowPaste a full product or UX brief and get a connected board of low-fidelity wireframe screens — sitemap first, then one grayscale wireframe per screen.In — Product / UX briefOut — sitemap.md · Wireframe boardAnimation CapturePoint it at any live site, capture the motion, and reverse-engineer it into a Framer Motion component and CSS.In — Live URLOut — analysis.md · Animated.tsx · animation.css

