Design Systems / Design Tokens / DX

3M Global Design System

6+ teams · 12+ products · 6 brands

Design tokens for Angular, React and .NET teams that wouldn't adopt a component library.

3M's apps ran on Angular, React and .NET across separate vendors, and no one would adopt a component library. Tokens were shipped instead: a Figma-to-npm pipeline that publishes CSS, SCSS, TypeScript, C# and XAML, guarded by a contract check, plus an agent manifest and MCP server so AI assistants build on-brand. At least 6 teams adopted it across 12+ products, and concept to validated flow went from 3 weeks to 1 afternoon.

Role
Design System Architect
Team
The Figma libraries, the token pipeline and the reference implementations were owned by the design system architect. SIBG, Corporate R&D and third-party vendor engineering teams consumed them.
Timeline
Multi-year
Tools
Figma Variables, Figma REST API, Style Dictionary, TypeScript, Node.js, GitHub Actions, GitHub Packages (npm), Angular Material, MUI, Material.Blazor, Nx, Storybook

Three frontend stacks, no shared code and no authority to choose one.

3M’s software portfolio grew through acquisitions over several decades. The codebases stayed separate, and third-party vendor teams maintained them under different tooling and contract scopes.

24 collaborators across 11 departments in SIBG, Corporate IT and Scott Fire & Safety were audited. Production applications ran on three main frontend frameworks: Angular (Material v16), React (Material UI v7 and Base UI) and .NET.

Map of the 3M Figma libraries: Corporate Foundation v1.2, Icons v1.8 and Semantic Token Variables beta 1.6, with SIBG Jumbo Components v1.0 and the File Tool Kit
Figure 1.0. The Figma libraries during the audit. Corporate owned Foundation (v1.2) and Icons (v1.8). The SIBG Jumbo Components library was marked In Design at v1.0.

No centralized code existed, so engineers approximated Figma designs by restyling third-party UI kits such as Bootstrap, Kendo and Material. That produced visual differences between the design file and the shipped screen, accessibility defects that each team fixed on its own, and long design reviews to catch both.

The design team was small and had no corporate authority to require a tool from contract teams. A single proprietary component library could not succeed under those conditions.

Teams adopted tokens that no one was required to use.

At least 6 teams across the organization used the packages, in 12+ products they were maintaining. Design values now reach code from Figma automatically, instead of being copied by hand. Features could also be built at higher fidelity and tested for edge cases before refinement sessions, so gaps were found earlier and at lower effort.

6+ teams
Using the packages across the organization, in 12+ products
30+
Components documented for agents and engineers, and still growing
6 brands
Supported from one token set, with 54 brand, color mode and device combinations (6 × 3 × 3)
3 weeks → 1 afternoon
Concept to validated flow, including variants, edge cases and translated strings
1–2 days → < 60s
Time for an icon to reach code, after the icon pipeline replaced manual handoffs. See the icon case study
AreaBeforeAfter
Design values in codeCopied by hand from Figma frames and approximated with restyled UI kits.Published to npm as CSS, SCSS, TypeScript, C# and XAML on every push.
Shared code across stacksNone across Angular, React and .NET.One token set consumed by 6+ teams.
Design to validated flow3 weeks.1 afternoon.
Icon delivery1 to 2 days, through direct messages.Under 60 seconds, from the npm package and catalog.
Table 1. Team and product counts are estimates. The component count reflects the system at the time of departure.

The first plan: one Corporate foundation that every brand inherits.

These are working artifacts from before any code existed. Each one settles a single question.

Where the files live

Corporate kept colors, sizing and spacing, and web typography in three separate Figma files. SIBG kept a SharePoint design guide, a JUMBO component file and a JUMBO icon file. The first strategy diagram merges the three Corporate files into one Foundation file that SIBG’s component library inherits from.

Current state and future state diagrams of the 3M Center of Excellence and SIBG Figma files
Figure 2.0. Current state (left) and proposed state (right).

How tokens layer

The first token model was a chain of JSON files. A 3M palette fed one file per brand, which fed light and dark files, which fed a component file.

Early token architecture: 3M JUMBO.json feeds SIBG.json and AAD.json, then light.json and dark.json, then component.json
Figure 2.1. The chain of files. Each layer aliases the one before it.

How dark mode behaves

