TaskBuild a small layered system. @layer base, components. @layer base { body { font-family: system-ui, sans-serif; padding: 24px; } }. @layer components { .card { padding: 20px; background: #eef; border-radius: 8px; } .card h2 { margin: 0; color: #3B82F6; } }. Demo: a card with an h2.
@layer: explicit cascade priority
100 XP7 min
Theory
The cascade you control instead of fight
@layer reset, base, components, utilities;
@layer reset {
*, *::before, *::after { box-sizing: border-box; }
}
@layer base {
body { font-family: system-ui, sans-serif; }
a { color: #3B82F6; }
}
@layer components {
.card { padding: 16px; border-radius: 8px; }
}
@layer utilities {
.text-center { text-align: center; }
}The order at the top declares priority: utilities > components > base > reset. Unlayered styles WIN over layered ones β like an "unlayered" implicit top.
Why this beats specificity wars
Before @layer, you needed !important to override Bootstrap from your code. Now:
@layer bootstrap { /* their styles */ }
@layer overrides { /* yours, always wins */ }Your overrides ALWAYS beat bootstrap's, regardless of specificity inside each layer. No !important needed.
The classic "5-layer" project structure
@layer resetβ the modern reset (box-sizing, margin: 0).@layer baseβ element defaults (body, h1, a).@layer tokensβ custom properties (:root variables).@layer componentsβ .card, .button, .alert.@layer utilitiesβ Tailwind-style atomic classes.
Decide the order ONCE at the top of your main stylesheet. The rest of the project is conflict-free.
Browser support
All evergreen browsers since 2022. Safe everywhere.
π
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β card required, cancel anytime.
Sign up β free trial βFirst 10 lessons in each track are free. No card needed for those.