Dorin Gaber
Selected work

Building Tabnine’s Product Design System

Creating a shared component foundation and live Storybook documentation to improve consistency, speed, and handoff across Tabnine’s product surfaces.

  • Design System
  • Storybook
  • Product UI
  • Enterprise SaaS
  • Design Engineering
01Overview

As Tabnine’s enterprise product expanded, UI decisions were being made repeatedly across features — buttons, tables, forms, feedback states, and layout patterns were often solved screen by screen.

I created a product design system that turned those repeated decisions into a shared foundation: tokens, reusable components, interaction states, and live Storybook documentation that design and engineering could use together.

The system was built as part of the product workflow, not as a separate artifact, so it could evolve alongside real features and support new UI patterns as they emerged.

02Challenge

Consistency was getting harder to hold onto.

As more product surfaces were added, consistency became harder to maintain. Similar patterns appeared in different forms, small interaction decisions were repeated across features, and handoff often depended on explaining details that should have been standardized.

The challenge was to create a system that was practical enough for engineering, flexible enough for product work, and clear enough to become a shared reference across teams.

Because the system was ongoing, it also had to stay practical: flexible enough to support new product needs without becoming a static library.

03Goals

What we set out to do.

I framed the work around outcomes that would make the system useful in real product development, not just complete as a library.

  1. 01

    Improve UI consistency

    Give the same UI decisions the same shape wherever they appear across product surfaces.

  2. 02

    Speed up design and engineering handoff

    Shrink the distance between a Figma component and its code equivalent so both sides trust the source of truth.

  3. 03

    Make component usage easier to adopt

    Document components with variants, states, and usage guidance so teams can adopt shared patterns without reinventing them.

  4. 04

    Define component states and variants

    Make hover, focus, disabled, loading, and error states visible and inspectable — not tribal knowledge.

  5. 05

    Align design and engineering around one reference

    Create one visual, interactive, and code-backed reference that design and engineering could both trust.

  6. 06

    Support scalable product development

    Give ongoing product work a stable foundation so pace doesn’t come at the cost of coherence.

04Process

How the system took shape.

The system grew through real product work: auditing repeated patterns, defining foundations, aligning with engineering, and documenting reusable behavior in Storybook.

0104

Audited repeated UI patterns across product surfaces.

Mapped recurring decisions across buttons, forms, tables, feedback states, and layout patterns to identify where the product needed shared standards instead of one-off solutions.

0204

Defined foundations and token roles.

Translated colour, typography, spacing, borders, and state treatments into reusable tokens so components could reference intent rather than isolated values.

0304

Built reusable components with engineering partners.

Worked with engineering to connect Figma components, React implementation, and real product requirements, so the system reflected how components were actually used.

0404

Documented variants, states, and usage in Storybook.

Published components with controls, props, states, variants, and usage guidance so the system could be inspected, tested, and reused beyond static design handoff.

05Design System

What the system covers.

The system brought together four layers: foundations, reusable components, Storybook documentation, and applied product patterns. Together, they created a shared vocabulary for designing and building Admin Console and related product experiences.

The priority was not to document every possible UI element, but to stabilize the components and patterns that repeatedly shaped enterprise workflows: forms, tables, wizards, feedback, and analytics.

Foundations

The foundational layer defines the primitives everything else builds on — what colours mean, how type scales, how space accumulates, and how a component knows it’s disabled or focused.

Colour tokens carry both raw values (primitive palette) and roles (surface, ink, border, accent, status). Typography follows a consistent scale from display to caption, with weights and line-heights tokenised so components can reference intent rather than specific values.

Typography — scale and hierarchy
The typography scale as documented in Storybook — display, heading, body, and caption sizes with their tokens and line-heights.

Component System

The component layer covers the UI building blocks that appear across product surfaces. The system spans simple primitives — buttons, alerts, form controls — and more complex enterprise patterns like advanced tables, bulk-action toolbars, wizards, and charts.

Each component is documented with its variants, states, props, and usage guidance in Storybook.

Button — variants and states
All button variants and states in one view — primary, secondary, tertiary, destructive, and icon-only, each with default, hover, focus, disabled, and loading states.
Alert — variants
Alert variants for info, success, warning, and error — with consistent icon, colour, and layout treatment.
FormSelect
The FormSelect component in Storybook — options list, keyboard behaviour, and validation states documented as controls.
Wizard
The Wizard component — multi-step flow with progress, step navigation, and validation between steps.
Advanced Table
The Advanced Table — sortable columns, selectable rows, pagination, and bulk-actions integration for data-heavy admin surfaces.
BulkActions
The BulkActions toolbar — appears when rows are selected in a table, exposing the actions that can be applied across the selection.
Chart
The Chart component — configurable series, axes, tooltips, and legend treatments for analytics views.

Storybook Documentation

Storybook became the implementation and documentation layer of the system. Core components were documented with variants, states, controls, props, and usage examples, making the system inspectable rather than static.

This helped engineering test component behavior directly and gave designers and reviewers a clearer way to compare states, variants, and props during implementation reviews.

Applied Patterns

The components were organized around product patterns, not only UI categories. Forms combine inputs, validation, and inline feedback. Data-heavy admin surfaces combine Advanced Table with BulkActions. Multi-step configuration flows use Wizard patterns. Analytics views rely on Chart components with tokenized colour and typography.

This pattern-to-component mapping helps new product work start from shared decisions instead of rebuilding common interactions from scratch.

06Key system decisions

The calls that made the system usable.

The work was not only about creating components. It was about deciding how the system should behave, scale, and stay useful inside everyday product work.

01Decision

Use semantic token roles, not only raw values.

We decided

Define colours, type, spacing, and state treatments by role — surface, ink, border, accent, status, disabled, focus — so components could express intent consistently across product surfaces.

Why it worked

Semantic roles made the system easier to apply and evolve than one-off values. Designers and engineers could discuss purpose, not only hex codes or pixel values.

02Decision

Treat Storybook as a shared source of truth.

We decided

Document components in Storybook with variants, states, controls, props, and usage examples — not only as static design references.

Why it worked

Storybook gave engineering and design a live place to inspect behavior, compare states, and reduce ambiguity during implementation review.

03Decision

Document states as first-class behavior.

We decided

Make hover, focus, disabled, loading, error, and validation states visible and reusable across components.

Why it worked

Many UI inconsistencies come from edge states, not default states. Making those states explicit helped teams avoid re-solving them feature by feature.

04Decision

Organize components around product patterns.

We decided

Connect components to the product patterns they support: forms, advanced tables, bulk actions, wizards, analytics, and feedback flows.

Why it worked

This made the system easier to use in real product work. Teams could start from a pattern instead of assembling isolated UI pieces from scratch.

07Impact

What changed.

The impact is qualitative: the system made repeated UI decisions easier to reuse, discuss, and implement across ongoing product work.

Outcomes

  • Improved consistency — helped align colour, spacing, and interaction treatments across surfaces that use the system.
  • Clearer shared language between design and engineering — created a shared reference for components, states, variants, and behavior.
  • Reduced repeated design decisions — teams could start from existing components and patterns instead of re-solving the same UI questions feature by feature.
  • Better documentation for component behavior — variants, states, and props are visible in Storybook instead of living only in handoff notes.
  • Stronger foundation for future product work — new Admin Console and product experiences can build on shared primitives and patterns.