Design tokens
Working referenceExplore the foundations, roles and relationships behind HES component styling.
How tokens work
Tokens give design decisions reusable names and values. Primitives define a value, semantic tokens explain its purpose, and component tokens assign that role to a particular component.
- Primitive
primitives.colour.orange.600Raw colour value - Semantic
semantic.colour.action.primary.filled.backgroundMeaning within an interface - Component
components.button.primary.filled.backgroundWhere the Button uses it
A change to the primitive travels through validated aliases. The current Button uses that chain through Bootstrap's native .btn-primary class.
Colour primitives
The F+ working palette contains 67 colours: seven graded families, standalone White and Warm neutral 100. Grades identify positions within a family; they do not guarantee contrast between colours.
Recorded maturity and scope: Accepted for the Design System working baseline. This is not HES-wide brand or production approval.
Green
#DEF2D8Green 100, #DEF2D8#B7DEAAGreen 200, #B7DEAA#88C273Green 300, #88C273#509E2FGreen 400, #509E2F#3B942BGreen 500, #3B942B#1D8925Green 600, #1D8925#19621DGreen 700, #19621D#164016Green 800, #164016#122412Green 900, #122412Orange
#FFE6D5Orange 100, #FFE6D5#FCC49DOrange 200, #FCC49D#F19F64Orange 300, #F19F64#DF7500Orange 400, #DF7500#D2621BOrange 500, #D2621B#C8512AOrange 600, #C8512A#8B381DOrange 700, #8B381D#572414Orange 800, #572414#2F1811Orange 900, #2F1811Purple
#EDE9F4Purple 100, #EDE9F4#D5CCE2Purple 200, #D5CCE2#BEB1D0Purple 300, #BEB1D0#A492BAPurple 400, #A492BA#8973A4Purple 500, #8973A4#6E548CPurple 600, #6E548C#563F71Purple 700, #563F71#3F2A56Purple 800, #3F2A56#241A2EPurple 900, #241A2EGrey
#F5F7F7Grey 50, #F5F7F7#E8ECEDGrey 100, #E8ECED#CBD2D6Grey 200, #CBD2D6#AFB9BEGrey 300, #AFB9BE#919EA5Grey 400, #919EA5#74848CGrey 500, #74848C#5A6971Grey 600, #5A6971#45525BGrey 700, #45525B#333F48Grey 800, #333F48#1E2327Grey 900, #1E2327#090C0EGrey 1000, #090C0ERed
#FEE3EARed 100, #FEE3EA#F5C1CERed 200, #F5C1CE#EA9EB4Red 300, #EA9EB4#D97997Red 400, #D97997#C44E78Red 500, #C44E78#AC145ARed 600, #AC145A#881E50Red 700, #881E50#672146Red 800, #672146#361726Red 900, #361726Blue
#D8EFFFBlue 100, #D8EFFF#A4D9FBBlue 200, #A4D9FB#6BBDF0Blue 300, #6BBDF0#009CDEBlue 400, #009CDE#078CC5Blue 500, #078CC5#0F7EAEBlue 600, #0F7EAE#11597BBlue 700, #11597B#113A4FBlue 800, #113A4F#11212BBlue 900, #11212BYellow
#FFE8C5Yellow 100, #FFE8C5#FAC97DYellow 200, #FAC97D#F2A900Yellow 300, #F2A900#E68D00Yellow 400, #E68D00#DF7500Yellow 500, #DF7500#A65601Yellow 600, #A65601#753C07Yellow 700, #753C07#4F2B0FYellow 800, #4F2B0F#2B1B10Yellow 900, #2B1B10White and warm neutral
#FFFFFF#EFEBE6Swatches are for reference, not evidence that overlaid text or controls meet contrast requirements.
Semantic colour roles
Semantic tokens describe why a colour is used. Select an appropriate role rather than reusing an attractive primitive directly. The current mapping includes 26 action roles and 2 focus roles. Recorded scope: Accepted for the Button working baseline.
Primary / Filled
| Role | Value | Primitive |
|---|---|---|
| Background | #C8512A | orange.600 |
| Border | #C8512A | orange.600 |
| Foreground | #FFFFFF | white |
| Hover / Background | #8B381D | orange.700 |
| Hover / Border | #8B381D | orange.700 |
| Pressed / Background | #572414 | orange.800 |
| Pressed / Border | #572414 | orange.800 |
Primary / Outline
| Role | Value | Primitive |
|---|---|---|
| Border | #C8512A | orange.600 |
| Foreground | #C8512A | orange.600 |
| Hover / Background | #C8512A | orange.600 |
| Hover / Foreground | #FFFFFF | white |
| Pressed / Background | #C8512A | orange.600 |
| Pressed / Foreground | #FFFFFF | white |
Secondary / Filled
| Role | Value | Primitive |
|---|---|---|
| Background | #333F48 | grey.800 |
| Border | #333F48 | grey.800 |
| Foreground | #FFFFFF | white |
| Hover / Background | #1E2327 | grey.900 |
| Hover / Border | #1E2327 | grey.900 |
| Pressed / Background | #090C0E | grey.1000 |
| Pressed / Border | #090C0E | grey.1000 |
Secondary / Outline
| Role | Value | Primitive |
|---|---|---|
| Border | #333F48 | grey.800 |
| Foreground | #333F48 | grey.800 |
| Hover / Background | #333F48 | grey.800 |
| Hover / Foreground | #FFFFFF | white |
| Pressed / Background | #333F48 | grey.800 |
| Pressed / Foreground | #FFFFFF | white |
Focus colours
| Role | Value | Primitive |
|---|---|---|
| indicator | #333F48 | grey.800 |
| separation | #FFFFFF | white |
Outline Buttons use a transparent base as a CSS treatment, not as an invented colour token. Their interaction and focus-visible behaviour is also defined in component CSS.
Legacy compatibility
2 deprecated aliases remain in the source for compatibility. They are not recommended for new designs.
| Deprecated name | Current reference |
|---|---|
semantic.colour.interactive.primary | primitives.colour.grey.800 |
semantic.colour.text.on-interactive | primitives.colour.white |
Component tokens
Component tokens connect shared roles to the component that consumes them. The Button is our first implemented example; this is a relationship reference, not another Button playground.
Default · Primary Filled
#C8512Aaction.primary.filled.background--hes-components-button-primary-filled-backgroundHover · Primary Filled
#8B381Daction.primary.filled.hover.background--hes-components-button-primary-filled-hover-backgroundPressed · Primary Filled
#572414action.primary.filled.pressed.background--hes-components-button-primary-filled-pressed-backgroundButton type and geometry also use generated aliases, rather than literal values maintained in its Sass:
| Button property | Value | CSS variable |
|---|---|---|
| Label size | 18px | --hes-components-button-font-size |
| Label line-height ratio | 1.5 | --hes-components-button-font-line-height |
| Vertical padding | 12px | --hes-components-button-padding-block |
| Horizontal padding | 24px | --hes-components-button-padding-inline |
| Border width | 1px | --hes-components-button-border-width |
| Corner radius | 0px | --hes-components-button-border-radius |
At 18px, a line-height ratio of 1.5 gives the accepted 27px Button label treatment. See Button guidance for live variants and HTML. In Figma, Button colours already bind to shared semantic variables; identical component-alias names aren't required there.
Other foundations
Typography
The source currently contains 10 candidate typography roles using three manually selected contexts. Their values are generated, but the responsive thresholds, Display role and HES-wide adoption remain experimental. Review specimens on the Typography page.
Spacing, border and opacity
Current reusable measurements are scoped to Button. They are not a complete approved spacing or sizing scale for HES. New foundations should be documented when they have real consumers and decisions behind them.
Using and changing tokens
GitHub is the authoritative source for these DTCG values. The build generates CSS variables and applies them through Bootstrap where appropriate. The names on this page are working implementation references, not yet a published stable API for HES services.
/* Generated token, consumed by native Bootstrap styling */
.btn-primary {
--bs-btn-bg: var(--hes-components-button-primary-filled-background);
}Maturity matters: Experimental values are candidates; Pilot values are implementation references under review; Accepted values apply only to their recorded scope; Deprecated aliases are retained for compatibility. A canonical value is not necessarily a HES-wide design standard.
The coded Design System owns the token source. Figma variables represent those values for design work, but a token-to-Figma identity should only be claimed after checking that binding.
Explore canonical token files or the F+ Button working decision.