Design System Architecture

Building Scalable Multi-Brand Theming with SVG Design Tokens

How enterprise teams architect white-label and multi-tenant vector iconography: 3-tier design token hierarchies, duotone color slots, and zero re-render runtime brand switching.

TL;DR — The Multi-Brand SVG Playbook

Decouple markup from color values: Never hardcode hex colors in SVGs. Use standard slot tokens (fill="var(--icon-slot-primary, currentColor)" and fill="var(--icon-slot-secondary, rgba(0,0,0,0.2))"). Control entire white-label brands and tenant themes at the CSS root level using [data-brand="partner-a"] attributes, achieving instant multi-brand switching with zero JavaScript DOM mutation.

The Challenge of Multi-Brand Iconography

Modern enterprise platforms frequently power multiple consumer brands from a single unified codebase (e.g. Uber & Uber Eats, DoorDash & Wolt, or white-labeled B2B SaaS portals). When a tenant changes brand identity, rebuilding or maintaining 20 different icon repositories leads to massive asset duplication and version drift.

By treating vector icons as parameterized token consumers, a single SVG asset seamlessly adapts across hundreds of customer themes, dark modes, and high-contrast accessibility palettes.

1. The 3-Tier Design Token Hierarchy

To avoid brittle hardcoding, structure your iconography tokens into three distinct abstraction layers:

/* Tier 1: Global Tokens (Raw Values) */
:root {
  --color-lime-500: #C1DD2D;
  --color-cyan-500: #00C3FF;
  --color-gray-400: #A3A3A3;
}

/* Tier 2: Semantic Tokens (Functional Meaning) */
[data-brand="iconstash-default"] {
  --brand-primary: var(--color-lime-500);
  --brand-accent: var(--color-cyan-500);
}

[data-brand="enterprise-blue"] {
  --brand-primary: #2563EB;
  --brand-accent: #60A5FA;
}

/* Tier 3: Component Slot Tokens (Assigned to SVG Elements) */
.icon-themed {
  --icon-primary: var(--brand-primary);
  --icon-secondary: var(--brand-accent);
  --icon-muted: var(--color-gray-400);
}

2. Standardizing Duotone & Tri-Tone Slot Attributes

Inside your SVG definitions, assign component-level custom properties with safe currentColor fallbacks:

<svg viewBox="0 0 24 24" width="24" height="24" class="icon-themed" aria-hidden="true">
  <!-- Secondary / Background Layer (e.g. 20% opacity accent) -->
  <path 
    d="M12 2L2 7l10 5 10-5-10-5z" 
    fill="var(--icon-secondary, currentColor)" 
    opacity="0.3" 
  />
  
  <!-- Primary Foreground Stroke Layer -->
  <path 
    d="M2 17l10 5 10-5M2 12l10 5 10-5" 
    fill="none" 
    stroke="var(--icon-primary, currentColor)" 
    stroke-width="2" 
    stroke-linecap="round" 
    stroke-linejoin="round" 
  />
</svg>

When this icon is rendered inside a white-label dashboard, changing document.documentElement.setAttribute('data-brand', 'enterprise-blue') immediately recalculates every icon's foreground and duotone fills instantly on the GPU with zero virtual DOM re-renders.

3. Automating Token Sync with Style Dictionary

In mature CI/CD pipelines, design tokens exported from Figma via JSON are transformed into CSS variables using Amazon's Style Dictionary:

// style-dictionary.config.js
module.exports = {
  source: ['tokens/**/*.json'],
  platforms: {
    css: {
      transformGroup: 'css',
      buildPath: 'build/css/',
      files: [{
        destination: 'brand-tokens.css',
        format: 'css/variables',
        options: {
          selector: ':root'
        }
      }]
    }
  }
};

Handling High-Contrast Mode & Accessibility

The Windows High Contrast Mode Override

In Windows Contrast Themes, CSS custom properties are overridden. Ensure your SVG tokens define fallback support using the standard forced-colors: active media query:

@media (forced-colors: active) {
  .icon-themed path {
    stroke: CanvasText !important;
    fill: none !important;
  }
}

Frequently Asked Questions

Do CSS variables work inside external SVG files loaded via <img>?

No. Browsers isolate <img> tags in an external sandbox context where parent CSS variables cannot penetrate. CSS variable theming requires either inline SVGs or SVG sprite sheets referenced via <use href="...">.

How do I prevent flash of unstyled theme colors on initial page load?

Inject a blocking 2-line inline script in your document <head> that reads the user's stored theme/brand token from localStorage and sets the data-brand attribute before the DOM paints.

Ready to Build Multi-Brand Icon Systems?

Search 134,000+ open-source SVG icons across 28 curated libraries on IconStash. Fast, clean, and customizable for every brand.

Search All 134K+ Icons →