Discovery
Define the problem space through stakeholder interviews and competitive analysis.
All case study pages are assembled from these reusable blocks via ACF Pro flexible content. Each block is a self-contained PHP template with scoped CSS. Editors choose from the block palette in WordPress — no code needed.
3-column asymmetric grid. Label + heading in column 1, body copy spans columns 2–3. Forces reading hierarchy — the label anchors the section, the body breathes right.
Research findings
Through twelve stakeholder interviews and two rounds of usability testing, we identified three core user needs that shaped the entire design direction and validated our initial assumptions.
labeltextSection eyebrowheadingtextSection headingbodytextareaMain copy (large, tertiary).acf-text-block { display:grid; grid-template-columns:1fr 1fr 1fr; gap:var(--space-2xl); }
.acf-text-block__header { grid-column:1; }
.acf-text-block__body { grid-column:2/span 2; font-size:var(--text-l); }
4-variant flexible text block. Layout controlled by an ACF select field. Covers bullet lists, image+text, and body-only compositions.
Variant: --bullets
Approach
A structured process that moves from broad research to focused delivery.
Variant: --no-image
Context
A fast-growing logistics startup needed a delivery tracking interface that worked equally well for dispatchers on desktop and couriers on mobile, without a separate codebase.
Variant: --image-left
Process
We mapped every touchpoint across the end-to-end delivery experience to identify friction points and prioritise redesign effort.
Variant: --image-right
Outcome
A unified responsive interface that reduced dispatcher errors by 34% and cut courier training time in half.
layoutselectbullets / no-image / image-left / image-rightlabeltextheadingtextbodywysiwygRich text, supports lists + linksimageimageRequired for image-left/rightbullet_itemsrepeaterFor bullets layout/* Four layout variants */
.acf-text-plus--bullets { flex-direction: column; }
.acf-text-plus--no-image { display: grid; grid-template-columns: 1fr 2fr; }
.acf-text-plus--image-left,
.acf-text-plus--image-right { display: grid; grid-template-columns: 1fr 1fr; }
Full-bleed centred typographic statement. Used sparingly — once per case study — to mark a key finding or design principle. The text size itself communicates importance.
Good design is as little design as possible.
— Dieter Rams
quotetextThe quote textattributiontextName / source.acf-pull-quote__text {
font-size: var(--text-5xl);
font-weight: var(--fw-black);
text-align: center;
color: var(--text-on-dark-primary);
}
Alternating left/right task cards with JS-drawn right-angle SVG connector lines (8px radius corners). Visualises user journeys, service blueprints, or process flows.
Define the problem space through stakeholder interviews and competitive analysis.
Synthesise research into opportunity areas and a clear design brief.
Ship tested, production-ready designs with full developer handoff documentation.
labeltextheadingtextdescriptiontextHalf-width intro descriptionstepsrepeaterstep_title, step_body, step_image, side (left/right)/* JS draws connector SVG between adjacent cards */
.acf-flow__connector { position:absolute; overflow:visible; pointer-events:none; }
.acf-flow__connector path { fill:none; stroke:var(--surface-branding-primary-30); stroke-width:2; }
Structured data table with optional row images and bullet lists per cell. Horizontally scrollable on mobile. Used for competitive analysis, feature matrices, and research data.
| Feature | That's Adam | Competitor A | Competitor B |
|---|---|---|---|
Responsive design |
Full | Partial | None |
Dark mode |
Token-driven | None | Manual |
Designsystem |
|
Style guide only | None |
Note: first column header renders at text-xl in red; first column cells render in red, uppercase, semibold. Subsequent columns are grey.
labeltextheadingtextcolumnsrepeatercolumn_headingrowsrepeaterrow_label, row_image, cells (sub-repeater: cell_content, cell_bullets).acf-table { width:100%; border-collapse:collapse; table-layout:fixed; }
.acf-table th, .acf-table td { padding:var(--space-l) var(--space-m); vertical-align:middle; border-bottom:1px solid var(--surface-branding-primary-30); }
.acf-table th { font-size:var(--text-l); font-weight:var(--fw-black); color:var(--text-on-dark-tertiary); border-bottom:2px solid var(--surface-branding-primary-30); }
.acf-table th:first-child { font-size:var(--text-xl); color:var(--text-on-dark-secondary); }
.acf-table td:first-child { font-weight:var(--fw-semibold); color:var(--text-on-dark-secondary); text-transform:uppercase; letter-spacing:4px; }
.acf-table__bullets li::before { content:''; display:block; width:8px; height:8px; background:var(--surface-branding-primary); margin-top:6px; }
Displays 1–4 screen images with blue drop-shadow glow. PNG exports with transparent backgrounds are required for the glow to work correctly. Supports captions and bullet annotations.
Final screens
Dashboard view
Detail view
labeltextheadingtextlayoutselectdefault / split-metaimagesrepeaterimage, caption, bullets.acf-screen-mockups__mockup img {
filter: drop-shadow(0 0 24px var(--lightbox-img-shadow));
}
/* No overflow:hidden on parent */
Editorial full-width rows, one per participant. The quote is the typographic hero — extralight italic at clamp scale. Ghost sequence numbers are oversized and purely decorative.
The handoff between design and development was always where things broke down — I needed a designer who understood both sides.
Insights
labeltextheadingtextdescriptiontextHalf-width introinterviewsrepeaterparticipant_name, participant_role, participant_photo, quote, insights (sub-repeater: insight_text).ui-entry__quote {
font-size: clamp(var(--text-xl), 3.5vw, 2.4rem);
font-weight: var(--fw-extralight);
font-style: italic;
max-width: 78ch;
}
Spider/hub diagram. Desktop: 3-column grid, hub centred, stories left and right, JS-drawn bolt-animation lines connecting hub to cards. Mobile: flex column with hub top-left, vertical connector, horizontal tick lines per card.
labeltextheadingtextdescriptiontextareaoptional intro text under the headinghub_labeltextcentre hub text, defaults to "User stories"storiesrepeaterstory_title, story_body, story_image/* Hub: centred in 3-col grid on desktop */
.acf-us-spider { display:grid; grid-template-columns:1fr 1fr 1fr; }
.acf-us-spider__hub { grid-column:2; min-width:240px; height:240px; border-radius:999px; }
.acf-us-description { font-size:var(--text-l); color:var(--text-on-dark-tertiary); margin-bottom:var(--space-2xl); }
Dossier-style cards with two rows. Row 1: full-width 1:1 photo column + bio column (name, glowing 2px divider, italic quote, thumb-icon list items, demographics). Row 2: bio rich text + placeholder squares. Multiple persona blocks alternate left/right via a global PHP counter.
“I don't have time to decode a designer's portfolio — show me the impact fast.”
Interests: Startups, SaaS, scale-up culture, impact metrics
Tech frustrations: Designers who can't communicate trade-offs
Job: Head of Product, SaaS startup
Location: Copenhagen, Denmark
Age Group: 35–44
Marcus has spent 8 years in product roles at scale-ups across the Nordics. He evaluates design partners primarily on communication quality and ability to translate user insight into shipping decisions.
.prs-card--flip via PHP global counter, reversing row directionlabeltextheadingtextpersona_cardsrepeatername, tagline, photo, quote, bio (wysiwyg), goals (repeater → goal_text), frustrations (repeater → frustration_text), job, nationality, location, gender, age_group, relationship, kids/* Card: two-row flex column */
.prs-card { display:flex; flex-direction:column; gap:64px; }
/* Row 1: photo col + bio col */
.prs-card__header-row { display:flex; flex-direction:row; align-items:flex-end; gap:64px; }
.prs-card--flip .prs-card__header-row { flex-direction:row-reverse; }
/* Photo: full-width square, border-radius 16px (not a circle) */
.prs-card__photo { width:100%; aspect-ratio:1/1; object-fit:cover; border-radius:16px; }
/* Glowing divider between name and quote */
.prs-card__divider { height:2px; background:var(--surface-branding-primary);
box-shadow:0 0 30px 0 var(--shadow-glow); }
/* Quote: 32px regular italic */
.prs-card__quote { font-size:32px; line-height:56px; font-weight:400; font-style:italic; }
Full-bleed, click-and-drag horizontal carousel. The first slide's left edge lines up with the rest of the page's content column on load, with more revealed by dragging/scrolling right — no scroll-snap, same freeform mechanic as the homepage Portfolio carousel. Each slide is one of the existing Text Block / Text + / Image layouts, nested via a second flexible-content field, rendered at a compact scale (scoped-down type/space tokens + forced single-column, bullet lists excepted) so full-page-sized blocks don't overwhelm a slide.
Step 1
Step 2
labeltextheadingtextdescriptiontextareaoptional intro text under the headingslidesflexible_contentnested — layouts: text_block, text_plus, image_full_width (same sub_fields as those top-level blocks).acf-carousel__track {
width:100vw; left:50%; transform:translateX(-50%);
padding-left:calc(max(0px, (100vw - 1440px) / 2) + var(--page-padding-x));
overflow-x:auto; cursor:grab;
}
.acf-carousel__slide {
flex:0 0 auto; width:min(840px, 82vw);
--text-3xl:28px; --text-2xl:22px; --text-l:16px;
--space-2xl:var(--space-l); --space-xl:var(--space-m);
}
Full-bleed image block. Optional label and heading above the image. 8px border-radius, full container width, optional alt text override via ACF field.
Final designs
.acf-image-full__header: label + heading above image.acf-image-full__img — fills 100% container width, loading="lazy"<img> taglabeltextOptional eyebrow labelheadingtextOptional headingimageimageRequired — the image to displayalt_texttextOptional override for image alt attribute.acf-image-full { }
.acf-image-full__img {
width: 100%;
height: auto;
display: block;
border-radius: var(--radius-xs);
}
A/B test results visualisation. Donut chart via CSS-masked conic-gradient (no canvas/SVG). Screen mockup images with glow drop-shadow. Outcome panel highlights the winner with a left-border accent.
Visual preference test
Outcome
Option A was chosen by 68% of participants. The bold headline first approach communicated credibility more quickly than leading with imagery.
labeltextheadingtexttestsrepeatertest_label, test_desc, options (sub-repeater: option_name, option_colour, option_percentage, option_mockup), outcome_text/* Donut chart: no JS, no SVG */
.acf-pref-test__donut {
width: 166px; height: 166px;
background: conic-gradient(var(--a-color) 0% var(--a-pct), var(--b-color) var(--a-pct) 100%);
mask: radial-gradient(transparent 40%, black 40%);
}