The chain did not say which values change between light and dark and which stay fixed. The next diagram pairs each text token with the surface it sits on. Dynamic tokens change with the mode. Static tokens, such as white text on a brand-40 fill, do not. The shipped tokens keep that split as a -fixed-dark suffix.

Brand files for SIBG, AAD, Consumer and Wire, each in light and dark, and dynamic versus static text tokens
Figure 2.2. One file per brand and mode (left). Dynamic and static text tokens (right).

What sits above what

The value hierarchy puts brand, theme and device above components, and component states and sizes below. The open “Sizing?” note beside Standard and Compact became the device collection you will see later.

Value hierarchy: variables for brand, theme and device, then components, then properties and variants such as state and size
Figure 2.3. The value hierarchy as sticky notes.

How it reaches engineers

The architecture sketch uses a kitchen analogy. Corporate is the store, the 3M design system is the basket, SIBG adds a cutting board to prepare JUMBO, and an application such as RepairStack is the finished dish. The buildout map shows the same flow as software: Figma tokens feed a Theme Configurator, which configures the Material libraries that applications customize.

System architecture drawn as a grocery store: 3M CoE foundation and colors feed the mmm Design System, which SIBG combines with its own components to produce JUMBO and the RepairStack application
Figure 2.4. The layers as a kitchen analogy.
Buildout map: Figma foundation and style tokens feed a Theme Configurator, which feeds React, Angular and Material.Blazor component libraries and the applications built on them
Figure 2.5. Buildout map.

Five decisions that shaped the system.

Decision 1: Ship tokens and recipes, not a component library

Interviews with engineering leads changed the plan. Teams rejected pre-built components because custom state management, accessibility requirements and framework version differences made them hard to integrate. Engineers asked for component-level tokens and styling values they could apply to their own components. The design team also lacked the headcount to build, test and maintain separate libraries for React, Angular, .NET and HTML.

Decision 2: Split tokens into collections and switch them with modes

The shipped model has four Figma variable collections. Foundation, a separate library file, holds literal values. Brand points each brand at a hue ramp, a typeface and corner radii. Color Mode has 87 role-based variables with Light, Dark and High Contrast modes. Device has 93 sizing variables with Desktop, Tablet and Mobile modes. A switch in one collection changes only the values that depend on it.

Decision 3: Fail the build when Figma’s structure changes

Designers edit variables at any time, and the build finds modes by collection and mode name. A renamed mode would otherwise publish a package that silently lacks a device or a theme. The contract check (npm run contract:check) calls /v1/files/:key/variables/local and fails if the payload is missing collections or has zero variables. It also fails if the desktop or mobile device mode, or the light or dark color mode, is missing. A missing brand mode logs a warning. Fetch and build run only after the check passes.

Decision 4: Build on the Material libraries teams already used

The JUMBO monorepo (Nx with npm workspaces) turns Figma tokens into a framework-neutral core, then into three adapters: @3m-cloud/jumbo-mui returns an MUI v7 theme, @3m-cloud/jumbo-angular generates SCSS for Angular Material, and Jumbo.MaterialBlazor wraps Material.Blazor v5.

The design system constitution gives engineers three ways in and requires none of them: clone a model-home repository, copy a component or theme into an existing project, or build from the Theme Configurator’s HTML and CSS output and the Figma files. Design owns the Figma libraries and the configurator. Engineering sends pull requests to the model homes, so the system works like an internal open source project.

Decision 5: Contribute pull requests instead of handing off specifications

A new monorepo was joined that was rebuilding several acquired applications into one Angular codebase. Instead of specifications being written for the other engineers, custom HTML placeholder components were replaced with production components built on Angular Material, the token packages were installed to drive the Angular Material styling layer, and the tokenized components were used in live application features next to the core engineering team.

Built for agents: MANIFEST.md, llms.txt and an MCP server.

Engineers on these teams used AI coding assistants, and an assistant with no token source guesses values. In the Angular monorepo, a machine-readable component manifest (manifest.md) was added that lists token names, component parameters and layout rules. Developers wrote custom agent skills that point at it, so their assistants read token variables from the npm packages and produced brand-compliant layouts without styling errors.

The JUMBO repository extends the idea with generated files that no one edits by hand:

  • MANIFEST.md and llms.txt as entry points.
  • components.json, which covers 30 components with per-framework imports, props with allowed values, the tokens each one uses, do and don’t guidance and copy-paste recipes.
  • tokens.json, with every resolved token set (6 brands, 2 themes and 3 devices).
  • A 9-section DESIGN.md contract for each brand.
  • An MCP server that serves the same data, and three agent skills for consuming the system, auditing a design against it and keeping the manifest current.

