DESIGN.md inspired by Nubank
Roxo #8d0de3 as the whole brand — white nuSansDisplay on dark purple, 999px pill CTAs, anti-bank warmth.
Compare to…
- bg
#ffffff - bg-subtle
#f5f2fa - bg-purple-tint
#f3e9fd - surface
#ffffff - surface-purple
#8d0de3 - surface-purple-deep
#6a0aab - surface-purple-deepest
#3d0764 - text AAA · 21.0
#000000 - text-body
#1a1a1a - text-muted
#595959 - text-subtle
#8a8a8a - text-on-purple
#ffffff - text-on-purple-muted
#ecd9ff - brand AA · 6.4
#8d0de3 - brand-bright
#a32ff0 - brand-deep
#6a0aab - brand-soft
rgba(141, 13, 227, 0.10) - on-brand
#ffffff - accent-pink
#ff4d8b - accent-yellow
#ffd23f - link
#8d0de3 - link-on-purple
#ffffff - link-hover
#6a0aab - border AAA · 21.0
#000000 - border-soft
rgba(0, 0, 0, 0.10) - border-purple
#8d0de3 - border-on-purple
rgba(255, 255, 255, 0.30) - semantic-success
#2db84f - semantic-warning
#f5a623 - semantic-danger
#e02d2d - semantic-info
#8d0de3 - focus-ring
rgba(141, 13, 227, 0.45) - shadow-ambient
rgba(17, 0, 33, 0.06) - shadow-soft
rgba(17, 0, 33, 0.10) - shadow-standard
rgba(17, 0, 33, 0.14) - shadow-elevated
rgba(17, 0, 33, 0.20)
- none
0px - micro
2px - sm
4px - md
8px - lg
12px - xl
16px - xxl
24px - pill
9999px
Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.
- background → bg
- foreground → text
- primary → brand
- primary-foreground → on-brand
- accent → accent-pink
- muted → text-muted
- border → border
- ring → focus-ring
theme.extend block for tailwind.config.js
:root { --bg, --text, --brand, … } you can paste anywhere
W3C Design Tokens Community Group format
Importable into Figma → Variables → Import
---
name: Nubank
tagline: 'Roxo #8d0de3 as the whole brand — white nuSansDisplay on dark purple, 999px pill CTAs, anti-bank warmth.'
updated_at: 2026-05-29T00:00:00.000Z
published_at: 2026-05-28T22:15:14.013Z
author: webdesignhot
source_url: https://nubank.com.br
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [fintech]
tags: [light, dark, bold, sans, fintech, purple, neobank, brazil]
preview_swatch: ['#8d0de3', '#ffffff', '#000000']
related: []
description: 'Nubank is Latin America''s largest neobank, and its entire visual identity collapses into one colour: Nu Roxo (Nubank purple) `#8d0de3` — an electric, slightly magenta-leaning violet that the brand calls simply "o roxo" (the purple). Where legacy Brazilian banks armour themselves in navy, gold, and marble, Nubank rejected all of it for a single saturated purple applied with conviction — on the iconic no-number card, on every CTA, on full-bleed hero panels, on the wordmark. The marketing site pairs a clean white canvas with deep-purple immersive sections: white running body and black ink on paper-light backgrounds, then white `nuSansDisplay` headlines stamped onto saturated `#8d0de3` hero panels. Type is the custom `nuSans` superfamily — `nuSansDisplay` for headlines (drawn large, ~80–112px, weight 600, with tight negative tracking) and `nuSansText` for body — a humanist-geometric sans that reads warm and approachable rather than corporate. Every actionable element is a fully-rounded 999px pill: the primary CTA is purple-filled with white text, the secondary is a purple-outline ghost. The posture is deliberately anti-traditional-bank — friendly, plain-spoken, Portuguese-first, optimistic. Nubank doesn''t whisper trust through gravitas; it earns it through clarity, generous whitespace, and the relentless confidence of a brand that bet everything on one purple.'
# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
background: bg
foreground: text
primary: brand
primary-foreground: on-brand
accent: accent-pink
muted: text-muted
border: border
ring: focus-ring
colors:
bg: '#ffffff' # paper-white canvas — the default light ground
bg-subtle: '#f5f2fa' # faintest purple-tinted off-white for alternating bands
bg-purple-tint: '#f3e9fd' # pale lavender wash — info cards, soft callouts
surface: '#ffffff' # default card surface on the light canvas
surface-purple: '#8d0de3' # immersive full-bleed purple hero/section panel
surface-purple-deep: '#6a0aab' # deeper purple for layered panels / footers on dark
surface-purple-deepest: '#3d0764' # near-black purple — deepest immersive ground
text: '#000000' # primary ink on the light canvas
text-body: '#1a1a1a' # near-black running body
text-muted: '#595959' # captions, metadata on light
text-subtle: '#8a8a8a' # disabled, lowest hierarchy on light
text-on-purple: '#ffffff' # white headline + body on purple panels
text-on-purple-muted: '#ecd9ff' # soft lavender-white body on purple
brand: '#8d0de3' # Nu Roxo — THE purple, the entire brand
brand-bright: '#a32ff0' # lighter purple for hover/active lift
brand-deep: '#6a0aab' # pressed/active deeper purple
brand-soft: 'rgba(141, 13, 227, 0.10)' # purple at 10% — badge tint, hover wash on light
on-brand: '#ffffff' # white text on the purple CTA fill
accent-pink: '#ff4d8b' # rare warm-pink accent — promo, NuConta highlights
accent-yellow: '#ffd23f' # rare optimism-yellow — illustration, reward moments
link: '#8d0de3' # default link in brand purple on light
link-on-purple: '#ffffff' # link on purple panels — white, underlined
link-hover: '#6a0aab' # deeper purple link hover on light
border: '#000000' # full-weight ink hairline / outline-button stroke
border-soft: 'rgba(0, 0, 0, 0.10)' # default 1px hairline divider on light
border-purple: '#8d0de3' # purple outline for ghost CTA + focused inputs
border-on-purple: 'rgba(255, 255, 255, 0.30)' # hairline divider on purple panels
semantic-success: '#2db84f' # confirmation green
semantic-warning: '#f5a623' # caution amber
semantic-danger: '#e02d2d' # error red
semantic-info: '#8d0de3' # info matches brand purple
focus-ring: 'rgba(141, 13, 227, 0.45)' # 3px brand-purple focus ring
shadow-ambient: 'rgba(17, 0, 33, 0.06)' # purple-tinted ambient on light
shadow-soft: 'rgba(17, 0, 33, 0.10)'
shadow-standard: 'rgba(17, 0, 33, 0.14)'
shadow-elevated: 'rgba(17, 0, 33, 0.20)'
typography:
display:
family: 'nuSansDisplay, "nuSansDisplay Fallback", system-ui, -apple-system, Arial, Helvetica, sans-serif'
weights: [500, 600, 700]
opentype-features: ['kern']
body:
family: 'nuSansText, "nuSansText Fallback", system-ui, -apple-system, Arial, Helvetica, sans-serif'
weights: [400, 500, 600]
mono:
family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace'
weights: [400, 500]
scale:
display-mega: { size: 112, weight: 600, lineHeight: 0.90, tracking: '-1.4px', family: display, opentype: 'kern' }
display-hero: { size: 80, weight: 600, lineHeight: 0.95, tracking: '-1.2px', family: display, opentype: 'kern' }
display-lg: { size: 56, weight: 600, lineHeight: 1.02, tracking: '-0.9px', family: display, opentype: 'kern' }
h1: { size: 40, weight: 600, lineHeight: 1.08, tracking: '-0.6px', family: display }
h2: { size: 32, weight: 600, lineHeight: 1.15, tracking: '-0.4px', family: display }
h3: { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.2px', family: display }
h4: { size: 20, weight: 600, lineHeight: 1.30, tracking: '0', family: display }
title-sm: { size: 18, weight: 600, lineHeight: 1.35, tracking: '0', family: body }
body-lg: { size: 18, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body: { size: 16, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body-strong: { size: 16, weight: 600, lineHeight: 1.55, tracking: '0', family: body }
body-sm: { size: 14, weight: 400, lineHeight: 1.50, tracking: '0', family: body }
label: { size: 13, weight: 500, lineHeight: 1.40, tracking: '0', family: body }
caption: { size: 12, weight: 500, lineHeight: 1.40, tracking: '0.02em', family: body }
eyebrow: { size: 13, weight: 600, lineHeight: 1.30, tracking: '0.08em', family: body }
button: { size: 16, weight: 600, lineHeight: 1.20, tracking: '0', family: body }
nav-link: { size: 15, weight: 500, lineHeight: 1.40, tracking: '0', family: body }
legal: { size: 12, weight: 400, lineHeight: 1.50, tracking: '0', family: body }
radius:
none: 0
micro: 2
sm: 4
md: 8
lg: 12
xl: 16
xxl: 24
pill: 9999
spacing:
base: 4
scale: { xxs: 4, xs: 8, sm: 12, base: 16, md: 24, lg: 32, xl: 48, xxl: 64, section: 96, hero: 128 }
layout:
page-width: 1280
prose-width: 720
header-height: 64
components:
button-primary: { bg: brand, text: on-brand, padding: '16px 32px', height: 52, radius: pill, font: button }
button-primary-sm: { bg: brand, text: on-brand, padding: '12px 24px', height: 44, radius: pill, font: button }
button-ghost: { bg: transparent, text: brand, border: '1px solid border-purple', padding: '15px 31px', height: 52, radius: pill, font: button }
button-on-purple: { bg: bg, text: brand, padding: '16px 32px', height: 52, radius: pill, font: button }
button-ghost-on-purple: { bg: transparent, text: on-brand, border: '1px solid border-on-purple', padding: '15px 31px', height: 52, radius: pill, font: button }
button-text: { bg: transparent, text: brand, font: button }
card: { bg: surface, border: '1px solid border-soft', radius: lg, padding: 24 }
card-purple: { bg: surface-purple, text: text-on-purple, radius: xl, padding: 32 }
card-soft: { bg: bg-purple-tint, radius: lg, padding: 24 }
input: { bg: bg, border: '1px solid border-soft', text: text, radius: md, padding: '14px 16px', height: 52 }
badge-pill: { bg: brand-soft, text: brand, radius: pill, padding: '4px 12px', font: caption }
hero-band-purple: { bg: surface-purple, text: text-on-purple, padding: hero, font: display-hero }
hero-band-light: { bg: bg, text: text, padding: hero, font: display-hero }
top-nav: { bg: bg, text: text, height: 64, font: nav-link }
footer: { bg: surface-purple-deepest, text: text-on-purple, padding: '64px 0', font: body-sm }
motion:
ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
ease-entrance: 'cubic-bezier(0, 0, 0.2, 1)'
duration-fast: 150
duration-standard: 240
duration-slow: 320
reduced-motion: 'respects prefers-reduced-motion: reduce — section parallax, card lifts, and illustration loops collapse to static states'
breakpoints:
mobile: 640
tablet: 1024
desktop: 1280
wide: 1536
shadows:
ambient: 'rgba(17, 0, 33, 0.06) 0 1px 2px'
soft: 'rgba(17, 0, 33, 0.10) 0 4px 12px'
standard: 'rgba(17, 0, 33, 0.14) 0 8px 24px'
elevated: 'rgba(17, 0, 33, 0.20) 0 24px 48px -8px'
ring: '0 0 0 3px rgba(141, 13, 227, 0.45)'
accessibility:
contrast-text-on-bg: 21.0
contrast-body-on-bg: 18.1
contrast-on-purple-on-brand: 5.7
contrast-brand-on-bg: 5.7
focus-ring: '3px solid rgba(141,13,227,0.45) with 2px offset'
reduced-motion-honored: true
min-target: 44
dark-mode: light-with-purple-immersion
---
## 1. Visual Theme & Atmosphere
Nubank's visual identity is the most single-minded colour bet in modern fintech: the **entire brand is one purple**, `#8d0de3` — an electric, slightly magenta-leaning violet the brand simply calls **"o roxo"** (the purple). It arrived in 2013 as a deliberate provocation. Brazilian banking was a fortress of navy, gold, and grey marble; Nubank answered with a single saturated purple stamped onto a credit card with no number on the front. That card became a status object, and the colour became the company. Today the purple is everywhere — the wordmark, every CTA, full-bleed hero panels, illustration, the card itself — applied not as an accent but as the **entire identity**. There is no "Nubank blue" or "Nubank secondary"; there is the purple, and there is white.
The site lives in two registers that alternate down the page. The **light register** is a clean paper-white canvas (`#ffffff`) carrying black ink (`#000000`) and near-black body, with purple reserved for links, CTAs, and small accents — calm, generous, optimistic. The **immersive register** flips to full-bleed `#8d0de3` purple panels where white `nuSansDisplay` headlines are drawn enormous (80–112px) and the whole viewport becomes the brand colour. The hero is one of these dark-purple immersive moments: a white headline at roughly 83–112px in nuSansDisplay weight 600, set against the saturated purple, with a white-filled pill CTA below. The rhythm of the page is this back-and-forth — paper-light explanatory sections, then a purple panel that reasserts the brand, then light again.
Type is the custom **nuSans** superfamily, commissioned to give the brand a voice that reads warm and human rather than institutional. **nuSansDisplay** handles headlines — a humanist-geometric sans with friendly curves and generous apertures, drawn large with tight negative tracking (-1.2px to -1.4px at hero sizes) so the words lock into a confident, poster-like block. **nuSansText** handles body copy, optimised for screen reading at 16–18px with a comfortable 1.55 line-height. The pairing feels approachable and plainspoken — the typographic equivalent of a bank that talks to you in plain Portuguese instead of legalese.
Geometry is **soft and rounded everywhere**. Every actionable element is a **fully-rounded 999px pill**: the primary CTA is purple-filled with white text; the secondary is a purple-outline ghost (transparent fill, purple stroke, purple text). On purple panels the logic inverts — the primary becomes a white-filled pill with purple text, the secondary a white-outline ghost. Cards use a comfortable 12–16px radius. Nothing is hard-cornered; the brand's friendliness is encoded in its curves.
The overall posture is **deliberately anti-traditional-bank**: friendly, confident, optimistic, Portuguese-first. Where legacy banks project gravitas through marble and seriousness, Nubank projects trust through **clarity and warmth** — generous whitespace, plain language, big friendly type, and the relentless confidence of a brand that bet everything on one colour and won. It feels less like a bank and more like a well-designed consumer-tech product that happens to hold your money.
**Key Characteristics:**
- A one-colour brand: Nu Roxo `#8d0de3` is the entire identity — CTAs, heroes, wordmark, card
- Two alternating registers: paper-white light sections and full-bleed `#8d0de3` purple immersion
- White `nuSansDisplay` headlines at 80–112px on the purple hero, weight 600, tight negative tracking
- Custom nuSans superfamily: nuSansDisplay for headlines, nuSansText for body — humanist, warm
- Every CTA is a fully-rounded 999px pill — purple-filled primary, purple-outline ghost secondary
- On purple panels the CTA logic inverts: white-fill primary, white-outline ghost
- Black ink on white, white ink on purple — high-contrast, never grey-on-grey
- Soft rounded geometry throughout: 12–16px cards, full pills, no hard corners
- Generous whitespace and plain Portuguese-first voice — anti-corporate-bank warmth
- Rare warm accents (pink `#ff4d8b`, yellow `#ffd23f`) appear only in illustration and reward moments
## 2. Color Palette & Roles
### Canvas
- **Canvas** (`#ffffff`): Paper-white default ground — the brand's light register.
- **Canvas Subtle** (`#f5f2fa`): Faint purple-tinted off-white for alternating bands and section separation.
- **Purple Tint** (`#f3e9fd`): Pale lavender wash — soft info cards, gentle callouts on the light canvas.
### Text
- **Ink** (`#000000`): Primary black headline + heavy ink on the light canvas.
- **Body** (`#1a1a1a`): Near-black running body copy on light.
- **Muted** (`#595959`): Captions, metadata, secondary copy on light.
- **Subtle** (`#8a8a8a`): Disabled state, lowest hierarchy on light.
- **On-Purple Ink** (`#ffffff`): White headlines + body on purple immersive panels.
- **On-Purple Muted** (`#ecd9ff`): Soft lavender-white body text on purple panels.
### Brand
- **Nu Roxo / Brand** (`#8d0de3`): THE purple — the entire brand. Primary CTA fill, links, full-bleed panels, wordmark.
- **Brand Bright** (`#a32ff0`): Lighter purple for hover/active lift on the primary CTA.
- **Brand Deep** (`#6a0aab`): Pressed/active deeper purple; layered panel grounds.
- **Brand Soft** (`rgba(141, 13, 227, 0.10)`): Purple at 10% — badge backgrounds, hover wash on light.
- **On-Brand** (`#ffffff`): White text on the purple CTA fill.
- **Surface Purple** (`#8d0de3`): Full-bleed immersive hero/section panel — the brand at full saturation.
- **Surface Purple Deep** (`#6a0aab`): Deeper purple for layered panels.
- **Surface Purple Deepest** (`#3d0764`): Near-black purple — footer and deepest immersive ground.
### Accent (Rare)
Nubank is essentially monochromatic; accents are used sparingly and almost exclusively in illustration, reward moments, and promo highlights — never as a competing brand colour.
- **Accent Pink** (`#ff4d8b`): Warm pink for promo, NuConta highlights, illustration.
- **Accent Yellow** (`#ffd23f`): Optimism-yellow for reward moments and illustration.
### Interactive
- **Link** (`#8d0de3`): Default link in brand purple on the light canvas; underline on hover.
- **Link Hover** (`#6a0aab`): Deeper purple on hover on light.
- **Link On-Purple** (`#ffffff`): White, underlined link on purple panels.
- **CTA Hover** — primary fill shifts `#8d0de3` → `#a32ff0`; ghost gains a `brand-soft` wash.
- **CTA Active** — primary fill `#6a0aab`.
- **Disabled** — `#f5f2fa` background, `#8a8a8a` text.
### Neutral Scale (Light)
A short, high-contrast neutral ramp — Nubank never lingers in mid-grey:
`#ffffff` (Canvas) → `#f5f2fa` (Subtle) → `#f3e9fd` (Purple Tint) → `#8a8a8a` (Subtle ink) → `#595959` (Muted) → `#1a1a1a` (Body) → `#000000` (Ink).
### Surface & Borders
- **Surface** (`#ffffff`): Default card surface on light.
- **Surface Soft** (`#f3e9fd`): Lavender card surface for soft callouts.
- **Surface Purple** (`#8d0de3`): Immersive purple card / panel.
- **Border** (`#000000`): Full-weight ink hairline — used on certain outline buttons and emphatic dividers.
- **Border Soft** (`rgba(0, 0, 0, 0.10)`): Default 1px hairline divider on light.
- **Border Purple** (`#8d0de3`): Purple outline for the ghost CTA and focused inputs.
- **Border On-Purple** (`rgba(255, 255, 255, 0.30)`): Hairline divider and ghost-button stroke on purple panels.
### Shadow Colors
Shadows are **purple-tinted black** (`rgba(17, 0, 33, …)`) rather than neutral black, so elevation stays in the brand's chromatic family on the light canvas. Opacity runs low (0.06–0.20) — Nubank's depth is gentle and paper-soft, never dramatic.
### Semantic
- **Success** (`#2db84f`): Confirmation green — transfers complete, account verified.
- **Warning** (`#f5a623`): Caution amber.
- **Danger** (`#e02d2d`): Error red — failed payment, validation error.
- **Info** (`#8d0de3`): Info matches brand purple — the brand colour doubles as the info state.
## 3. Typography Rules
### Font Family
**Display: nuSansDisplay** — the brand's custom display sans, a humanist-geometric face with friendly curves, generous apertures, and slightly condensed proportions at large sizes. Used for every headline, drawn large (40–112px) at weight 600 with tight negative tracking. Weights deployed: 500, 600, 700.
**Body: nuSansText** — the companion text cut of the nuSans superfamily, optimised for on-screen reading at 14–18px with comfortable line-heights. Used for all running body, labels, navigation, and button text. Weights: 400, 500, 600.
**Fallback chains**: display hands off `nuSansDisplay → "nuSansDisplay Fallback" → system-ui → -apple-system → Arial → Helvetica → sans-serif`; body hands off `nuSansText → "nuSansText Fallback" → system-ui → -apple-system → Arial → Helvetica → sans-serif`. The custom "* Fallback" faces are metric-matched to minimise layout shift before nuSans loads.
**Mono: system monospace** — `ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace`. Nubank uses no custom mono; the system stack carries the rare code/reference moment. Weights: 400, 500.
**OpenType features**: `kern` always on. The display face relies on its tight default tracking plus negative letter-spacing rather than alternate glyph sets — there is no heavy OpenType styling layer.
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---------------|----------------|------|--------|-------------|----------------|------------------------------------------------|
| display-mega | nuSansDisplay | 112 | 600 | 0.90 | -1.4px | Top-of-page hero headline, white on purple |
| display-hero | nuSansDisplay | 80 | 600 | 0.95 | -1.2px | Standard hero headline |
| display-lg | nuSansDisplay | 56 | 600 | 1.02 | -0.9px | Major section opener |
| h1 | nuSansDisplay | 40 | 600 | 1.08 | -0.6px | Page / section H1 |
| h2 | nuSansDisplay | 32 | 600 | 1.15 | -0.4px | Subsection heading |
| h3 | nuSansDisplay | 24 | 600 | 1.25 | -0.2px | Card title / feature heading |
| h4 | nuSansDisplay | 20 | 600 | 1.30 | 0 | Small heading |
| title-sm | nuSansText | 18 | 600 | 1.35 | 0 | List heading, inline title |
| body-lg | nuSansText | 18 | 400 | 1.55 | 0 | Lead paragraph |
| body | nuSansText | 16 | 400 | 1.55 | 0 | Default running body |
| body-strong | nuSansText | 16 | 600 | 1.55 | 0 | Inline emphasis |
| body-sm | nuSansText | 14 | 400 | 1.50 | 0 | Secondary body |
| label | nuSansText | 13 | 500 | 1.40 | 0 | Form labels, chips |
| caption | nuSansText | 12 | 500 | 1.40 | 0.02em | Metadata, fine print |
| eyebrow | nuSansText | 13 | 600 | 1.30 | 0.08em | Section eyebrow — modest uppercase/tracked |
| button | nuSansText | 16 | 600 | 1.20 | 0 | All CTA labels |
| nav-link | nuSansText | 15 | 500 | 1.40 | 0 | Top navigation |
| legal | nuSansText | 12 | 400 | 1.50 | 0 | Footer disclosure |
### Principles
- **Display weight is 600, not 700**: Nubank's headline voice is confident but warm — semibold, not maximally heavy. The friendliness lives in the weight choice as much as the letterforms.
- **Tight negative tracking on display**: -0.6px to -1.4px on the large tiers locks the headline into a dense, poster-like block. The bigger the size, the tighter the tracking.
- **Sub-1.0 line-height on the mega tier**: hero headlines run 0.90–0.95 line-height so multi-line headlines stack into a solid mass.
- **Display for headings, Text for everything else**: nuSansDisplay stops at h4 (20px); from title-sm down it's nuSansText. The cut switch is part of the hierarchy.
- **Body at 1.55 line-height**: generous leading on 16–18px body reinforces the calm, readable, plain-Portuguese register.
- **High-contrast ink only**: black `#000000` on white, white `#ffffff` on purple. The brand avoids mid-grey body text; muted greys are reserved for captions and metadata.
- **Eyebrow is gentle, not shouty**: 13px weight 600 with 0.08em tracking — present but never an aggressive all-caps mono label.
## 4. Component Stylings
### Buttons
**Primary CTA** ("Quero ser Nubank", "Continuar")
- Background: `#8d0de3` (Nu Roxo)
- Text: `#ffffff`, weight 600, 16px
- Padding: 16px / 32px
- Height: 52px
- Radius: pill (9999)
- Hover: bg `#a32ff0`, gentle lift (`shadow-soft`)
- Active: bg `#6a0aab`
- Use case: every primary action on the light canvas
**Primary Small**
- Same as primary at 12px / 24px padding, 44px height — minimum touch target preserved
- Use case: nav-bar CTA, compact cards
**Ghost / Outline** ("Login Empresas", "Saiba mais")
- Background: transparent
- Text: `#8d0de3`, weight 600
- Border: 1px solid `#8d0de3` (purple outline)
- Padding: 15px / 31px (1px less than primary to compensate for the border)
- Height: 52px
- Radius: pill
- Hover: bg `brand-soft` (`rgba(141,13,227,0.10)`)
- Use case: secondary action beside the primary CTA
**On-Purple Primary** (CTA sitting on a purple panel)
- Background: `#ffffff`
- Text: `#8d0de3`, weight 600
- Same pill geometry, 52px
- Hover: bg shifts to `#f3e9fd`
- Use case: the CTA inside a full-bleed `#8d0de3` hero — logic inverts to white-fill / purple-text
**On-Purple Ghost**
- Background: transparent
- Text: `#ffffff`, weight 600
- Border: 1px solid `rgba(255, 255, 255, 0.30)`
- Same pill geometry
- Use case: secondary action on a purple panel
**Text Button**
- Background: transparent
- Text: `#8d0de3`, weight 600, underline-on-hover
- Use case: tertiary / inline action
### Cards
**Default Card**
- Background: `#ffffff`
- Border: 1px solid `rgba(0, 0, 0, 0.10)`
- Radius: 12px
- Padding: 24px
- Shadow: none at rest; `shadow-soft` on hover
- Use case: feature grid on the light canvas
**Purple Card** (immersive)
- Background: `#8d0de3`
- Text: `#ffffff` headline, `#ecd9ff` body
- Radius: 16px
- Padding: 32px
- Use case: highlighted product card, "o roxo" moment within a light section
**Soft Card**
- Background: `#f3e9fd` (purple tint)
- Radius: 12px
- Padding: 24px
- Use case: info callout, benefit list, gentle emphasis without going full-purple
### Badges, Tags, Pills
**Brand Badge**
- Background: `rgba(141, 13, 227, 0.10)` (brand-soft)
- Text: `#8d0de3`, weight 600, 12px
- Padding: 4px / 12px
- Radius: pill
- Use case: "Novo", "Grátis", category tag
**Selector Chip**
- Background: `#ffffff` at rest, `#8d0de3` when selected
- Text: `#000000` at rest, `#ffffff` when selected
- Border: 1px solid `rgba(0,0,0,0.10)`
- Radius: pill
- Use case: filter chips, plan toggles
### Inputs / Forms
**Text Input**
- Background: `#ffffff`
- Border: 1px solid `rgba(0, 0, 0, 0.10)`
- Radius: 8px
- Height: 52px
- Padding: 14px / 16px
- Label: 13px weight 500 above the field
- Focus: border `#8d0de3` 2px, ring `rgba(141, 13, 227, 0.45)` 3px
- Error: border `#e02d2d`, helper text in `#e02d2d`
- Use case: signup form, CPF entry, search
**On-Purple Input**
- Background: `rgba(255, 255, 255, 0.12)`
- Border: 1px solid `rgba(255, 255, 255, 0.30)`
- Text + placeholder: white / lavender-white
- Use case: lead-capture field on a purple hero
### Navigation
**Top Nav**
- Height: 64px
- Background: `#ffffff` (transparent over purple heroes, then solid white on scroll)
- No bottom border at top of page; gains a `border-soft` hairline + `shadow-ambient` once stuck on scroll
- Logo left (Nubank wordmark in `#8d0de3`), nav links centre, ghost "Login" + primary "Quero ser Nubank" pill right
- Nav link: 15px / 500, colour `#000000`; hover: colour shifts to `#8d0de3`
- Over a purple hero the nav inverts: white wordmark, white links, white-fill primary pill
**Footer**
- Background: `#3d0764` (deepest purple) — closes the page in immersive brand colour
- Text: `#ffffff` for category headers, `#ecd9ff` for links
- Padding: 64px vertical
- Nubank wordmark + app-store badges, region/language switcher
## 5. Layout Principles
### Spacing System
Base 4px. Scale: 4, 8, 12, 16, 24, 32, 48, 64, 96, 128. Section spacer 96px; hero 128px. The 4px base keeps component padding tight and consistent, while large section gaps (96–128px) deliver the generous, unhurried whitespace that defines the brand's calm.
### Grid & Container
- Page max-width 1280px
- Prose width 720px
- 12-col grid with 24px gutters
- Light sections: content max 1280px, centred, generous side padding
- Purple immersive sections go full-bleed in `#8d0de3`; content inside still respects the 1280px container
### Whitespace Philosophy
Nubank's whitespace is **deliberate and abundant**. Light sections give headlines and body copy room to breathe — the page is never crowded. The visual logic is "let the purple and the type do the work" — minimal ornament, lots of air, a single clear action per section. The whitespace is itself a trust signal: a calm, uncluttered page reads as a calm, trustworthy bank.
### Section Cadence
Light section → light section (subtle band) → full-bleed purple immersive panel → light section → deepest-purple footer. The purple panels are the page's punctuation: every few sections the brand reasserts itself in full saturation, then returns to the calm white register. The cadence is light-dominant with purple as the recurring emphatic beat.
## 6. Shapes & Radius Scale
| Tier | Value | Use |
|------------|-------|--------------------------------------------------|
| None | 0 | Full-bleed panel edges, banner promos |
| Micro | 2 | Status dots, tiny indicators |
| SM | 4 | Small inline tags |
| MD | 8 | Inputs, dropdowns, small buttons |
| LG | 12 | Default cards, soft callouts |
| XL | 16 | Feature cards, purple cards, image containers |
| XXL | 24 | Large hero cards, illustration frames |
| Pill | 9999 | All CTAs, badges, selector chips |
Nubank's signature radius pairing is **12–16px on cards + full 999px pill on every CTA**. The fully-rounded pill is non-negotiable across all button variants and on both light and purple registers — it is one of the brand's most recognisable geometric tells. Nothing in the system is hard-cornered below the 12px card tier.
## 7. Depth & Elevation
| Level | Treatment | Use |
|-------|------------------------------------------------------------------|--------------------------------------------------|
| 0 | Flat (canvas `#ffffff` or panel `#8d0de3`) | Hero text, body, default sections |
| 1 | Ambient `rgba(17,0,33,0.06) 0 1px 2px` | Sticky nav post-scroll, resting card hairline |
| 2 | Soft `rgba(17,0,33,0.10) 0 4px 12px` | Card hover, raised callout |
| 3 | Standard `rgba(17,0,33,0.14) 0 8px 24px` | Dropdown, popover, floating CTA |
| 4 | Elevated `rgba(17,0,33,0.20) 0 24px 48px -8px` | Modal dialog, mega-menu |
### Shadow Philosophy
Nubank's elevation is **gentle and paper-soft**, never dramatic. Shadows are **purple-tinted black** (`rgba(17, 0, 33, …)`) rather than neutral grey, so even the depth stays in the brand's chromatic family on the white canvas. Opacity runs low (0.06–0.20). The brand prefers to communicate hierarchy through **colour and whitespace** rather than heavy shadow — most cards rest flat with a hairline border and only lift on hover. On purple immersive panels, shadow is largely abandoned in favour of surface-colour layering (`#8d0de3` → `#6a0aab` → `#3d0764`), since dark-on-dark shadow reads poorly.
## 8. Interaction & Motion
### Easing
- **Standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — most state changes
- **Emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — entrances, section reveals
- **Entrance**: `cubic-bezier(0, 0, 0.2, 1)` — elements arriving on scroll
### Durations
- **Fast**: 150ms — colour shifts on link/button hover
- **Standard**: 240ms — most component state changes, card hover lift
- **Slow**: 320ms — modal entrance, section reveal, purple-panel parallax
### Per-Component Recipes
- **Button hover**: primary fill `#8d0de3` → `#a32ff0` over 150ms; gentle `shadow-soft` lift over 240ms
- **Ghost hover**: `brand-soft` wash fades in over 150ms
- **Card hover**: lift from flat to `shadow-soft`, optional 2px translate-up over 240ms ease-standard
- **Link hover**: colour shift + underline over 150ms
- **Section reveal on scroll**: opacity 0 → 1 + 16px translate-up over 320ms ease-emphasized, staggered for grids
- **Purple panel parallax**: background illustration drifts subtly slower than content on scroll
- **Nav stick**: transparent-over-hero → solid white with hairline + ambient shadow, crossfade over 240ms
### Page Transition
Section-by-section scroll reveals are the dominant motion. There are no hard page-swap colour transitions — the light/purple alternation is structural, not animated. Hero illustrations may loop a slow ambient animation.
### Reduced Motion
Strictly honoured via `prefers-reduced-motion: reduce`. Section parallax stops; scroll-reveal becomes instant (no translate, no fade); card lift becomes an instant shadow swap; illustration loops freeze on their first frame. All content remains fully accessible without motion.
## 9. Accessibility & A11y
### Contrast Pairs
- `#000000` ink on `#ffffff` bg: **21.0:1** — AAA
- `#1a1a1a` body on `#ffffff` bg: **18.1:1** — AAA
- `#595959` muted on `#ffffff` bg: **7.0:1** — AAA
- `#ffffff` on `#8d0de3` brand: **5.7:1** — AA (passes for normal text, AAA for large)
- `#8d0de3` brand link on `#ffffff` bg: **5.7:1** — AA at all sizes
- `#ecd9ff` muted on `#8d0de3` brand: **3.4:1** — AA large text only; reserve for headings/large copy
The purple `#8d0de3` is calibrated to clear AA against both white and black — white text on the purple CTA passes 5.7:1, and the purple link on white passes the same. White-on-purple is the safe default for all panel copy; pale lavender (`#ecd9ff`) is restricted to large text.
### Focus Indicators
3px solid `rgba(141, 13, 227, 0.45)` ring with 2px offset on every interactive element on light. On purple panels the focus ring switches to a white `rgba(255,255,255,0.7)` ring for contrast.
### ARIA Patterns
- **Dialog**: modals use `role="dialog"`, `aria-modal="true"`, focus-trap, Escape to close
- **Navigation**: top nav uses `<nav aria-label>`; mega-menu items expose `aria-expanded`
- **Forms**: inputs paired with `<label>`; errors use `aria-describedby` + `aria-invalid="true"`
- **Live region**: form-submission status uses `aria-live="polite"`
- **Accordion** (FAQ): `aria-expanded` + `aria-controls` on each trigger
### Keyboard Nav
Tab order matches visual flow. Pill CTAs and links are native focusable elements. Modals focus-trap and restore focus on close. Accordions toggle on Enter/Space. The mega-menu is fully keyboard-operable with arrow keys within groups.
### Screen Reader Hints
- Wordmark: `role="img"` with `aria-label="Nubank"`
- Decorative purple illustrations: `aria-hidden="true"`
- Icon-only buttons: explicit `aria-label` (Portuguese-first, e.g. `aria-label="Abrir menu"`)
- Language/region switcher announces current selection
### Reduced Motion
All animations honour `prefers-reduced-motion: reduce`; scroll reveals and parallax collapse to static.
## 10. Responsive Behavior
### Breakpoints
| Name | Width | Use |
|---------|-----------|----------------------------------|
| mobile | <640 | Stacked single-column |
| tablet | 640–1024 | 2-col grid |
| desktop | 1024–1280 | 3-col grid |
| wide | ≥1280 | Full 1280px layout |
### Touch Targets
Minimum 44×44px. Primary CTA at 52px, small CTA at 44px (the floor). Nav links and chips padded to ≥44px tap height on mobile.
### Collapsing Strategy
- Top nav collapses to a hamburger drawer below 1024px; the primary "Quero ser Nubank" pill stays visible
- display-mega scales 112 → 80 → 56 → 40px (desktop → tablet → large-mobile → mobile)
- display-hero scales 80 → 56 → 40px
- Feature grid 3-col → 2-col → 1-col
- Purple panels stay full-bleed at every breakpoint; padding tightens from 128px → 64px → 48px
- Side-by-side hero (text + illustration) stacks vertically on mobile, text first
### Image Behavior
- App/phone mockups at iOS-bezel radius
- Hero illustrations scale down and may crop on mobile; decorative-only assets drop below 640px
- `loading="lazy"` for below-fold media
### Container Queries
Feature cards adapt internally: below a narrow card width the icon stacks above the title; at wider widths icon and text align horizontally.
## 11. Content & Voice
### Tone
**Warm, plain-spoken, confident, optimistic — and Portuguese-first.** Nubank's voice is the antithesis of bank legalese: short clear sentences, second-person address ("Sua conta", "Quero ser Nubank"), and an upbeat, human register. The brand sounds like a knowledgeable friend explaining money simply, never a fortress projecting gravitas. Copy is primary in Brazilian Portuguese (with Spanish/English for other markets) and avoids jargon, fees-fine-print theatrics, and intimidation.
### Microcopy Patterns
- **Button verbs**: "Quero ser Nubank" (I want to be Nubank), "Abrir conta" (Open account), "Continuar", "Saiba mais" (Learn more), "Peça já" (Request now)
- **Error message recipe**: clear, calm, non-blaming. "Não conseguimos validar seu CPF. Confira os números." (We couldn't validate your CPF. Check the numbers.)
- **Success confirmation**: "Pronto! Sua conta foi criada." (Done! Your account was created.)
- **Reassurance copy**: emphasises "sem tarifas" (no fees), "sem anuidade" (no annual fee), "100% pelo app"
### Empty States
- **No transactions**: "Suas movimentações vão aparecer aqui." (Your activity will show up here.)
- **No cards**: "Você ainda não tem um cartão. Que tal pedir o seu?" (You don't have a card yet. How about requesting yours?)
- Empty states are warm and inviting — they nudge toward the next action, never apologise.
### CTA Verb Conventions
- **Acquisition**: "Quero ser Nubank", "Abrir conta grátis", "Peça já"
- **Sign-in**: "Login", "Entrar"
- **Exploration**: "Saiba mais", "Conheça", "Veja como funciona"
- **Confirmation**: "Continuar", "Confirmar"
The brand frequently frames CTAs in the **first person** ("Quero…" / "I want…") — putting the desire in the user's voice rather than commanding them. It is a distinctive, warm conversion device.
## 12. Dark Mode & Theming
Nubank's marketing site is **light-with-purple-immersion** rather than a true dark-mode brand. The default register is the white canvas; the "dark" moments are full-bleed `#8d0de3` (and deeper `#6a0aab` / `#3d0764`) immersive panels, not a neutral dark theme. There is no separate dark/light toggle on the marketing site — the alternation is structural and intentional.
If extending to a true dark theme (e.g. for an app or a dark-mode marketing variant):
```yaml
colors-dark:
bg: '#1a0b29' # deep purple-black ground (not neutral black)
bg-elevated: '#2a1240' # +1 surface
surface: '#2a1240'
surface-strong: '#3d0764'
text: '#ffffff'
text-body: '#ecd9ff' # lavender-white body
text-muted: '#b69bd1'
brand: '#a32ff0' # lift the purple brighter — #8d0de3 is slightly dark on a purple-black ground
brand-hover: '#b85cff'
on-brand: '#ffffff'
border: 'rgba(255, 255, 255, 0.14)'
link: '#c98cff'
```
The key move for true dark mode is **lifting the brand purple** from `#8d0de3` toward `#a32ff0` so the CTA reads as active against a purple-black ground, and keeping backgrounds in the purple family (`#1a0b29`) rather than neutral black — the brand stays chromatic even in the dark.
## 13. Lineage & Influences
Nubank's design lineage is the story of a deliberate **rejection of Brazilian banking convention** fused with **Silicon Valley consumer-tech minimalism**. When Nubank launched in 2013, incumbent banks (Itaú, Bradesco, Santander Brasil) signalled trust through navy, gold, marble, and seriousness. Nubank inverted every variable at once: a single saturated purple, a credit card with no number on the front, generous whitespace, plain Portuguese, and a product-first posture. The colour itself was the strategy — "o roxo" became a cultural shorthand, and the no-number card became an aspirational object. The brand's confidence comes from committing absolutely to one colour and one tone, the way the best consumer-tech brands commit to a single identity.
Visually it draws from the **flat-design / friendly-fintech wave** of the mid-2010s — Monzo's coral, Revolut's gradients, and the broader European-neobank movement all share the DNA of bold mono-colour identity, rounded pills, big friendly type, and whitespace-forward layouts. But where Monzo and Revolut lean playful-to-edgy, Nubank stays **warm and reassuring** — the optimism of a brand serving a market where many users were unbanked or underserved. The custom nuSans superfamily is what most separates it: a humanist-geometric voice that keeps the brand from feeling cold or generic. What Nubank rejects is everything legacy-bank — the navy-and-gold gravitas, the fee-laden fine print, the branch-first physicality — and everything cold-tech (it avoids the developer-grey, terminal-mono aesthetic entirely). The result is a brand that feels like a friendly, well-designed app that happens to be the largest bank in Latin America.
**Influences:**
- **Monzo** ([monzo.com](https://monzo.com)) — Mono-colour neobank identity, rounded pills, friendly big type
- **Revolut** ([revolut.com](https://revolut.com)) — European neobank movement, bold-colour fintech UI
- **Apple** ([apple.com](https://www.apple.com)) — Whitespace-forward, product-first consumer-tech minimalism
- **Stripe** ([stripe.com](https://stripe.com)) — Fintech-design clarity and immersive full-bleed colour sections
- **Pentagram** ([pentagram.com](https://www.pentagram.com)) — Brand-system rigour: single-colour identity applied with total conviction
## 14. Do's and Don'ts
**Do:**
- Use Nu Roxo `#8d0de3` as THE brand colour — CTAs, links, heroes, accents all flow from one purple
- Pill every CTA at full 999px radius — purple-fill primary, purple-outline ghost
- Invert CTA logic on purple panels: white-fill primary, white-outline ghost
- Set headlines in nuSansDisplay weight 600 with tight negative tracking (-0.6px to -1.4px)
- Use nuSansText for all body, labels, nav, and button text
- Alternate white light sections with full-bleed `#8d0de3` immersive panels
- Keep ink high-contrast: black `#000000` on white, white `#ffffff` on purple
- Use generous whitespace (96–128px section gaps) as a trust signal
- Tint shadows purple (`rgba(17,0,33,…)`) so depth stays in the brand family
- Frame conversion CTAs in the first person ("Quero ser Nubank") — warm, plain Portuguese-first
**Don't:**
- Don't introduce a second brand colour — Nubank is one purple; blue/green/teal break the identity
- Don't use a softer pastel-lavender for the brand — `#8d0de3` is saturated and electric, not muted
- Don't hard-corner CTAs — every button is a full pill, never an 8px-radius rectangle
- Don't use weight 700+ display as the default — 600 is the warm, confident voice
- Don't set body text in mid-grey — black/near-black on white, white on purple
- Don't put white-text on a pale-purple fill — the CTA fill must be full `#8d0de3` to clear contrast
- Don't lean on heavy drop-shadows — Nubank's depth is gentle, paper-soft, and purple-tinted
- Don't use corporate-bank gravitas copy — no navy-and-gold seriousness, no fee fine-print theatrics
- Don't overuse the pink/yellow accents — they belong in illustration only, never as CTAs
- Don't centre dense paragraphs — keep prose left-aligned at ~720px for readability
## 15. Agent Prompt Guide
### Quick Color Reference
```
Brand (Nu Roxo): #8d0de3
Brand Bright: #a32ff0
Brand Deep: #6a0aab
Purple Deepest: #3d0764
Canvas: #ffffff
Purple Tint: #f3e9fd
Ink: #000000
Body: #1a1a1a
On-Purple Ink: #ffffff
On-Purple Muted: #ecd9ff
Border Soft: rgba(0,0,0,0.10)
Accent Pink: #ff4d8b
```
### Example Component Prompts
1. *"Create a Nubank hero: full-bleed `#8d0de3` purple background, 96px nuSansDisplay headline at weight 600 in pure white `#ffffff` with -1.2px tracking and 0.95 line-height — text 'Somos incansáveis pra você não precisar ser'. Below, an 18px body in `#ecd9ff` (lavender-white). A white-filled pill CTA (999px radius, 52px height, 16px/32px padding) with `#8d0de3` purple text at weight 600, labelled 'Quero ser Nubank'. Beside it, a white-outline ghost pill (1px `rgba(255,255,255,0.30)` border, white text) labelled 'Saiba mais'."*
2. *"Design a Nubank feature grid on a white `#ffffff` canvas: 3 cards in a row, 24px gap. Each card has white bg, 1px `rgba(0,0,0,0.10)` border, 12px radius, 24px padding. Title 24px nuSansDisplay weight 600 in `#000000` with -0.2px tracking. Body 16px nuSansText weight 400 in `#1a1a1a` at 1.55 line-height. Top of each card: a purple `#8d0de3` icon. On hover, the card lifts with a soft purple-tinted shadow `rgba(17,0,33,0.10) 0 4px 12px`."*
3. *"Build a Nubank signup form on white: a 52px-tall text input, white bg, 1px `rgba(0,0,0,0.10)` border, 8px radius, 14px/16px padding, with a 13px weight-500 label above. On focus, the border turns `#8d0de3` 2px with a 3px `rgba(141,13,227,0.45)` ring. Below, a full-width purple pill CTA (`#8d0de3` fill, white text, 999px radius, 52px height) labelled 'Continuar'."*
4. *"Compose a Nubank purple immersive card: `#8d0de3` background, 16px radius, 32px padding. Headline 32px nuSansDisplay weight 600 in white. Body 16px nuSansText in `#ecd9ff`. A white-fill pill CTA (`#8d0de3` text) at the bottom. The card sits inside a white section as the page's 'o roxo' emphasis moment."*
5. *"Design a Nubank top nav: 64px tall, white `#ffffff` background, no border at top (gains a `rgba(0,0,0,0.10)` hairline + soft shadow on scroll). Nubank wordmark in `#8d0de3` on the left, nav links centre (15px nuSansText weight 500, black `#000000`, hover to `#8d0de3`), and on the right a purple-outline ghost 'Login' pill plus a purple-fill 'Quero ser Nubank' primary pill."*
6. *"Create a Nubank pricing/benefit section: alternating white and `#f5f2fa` bands, left-aligned prose at 720px width. Eyebrow in 13px nuSansText weight 600 tracked 0.08em in `#8d0de3`. H2 at 32px nuSansDisplay weight 600 in black. Benefit chips: pill-shaped, `rgba(141,13,227,0.10)` bg, `#8d0de3` text. Generous 96px vertical spacing between sections."*
### Iteration Guide
1. **Commit to the one purple**: every brand colour decision routes through `#8d0de3`. If you've reached for a second brand colour, you've left Nubank — pull it back.
2. **Pill every CTA**: full 999px radius, no exceptions. Purple-fill primary, purple-outline ghost on light; white-fill / white-outline on purple panels.
3. **Alternate the two registers**: white light sections punctuated by full-bleed `#8d0de3` immersive panels. The rhythm IS the layout.
4. **Headlines in nuSansDisplay 600 with tight tracking**: -0.6px to -1.4px, sub-1.0 line-height at hero sizes. Warm-confident, not maximally heavy.
5. **Keep ink high-contrast**: black on white, white on purple — never mid-grey body. Greys are for captions only.
6. **Tint the shadows purple**: `rgba(17,0,33,…)` at low opacity, not neutral black. Keep depth in the brand family.
7. **Use whitespace generously**: 96–128px section gaps. Calm, uncluttered layout is itself a trust signal.
8. **Write warm, first-person, Portuguese-first copy**: "Quero ser Nubank" not "Sign up now" — put the desire in the user's voice and drop the bank gravitas.
1. Visual Theme & Atmosphere
Nubank’s visual identity is the most single-minded colour bet in modern fintech: the entire brand is one purple, #8d0de3 — an electric, slightly magenta-leaning violet the brand simply calls “o roxo” (the purple). It arrived in 2013 as a deliberate provocation. Brazilian banking was a fortress of navy, gold, and grey marble; Nubank answered with a single saturated purple stamped onto a credit card with no number on the front. That card became a status object, and the colour became the company. Today the purple is everywhere — the wordmark, every CTA, full-bleed hero panels, illustration, the card itself — applied not as an accent but as the entire identity. There is no “Nubank blue” or “Nubank secondary”; there is the purple, and there is white.
The site lives in two registers that alternate down the page. The light register is a clean paper-white canvas (#ffffff) carrying black ink (#000000) and near-black body, with purple reserved for links, CTAs, and small accents — calm, generous, optimistic. The immersive register flips to full-bleed #8d0de3 purple panels where white nuSansDisplay headlines are drawn enormous (80–112px) and the whole viewport becomes the brand colour. The hero is one of these dark-purple immersive moments: a white headline at roughly 83–112px in nuSansDisplay weight 600, set against the saturated purple, with a white-filled pill CTA below. The rhythm of the page is this back-and-forth — paper-light explanatory sections, then a purple panel that reasserts the brand, then light again.
Type is the custom nuSans superfamily, commissioned to give the brand a voice that reads warm and human rather than institutional. nuSansDisplay handles headlines — a humanist-geometric sans with friendly curves and generous apertures, drawn large with tight negative tracking (-1.2px to -1.4px at hero sizes) so the words lock into a confident, poster-like block. nuSansText handles body copy, optimised for screen reading at 16–18px with a comfortable 1.55 line-height. The pairing feels approachable and plainspoken — the typographic equivalent of a bank that talks to you in plain Portuguese instead of legalese.
Geometry is soft and rounded everywhere. Every actionable element is a fully-rounded 999px pill: the primary CTA is purple-filled with white text; the secondary is a purple-outline ghost (transparent fill, purple stroke, purple text). On purple panels the logic inverts — the primary becomes a white-filled pill with purple text, the secondary a white-outline ghost. Cards use a comfortable 12–16px radius. Nothing is hard-cornered; the brand’s friendliness is encoded in its curves.
The overall posture is deliberately anti-traditional-bank: friendly, confident, optimistic, Portuguese-first. Where legacy banks project gravitas through marble and seriousness, Nubank projects trust through clarity and warmth — generous whitespace, plain language, big friendly type, and the relentless confidence of a brand that bet everything on one colour and won. It feels less like a bank and more like a well-designed consumer-tech product that happens to hold your money.
Key Characteristics:
- A one-colour brand: Nu Roxo
#8d0de3is the entire identity — CTAs, heroes, wordmark, card - Two alternating registers: paper-white light sections and full-bleed
#8d0de3purple immersion - White
nuSansDisplayheadlines at 80–112px on the purple hero, weight 600, tight negative tracking - Custom nuSans superfamily: nuSansDisplay for headlines, nuSansText for body — humanist, warm
- Every CTA is a fully-rounded 999px pill — purple-filled primary, purple-outline ghost secondary
- On purple panels the CTA logic inverts: white-fill primary, white-outline ghost
- Black ink on white, white ink on purple — high-contrast, never grey-on-grey
- Soft rounded geometry throughout: 12–16px cards, full pills, no hard corners
- Generous whitespace and plain Portuguese-first voice — anti-corporate-bank warmth
- Rare warm accents (pink
#ff4d8b, yellow#ffd23f) appear only in illustration and reward moments
2. Color Palette & Roles
Canvas
- Canvas (
#ffffff): Paper-white default ground — the brand’s light register. - Canvas Subtle (
#f5f2fa): Faint purple-tinted off-white for alternating bands and section separation. - Purple Tint (
#f3e9fd): Pale lavender wash — soft info cards, gentle callouts on the light canvas.
Text
- Ink (
#000000): Primary black headline + heavy ink on the light canvas. - Body (
#1a1a1a): Near-black running body copy on light. - Muted (
#595959): Captions, metadata, secondary copy on light. - Subtle (
#8a8a8a): Disabled state, lowest hierarchy on light. - On-Purple Ink (
#ffffff): White headlines + body on purple immersive panels. - On-Purple Muted (
#ecd9ff): Soft lavender-white body text on purple panels.
Brand
- Nu Roxo / Brand (
#8d0de3): THE purple — the entire brand. Primary CTA fill, links, full-bleed panels, wordmark. - Brand Bright (
#a32ff0): Lighter purple for hover/active lift on the primary CTA. - Brand Deep (
#6a0aab): Pressed/active deeper purple; layered panel grounds. - Brand Soft (
rgba(141, 13, 227, 0.10)): Purple at 10% — badge backgrounds, hover wash on light. - On-Brand (
#ffffff): White text on the purple CTA fill. - Surface Purple (
#8d0de3): Full-bleed immersive hero/section panel — the brand at full saturation. - Surface Purple Deep (
#6a0aab): Deeper purple for layered panels. - Surface Purple Deepest (
#3d0764): Near-black purple — footer and deepest immersive ground.
Accent (Rare)
Nubank is essentially monochromatic; accents are used sparingly and almost exclusively in illustration, reward moments, and promo highlights — never as a competing brand colour.
- Accent Pink (
#ff4d8b): Warm pink for promo, NuConta highlights, illustration. - Accent Yellow (
#ffd23f): Optimism-yellow for reward moments and illustration.
Interactive
- Link (
#8d0de3): Default link in brand purple on the light canvas; underline on hover. - Link Hover (
#6a0aab): Deeper purple on hover on light. - Link On-Purple (
#ffffff): White, underlined link on purple panels. - CTA Hover — primary fill shifts
#8d0de3→#a32ff0; ghost gains abrand-softwash. - CTA Active — primary fill
#6a0aab. - Disabled —
#f5f2fabackground,#8a8a8atext.
Neutral Scale (Light)
A short, high-contrast neutral ramp — Nubank never lingers in mid-grey:
#ffffff (Canvas) → #f5f2fa (Subtle) → #f3e9fd (Purple Tint) → #8a8a8a (Subtle ink) → #595959 (Muted) → #1a1a1a (Body) → #000000 (Ink).
Surface & Borders
- Surface (
#ffffff): Default card surface on light. - Surface Soft (
#f3e9fd): Lavender card surface for soft callouts. - Surface Purple (
#8d0de3): Immersive purple card / panel. - Border (
#000000): Full-weight ink hairline — used on certain outline buttons and emphatic dividers. - Border Soft (
rgba(0, 0, 0, 0.10)): Default 1px hairline divider on light. - Border Purple (
#8d0de3): Purple outline for the ghost CTA and focused inputs. - Border On-Purple (
rgba(255, 255, 255, 0.30)): Hairline divider and ghost-button stroke on purple panels.
Shadow Colors
Shadows are purple-tinted black (rgba(17, 0, 33, …)) rather than neutral black, so elevation stays in the brand’s chromatic family on the light canvas. Opacity runs low (0.06–0.20) — Nubank’s depth is gentle and paper-soft, never dramatic.
Semantic
- Success (
#2db84f): Confirmation green — transfers complete, account verified. - Warning (
#f5a623): Caution amber. - Danger (
#e02d2d): Error red — failed payment, validation error. - Info (
#8d0de3): Info matches brand purple — the brand colour doubles as the info state.
3. Typography Rules
Font Family
Display: nuSansDisplay — the brand’s custom display sans, a humanist-geometric face with friendly curves, generous apertures, and slightly condensed proportions at large sizes. Used for every headline, drawn large (40–112px) at weight 600 with tight negative tracking. Weights deployed: 500, 600, 700.
Body: nuSansText — the companion text cut of the nuSans superfamily, optimised for on-screen reading at 14–18px with comfortable line-heights. Used for all running body, labels, navigation, and button text. Weights: 400, 500, 600.
Fallback chains: display hands off nuSansDisplay → "nuSansDisplay Fallback" → system-ui → -apple-system → Arial → Helvetica → sans-serif; body hands off nuSansText → "nuSansText Fallback" → system-ui → -apple-system → Arial → Helvetica → sans-serif. The custom ”* Fallback” faces are metric-matched to minimise layout shift before nuSans loads.
Mono: system monospace — ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace. Nubank uses no custom mono; the system stack carries the rare code/reference moment. Weights: 400, 500.
OpenType features: kern always on. The display face relies on its tight default tracking plus negative letter-spacing rather than alternate glyph sets — there is no heavy OpenType styling layer.
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| display-mega | nuSansDisplay | 112 | 600 | 0.90 | -1.4px | Top-of-page hero headline, white on purple |
| display-hero | nuSansDisplay | 80 | 600 | 0.95 | -1.2px | Standard hero headline |
| display-lg | nuSansDisplay | 56 | 600 | 1.02 | -0.9px | Major section opener |
| h1 | nuSansDisplay | 40 | 600 | 1.08 | -0.6px | Page / section H1 |
| h2 | nuSansDisplay | 32 | 600 | 1.15 | -0.4px | Subsection heading |
| h3 | nuSansDisplay | 24 | 600 | 1.25 | -0.2px | Card title / feature heading |
| h4 | nuSansDisplay | 20 | 600 | 1.30 | 0 | Small heading |
| title-sm | nuSansText | 18 | 600 | 1.35 | 0 | List heading, inline title |
| body-lg | nuSansText | 18 | 400 | 1.55 | 0 | Lead paragraph |
| body | nuSansText | 16 | 400 | 1.55 | 0 | Default running body |
| body-strong | nuSansText | 16 | 600 | 1.55 | 0 | Inline emphasis |
| body-sm | nuSansText | 14 | 400 | 1.50 | 0 | Secondary body |
| label | nuSansText | 13 | 500 | 1.40 | 0 | Form labels, chips |
| caption | nuSansText | 12 | 500 | 1.40 | 0.02em | Metadata, fine print |
| eyebrow | nuSansText | 13 | 600 | 1.30 | 0.08em | Section eyebrow — modest uppercase/tracked |
| button | nuSansText | 16 | 600 | 1.20 | 0 | All CTA labels |
| nav-link | nuSansText | 15 | 500 | 1.40 | 0 | Top navigation |
| legal | nuSansText | 12 | 400 | 1.50 | 0 | Footer disclosure |
Principles
- Display weight is 600, not 700: Nubank’s headline voice is confident but warm — semibold, not maximally heavy. The friendliness lives in the weight choice as much as the letterforms.
- Tight negative tracking on display: -0.6px to -1.4px on the large tiers locks the headline into a dense, poster-like block. The bigger the size, the tighter the tracking.
- Sub-1.0 line-height on the mega tier: hero headlines run 0.90–0.95 line-height so multi-line headlines stack into a solid mass.
- Display for headings, Text for everything else: nuSansDisplay stops at h4 (20px); from title-sm down it’s nuSansText. The cut switch is part of the hierarchy.
- Body at 1.55 line-height: generous leading on 16–18px body reinforces the calm, readable, plain-Portuguese register.
- High-contrast ink only: black
#000000on white, white#ffffffon purple. The brand avoids mid-grey body text; muted greys are reserved for captions and metadata. - Eyebrow is gentle, not shouty: 13px weight 600 with 0.08em tracking — present but never an aggressive all-caps mono label.
4. Component Stylings
Buttons
Primary CTA (“Quero ser Nubank”, “Continuar”)
- Background:
#8d0de3(Nu Roxo) - Text:
#ffffff, weight 600, 16px - Padding: 16px / 32px
- Height: 52px
- Radius: pill (9999)
- Hover: bg
#a32ff0, gentle lift (shadow-soft) - Active: bg
#6a0aab - Use case: every primary action on the light canvas
Primary Small
- Same as primary at 12px / 24px padding, 44px height — minimum touch target preserved
- Use case: nav-bar CTA, compact cards
Ghost / Outline (“Login Empresas”, “Saiba mais”)
- Background: transparent
- Text:
#8d0de3, weight 600 - Border: 1px solid
#8d0de3(purple outline) - Padding: 15px / 31px (1px less than primary to compensate for the border)
- Height: 52px
- Radius: pill
- Hover: bg
brand-soft(rgba(141,13,227,0.10)) - Use case: secondary action beside the primary CTA
On-Purple Primary (CTA sitting on a purple panel)
- Background:
#ffffff - Text:
#8d0de3, weight 600 - Same pill geometry, 52px
- Hover: bg shifts to
#f3e9fd - Use case: the CTA inside a full-bleed
#8d0de3hero — logic inverts to white-fill / purple-text
On-Purple Ghost
- Background: transparent
- Text:
#ffffff, weight 600 - Border: 1px solid
rgba(255, 255, 255, 0.30) - Same pill geometry
- Use case: secondary action on a purple panel
Text Button
- Background: transparent
- Text:
#8d0de3, weight 600, underline-on-hover - Use case: tertiary / inline action
Cards
Default Card
- Background:
#ffffff - Border: 1px solid
rgba(0, 0, 0, 0.10) - Radius: 12px
- Padding: 24px
- Shadow: none at rest;
shadow-softon hover - Use case: feature grid on the light canvas
Purple Card (immersive)
- Background:
#8d0de3 - Text:
#ffffffheadline,#ecd9ffbody - Radius: 16px
- Padding: 32px
- Use case: highlighted product card, “o roxo” moment within a light section
Soft Card
- Background:
#f3e9fd(purple tint) - Radius: 12px
- Padding: 24px
- Use case: info callout, benefit list, gentle emphasis without going full-purple
Badges, Tags, Pills
Brand Badge
- Background:
rgba(141, 13, 227, 0.10)(brand-soft) - Text:
#8d0de3, weight 600, 12px - Padding: 4px / 12px
- Radius: pill
- Use case: “Novo”, “Grátis”, category tag
Selector Chip
- Background:
#ffffffat rest,#8d0de3when selected - Text:
#000000at rest,#ffffffwhen selected - Border: 1px solid
rgba(0,0,0,0.10) - Radius: pill
- Use case: filter chips, plan toggles
Inputs / Forms
Text Input
- Background:
#ffffff - Border: 1px solid
rgba(0, 0, 0, 0.10) - Radius: 8px
- Height: 52px
- Padding: 14px / 16px
- Label: 13px weight 500 above the field
- Focus: border
#8d0de32px, ringrgba(141, 13, 227, 0.45)3px - Error: border
#e02d2d, helper text in#e02d2d - Use case: signup form, CPF entry, search
On-Purple Input
- Background:
rgba(255, 255, 255, 0.12) - Border: 1px solid
rgba(255, 255, 255, 0.30) - Text + placeholder: white / lavender-white
- Use case: lead-capture field on a purple hero
Navigation
Top Nav
- Height: 64px
- Background:
#ffffff(transparent over purple heroes, then solid white on scroll) - No bottom border at top of page; gains a
border-softhairline +shadow-ambientonce stuck on scroll - Logo left (Nubank wordmark in
#8d0de3), nav links centre, ghost “Login” + primary “Quero ser Nubank” pill right - Nav link: 15px / 500, colour
#000000; hover: colour shifts to#8d0de3 - Over a purple hero the nav inverts: white wordmark, white links, white-fill primary pill
Footer
- Background:
#3d0764(deepest purple) — closes the page in immersive brand colour - Text:
#fffffffor category headers,#ecd9fffor links - Padding: 64px vertical
- Nubank wordmark + app-store badges, region/language switcher
5. Layout Principles
Spacing System
Base 4px. Scale: 4, 8, 12, 16, 24, 32, 48, 64, 96, 128. Section spacer 96px; hero 128px. The 4px base keeps component padding tight and consistent, while large section gaps (96–128px) deliver the generous, unhurried whitespace that defines the brand’s calm.
Grid & Container
- Page max-width 1280px
- Prose width 720px
- 12-col grid with 24px gutters
- Light sections: content max 1280px, centred, generous side padding
- Purple immersive sections go full-bleed in
#8d0de3; content inside still respects the 1280px container
Whitespace Philosophy
Nubank’s whitespace is deliberate and abundant. Light sections give headlines and body copy room to breathe — the page is never crowded. The visual logic is “let the purple and the type do the work” — minimal ornament, lots of air, a single clear action per section. The whitespace is itself a trust signal: a calm, uncluttered page reads as a calm, trustworthy bank.
Section Cadence
Light section → light section (subtle band) → full-bleed purple immersive panel → light section → deepest-purple footer. The purple panels are the page’s punctuation: every few sections the brand reasserts itself in full saturation, then returns to the calm white register. The cadence is light-dominant with purple as the recurring emphatic beat.
6. Shapes & Radius Scale
| Tier | Value | Use |
|---|---|---|
| None | 0 | Full-bleed panel edges, banner promos |
| Micro | 2 | Status dots, tiny indicators |
| SM | 4 | Small inline tags |
| MD | 8 | Inputs, dropdowns, small buttons |
| LG | 12 | Default cards, soft callouts |
| XL | 16 | Feature cards, purple cards, image containers |
| XXL | 24 | Large hero cards, illustration frames |
| Pill | 9999 | All CTAs, badges, selector chips |
Nubank’s signature radius pairing is 12–16px on cards + full 999px pill on every CTA. The fully-rounded pill is non-negotiable across all button variants and on both light and purple registers — it is one of the brand’s most recognisable geometric tells. Nothing in the system is hard-cornered below the 12px card tier.
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | Flat (canvas #ffffff or panel #8d0de3) | Hero text, body, default sections |
| 1 | Ambient rgba(17,0,33,0.06) 0 1px 2px | Sticky nav post-scroll, resting card hairline |
| 2 | Soft rgba(17,0,33,0.10) 0 4px 12px | Card hover, raised callout |
| 3 | Standard rgba(17,0,33,0.14) 0 8px 24px | Dropdown, popover, floating CTA |
| 4 | Elevated rgba(17,0,33,0.20) 0 24px 48px -8px | Modal dialog, mega-menu |
Shadow Philosophy
Nubank’s elevation is gentle and paper-soft, never dramatic. Shadows are purple-tinted black (rgba(17, 0, 33, …)) rather than neutral grey, so even the depth stays in the brand’s chromatic family on the white canvas. Opacity runs low (0.06–0.20). The brand prefers to communicate hierarchy through colour and whitespace rather than heavy shadow — most cards rest flat with a hairline border and only lift on hover. On purple immersive panels, shadow is largely abandoned in favour of surface-colour layering (#8d0de3 → #6a0aab → #3d0764), since dark-on-dark shadow reads poorly.
8. Interaction & Motion
Easing
- Standard:
cubic-bezier(0.4, 0, 0.2, 1)— most state changes - Emphasized:
cubic-bezier(0.2, 0, 0, 1)— entrances, section reveals - Entrance:
cubic-bezier(0, 0, 0.2, 1)— elements arriving on scroll
Durations
- Fast: 150ms — colour shifts on link/button hover
- Standard: 240ms — most component state changes, card hover lift
- Slow: 320ms — modal entrance, section reveal, purple-panel parallax
Per-Component Recipes
- Button hover: primary fill
#8d0de3→#a32ff0over 150ms; gentleshadow-softlift over 240ms - Ghost hover:
brand-softwash fades in over 150ms - Card hover: lift from flat to
shadow-soft, optional 2px translate-up over 240ms ease-standard - Link hover: colour shift + underline over 150ms
- Section reveal on scroll: opacity 0 → 1 + 16px translate-up over 320ms ease-emphasized, staggered for grids
- Purple panel parallax: background illustration drifts subtly slower than content on scroll
- Nav stick: transparent-over-hero → solid white with hairline + ambient shadow, crossfade over 240ms
Page Transition
Section-by-section scroll reveals are the dominant motion. There are no hard page-swap colour transitions — the light/purple alternation is structural, not animated. Hero illustrations may loop a slow ambient animation.
Reduced Motion
Strictly honoured via prefers-reduced-motion: reduce. Section parallax stops; scroll-reveal becomes instant (no translate, no fade); card lift becomes an instant shadow swap; illustration loops freeze on their first frame. All content remains fully accessible without motion.
9. Accessibility & A11y
Contrast Pairs
#000000ink on#ffffffbg: 21.0:1 — AAA#1a1a1abody on#ffffffbg: 18.1:1 — AAA#595959muted on#ffffffbg: 7.0:1 — AAA#ffffffon#8d0de3brand: 5.7:1 — AA (passes for normal text, AAA for large)#8d0de3brand link on#ffffffbg: 5.7:1 — AA at all sizes#ecd9ffmuted on#8d0de3brand: 3.4:1 — AA large text only; reserve for headings/large copy
The purple #8d0de3 is calibrated to clear AA against both white and black — white text on the purple CTA passes 5.7:1, and the purple link on white passes the same. White-on-purple is the safe default for all panel copy; pale lavender (#ecd9ff) is restricted to large text.
Focus Indicators
3px solid rgba(141, 13, 227, 0.45) ring with 2px offset on every interactive element on light. On purple panels the focus ring switches to a white rgba(255,255,255,0.7) ring for contrast.
ARIA Patterns
- Dialog: modals use
role="dialog",aria-modal="true", focus-trap, Escape to close - Navigation: top nav uses
<nav aria-label>; mega-menu items exposearia-expanded - Forms: inputs paired with
<label>; errors usearia-describedby+aria-invalid="true" - Live region: form-submission status uses
aria-live="polite" - Accordion (FAQ):
aria-expanded+aria-controlson each trigger
Keyboard Nav
Tab order matches visual flow. Pill CTAs and links are native focusable elements. Modals focus-trap and restore focus on close. Accordions toggle on Enter/Space. The mega-menu is fully keyboard-operable with arrow keys within groups.
Screen Reader Hints
- Wordmark:
role="img"witharia-label="Nubank" - Decorative purple illustrations:
aria-hidden="true" - Icon-only buttons: explicit
aria-label(Portuguese-first, e.g.aria-label="Abrir menu") - Language/region switcher announces current selection
Reduced Motion
All animations honour prefers-reduced-motion: reduce; scroll reveals and parallax collapse to static.
10. Responsive Behavior
Breakpoints
| Name | Width | Use |
|---|---|---|
| mobile | <640 | Stacked single-column |
| tablet | 640–1024 | 2-col grid |
| desktop | 1024–1280 | 3-col grid |
| wide | ≥1280 | Full 1280px layout |
Touch Targets
Minimum 44×44px. Primary CTA at 52px, small CTA at 44px (the floor). Nav links and chips padded to ≥44px tap height on mobile.
Collapsing Strategy
- Top nav collapses to a hamburger drawer below 1024px; the primary “Quero ser Nubank” pill stays visible
- display-mega scales 112 → 80 → 56 → 40px (desktop → tablet → large-mobile → mobile)
- display-hero scales 80 → 56 → 40px
- Feature grid 3-col → 2-col → 1-col
- Purple panels stay full-bleed at every breakpoint; padding tightens from 128px → 64px → 48px
- Side-by-side hero (text + illustration) stacks vertically on mobile, text first
Image Behavior
- App/phone mockups at iOS-bezel radius
- Hero illustrations scale down and may crop on mobile; decorative-only assets drop below 640px
loading="lazy"for below-fold media
Container Queries
Feature cards adapt internally: below a narrow card width the icon stacks above the title; at wider widths icon and text align horizontally.
11. Content & Voice
Tone
Warm, plain-spoken, confident, optimistic — and Portuguese-first. Nubank’s voice is the antithesis of bank legalese: short clear sentences, second-person address (“Sua conta”, “Quero ser Nubank”), and an upbeat, human register. The brand sounds like a knowledgeable friend explaining money simply, never a fortress projecting gravitas. Copy is primary in Brazilian Portuguese (with Spanish/English for other markets) and avoids jargon, fees-fine-print theatrics, and intimidation.
Microcopy Patterns
- Button verbs: “Quero ser Nubank” (I want to be Nubank), “Abrir conta” (Open account), “Continuar”, “Saiba mais” (Learn more), “Peça já” (Request now)
- Error message recipe: clear, calm, non-blaming. “Não conseguimos validar seu CPF. Confira os números.” (We couldn’t validate your CPF. Check the numbers.)
- Success confirmation: “Pronto! Sua conta foi criada.” (Done! Your account was created.)
- Reassurance copy: emphasises “sem tarifas” (no fees), “sem anuidade” (no annual fee), “100% pelo app”
Empty States
- No transactions: “Suas movimentações vão aparecer aqui.” (Your activity will show up here.)
- No cards: “Você ainda não tem um cartão. Que tal pedir o seu?” (You don’t have a card yet. How about requesting yours?)
- Empty states are warm and inviting — they nudge toward the next action, never apologise.
CTA Verb Conventions
- Acquisition: “Quero ser Nubank”, “Abrir conta grátis”, “Peça já”
- Sign-in: “Login”, “Entrar”
- Exploration: “Saiba mais”, “Conheça”, “Veja como funciona”
- Confirmation: “Continuar”, “Confirmar”
The brand frequently frames CTAs in the first person (“Quero…” / “I want…”) — putting the desire in the user’s voice rather than commanding them. It is a distinctive, warm conversion device.
12. Dark Mode & Theming
Nubank’s marketing site is light-with-purple-immersion rather than a true dark-mode brand. The default register is the white canvas; the “dark” moments are full-bleed #8d0de3 (and deeper #6a0aab / #3d0764) immersive panels, not a neutral dark theme. There is no separate dark/light toggle on the marketing site — the alternation is structural and intentional.
If extending to a true dark theme (e.g. for an app or a dark-mode marketing variant):
colors-dark:
bg: '#1a0b29' # deep purple-black ground (not neutral black)
bg-elevated: '#2a1240' # +1 surface
surface: '#2a1240'
surface-strong: '#3d0764'
text: '#ffffff'
text-body: '#ecd9ff' # lavender-white body
text-muted: '#b69bd1'
brand: '#a32ff0' # lift the purple brighter — #8d0de3 is slightly dark on a purple-black ground
brand-hover: '#b85cff'
on-brand: '#ffffff'
border: 'rgba(255, 255, 255, 0.14)'
link: '#c98cff'
The key move for true dark mode is lifting the brand purple from #8d0de3 toward #a32ff0 so the CTA reads as active against a purple-black ground, and keeping backgrounds in the purple family (#1a0b29) rather than neutral black — the brand stays chromatic even in the dark.
13. Lineage & Influences
Nubank’s design lineage is the story of a deliberate rejection of Brazilian banking convention fused with Silicon Valley consumer-tech minimalism. When Nubank launched in 2013, incumbent banks (Itaú, Bradesco, Santander Brasil) signalled trust through navy, gold, marble, and seriousness. Nubank inverted every variable at once: a single saturated purple, a credit card with no number on the front, generous whitespace, plain Portuguese, and a product-first posture. The colour itself was the strategy — “o roxo” became a cultural shorthand, and the no-number card became an aspirational object. The brand’s confidence comes from committing absolutely to one colour and one tone, the way the best consumer-tech brands commit to a single identity.
Visually it draws from the flat-design / friendly-fintech wave of the mid-2010s — Monzo’s coral, Revolut’s gradients, and the broader European-neobank movement all share the DNA of bold mono-colour identity, rounded pills, big friendly type, and whitespace-forward layouts. But where Monzo and Revolut lean playful-to-edgy, Nubank stays warm and reassuring — the optimism of a brand serving a market where many users were unbanked or underserved. The custom nuSans superfamily is what most separates it: a humanist-geometric voice that keeps the brand from feeling cold or generic. What Nubank rejects is everything legacy-bank — the navy-and-gold gravitas, the fee-laden fine print, the branch-first physicality — and everything cold-tech (it avoids the developer-grey, terminal-mono aesthetic entirely). The result is a brand that feels like a friendly, well-designed app that happens to be the largest bank in Latin America.
Influences:
- Monzo (monzo.com) — Mono-colour neobank identity, rounded pills, friendly big type
- Revolut (revolut.com) — European neobank movement, bold-colour fintech UI
- Apple (apple.com) — Whitespace-forward, product-first consumer-tech minimalism
- Stripe (stripe.com) — Fintech-design clarity and immersive full-bleed colour sections
- Pentagram (pentagram.com) — Brand-system rigour: single-colour identity applied with total conviction
14. Do’s and Don’ts
Do:
- Use Nu Roxo
#8d0de3as THE brand colour — CTAs, links, heroes, accents all flow from one purple - Pill every CTA at full 999px radius — purple-fill primary, purple-outline ghost
- Invert CTA logic on purple panels: white-fill primary, white-outline ghost
- Set headlines in nuSansDisplay weight 600 with tight negative tracking (-0.6px to -1.4px)
- Use nuSansText for all body, labels, nav, and button text
- Alternate white light sections with full-bleed
#8d0de3immersive panels - Keep ink high-contrast: black
#000000on white, white#ffffffon purple - Use generous whitespace (96–128px section gaps) as a trust signal
- Tint shadows purple (
rgba(17,0,33,…)) so depth stays in the brand family - Frame conversion CTAs in the first person (“Quero ser Nubank”) — warm, plain Portuguese-first
Don’t:
- Don’t introduce a second brand colour — Nubank is one purple; blue/green/teal break the identity
- Don’t use a softer pastel-lavender for the brand —
#8d0de3is saturated and electric, not muted - Don’t hard-corner CTAs — every button is a full pill, never an 8px-radius rectangle
- Don’t use weight 700+ display as the default — 600 is the warm, confident voice
- Don’t set body text in mid-grey — black/near-black on white, white on purple
- Don’t put white-text on a pale-purple fill — the CTA fill must be full
#8d0de3to clear contrast - Don’t lean on heavy drop-shadows — Nubank’s depth is gentle, paper-soft, and purple-tinted
- Don’t use corporate-bank gravitas copy — no navy-and-gold seriousness, no fee fine-print theatrics
- Don’t overuse the pink/yellow accents — they belong in illustration only, never as CTAs
- Don’t centre dense paragraphs — keep prose left-aligned at ~720px for readability
15. Agent Prompt Guide
Quick Color Reference
Brand (Nu Roxo): #8d0de3
Brand Bright: #a32ff0
Brand Deep: #6a0aab
Purple Deepest: #3d0764
Canvas: #ffffff
Purple Tint: #f3e9fd
Ink: #000000
Body: #1a1a1a
On-Purple Ink: #ffffff
On-Purple Muted: #ecd9ff
Border Soft: rgba(0,0,0,0.10)
Accent Pink: #ff4d8b
Example Component Prompts
-
“Create a Nubank hero: full-bleed
#8d0de3purple background, 96px nuSansDisplay headline at weight 600 in pure white#ffffffwith -1.2px tracking and 0.95 line-height — text ‘Somos incansáveis pra você não precisar ser’. Below, an 18px body in#ecd9ff(lavender-white). A white-filled pill CTA (999px radius, 52px height, 16px/32px padding) with#8d0de3purple text at weight 600, labelled ‘Quero ser Nubank’. Beside it, a white-outline ghost pill (1pxrgba(255,255,255,0.30)border, white text) labelled ‘Saiba mais’.” -
“Design a Nubank feature grid on a white
#ffffffcanvas: 3 cards in a row, 24px gap. Each card has white bg, 1pxrgba(0,0,0,0.10)border, 12px radius, 24px padding. Title 24px nuSansDisplay weight 600 in#000000with -0.2px tracking. Body 16px nuSansText weight 400 in#1a1a1aat 1.55 line-height. Top of each card: a purple#8d0de3icon. On hover, the card lifts with a soft purple-tinted shadowrgba(17,0,33,0.10) 0 4px 12px.” -
“Build a Nubank signup form on white: a 52px-tall text input, white bg, 1px
rgba(0,0,0,0.10)border, 8px radius, 14px/16px padding, with a 13px weight-500 label above. On focus, the border turns#8d0de32px with a 3pxrgba(141,13,227,0.45)ring. Below, a full-width purple pill CTA (#8d0de3fill, white text, 999px radius, 52px height) labelled ‘Continuar’.” -
“Compose a Nubank purple immersive card:
#8d0de3background, 16px radius, 32px padding. Headline 32px nuSansDisplay weight 600 in white. Body 16px nuSansText in#ecd9ff. A white-fill pill CTA (#8d0de3text) at the bottom. The card sits inside a white section as the page’s ‘o roxo’ emphasis moment.” -
“Design a Nubank top nav: 64px tall, white
#ffffffbackground, no border at top (gains argba(0,0,0,0.10)hairline + soft shadow on scroll). Nubank wordmark in#8d0de3on the left, nav links centre (15px nuSansText weight 500, black#000000, hover to#8d0de3), and on the right a purple-outline ghost ‘Login’ pill plus a purple-fill ‘Quero ser Nubank’ primary pill.” -
“Create a Nubank pricing/benefit section: alternating white and
#f5f2fabands, left-aligned prose at 720px width. Eyebrow in 13px nuSansText weight 600 tracked 0.08em in#8d0de3. H2 at 32px nuSansDisplay weight 600 in black. Benefit chips: pill-shaped,rgba(141,13,227,0.10)bg,#8d0de3text. Generous 96px vertical spacing between sections.”
Iteration Guide
- Commit to the one purple: every brand colour decision routes through
#8d0de3. If you’ve reached for a second brand colour, you’ve left Nubank — pull it back. - Pill every CTA: full 999px radius, no exceptions. Purple-fill primary, purple-outline ghost on light; white-fill / white-outline on purple panels.
- Alternate the two registers: white light sections punctuated by full-bleed
#8d0de3immersive panels. The rhythm IS the layout. - Headlines in nuSansDisplay 600 with tight tracking: -0.6px to -1.4px, sub-1.0 line-height at hero sizes. Warm-confident, not maximally heavy.
- Keep ink high-contrast: black on white, white on purple — never mid-grey body. Greys are for captions only.
- Tint the shadows purple:
rgba(17,0,33,…)at low opacity, not neutral black. Keep depth in the brand family. - Use whitespace generously: 96–128px section gaps. Calm, uncluttered layout is itself a trust signal.
- Write warm, first-person, Portuguese-first copy: “Quero ser Nubank” not “Sign up now” — put the desire in the user’s voice and drop the bank gravitas.
Drop nubank into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add nubank npx agentkit init --design nubank