Overview
We were two designers responsible for three operational products. Each one had its own development team, its own users and its own context: some screens are used on a phone in the field, others on a large screen in a control room.
Over time, every product had grown its own buttons, inputs, colors and patterns. Our job was to bring them under one roof: a single design system that all three teams could build from, while each product kept its own identity.
The products are confidential, so the names and content on this page are neutral stand-ins. The interactive examples are rebuilt from the real design tokens and component structure.
The challenge
Three products, three teams and two platforms meant the same question was being answered again and again: what does a primary button look like here, how does an input show an error, which gray is the secondary text?
- Different contexts. Two products are dark, mobile-first and used on the move. The third is a light web system for managing data in large tables.
- Different teams. Each development team kept its own version of the UI, so a fix in one product never reached the others.
- One family. Users move between the products, so they had to feel like one family: same patterns, same behavior, same language.
The goal: design a component once, and let it adapt to every product, platform and theme without being redrawn.
One core, three themes
The heart of the system is a three-layer token structure in Figma variables. Components never use raw colors. They point to semantic tokens, and each product maps those tokens to its own palette.
1. Primitives
Shared color palettes with ten steps each, plus alert colors for error, success and warning. These are the raw ingredients.
2. Semantic tokens per product
The same token names in every product, with different values. A component asks for "Brand / Primary" and gets the right color for wherever it lives.
Brand/PrimaryBrand/SecondaryBackground/MainBackground/SecondaryText/MainBrand/PrimaryBrand/SecondaryBackground/MainBackground/SecondaryText/MainBrand/PrimaryBrand/SecondaryBackground/MainBackground/SecondaryText/Main3. Components and platform modes
Components consume semantic tokens only. A separate text collection has Web and Mobile modes, so the same component switches its type scale by platform.
| Token | Web | Mobile |
|---|---|---|
Font/Size/3XL | 24 | 20 |
Font/Size/2XL | 20 | 18 |
Font/Size/L | 16 | 14 |
Font/Size/M | 14 | 12 |
Font/Size/S | 12 | 10 |
Because of this structure, adding a new product, or a new theme, means mapping one set of semantic tokens. No component has to be touched.
Foundations
Under the components sit the foundations every product shares: color with dark mode and contrast checks, typography, iconography in five sizes, elevation and blur.
Typography
All three products use Heebo, chosen for its clear Hebrew and Latin letterforms and its readable figures. The products are right-to-left, so every component was built and tested for RTL first.
| Style | Mobile | Web | Weight |
|---|---|---|---|
| Large title | 20 | 24 | Bold |
| Medium title | 18 | 20 | Bold |
| Small title | 16 | 16 | Bold |
| Body and buttons | 14 | 14 | Regular, Medium |
| Caption and tags | 12 | 12 | Regular |
Color and contrast
Every text color was checked against its background, with contrast ratios documented next to each swatch. Alert colors are shared across products so status always means the same thing.
Light, Product C
| Off | On | Mixed | Disabled | |
|---|---|---|---|---|
| Checkbox | ||||
| Radio | – | |||
| Toggle | – |
Dark, Product A
| Off | On | Mixed | Disabled | |
|---|---|---|---|---|
| Checkbox | ||||
| Radio | – | |||
| Toggle | – |
Light, Product C
Side: the element lifts, offset grows
Front: the element floats, blur grows
Values are offset / blur in px, black at 25% opacity.
Dark, Product A
Side: the element lifts, offset grows
Front: the element floats, blur grows
Values are offset / blur in px. On dark surfaces the shadow turns into a soft white glow at 18%, so depth still reads.
Working with developers
A design system only works if the people building the products use it. Being only two designers for three teams, we had to make the library easy to find, easy to read and easy to trust.
Foundations
- Colors and dark mode
- Typography
- Icons
- Shadow and blur
- Logos
Components
- Buttons and button groups
- Inputs and fields
- Dropdowns and toggles
- Badges, tags, tooltips
- Pop-ups and bottom sheets
Patterns
- Dashboards
- Tables
- Map cards
- Navigation and menus
- Search and filters
Platform
- Status bars
- Android navigation
- Keyboards
- Loaders and progress
- One library, one source of truth. All three teams worked from the same file, organized from foundations to components to patterns.
- Names that match the code. Token and property names were written so developers could map them directly to their own variables and props.
- Shared documentation. Usage rules and specs were shared across the development teams, so a decision made with one team reached the other two.
- Two designers, one voice. We split ownership by component, reviewed each other's work and agreed on rules before building, so the library stayed consistent.
Outcome
The three products now share one design language, while each keeps its own theme. Development became easier: teams build from ready components instead of recreating them, and documentation is shared between them instead of living in three places.
What I learned
- Structure beats screens. The token layers did more for consistency than any single screen we designed.
- Start from the hardest case. Designing a component for its most demanding scenario first made the simple cases come for free.
- A system is a service. Documentation and conversations with developers mattered as much as the components themselves.