Petavue

Making Petavue's Design System Easier to Use

I inherited Petavue's existing design system and rebuilt its foundation so the team could design faster, reuse more confidently, and eventually carry the same system into code.

Role Product Designer
need to capture — one connected visual, not three stitched screenshots: a Figma component panel bleeding into a real Petavue product screen, bleeding into a React prototype in a browser frame. Should read as "Figma → product → code" at a glance, not as a component-library flex.

The System Already Existed

Petavue already had a design system when I joined. It had grown alongside the product and become harder to use: components spread across different Figma files, duplicate or similar components, inconsistent naming, different versions of similar patterns, missing states. Before designing a new screen, we were often solving the same UI decisions again.

need to capture — the actual old Figma setup: the file list or page tree showing components scattered across files, or one messy sheet with duplicate button/input variants sitting next to each other. Callouts directly on the image work better than a paragraph: "Duplicate components," "Different versions," "Missing states," "Hard to find," pointing at the specific offenders.

I Consolidated the Foundation

I pulled commonly used components into a single working library and cleaned up patterns that had accumulated over time — one place to find the component, one place to maintain it, and fewer reasons to recreate it.

need to capture — the single largest image in the case study: a wide, zoomed-out screenshot of the actual consolidated Figma library page, with real category groupings visible (Buttons, Inputs, Dropdowns, Tables, Tabs, Modals, Navigation — whatever's actually in the file). This is the foundation reveal; let it breathe rather than listing every component in text.

Components Became More Complete

A component wasn't complete if we still had to figure out what happened when something went wrong, so I designed common states into the component itself so they could be reused instead of recreated inside every screen.

Default
Hover
Active
Disabled
Loading
Error
Empty
Overflow

Pick one real, state-rich component — a table row, an input, a button — and only show the states that actually exist; swap out any tile above that doesn't apply.

need to capture — the same component, this time inside a real Petavue screen, doing its job.

The System Had to Work With the Product

Once the foundation was cleaned up, it became the starting point for new product work. New screens could be assembled from existing patterns instead of rebuilding UI from scratch.

need to capture — a large, real Petavue screen (Data Hub or a dashboard both work) with small labels pointing at the system components visible in it: Table, Filter, Dropdown, Button, Modal, Empty state. A second contrasting screen (a config screen vs. a reporting screen) helps show the same components serving different contexts, but one strong screen is enough.

Consistency Still Needed Room for the Product

Reuse didn't mean forcing every use case into the same component. When a pattern needed to evolve, I treated the new behavior as part of the system instead of creating another isolated version.

Base component
Reporting use case
Configuration use case
Advanced use case
need to capture — real Petavue screenshots standing in for each node above, the same base component shown different ways it actually got used. Two examples are enough if there aren't four real ones.

The System Changed How I Designed

Once the common UI decisions were already made, I could spend more time on the product problem. New work started with composition instead of reconstruction.

need to capture — a real, shipped feature built with the system already in place: Data Hub, a dashboard, a Sage surface, a Goals screen. Reusing a final screenshot already used in the Enterprise Data Hub or Sage case studies, paired with the component pieces that composed it, would tie the case studies together.

Demos Needed to Move Fast, Without Inventing New UI Each Time

Stakeholders would often bring a short brief and a direction for a demo, sometimes with only a few days' notice. Those screens didn't always match what existed in the product yet, but I built them on top of the current UI to stay consistent, and the component library meant most of the time went into the actual UX, not into rebuilding buttons, tables, and inputs from scratch.

need to capture — a demo Figma screen or two, ideally next to the product screen it was based on, showing how far it diverged while still reading as the same system.

"…conflict resolution, ability to look at sample values to help resolve conflicts, how the plan is presented for drill downs and how the report options are presented in search, all of that is showing well crafted design."

Prasanna Venkatesan, CEO — on a demo built with the system

Handoff Was Practical, Not Just a Figma Link

Once a flow was ready, I posted it where the whole engineering team could see it, not only the people directly building it: a status (Ready for UI review, Ready for Dev), the Figma file and prototype links, a short screen recording of the flow, and the specific stakeholders tagged so they'd respond quickly. Anyone picking up the work later had the same context without asking around.

you have this — the "Guided Experience v1" Slack post: Ready for Dev, Figma + prototype links, screen recording, tagged stakeholders.
you have this — the "Improvements to the Conversational Interface" post: Ready for UI review, same pattern.
40
replies on one handoff thread
8
replies on another

Then I Started Building With It

I started using Claude Code to build interactive React prototypes from the same design foundation. Because the visual rules and components were already defined, I wasn't starting from a blank codebase.

Figma
Claude Code
React
Browser

From Component to Working Interface

Instead of stopping at a polished Figma screen, I could build the interaction and evaluate it in a real interface. This changed what I could prototype and how quickly I could get an idea in front of the team.

Component
Feature
Full screen
Working prototype

This is the section most worth a real screen recording or GIF, since it's specifically about interaction, not a static state. If not yet available, the 4-step static progression above — isolated component → fuller layout → full built screen → browser frame of the working React prototype — works as the placeholder shape.

Figma and Code Started Speaking the Same Language

I used Figma MCP and Claude Code to translate existing designs into React and refine the implementation directly in the browser. The design system gave the code a visual vocabulary to follow. The browser gave me a faster way to test how those decisions behaved in a real interface.

Figma frame
need to capture — a short, real React/JSX snippet, styled like a code block, not the whole file
Rendered result in browser

What Changed

Before

  • Scattered components
  • Duplicate patterns
  • Inconsistent states
  • Repeated UI decisions
  • Figma-only

After

  • Single working library
  • Reusable components
  • Defined states
  • Faster product work
  • Figma + React

Less time rebuilding UI. More time solving the product.

Replace any of these with real numbers where they exist, otherwise leave them out rather than guessing:

components consolidated
designers using the system
product areas using it
screens/features built with it
reduction in duplicate components
turnaround time, before/after
React prototypes built with it

Reflection

I inherited the system, so the first challenge wasn't creating more components. It was deciding what needed to stay, what needed to change, and what the team actually needed.

The biggest shift was seeing the design system as part of the product workflow rather than a separate Figma project. Once the same foundation could support product design, prototypes, and React builds, it became much more useful.