Color Value: A Developer's Guide to CSS Colors in Design Systems

Master CSS color formats, change text color CSS, and build scalable component-driven color systems with modern CSS features.

Understanding CSS Color Formats

Color values are the foundation of every design system, yet many developers treat them as an afterthought. When you're copying colors from a design file into your CSS, you're working with a deceptively complex system that has evolved significantly.

Understanding color values isn't just about aesthetics--it's about building maintainable, accessible, and scalable component libraries. This guide explores how modern CSS color features can transform your approach to color in design systems, from combining color formats to creating cohesive color palettes that enhance user experience.

What You'll Learn

  • Hexadecimal color format and when to use hex codes
  • RGB and RGBA functions for programmatic color manipulation
  • HSL color values for design system scalability
  • Modern color formats like OKLCH and Display P3
  • CSS custom properties for maintainable color tokens
  • Relative color syntax for generating variations
  • Light and dark mode color scheme handling
  • Color accessibility and WCAG contrast requirements
  • Component-driven color implementation patterns
CSS Color Formats at a Glance

Choose the right format for your design system needs

Hexadecimal Colors

The most common format using #RRGGBB notation. Compact and familiar, but not ideal for programmatic manipulation.

RGB and RGBA

Mathematical color representation with red, green, and blue channels. Modern space-separated syntax available.

HSL Color Values

Hue, Saturation, Lightness format that maps to human color perception. Preferred for design system scalability.

Modern Formats (OKLCH)

Perceptually uniform colors for wider gamut displays and smoother gradient interpolation.

Hexadecimal Color Values

Hex codes are the workhorse of web colors. They use a # prefix followed by six hexadecimal digits representing red, green, and blue values.

Hex Code Structure

Each pair of digits controls one color channel in the 0-255 range, expressed as hexadecimal (00-FF). An optional seventh and eighth pair can specify alpha transparency.

