Primitive
Raw values
Values like #DB2777 or 0.75rem. Keep names neutral and stable.
Tokens are your design contract: define values once, generate consistent utilities everywhere.
Keep tokens in layers so changes stay controlled: primitives for raw values, semantics for roles, and utilities generated from those values.
{
"colours": {
"brand": "#DB2777",
"neutral": "#57534E"
},
"semanticColours": {
"surface": "#12100E",
"text": "#F8F5F0",
"text-muted": "#A8A29E"
},
"spacing": {
"scale": {
"2": "0.5rem",
"4": "1rem",
"6": "1.5rem"
}
}
}Primitive
Values like #DB2777 or 0.75rem. Keep names neutral and stable.
Semantic
Names like surface, text-muted, focus-ring map meaning to primitives.
Utility output
Classes are generated from config and manifest, not hand-written per page.
emily-css build to regenerate CSS and metadata.npx emily-css build npx emily-css doctor npm run dev
surface or danger over project-specific names.Next step
Read Colours to set robust ramps and semantic roles from your token base.