Tailwind CSS 4.3.3•React Native 0.87.1•StyleX 0.19.0

Conformance, measured against the originals

Each number below comes from compiling the same input through Hozo and through the thing it stands in for: Tailwind's own engine, the official StyleX Babel plugin, React Native's type definitions, and the ARIA roles in aria-query.

They are read from packages/tailwind-conformance/snapshot.json as committed. The report runs on every push to main and weekly, and a number that differs from the snapshot fails that run until the change is committed with a reason.

Tailwind on the Web

Hozo's CSS against Tailwind's for the same class, after both are normalised: custom properties resolved, calc() folded, shorthands expanded. A value that cannot be normalised with certainty is skipped, not guessed.

Curated classes124 / 124

A hand-picked slice of what app code uses. It shows the common path works; it is not a claim about Tailwind as a whole.

Full catalogue20,222 / 20,222

Every class Tailwind's design system lists, 23,286 entries. The rest produce no rule from Tailwind, or one that paints nothing until combined with another utility. 0 mismatches.

Arbitrary values2,762 / 2,845

0 mismatches. The rest paint nothing on their own. 467 of the matches are compared as text, because only a browser can reduce the value.

Variants29,403 / 29,403

Single and stacked, such as md:hover:flex. The selector and the at-rules around the rule are compared, not just its declarations.

Combined utilities3,074 / 3,074

Gradients and their stops, ring and shadow layers, the filter chain and transform axes, compared once they are put together.

Rule order20,310 / 20,310

Rules in the candidate stylesheet in the order Tailwind writes them, which decides who wins the cascade. 0 classes reached the DOM with no rule behind them.

Tailwind on iOS and Android

A class becomes a StyleSheet property, or the build names it and refuses it. The number that has to stay at zero is silent: a class that compiles to nothing without a diagnostic.

Curated classes119 / 124

4 refused with a diagnostic, 1 a deliberate no-op (whitespace-normal, which React Native already does), 0 silent.

Variants8,280 / 29,403

21,123 refused, 0 silent. 4,746 of the covered ones work only on some elements, such as a state variant on a Pressable; using one elsewhere is a build error.

Arbitrary values542 / 2,845

Most are CSS properties React Native has no key for, so 2,271 are refused. 0 silent.

Refusals checked10,000 / 10,029

Web-only refusals checked against React Native's types: confirmed impossible there. 28 are partly expressible, and 1 looks fully expressible and is flagged to be re-read.

Conditions and transitions40 / 40

Cases that need configuration or an interactive element, such as transitions and pressed-state transforms.

Type-checked output19,118

Style objects emitted for every catalogue class that matches on the Web, type-checked against React Native's own declarations. 0 rejected.

StyleX

Static stylex.create sheets, lowered by the same backends. The StyleX page has the rest of these numbers and compiled samples.

Property names505 / 522

Of every name StyleX's types publish. The other 17 are shorthands StyleX rejects by default, @font-face descriptors, or obsolete.

Universal134 / 134

Names React Native has, or has an exact compile-time equivalent for.

Scenarios271 / 271

Declarations whose Web output agrees with the official plugin. 0 silent failures.

Accessibility and diagnostics

Two halves: whether the checks stay quiet on correct code, and whether they speak at all. A check that cries wolf gets switched off; one that stopped firing looks like code with no defects.

ARIA roles, written correctly113

Every concrete role in aria-query: 83 static, 30 interactive. 0 raised a warning.

Diagnostics that fire32 / 34

Each provoked by a case. 0 stayed silent, 1 has no case yet, and 1 is a defensive branch nothing can reach.

Platform contracts56 / 56

Cases that compile one source through both backends and state what each must produce. They cover 76 of 76 primitives.

Without react-native-web20 / 20

Primitives checked to lower straight to DOM elements and CSS on the Web, and to React Native on iOS and Android, with no react-native-web in between.

Canvas and SVG filters

A canvas shape has a fill, a stroke, a stroke width and an opacity, so nearly every utility is refused there; what matters is that none is refused without saying so.

Canvas paint609 / 23,286

Catalogue utilities a canvas shape can paint. 0 silent, 0 painted with a value no canvas resolves.

Canvas, arbitrary values16 / 2,845

0 silent, 4 painted with a value no canvas resolves.

SVG filter elements10 / 26 Web, 10 / 10 Native

From react-native-svg 15.15.5's exports. API, compiler and import routing only: not prop parity, pixel equivalence or device rendering. Its 16 warning-only Native stubs are not counted. See packages/tailwind-conformance/src/svg-filters.test.ts.

Run it

pnpm --filter @hozo/tailwind-conformance report, after rebuilding the native addon. It prints each section with the classes behind every number that is not a match.

The harness on GitHub