# Cascade layers (@layer)

Status: Baseline 2022 (Chrome 99, Safari 15.4, Firefox 97); widely available.  
Source: https://developer.mozilla.org/en-US/docs/Web/CSS/@layer  
Page: https://designforai.dev/css/cascade-layers

Declares ordered layers so later layers always win over earlier ones regardless of specificity. It ends specificity wars between resets, third-party CSS and components: a single-class override beats an `#id` selector in a lower layer.

## HTML

```html
<button class="fx-004" id="cta">Layered button</button>
```

## CSS

```css
@layer reset, vendor, components, overrides;
@layer vendor {
   #cta {
    background: #c0392b;
    color: #fff;
    border: 0;
    padding: 10px 18px
  }
}
@layer components {
   .fx-004 {
    background: #2563eb;
    border-radius: 8px;
    font: 600 15px system-ui
  }
}
@layer overrides {
   .fx-004 {
    background: #111
  }
}
.fx-004 :is(a,button,input,select,textarea):focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
```

Fallback: None needed in practice; all evergreen browsers support layers. Unlayered styles win over all layers, so keep everything in layers.

## Prompt

Organise the CSS into cascade layers declared once at the top: `@layer reset, base, components, utilities, overrides;`. Put third-party or generated CSS in a low layer (`@layer vendor`), components above it, and utilities last so they win without `!important`. Never leave rules unlayered except the `@layer` order statement itself.
