The problem: physical vs digital brand colors
Typical scenario: a construction or industrial company has guidelines like "Primary red: RAL 3020 Traffic Red, Secondary gray: RAL 7016 Anthracite Grey". Designers now need hex values for web UIs and system colors in Tailwind/Material with proper scales and semantics.
Challenges:
- RAL is defined via physical paint standards, not sRGB
- Simple one-off conversions don't give you lighter/darker tints, accessible text combinations, or consistent theming in light and dark modes
- You need a robust mapping, not a single hex swap
Step 1 – Get reliable sRGB approximations
Using ColorR's RAL Classic collection: look up each brand RAL code (/ral/3020, /ral/7016), note the hex, HSL, Lab and OKLCH values.
These hex values are tuned for typical sRGB displays — close enough for digital brand matching, but not a substitute for physical swatches.
Step 2 – Find nearest Tailwind hues
Use ColorR to compare RAL colors in OKLCH/Lab against Tailwind hues and pick the closest visual match.
- RAL 3020 ≈ Tailwind
red-600orred-700 - RAL 7016 ≈ Tailwind
neutral-800orslate-800
This gives you a base hue in Tailwind's world and a full scale to work with.
Step 3 – Build Tailwind brand tokens
// tailwind.config.js
theme: {
extend: {
colors: {
brand: {
50: theme('colors.red.50'),
// ... other steps
600: theme('colors.red.600'), // closest to RAL 3020
// ...
900: theme('colors.red.900'),
},
brandNeutral: {
50: theme('colors.slate.50'),
// ...
800: theme('colors.slate.800'), // close to RAL 7016
900: theme('colors.slate.900'),
},
},
},
}<button class="bg-brand-600 hover:bg-brand-700 text-white">
For light/dark mode, choose appropriate steps:
- background: brandNeutral-50/100
- text: brandNeutral-900
- primary button: brand-600
- background: brandNeutral-900
- text: brandNeutral-50
- primary button: brand-400/500
Step 4 – Map into Material Design
Choose a Material base hue
Use ColorR to compare RAL 3020 to Material palette hues and pick the closest visual match. Example: RAL 3020 ≈ Material Red 600 (#e53935 in classic Material).
Create a Material 3 seed color
Set your primary seed to the closest Material red approximating RAL 3020. The system generates primary, secondary, tertiary and error tonal palettes plus neutrals. The resulting dynamic palettes will keep overall Material light/dark behaviour while staying near your RAL base.
Static mapping with Material 2 (MUI)
const theme = createTheme({
palette: {
primary: {
main: '#e53935', // Material Red 600 ≈ RAL 3020
},
background: {
default: '#f9fafb',
},
},
})Step 5 – Align semantics and communication
Once mappings are in place, document them clearly so marketing, industrial design and dev teams share a common language:
Brand Primary
RAL 3020 ≈ Tailwind brand-600 ≈ Material Red 600
Brand Neutral
RAL 7016 ≈ Tailwind brandNeutral-800 ≈ Material Blue Grey 800
In specs and Figma, refer to both RAL codes and digital tokens. This helps marketing and industrial design teams trust that digital work respects physical standards.
When this approach is worth it
Mapping RAL → Tailwind/Material is particularly valuable when your company's brand identity is tightly tied to physical assets (fleets, buildings, signage), existing brand guidelines are in RAL but digital guidelines are fuzzy, or you're standardising UI across marketing sites, apps and internal tools.
ColorR acts as a hub: it exposes RAL values in digital form, helps you find nearest structured colors, and lets you visualise, compare and fine-tune mappings — so your UIs feel like part of the same brand universe as your physical products, without sacrificing accessibility or modern theming.