Skip to main content
Luc Awater
New Member
Jan 15, 2026 9:59 AM UTC
Question

Feature Request: Hierarchical Mode Dimensions for Variables

Summary

Add support for "global" or "parent" mode dimensions that apply across multiple variable collections. This would allow a theme like light/dark to act as a global setting that affects all other collections (like Surface, Density, or Brand) without needing to manually create every combination.

 

The Problem

Currently, Figma treats each collection's modes as independent and flat. When building a design system that needs both a theme (light/dark) and a surface context (default/prominent/muted), there's no way to express that light/dark should be a global setting that applies across all surface contexts.

 

Current Workaround

We're forced to combine both dimensions into a single collection with combined mode names:

Collection: Surface
Modes:
- default/light
- default/dark
- prominent/light
- prominent/dark
- muted/light
- muted/dark

This leads to:

  • Combinatorial explosion: Adding one surface means adding two modes. Adding one theme means duplicating all surfaces.
  • Maintenance burden: A system with 4 surfaces × 2 themes = 8 modes. Add a third theme (high contrast) and it becomes 12 modes. Add density (compact/comfortable) as another collection with the same problem and complexity multiplies further.
  • Misaligned mental model: Designers think of light/dark as a global switch, not as something to manually pair with every other mode.

 

Proposed Solution

Introduce mode dimensions or hierarchical modes — a way to define certain modes as global settings that overlay other collections.

 

Concept: Global Mode Dimension

Global Dimensions:
Theme: light | dark | high-contrast

Collections:
Surface:
Modes: default | prominent | muted

Density:
Modes: compact | comfortable

When a frame is set to:

  • Theme: dark
  • Surface: prominent
  • Density: compact

All tokens resolve through all three settings simultaneously. The system handles the combinations internally, without requiring designers to create every permutation as an explicit mode.

Where to define values: Tokens would still need values for each combination — that's unavoidable and expected. For example, button/background would have a value for default + light, default + dark, prominent + light, etc. The difference is that these combinations would be defined within the token's value table, not as separate modes cluttering the collection's mode switcher. You'd see a grid or matrix of values rather than a flat list of combined modes.

 

Alternative Concept: Parent/Child Collections

Allow collections to "inherit" or "subscribe to" a parent collection's mode:

Collection: Theme (global: true)
Modes: light | dark

Collection: Surface (inherits: Theme)
Modes: default | prominent | muted

Token: button/background
Values:
default + light: {blue-500}
default + dark: {blue-400}
prominent + light: {white}
prominent + dark: {neutral-100}

The inheritance relationship means Surface always resolves within the context of whatever Theme mode is active on the frame or its ancestors.

 

Benefits

  1. Scales gracefully: Define n + m + o modes instead of n × m × o combinations
  2. Matches mental model: Designers already think of light/dark as a global toggle
  3. Reduces errors: No risk of forgetting to update one combined mode when changing a value
  4. Cleaner organization: Collections stay focused on their specific concern (surface, density, brand) without being polluted by theme variations
  5. Simpler prototyping: "Switch to dark mode" becomes one action affecting the whole prototype, not updating multiple modes across different frames

 

Use Cases

Multi-surface design systems

Design systems with surfaces like default, prominent, muted, elevated, inverse — each needing to work in both light and dark themes.

 

Multi-brand systems

Agencies or companies managing multiple brands that each need light/dark variants. Currently requires: brand-a/light, brand-a/dark, brand-b/light, brand-b/dark, etc.

 

Responsive density

Systems offering compact/comfortable/spacious density modes that should each work across all theme and surface combinations.

 

Accessibility themes

Adding high-contrast or reduced-motion modes that should apply globally without multiplying every existing mode.

 

Current Impact

Many design systems are either:

  1. Avoiding the problem by keeping surfaces minimal (losing expressiveness)
  2. Accepting the maintenance burden of managing many combined modes
  3. Splitting logic unnaturally to keep mode counts down
  4. Using external tools like Tokens Studio to manage the complexity, then syncing to Figma (added friction)

A native solution would significantly improve the variables feature for any team building a non-trivial design system.

 

Summary

The core request: let us define light/dark (or any theme) as a dimension that applies across all other collections, rather than requiring us to manually create every combination as a separate mode. This would make Figma's variables system match how designers actually think about theming.

 

Thank you for considering this! ❤

4 replies

Lucas West-
New Participant
Oct 22, 2026 3:48 AM UTC

Hey, I’m not sure if this was only added after your post, but this is now possible!

Variables can now point to other variables. The application of this in your use case is exactly as you described in parent/child collections, except it is a structure you must build yourself for each variable, instead of applying the relationship to the collection as a whole.

Simply make your Theme collection, and your Surface collection as two different collections. Give your Theme collection a light, dark, and any other theme named variable mode. Give your Surface collection the default, prominent, and muted variable modes, and so on for any other layers you want. Define all of your colors or other variables as primitives either in a third collection, or directly in your Theme collection. Then, think of the other collections as ordered layers following the Theme collection, going from abstract to more context/state specific. You are now able to bind variables to alias variables set in other collections, if that makes any sense, so for each layer you just have your new variables point to the variables in the previous layers accordingly.

Armin_Rouhanian
Active Member
Oct 23, 2026 7:20 PM UTC

Hey there, I’ve the same issue & needed to create light/dark for multiple brand themes. After tweaking and working with Figma variables, I wrote a complete article on how to create a multi-dimensional design system with Figma Pro plan. 

Here you can read this:


Figma Nested Variables: A Practical Approach to Multi-Dimensional Design Systems

P.S: This Feature also exists in Enterprise plan but it is way too expensive for small teams and solo designers (The name of the plan says everything, it is for Enterprise level, not us). So here we are :D 

Sincerely

Armin The Riverman
Lucas West-
New Participant
Oct 31, 2026 9:01 PM UTC

I liked your article, very thorough and straight-forward. For colors, styles also make a good final abstraction layer to serve as the output instead of just another variable collection since styles can pull from variables, but variables cannot pull from styles, enforcing the relationship. Annoyingly enough though, for some unknown reason even though they decided to make styles the end of the tree instead of variables, they choose to show variables above styles in the Libraries tab when setting a color. Having styles in the mix can also be powerful even if it’s restricted to the last step in the pipeline since color styles can be mixes of multiple color variables, which variables cannot do yet.

Armin_Rouhanian
Active Member
Oct 31, 2026 11:25 PM UTC

I see your point! Having styles as the final layer in the tree can definitely be powerful.

Personally, though, I've moved away from using styles for my main semantic tokens. I mainly use them for things like gradient backgrounds and images. So far, I haven't had a strong need to combine colors with alpha values within the same background. Even in UI kits like Material, where alpha is used for hover states, these are treated as separate elements. I found it more practical to follow the same approach in my token structure.

Since gradients and images are less frequently used than regular colors, having them appear after variables in the list actually works well for my workflow. Perhaps this was also part of the reasoning behind Figma's decision to order them that way.

Armin The Riverman