Design tokens, or “tokens” are basic design choices represented
as information. They’re the foundational constructing blocks of design programs.
Because the launch of the second editor’s
draft of the
design token specification in 2022 and the name for device
makers
to begin implementing and offering suggestions, the panorama of design token
instruments has developed quickly. Instruments like code turbines, documentation
programs, and UI design software program are actually higher outfitted to help design
tokens, underscoring their rising significance in fashionable UI structure.
On this article, I will clarify what design tokens are, when they’re helpful and the best way to apply
them successfully. We’ll concentrate on key architectural choices which are typically tough to alter later, together with:
- The way to arrange design tokens in layers to stability scalability, maintainability and developer expertise.
- Whether or not all tokens ought to be made out there to product groups or only a subset.
- The way to automate the distribution strategy of tokens throughout groups.
Position of design tokens
Round 2017, I used to be concerned in a big venture that used the Micro
Frontend
Structure to
scale growth groups. On this setup, completely different groups had been accountable
for various components of the consumer interface, which may very well be even on the identical
web page. Every workforce might deploy its micro-frontend independently.
There have been numerous instances the place elements could be displayed on high of
one another (comparable to dialogs or toasts showing on high of content material areas),
which weren’t a part of the identical micro frontend. Groups used the CSS
property z-index to regulate the stacking order, typically counting on magic
numbers—arbitrary values that weren’t documented or standardized. This strategy
didn’t scale because the venture grew. It led to points that took effort to
repair, as cross-team collaboration was wanted.
The problem was ultimately addressed with design tokens and I believe makes
a superb instance to introduce the idea. The respective token file may
have seemed just like this:
{
"z-index": {
"$sort": "quantity",
"default": {
"$worth": 1
},
"sticky": {
"$worth": 100
},
"navigation": {
"$worth": 200
},
"spinner": {
"$worth": 300
},
"toast": {
"$worth": 400
},
"modal": {
"$worth": 500
}
}
}
The design tokens above signify the set of z-index values that may
be used within the software and the identify provides builders a good suggestion of
the place to make use of them. A token file like this may be built-in into the
designers’ workflow and in addition be used to generate code, in a format that
every workforce requires. For instance, on this case, the token file might need
been used to generate CSS or SCSS variables:
css
:root {
--z-index-default: 1;
--z-index-sticky: 100;
--z-index-navigation: 200;
--z-index-spinner: 300;
--z-index-toast: 400;
--z-index-modal: 500;
}
scss
$z-index-default: 1; $z-index-sticky: 100; $z-index-navigation: 200; $z-index-spinner: 300; $z-index-toast: 400; $z-index-modal: 500;
What are design tokens?
Salesforce initially launched design tokens to streamline design
updates to a number of
platforms.
The Design Tokens Group Group describes design tokens as “a
methodology for expressing design choices in a platform-agnostic manner so
that they are often shared throughout completely different disciplines, instruments, and
applied sciences
Let’s break this down:
- Cross-Disciplinary Collaboration: Design tokens act as a standard language
that aligns designers, builders, product managers, and different disciplines. By
providing a single supply of reality for design choices, they be sure that
everybody concerned within the product life cycle is on the identical web page, resulting in extra
environment friendly workflows. - Software integration: Design tokens may be built-in into numerous design
and growth instruments, together with UI design software program, token editors, translation
instruments (code turbines), and documentation programs. This allows design updates
to be shortly mirrored within the code base and are synchronized throughout groups. - Expertise adaptability: Design tokens may be translated into completely different
applied sciences like CSS, SASS, and JavaScript for the net, and even used on native
platforms like Android and iOS. This flexibility allows design consistency
throughout a wide range of platforms and units.
Establishing a single supply of reality
A key good thing about design tokens is their capability to function a single
supply of reality for each design and engineering groups. This ensures that
a number of services or products keep visible and purposeful
consistency.
A translation
device takes one or
extra design token information as enter and generates platform-specific code as
output. Some translation instruments also can produce documentation for the
design tokens within the type of HTML. On the time of writing, well-liked
translation instruments embrace Model
Dictionary,
Theo, Diez
or Specify App.
Automated design token distribution
On this part, we’ll discover the best way to automate the distribution of
design tokens to product groups.
Let’s assume our aim is to offer groups with up to date, tech-specific
design tokens instantly after a designer makes a change. To attain
this, we will automate the interpretation and distribution course of utilizing a
deployment pipeline for design tokens. Apart from platform-specific code
artifacts (like CSS for the net, XML for Android and so on.), the pipeline may
additionally deploy the documentation for the design tokens.
One essential requirement is protecting design tokens beneath model management.
Fortunately, plugins for well-liked design instruments like Figma already combine
with Git suppliers like GitHub. It is thought-about greatest follow to make use of the
Git repository as the one supply of reality for design tokens—not the
design device itself. Nevertheless, this requires the plugin to help syncing
each methods between the repository and the design device, which not all
plugins do. As of now, Tokens Studio is a plugin that gives this
bidirectional syncing. For detailed steerage on integrating Tokens Studio
with completely different Git suppliers, please confer with their
documentation.
The device allows you to configure a goal department and helps a
trunk-based in addition to a pull-request-based workflow.
As soon as the tokens are beneath model management, we will arrange a deployment
pipeline to construct and deploy the artifacts wanted by the product groups,
which embrace platform-specific supply code and documentation. The supply
code is often packaged as a library and distributed by way of an artifact
registry. This strategy provides product groups management over the improve
cycle. They will undertake up to date kinds by merely updating their
dependencies. These updates can also be utilized not directly via updates of part
libraries that use the token-based kinds.
Determine 2: Automated design token distribution
This general setup has allowed groups at Thoughtworks to roll out
smaller design adjustments throughout a number of front-ends and groups in a single
day.
Absolutely automated pipeline
Essentially the most easy approach to design the pipeline could be a
absolutely automated trunk-based workflow. On this setup, all adjustments
pushed to the principle department will likely be instantly deployed so long as they
move the automated high quality gates.
Such a pipeline may encompass the next jobs:
- Examine: Validate the design token information utilizing a design token validator
or a JSON validator. - Construct: Use a translation device like Model
Dictionary to transform design token information into
platform-specific codecs. This job may also construct the docs utilizing the
translation device or by integrating a devoted documentation device. - Check: This job is very depending on the testing technique. Though
some assessments may be accomplished utilizing the design token file straight (like checking the
shade distinction), a standard strategy is to check the generated code utilizing a
documentation device comparable to Storybook. Storybook has wonderful check
help for visible regression
assessments, accessibility assessments, interplay assessments, and different check sorts. - Publish: Publish up to date tokens to a package deal supervisor (for instance,
npm). The discharge course of and versioning may be absolutely automated with a package deal
publishing device that’s based mostly on Standard
Commits like
semantic-release.
semantic-release additionally permits the deployment of packages to a number of platforms.
The publish job may also deploy documentation for the design tokens. - Notify: Inform groups of the brand new token model by way of e mail or chat, so
that they’ll replace their dependencies.
Determine 3: Absolutely automated deployment pipeline
Pipeline together with handbook approval
Typically absolutely automated high quality gates will not be ample. If a
handbook evaluation is required earlier than publishing, a standard strategy is to
deploy an up to date model of the documentation with the newest design
token to a preview atmosphere (a short lived atmosphere).
If a device like Storybook is used, this preview may include not
solely the design tokens but in addition present them built-in with the
elements used within the software.
An approval course of may be carried out by way of a pull-request workflow.
Or, it may be a handbook approval / deployment step within the pipeline.
Determine 4: Deployment pipeline with handbook approval
Organizing tokens in layers
As mentioned earlier, design tokens signify design choices as information.
Nevertheless, not all choices function on the similar degree of element. As an alternative,
ideally, common design choices information extra particular ones. Organizing
tokens (or design choices) into layers permits designers to make
choices on the proper degree of abstraction, supporting consistency and
scalability.
As an example, making particular person shade selections for each new part isn’t sensible.
As an alternative, it’s extra environment friendly to outline a foundational shade palette after which
determine how and the place these colours are utilized. This strategy reduces the
variety of choices whereas sustaining a constant feel and appear.
There are three key sorts of design choices for which design tokens
are used. They construct on high of each other:
- What design choices can be found to make use of?
- How are these kinds utilized throughout the consumer interface?
- The place precisely are these kinds utilized (wherein elements)?
There are numerous names for these three sorts of tokens (as regular,
naming is the laborious half). On this article, we’ll use the phrases proposed
by Samantha
Gordashko:
possibility tokens, determination tokens and part tokens.
Let’s use our shade instance for example how design tokens can
reply the three questions above.
Choice tokens: defining what design choices are offered
Choice tokens (additionally referred to as primitive tokens, base tokens, core
tokens, basis tokens or reference tokens) outline what
kinds can be utilized within the software. They outline issues like shade
palettes, spacing/sizing scales or font households. Not all of them are
essentially used within the software, however they current affordable
choices.
Utilizing our instance, let’s assume we now have a shade palette with 9 shades for every shade,
starting from very gentle to extremely saturated. Beneath, we outline the blue tones and gray tones as option-tokens:
{
"shade": {
"$sort": "shade",
"choices": {
"blue-100": {"$worth": "#e0f2ff"},
"blue-200": {"$worth": "#cae8ff"},
"blue-300": {"$worth": "#b5deff"},
"blue-400": {"$worth": "#96cefd"},
"blue-500": {"$worth": "#78bbfa"},
"blue-600": {"$worth": "#59a7f6"},
"blue-700": {"$worth": "#3892f3"},
"blue-800": {"$worth": "#147af3"},
"blue-900": {"$worth": "#0265dc"},
"grey-100": {"$worth": "#f8f8f8"},
"grey-200": {"$worth": "#e6e6e6"},
"grey-300": {"$worth": "#d5d5d5"},
"grey-400": {"$worth": "#b1b1b1"},
"grey-500": {"$worth": "#909090"},
"grey-600": {"$worth": "#6d6d6d"},
"grey-700": {"$worth": "#464646"},
"grey-800": {"$worth": "#222222"},
"grey-900": {"$worth": "#000000"},
"white": {"$worth": "#ffffff"}
}
}
}
Though it’s extremely helpful to have affordable choices, possibility tokens fall brief
of being ample for guiding builders on how and the place to use them.
Determination tokens: defining how kinds are utilized
Determination tokens (additionally referred to as semantic tokens or system tokens)
specify how these fashion choices ought to be utilized contextually throughout
the UI.
Within the context of our shade instance, they may embrace choices like the next:
- grey-100 is used as a floor shade.
- grey-200 is used for the background of disabled components.
- grey-400 is used for the textual content of disabled components.
- grey-900 is used as a default shade for textual content.
- blue-900 is used as an accent shade.
- white is used for textual content on accent shade backgrounds.
The corresponding determination token file would appear like this:
{
"shade": {
"$sort": "shade",
"choices": {
"floor": {
"$worth": "{shade.choices.grey-100}",
"description": "Used as a floor shade."
},
"background-disabled": {
"$worth": "{shade.choices.grey-200}",
"description":"Used for the background of disabled components."
},
"text-disabled": {
"$worth": "{shade.choices.grey-400}",
"description": "Used for the textual content of disabled components."
},
"textual content": {
"$worth": "{shade.choices.grey-900}",
"description": "Used as default textual content shade."
},
"accent": {
"$worth": "{shade.choices.blue-900}",
"description": "Used as an accent shade."
},
"text-on-accent": {
"$worth": "{shade.choices.white}",
"description": "Used for textual content on accent shade backgrounds."
}
}
}
}
As a developer, I might principally have an interest within the choices, not the
choices. For instance, shade tokens usually include a protracted record of choices (a
shade palette), whereas only a few of these choices are literally utilized in
the applying. The tokens which are really related when deciding which
kinds to use, could be often the choice tokens.
Determination tokens use
references to the
possibility tokens. I consider organizing tokens this fashion as a layered
structure. In different articles, I’ve typically seen the time period tier being
used, however I believe layer is the higher phrase, as there isn’t a bodily
separation implied. The diagram beneath visualizes the 2 layers we talked
about up to now:
Determine 5: 2-layer sample
Part tokens: defining the place kinds are utilized
Part tokens (or component-specific tokens) map the determination
tokens to particular components of the UI. They present the place kinds are
utilized.
The time period part within the context of design tokens doesn’t at all times
map to the technical time period part. For instance, a button is likely to be
carried out as a UI part in some purposes, whereas different
purposes simply use the button HTML factor as an alternative. Part
tokens may very well be utilized in each instances.
Part tokens may be organised in a group referencing a number of determination tokens. In our instance, this references
may embrace text- and background-colors for various variants of the button (main, secondary) in addition to disabled buttons.
They may additionally embrace references to tokens of different sorts (spacing/sizing, borders and so on.) which I will omit within the
following instance:
{
"button": {
"main": {
"background": {
"$worth": "{shade.choices.accent}"
},
"textual content": {
"$worth": "{shade.choices.text-on-accent}"
}
},
"secondary": {
"background": {
"$worth": "{shade.choices.floor}"
},
"textual content": {
"$worth": "{shade.choices.textual content}"
}
},
"background-disabled": {
"$worth": "{shade.choices.background-disabled}"
},
"text-disabled": {
"$worth": "{shade.choices.text-disabled}"
}
}
}
To a point, part tokens are merely the results of making use of
choices to particular elements. Nevertheless, as this
instance reveals, this course of isn’t at all times easy—particularly for
builders with out design expertise. Whereas determination tokens can provide a
common sense of which kinds to make use of in a given context, part tokens
present extra readability.
Determine 6: 3-layer sample
Be aware: there could also be “snowflake” conditions the place layers are skipped.
For instance, it may not be potential to outline a common determination for
each single part token, or these choices may not have been made
but (for instance in the beginning of a venture).
Token scope
I already talked about that whereas possibility tokens are very useful to
designers, they won’t be related for software builders utilizing the
platform-specific code artifacts. Software builders will usually be
extra within the determination/part tokens.
Though token scope isn’t but included within the design token
spec, some design
programs already separate tokens into personal (additionally referred to as inner) and
public (additionally referred to as international) tokens. For instance, the Salesforce Lightning
Design System launched a flag for every
token. There are
numerous explanation why this may be a good suggestion:
- it guides builders on which tokens to make use of
- fewer choices present a greater developer expertise
- it reduces the file measurement as not all tokens should be included
- personal/inner tokens may be modified or eliminated with out breaking
adjustments
A draw back of creating possibility tokens personal is that builders would rely
on designers to at all times make these kinds out there as determination or part
tokens. This might change into a difficulty in case of restricted availability of the
designers or if not all choices can be found, for instance firstly of
a venture.
Sadly, there isn’t a standardized answer but for implementing
scope for design tokens. So the strategy depends upon the tool-chain of the
venture and can almost certainly want some customized code.
File-based scope
Utilizing Model Dictionary, we will use a
filter to
expose solely public tokens. Essentially the most easy strategy could be to
filter on the file ending. If we use completely different file endings for part,
determination and possibility tokens, we will use a filter on the file path, for
instance, to make the choice tokens layer personal.
Model Dictionary config
const styleDictionary = new StyleDictionary({
"supply": ["color.options.json", "color.decisions.json"],
"platforms": {
"css": {
"transformGroup": "css",
"information": [
{
"destination": "variables.css",
"filter": token => !token.filePath.endsWith('options.json'),
"format": "css/variables"
}
]
}
}
});
The ensuing CSS variables would include
solely these determination tokens, and never the choice tokens.
Generated CSS variables
:root {
--color-decisions-surface: #f8f8f8;
--color-decisions-background-disabled: #e6e6e6;
--color-decisions-text-disabled: #b1b1b1;
--color-decisions-text: #000000;
--color-decisions-accent: #0265dc;
--color-decisions-text-on-accent: #ffffff;
}
A extra versatile strategy
If extra flexibility is required, it is likely to be preferable so as to add a scope
flag to every token and to filter based mostly on this flag:
Model Dictionary config
const styleDictionary = new StyleDictionary({
"supply": ["color.options.json", "color.decisions.json"],
"platforms": {
"css": {
"transformGroup": "css",
"information": [
{
"destination": "variables.css",
"filter": {
"public": true
},
"format": "css/variables"
}
]
}
}
});
If we then add the flag to the choice tokens, the ensuing CSS would
be the identical as above:
Tokens with scope flag
{
"shade": {
"$sort": "shade",
"choices": {
"floor": {
"$worth": "{shade.choices.grey-100}",
"description": "Used as a floor shade.",
"public": true
},
"background-disabled": {
"$worth": "{shade.choices.grey-200}",
"description":"Used for the background of disabled components.",
"public": true
},
"text-disabled": {
"$worth": "{shade.choices.grey-400}",
"description": "Used for the textual content of disabled components.",
"public": true
},
"textual content": {
"$worth": "{shade.choices.grey-900}",
"description": "Used as default textual content shade.",
"public": true
},
"accent": {
"$worth": "{shade.choices.blue-900}",
"description": "Used as an accent shade.",
"public": true
},
"text-on-accent": {
"$worth": "{shade.choices.white}",
"description": "Used for textual content on accent shade backgrounds.",
"public": true
}
}
}
}
Generated CSS variables
:root {
--color-decisions-surface: #f8f8f8;
--color-decisions-background-disabled: #e6e6e6;
--color-decisions-text-disabled: #b1b1b1;
--color-decisions-text: #000000;
--color-decisions-accent: #0265dc;
--color-decisions-text-on-accent: #ffffff;
}
Such flags can now even be set via the Figma
UI
(if utilizing Figma variables as a supply of reality for design tokens). It’s
out there as
hiddenFromPublishing
flag by way of the Plugins API.
Ought to I exploit design tokens?
Design tokens provide vital advantages for contemporary UI structure,
however they is probably not the suitable match for each venture.
Advantages embrace:
- Improved lead time for design adjustments
- Constant design language and UI structure throughout platforms and
applied sciences - Design tokens being comparatively light-weight from an implementation level of
view
Drawbacks embrace:
- Preliminary effort for automation
- Designers might need to (to some extent) work together with Git
- Standardization continues to be in progress
Take into account the next when deciding whether or not to undertake design
tokens:
When to make use of design tokens
- Multi-Platform or Multi-Software Environments: When working throughout
a number of platforms (net, iOS, Android…) or sustaining a number of purposes or
frontends, design tokens guarantee a constant design language throughout all of
them. - Frequent Design Adjustments: For environments with common design
updates, design tokens present a structured approach to handle and propagate adjustments
effectively. - Giant Groups: For groups with many designers and builders, design
tokens facilitate collaboration. - Automated Workflows: In the event you’re conversant in CI/CD pipelines, the
effort so as to add a design token pipeline is comparatively low. There are additionally
business choices.
When design tokens may not be needed
- Small initiatives: For smaller initiatives with restricted scope and minimal
design complexity, the overhead of managing design tokens may not be definitely worth the
effort. - No problem with design adjustments: If the velocity of design adjustments,
consistency and collaboration between design and engineering will not be a difficulty,
then you may also not want design tokens.
