Designing a clearer banking experience through product thinking and systems
Venus is a business-banking platform: accounts, cards, bill pay, invoicing, and payments in one place. Its dashboard showed everything at once, so nothing stood out. I reorganised it around the three questions people actually open the app to answer: How much do I have? What needs my attention? What can I do next? Getting there meant auditing every number on the screen, cutting the clutter down to a small set of reusable components, and adding motion only where it helps you read the data.
- Role
- Product Designer · Design Engineer
- Timeline
- 5 weeks · 2025
- Scope
- Visual audit · Components · Motion · Build

- colours on the home screen, every one a named token
- 36 → 22
- type sizes on one scale
- 12 → 6
- card shells (now 7 variants of one component)
- 5 → 1
- median time to start a payment
- ~14s → ~5s
The problem
When everything is important, nothing feels important
The dashboard had grown feature by feature. Each addition solved a real problem, but together they turned the home screen into a wall of competing signals.
Every number was on the screen; none of it was ranked. The balance, the thing people open the app to check, carried no more weight than a quick link. Primary actions sat far from the moments you'd reach for them. Status lived in colour alone, and each corner of the screen spoke its own visual language.
So people had to decode the interface before they could act on it.
The design question became:
How do we make the dashboard easier to read without dropping anything people rely on?
Before
This is the screen people opened every morning.
I walked the screen with the three questions customers bring to it, and marked every place where the design got in the way of an answer.
How much do we have?
Where the old screen answered itWhite text inside a gradient greeting banner
The frictionThe biggest number was also the lowest-contrast element on the page
What needs me?
Where the old screen answered itColour dots in a table; a grey footnote under Quick Links
The frictionA failed payment and 27 overdue bills were easy to miss
How do I move money?
Where the old screen answered it“Quick Links”, bottom-right, below the fold on a laptop
The frictionThe most common task took the longest to reach
Visual audit
“It feels messy” doesn't give anyone a brief. A count does.
I pulled every distinct value off the legacy screen onto one board: each colour, type size, button, card treatment, corner radius and status signal. Laid out together, the duplication was hard to argue with: the same decision, made over and over.
Colours
Before36 raw hex values
After22 named tokens
What changed11 greys become one Greyscale ramp; one Primary ramp; success and error only
Type sizes
Before12
After6
What changed12 · 14 · 16 · 18 · 24 · 32, one family (Inter Tight), 2% tracking
Button styles
Before9
After5 variants
What changedPrimary · secondary · accent · ghost · link, all 40px high with a 12px radius
Card shells
Before5
After1
What changed“Card Section” with 7 type variants sharing header, body, divider and footer
Corner radii
Before7 (0–20px)
After4 + pill
What changed12 surfaces and controls · 8 key caps · 6 nav and tooltip · 5 chip
Status signals
BeforeColour only
AfterLabel + colour
What changed“Failed” chip plus a struck-through amount
Component mapping
Every legacy pattern got one owner: a single design component, then a single code component.
I mapped each piece of the old screen to the component that would replace it. Where two legacy patterns did the same job, they merged. The KPI tiles, the accounts table and the Quick Links card all became variants of one “Card Section”. The code components carry the same names as the design, so a designer and an engineer can point at the same thing and call it by the same word.
Greeting banner + total balance
Now one component<BalanceCard>
4 coloured KPI tiles
Now one component<Card> + <CardHeader> + <Stat>
Accounts zebra table
Now one component<ListRow icon>
Quick Links card (5 styles)
Now one component<VdButton variant>
Colour-dot status
Now one component<Chip>
Transactions table
Now one component<Transactions> (semantic <table>)
14-item flat sidebar
Now one component<Nav> · <NavGroup>
Header search box
Now one component<SearchInput>
The component map, running
These are the real components the dashboard below is built from. Each tile shows a component and the code it maps to. Hover the nav to see its shared hover state.
<VdButton variant>5 variants replace 9 legacy styles. One height (40), one radius (12), one label style (14/semibold).<NavGroup> / <NavItem>States: default · active · badge · expandable. Hover pill is shared-layout.Main menu
<Card> + <CardHeader> + <CardDivider>One shell, seven types. Header · body · divider · footer.<ListRow icon>Four leading-icon treatments behind one IconSpec union.<Stat> + <Dot>Label 14/regular grey-500 over value 18/medium.Overdue
Paid
<SplitProgress> · <MiniBars>Data-carrying shapes: utilisation and a 3-month trend.<Chip>Status gets words. Colour is the second signal, never the only one.<SearchInput>Search is the jump-to; ⌘K is advertised in the field itself.Tokens behind the components
The components read only these tokens.
| Token | Value | Usage |
|---|---|---|
--vd-grey-700 | Greyscale/700 · primary text, values | |
--vd-grey-500 | Greyscale/500 · labels, axis, meta | |
--vd-grey-400 | Greyscale/400 · nav, table headers | |
--vd-grey-100 | Greyscale/100 · borders, gridlines | |
--vd-grey-25 | Greyscale/25 · nav rail, inputs | |
--vd-primary-300 | Primary/300 · chart line, trend caps | |
--vd-primary-100 | Primary/100 · accent labels, balance bar | |
--vd-primary-0 | Primary/0 · icon badges, count pills | |
--vd-success-100 | Alerts/Success/100 · money in | |
--vd-error-200 | Alerts/Error/200 · failed chip text |
Motion
Motion here earns its place by making the data easier to read. On a dashboard this dense, every animation has to explain something, or it gets cut.
Each one maps to something true about the number: the balance counts up to its value, the utilisation bar fills from zero, the chart draws left to right. One easing curve runs through all of it, and under reduced-motion every pattern skips to its end state, so the dashboard works the same without it.
Motion tokens
| Token | Value | Usage |
|---|---|---|
--vd-dur-fast | 120ms | Hover, press (scale 0.98) |
--vd-dur-base | 200ms | Menus, tooltips, list rows, month pager |
--vd-dur-slow | 320ms | Card entrance (8px rise + fade) |
--vd-dur-count | 800ms | Balance count-up |
--vd-dur-draw | 900ms | Chart line draw + area reveal |
--vd-stagger | 40 / 60 / 35ms | Actions / cards / rows |
--vd-ease | cubic-bezier(0.16, 1, 0.3, 1) | The one easing curve |
--vd-follow | spring 520 / 42 | Pointer-following: crosshair, nav hover |
Motion lab
Each pattern on its own, running on the real components. Press Replay to watch one again, and scrub the chart with a mouse or the arrow keys.
line 900ms · expo-out · point springLine draws left→right in time order, area reveals behind it, then the point and tooltip land. Hover or use ←/→ to scrub.
800ms · expo-out · tabular figures700ms · main leads sub by 120ms200ms per row · 35ms stagger · 6px travel600ms · grow from baseline · 80ms stagger200ms pop from trigger corner · spring hover pillMain menu
Every pattern uses one curve — cubic-bezier(0.16, 1, 0.3, 1) — and collapses to its end state under prefers-reduced-motion.
The redesign in use
The old screen made you hunt. Every number landed at once, so the three questions the app is really for got buried: how much do I have, what needs me, what can I do next. This is the same account, grouped around those questions and running live.
The refreshed dashboard, running
Scroll through it and hover the balance. Everything you need to answer those three questions is on one screen now, in priority order. No hunting.
Before and after
Before
- Balance sits inside a greeting banner
- Money actions buried in bottom-right Quick Links
- Status shown by a colour dot only
- Bills and invoices as grey footnotes
- 14 flat nav items
- 36 colours, 12 type sizes, 9 buttons
After
- Balance leads the page, with trend, in/out and a scrubbable history
- Send and five quick actions are the first row after the greeting
- “Failed” chip plus a struck-through amount
- Bill pay and invoicing get their own cards with a clear next action
- Nav grouped into Main menu and Workflow
- 22 tokens, 6 sizes, 5 button variants, 1 card shell
- median time from home to starting a payment
- ~14s → ~5s
- where Send now lives (was bottom-right)
- 1st row
- status signals that carry a text label
- 0 → 100%
Reflection
The audit board was the most useful thing I made here. It turned a question of taste into a question of counting, and a count is much easier to agree on. From there, the component map and the build were mostly bookkeeping: every decision the audit removed was one less to make again in design, in code, and in the next feature.
Building the frame 1:1 earned its keep for the same reason. It tests the system where systems usually break. Anything the existing tokens and components couldn't express pointed to a gap, and I fixed the system rather than hard-coding a value.
