btn btn-primary처럼 이름 붙은 CSS 클래스를 HTML 아무 태그에나 붙이면 버튼·카드·모달·드롭다운 같은 완성된 UI 조각이 나온다. 그래서 React든 Vue든 Svelte든, 심지어 순수 HTML이든 프레임워크를 가리지 않는다.
<details>, :target, 최신 <dialog>/popover API 같은 순수 CSS 기법으로 동작한다. 테마 시스템도 OKLCH 색공간과 CSS 커스텀 프로퍼티(변수)만으로 35개 내장 테마를 라이브 전환한다.
saadeghi/daisyui · 제작 Pouya Saadeghi · 라이선스 MIT · 최신 버전 5.7.6 · Tailwind CSS v4 전용 플러그인 · Bun 모노레포(패키지 6개) · 컴포넌트 CSS 파일 61개 · 내장 테마 35개 · 최신 커밋 a89ba4e, 2026-07-29)
Tailwind CSS는 bg-blue-500 hover:bg-blue-600 text-white font-semibold py-2 px-4 rounded-lg처럼 작은 유틸리티 클래스를 조합해 스타일을 만드는 방식이다. 강력하지만, 버튼 하나를 만들 때마다 이 긴 조합을 반복해야 한다. daisyUI는 이 조합들을 미리 만들어 btn btn-primary 같은 의미 있는 이름으로 묶어 제공하는 Tailwind 플러그인이다.
기술적으로는 @plugin "daisyui"; 한 줄을 CSS 파일에 추가하는 것이 전부다. React 프로젝트든, Rails·Laravel·WordPress 같은 서버 렌더링 프로젝트든, 순수 HTML 파일이든 클래스 이름만 그대로 옮겨 쓸 수 있다. 컴포넌트 로직(state)이 없고 오직 CSS 규칙만 있기 때문이다.
Tailwind CSS는 소금·설탕·기름을 낱개로 파는 재료 가게에 가깝다. 원하는 대로 다 만들 수 있지만, 버튼 하나 만들 때마다 매번 레시피(클래스 조합)를 처음부터 써야 한다.
daisyUI는 그 가게 안에 이미 조리된 반찬 코너를 하나 놓아준 것이다. btn-primary라는 이름표가 붙은 통을 집기만 하면 끝난다. 그래도 재료 가게(Tailwind)는 그대로 있어서, 반찬에 유틸리티 클래스로 양념을 더 치는 것도 자유다.
daisyUI는 오래된 프로젝트지만, 최근 두 가지 큰 흐름과 정확히 맞물리며 다시 주목받고 있다.
Tailwind CSS v4는 tailwind.config.js 같은 JS 설정 파일 대신, CSS 파일 안에서 @import·@plugin 같은 지시어로 설정하는 방식으로 크게 바뀌었다. daisyUI 5는 이 변화에 맞춰 완전히 다시 쓰였고, 설치가 @plugin "daisyui"; 한 줄로 끝난다. "config 파일 자체가 필요 없다"는 v4의 철학을 가장 잘 보여주는 대표 플러그인 사례로 자주 언급된다.
React 생태계가 번들 크기·수화(hydration) 비용에 예민해지면서, "인터랙션까지 CSS만으로 되는 컴포넌트"에 대한 관심이 커졌다. daisyUI의 모달·드롭다운·탭은 자바스크립트 없이 브라우저 내장 기능(<dialog>, :has(), 체크박스 트릭)만으로 동작해, 정적 사이트·서버 렌더링 위주 프로젝트에서 특히 부담이 적다.
daisyUI는 저장소 안에 Claude Code·Cursor·Codex·Grok용 공식 스킬/플러그인 매니페스트(.claude-plugin, .cursor-plugin 등)를 함께 배포한다. 이 스킬의 설명 문구는 "HTML이나 JSX 코드를 생성할 때는, 사용자가 명시적으로 요청하지 않아도 트리거하라"다. 즉 AI가 UI 코드를 생성할 때 daisyUI 클래스 이름을 기본값처럼 쓰도록 스스로를 등록해 둔 것이다. "AI가 코드를 짜는 시대"에 자신을 그 코드 생성 파이프라인 안에 미리 심어둔 셈이다.
Tailwind 생태계 안에서도 daisyUI는 순수 CSS 클래스 이름을 파는 쪽이다. shadcn/ui처럼 React 소스 코드를 통째로 복사해 오는 방식이나, Chakra UI처럼 완전한 JS 컴포넌트 라이브러리와는 접근 자체가 다르다. 자세한 비교는 10번 섹션에서 다룬다.
Tailwind CSS 자체는 아주 강력하지만, 초보자가 실제로 부딪히는 문제는 세 가지로 요약된다. daisyUI는 이 세 가지를 CSS 레벨에서 해결한다.
순수 Tailwind로 버튼을 만들면 inline-flex items-center justify-center rounded-lg bg-blue-600 px-4 py-2 font-semibold text-white shadow hover:bg-blue-700 focus:outline-none focus:ring-2처럼 클래스가 끝없이 늘어난다. 프로젝트 전체에서 버튼 스타일을 통일하려면 이 조합을 그대로 복사·붙여넣기 해야 하고, 나중에 색을 바꾸려면 모든 곳을 찾아 고쳐야 한다.
daisyUI는 이 조합 전체를 .btn·.btn-primary 같은 미리 컴파일된 CSS 규칙으로 대신 제공한다. 클래스 개수가 줄어드는 건 부수 효과일 뿐이고, 진짜 핵심은 "버튼이라는 개념 하나가 CSS 파일 한 곳에 정의돼 있다"는 유지보수성이다.
Tailwind의 기본 색상은 blue-500, red-600처럼 구체적인 색상값이다. "이 프로젝트의 주요 강조색"이라는 의미는 코드 어디에도 남지 않는다. 다크 모드나 브랜드 색을 바꾸려면 blue-500이 쓰인 곳을 전부 찾아 green-500으로 바꿔야 한다.
daisyUI는 primary·secondary·accent·neutral·base-100 같은 의미 기반 색상 이름을 CSS 변수로 제공한다. 실제 색상값은 테마 하나에만 정의돼 있어서, 테마를 통째로 바꾸면 사이트 전체 색이 한 번에 바뀐다.
버튼 크기 5단계, 여백 규칙, 모서리 둥글기, 그림자 깊이 같은 것들을 프로젝트마다 새로 정의하는 건 지루하고 실수가 잦다. daisyUI는 35개 완성된 테마와, 크기·반경·테두리 굵기를 담당하는 공통 토큰(--radius-box, --size-field 등)을 미리 갖춘 채로 제공해, "디자인 시스템을 0에서 설계하는" 초기 비용 자체를 없앤다.
--color-primary처럼 --로 시작하는, 브라우저가 직접 이해하는 변수. 프로그래밍 언어의 변수처럼 한 곳에서 값을 바꾸면 그 변수를 참조하는 모든 CSS 규칙에 반영된다. daisyUI 테마 전체가 이 변수들의 묶음이다.
저장소는 Bun 워크스페이스 모노레포(bun@1.3.14, workspaces: ["packages/*"])로, packages/ 아래 6개 패키지가 있다. 실제로 npm에 배포되는 것은 이 중 딱 하나, packages/daisyui뿐이다. 나머지는 문서·플레이그라운드·부가 도구다.
구조가 말해주는 것은 명확하다. "CSS 소스(src/) → 빌드 스크립트(functions/) → 배포용 결과물"이라는 전형적인 CSS 라이브러리 파이프라인이고, 여기에 문서 사이트와 AI 에이전트 연동이라는 두 축이 나란히 붙어 있다. 실제 컴포넌트가 "어떻게 만들어지는지"는 다음 5번 섹션에서 자세히 뜯어본다.
daisyUI를 이해하는 데 가장 중요한 사실 하나: 이 저장소에 있는 것은 손으로 쓴 CSS 소스(src/*.css)와, 그것을 가공하는 빌드 스크립트뿐이다. React 컴포넌트도, 상태 관리도 없다. "잘 만든 CSS 라이브러리가 실제로 어떻게 빌드되는가"를 배우기에 아주 좋은 실물 사례다.
CSS의 오래된 골칫거리는 "나중에 쓴 클래스가 이긴다"는 로드 순서 의존성이다. btn-primary 다음에 btn-outline을 썼는지, 그 반대인지에 따라 결과가 달라지면 유지보수가 악몽이 된다. daisyUI는 이 문제를 최신 CSS의 @layer(캐스케이드 레이어) 기능으로 정면 돌파한다.
button.css 원본을 보면 규칙마다 @layer daisyui.l1.l2.l3처럼 레이어 이름이 박혀 있다. 기본 형태는 가장 낮은 레이어에, 색상 지정(btn-primary)은 l2에, 테두리 스타일 변형(btn-outline, btn-ghost)은 더 높은 레이어에 둔다. 브라우저는 레이어 우선순위로 승자를 정하기 때문에, HTML에 클래스를 어떤 순서로 나열하든 결과가 항상 똑같다.
서류 결재 도장의 "직급"이라고 생각하면 쉽다. 도장을 어느 순서로 찍었는지가 아니라, 도장 자체의 직급(레이어)이 최종 결재권을 정한다. 사원 도장을 부장 도장보다 나중에 찍어도, 부장 도장이 이긴다. daisyUI는 CSS 규칙마다 이 "직급"을 미리 매겨 둬서, 클래스를 어떤 순서로 써도 항상 같은 결과가 나오게 만든다.
packages/daisyui/build.js는 functions/ 안의 스크립트 30여 개를 순서대로 호출하는 오케스트레이터다. 사람이 src/components/button.css 한 파일만 손으로 쓰면, 빌드 과정이 그 뒤에서 훨씬 많은 일을 대신 해준다.
| 빌드 함수 | 하는 일 |
|---|---|
generateThemeFiles | src/themes/*.css(변수 나열)를 테마별 CSS 파일 + theme/*/object.js(JS 객체)로 동시에 변환 |
generateThemesObject | 35개 테마 객체를 전부 모아 하나의 JSON으로 합치고, TypeScript 타입 선언(.d.ts)까지 자동 생성 |
generateColorRules | primary·accent 등 색상 이름마다 bg-*·text-*·border-* 유틸리티를, 반응형 접두어(sm:~2xl:)·상태(hover:, focus:, active:)까지 조합해 대량으로 자동 생성 |
generateChunks / packCss | base·components·utilities·colors를 정해진 순서로 이어붙여 daisyui.css(완제품 한 장) 조립 |
minify / cleanCss | lightningcss로 최종 압축 및 정리 |
extractClasses | 컴포넌트별로 실제 생성된 클래스 이름 목록을 class.json으로 뽑아냄(문서·AI 스킬 자동완성에 사용, npm 패키지에는 제외됨) |
즉 src/components/button.css 한 파일은 실제로는 수백~수천 줄의 색상 유틸리티, 테마별 변형, 압축본으로 불어난 뒤에야 사용자에게 도달한다. "작은 소스 → 빌드 타임에 자동 증식"이라는 패턴은 대규모 CSS 라이브러리를 유지보수 가능하게 만드는 핵심 기법이다.
daisyUI 테마 하나의 실체는 다음과 같은 OKLCH 색상값 목록이다(light.css 전체):
--color-*는 배경·글자·강조 다섯 가지 의미 색(primary·secondary·accent·neutral·상태색)에 대해, 색 자체(-primary)와 그 색 위에 놓을 글자색(-content)을 항상 쌍으로 정의한다는 점이 핵심이다. 컴포넌트 CSS는 var(--color-primary)만 참조하므로, 테마를 바꾸는 것 = 이 변수 목록 20여 줄을 통째로 교체하는 것일 뿐이다. 버튼·카드·모달 CSS는 단 한 줄도 안 바뀐다.
#3b82f6)와 달리, 같은 밝기 값이면 어떤 색상이든 사람 눈에 비슷한 밝기로 보인다. 그래서 "이 색의 글자색은 이 밝기로" 같은 계산을 프로그램이 안정적으로 할 수 있어, 테마 자동 생성에 적합하다.
@plugin "daisyui" { themes: light --default, dark --prefersdark; }처럼 쓰는 이 설정은 functions/pluginOptionsHandler.js가 처리한다. 이 함수는 "light --default" 같은 문자열을 테마 이름 + 플래그로 쪼갠 뒤, --default면 :root 선택자에, --prefersdark면 @media (prefers-color-scheme: dark) 안에, 그 외에는 [data-theme="이름"] 선택자에 테마 변수를 꽂아 넣는다. "테마 전환에 자바스크립트가 필요 없는 이유"가 바로 여기 있다 — 전환은 CSS 선택자(data-theme 속성, 라디오 :checked)가 담당하고, 값 자체는 빌드 시점에 이미 CSS 안에 다 박혀 있다.
모달(modal.css)을 열어보면 &:popover-open, &::backdrop, &:target, .modal-toggle:checked + & 같은 선택자가 나온다. 이것들은 daisyUI가 만든 게 아니라 HTML5/CSS 표준 자체의 기능이다.
| 컴포넌트 | 쓰는 브라우저 기능 |
|---|---|
| 모달(modal) | 네이티브 <dialog>/popover 속성 + ::backdrop 의사 요소, 또는 체크박스 :checked 트릭 |
| 드롭다운(dropdown) | :focus-within, popover API |
| 접기(collapse) | HTML5 <details>/<summary> 태그 |
| 탭·스와이프 | 라디오 버튼 :checked + 형제 선택자 |
즉 daisyUI의 "인터랙티브 컴포넌트"는 버튼 클릭 이벤트를 자바스크립트로 감지해 스타일을 바꾸는 것이 아니라, 애초에 그 상태를 표현할 수 있는 HTML 요소·CSS 의사 클래스를 골라 쓰고 그 상태에 대응하는 스타일만 CSS로 정의한 것이다. 그래서 daisyUI 패키지 안에는 런타임 자바스크립트 파일이 하나도 없다.
daisyUI는 포커스 트랩(모달 밖 탭 이동 막기), 복잡한 키보드 내비게이션, 콤보박스 같은 정교한 접근성(a11y) 상태 관리 로직은 제공하지 않는다. 그런 로직이 필요한 요소(콤보박스, 커맨드 팔레트 등)는 별도 자바스크립트를 직접 작성하거나 다른 라이브러리를 붙여야 한다.
daisyUI가 대신해주는 것은 어디까지나 "보이는 스타일"이다. "겉모습을 맡기고, 복잡한 동작 로직은 직접 채운다"는 분업 구조를 헷갈리면 안 된다.
daisyUI 패키지(packages/daisyui/package.json)를 열어 보면 놀라운 점이 있다. dependencies 항목도, peerDependencies 항목도 아예 없다. Tailwind CSS 위에서만 의미가 있는 플러그인인데도, npm 차원에서 "Tailwind CSS가 필요하다"고 명시하지 않는다. 대신 functions/plugin.js라는 파일에서 Tailwind의 플러그인 등록 방식(plugin.withOptions)을 자체적으로 아주 작게 재구현해 쓴다. 그만큼 런타임에서 실행되는 코드가 최소한
| 영역 | 스택 |
|---|---|
| 패키지 매니저 | Bun 1.3.14 — 모노레포 워크스페이스 관리 + bun test로 테스트 실행 |
| 대상 프레임워크 | Tailwind CSS 4.3.3 전용(v3 이하는 daisyUI 4 계열 사용) — @tailwindcss/cli, @tailwindcss/vite |
| CSS 처리 | lightningcss(고속 파서·압축기, Rust 기반) · postcss + postcss-js(CSS ↔ JS 객체 변환) · postcss-selector-parser |
| 색상 계산 | culori — OKLCH 색상값을 다루고, 배경색에 어울리는 글자색(content 색)을 프로그램적으로 계산하는 데 사용 |
| 코드 스타일 | prettier + prettier-plugin-tailwindcss(클래스 이름 자동 정렬) + prettier-plugin-svelte |
| 린트 | oxlint(Rust 기반 고속 린터) |
| 문서 사이트 | SvelteKit — 다국어 번역 스크립트(lang:add/prune/validate/report) 자체 보유 |
| AI 연동 | .claude-plugin/.cursor-plugin/.codex-plugin/.grok-plugin 매니페스트 + packages/blueprint(유료 MCP 서버) |
버전의 진실원(source of truth)은 packages/daisyui/package.json의 "version" 필드 하나다. 저장소에서 직접 index.js 소스를 열어 보면 맨 윗줄이 const version = ""로, 빈 문자열이다. 릴리스 스크립트(functions/updateVersion.js)가 배포 직전에 이 줄을 package.json의 버전으로 덮어써서 npm에 올라가는 실제 패키지에만 버전 문자열이 채워진다. master 브랜치의 날것 소스와 npm에 실제로 배포된 코드가 이 한 줄만큼은 다르다는 뜻이다.
| 항목 | 요구사항 |
|---|---|
| 필수 조건 | Node.js + Tailwind CSS v4(@tailwindcss/vite 등 v4 계열 도구). Tailwind v3 프로젝트는 daisyUI 4 버전을 써야 한다 |
| 패키지 설치 | npm i -D daisyui@latest(pnpm·yarn·bun·deno도 동일한 형태로 지원) |
| CSS 설정 | 메인 CSS 파일에 @import "tailwindcss"; 다음 줄에 @plugin "daisyui"; 추가 — 이게 전부 |
| 빌드 없이 쓰기 | CDN <link href="https://cdn.jsdelivr.net/npm/daisyui@5"> + <script src=".../@tailwindcss/browser@4"> 두 줄로 설치 없이 바로 사용 가능 |
| 지원 프레임워크 튜토리얼 | 공식 문서에 Vite·React·Next.js·SvelteKit·Laravel·Rails(Phoenix)·WordPress·Astro류 포함 20개 이상 프레임워크별 설치 가이드 보유 |
| 테스트/CI | bun install --frozen-lockfile → bun run --bun build → bun test(34개 테스트 파일) → 문서 사이트 번역 검증 및 빌드까지 GitHub Actions로 자동 실행 |
daisyUI 5는 Tailwind v4 전용이다. 인터넷에서 찾은 오래된 블로그 글이 tailwind.config.js의 plugins: [require("daisyui")] 방식을 보여준다면, 그건 daisyUI 4 이하 버전 이야기다. v5에서 그대로 따라 하면 플러그인이 아예 로드되지 않는다.
Vite 프로젝트를 만들고 Tailwind CSS와 daisyUI를 함께 설치한다.
Vite 설정 파일에 Tailwind 플러그인을 등록하고,
메인 CSS 파일에는 딱 두 줄만 적으면 준비가 끝난다.
이제 어떤 HTML 태그에도 daisyUI 클래스를 바로 붙일 수 있다. 색상 이름·크기 이름을 조합하는 방식이다.
Tailwind의 다른 유틸리티 클래스(mt-4, w-full 등)와 자유롭게 섞어 써도 된다. daisyUI 클래스도 결국 Tailwind 플러그인이 만든 CSS 클래스일 뿐이라, 우선순위 레이어 규칙(5번 섹션) 안에서 자연스럽게 공존한다.
<html> 태그에 data-theme 속성만 바꾸면 사이트 전체 색이 바뀐다.
테마는 중첩이 자유롭다 — 페이지 전체는 다크, 특정 섹션만 라이트로 강제하는 식의 부분 테마 적용이 별도 자바스크립트 없이 CSS 선택자만으로 된다. 사용할 테마 목록은 @plugin "daisyui" { themes: light --default, dark --prefersdark, cupcake; }처럼 CSS 안에서 관리한다.
내장 테마 35개로 부족하면, 같은 색상 변수 목록을 직접 채워 새 테마를 등록할 수 있다.
5번 섹션에서 본 것처럼, 이 블록이 결국 빌드된 light.css와 구조가 완전히 같은 CSS 변수 목록이라는 걸 알면 전혀 낯설지 않다.
daisyUI 5는 클래스 이름을 대거 바꾸거나 없앴다. 예를 들어 artboard phone-1은 완전히 삭제됐고(w-[320px] h-[568px] 같은 Tailwind 유틸리티로 직접 대체해야 함), avatar 컴포넌트의 online/offline/placeholder는 avatar-online/avatar-offline/avatar-placeholder로 이름이 바뀌었으며, btm-nav(하단 내비게이션)는 아예 dock 컴포넌트로 대체됐다.
Tailwind는 존재하지 않는 클래스 이름을 써도 에러를 내지 않는다 — 그냥 스타일이 안 붙을 뿐이다. 그래서 오래된 튜토리얼을 그대로 베끼면 "따라 했는데 왜 안 예쁘게 나오지?"라는 상황이 아무 경고 없이 발생한다.
daisyUI 패키지에는 peerDependencies가 없다(6번 섹션 참고). 그래서 Tailwind CSS v3 프로젝트에 실수로 daisyUI 5를 설치해도 npm은 경고하지 않는다. @plugin 문법 자체가 Tailwind v4의 기능이라, v3 프로젝트에서는 이 지시어를 이해하지 못해 스타일이 통째로 안 먹는 방식으로 문제가 드러난다.
모달·드롭다운은 :has(), popover 속성, ::backdrop, @starting-style 같은 비교적 최근에 표준화된 CSS 기능으로 동작한다(5번 섹션). 자바스크립트 폴백이 없기 때문에, 이런 기능을 지원하지 않는 구형 브라우저에서는 전환 애니메이션이 없거나 컴포넌트 자체가 정상 동작하지 않을 수 있다. "JS가 없다"는 장점의 이면이다.
daisyUI를 빌드하면 처음 한 번, 🌼 daisyUI 5.7.6 같은 배너가 콘솔에 찍힌다. 소스 코드(pluginOptionsHandler.js)를 보면 이 문자열이 atob(...)(Base64 디코딩)로 조합돼 있어 처음 보면 수상한 디버그 코드처럼 보이지만, 그냥 버전을 알려주는 의도된 배너다. 프로세스당 한 번만 출력되도록 firstRun 플래그로 관리된다. 에러가 아니니 지우려고 애쓸 필요 없다.
daisyUI CSS 패키지 자체는 MIT 라이선스로 완전히 무료다. 하지만 저장소 안의 packages/blueprint(AI 에이전트용 MCP 서버)는 플러그인 매니페스트에 스스로 "유료 라이선스 필요(Needs paid license)"라고 명시돼 있다. 같은 저장소, 같은 제작자라고 해서 모든 것이 같은 조건으로 무료라고 오해하면 안 된다.
Tailwind 생태계에서 "예쁜 UI를 빨리 만드는" 방법은 daisyUI 말고도 여러 갈래가 있다. 핵심 차이는 "완제품을 어떤 형태로 받는가"다.
| 도구 | 받는 형태 | 런타임 JS | 커스터마이징 방식 |
|---|---|---|---|
| daisyUI | CSS 클래스 이름(btn btn-primary) | 없음(CSS만) | 테마 CSS 변수 교체, 또는 Tailwind 유틸리티 추가 |
| shadcn/ui | React + Radix 컴포넌트 소스 코드 자체를 복사해 내 저장소에 붙여넣음 | 있음(Radix의 상태·접근성 로직) | 내가 소유한 코드를 직접 수정(진짜 "내 코드"가 됨) |
| Flowbite | Tailwind 클래스 + 별도 JS 파일(바닐라 또는 React/Vue/Svelte 빌드) | 있음(드롭다운·모달 제어용 자체 JS) | 무료/Pro 티어로 나뉜 완성 블록 붙여넣기 |
| Preline UI | Tailwind 클래스 + Preline JS 플러그인 로드 필요 | 있음 | Flowbite와 유사한 블록형, 무료/Pro 병행 |
| Chakra UI | 완전히 독립된 React 컴포넌트 라이브러리(자체 스타일 엔진) | 있음(컴포넌트 로직 전체 내장) | JS 테마 객체로 설정 — Tailwind와 무관 |
daisyUI는 이미 완성된 옷을 그대로 입는 것(클래스 이름만 붙이면 끝, 옷 자체는 못 뜯어고침 대신 가볍다)이고, shadcn/ui는 옷본(패턴)을 통째로 받아 내 재봉틀로 직접 박음질하는 것(자유도는 최대, 대신 그 코드의 유지보수 책임도 내가 진다)이다. Chakra UI는 기성복 브랜드 매장에서 사이즈만 골라 사는 것에 가깝다 — Tailwind와 무관하게 자체 스타일링 방식을 쓴다.
결론적으로 daisyUI가 가장 앞서는 지점은 "가벼움 + 프레임워크 무관성"이고, 대신 포기하는 지점은 "복잡한 컴포넌트의 내장 접근성·상태 로직"이다. 콤보박스·커맨드 팔레트처럼 정교한 키보드 상호작용이 필요한 위젯을 자주 만든다면 Radix 기반(shadcn/ui) 쪽이, 순수 마크업 위주 사이트를 프레임워크 상관없이 빠르게 꾸미고 싶다면 daisyUI 쪽이 유리하다.
daisyUI는 "Tailwind CSS의 유틸리티 클래스를, 의미 있는 이름으로 미리 조합해 둔 CSS 전용 플러그인"이다. React 컴포넌트도, JS 위젯 라이브러리도 아니며, 캐스케이드 레이어와 CSS 변수라는 두 가지 표준 CSS 기능만으로 테마 시스템과 프레임워크 무관성을 동시에 달성한다. 인터랙티브해 보이는 컴포넌트조차 브라우저 내장 기능만으로 동작해 런타임 자바스크립트가 사실상 0이라는 점이 가장 큰 개성이다.
이런 경우 잘 맞는다:
이런 경우엔 다른 선택지가 더 맞는다: