Salesforce Lightning Design System Primitive Tokens for MuleSoft Citizen Applications
- Primitive tokens are an abstraction of Salesforce's UI into name and value design properties.
Quick start
- Clone the project with
git clone https://github.com/salesforce-ux/design-system-primitive-tokens.git
- Run
npm install
in the root design-system-primitive-tokens folder.
Build Tokens
Generate Tokens
npm run build
Lint Tokens
npm run lint
Tests
npm run test
Publish
npm run publish-package
- Increments version, builds and pushes to NPM package
Add new aliases
Within the design-tokens
folder you will find an aliases
folder. This is where re-usable aliases will reside. Aliases can be imported into any token YAML file and referenced as a value with {!ALIAS_NAME}
syntax. Note Aliases cannot be consumed outside of a tokens YAML file.
Importing aliases
imports:
- ../aliases/colors.yml
Using an alias
props:
COLOR_BACKGROUND:
value: '{!PALETTE_GRAY_2}'
Adding a new token
Within the design-tokens
folder you will find a primitive
folder. This is where consumable named tokens reside. They can either reference an alias as its value or a string value.
global:
type: color
category: background-color
cssProperties:
- 'background*'
- 'border*'
- box-shadow
imports:
- ../aliases/colors.yml
props:
COLOR_BACKGROUND:
value: '{!PALETTE_GRAY_2}'
comment: Default background color for the whole app.
Naming your token
The naming convention for a primitive token is:
CATEGORY_PROPERTY_ATTRIBUTE_RELATIONSHIP_STATE
- Category — [required] Indicates the category of the token.
- Property — [optional] Semantic UI property being described. By negating a property declaration, token is valid as a generic UI property.
- Attribute — [optional] Semantic characteristic of a property.
- Relationship — [optional] If necessary, a relational name that is relative to other tokens of similar types. E.g. primary vs secondary
- State — [optional] If necessary, the state of a token when used in the context of interaction design. E.g. hover, focus, selected
Usage combinations
COLOR_BACKGROUND
SIZING_WIDTH_SMALL
COLOR_BACKGROUND_SELECTED
COLOR_BACKGROUND_INVERSE
COLOR_BORDER_DESTRUCTIVE_HOVER
COLOR_TEXT_LINK_WEAK_SECONDARY
COLOR_TEXT_LINK_WEAK_SECONDAY_HOVER
Categories
Categories => Properties | Token Prefix | Usage Description |
---|
Color | COLOR | Generic UI color |
└── Brand | COLOR_BRAND | Brand color associated to theming algorithm |
└── Background | COLOR_BACKGROUND | Generic UI background colors |
└── Border | COLOR_BORDER | Generic UI border colors |
└── Gradient | COLOR_GRADIENT | Generic UI gradient colors |
└── Text | COLOR_TEXT | Generic UI text colors |
└── Text Link | COLOR_TEXT_LINK | Generic UI text link colors |
Font | FONT | Salesforce font family declarations |
└── Style | FONT_STYLE | Supported font family styles |
└── Size | FONT_SIZE | Generic typographic scale for fonts |
└── Weight | FONT_WEIGHT | Supported font family weights |
Opacity | OPACITY | Generic opacity levels |
Line-height | LINE-HEIGHT | Relative line-height declarations |
Spacing | SPACING | Box-model spacing declarations, padding and margin |
Radius | RADIUS | Generic UI radius values |
Sizing | SIZING | Generic UI sizing, can be used on box-model |
└── Border | SIZING_BORDER | Generic UI border widths |
└── Square | SIZING_SQUARE | Generic UI dimensions to output a 1:1 square |
└── Width | SIZING_WIDTH | Generic UI widths |
Shadow | SHADOW | Generic shadows used for depth |
Duration | DURATION | Generic timing durations for animations |
Touch | TOUCH | Touch specific values |
Media Query | MQ | Supported media queries |
Depth | DEPTH | Z-index declarations for stacking context |
Variable | VAR | Dynamic values that change based on user prefs |
└── Spacing | VAR_SPACING | Dynamic box-model spacing declarations |
└── Font-size | VAR_FONT_SIZE | Dynamic font-size declarations |
Adding a new category
If you need to add a new token category that does not currently exist, create a YAML file associated with the category you'd like to have a reference to.
primitive/
└── new_category.yml
Once the file is created, you will need to import its reference into base.yml
inside of the primitive
folder. After the file and its content have been created, it would be a good idea to run npm run test -- -u
to update tests to reflect your additions.
imports:
- ./new_category.yml
Licenses