Verified against Gemini · 2026-07-28
Turn a UI screenshot into working frontend code
A multimodal prompt that treats a screenshot as a literal spec — spacing, hierarchy, text, and visible states — and returns matching component code instead of a loose visual approximation shaped by the model's own design defaults.
The prompt
Ready to copy — highlighted parts are example details you can swap.
Here's a screenshot of a pricing card component from a SaaS landing page. Build this as React with Tailwind CSS code. Match, don't reinterpret: 1. Layout structure — what's in a row vs. stacked, alignment, relative spacing — as closely as the screenshot actually shows it, not the layout you'd typically expect for a component like this. 2. Every visible text label, exactly as written, including button text, placeholder text, and any small print — don't paraphrase a label into something that sounds cleaner. 3. Visible states — if a button looks disabled or active, a field looks focused, or there's a badge or count shown, include that state in the code. Don't drop it for being "just a detail"; a visible state in a screenshot is a spec for that state, not decoration. 4. Colors and type choices close to what's shown; use our existing shadcn/ui theme tokens tokens or variables if the screenshot maps onto one, otherwise use plain values and say explicitly that you did. CONSTRAINTS no external icon libraries, use inline SVG only; must be a single component file Where the screenshot is ambiguous — a cut-off edge, an icon you're not fully sure of, a hover or focus state you can't see because it isn't visible in a static image — say plainly what's ambiguous and what assumption you made, instead of silently inventing a specific value and presenting it as if it came from the screenshot. RESPONSIVE BEHAVIOR A single screenshot only shows one viewport width. Build the component to behave reasonably at other sizes using ordinary responsive patterns, but say explicitly that you're extrapolating beyond what the screenshot actually shows for anything narrower or wider than the captured width — don't present a guessed mobile layout as if it were derived from evidence in the image. ACCESSIBILITY BASICS Even though a screenshot can't show what's in the accessibility tree, apply ordinary baseline practice regardless: real button/link elements instead of divs with click handlers, an alt attribute placeholder on any image, and a visible focus state even where the screenshot doesn't show one being triggered. Note this is a baseline addition, not something read directly off the image. IF THE SCREENSHOT SHOWS AN INTERACTION MID-FLOW If the screenshot appears to capture a transient state — a dropdown open, a toast notification visible, a modal mid-animation — build both the resting state and the captured state as two distinct states of the same component, rather than building only what's shown and leaving the resting state unaddressed. NAMING AND FILE STRUCTURE Name the component after what it is, not after the file it came from or a generic placeholder like Component1. If the screenshot clearly shows a piece of a larger page rather than a self-contained widget, say so, and note what surrounding layout context this piece would need once it's placed back into a real page rather than pretending it's fully self-sufficient in isolation. OUTPUT a single component file plus a one-line list of anything you were unsure about
Customize
Optional — swap in your own details for the highlighted parts above.
Why this works
Gemini's multimodal vision path reads the screenshot's actual pixel layout — spacing, alignment, proportional sizing — directly, rather than working from a text description of the design, which is what makes 'match, don't reinterpret' an enforceable instruction rather than wishful thinking; without it, the model tends to substitute its own aesthetic defaults for the ones actually shown, since a different spacing scale or a more common component pattern is simply more heavily represented in what it's seen during training than this one specific screenshot is. Explicitly requiring visible states — disabled, focused, badge counts — to be included counters the tendency to treat a screenshot as a static mockup of only the happy path and quietly drop states that would otherwise need separate design documentation to specify; a visible disabled button in the screenshot is direct evidence of a real state in the actual product, not an artifact of the capture. The ambiguity-flagging instruction targets cropped or unclear regions specifically — a cut-off icon or an edge that's out of frame gets filled with a plausible guess by default, and naming that guess as a guess is the difference between code you can trust and code you have to re-verify against the original design anyway before shipping it. Explicitly separating what the screenshot proves from what's a reasonable responsive extrapolation matters because a single image is direct evidence for exactly one viewport width — a model that builds a mobile layout without saying so invites the reader to assume that layout came from the same visual authority as the desktop version it was actually captured from, when it's really an assumption dressed identically to a verified fact. Requiring baseline accessibility practices regardless of what the screenshot shows corrects for the fact that a static image structurally cannot show semantic markup, focus order, or ARIA attributes at all — treating the image as the complete spec would silently drop these, not because they weren't needed, but because there was never a channel for a screenshot to communicate them in the first place, so they have to be supplied from ordinary practice rather than from the image.
What you get back
export function PricingCard() { return ( <div className="rounded-xl border p-6 shadow-sm"> <h3 className="text-lg font-semibold">Pro</h3> <p className="text-3xl font-bold mt-2">$29<span className="text-sm font-normal">/mo</span></p> <button className="mt-4 w-full rounded-md bg-black text-white py-2" disabled> Current plan </button> </div> ) } Unsure about: the small icon next to "Pro" was partially cut off at the top edge of the screenshot — used a generic badge placeholder instead of guessing which specific icon it was.
Verified against
Gemini Gemini 3 Pro · 2026-07-28
Changelog
- 2026-07-28 — Initial publish, verified against Gemini 3 Pro on a cropped pricing-card screenshot.
Need this built into your business?
If a prompt isn't enough — what Scult builds, built and maintained for you — that's Scult's day job.
EXPLORE WHAT SCULT BUILDS