An assistant that asks for the primary action color gets a structured answer that follows the same aliases traced in the token schema below.

{
  "token": "Background/Brand/Emphasis",
  "modes": { "light": "Brand/60", "dark": "Brand/60", "high-contrast": "Brand/70" },
  "resolved": {
    "SIBG": { "foundation": "mmm-color/blue/60",   "light": "#3373e0", "high-contrast": "#1751c2" },
    "AAD":  { "foundation": "mmm-color/purple/60", "light": "#9456d9", "high-contrast": "#7634bc" },
    "PSD: Scott": { "foundation": "mmm-color/red/60", "light": "#eb0029", "high-contrast": "#b7001c" }
  }
}

Two rules lead the consumption guide. Never hardcode a color, radius or size, and resolve each from a token. Match the brand’s look and feel, not only its values. The manifest is regenerated whenever the Figma tokens change, so the agent’s source of truth moves with the design.

What the system is for.

These are the statements that were returned to while each decision was made. They come from the constitution and from the prioritization notes.

Show the notes
  • Maximally configurable, minimally restrictive.

    Constitution, section 1
  • Accelerate product development and eliminate redundant work across the organization.

    Constitution, section 1
  • If a dev can’t do what they need to do, they’ll get it done anyway.

    Prioritization notes
  • Keep the foundation unopinionated. More guidance than enforcement.

    Prioritization notes
  • Let each design system create its own rules.

    Prioritization notes
  • A foundational toolset, not a rigid set of constraints.

    Constitution, section 1
  • Design owns the Figma libraries. Engineering can send pull requests to the model homes.

    Constitution, section 5
  • It might be better to have a sizing strategy than to list every size.

    Prioritization notes

Every decision above follows from the second and third notes. If the system slows a team down, the team works around it, so the system has to be the fastest way to a correct screen.

Four tiers, and each one changes for a different reason.

Tap a tier to see what it holds and what makes its values change. Counts are the variable counts in the Foundations and JUMBO Components Figma files.

ComponentSemanticBrandFoundation

Semantic: Color Mode and Device

Names describe a role, such as Background/Brand/Emphasis or Button/height/standard. The value behind a role changes with the selected mode or device.

Size
87 color roles × 3 modes, 93 sizing values × 3 devices
Changes with
Color mode (Light, Dark, High Contrast) and device (Desktop, Tablet, Mobile).
  • Background/Brand/Emphasis
  • Text/On-Color
  • Border/Neutral/Control
  • Button/height/standard
Figure 3.0. Token hierarchy, from literal values at the base to components at the tip.

Following one value from a color ramp to a component.

Each column is a tier. Each line is an alias in Figma. Pick a component, then change the brand, mode or device and watch which nodes change.

These chains are read from the Figma files. For example, in SIBG light mode a button’s fill is Background/Brand/Emphasis, which aliases Brand/60, which aliases mmm-color/blue/60. Switch the brand to AAD and the same button resolves through mmm-color/purple/60. Switch the device to tablet and its height moves from mmm-size/40 to mmm-size/64.

Component
Brand
Mode
Device
Foundation
Brand
Semantic
Component
UI

SIBG, light, desktop: Button · Fill resolves to #3373e0 through 3 tokens.

Figure 4.0. Alias chains read from the Foundations and JUMBO Components files. On small screens each property is a vertical chain.

Sessions, builds and pull requests.

Audit and prioritization

The audit sheet listed each collaborator’s department, familiarity with the system, codebase and UI kit. Of the 24 collaborators across 11 departments, only six recorded a stack: three on Angular (Material), two on React (Material UI v7 or Base UI with Tailwind) and one on .NET.

The prioritization brainstorm produced the notes you saw as post-its, plus a sketch of the documentation site and of who is responsible for what.

Prioritization brainstorm notes on keeping the foundation unopinionated and letting teams set their own rules
Figure 5.0. Prioritization notes (left). Documentation site and responsibilities sketch (right).

