- fg
#000000- bg
#FFFFFF- APCA Lc
- +106
- Use
- foreground on background
Brex
A rare fintech landing carrying corporate authority without a single gradient — Flecha serif display, warm-orange accent, zero-gradient discipline. Balance-sheet trust as an aesthetic.

Editorial disclaimer
This entry documents observable design-language patterns for educational transfer and AI-agent briefing. Screenshots and trademarks are property of their respective owners. AI2 Design is not affiliated with or endorsed by the featured brand. Inspiration here is about language and rhythm - do not reproduce brand identity, logo, product copy, or proprietary features.
Fair Use & Gallery PolicyCopy the full design language into your agent
A typed, paste-ready design system brief - philosophy, tokens, rules, techniques, and fitness checks. Drop it into Claude, Cursor, v0 or any coding agent and it builds in Brex’s language, not just a screenshot.
Corporate-fintech sophistication built from flat fills, not gradients. A near-black #000000 / #15191e canvas pairs with true-white #ffffff surfaces; a single saturated warm orange #ff5900 carries every accent and CTA. Two type voices split the labor — an editorial serif (Flecha) for emotional headlines, Inter Variable for dense product copy and tabular numerics, with Space Mono for code and metadata. Elevation is a faint blue-tinted 1px shadow plus solid hairline borders — never a bloom. Discipline reads as rigor; restraint is the brand.
Use this capture as a design language transfer brief for my project. Adopt the palette (near-black #000000/#15191e canvas + true-white #ffffff surfaces + a single warm-orange #ff5900 accent used sparingly + cool grays #8b8d98/#60646c for de-emphasis), the two-voice typography (a serif display family for emotional headlines, Inter for product copy and tabular numerics, Space Mono for code/metadata), the 8px-anchored spacing scale on a wide 1680px rail, flat-fill surfaces with NO gradients, hairline-border + faint-shadow elevation, and a moderate Framer Motion vocabulary (0.125s / 0.2s / 0.5s on linear / cubic-bezier(0,0,0.38,0.9) / ease-in-out) across every page and component I ship. Treat this as my project's constitution — any new component should pass as if crafted in the same studio. Apply the language, not the source brand's specific copy or identity. Never introduce a gradient — flat fill is the discipline. When I ask you to build a page or component, enforce these rules by default and call out any decision that deviates.
- Layout
- Grid
- Content width
- Bounded
- Framing
- Flat
- Grid strength
- Strong
Monochrome enterprise field with one warm accent. Near-black #000000 (the dominant text/ink color, 1277 measured occurrences) and panel-black #15191e anchor the canvas; true-white #ffffff and near-white #fcfcfd carry surfaces. A single saturated warm orange #ff5900 (HSL 21,100,50) is the only brand-tier color and is reserved for accents/CTAs. Cool grays #8b8d98 and #60646c descend for captions and de-emphasized labels. Critically: NO gradients — every surface is a flat fill.
- Ink #000000 (1277 occurrences) is the dominant text color; panel-black #15191e (200 occurrences) for darker surfaces and secondary text
- Surfaces are flat white #ffffff (background) and near-white #fcfcfd — paired against near-black ink for ~18:1 contrast
- Warm orange #ff5900 is the ONLY brand-tier color (144 occurrences, accent usage) — restrict to CTAs, key emphasis, and active states; keep surface area under ~5%
- Cool gray descender #8b8d98 then #60646c for captions, metadata, and de-emphasized labels — never for primary reading text
- Hairline border tint #42578a (blue-gray) appears only inside the faint elevation shadow — not as a fill
- Two-voice system. Display/emotional headlines: Flecha (serif, self-hosted woff2, display: optional) — observed at 36px/40px weight 500. Body + product copy + UI: Inter (self-hosted woff2, display: swap). Code/metadata: Space Mono (monospace).
- Weight ladder: 400 (body reading) / 500 (headings + UI labels) / 600 (bold emphasis, via font-variation 'wght' 600). Do not reach past 600 — Brex stays restrained.
- Inter heading scale (observed): 72px hero (lh 72px, tracking -1.44px) / 48px (lh 48px, -0.96px) / 36px (lh 36px, -0.72px) / 24px (lh 29px, -0.48px) / 20px (lh 24px, -0.4px). Negative px tracking tightens as size grows.
- Body Inter 16px weight 400 line-height normal; small 14px (lh 20-21px, -0.28px); caption 10-12px. Tracking is px-based and negative at every step.
- Serif (Flecha) is reserved for emotional/brand headlines ONLY — never product copy, never numerics, never dense UI. The serif supplies warmth the flat palette withholds.
- Tabular numerals on Inter for any aligned financial column: `font-variant-numeric: tabular-nums`. Space Mono handles inline code and kbd.
- Paragraph max ~50-60 ch at 16px body; dense data rows may run wider on the 1680px rail at 14px.
- Dominant base is 8px (130 measured occurrences) with a 4px micro-step. Scale: 4 / 8 / 12 / 16 / 20 / 24 / 28 / 32 / 48 / 72 px — 8/16/24/32/48/72 carry the rhythm.
- Container max-width 1680px (the observed container-md) for data-dense enterprise sections; narrow content clusters bound to ~400px (container-sm).
- Section vertical rhythm leans on the larger steps: 48 / 72px desktop blocks; smaller 24/32px between grouped elements.
- Card padding: 16-24px typical; tighter 12px on dense rows. Always pick from the scale — no magic numbers.
- Gutter values for flex/grid: 4 / 8 / 16 / 20 / 24 px (8 and 16 dominate). 1px is reserved for hairline insets only.
- Surfaces are FLAT fills — no gradients (extraction confirms gradients=[]). Depth comes from solid hairline borders and faint shadow only.
- Primary elevation is a faint blue-tinted hairline shadow: `box-shadow: rgba(66, 87, 138, 0.15) 0px 1px 0px 0px` (shadow-xs) or `rgba(0, 0, 0, 0.04) 0px 1px 1px 0px` (shadow-sm). Near-invisible by design.
- Solid 1px hairline borders (border-hairline, 45 occurrences, solid style) do most of the structural delimiting — reach for a border before a shadow.
- Heavier layered shadows exist as CSS-variable tokens (e.g. multi-layer rgba(16,24,40,...) at 0.04-0.16 opacity) for menus/popovers only — never for in-flow cards.
Techniques
Hairline border as primary delimiter
Cards and inputs default to a solid 1px border (`border: 1px solid` in a neutral gray) plus an optional `box-shadow: rgba(66,87,138,0.15) 0 1px 0 0` for a faint blue-tinted lift. Hover deepens the border color rather than adding bloom — stay flat.
Layered popover shadow (token-only)
Floating surfaces (dropdowns, tooltips) may use the captured multi-layer token `0px 1px 1px -2px rgba(16,24,40,0.12), 0px 3px 2px -2px rgba(16,24,40,0.11), 0px 0px 0px 1px rgba(16,24,40,0.04)` — soft, low-opacity, never a halo. In-flow content never uses it.
- Radius scale is tight: 6px (radius-sm, buttons/chips) / 10px (radius-md, inputs) / 12px (radius-lg, cards). All three observed; do not invent values outside them.
- Buttons default to 6px radius, inputs 10px, cards 12px. Pills `rounded-full` only for status indicator badges.
- Icons are stroke-based at 1.5-2px weight to match the restrained, line-led aesthetic; no filled or duotone variants.
- Tap targets minimum 40×40px on pointer, 44×44px on touch.
button-primary- backgroundColor
- #ff5900
- textColor
- #ffffff
- radius
- 6px
- padding
- 12px 24px
- border
- 1px solid transparent
- boxShadow
- rgba(66, 87, 138, 0.15) 0px 1px 0px 0px
- fontFamily
- Inter
- fontWeight
- 600
- fontSize
- 14px
- lineHeight
- 20px
Tailwind
inline-flex min-h-[40px] items-center gap-2 rounded-[6px] bg-[#ff5900] px-6 py-3 text-[14px] font-semibold leading-5 text-white shadow-[rgba(66,87,138,0.15)_0px_1px_0px_0px] transition-all duration-[125ms] ease-linear hover:bg-[#e65000] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#ff5900] focus-visible:ring-offset-2
button-secondary- backgroundColor
- #ffffff
- textColor
- #15191e
- radius
- 6px
- padding
- 12px 24px
- border
- 1px solid #e3e3e6
- boxShadow
- rgba(0, 0, 0, 0.04) 0px 1px 1px 0px
- fontFamily
- Inter
- fontWeight
- 500
- fontSize
- 14px
Tailwind
inline-flex min-h-[40px] items-center gap-2 rounded-[6px] border border-[#e3e3e6] bg-white px-6 py-3 text-[14px] font-medium text-[#15191e] shadow-[rgba(0,0,0,0.04)_0px_1px_1px_0px] transition-[border-color,box-shadow] duration-[200ms] ease-[cubic-bezier(0,0,0.38,0.9)] hover:border-[#8b8d98] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#ff5900] focus-visible:ring-offset-2
card-surface- backgroundColor
- #ffffff
- textColor
- #15191e
- radius
- 12px
- padding
- 24px
- border
- 1px solid #e3e3e6
- boxShadow
- rgba(66, 87, 138, 0.15) 0px 1px 0px 0px
Tailwind
rounded-[12px] border border-[#e3e3e6] bg-white p-6 text-[#15191e] shadow-[rgba(66,87,138,0.15)_0px_1px_0px_0px] transition-[box-shadow,border-color] duration-[500ms] ease-in-out hover:border-[#8b8d98]
input-field- backgroundColor
- #ffffff
- textColor
- #15191e
- radius
- 10px
- padding
- 8px 16px
- border
- 1px solid #e3e3e6
- boxShadow
- none
- fontFamily
- Inter
- fontWeight
- 400
- fontSize
- 16px
- lineHeight
- normal
Tailwind
w-full rounded-[10px] border border-[#e3e3e6] bg-white px-4 py-2 text-[16px] text-[#15191e] transition-[border-color] duration-[200ms] ease-[cubic-bezier(0,0,0.38,0.9)] placeholder:text-[#8b8d98] focus-visible:border-[#ff5900] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[#ff5900]
heading-display- fontFamily
- Flecha, Georgia, serif
- color
- #000000
- fontWeight
- 500
- fontSize
- 48px
- lineHeight
- 48px
- letterSpacing
- -0.96px
Tailwind
font-[Flecha,Georgia,serif] text-[48px] font-medium leading-[48px] tracking-[-0.96px] text-black
link-inline- color
- #15191e
- textDecoration
- underline
- textDecorationColor
- #8b8d98
- textDecorationThickness
- 1px
- textUnderlineOffset
- 2px
- transition
- color 125ms linear, text-decoration-color 125ms linear
Tailwind
text-[#15191e] underline decoration-[#8b8d98] decoration-[1px] underline-offset-2 transition-colors duration-[125ms] ease-linear hover:text-[#ff5900] hover:decoration-[#ff5900] focus-visible:outline-none focus-visible:decoration-[#ff5900]
Easings
linearcubic-bezier(0, 0, 0.38, 0.9)ease-in-outease-outeaseScroll patterns
- Framer Motion entrance reveals (window.MotionIsMounted confirmed) — opacity + small translateY at ~0.2-0.5s
- 180ms is the captured CSS-variable transition duration (--_1k5xs262) on the cubic-bezier(0,0,0.38,0.9) curve — the signature interactive timing
- No parallax, no theatrical scroll choreography — moderate, enterprise-appropriate motion
- Primary easing: cubic-bezier(0, 0, 0.38, 0.9) — a fast-start ease-out variant carried on the 180ms / 200ms CSS-variable transitions; this is the signature curve.
- Supporting easings: linear (0.125s quick state changes, most frequent), ease-in-out (0.5s card lifts), ease-out (0.25s), ease (legacy). No springs.
- Four captured durations: 0.125s (quick all-property), 0.2s (border/shadow), 0.25s (ease-out), 0.5s (card lift). Plus the 80ms/40ms/180ms CSS-variable micro-timings.
- Framer Motion is the animation library (confirmed via window.MotionIsMounted) — use deterministic transitions, not springs.
- useReducedMotion mandatory: all animations collapse to opacity-only or disable.
- No loop animations except explicit loaders.
- Segmented controls / tabs for product-category switching — not toggle switches.
- Accordion: single-open for FAQ; multi-open only for deep documentation.
- Tooltips reveal on hover + focus; use the layered popover shadow token, dismiss on blur.
- Modals for destructive or auth-gated confirmations; drawers for mobile expansions; never nested modals.
- Form validation: inline below field on blur; orange #ff5900 reserved for focus/active, a separate semantic red for errors.
- Empty states: small caption icon + one-line copy + a primary orange action. Restrained, no illustration sprawl.
- Loading states: skeleton shimmer for content; inline spinner for buttons. No full-page overlays.
Desktop-first because the audience is finance and operations teams on wide displays — Brex extends its bounded container to 1680px for data-dense sections, far past the generic 1280 default. Mobile reflows the same language without a separate architecture: the page is the page, narrowed. Observed media queries cluster around 766/767, 960, 1023/1024, and 1680.
- Breakpoints (observed): sm 640 / md 768 / lg 1024 / xl 1280 / 2xl 1680. The 2xl at 1680 matches the wide container rail.
- Container max-width scales from ~400px (narrow clusters) to 1680px (full data-dense rail).
- Hide-on-mobile is discouraged — if a control exists on desktop it should reach mobile via reflow.
- Tap target minimum 44×44 on touch; 40×40 on pointer.
- Typography scales proportionally: hero 72 → 48 → 36; serif display headlines drop one tier per breakpoint while negative tracking eases.
- focus-visible: 2px orange #ff5900 ring with offset on every interactive element. Mandatory; never rely on hover alone.
- All interactive elements reachable via Tab in logical reading order.
- Color contrast: #000000 / #15191e ink on #ffffff = ~18:1 (AAA). Orange #ff5900 on white is ~3.4:1 — use it for large text / icons / fills, NOT for small body text; pair white text on orange fills for CTAs (~4.4:1, AA large).
- Cool gray #60646c on white ≈ 5.4:1 (AA body); #8b8d98 on white ≈ 3.1:1 — restrict the lighter gray to large or decorative text only.
- ARIA labels on icon-only buttons; aria-expanded on collapsible regions; aria-live='polite' on toasts and status updates.
- Motion respects prefers-reduced-motion — animations reduce to opacity-only or disable.
- Tap targets minimum 44×44 on touch; 40×40 on pointer.
- Form errors announced via aria-describedby; never color-only signaling — orange and red carry text/icon partners.
Framer Motion confirmed in the extract (window.MotionIsMounted) driving moderate entrance + hover transitions. The site is Next.js (next/image observed on the hero, served via /_next/image with srcset and q85). The hero loads eager (loading='eager', 1799×867 natural); all non-LCP imagery should lazy-load. Icons stroke-based at 1.5-2px.
- Framer Motion `motion.div` with `whileInView` + `viewport={{ once: true }}` for scroll reveals at 0.2-0.5s
- Transitions use the signature `cubic-bezier(0, 0, 0.38, 0.9)` and durations from {0.125, 0.2, 0.25, 0.5}s — constants only, no springs
- useReducedMotion guard wraps every animation primitive — no exceptions
- next/image with `sizes` + `srcset` always set; `priority` only on the LCP hero (the one eager image)
- No canvas, no WebGL, no Lottie, and NO CSS gradients — flat fills only
- Build every surface from a flat fill — near-black, white, or warm orange. Reach for a 1px hairline border before any shadow.
- Reserve orange #ff5900 for CTAs, emphasis, and active/focus states only — keep its surface area under ~5%.
- Split type labor: serif (Flecha) for emotional headlines, Inter for product copy and tabular numerics, Space Mono for code/metadata.
- Use `tabular-nums` on Inter for aligned financial columns.
- Default to cubic-bezier(0, 0, 0.38, 0.9) at 180/200ms for interactive transitions; linear 0.125s for quick state flips.
- Pass every page through useReducedMotion before shipping.
- Apply a 2px orange focus-visible ring on every interactive element.
- Never introduce a gradient — the extraction confirms gradients=[]. Flat fill is the discipline; a color ramp would betray the brand's trust-through-restraint thesis.
- Never let the serif (Flecha) into product copy, numerics, or dense UI — it is for emotional headlines only.
- Never add a second brand hue alongside orange — the single accent is load-bearing precisely because nothing competes with it.
- Never use orange #ff5900 for small body text — its contrast on white (~3.4:1) fails AA for normal text; pair white-on-orange for CTAs instead.
- Never substitute font weights above 600 — the 400/500/600 ladder is the restrained signature.
- Never invent radii outside {6, 10, 12}px or durations outside {0.125, 0.2, 0.25, 0.5}s plus the 80/40/180ms CSS-variable micro-timings.
- Never replace hairline-border elevation with a heavy bloom shadow on in-flow content.
- Tailwind v4 @theme inline only — no runtime style concatenation, no CSS-in-JS.
- Spacing base 8px (4px micro-step); scale 4/8/12/16/20/24/28/32/48/72.
- Container max 1680px — the observed wide enterprise rail.
- Type system: Flecha (serif display) + Inter (body/UI) + Space Mono (code). Weight ladder strictly 400 / 500 / 600.
- Radius scale: 6 / 10 / 12 px only.
- NO gradients — flat fills only (extraction gradients=[]).
- Single accent: warm orange #ff5900. Base palette black #000000 / #15191e + white #ffffff/#fcfcfd + grays #8b8d98/#60646c.
- Motion: durations {0.125, 0.2, 0.25, 0.5}s plus 80/40/180ms CSS vars; easings {cubic-bezier(0,0,0.38,0.9) primary, linear, ease-in-out, ease-out, ease}. No springs.
- Gradient grep: ZERO `linear-gradient` / `radial-gradient` / `conic-gradient` in CSS — every surface is a flat fill.
- Container width: data-dense sections may reach 1680px; no page exceeds it.
- Color grep: brand accent is exactly #ff5900; base palette stays within {#000000, #15191e, #ffffff, #fcfcfd, #8b8d98, #60646c}.
- Font grep: serif (Flecha) appears only on headline elements; Inter on body/UI; Space Mono on code/kbd. No serif in numerics.
- Font weight grep: only 400, 500, 600 — no 700+.
- Radius grep: no border-radius outside {6, 10, 12}px.
- Transition grep: timing-functions draw from {cubic-bezier(0,0,0.38,0.9), linear, ease-in-out, ease-out, ease}; durations from {0.125s, 0.2s, 0.25s, 0.5s} plus 80/40/180ms.
- Elevation audit: in-flow cards use a 1px hairline border first; shadows stay ≤ 0.15 opacity, ≤ 1px blur.
- Image audit: loading='lazy' on every non-LCP image; priority/eager only on the hero.
- Contrast audit: ink on white ≥ 4.5:1 (AA); orange never carries small body text.
Design tokens
Observed token system
Color, type, spacing, gradients, and stacking order captured from the live page and rendered here as living, paste-ready previews.
Inspector
Observable layers
Structure, breakpoints, motion, fonts, and images captured from the live page and kept paste-ready alongside the tokens.
Depth-first walk of the meaningful sections. 19 nodes across 7 levels, shallow to deep by color.
- body1
- div1
- div3
- div (×2)1
- Section
- Main1
- Section6
- div1
- Section
- Section (×5)
- div1
- Section
- Section
- div (×2)1
- Section
- [+13 more]
- div1
- Footer1
- Nav
Accessibility
Contrast matrix
92 combinations - 44 pass AA - 26 pass AAA. Each pair is previewed with its real foreground on background; APCA Lc sits alongside the WCAG 2.1 ratio for draft WCAG 3 awareness.
- fg
#FFFFFF- bg
#000000- APCA Lc
- -108
- Use
- background on foreground
- fg
#000000- bg
#FCFCFD- APCA Lc
- +104
- Use
- foreground on background
- fg
#FCFCFD- bg
#000000- APCA Lc
- -106
- Use
- background on foreground
- fg
#FFFFFF- bg
#000710- APCA Lc
- -108
- Use
- background on accent
- fg
#000710- bg
#FFFFFF- APCA Lc
- +106
- Use
- accent on background
- fg
#FCFCFD- bg
#000710- APCA Lc
- -106
- Use
- background on accent
- fg
#000710- bg
#FCFCFD- APCA Lc
- +104
- Use
- accent on background
- fg
#15191E- bg
#FFFFFF- APCA Lc
- +104
- Use
- foreground on background
Images
Image strategy
Observable image posture - total count, lazy-loading ratio, and format mix. The hero image is measured above the fold.
- unknown54 · 100%
Hero image
https://www.brex.com/_next/image?url=https%3A%2F%2Fbrand.brex.com%2Ftransform%2F34b1e6c6-3bd8-4879-96e8-8f85c550c68a%2FHP-Hero-Desktop&w=1920&q=85- Format
- UNKNOWN
- Dimensions
- 1799x867
- Loading
- eager
- srcset
- yes
- Industry
- fintech
- Industry
- saas
- Theme
- Light + Dark
- Added
- 2026-06-23
FAQ
Questions people ask about Brex
3questionsAnswers are pulled from the curator verdict and design brief - the same text your AI agent sees when it paste-reads this page.
Compare this with



