Lab 11: Theming System

Time: 60 minutes | Level: Architect | Docker: node:20-alpine

Overview

Enterprise theming architecture: CSS layer strategy, multi-brand theming with data-theme, media query stack (prefers-color-scheme + forced-colors + prefers-contrast), oklch() palette generation for P3 wide gamut, and CSS @scope for theme isolation.


Step 1: CSS Layer Architecture

/* Declare layers in correct cascade order */
@layer reset, base, tokens, components, utilities, overrides;

@layer reset {
  *, *::before, *::after { box-sizing: border-box; }
  body { margin: 0; }
  img  { max-width: 100%; display: block; }
}

@layer base {
  :root {
    font-family: var(--font-sans);
    line-height: var(--line-height-base);
    color: var(--color-text-primary);
    background: var(--color-bg-default);
  }
}

@layer tokens {
  :root {
    /* Light theme defaults */
    --color-primary: oklch(0.55 0.20 250);
    --color-bg-default: oklch(0.99 0 0);
    --color-text-primary: oklch(0.15 0 0);
  }
}

@layer components {
  .btn { /* ... */ }
  .card { /* ... */ }
}

@layer utilities {
  .sr-only { /* ... */ }
  .flex  { display: flex; }
}

@layer overrides {
  /* Third-party library overrides */
}

💡 Layer order matters: utilities overrides components regardless of specificity. This is the key insight — cascade layers trump specificity.


Step 2: Multi-Brand Theming


Step 3: Dark Mode + Forced Colors + High Contrast Stack


Step 4: oklch() Color Palette Generation


Step 5: CSS @scope for Theme Isolation


Step 6: Theme Token Export


Step 7: Smooth Theme Transition


Step 8: Capstone — oklch Palette Generator

📸 Verified Output:


Summary

Feature
CSS
Benefit

Layer ordering

@layer

Predictable cascade

Multi-brand

[data-theme] attributes

Runtime switching

Dark mode

prefers-color-scheme

Auto OS-synced

Forced colors

@media (forced-colors)

Windows accessibility

High contrast

prefers-contrast: more

User preference

P3 colors

oklch()

Wider gamut palette

Scope isolation

@scope (.parent)

No style leakage

Smooth switch

Transition + no-FOUC

Polished UX

Last updated