Appearance
Colours
The FastTrack colour system is built on CSS custom properties defined in public/assets/styles/colors.css. All colours are available globally and should be referenced via var() — never hardcode hex values.
The swatches below are generated at build time from colors.css via colours.data.js. To add, remove, or rename a colour, edit colors.css — this page updates automatically.
Brand Palette
The approved palette contains pink, purple, blue, yellow, red, and orange, with stops 200–600.
Brand Colours
Pink
--color-brand-pink-200#FEE9F1--color-brand-pink-300#F8B4CD--color-brand-pink-400#E96092--color-brand-pink-500#D72555--color-brand-pink-600#AE0027Purple
--color-brand-purple-200#FBE2FA--color-brand-purple-300#B481B2--color-brand-purple-400#832081--color-brand-purple-500#5E1E5C--color-brand-purple-600#380435Blue
--color-brand-blue-200#DAEFFB--color-brand-blue-300#B0DAF2--color-brand-blue-400#63B6E6--color-brand-blue-500#2479C4--color-brand-blue-600#0A5BB7Yellow
--color-brand-yellow-200#FFF6C9--color-brand-yellow-300#FEED93--color-brand-yellow-400#FFDB14--color-brand-yellow-500#E4B60D--color-brand-yellow-600#CC9018Red
--color-brand-red-200#FEE5DD--color-brand-red-300#FEB6A8--color-brand-red-400#E54F35--color-brand-red-500#C9110E--color-brand-red-600#990206Orange
--color-brand-orange-200#FEE8C7--color-brand-orange-300#F9D18F--color-brand-orange-400#F4A300--color-brand-orange-500#E9681A--color-brand-orange-600#DF4317css
/* Usage */
.my-element {
background-color: var(--color-brand-pink-400);
color: var(--color-brand-blue-600);
}/* Usage */
.my-element {
background-color: var(--color-brand-pink-400);
color: var(--color-brand-blue-600);
}Mono / Neutrals
Mono Palette
--color-mono-white#FFF--color-mono-100#FAFAFA--color-mono-200#F5F5F5--color-mono-300#E5E5E5--color-mono-400#CACACA--color-mono-500#959595--color-mono-600#666666--color-mono-700#2C2C2C--color-mono-black#000css
/* Usage */
.surface {
background-color: var(--color-mono-white);
}
.text {
color: var(--color-mono-700);
}
.border {
border-color: var(--color-mono-300);
}/* Usage */
.surface {
background-color: var(--color-mono-white);
}
.text {
color: var(--color-mono-700);
}
.border {
border-color: var(--color-mono-300);
}Secondary Palette
Green and teal use stops 200–600. Use secondary green for success states.
Secondary Colours
Green
--color-secondary-green-200#DDF2DE--color-secondary-green-300#ADD8AD--color-secondary-green-400#3AAA3F--color-secondary-green-500#2E7D2E--color-secondary-green-600#125B14Teal
--color-secondary-teal-200#BEF9F3--color-secondary-teal-300#62E2DD--color-secondary-teal-400#00AAA3--color-secondary-teal-500#008278--color-secondary-teal-600#006255Extra Shades
Extra shades outside the palette, kept for compatibility. These names and values remain unchanged.
| Token | Value |
|---|---|
--color-brand-purple-700 | #783171 |
--color-brand-purple-800 | #440743 |
--color-brand-blue-100 | #D8EDF9 |
--color-brand-blue-700 | #105DBA |
--color-brand-blue-800 | #012B86 |
--color-brand-blue-900 | #001261 |
--color-brand-yellow-700 | #FDBC25 |
--color-brand-red-700 | #B61615 |
--color-brand-red-800 | #820202 |
--color-brand-red-900 | #5D0000 |
--color-brand-orange-100 | #F9D3CC |
Deprecated Aliases
Deprecated aliases: will be removed in the next major version.
Brand green maps to secondary green at the same stop. The old secondary families and green-teal names map to the nearest final token. These mappings use Oklab distance, including Mono. Colour proximity does not imply the same semantic purpose. The optional Greco theme retains its deliberate brand overrides and uses these aliases.
| Deprecated token | Use instead | Value |
|---|---|---|
--color-brand-green-200 | --color-secondary-green-200 | #DDF2DE |
--color-brand-green-300 | --color-secondary-green-300 | #ADD8AD |
--color-brand-green-400 | --color-secondary-green-400 | #3AAA3F |
--color-brand-green-500 | --color-secondary-green-500 | #2E7D2E |
--color-brand-green-600 | --color-secondary-green-600 | #125B14 |
--color-secondary-aqua-400 | --color-brand-blue-200 | #DAEFFB |
--color-secondary-aqua-500 | --color-mono-300 | #E5E5E5 |
--color-secondary-aqua-600 | --color-secondary-teal-300 | #62E2DD |
--color-secondary-aqua-700 | --color-secondary-teal-400 | #00AAA3 |
--color-secondary-aqua-800 | --color-secondary-teal-400 | #00AAA3 |
--color-secondary-aqua-900 | --color-secondary-teal-500 | #008278 |
--color-secondary-denim-600 | --color-brand-blue-400 | #63B6E6 |
--color-secondary-denim-700 | --color-brand-blue-600 | #0A5BB7 |
--color-secondary-denim-800 | --color-brand-blue-600 | #0A5BB7 |
--color-secondary-denim-900 | --color-brand-purple-600 | #380435 |
--color-secondary-lilac-600 | --color-mono-400 | #CACACA |
--color-secondary-lilac-700 | --color-brand-purple-300 | #B481B2 |
--color-secondary-lilac-800 | --color-brand-purple-400 | #832081 |
--color-secondary-lilac-900 | --color-brand-purple-600 | #380435 |
--color-secondary-magenta-500 | --color-brand-pink-300 | #F8B4CD |
--color-secondary-magenta-600 | --color-brand-pink-400 | #E96092 |
--color-secondary-magenta-700 | --color-brand-pink-500 | #D72555 |
--color-secondary-magenta-800 | --color-brand-purple-400 | #832081 |
--color-secondary-magenta-900 | --color-brand-red-600 | #990206 |
--color-secondary-thunderbird-600 | --color-brand-purple-300 | #B481B2 |
--color-secondary-thunderbird-700 | --color-brand-pink-600 | #AE0027 |
--color-secondary-thunderbird-800 | --color-brand-red-500 | #C9110E |
--color-secondary-thunderbird-900 | --color-brand-red-600 | #990206 |
--color-green-teal-100 | --color-brand-blue-300 | #B0DAF2 |
--color-green-teal-200 | --color-secondary-green-300 | #ADD8AD |
--color-green-teal-300 | --color-secondary-green-300 | #ADD8AD |
--color-green-teal-400 | --color-secondary-teal-400 | #00AAA3 |
--color-green-teal-500 | --color-secondary-teal-400 | #00AAA3 |
--color-green-teal-600 | --color-secondary-teal-400 | #00AAA3 |
--color-green-teal-700 | --color-secondary-teal-500 | #008278 |
--color-green-teal-800 | --color-secondary-teal-500 | #008278 |
Semantic Colours
Functional aliases that map to brand and secondary palette tokens. Defined in tokens/semantic.tokens.json.
Semantic Colours
Primary
lighter
light
base
dark
darker
Maps to pink 200–600
Secondary
lightest
light
base
Maps to blue 200, 500, 600
Tertiary
light
base
dark
Maps to purple 300–500
Success
lightest
light
base
dark
Maps to green 200–500
Warning
lightest
light
base
dark
Maps to yellow 200–500
Error
lightest
light
base
dark
Maps to red 200, 400, 500, 600
Info
lightest
light
base
dark
Maps to blue 200, 400, 500, 600
Neutral
lightest
lighter
light
base
dark
Maps to mono 200–700
Surface, Text & Border
Semantic tokens for surfaces, text and interactive states.
| Token | Value | Usage |
|---|---|---|
surface.base | mono.white | Default background |
surface.secondary | mono.100 | Secondary container background |
surface.tertiary | mono.200 | Nested content background |
surface.inverse | mono.black | Inverse/dark background |
on-surface.base | mono.700 | Default text on light surfaces |
on-surface.secondary | mono.600 | Secondary text |
on-surface.tertiary | mono.500 | Tertiary text |
on-surface.disabled | mono.400 | Disabled text |
on-surface.inverse | mono.white | Text on dark surfaces |
border.base | mono.300 | Default border |
border.subtle | mono.200 | Subtle border |
border.strong | mono.500 | Emphasis border |
border.focus | blue.600 | Focused element border |
focus-ring.base | blue.600 | Focus ring for keyboard navigation |
link.base | blue.600 | Default link colour |
link.hover | blue.500 | Hovered link colour |
link.visited | purple.300 | Visited link colour |
accent.primary | orange.500 | Primary accent highlights |
accent.secondary | purple.400 | Secondary accent |
overlay.base | rgba(0,0,0,0.5) | Default overlay backdrop |