Structuring the primitive layer
The primitive layer should contain every color value the system will ever use, organized by hue. A full-scale primitive palette typically contains 6-12 hues × 8-12 lightness steps = 48-144 raw color values. The choice of lightness step distribution matters for dark mode: a linear scale (100, 200, 300 ... 900) makes it easy to find semantic equivalents in dark mode by inverting the step (what was step 200 in light mode becomes step 800 in dark mode). HSL-based lightness steps work better for this inversion than perceptual lightness steps (OKLCH L-steps), because HSL 200→800 inversion is predictable while OKLCH equivalents require manual testing. The trade-off: OKLCH produces more perceptually consistent steps, making it easier to choose semantically equivalent tones. Systems built for international deployment (multiple brand themes) often benefit from OKLCH primitives despite the inversion complexity.
