Adaptive Design System Using Figma Variables

Here is my process of creating an adaptive design system using Figma variables to seamlessly handle both light and dark modes. The system prioritizes accessibility, usability, and maintenance efficiency.

Role

UI/UX Designer

Timeline

Q1 2025

Problem Statement

When I joined SmartM2M as the only designer on deck, I faced the enormous challenge of developing a scalable system that would allow me to create and maintain cohesive light and dark themes without duplicating effort, while simultaneously ensuring both themes met strict accessibility standards and preserved our distinctive brand identity.

Research

I start with exploring design systems from big companies like Material, Carbon, Atlassian, or Fluent to learn about their semantic naming style. From that research, semantic color sets can be broken up into 3 main categories that all work together to style all UI elements.


  1. Foregrounds
    Text, icons, and any elements that sit on top of a background.

  2. Backgrounds
    The background color of individual UI elements and whole sections or bodies of content.

  3. Borders
    The stroke or outline color of individual UI elements or lack thereof.

Maintainable semantic names

Naming semantic was the hardest part for me when building a design system. It should be flexible, adaptable, and scalable. Through this project, I found that semantic names are maintainable. Therefore, I breakdown the main categories to help me define styles for our system.

Semantic naming structure

System-wide color styles

In our design system, color styles prioritize simplicity and reusability. Components typically inherit a standard color palette, using broad style definitions like "foreground.primary" instead of overly granular options. I introduce more specific color variations—such as state-specific foreground colors for interactive elements—only when they provide clear, meaningful visual feedback that enhances user experience and interaction clarity.

Specific color styles—Intent or use

The second level of color styles defines intent and usage across key categories.

  1. Interactive styles cover more than just buttons, anticipating future custom interactions with hierarchies like primary, secondary, tertiary, and quaternary—each with detailed states like default, hover, and focus.

  2. Input controls share styling principles, encompassing everything from text fields to toggles, with nuanced selected and unselected states.

  3. System styles handle critical feedback components like alerts and error messages, focusing on informative, success, warning, and error states, with particular emphasis on error states that require user action.


By organizing colors this way, I create a flexible, comprehensive approach that supports consistent design while allowing for future expansion and specific interaction needs.

Setting up semantic names

Picking colors for light mode and dark mode

Saturated colors are easy to convert from a light theme to a dark theme using symmetry. I currently have 10 swatches set up in each palette. If the swatches are divided in half, each half becomes a mirror.

For instance, if a button color is 700 in light theme, it will be 200 in dark theme. If a section message background is 50 in light theme, it will be 900 in dark theme.

Styling a component

Let’s look at how foregrounds, backgrounds, and borders work together to style a component.

Example of styling component

The above example, I have a information variant of a feedback banner. Each category has a “.system.information” sub-category. I am still using foreground.tertiary for the description and icon button. Also, using the foreground.system.information for the tittle and icon. And, using foreground.interactive.default for action button.

Contrast Test

While colors look different in light and dark modes, the contrast ratio remains consistent, meeting WCAG (Web Content Accessibility Guidelines) AA standards (≥4.5:1) for labels. This ensures readability and accessibility regardless of the theme.

Example of the contrast test result using WCAG

Example of light and dark mode using Figma variable

Example of light and dark mode using Figma variable

Lesson Learned

Challenges Overcome

  • Initial complexity in variable architecture required thorough documentation

  • Balancing flexibility with consistency required clear governance rules

  • Transitioning existing designs to the new system required dedicated migration time

Future Improvements

  • Integration with design tokens export to connect directly with development

  • Additional modes for colorblind users

What Worked Well

  • The semantic token approach created clear separation between brand colors and their application

  • Mode switching provided immediate visual feedback during design reviews

  • Variable aliases maintained relationships between colors even when base values changed

Impact & Outcomes

The adaptive design system has been implemented across three product lines, resulting in:

  • 40% faster theme implementation

  • 65% reduction in design inconsistencies

  • 100% WCAG compliance across all products

  • Streamlined developer handoff process

Have an idea?

Let’s talk ↗

LinkedIn

Behance

Dribbble

Medium

Have an idea?

Let’s talk ↗

almirazahra.272@gmail.com

LinkedIn

Behance

Dribbble

Medium

Create a free website with Framer, the website builder loved by startups, designers and agencies.