Hex Color Examples
1/* Full hex notation */2.color-primary { color: #2563EB; }3 4/* Shorthand 3-digit for simple colors */5.color-simple { color: #36F; } /* Equivalent to #3366FF */6 7/* Hex with alpha */8.color-with-alpha { color: #2563EB80; } /* 50% opacity */9 10/* Semantically named in a design system */11.color-surface { background-color: #F8FAFC; }12.color-text { color: #0F172A; }

When to Use Hex Codes

Hex codes work well when you have fixed color values from a design file. However, for dynamic color manipulation or generating color variations, RGB or HSL formats offer more flexibility.

For teams building comprehensive design systems, hex codes serve as primitive tokens while RGB or HSL power the semantic layer.

Pros: Compact, familiar, widely understood, great for fixed values Cons: Not human-readable, difficult to modify programmatically

RGB and RGBA Color Functions

The RGB color model forms the foundation of digital color. Modern CSS provides powerful ways to express and manipulate RGB values.

How RGB Works

RGB uses three 0-255 values for red, green, and blue channels. When all three are at maximum (255), you get white. When all are zero, you get black.

RGB Color Syntax Examples
1/* Traditional comma-separated syntax */2.color-rgb { color: rgb(37 99 235); }3 4/* Modern space-separated syntax */5.color-rgb-modern { color: rgb(37 99 235); }6 7/* RGB with alpha channel */8.color-rgba { color: rgb(37 99 235 / 0.8); }9 10/* Percentage values also work */11.color-rgb-percent { color: rgb(15% 39% 92%); }

Change Text Color CSS with RGB

Setting text color with RGB is straightforward. The modern space-separated syntax works seamlessly with CSS custom properties. This approach is particularly valuable when building maintainable web applications where color consistency across components is critical.

/* Basic text color */
.text-primary { color: rgb(37 99 235); }

/* Using CSS variables for text color */
.text-heading { color: rgb(from var(--color-primary) r g b); }

/* Semi-transparent text */
.text-muted { color: rgb(15 23 42 / 0.7); }

HSL Color Values for Design Systems

HSL (Hue, Saturation, Lightness) is the preferred format for design systems because it maps more closely to how humans perceive and manipulate colors.

Understanding HSL Components

  • Hue (0-360°): Position on the color wheel. Red is 0°, green is 120°, blue is 240°.
  • Saturation (0-100%): Intensity or vividness of the color.
  • Lightness (0-100%): How light or dark the color appears. 0% is black, 100% is white.
HSL Color Syntax Examples
1/* Basic HSL syntax */2.color-primary { color: hsl(217 73% 50%); }3 4/* Without units (modern syntax) */5.color-secondary { color: hsl(217 73 50); }6 7/* With alpha channel */8.color-surface { background-color: hsl(217 73% 50% / 0.1); }9 10/* Using percentages for RGB values in hsl() */11.color-alt { color: hsl(217 73% 50%); }

Why HSL Works for Design Systems

The power of HSL lies in its predictability. To create lighter shades, you simply increase lightness while keeping hue and saturation constant. This approach complements color psychology principles by allowing consistent emotional tone across variations.

:root {
 --color-primary: hsl(217 73% 50%);
 --color-primary-light: hsl(217 73% 60%);
 --color-primary-dark: hsl(217 73% 40%);
 --color-primary-surface: hsl(217 73% 97%);
}

This consistency makes HSL ideal for generating color scales programmatically.

CSS Custom Properties for Design System Colors

CSS custom properties (variables) are essential for maintaining consistent color values across components and enabling theme switching.

Organizing Color Tokens

A well-structured color system uses semantic tokens that describe what the color is used for, rather than what the color looks like. This abstraction layer allows design systems to remain flexible as brand colors evolve.

CSS Custom Property Color Tokens
1:root {2 /* Primitive colors - specific values */3 --color-blue-500: hsl(217 73% 50%);4 --color-gray-100: hsl(210 40% 98%);5 --color-gray-900: hsl(222 47% 11%);6 7 /* Semantic colors - meaning-based */8 --color-primary: var(--color-blue-500);9 --color-text-primary: var(--color-gray-900);10 --color-text-secondary: hsl(215 20% 45%);11 --color-background: var(--color-gray-100);12 --color-border: hsl(214 32% 91%);13 14 /* Component-specific */15 --button-bg-primary: var(--color-primary);16 --button-text-primary: white;17 --input-border-default: var(--color-border);18 --input-border-focus: var(--color-primary);19}

Modern CSS: Relative Colors

CSS relative color syntax is a game-changer for design systems. It allows you to create new colors based on existing ones, with full programmatic manipulation.

Generating Color Variations

With relative colors, you can derive hover states, focus states, and surface colors from a single source of truth. This approach reduces token bloat and ensures color harmony across interactive states.

Relative Color Syntax Examples
1:root {2 --brand: hsl(217 73% 50%);3}4 5/* Hover state: darker version */6.btn-primary:hover {7 background-color: hsl(from var(--brand) h s calc(l - 10%));8}9 10/* Focus ring: semi-transparent */11.btn-primary:focus-visible {12 box-shadow: 0 0 0 4px hsl(from var(--brand) h s l / 0.3);13}14 15/* Surface variant: very light background */16.btn-secondary {17 background-color: hsl(from var(--brand) h 20% 97%);18}19 20/* Text color from background */21.card {22 background-color: var(--brand);23 color: hsl(from var(--brand) h s 95%);24}

Light and Dark Color Schemes

Modern CSS provides native support for automatic light and dark mode color handling through the color-scheme property and light-dark() function.

Declaring Supported Color Schemes

Light/Dark Mode Color Implementation
1:root {2 /* Declare supported schemes */3 color-scheme: light dark;4 5 /* Define colors for both themes */6 --text-primary: light-dark(#0F172A, #F8FAFC);7 --text-secondary: light-dark(#475569, #94A3B8);8 --background: light-dark(#FFFFFF, #0F172A);9 --surface: light-dark(#F1F5F9, #1E293B);10 --border: light-dark(#E2E8F0, #334155);11}12 13/* Component can override scheme */14.hero {15 color-scheme: light; /* Always use light colors */16 background: linear-gradient(135deg, #2563EB 0%, #7C3AED 100%);17}

Color Accessibility in Design Systems

Building accessible color systems means ensuring sufficient contrast between text and backgrounds for all users. This consideration extends to color symbolism across cultures and user demographics.

WCAG Contrast Requirements

  • AA Level: 4.5:1 for normal text, 3:1 for large text (18px+ or 14px bold)
  • AAA Level: 7:1 for normal text, 4.5:1 for large text

CSS color-contrast() Function

Modern CSS includes a color-contrast() function that automatically selects an accessible text color from a list of background colors:

Accessible Color Implementation
1/* Automatic accessible text color */2.card {3 background-color: #2563EB;4 color: color-contrast(#2563EB vs white, black);5}6 7/* With preference for certain colors */8.card-inverted {9 background-color: #1E293B;10 color: color-contrast(#1E293B vs #F8FAFC, #F1F5F9, white);11}

Accessibility Best Practices

  1. Test early and often: Use browser DevTools accessibility audits
  2. Define safe combinations: Document approved text/background pairs
  3. Don't rely on color alone: Use icons, patterns, or labels alongside color
  4. Consider color blindness: Test your palette with simulation tools
  5. Build contrast into tokens: Start with accessible color values in your design system

Color in Modern Web Development

4+

Color format options (hex, RGB, HSL, OKLCH)

3

WCAG contrast levels to consider

360°

Hue range for color manipulation

Putting It All Together: Component Color Implementation

A complete example showing how to implement colors for a button component using all the concepts covered. For larger applications, consider partnering with professional web development services to establish robust color systems.

Complete Button Component Color System
1:root {2 /* Design tokens */3 --btn-primary: hsl(217 73% 50%);4 --btn-primary-hover: hsl(from var(--btn-primary) h s calc(l - 10%));5 --btn-primary-active: hsl(from var(--btn-primary) h s calc(l - 15%));6 --btn-text-on-primary: white;7 8 /* State ring for focus visibility */9 --btn-focus-ring: hsl(from var(--btn-primary) h s l / 0.4);10}11 12.btn {13 /* Color properties */14 background-color: var(--btn-bg, var(--btn-primary));15 color: var(--btn-color, var(--btn-text-on-primary));16 17 /* Border */18 border: 1px solid transparent;19 border-color: var(--btn-border-color, transparent);20}21 22.btn:hover {23 background-color: var(--btn-primary-hover);24}25 26.btn:active {27 background-color: var(--btn-primary-active);28}29 30.btn:focus-visible {31 outline: none;32 box-shadow: 0 0 0 3px var(--btn-focus-ring);33}34 35/* Dark mode support */36@media (prefers-color-scheme: dark) {37 .btn {38 --btn-primary: hsl(217 73% 60%);39 --btn-text-on-primary: hsl(222 47% 11%);40 }41}

Frequently Asked Questions

Ready to Build Scalable Design Systems?

Our team specializes in creating maintainable, accessible, and component-driven design systems that scale with your business.