flutterbits

Coverage — Tailwind & shadcn

What flutterwindcss covers versus Tailwind CSS and shadcn/ui — what's built, what's delegated, and the small set that's genuinely impossible in Flutter.

flutterwindcss re-creates Tailwind's styling vocabulary and shadcn's token system on Flutter's widgets layer. It deliberately doesn't clone every utility — it builds the things that matter and aren't a hard add, delegates a few to existing solutions, and is honest about the tiny set Flutter genuinely can't express. Here's exactly where it stands.

vs Tailwind CSS

~96% of daily-driver Tailwind v4 utilities are built — verified against the full v4 catalog. Two properties make effective coverage even higher: arbitrary values are native (Tailwind needs w-[37px]; here you just write .w(37)), and bgGradient/shadow are pass-through (any Gradient or List<BoxShadow> works, so radial/conic gradients and arbitrary shadows already do).

✅ Built — everything you reach for daily

Spacing & sizing

padding/margin (directional), w/h/min/max, fractional, aspect, square

Color & backgrounds

bg, text color, gradients + direction sugar, bg-image

Borders & radius

per-edge width/color, dashed/dotted, per-corner radius, named sugar

Typography

size/weight/leading/tracking/align, family, line-clamp/truncate, text-shadow

Effects & filters

shadow (+sugar), ring, opacity, blur + backdrop-blur, the 7 color filters, object-fit

Transforms

2D + 3D (rotate-x/y, perspective) + skew + origin, mix-blend-mode

Layout

flex, real CSS-grid, stack/positioned, scroll + scroll-snap, divide

Variants

responsive + container queries, hover/focus/pressed/disabled, group/peer

🟡 Not built yet — feasible, by demand

Each has a known Flutter mechanism and is scheduled when a real need appears — none is a daily-driver and none is a wall: inset-shadow/inset-ring, mask-*, backdrop color filters, columns, negative margins, scroll-margin/scroll-padding/overscroll-behavior, scroll-snap-stop/-type, scrollbar-gutter, order, bg-clip-text (gradient text), background-blend-mode, bg-repeat-space/-round, the drop-shadow filter, sticky, position: fixed, font-stretch, border-double, text-indent, vertical-align, word-break, and the 3D-transform completion set (backface-visibility, perspective-origin, transform-style/preserve-3d, scale-z). The full item-by-item enumeration (with Flutter mechanisms) lives in the engine's coverage & roadmap spec.

Shipped in 1.0.3: theme-resolved font-sans/-serif/-mono (+ FwTheme applies the theme font), overline, object-position (fit(..., alignment:)), and the scrollbar trackColor.

↪️ Delegated by design

Not the engine's job:

WantUse instead
Element animation — transition/duration/ease/delay, animate-spin/pulse/bounce, enter/exitflutter_animate — a mature, Material-free chaining API (Curves.* ↔ CSS easings)
prose, forms, table-layout, SVG fill/stroke/stroke-width, user-select, accent-color, caret-color, resize, sr-onlythe flutterbits component layer

🚫 Genuinely impossible in Flutter

No faithful analog exists (a small, honest set): the true CSS cascade (and the open-ended child/descendant selectors */**/[&:…]), pseudo-elements ::before/::after + content (and placeholder/marker/selection/first-line…), float/clear, touch-action, text-wrap: balance/pretty, auto hyphenation, bg-attachment: fixed, font-smoothing, underline-offset, print, and text-transform as a render-time style.

Variants

The variant system mirrors Tailwind's: you declare when a rule applies and the engine resolves it lazily. The daily-driver variants are first-class:

States

hover · focus · pressed (active) · disabled — Material-free sourcing

Responsive

sm…2xl viewport + @sm…@2xl container queries (two distinct axes)

Relations

group-* and peer-* (hover/focus/pressed/disabled), incl. named

Composition

stacking (md:hover:), arbitrary values + breakpoints, RTL/LTR free

For states your component owns — checked, required, open, valid, a custom toggle — use whenState(WidgetState.…, …): it's the faithful path for any injected boolean state. Structural index variants (first/last/odd/nth) resolve at the list-building site, where you own child order.

By demand (feasible, not yet built): focus-within/focus-visible, has-*/not-*/in-*, aria-*/data-*/supports-* (bridged to whenState), and the media variants motion-safe/-reduce, portrait/landscape, contrast-more/-less (a MediaQuery-backed resolver condition).

By design, dark is theme-level, not a per-utility dark: variant — a whole-theme swap (FwAnimatedTheme + dark tokens) reskins everything from one switch, which is the semantic-token model's whole point.

vs shadcn/ui

shadcn is three layers. Here's where each lands in this project:

shadcn layerflutterwindcssGap
Design tokens (CSS variables)All 32 semantic tokens baked in — 19 core + chart-1…5 + 8 sidebar-*None
Theming (semantic indirection, light/dark)context.fw indirection, light/dark, FwAnimatedTheme crossfade — plus theme portability: paste any tweakcn/shadcn theme → theme.dartNone — this exceeds shadcn
Components (button, dialog, card…)The flutterbits layer (copy-paste registry + CLI)Not built yet — the next track

The short version

flutterwindcss fully covers shadcn's design-token and theming foundation — and the theme generator is a trick shadcn itself doesn't have. The component library is the deliberate gap, owned by flutterbits (the registry + CLI), which is what's next.

Next steps

On this page