Duolingo Design Tokens
Gamified language learning platform
Gamified progress UI
Observed with Dembrandt. Semantic roles, gradients, and breakpoints come from live extractions where available; contrast is computed from the real palette. Try the CLI for the complete W3C token export.
Design tokens observed from publicly visible CSS. Dembrandt does not host, copy, or redistribute any brand assets.
Colors
#58cc02
#a5ed6e
#1cb0f6
#d7ffb8
#3c3c3c
#ffffff
primary#58cc02
background#ffffff
text#3c3c3c
accent#1cb0f6
Typography
duolingo-sans, feather
hero:64px / 700
body:17px / 500
button:15px / 700
weights:500, 700
leading:1, 1.1, 1.4, 1.6
tracking:-0.02em, 0, 0.04em
Shadows
sm
Spacing
1px8px9.5px10px12px13px
Border Radius
12px
Borders
1px solid #c1c1c1
2px inset #3c3c3c
Links
Link text#0000ee · no underline · hover #565656
Gradients
linear-gradient(135deg, #58cc02 0%, #ffffff 100%)
linear-gradient(90deg, #58cc02, #a5ed6e, #1cb0f6)
radial-gradient(circle at 30% 20%, #58cc02 0%, #a5ed6e 70%)
Opacity
0
0.04
0.08
0.16
0.4
0.64
0.92
1
Breakpoints
400px600px1024px1280px
Motion
Duration120ms180ms280ms420ms
Easingcubic-bezier(0.4, 0, 0.2, 1)cubic-bezier(0.16, 1, 0.3, 1)linear
Contrast · WCAG 2.2
Aa
Button label
2.44:1
Aa
Body text
11.03:1
Button States
QuasarDefault
#1cb0f6Hover
#1eaedbActive
#1cb0f6Focus
focusDisabled
disabledLoading
loadingradius: 12pxpadding: 13px 16px
output.json
{
"$schema": "https://design-tokens.org/schema.json",
"color": {
"palette-1": {
"$type": "color",
"$value": "#58cc02"
},
"palette-2": {
"$type": "color",
"$value": "#a5ed6e"
},
"palette-3": {
"$type": "color",
"$value": "#1cb0f6"
},
"palette-4": {
"$type": "color",
"$value": "#d7ffb8"
},
"palette-5": {
"$type": "color",
"$value": "#3c3c3c"
},
"palette-6": {
"$type": "color",
"$value": "#ffffff"
},
"primary": {
"$type": "color",
"$value": "#58cc02"
},
"background": {
"$type": "color",
"$value": "#ffffff"
},
"text": {
"$type": "color",
"$value": "#3c3c3c"
},
"accent": {
"$type": "color",
"$value": "#1cb0f6"
},
"link": {
"$type": "color",
"$value": "#0000ee"
}
},
"border": {
"border-1": {
"$type": "border",
"$value": "1px solid #c1c1c1"
},
"border-2": {
"$type": "border",
"$value": "2px inset #3c3c3c"
}
},
"gradient": {
"gradient-1": {
"$type": "gradient",
"$value": "linear-gradient(135deg, #58cc02 0%, #ffffff 100%)"
},
"gradient-2": {
"$type": "gradient",
"$value": "linear-gradient(90deg, #58cc02, #a5ed6e, #1cb0f6)"
},
"gradient-3": {
"$type": "gradient",
"$value": "radial-gradient(circle at 30% 20%, #58cc02 0%, #a5ed6e 70%)"
}
},
"fontFamily": {
"base": {
"$type": "fontFamily",
"$value": "duolingo-sans, feather"
}
},
"fontWeight": {
"weight-500": {
"$type": "fontWeight",
"$value": 500
},
"weight-700": {
"$type": "fontWeight",
"$value": 700
}
},
"dimension": {
"space-1": {
"$type": "dimension",
"$value": "1px"
},
"space-2": {
"$type": "dimension",
"$value": "8px"
},
"space-3": {
"$type": "dimension",
"$value": "9.5px"
},
"space-4": {
"$type": "dimension",
"$value": "10px"
},
"space-5": {
"$type": "dimension",
"$value": "12px"
},
"space-6": {
"$type": "dimension",
"$value": "13px"
},
"radius-1": {
"$type": "dimension",
"$value": "12px"
}
},
"shadow": {
"shadow-1": {
"$type": "shadow",
"$value": "rgb(128, 128, 128) 0px 0px 5px 0px"
}
},
"opacity": {
"opacity-0": {
"$type": "number",
"$value": 0
},
"opacity-1": {
"$type": "number",
"$value": 0.04
},
"opacity-2": {
"$type": "number",
"$value": 0.08
},
"opacity-3": {
"$type": "number",
"$value": 0.16
},
"opacity-4": {
"$type": "number",
"$value": 0.4
},
"opacity-5": {
"$type": "number",
"$value": 0.64
},
"opacity-6": {
"$type": "number",
"$value": 0.92
},
"opacity-7": {
"$type": "number",
"$value": 1
}
},
"duration": {
"duration-1": {
"$type": "duration",
"$value": "120ms"
},
"duration-2": {
"$type": "duration",
"$value": "180ms"
},
"duration-3": {
"$type": "duration",
"$value": "280ms"
},
"duration-4": {
"$type": "duration",
"$value": "420ms"
}
},
"cubicBezier": {
"ease-1": {
"$type": "cubicBezier",
"$value": "cubic-bezier(0.4, 0, 0.2, 1)"
},
"ease-2": {
"$type": "cubicBezier",
"$value": "cubic-bezier(0.16, 1, 0.3, 1)"
},
"ease-3": {
"$type": "cubicBezier",
"$value": "linear"
}
},
"breakpoint": {
"bp-1": {
"$type": "dimension",
"$value": "400px"
},
"bp-2": {
"$type": "dimension",
"$value": "600px"
},
"bp-3": {
"$type": "dimension",
"$value": "1024px"
},
"bp-4": {
"$type": "dimension",
"$value": "1280px"
}
},
"contrast": {
"button-label": {
"ratio": 2.44,
"grade": "Fail"
},
"body-text": {
"ratio": 11.03,
"grade": "AAA"
}
}
}
// ...and moreOther token exports
--dtcgW3C token JSON, checked by the DTCG Validator
--design-mdDESIGN.md for agents and docs
--brand-guideBrand guide PDF
--wcagPalette-wide contrast report
All flags in the CLI quickstart. Same tokens in your editor via the MCP server.
$npx dembrandt duolingo.com