Tokens customization
Principles
Under the hood, Mozaic SCSS uses the compiled tokens that we provide in the @mozaic-ds/tokens
npm package. This dependency is imported via @mozaic-ds/styles
by default.
Mozaic tokens are based upon the LEROY MERLIN brand guidelines but you can adapt these tokens to fit your brand identity.
It is possible for you to override any value and to add new ones in order to create new patterns or pattern variations.
About tokens
As a reminder, we call tokens a series of JSON files containing mostly color values (among others things).
Those files are transpiled into SCSS, js, ios, and android formats, to be used within multiple platforms and technologies.
Read the following documentations:
1 - Configure Mozaic
Create a mozaic.config.js
file at your project root (if it is not already done). Then define those keys:
By doing that, you tell Mozaic where to look for the source tokens and where to save the compiled ones.
The localTokensExportPath
property is also used in the Mozaic's PostCSS configuration, to tell it where to look for the SCSS tokens.
By doing that, the SCSS will load the customized ones instead of the ones living in the npm package.
2 - Override tokens
To override tokens, you need to use the same directory structure and file names as the ones provided in the @mozaic-ds/tokens
package.
Let's take an example by overriding the primary brand color.
The default primary color swatch is situated in @mozaic-ds/tokens/properties/color/base.json
.
Assuming you have the mozaic.config.js
set up as described in the previous chapter, we need to create a ./src/tokens/properties/color/base.json
file.
You can override any value, Mozaic will take care of deep merging the source tokens with the new values you provided.
For example:
In this example, Mozaic will replace the color.primary-01.100
and set it to #000
(black), but all the other existing values for color.primary-01.xxx
will be kept as defined in the npm package source.
Meaning color.primary-01.100
will be customized to #000
(black), and color.primary-01.200
will still be green.
3 - Compiling tokens
In order to compile tokens, you have two options:
3.1 - The mozaic-tokens-build command
Run the mozaic-tokens-build
command directly:
npx mozaic-tokens-build
Or through a package.json
script for example:
3.2 - Using the js function
If you want to trigger the tokens build inside a node script, you can use the function provided by Mozaic:
const tokensBuild = require('@mozaic-ds/tokens/tokensBuild')tokensBuild()
When triggering either the command or the function, if you override values, you should see something like this logging into the console:
Property Value Collisions:Collision detected at: color.primary-01.100! Original value: #EAF3E2, New value: #000
4 - Create new values
The same way, by declaring new values, you can create new tokens for your use:
{ "color": { "custom": { "100": { "value": "#A0C" }, "200": { "value": "#BBE" }, "300": { "value": "#C1A" }, "400": { "value": "#01E" } } }}
Will generate:
$color-custom-100: #a0c;$color-custom-200: #bbe;$color-custom-300: #c1a;$color-custom-400: #01e;$color: ( custom: ( 100: $color-custom-100; 200: $color-custom-200; 300: $color-custom-300; 400: $color-custom-400;, ),);
You can see that we build variables but also a sass map. The map is useful when we need to loop through values to create multiple variations of a pattern. More informations about that below.
5 - Overriding components tokens
When we create components related tokens, we try as much as possible to loop through the tokens sass map to generate classes instead of manually creating each variation of the component.
For example, we use mixins to create buttons themes and then we use the key names as modifier classes names:
.mc-button { @each $name, $props in $buttons-themes { @if ($name != 'solid') { &--#{$name} { @include set-button-theme($props); } } }}
This means that if you create a properties/color/button.json
file and define something like:
You will end up with a new button theme without the need to write any CSS or SASS.
<button class="mc-button mc-button--my-theme"> My button with a custom theme</button>
You can look in the specs tab of the component documentation to help you define which tokens need to be overridden.