Analyzes UI screenshots to extract design tokens, color palettes, typography scales, spacing patterns, components, and layout structures via eight-phase process.
From humaninloopnpx claudepluginhub deepeshbodh/human-in-loop --plugin humaninloopThis skill uses the workspace's default tool permissions.
references/implementation-templates.mdSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Executes pre-written implementation plans: critically reviews, follows bite-sized steps exactly, runs verifications, tracks progress with checkpoints, uses git worktrees, stops on blockers.
Extract precise, implementation-ready design tokens, components, and layout structure from screenshot images through a systematic eight-phase process. Every extraction must trace back to something observed in the screenshot, and every gap must be explicitly acknowledged.
Before extracting any tokens, establish the context of the interface.
Identify and document:
| Attribute | What to Determine |
|---|---|
| Platform | Mobile (iOS/Android), web (desktop/responsive), desktop app |
| Design language | Material, iOS HIG, custom, hybrid |
| Layout approach | Single column, multi-column, sidebar+content, dashboard grid |
| Density | Compact (data-heavy), comfortable (standard), spacious (marketing) |
| Color mode | Light, dark, or mixed |
| Apparent era | Current design trends vs. dated patterns |
Output format:
PLATFORM: [platform]
DESIGN LANGUAGE: [language]
LAYOUT: [approach]
DENSITY: [level]
COLOR MODE: [mode]
NOTES: [anything notable about the overall approach]
Extract every distinguishable color. Organize by role, not by where it appears.
PRIMARY PALETTE:
Brand Primary: #XXXXXX (observed in: [element])
Brand Secondary: #XXXXXX (observed in: [element])
NEUTRAL PALETTE:
Background Base: #XXXXXX (observed in: [element])
Background Elevated: #XXXXXX (observed in: [element])
Surface: #XXXXXX (observed in: [element])
Border Default: #XXXXXX (observed in: [element])
Text Primary: #XXXXXX (observed in: [element])
Text Secondary: #XXXXXX (observed in: [element])
Text Muted: #XXXXXX (observed in: [element])
SEMANTIC PALETTE:
Success: #XXXXXX (observed in: [element])
Warning: #XXXXXX (observed in: [element])
Error: #XXXXXX (observed in: [element])
Info: #XXXXXX (observed in: [element])
ACCENT PALETTE:
[role]: #XXXXXX (observed in: [element])
Every color entry MUST include the (observed in: ...) attribution. If a semantic color is not visible in the screenshot, omit it and note its absence in the gaps section.
Identify every distinct typographic treatment visible in the screenshot.
FONT FAMILIES:
Primary: [family] (confidence: high/medium/low)
Secondary: [family] (confidence: high/medium/low)
Monospace: [family] (if present)
TYPE SCALE:
Display: ~[size]px / weight [N] / leading [N] (observed in: [element])
Heading 1: ~[size]px / weight [N] / leading [N] (observed in: [element])
Heading 2: ~[size]px / weight [N] / leading [N] (observed in: [element])
Heading 3: ~[size]px / weight [N] / leading [N] (observed in: [element])
Body: ~[size]px / weight [N] / leading [N] (observed in: [element])
Caption: ~[size]px / weight [N] / leading [N] (observed in: [element])
Label: ~[size]px / weight [N] / leading [N] (observed in: [element])
Overline: ~[size]px / weight [N] / leading [N] (observed in: [element])
LETTER SPACING:
Headings: [value or "normal"]
Labels: [value or "normal"]
Overline: [value or "normal"]
Mark all pixel values with ~ (approximate) unless the screenshot provides enough context for exact measurement. Note confidence level for font family identification.
Extract the spacing system by identifying the base unit and its multipliers.
BASE UNIT: [N]px
SPACING SCALE:
2xs: [N]px ([base] x [multiplier]) — used for: [context]
xs: [N]px ([base] x [multiplier]) — used for: [context]
sm: [N]px ([base] x [multiplier]) — used for: [context]
md: [N]px ([base] x [multiplier]) — used for: [context]
lg: [N]px ([base] x [multiplier]) — used for: [context]
xl: [N]px ([base] x [multiplier]) — used for: [context]
2xl: [N]px ([base] x [multiplier]) — used for: [context]
COMPONENT PADDING PATTERNS:
Buttons: [top] [right] [bottom] [left]
Cards: [top] [right] [bottom] [left]
Inputs: [top] [right] [bottom] [left]
List items: [top] [right] [bottom] [left]
GAP PATTERNS:
Form fields: [N]px between fields
Button groups: [N]px between buttons
Section gap: [N]px between major sections
Identify and document every distinct UI component visible in the screenshot.
For each component:
For each component:
COMPONENT: [Name]
Variants observed: [list]
States visible: [list]
States NOT visible: [list — mark as gap]
Dimensions:
Height: ~[N]px
Padding: [values]
Border radius: [N]px
Font size: ~[N]px
Font weight: [N]
Icon size: [N]px (if applicable)
Colors:
Background: #XXXXXX
Text: #XXXXXX
Border: #XXXXXX (if applicable)
Icon: #XXXXXX (if applicable)
Composition: [sub-elements]
Notes: [anything unusual or distinctive]
Scan for each of these. Mark present or absent:
Document the spatial organization and visual hierarchy of the interface.
GRID:
Type: [fixed/fluid/hybrid]
Columns: [N]
Gutter: ~[N]px
Margin: ~[N]px
Max width: ~[N]px (if constrained)
SECTION MAP:
[Section name]: [position, approximate dimensions, role]
[Section name]: [position, approximate dimensions, role]
...
VISUAL HIERARCHY (reading order):
1. [Element/area] — draws attention via [mechanism]
2. [Element/area] — secondary focus via [mechanism]
3. [Element/area] — tertiary via [mechanism]
ALIGNMENT:
Primary axis: [left/center/mixed]
Notable breaks: [any deliberate alignment breaks]
CONTENT DENSITY:
[Section]: [sparse/moderate/dense]
Document the depth strategy, border treatments, and shadow system.
DEPTH STRATEGY: [borders-only / subtle-shadows / layered-shadows / surface-shifts]
BORDER RADII:
Small (buttons, inputs): [N]px
Medium (cards, panels): [N]px
Large (modals, sheets): [N]px
Full (avatars, pills): [N]px (9999px / 50%)
SHADOWS:
Level 1 (subtle): [offset-x] [offset-y] [blur] [spread] [color]
Level 2 (medium): [offset-x] [offset-y] [blur] [spread] [color]
Level 3 (elevated): [offset-x] [offset-y] [blur] [spread] [color]
BORDER TREATMENTS:
Default: [width] [style] [color]
Subtle: [width] [style] [color]
Strong: [width] [style] [color]
ELEVATION MAP:
Level 0: [elements at base level]
Level 1: [elements floating above base]
Level 2: [elements above level 1]
Level 3: [highest elevation elements]
DIVIDER PATTERN: [description of how sections are separated]
Compile all phase outputs into a single structured extraction document.
Every extraction MUST end with an honest gaps section:
KNOWN GAPS:
Cannot determine from static screenshot:
- [ ] Hover states for [components]
- [ ] Focus ring styles
- [ ] Animation/transition properties
- [ ] Responsive breakpoint behavior
- [ ] Touch target sizes (if mobile)
- [ ] Scroll behavior
- [ ] [Other gaps specific to this screenshot]
Low confidence extractions:
- [ ] [Item] — reason for low confidence
- [ ] [Item] — reason for low confidence
Never fabricate values for gaps. State what is unknown and suggest how to obtain the missing information (e.g., "inspect the live app," "request additional screenshots at different viewport widths").
When the user intends to implement the extracted system, include a CSS custom properties mapping or Tailwind configuration snippet. See references/implementation-templates.md for starter templates.
| Mistake | Fix |
|---|---|
| Guessing hex values instead of acknowledging approximation | Prefix all color values with context; use ~ for uncertain sizes |
| Extracting colors without assigning roles | Every color must have a named role (primary, secondary, border, etc.) |
| Listing components without measuring them | Every component needs dimensions, padding, and radius values |
| Ignoring the spacing system | Identify the base unit first; express all spacing as multiples |
| Skipping the gaps section | Always document what cannot be determined from a static image |
| Treating all text sizes as a flat list | Organize into a hierarchical scale with named levels |
| Extracting shadows without noting the depth strategy | Classify the overall approach before listing individual shadow values |
| Providing vague font identification | State confidence level; suggest closest known match |
Before delivering any screenshot analysis:
Completeness:
Precision:
~ where approximate)Honesty: