In the furniture industry, purchases are often large and expensive items. Flatpay Capital makes it possible to act flexibly when opportunities arise. The application process was easy and straightforward, and now we have a fixed agreement that gives us both clarity and freedom.
Overview
A Testimonial sits inside a section as a card on canvas. By the layering rule that means it always renders on background.accent.<hue>.subtler — the next step up from the section's opening surface. The decorative quote glyph inks in text.accent.<hue> (the 900 step) so the card stays inside the section's ramp.
Layering: the testimonial steps up, never out
If the section above the testimonial opens on orange.subtlest, the testimonial sits on orange.subtler— same hue, next weight. Don't mix hues across the same surface; don't drop the testimonial onto subtle (the inner-highlight weight) — that's reserved for accents inside the testimonial itself.
Anatomy
Three vertical zones — the quote glyph, the quote body, the attribution. Standard padding 24 px (default) or 40 px (feature), with a generous 40 / 56 px gap between the quote block and the attribution.
Funded in five business days. We bought the second espresso machine and doubled lunch service.
Quote glyph
Decorative 32 × 26 SVG (40 × 32 on the feature size) in
text.accent.<hue>. Markedaria-hidden— the quote element already conveys the role to assistive tech.Quote
Inter Tight Semibold 16 / 24 (default) or 22 / 30 (feature). Capped at ~70 ch on the feature variant so the line never drifts past readability.
Name + role
Inter Tight Regular 14 / 20 for the speaker's name, 12 / 18 in the muted ramp for the role. Sits at the bottom of the card with a 40 / 56 px breath above it.
Avatar (optional)
40 px round avatar — pass any element (image, initials, brand mark). Renders to the left of the attribution stack with a 12 px gap.
Accents
Six accents, each rendering on the hue's subtler weight. Pick the accent that matches the surrounding section. The quote glyph inherits text.accent.<hue> so the testimonial stays inside one ramp top-to-bottom.
We finally have one screen for everything that used to live in three. End-of-day takes us four minutes instead of forty.
The new refunds preview saves me from a phone call every time a customer disputes a charge. I see what they'll see before I issue it.
Capital was funded in five business days. We bought the second espresso machine and doubled lunch service.
Flatpay's loyalty pass replaced our punch cards overnight. Apple Wallet does the work; we get the data.
Insights showed me that 28% of revenue happens between 17:00 and 19:00. We staffed accordingly and watched the wait times drop.
The Black Friday weekend ran without a single hiccup. Flatpay scaled with us and we never had to think about it.
Sizes
Two sizes. Default is the 3-up grid card; feature is the full-width pull-quote — one per landing, treated as the marquee quote on the page.
size = default
24 px padding, 40 px gap between the quote and the attribution. 16 / 24 quote. The everyday testimonial — fits a 3-up grid on a marketing landing.
The new refunds preview saves me from a phone call every time a customer disputes a charge. I see what they'll see before I issue it.
size = feature
40 px padding, 56 px gap, 22 / 30 quote. The hero pull-quote — one per page, anchored on a long landing.
In the furniture industry, purchases are often large and expensive items. Flatpay Capital makes it possible to act flexibly when opportunities arise.
Avatar
Optional. Add an avatar when the page carries multiple testimonials at once — it gives each speaker a distinct visual anchor in a grid. Skip it on a single-testimonial page; the name carries enough on its own.
Without avatar
Default. Use when the speaker's name carries enough weight on its own — the attribution sits flush left.
Capital was funded in five business days. We bought the second espresso machine and doubled lunch service.
With avatar
Use when the surface carries multiple testimonials — the avatar gives each one a distinct anchor in a 3-up grid.
Capital was funded in five business days. We bought the second espresso machine and doubled lunch service.
In a grid
The most common composition — three testimonials in a row on a marketing landing. Each card sits on the same surface; the variety comes from the words, not from the chrome.
End-of-day takes four minutes instead of forty. The dashboard shows everything in one place.
Capital was funded in five business days. We bought the second espresso machine and doubled lunch service.
Insights showed me that 28% of revenue happens between 17:00 and 19:00. We staffed for the pattern.
Behavior
- Quote real merchants, never fictionalise. Every testimonial in the product is a thing a real person said. Get it on the record (signed release for the name + role) before it ships.
- Cap the quote at four lines. Past four lines the testimonial reads as an article. If the speaker said more than four lines worth, edit it down — the best quote is the one that lands in the first read.
- No stars, no badges, no logos inside. The testimonial is just the words. We don't rate testimonials, we don't mark them “verified”, we don't hang the speaker's company logo inside the card. The role line carries that weight.
- One feature per landing. The feature size is a marquee — one per route at most. Use it to anchor the page; reach for the default size when you need three quotes in a row.
- Match the accent to the section. If the section above opens on
orange.subtlest, the testimonial usesorange. The two surfaces should read as one thought, not two competing hues.
Accessibility
- Semantic structure: the testimonial renders as a
<figure>with a<blockquote>wrapping the quote and a<figcaption>holding the attribution. Screen readers announce “quote, [body], end of quote, [name], [role]” without any ARIA wiring. - Decorative glyph is hidden. The quote SVG carries
aria-hidden="true"so it doesn't double-announce the quote role. - Contrast: every accent ships text that meets WCAG AA on its surface. The neutral surface gives the body 17 : 1; the inverse surface gives 21 : 1. The role line uses the secondary ink (~7 : 1) so it stays AA at 12 px.
- Avatars need a label. If the avatar is an image, set
alt=""(the name in the figcaption already carries the speaker's identity). If you must use analt, name the person, not the image (“Lola”, not “Photo of a woman”).
Code
Pass the quote, the name, and the role. Optional avatar slot accepts any element so consumers can drop in an image, an Avatar component, or stylized initials.
tsx
import { Testimonial, Avatar } from "@flatpay-dk/ui";
// The Capital flyer's Citat 1
<Testimonial
quote="In the furniture industry, purchases are often large and expensive items. Flatpay Capital makes it possible to act flexibly when opportunities arise."
name="Marc"
role="Owner of Refurnd"
/>
// Feature pull-quote — one per landing, anchored above the testimonial grid
<Testimonial
size="feature"
accent="orange"
quote="The new refunds preview saves me from a phone call every time a customer disputes a charge."
name="Pieter"
role="Front of house, Brouwerij & co."
avatar={<Avatar src="/people/pieter.jpg" alt="" size="md" />}
/>
// Categorical accents live on Testimonial itself; Sections stay neutral.
<Testimonial
accent="green"
quote="Capital was funded in five business days."
name="Lola"
role="Owner, Café Norden"
/>Best practices
End-of-day takes four minutes instead of forty. The dashboard shows everything in one place.
Do
Quote real merchants, edited for length. The best testimonial lands in the first read.
Flatpay revolutionised my business and now my customers are 10x happier and revenue is up 47% YoY!
Don't
Don't fictionalise. A testimonial that sounds like marketing copy reads as marketing copy.
Capital was funded in five business days.
Do
Match the accent to the surrounding section so the card stays inside one ramp.
Capital was funded in five business days.
Don't
Don't drop a green testimonial onto an orange section. The hues compete and the layering rule collapses.
Insights showed me that 28% of revenue happens between 17:00 and 19:00. We staffed for the pattern and watched the wait times drop.
Do
Cap the quote at four lines. The marquee read is the first sentence — let it shine.
Insights showed me 28% of revenue happens between 17:00 and 19:00, and once we figured that out we hired two more line cooks for the rush, ran a happy-hour promotion to draw a 16:00 crowd, and the result was that our wait times dropped from twelve minutes to four minutes which our regulars noticed and started commenting on, and the menu we now run during peak hours is two thirds of what we used to do because the kitchen can move that much faster, and we'd never have caught any of this without the dashboard.
Don't
Don't dump a paragraph into the quote. If the speaker said more, write a case study — not a testimonial.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| quote | ReactNode | — | The quote body. Inter Tight Semibold 16/24 (default) or 22/30 (feature). Cap at four lines. |
| name | string | — | Speaker's first name or first + last. Inter Tight Regular 14/20. |
| role | string | — | Optional role + company line. Inter Tight Regular 12/18 in the muted ramp. |
| avatar | ReactNode | — | Optional 40 px round avatar slot. Pass an Avatar component, an image, or stylized initials. |
| accent | "neutral" | "yellow" | "green" | "orange" | "purple" | "natural" | "inverse" | "neutral" | Surface accent. Each accent renders on background.accent.<hue>.subtler — the card-on-canvas weight. |
| size | "default" | "feature" | "default" | Default for grid cards (24 px padding, 16/24 quote); feature for the marquee pull-quote (40 px padding, 22/30 quote). |