1Empty
No account on file. No status badge, one sentence explaining what this is for, one primary button.


A whole portal built inside an existing system
Inside Edenred’s design system, I built the part specific to the Merchant hub: its components, its screens and all their states. I created the ones that were missing and challenged the ones that existed in other products without quite fitting.
The design system existed before I arrived: the foundations, the tokens, the base components. I didn’t write its rules. I learned to design within them, and to spot the moments they needed extending.
The Edenred merchant portal is where merchants and restaurant owners track their transactions, invoices and points of sale. Every component on this page was designed for that product.
See the Merchant portal project →My test for calling a component finished: someone else can pick it up without coming to ask me a question. That means having built its variants, its states and how it behaves at every screen size.
The two components that carry the management screens: the table carries the data, the banner says what’s happening.
On mobile, I chose to redraw the table rather than shrink it: columns on desktop, stacked cards on mobile.







Five registers for everything a screen needs to signal: information, warning, error, success, neutral. On desktop the banner sits on one line; on mobile, the actions move below.
Signed in and signed out, across four screen widths.

Four widths, from desktop to mobile: I chose to fold everything rather than drop anything.

It is collapsed or expanded on desktop. Its mobile version is longer: it picks up what the header no longer has: help, language, account.
This is what a component looks like when someone else can pick it up without coming to ask me.
The flow I’m showing is short: updating your bank details, five screens.
This screen uses the Header, Menu and Table components shown above.
No account on file. No status badge, one sentence explaining what this is for, one primary button.


I announce the constraints before typing: accepted formats and size.


The IBAN and the file are both invalid. Each has its own message and the button stays inactive.


The bank details are accepted. The user knows where they stand before they even submit.


The request is sent. The status moves from active to "pending update". The change isn’t effective yet, and the screen says so.


I learned more from asking how a component behaves when things go wrong than from drawing it straight away. That question brings out every case nobody had thought of.
Day to day, I add to the design system what it’s missing for the portal. I propose a variant rather than working around the component in my mockup. I also flag the gaps between the documentation and production.