# Cascade Layers (Experimental) URL: /react/getting-started/styling/cascade-layers Source: https://github.com/daangn/seed-design/blob/dev/docs/content/react/getting-started/styling/cascade-layers.mdx CSS Cascade Layers를 사용하여 SEED 스타일의 우선순위를 제어하는 방법을 알아봅니다. Tailwind CSS 4 등 CSS Cascade Layer를 사용하는 CSS 프레임워크와 SEED 컴포넌트를 함께 사용할 때, 프레임워크의 유틸리티 클래스로 SEED 컴포넌트 스타일을 오버라이드하려면 다음과 같은 설정이 필요합니다. - `@layer` directive로 래핑된 버전의 SEED CSS 사용 - 레이어 간 적절한 우선순위 설정 CSS Cascade Layers는 Chrome 99+, Safari 15.4+, Firefox 97+ 이상에서 지원됩니다. ([Can I Use](https://caniuse.com/css-cascade-layers)) ## 개요 기본적으로 SEED CSS는 `@layer` 없이 제공됩니다. 이때 `@layer` directive 없이 정의된 unlayered 스타일은 layered 스타일보다 항상 높은 우선순위를 갖습니다. ([MDN](https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Cascade_layers#cascade_layer_precedence_order)) ```css /* SEED 컴포넌트 (unlayered) */ /* layered 스타일보다 우선순위를 가짐 */ .seed-floating-action-button__root { background: var(--seed-color-bg-brand-solid); } /* Tailwind 유틸리티 (layered) */ /* class="seed-floating-action-button__root bg-red-100" 사용 시 SEED 스타일이 우선순위를 가짐 */ @layer utilities { .bg-red-100 { background-color: var(--color-red-100); } } ``` 이 문제를 해결하기 위해 SEED는 `@layer`로 래핑된 CSS 파일을 별도로 제공합니다. ## 설정 ### base.css 대신 base.layered.css 사용 ```css title="style.css" @import "@seed-design/css/base.layered.css"; ``` ### 레이어 순서 커스터마이징 `seed-base` 및 `seed-components` 레이어와 다른 레이어의 선언 순서를 적절히 조절합니다. #### Tailwind CSS Tailwind CSS 4 사용 시 유틸리티 클래스를 사용하여 SEED 컴포넌트 스타일을 오버라이드하려면, `@layer` 선언에서 Tailwind `utilities` 레이어가 `seed-components` 레이어보다 높은 우선순위를 가지도록 설정해야 합니다. ```css @layer theme, base, seed-base, components, seed-components, utilities; ``` ### 번들러 설정 번들러의 module resolution 설정에 `seed-layered` condition을 추가하세요. 이 설정을 통해 SEED React 컴포넌트가 내부적으로 CSS를 import할 때, 자동으로 layered 버전을 사용합니다. ```ts title="vite.config.ts" import { defineConfig } from "vite"; export default defineConfig({ resolve: { conditions: ["seed-layered"], // [!code highlight] }, // ... }); ``` Vite `conditions` 옵션에 대해 알아봅니다. ```ts title="rsbuild.config.ts" import { defineConfig } from "@rsbuild/core"; export default defineConfig({ resolve: { conditionNames: ["seed-layered", "..."], // [!code highlight] }, // ... }); ``` Rsbuild `conditionNames` 옵션에 대해 알아봅니다. ```js title="webpack.config.js" module.exports = { resolve: { conditionNames: ["seed-layered", "..."], // [!code highlight] }, // ... }; ``` Webpack `conditionNames` 옵션에 대해 알아봅니다. #### Chunk Splitting 사용 시 레이어 순서 문제 번들러가 CSS를 여러 청크로 분리하는 경우, `@layer seed-components { ... }` 블록이 포함된 청크가 다른 `@layer` 선언보다 먼저 로드되면서 레이어 우선순위가 의도한 것과 달라질 수 있습니다. **HTML에 `@layer` 선언을 인라인**하여 모든 `` 태그보다 먼저 로드되도록 보장할 수 있습니다. [`transformIndexHtml`](https://vite.dev/guide/api-plugin#transformindexhtml) 플러그인 훅으로 ``의 맨 앞에 ` ``` ## SEED의 레이어 구조 SEED는 두 개의 레이어를 사용합니다. | 이름 | 내용 | 파일 | 비고 | | ----------------- | -------------------------- | ----------------------- | ------------------------------ | | `seed-base` | 디자인 토큰, 글로벌 스타일, keyframes | `base.layered.css` | 별도 import 필요 | | `seed-components` | 컴포넌트 스타일 | `recipes/*.layered.css` | SEED React 컴포넌트 사용 시 자동 import | ## 관련 문서 Tailwind CSS에서 SEED 토큰을 유틸리티 클래스로 사용하는 방법을 알아봅니다.