Cascade 는 역사적으로 specificity 의 군비 경쟁이었어. @layer 가 명시적 cascade 순서 줘서 전쟁 끝내는 네이티브 CSS feature. Tailwind v4 가 그 위에 빌드.
@layer 가 뭐
@layer 가 cascade 안 이름 붙은 그룹 만듦. 뒤쪽 이름 레이어의 룰이 specificity 무관하게 앞쪽 이김. @layer reset, base, components, utilities; 가 명시적 순서 선언 — utilities 안의 어떤 것도 components 안의 어떤 것 이김, components selector 가 더 길어도.
Tailwind v4 가 레이어 셋 사용
@import "tailwindcss" 하면 Tailwind 가 내부적으로 레이어 셋 셋업: theme (@theme 의 CSS 변수), base (브라우저 reset, 디폴트), components (본인 컴포넌트 클래스 슬롯), utilities (bg-brand, p-4 클래스). 순서 고정; 슬롯에 추가.
레이어에 추가하는 이유
때때로 Tailwind 유틸리티만으론 부족 — CSS 여러 줄 가진 이름 붙은 컴포넌트 클래스 필요 (예: 애니메이션 keyframe, 복잡한 pseudo-element). @layer components 에 두면 Tailwind 의 예상 cascade 위치에 앉음. 그 후 JSX 에서 여전히 유틸리티로 override 가능 (`
탈출구
레이어 밖에 룰 쓰면 layered 룰 전부 뒤에 land — 기본적으로 모든 걸 이긴다는 뜻 (unlayered 룰이 layer 안 없으니까). 컴포넌트 CSS 에 피해 — @layer components 써. 라이브러리 자체 룰 이겨야 하는 진짜 글로벌 (서드파티 widget override) 에만 reserve.
.foo.foo.foo { color: red !important; } 써본 적 있으면 layer 가 답. 올바른 레이어에 룰 두면 cascade 깨끗하게 해결.