The token pipeline

  1. The contract check confirms the collections and modes still exist.
  2. A fetch script reads the variables, resolves aliases and writes one token file per brand, device and color mode.
  3. Style Dictionary compiles each file into CSS custom properties, SCSS variables, JSON with TypeScript declarations, C# constants and WPF XAML dictionaries.
  4. GitHub Actions publishes @3m-cloud/3m-foundation-tokens and @3m-cloud/sibg-jumbo-tokens to the company’s GitHub Packages registry on every push to main, daily at 06:00 UTC and on demand.

Developers get IDE autocomplete and compile-time checks on token names. They no longer open Figma to find a value or convert hex codes to rems by hand.

The components

The component specs on this page are read from the Figma component library through its API. Each button, for instance, is defined for Standard and Compact sizes across idle, focus, hover, pressed, disabled and loading states, on neutral and on brand-colored backgrounds, with a row per brand.

Button page from the JUMBO Components Figma library showing size and state variants on color, the Save Interaction pattern, Context Flag and the SIBG brand row
Figure 5.1. The Button page in the JUMBO Components library, cropped. The component library and the Figma source are internal to 3M and not publicly accessible.

The pull requests

The Angular monorepo changes were small and visible. The first block is an illustrative example of hand-matching a Figma frame to a stock Angular Material color. The second uses token names and values from the published SIBG package.

// Before: values copied from a Figma frame
.save-button {
  background: #3f51b5;
  color: #fff;
  height: 36px;
  border-radius: 4px;
}
// After: values from @3m-cloud/sibg-jumbo-tokens
@use "@3m-cloud/sibg-jumbo-tokens/dist/sibg/desktop/light/scss/variables" as t;

.save-button {
  background: t.$bg-brand-emphasis;          // #3373e0
  color: t.$text-on-color;                   // #ffffff
  height: t.$button-height-standard * 1px;   // 40
  border-radius: t.$button-radius * 1px;     // 2
}

Results

External development teams installed the packages without a mandate: at least 6 teams, in 12+ products. Code completion reduced their ticket delivery time. Rework was not eliminated, but iteration was accelerated: features could be built at higher fidelity and edge cases tested before a flow reached a refinement session, so usability and functionality gaps were found and addressed earlier in the design process, at lower effort. The Foundation holds 389 variables (297 colors, 55 dimensions, 25 shadow values and 12 opacities), and the adapters cover three frameworks: Angular Material, MUI and Material.Blazor. One design systems architect supported several framework environments without maintaining parallel component libraries.

Status at departure

StateWork
ShippedThe Figma-to-npm token pipeline for Foundation and Semantic tokens, and the Angular Material integration in the production monorepo.
In progressComponent-level token architecture was being explored. The React and .NET translations existed as architectural guides, and the Blazor adapter wrapped six Material.Blazor components.
EndedActive work stopped when 3M reorganized its engineering teams.

The full Foundation token set.

Everything below is read from the Foundations and JUMBO Components Figma files. Start with the color wall and tap a swatch to see where it goes.

Show the color wall and variable tables
mmm-color/blue/60#3373e0

Brand/60 in SIBG, EMD. Brand/Accent/60 in Neutral. Feeds Background/Brand/Emphasis (Light, Dark) and 3 more semantic tokens. Reaches: button fill, tag fill, toggle rail.

blue
indigo
purple
magenta
red
maroon
orange
amber
yellow
lime
green
aqua
gray

Tap a swatch to see which brand and semantic tokens point at it.

Figure 6.0. Foundation color, brand ramps, shape and size, and space and depth.
Foundation variables table listing hex, lightness, chroma, hue, CSS name and TypeScript name for the maroon and red color ramps
Figure 6.1. The variable visualization page in the Foundation file, cropped to the maroon and red ramps. Each step lists hex, lightness, chroma, hue, a CSS name and a TypeScript name.

One screen, six brands, three modes, three devices.

This screen is built from the Button, Tag, Toggle and Field specs in the component library. Nothing on it has a hard-coded color or size.

Change the brand, mode or device, or press Play tour. Tap any element to trace its token back to the Foundation value. On Tablet the standard button grows to 64 px. On Mobile it is 48 px. PSD: Scott rounds buttons to 4 px, Wireframe uses 0 and SIBG uses 2.

Brand
Mode
Device

Quarterly inspection

Review the findings, then submit to the site manager.

Notify the team
PassedReviewFailed
Tag textTag text3

Tap or click any part of the screen to trace its token. Every color, size and radius on it is read from the Figma variables.

Related notes

Next 3M Enterprise Icon Library 579 icons · npm package and web catalog
Full resolution preview