system2-cover-en.png

This is the second case study in the Scanat design system series. Part 1 covers the initial 0→1 setup and file architecture; this case focuses on re-governing the system after three years of use and carrying its Tokens and component rules into the existing front-end stack.

Snapshot

Role Design System Architecture · DesignOps · Standards & Governance · AI Agent Collaboration
Project Type Design System Governance & Engineering Handoff
Platform Web · Mobile App · iPad App
Users Internal design, product, and engineering teams
Team I led the governance work end to end, using Figma Agent for audits, batch cleanup, and review
Timeline ~1.5 months for design-system governance, followed by ongoing engineering handoff
My Contribution 1. Reworked Tokens, component properties, and layer naming;
  1. Defined classification and maintenance rules for shared vs. business-specific components;
  2. Redesigned Modal, Sheet, and Panel architecture around shared parent components + business-specific child components;
  3. Added usage documentation and established an ongoing governance workflow;
  4. Built a Token export pipeline, mapped Scanat Tokens to existing BootstrapVueNext components, and documented the result in Storybook / Showcase. | | Current Status | Figma-side governance is complete. 180+ Tokens are now in the export pipeline, while shared components are progressively being mapped to Tokens and documented in Storybook / Showcase. |

<aside>

Storybook · Showcase ↗

</aside>

TL;DR

Three years after the original design system was introduced, product scope had expanded, the Web / App component libraries had grown, and Figma capabilities had changed. Historical patterns began to coexist again across naming, properties, layer structures, and the boundary between shared and business-specific components.

Over ~1.5 months, I re-governed both Web and App libraries: first standardizing foundational Tokens and naming, then auditing real components by category, with particular focus on Modal, Sheet, and Panel patterns where the shell is stable but content varies. I also formalized documentation, Agent review, and future create / update workflows. After the Figma-side cleanup, I extended the system into code by building a Token export pipeline and mapping Scanat Tokens onto the existing BootstrapVueNext stack, with Storybook / Showcase as the shared implementation reference.

1. Problem

Main Issues

After three years of continuous use, the Web / App component libraries had grown and Figma capabilities such as Variables, Properties, and Slots had evolved. Multiple historical patterns began to coexist. The main issues fell into four categories:

system2-01.png

Constraints

The governance work had to happen alongside normal product work, and I was the only person owning it. Rebuilding the library from scratch was not realistic, so the system had to support incremental migration of legacy components while setting stricter rules for everything new.


2. Approach & Decisions

The work progressed through five stages, from Figma-side governance to engineering handoff.

Stage 1: Standardize Foundations and Naming Rules

I first cleaned up foundational Tokens for color, typography, radius, shadow, and spacing, while resolving obvious naming, grouping, and duplication issues. Figma Agent handled scans and batch checks, but decisions about which Tokens to keep and how to group them were based on actual product usage.

From these audits, I defined baseline rules for component names, Properties, Variant Values, and layer naming. The first version intentionally covered only the rules we could define with confidence; new edge cases were added later as they appeared in real components.

system2-03.png

Stage 2: Audit Real Components by Category

I reviewed the Web and App libraries category by category, checking whether classification still made sense, whether Variant / Property patterns were consistent, whether layers were meaningful, and whether legacy structures still fit the current product.

Figma Agent handled scanning, batch renaming, and review. Decisions about whether components should be merged or split, and where the boundary between shared and business-specific components should sit, remained product decisions based on real usage scenarios.

system2-04.png

Stage 3: Redesign Component Hierarchy and Maintenance

I further separated the system into two levels: shared Components reused across multiple product areas, and business-specific Patterns / Components that are stable within a particular workflow. The distinction was based not on visual similarity, but on how each component is reused and who is responsible for maintaining it.

Modal, Sheet, and several Panel patterns required the most restructuring. They shared a similar shell, while their business content varied significantly and often appeared across many product screens. Creating a complete component for every business case produced heavy duplication; keeping only a generic shell made business content difficult to maintain consistently. Over three years, I had tried three approaches:

Approach Pattern Observed Problem
Attempt 1 Create a full component for each business panel Component count kept growing—17 panels in the Web editor alone—and shared structures gradually drifted apart
Attempt 2 Merge similar large components and move variations into internal child components Child-component count increased, while many business-specific elements could not be given clear, stable shared names
Attempt 3 Keep only the shared shell and replace all content through Slots Business content lost a shared source of truth; when the same panel appeared on dozens of screens, updates had to be copied page by page and were easy to miss

system2-02.png

Based on these three attempts, I adopted a layered model of shared parent component + business-specific child component + Slot. The parent maintains the stable shell, the business-specific child owns concrete content, and production UI screens reference that child component. This allows the shell and business content to evolve independently while preserving instance synchronization.

Slots are used only to connect the stable framework with replaceable content; they no longer carry responsibility for maintaining the business content itself.

system2-05-en.png

Stage 4: Documentation and Ongoing Governance

After the cleanup, I added usage guidance for shared components so design and engineering could reference the same rules. I also formalized the workflow for new or modified components: classification → creation → Agent review → documentation.

system2-06.png

Stage 5: Extend the System into Engineering

Once Figma-side governance was complete, I focused on connecting the design system to production code. Engineering already used Vue + Tailwind + BootstrapVueNext and planned to keep that stack, so I did not build a parallel Vue component library. Instead, I mapped Scanat's design rules onto the existing implementation.

The first step was to establish a repeatable Token export pipeline. Using Claude Code, I extracted color, typography, spacing, radius, border, sizing, and shadow values from Figma and exported them to CSS and JSON. More than 180 Tokens are now in this pipeline.

system2-08-new.png

The second step was mapping Tokens to shared components one by one. Claude Code helped inspect component structures and identify which Tokens controlled backgrounds, text, borders, radius, spacing, and states, while existing BootstrapVueNext components were used to render the actual styles.

system2-09.png

A Token file alone was not enough for implementation, so the mapping between components and Tokens became the main deliverable. Storybook / Showcase provides a shared view of Foundations, component styles, and Token mappings for both design and engineering.

<aside> 🔗

View Storybook / Showcase

</aside>

I validated this collaboration model before scaling it. Before the full rollout, I built a working engineering demo with a small set of Tokens and components and reviewed it with engineering. Once the direction was accepted, we agreed on responsibilities:

This model made Token binding noticeably more efficient and also pushed the implementation toward greater consistency. The front-end code had previously passed through four different engineers and accumulated mixed patterns; defining a shared Token mapping helped those patterns gradually converge.


3. Outcome


4. Reflection

  1. A design system does not stay consistent by itself. Products evolve, and Figma evolves with them. Legacy components need periodic reevaluation against the current product and tooling.
  2. Each earlier Modal / Sheet / Panel approach solved one problem while creating another maintenance cost. The final answer was not to force everything into one component, but to maintain stable shells and changing business content at different levels.
  3. Governance needs a process, not just a cleanup. Earlier efforts focused more on making the current library tidy; this time I added standards, documentation, and repeatable create / update steps so governance continues into everyday product work.
  4. Figma Agent is effective for repetitive work, not product judgment. It is useful for audits, batch naming, and property checks, but decisions about component classification, Variant structure, and shared vs. business-specific boundaries still depend on real product usage.
  5. Engineering a design system does not mean rebuilding the component library. Once the existing stack was clear, I focused on Token output, component mapping, and implementation references. For a design system, entering the real production environment matters more than maintaining a separate designer-owned implementation.