One design system.
Multiple renderers.
There is no Flutter design system and no web design system. There is one
system — colour, type, spacing, shape, motion — and two renderers that
draw it. Naming the halves by platform is what makes them drift.
loke.tokens.jsoncanonical source
tokens.dartloke_flutter · mobile
loke-tokens.cssloke-design-system · web
tokens.cssmarketing · tokens only
Generated, never transcribed. Every consumer vendors a copy and gates on
drift; hand-editing a generated file is a red build, not a slow divergence.
Tokens
Generated from loke.tokens.json at build time. If a value here is wrong, the source is wrong — there is nowhere else to fix it.
Brand
Ramps
12 hues × 5 stops. Five steps, not ten — a ramp you can hold in your head.
Neutral
Cool-tinted, so greys sit under the brand red without going muddy.
Semantic roles
What components actually read. Two themes, one set of names.
| Role | Light | Dark |
bg |
#FFFFFF |
#1C1C1C |
surface |
#F8FAFD |
#1E2124 |
surface-raised |
#FFFFFF |
#3A3D42 |
surface-sunken |
#E2E5EA |
#090A0D |
field |
#F0F3F6 |
#3A3D42 |
text |
#1E2124 |
#FFFFFF |
text-secondary |
#5A5E63 |
#ADB1B7 |
text-tertiary |
#70747A |
#8E9399 |
text-inverse |
#FFFFFF |
#1C1C1C |
border |
#E2E5EA |
#3A3D42 |
border-strong |
#CCD0D5 |
#5A5E63 |
disabled |
#ADB1B7 |
#70747A |
Type roles
| Role | Family | Weight | Case | Tracking | Figures |
display |
display |
900 |
UPPER |
0 |
— |
title |
sans |
700 |
UPPER |
0.02em |
— |
button |
sans |
900 |
UPPER |
0.04em |
— |
label |
sans |
700 |
UPPER |
0.04em |
— |
body |
sans |
400 |
sentence |
0 |
— |
bodyStrong |
sans |
500 |
sentence |
0 |
— |
numeric |
mono |
500 |
sentence |
0 |
tabular |
numericStrong |
mono |
700 |
sentence |
0 |
tabular |
meta |
mono |
500 |
UPPER |
0.06em |
tabular |
Scale & shape
Spacing
space-0 | 0px |
space-1 | 4px |
space-2 | 8px |
space-3 | 12px |
space-4 | 16px |
space-5 | 20px |
space-6 | 24px |
space-7 | 28px |
space-8 | 32px |
space-10 | 40px |
space-12 | 48px |
space-16 | 64px |
space-20 | 80px |
space-24 | 96px |
Radius
radius-none | 0px |
radius-xs | 2px |
radius-overlay | 20px |
radius-full | 9999px |
Border
border-sm | 2px |
border | 3px |
border-lg | 4px |
Duration
dur-fast | 90ms |
dur-base | 260ms |
dur-bounce | 440ms |
Shadow
Hard offset, always. The one exception is mediaLegibility — over unpredictable video a hard offset reads as a UI glitch, so a soft shadow is the legible choice there and nowhere else.
Icons
System and gamification both use Material Symbols Sharp-Fill. Sharp and filled, to match square corners and solid fills.