Alpha scope
DriftCSS is an early preview. APIs and CSS coverage will change. Stay on the npm alpha tag until 1.0.
Golden path
Using Vite with React + TypeScript. That is the only install this alpha. Other frameworks are coming soon.
Static className strings, static and mixed templates (static segments rewrite; ${x} stays), and static cn() / clsx() arguments (including leftover rewrite).
In scope today
| Area | Status |
|---|---|
| Vite plugin + React / TSX | Supported |
| Declaration-level atoms (dedupe across components) | Supported |
Shorthands → longhands, @media / @supports / @container | Supported |
Same-element &:hover, &::before / &::after | Supported |
| NestedDeclarations after a nested rule (still on the parent) | Supported |
Static cn() / clsx() fold and leftover rewrite | Supported |
Mixed `a ${x}` — static quasis rewrite, ${x} stays | Supported |
strict, stats, production purge | Supported |
preserveSelectors / noAtomize | Supported |
virtual:driftcss/classes typed map | Supported |
Vue static class="…" in <template> | Exists; not the launch surface |
Not yet
| Area | Notes |
|---|---|
| Next.js / SSR / RSC | No parity tests yet |
Vue :class / <style> / documented golden path | Static class= only |
Ancestor / theme context (.dark &) | Pass-through today |
Combinator atoms (& .child) | Pass-through |
Same-element compound nest (&.active) | Whole parent block pass-through (unlike &:hover) |
Classes inside @layer / @starting-style | Block serializes; inner .class is not atomized |
| VLQ source maps | Planned (sourceMap is file-level only) |
npm latest / 1.0 | Intentional — stay on alpha |
Known limitations
Pass-through and “not atomized” cases are intended current behavior, documented in docs/COVERAGE.md. The coverage matrix marks those as shipped pass-through, not open Gap rows — cargo test -p driftcss-core coverage_known_gaps prints nothing until a case is marked Gap.
Roadmap
Engineering backlog: docs/ROADMAP.md.