From Figma mockup to production Payload CMS integration—without refactoring
Welcome to a systematic approach for building block systems and collections where design drives your data structure rather than the other way around. Whether you're new to your project or extending it with new blocks, this guide series will walk you through every scenario.
Why This Matters
Most developers build components like this:
Guess at a data structure
Build the component
Show the designer
Discover the data structure doesn't match
Refactor everything (repeat steps 1-4)
Design-driven development flips the process. You look at Figma, extract the data needs directly, build components that match from day one, and when Payload CMS integration comes, your types already align perfectly.
The result? Zero refactoring. Zero mismatches. Total confidence.
The Guide Series
This is a 7-part journey that builds on itself. Each guide is self-contained, but they connect logically:
Understand why design comes first. Learn the 5 concrete benefits of this approach. See why Payload integration becomes trivial when you build this way.
Key question answered: Why should I care about design-driven development?
DESIGN PHASE
↓
Designer creates Figma mockup for new feature
↓
ANALYZE PHASE
↓
You open Figma and identify data fields
↓
Question: "Does Payload already have this block type?"
├─ YES → Read Episode 2 (Using Existing Types)
└─ NO → Read Episode 3 (Creating Custom Types)
↓
IMPLEMENT PHASE
↓
You create types, components, example data
├─ Need icons? → Episode 5
├─ Need templates? → Episode 6
└─ Need components? → Episode 5
↓
EXAMPLE DATA PHASE
↓
Add data to app/data.ts, render with BlockRenderer
Feature is complete and looks exactly like design
↓
PAYLOAD INTEGRATION PHASE (Later)
↓
Ready to connect to real CMS?
→ Read Episode 7 (Migration to Payload CMS)
Change import source, everything works
↓
COMPLETE ✓
Feature is live from Payload CMS
No refactoring needed
Zero mismatch with design
Key Principles
These principles run through every guide:
1. Design is Your Specification
Don't guess. Look at Figma. The design shows you exactly what data you need.
2. Types Mirror Design
Your TypeScript types should directly reflect what Figma shows. One-to-one mapping.
3. Components Are Dumb
Components don't decide what data exists. They display what types tell them to display.
4. Reuse Global Types
CTA, Image, Button—use them everywhere. One type change fixes the entire app.
5. Example Data is Your Documentation
Before Payload, example data IS your spec. Later, Payload replaces it (components stay the same).
6. No Refactoring on CMS Integration
Your component code doesn't change when you switch from example data to Payload. Only the import source changes.