MiniMax M3 Multimodal Input
madebyaris/advance-minimax-m3-cursor-rules
Teaches an agent on MiniMax M3 to ground visual claims in attached images, screenshots, mockups and clips, and to re-read results after a visual change.
Image-to-code replication pipeline. An agent skill from Yu-369/VibeCurb.
$ npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Yu-369/VibeCurb pixel-perfect-replication --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Yu-369/VibeCurb.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/pixel-perfect .claude/skills/pixel-perfect-replication && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pixel-perfect-replication" agent skill from https://github.com/Yu-369/VibeCurb/tree/main/skills/pixel-perfect into .claude/skills/pixel-perfect-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixel-perfect-replication", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Yu-369/VibeCurb/tree/main/skills/pixel-perfectType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Yu-369/VibeCurb pixel-perfect-replication --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yu-369/VibeCurb.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/pixel-perfect .agents/skills/pixel-perfect-replication && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pixel-perfect-replication" agent skill from https://github.com/Yu-369/VibeCurb/tree/main/skills/pixel-perfect into .agents/skills/pixel-perfect-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixel-perfect-replication", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Yu-369/VibeCurb pixel-perfect-replication --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yu-369/VibeCurb.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/pixel-perfect .cursor/skills/pixel-perfect-replication && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pixel-perfect-replication" agent skill from https://github.com/Yu-369/VibeCurb/tree/main/skills/pixel-perfect into .cursor/skills/pixel-perfect-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixel-perfect-replication", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Yu-369/VibeCurb.git --path skills/pixel-perfect--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Yu-369/VibeCurb pixel-perfect-replication --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yu-369/VibeCurb.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/pixel-perfect .gemini/skills/pixel-perfect-replication && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pixel-perfect-replication" agent skill from https://github.com/Yu-369/VibeCurb/tree/main/skills/pixel-perfect into .gemini/skills/pixel-perfect-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixel-perfect-replication", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Yu-369/VibeCurb pixel-perfect-replicationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Yu-369/VibeCurb.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/pixel-perfect .github/skills/pixel-perfect-replication && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pixel-perfect-replication" agent skill from https://github.com/Yu-369/VibeCurb/tree/main/skills/pixel-perfect into .github/skills/pixel-perfect-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixel-perfect-replication", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Yu-369/VibeCurb pixel-perfect-replication --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yu-369/VibeCurb.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/pixel-perfect .opencode/skills/pixel-perfect-replication && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pixel-perfect-replication" agent skill from https://github.com/Yu-369/VibeCurb/tree/main/skills/pixel-perfect into .opencode/skills/pixel-perfect-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixel-perfect-replication", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pixel-perfect-replicationImage-to-code replication pipeline. An agent skill from Yu-369/VibeCurb.
Pixel Perfect Replication is an agent skill from Yu-369/VibeCurb. Image-to-code replication pipeline. When the user provides a screenshot or design reference, this skill runs a structured extraction across seven layers (grid, type, color, spacing, components, atmosphere, interaction), builds an Extraction Sheet before any code is written, implements with exact fidelity to the reference, and verifies through inline Quality Gates and a final Visual Diff. The reference image is the spec. The code is a translation, not an interpretation.
Its SKILL.md is about 8.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Databases, covering Design to code, Database administration and Quality gates. The repository describes itself as: VibeCurb - Injects taste into AI workflows to stop agents from generating boring, AI slop. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c324ba7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are css).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
fonts.googleapis.comw3.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Pixel Perfect Replication loads about 8.7k tokens when it runs. Until then it costs about 125 tokens; SKILL.md has 3,098 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Yu-369/VibeCurb at commit c324ba7, republished under its MIT licence (© Yu-369). 3,098 words, ~8,721 tokens.
.claude/skills/pixel-perfect-replication/SKILL.md (or your agent's skills folder).This skill fires when the user provides a screenshot, mockup, Figma export, or any design image and asks you to replicate it in code. The reference image is the specification. Your role is translator, not designer. Every visual decision - font size, spacing, color, radius, shadow, layout proportion - comes from the image, not from your preferences.
Every replication job follows this flow. No phase can be skipped. No phase can start before the previous one completes.
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ IMAGE IN ──→ Phase 1: Intake ──→ Phase 2: Deep Extraction │
│ (classify) (7 layers, fill sheets) │
│ │
│ ──→ Phase 3: Build │
│ (structure-first, exact CSS) │
│ │
│ ──→ Phase 4: Visual Diff │
│ (verify against reference) │
│ │
│ Each phase has a ✓ Quality Gate. Failing a gate blocks the next. │
│ │
└─────────────────────────────────────────────────────────────────────┘Receive the reference image. Before doing anything else, classify what you are looking at.
Fill in this table for every reference image:
| Field | Your answer |
|---|---|
| Image type | Full-page screenshot / single section / component detail / mobile view / desktop view / Figma frame / design tool export / live site screenshot |
| Sections visible | List top-to-bottom, e.g. "Nav → Hero → Features → Testimonials → Footer" |
| Target viewport | Estimated width: 1440px (desktop), 1280px (laptop), 768px (tablet), 375px (mobile) |
| Fidelity | High-res export (sub-pixel details are intentional) / compressed screenshot (some lossy artifacts) |
| Theme | Light / Dark / Mixed |
Before any code, state what you see in structured natural language. This anchors every decision that follows.
Example:
Light mode, 1440px desktop. Five sections: sticky frosted nav with logo left / links center / CTA right, hero with massive serif heading left-aligned over full-bleed photography, 3-col feature grid with icon-top cards, testimonial carousel with large quotation marks, minimal footer with 4-col link grid. Palette: warm cream base, near-black text, terracotta accent on CTAs. Typography: serif display heading (likely Playfair Display), geometric sans body (likely Outfit). Cards are sharp-cornered, buttons are pill-shaped. No visible shadows - flat design with subtle border separators.
Do not guess. Ask specifically:
"The nav links are too compressed to read at this resolution. The body font could be Outfit or Satoshi - they share near-identical geometry at this size. Can you provide a closer crop of the nav, or confirm the font stack?"
Before moving to Phase 2, confirm:
Run all seven extraction layers on the reference image. Each layer focuses on one dimension of the design. Fill in the Extraction Sheet for each. Skipping a layer causes drift - small errors here compound into "it looks off" in the final build.
Extract the spatial skeleton.
Extraction Sheet:
| Property | Measured value |
|---|---|
| Container max-width | e.g. 1280px, 1440px - measure by proportion against viewport edges |
| Column system | e.g. grid-cols-[1.15fr_1fr], grid-cols-3, single column centered |
| Horizontal padding | e.g. px-6 md:px-12 lg:px-20 - measure the gap between content edge and viewport edge |
| Section heights | min-h-[100dvh] for full-viewport, auto for content-driven |
| Section spacing | Vertical gap between sections, e.g. py-24 lg:py-32 |
| Alignment | Per-section: left / center / right / mixed |
| Z-axis layering | Any overlaps? Elements stacked on top of others? |
How to measure proportions from images:
max-w-[54rem]grid-cols-[1.5fr_1fr]2em relative to the heading⚠ Drift Warning: The most common layout error is getting the container max-width wrong. A design with max-w-[1200px] looks noticeably different from one with max-w-[1440px] - the whitespace proportions change completely. Measure carefully.
This is the most critical extraction. Wrong typography is the #1 reason a replication "looks off."
Extraction Sheet (fill for EVERY visible text element):
| Element | Font family | Weight | Size | Line-height | Letter-spacing | Transform | Color |
|---|---|---|---|---|---|---|---|
| Nav links | |||||||
| Eyebrow/label | |||||||
| H1 (hero) | |||||||
| H2 (section) | |||||||
| H3 (card title) | |||||||
| Body text | |||||||
| Caption/meta | |||||||
| CTA text | |||||||
| Footer links |
Font identification - what to look for:
Fonts reveal themselves through specific characters. Study these before guessing:
| Check this character | What it tells you |
|---|---|
Lowercase a | Single-story (Geist, Helvetica) vs double-story (Outfit, Satoshi, DM Sans) |
Lowercase g | Open-tail (most sans-serifs) vs closed-tail (Futura, some geometric) |
Lowercase t | Curved crossbar (humanist: Manrope, Jakarta) vs straight (geometric: Outfit, Satoshi) |
Capital R | Straight leg (Geist, Helvetica) vs curved leg (Outfit, Satoshi) |
Capital Q | Tail style varies dramatically between fonts - strong identifier |
Lowercase e | High crossbar (geometric) vs centered (humanist) |
Numbers 1, 4, 6, 9 | Highly distinctive shapes across fonts |
Common web font quick-reference:
| Visual character | Strong candidates |
|---|---|
Geometric, double-story a, round counters | Outfit, Satoshi, DM Sans, Plus Jakarta Sans |
Grotesque, single-story a, flat terminals | Geist, Suisse Intl, Helvetica Neue |
| Humanist, open counters, calligraphic stress | Manrope, Plus Jakarta Sans, Nunito Sans |
| Condensed, tall x-height | Barlow Condensed, Oswald, Archivo Narrow |
| Modern serif, high contrast, sharp serifs | Playfair Display, Bodoni Moda |
| Transitional serif, moderate contrast | Lora, Merriweather, Source Serif Pro |
| Display sans, wide, heavy | Cabinet Grotesk, Clash Display, Monument Extended |
| Monospace | JetBrains Mono, Fira Code, IBM Plex Mono, Geist Mono, Space Mono |
If you cannot confidently identify the font, state your top 2-3 candidates with the distinguishing character that makes you lean one way. Example: "The double-story 'a' and round 'o' suggest Outfit, but the slightly squared terminals could indicate Satoshi. Defaulting to Outfit - swap by changing --font-display if incorrect."
⚠ Drift Warning: Never assume a heading is font-weight: 700 because "headings are bold." Many premium designs use 500 or 600 for headings with a heavier font face. Look at stem thickness relative to the counter space.
Extract every distinct color. Not "it uses blue" - extract the hex.
Extraction Sheet:
| Role | Hex value | Notes |
|---|---|---|
| Background (primary) | e.g. #F5F0EB warm cream, not plain #FFFFFF | |
| Background (secondary) | Alternate section BG, card BG | |
| Background (dark section) | If any sections flip to dark | |
| Text (primary) | Heading + body text on primary BG | |
| Text (secondary) | Muted descriptions, metadata | |
| Text (tertiary) | Placeholders, disabled states | |
| Accent | CTAs, active indicators, links | |
| Accent (hover) | Darker/lighter variant on interaction | |
| Border | Card borders, dividers, input borders | |
| Shadow | If tinted, note the hue |
Extracting colors from compressed screenshots:
Screenshots compress colors. To get accurate values:
#0b0b0b, it is almost certainly #0a0a0a (standard off-black). If you measure #f4f3f1, it is likely #f5f4f2 (common warm cream)⚠ Drift Warning: The difference between #FFFFFF (pure white) and #F5F0EB (warm cream) completely changes the feel of a page. Do not default to #FFFFFF or #000000 unless the reference genuinely shows pure values - most premium designs use off-white and off-black.
Spacing is what separates "looks close" from "looks identical."
Extraction Sheet:
| Measurement | Value | How to verify |
|---|---|---|
| Base unit | 4px or 8px | Measure the smallest repeated gap |
| Button padding (H) | e.g. 24px / px-6 | Horizontal space between text edge and button edge |
| Button padding (V) | e.g. 12px / py-3 | Vertical space |
| Card internal padding | e.g. 32px / p-8 | Space from card edge to card content |
| Grid gap | e.g. 24px / gap-6 | Space between cards/columns |
| Heading → subtext | e.g. 16px / mt-4 | Gap between heading baseline and subtext top |
| Subtext → CTA | e.g. 32px / mt-8 | Gap between subtext and button |
| Section padding (top) | e.g. 96px / pt-24 | Space from section top to first element |
| Section padding (bottom) | e.g. 128px / pb-32 | Space from last element to section bottom |
| Nav height | e.g. 64px / h-16 | Total nav bar height |
| Nav link gap | e.g. 32px / gap-8 | Space between nav links |
⚠ Drift Warning: Top and bottom section padding are often not equal. Many designs use more bottom padding than top (or vice versa) for optical balance. Do not assume py-24 when the reference shows pt-20 pb-28. Measure each side independently.
Catalog every distinct UI component visible in the image.
For each component, fill in:
| Component | Shape (radius) | Border | Shadow | Background | States visible | Icon style |
|---|---|---|---|---|---|---|
| Primary button | ||||||
| Secondary button | ||||||
| Card | ||||||
| Input field | ||||||
| Badge/pill | ||||||
| Avatar | ||||||
| Navigation | ||||||
| Divider |
Border-radius consistency check: Most designs commit to one radius language. Check whether the design uses:
0px everywhere (brutalist, editorial)4-8px everywhere (SaaS, product)12-16px everywhere (modern, friendly)9999px on buttons, rounded on cards (premium, polished)⚠ Drift Warning: If buttons are pill-shaped (rounded-full) in the reference, they cannot be rounded-lg in the code. Radius mismatches are immediately visible - the eye detects them faster than color or spacing errors.
Extract the subtle details that make a design feel alive vs flat.
Extraction Sheet:
| Property | Present? | Details |
|---|---|---|
| Noise/grain overlay | yes/no | Opacity level (typically 0.03-0.06) |
| Radial ambient glow | yes/no | Position, color, spread |
| Frosted glass (backdrop-blur) | yes/no | On what elements, blur amount |
| Gradient backgrounds | yes/no | Direction, stops, colors |
| Tinted shadows | yes/no | Shadow hue, not just black |
| Image overlays/scrims | yes/no | Gradient direction, opacity |
| Background images/patterns | yes/no | Subtle texture, dots, lines |
| Depth/layering feel | flat / subtle / heavy | Overall shadow usage |
Even from a static image, extract clues about behavior.
Extraction Sheet:
| Signal | Inference |
|---|---|
| Multi-column layout | Will collapse to single column below 768px |
| Horizontal nav bar | Will need mobile menu below 768px |
| Sticky-looking nav | position: fixed; top: 0 with backdrop-blur likely |
| Elements positioned as if "just landed" | Entry animation implied (fade-up with stagger) |
| Buttons with visual depth | Lift on hover (translateY(-1px), shadow increase) |
| Cards with borders | Border color change or subtle background shift on hover |
| Dot indicators near images | Carousel/slider component |
| Active/selected tab styling | Tab component with state management |
| Form inputs visible | Focus ring, validation states needed |
Before moving to Phase 3, confirm:
Implementation starts here. Follow this exact build order - each step depends on the one before it.
Set the design tokens first. Everything else references these.
/* BLUEPRINT: Global tokens
WHY: Setting these first means every component inherits
the correct base values. Changing a token here updates
the entire page. */
@import url('https://fonts.googleapis.com/css2?family=FONT_NAME:wght@300;400;500;600;700&display=swap');
:root {
/* Colors - from Extraction Sheet Layer 3 */
--color-bg: #____;
--color-surface: #____;
--color-text: #____;
--color-text-2: #____;
--color-text-3: #____;
--color-accent: #____;
--color-accent-hover: #____;
--color-border: rgba(_, _, _, _);
/* Typography - from Extraction Sheet Layer 2 */
--font-display: 'FONT_NAME', Georgia, serif;
--font-body: 'FONT_NAME', system-ui, sans-serif;
--font-mono: 'FONT_NAME', monospace;
/* Spacing - from Extraction Sheet Layer 4 */
--space-section: clamp(5rem, 10vw, 8rem);
--space-component: 2rem;
--space-element: 1rem;
/* Radius - from Extraction Sheet Layer 5 */
--radius-card: __px;
--radius-button: __px;
--radius-input: __px;
}
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: var(--font-body);
font-size: 1rem; /* Adjust if reference base is not 16px */
line-height: 1.6; /* From extraction */
color: var(--color-text);
background-color: var(--color-bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}Build the section containers with correct dimensions. No content yet - just the boxes.
/* BLUEPRINT: Section containers
WHY: Getting the spatial structure right first prevents
cascading spacing errors when content is added. */
.section {
width: 100%;
max-width: ____px; /* From Layer 1 extraction */
margin: 0 auto;
padding: var(--space-section) clamp(1.5rem, 5vw, 5rem);
}
/* Full-viewport section */
.section--full {
min-height: 100dvh;
/* WHY dvh not vh: vh causes a layout jump on iOS Safari
when the address bar collapses. dvh accounts for this. */
display: flex;
flex-direction: column;
justify-content: center;
}
/* Grid layouts - adjust columns to match reference */
.grid-2-asymmetric {
display: grid;
grid-template-columns: 1.15fr 1fr; /* From Layer 1 */
align-items: center;
gap: 4rem;
}
.grid-3-equal {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem; /* From Layer 4 */
}
@media (max-width: 768px) {
.grid-2-asymmetric,
.grid-3-equal {
grid-template-columns: 1fr;
gap: 2rem;
}
}Apply all text styles from the Layer 2 Extraction Sheet.
/* BLUEPRINT: Typography scale
WHY: Every property is explicitly set from the extraction.
Never rely on browser defaults - they will drift. */
.heading-display {
font-family: var(--font-display);
font-size: clamp(2.5rem, 6vw, 5rem); /* From extraction */
font-weight: 700; /* Verified from stem thickness, not assumed */
line-height: 0.95; /* Tight - measured from baseline gap */
letter-spacing: -0.03em; /* Negative - measured from character proximity */
color: var(--color-text);
text-wrap: balance;
max-width: 18ch; /* Prevents 4+ line wraps */
}
.heading-section {
font-family: var(--font-display);
font-size: clamp(1.75rem, 4vw, 3rem);
font-weight: 600;
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--color-text);
}
.body-text {
font-family: var(--font-body);
font-size: clamp(0.9375rem, 1.1vw, 1.125rem);
font-weight: 400;
line-height: 1.65;
color: var(--color-text-2);
max-width: 55ch; /* Comfortable reading width */
}
.eyebrow {
font-family: var(--font-mono);
font-size: 0.6875rem;
font-weight: 500;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--color-text-3);
}
.caption {
font-size: 0.8125rem;
line-height: 1.5;
color: var(--color-text-3);
}⚠ Drift Warning: Do not round font sizes to convenient values. If the extraction shows 15px body text, use 0.9375rem, not 1rem. If the heading looks like 72px, use 4.5rem, not 5rem. Rounding accumulates across the page.
Build each component from the Layer 5 Extraction Sheet.
/* BLUEPRINT: Button - primary
WHY: Padding, radius, and font-size are from the extraction.
The transition easing (0.16, 1, 0.3, 1) gives a snappy
deceleration that feels physical. */
.btn-primary {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 0.75rem 1.5rem; /* From Layer 4 */
font-family: var(--font-body);
font-size: 0.875rem; /* From Layer 2 */
font-weight: 600;
letter-spacing: 0.04em; /* Only if extraction shows tracking */
text-transform: uppercase; /* Only if extraction shows uppercase */
border-radius: var(--radius-button);
background: var(--color-accent);
color: #FFFFFF;
border: none;
cursor: pointer;
text-decoration: none;
transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
.btn-primary:hover {
background: var(--color-accent-hover);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
}
.btn-primary:active {
transform: translateY(0) scale(0.98);
}
.btn-primary:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
}
/* BLUEPRINT: Button - ghost/outline */
.btn-ghost {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 0.75rem 1.5rem;
font-family: var(--font-body);
font-size: 0.875rem;
font-weight: 500;
border-radius: var(--radius-button);
background: transparent;
color: var(--color-text);
border: 1px solid var(--color-border);
cursor: pointer;
text-decoration: none;
transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
.btn-ghost:hover {
border-color: var(--color-text);
background: rgba(0, 0, 0, 0.03);
}
/* BLUEPRINT: Card */
.card {
background: var(--color-surface);
border-radius: var(--radius-card);
padding: var(--space-component);
border: 1px solid var(--color-border);
/* Shadow: only add if extraction shows shadow */
}
/* BLUEPRINT: Navigation */
.nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 50;
height: 64px; /* From Layer 4 extraction */
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 clamp(1.5rem, 5vw, 5rem);
background: rgba(255, 255, 255, 0.85); /* Adjust to match */
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid var(--color-border);
}
.nav-link {
font-size: 0.875rem;
font-weight: 500;
color: var(--color-text-2);
text-decoration: none;
transition: color 0.2s ease;
}
.nav-link:hover {
color: var(--color-text);
}Walk through every element gap and verify against the Layer 4 Extraction Sheet. This is where implementations most commonly drift.
Add texture and depth from the Layer 6 Extraction Sheet. Only add what the reference shows.
/* BLUEPRINT: Noise/grain overlay
WHY: Breaks digital flatness. Only add if the reference
shows subtle texture on the background.
Uses position:fixed so the grain doesn't scroll. */
.grain-overlay {
position: fixed;
inset: 0;
pointer-events: none;
z-index: 9999;
opacity: 0.04; /* Adjust to match reference intensity */
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");
}
/* BLUEPRINT: Ambient radial glow
WHY: Adds depth to flat dark backgrounds. Only use if the
reference shows a subtle light center. */
.ambient-glow {
position: absolute;
inset: 0;
background: radial-gradient(
ellipse 60% 50% at 50% 40%,
rgba(255, 255, 255, 0.035) 0%,
transparent 70%
);
pointer-events: none;
}
/* BLUEPRINT: Frosted glass surface
WHY: For navs or overlays that show content blurring through.
saturate(180%) makes colors pop through the blur layer. */
.surface-frosted {
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
}⚠ Drift Warning: Do not add grain, glow, or blur if the reference does not show them. These are atmosphere details, not defaults. Adding texture the reference does not have is interpretation, not replication.
If the reference is desktop-only, infer mobile behavior from the layout structure. If both desktop and mobile references are provided, match both exactly.
/* BLUEPRINT: Mobile collapse
WHY: Every multi-column layout must collapse to single-column.
Touch targets must be minimum 44px for accessibility. */
@media (max-width: 768px) {
.grid-2-asymmetric,
.grid-3-equal {
grid-template-columns: 1fr;
}
.heading-display {
/* clamp() already handles this, but verify the minimum */
max-width: 100%;
}
.nav {
/* May need a hamburger menu implementation */
}
/* Touch targets */
.btn-primary,
.btn-ghost,
.nav-link {
min-height: 44px;
}
}Add hover states and entry animations. Static images cannot show interaction, but every interactive element needs feedback.
/* BLUEPRINT: Staggered entry animation
WHY: Elements that fade+slide in feel intentional.
The blur-to-sharp adds perceived quality.
prefers-reduced-motion disables for accessibility. */
@keyframes enter {
from {
opacity: 0;
transform: translateY(24px);
filter: blur(6px);
}
to {
opacity: 1;
transform: translateY(0);
filter: blur(0);
}
}
.animate-in {
animation: enter 0.7s cubic-bezier(0.16, 1, 0.3, 1) both;
}
.animate-in:nth-child(1) { animation-delay: 0.05s; }
.animate-in:nth-child(2) { animation-delay: 0.15s; }
.animate-in:nth-child(3) { animation-delay: 0.25s; }
.animate-in:nth-child(4) { animation-delay: 0.35s; }
@media (prefers-reduced-motion: reduce) {
.animate-in {
animation: none;
opacity: 1;
transform: none;
filter: none;
}
}
/* Universal interactive transition */
a, button, [role="button"], input, select, textarea {
transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}Before moving to Phase 4, confirm:
Compare your implementation against the reference image. This is the final verification. Walk through every category below. Mark each item PASS or FAIL. Any FAIL blocks delivery.
| Check | PASS/FAIL |
|---|---|
| Section count and order match | |
| Container max-width proportions match | |
| Horizontal padding matches | |
| Grid column counts and ratios match | |
| Section heights feel proportionally correct | |
| Vertical spacing between sections matches | |
| Element alignment (left/center/right) matches per section | |
| Z-axis layering matches (if present) |
| Check | PASS/FAIL |
|---|---|
| Font family loaded and rendering correctly | |
| Heading size proportionally correct against viewport | |
| Heading weight matches (not too thin, not too heavy) | |
| Heading line-height matches (tight vs relaxed) | |
| Heading letter-spacing matches (tight vs wide) | |
| Body text size matches | |
| Body line-height and max-width match | |
| Eyebrow/label styling matches (size, case, tracking, font) | |
| Text colors match per element type |
| Check | PASS/FAIL |
|---|---|
| Primary background color matches (not #FFF when it should be #F5F0EB) | |
| Text colors match (primary and secondary) | |
| Accent color matches | |
| Border/divider colors match | |
| No unexpected color shifts between sections |
| Check | PASS/FAIL |
|---|---|
| Button radius matches (pill vs rounded vs sharp) | |
| Button padding matches | |
| Button text styling matches (size, weight, case, tracking) | |
| Card styling matches (radius, padding, border, shadow) | |
| Navigation matches (height, background treatment, link styling) | |
| Image treatment matches (radius, aspect ratio, object-fit) |
| Check | PASS/FAIL |
|---|---|
| Heading → subtext gap matches | |
| Subtext → CTA gap matches | |
| Card internal padding matches | |
| Grid gap between elements matches | |
| Section padding (top AND bottom independently) matches | |
| Overall breathing room / negative space feels correct |
| Check | PASS/FAIL |
|---|---|
| Background atmosphere matches (flat/grain/gradient/glow) | |
| Shadow presence and intensity match | |
| Frosted glass / blur effects present where reference shows them | |
| No atmosphere effects added that the reference does NOT show |
| Check | PASS/FAIL |
|---|---|
| Zero console errors | |
| All fonts loaded (no FOUT/FOIT) | |
| All images loaded (no broken placeholders) | |
| No horizontal overflow at any viewport | |
| Hover states on all interactive elements | |
| Focus-visible states for keyboard navigation | |
min-h-[100dvh] used, not h-screen | |
prefers-reduced-motion respected |
CSS can reproduce layout, typography, colors, and geometric shapes. It CANNOT reproduce photographs, hand-drawn illustrations, organic brush strokes, marble textures, or painterly effects. This is the #1 source of drift between reference and output.
Walk through the reference and tag each visual element:
| Element type | Can CSS reproduce it? | What to do instead |
|---|---|---|
| Solid color blocks | ✅ Yes | Use exact hex from extraction |
| Linear/radial gradients | ✅ Yes | Match direction, stops, and colors |
| Geometric shapes (circles, rectangles, lines) | ✅ Yes | Use CSS shapes or simple SVG |
| Icons (outlined/filled) | ✅ Yes | Use an icon library or inline SVG |
| Photographs | ❌ No | Generate a mood-matched image or use picsum.photos/seed/{keyword}/{w}/{h} |
| Hand-drawn illustrations | ❌ No | Generate a matching illustration with generate_image tool |
| Organic brush strokes / paint textures | ❌ No | Generate as an image asset - do NOT approximate with CSS gradients |
| Marble / fluid / organic textures | ❌ No | Generate as an image asset or use a high-quality stock match |
| 3D renders | ❌ No | Generate a matching render or use a placeholder with similar lighting/angle |
| Abstract art / mixed media | ❌ No | Generate with generate_image describing the exact style, colors, and composition |
generate_image to create a photograph that matches the mood, color palette, subject, and composition of the referencepicsum.photos/seed/{descriptive-keyword}/{w}/{h} with a keyword that matches the content (e.g., picsum.photos/seed/ocean-waves/800/600 for ocean imagery)generate_image with a detailed prompt describing the illustration style, colors, stroke quality, and composition. Include the mood: "organic hand-painted pink brush stroke with visible texture, diagonal across white background, coral/hot-pink color, similar to expressive abstract art"generate_image is not available, find a stock illustration with matching style and colorborder-radius blob is NOT an organic shape. The eye detects the difference instantlyMarble, wood grain, concrete, fabric, water, clouds - these need real image assets:
generate_image describing the specific surfacebackground-image with appropriate background-size, object-fit, and positioningWhen placing generated image assets into the layout:
/* BLUEPRINT: Image asset inside a card or container
WHY: object-fit:cover ensures the image fills the space
without distortion. object-position lets you align the
focal point of the image to match the reference. */
.asset-container {
position: relative;
overflow: hidden;
border-radius: var(--radius-card); /* match card radius */
}
.asset-image {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center; /* adjust to match reference focal point */
}⚠ Drift Warning: This is the most common replication failure. When the AI cannot reproduce an artistic element, it substitutes a CSS pattern (stripes, gradients, solid blocks). This ALWAYS looks wrong because geometric CSS patterns have a fundamentally different visual quality than photographs or hand-drawn art. Always generate an image asset instead - even an imperfect generated image is closer to the reference than a CSS approximation.
font-family--font-display variableSome references show dynamic content (live chat, real user avatars, real-time data):
For artistic content (photographs, illustrations, textures), see the "Handling Artistic Assets" section above. Never approximate with CSS - always generate or source a real image.
If you spot shadcn/ui, Radix, Material, or another library:
The reference image is the specification. The code is a translation. You are a translator, not a designer. Match the image, not your preferences. If the reference contradicts your aesthetic instincts, the reference wins. The only technical override allowed is
min-h-[100dvh]overh-screen, becauseh-screenis a browser bug, not a design choice.
© Yu-369, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/pixel-perfect of Yu-369/VibeCurb.
Open the folder on GitHubat commit c324ba7
Pixel Perfect Replication next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Pixel Perfect Replication this skillYu-369/VibeCurb | 979 | — | ~8.7k | Automated safety check: Pass | MIT | |
| MiniMax M3 Multimodal Inputmadebyaris/advance-minimax-m3-cursor-rules | 126 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Visual Verdict Screenshot QAYeachan-Heo/oh-my-claudecode | 40k | — | ~609 | Automated safety check: Pass | MIT | |
| Pixel Perfectbitovi/ai-enablement-prompts | 121 | — | ~2.6k | Automated safety check: Pass | MIT | |
| Ark UIBrandon030722/ark-ui-skill | 265 | — | ~3.7k | Automated safety check: Pass | None | |
| Tsh Implementing FrontendTheSoftwareHouse/copilot-collections | 284 | — | ~2.6k | Automated safety check: Pass | MIT |
madebyaris/advance-minimax-m3-cursor-rules
Teaches an agent on MiniMax M3 to ground visual claims in attached images, screenshots, mockups and clips, and to re-read results after a visual change.
Yeachan-Heo/oh-my-claudecode
Compares a generated UI screenshot with reference images and returns a strict JSON verdict with a score, differences and suggested edits to drive the next iteration.
bitovi/ai-enablement-prompts
Orchestrate a complete visual QA workflow to make a dev/Storybook page match a baseline URL pixel-for-pixel.
Brandon030722/ark-ui-skill
Design, implement, audit, or refactor web and game-adjacent interfaces using an evidence-based Hypergryph visual language with two independent choices: product family and application depth (1…
TheSoftwareHouse/copilot-collections
Frontend component patterns, composition, design token integration, barrel file organization, error handling, and Figma-to-code workflow.
tech-leads-club/agent-skills
Translate Figma nodes into production-ready code with 1:1 visual fidelity using the Figma MCP workflow (design context, screenshots, assets, and project-convention translation).
Yu-369/VibeCurb
Hero-section pipeline for building Awwwards/FWA-tier hero sections.
Yu-369/VibeCurb
Motion design pipeline for building Awwwards/Apple-tier animations, micro-interactions, scroll sequences, page transitions, and kinetic typography.
Yu-369/VibeCurb
Surgical aesthetic upgrade pipeline for existing React codebases.
Categories
Image-to-code replication pipeline. An agent skill from Yu-369/VibeCurb. Pixel Perfect Replication is an agent skill from Yu-369/VibeCurb. Image-to-code replication pipeline.
Pixel Perfect Replication fits situations like: provides a screenshot; design reference; this skill runs a structured extraction across seven layers (grid; builds an Extraction Sheet before any code is written.
Run `npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a claude-code`. Or copy the skill folder (skills/pixel-perfect in Yu-369/VibeCurb) into .claude/skills/pixel-perfect-replication in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a codex`. Or copy the skill folder (skills/pixel-perfect in Yu-369/VibeCurb) into .agents/skills/pixel-perfect-replication in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Yu-369/VibeCurb --skill pixel-perfect-replication -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pixel-perfect-replication, .gemini/skills/pixel-perfect-replication, .github/skills/pixel-perfect-replication and .opencode/skills/pixel-perfect-replication in your project.
SKILL.md names no scripts, command-line tools or credentials: Pixel Perfect Replication is instructions for the agent only.
SKILL.md names 2 domains. In commands or code: fonts.googleapis.com and w3.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Pixel Perfect Replication is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.7k tokens (SKILL.md is roughly 35k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Pixel Perfect Replication: MiniMax M3 Multimodal Input (madebyaris/advance-minimax-m3-cursor-rules, 126 stars), Visual Verdict Screenshot QA (Yeachan-Heo/oh-my-claudecode, 40k stars), Pixel Perfect (bitovi/ai-enablement-prompts, 121 stars) and Ark UI (Brandon030722/ark-ui-skill, 265 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Yu-369 (a GitHub user) maintains it in Yu-369/VibeCurb, which has 979 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on August 5, 2026.
Source: Yu-369/VibeCurb on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.