Enterprise UXDesign systems2026 — ongoing

Inheriting someone else's product

The brief said reskin. The product was a legacy admin portal from an acquired company, no documentation, no design system, and a stakeholder list that kept growing. What started as a label cleanup is still running.

CAL admin portal — App Access table with Customer Actions, App Actions and User Actions

My role

Sole designer, UX strategy, interaction design, copy, and stakeholder communication

Timeline

2026, Q2 and Q3, still in progress

Team context

Engineering lead, QA, PM, and an inherited engineering team from the acquired company

Tools

Figma, FigJam

The brief said reskin. The product had other ideas.

The starting point was a portal from NokNok Labs, a company OneSpan had just acquired. The brief was clear: replace the UI components and align them with OneSpan's design system. No redesign, no new scope, just a visual cleanup.

The product came with 19 screenshots from the kickoff walkthrough and nothing else. No documentation. Flows had to be reconstructed from the screens alone. It became clear quickly that the scope wasn't what the brief described. The labels were wrong, the patterns were inconsistent, the button conventions didn't match the system, and several dialogs had no equivalent in the OneSpan design language. "Reskin" was where it started, not where it stayed.

Before touching Figma, I rebuilt the flow map. Nineteen screens became a full user journey: sign-in, admin users table, app actions, user actions, permissions, approve users. That document became the shared reference for every conversation with engineering from that point on.

Nobody owned the decisions yet

The stakeholder list was wider than the brief suggested. The engineering lead owned the technical direction. QA flagged usability issues throughout. The PM held the product brief. On top of that, there was a broader inherited engineering team from the acquired company whose conventions were already in the codebase.

The most common problem was that a decision that looked settled would surface again later because a different stakeholder hadn't been in the room. The "App Domain" field got renamed to "Allowed email domains" after QA flagged it. The "Delete user" label got changed to "Remove from app" and then changed back when the engineering lead clarified what the action actually did — which was full account deletion when the last app was removed, not just an app-level change. The button order on destructive dialogs took three iterations before it landed consistently.

None of these were design problems. They were alignment problems that showed up as design problems. The work was mostly about making sure the right people had seen the right decisions before anything went into the codebase.

Pattern by pattern, dialog by dialog

The system that emerged from Q2 wasn't dramatic. The sign-in screens got proper copy: "Sign in" not "Login", "Sign in with Registration Code" as a clearly labelled secondary option, "Send recovery link" instead of a generic submit. The navigation got two sidebar items with icons that made sense: a list icon for "App Access" (renamed from "User List" because every row was a user-app access record, not a user), a user-check for "Approve User".

The dialogs were the main work. Add App, Edit App, Remove App. Create User, Edit User. Assign to App, Show Registration Code, Delete User. Each one went through the same process: draft from what the existing screen implied, check against the design system, check against the actual behaviour, align with whoever had authority over that decision. The Permissions panel was rebuilt entirely, replacing six category dropdowns with a flat checkbox list that could handle dynamic DB values, with Super Admin separated at the top by a divider and a distinct visual state when checked.

The labelled divider pattern introduced in the Permissions panel became a new system component. That's the kind of decision that looks local until it isn't. I flagged it before it was picked up elsewhere.

The scope got wider

Q3 introduced a Customer entity. Apps and domains would no longer be assigned directly, they would be assigned to a Customer, and the Customer would own them. That changed the data model, the navigation, and the actions available in every dialog. A new top-level "Customer Actions" dropdown appeared alongside App Actions and User Actions, with Add, Edit, and Remove Customer dialogs designed from scratch.

The Q2 pattern decisions held. Add Customer disabled Submit until the required field had a value, same as Create User. Edit Customer used Save not Submit, consistent with every other edit dialog. Remove Customer led with the consequence rather than asking "are you sure." Q3 felt like extending what already existed, not starting over.

The project is still in progress. Q3 is not finished. The scope will probably expand again next quarter.

14+

Dialog components designed and handed off across Q2 and Q3, covering the full admin user and app management workflow

5+

Stakeholders across engineering, QA, and PM, managed across two quarters without a single design decision causing an implementation blocker

1

New design system component introduced: the labelled divider pattern, added to the system library for use across other products in the suite

What I'd do differently

Some persona ownership questions took longer to resolve than they needed to because I waited for confirmation before raising them. The right move was to surface that ambiguity at the first stakeholder review, not after. On inherited product work, unresolved ownership always comes back during implementation. The sooner it's named, the cheaper it is.

Batch assignment

Assign to App — partial failure state showing 3 of 5 assigned with specific failure reasons

Assign to App — partial failure state. Three users assigned, two failed with specific reasons (domain not allowed, already Super Admin). Error handling visible at the dialog level without leaving the flow.

Navigation structure

CAL navigation structure — sidebar and top-level action dropdowns

"User List" renamed to "App Access". Three top-level action dropdowns — Customer Actions (Q3 addition), App Actions, User Actions. Sidebar with App Access and Approve User as the two navigation items.

Permissions panel

Create User dialog — flat checkbox permissions list with Super Admin separator

Flat checkbox list replacing six category dropdowns. Super Admin sits above a divider with its own visual state. When checked, roles hide and an amber notice appears.

Super Admin state

Create User — Super Admin checked state with amber notice and roles hidden

Super Admin checked — individual role checkboxes hidden, replaced with "All roles granted. Individual selections are overridden." A distinct visual state that communicates consequence before the user submits.

Destructive dialog

Remove from App dialog — mixed batch state showing permanent deletion warning

Consequence-first warning copy, no "are you sure" phrasing. Destructive button right-aligned, labelled with the action. Cancel on the left, always.

Support team storyboard

OSPN Support Team storyboard — 9 steps from sign-in through export

OSPN Support Team storyboard — 9 steps from sign-in through export. Customer Account Admin flow documented separately in Figma.

Customer Actions (Q3)

Edit Customer dialog from Q3 showing domain chip input

Edit Customer dialog — Q3 entity. Domains use the chip pattern, apps use a scrollable checklist. Patterns consistent with existing dialogs throughout.

Design system addition

Labelled divider component — OneSpan design system library

Labelled divider pattern introduced in the Permissions panel. Added to the OneSpan design system library as a reusable component.

Next case study

Designing against a standard, not a spec