Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -554,7 +554,7 @@ type SupportAnswer =
| { kind: 'invalid-query'; diagnostics: readonly Diagnostic[] };
```

A declaration with any supported row answers `needs-context`, listing its contexts. A candidate's optional `note` names the environment its claim is limited to, as in explanations. A declaration with no row answers `unsupported`. On ios or android, a declaration on the not-applicable list (`profiles/not-applicable-native.ts`, today `cursor` and `scroll-behavior`) answers `not-applicable`, and so does a resolved query of that property once its element is found: the native output leaves it out and reports `DRAGON_NOT_APPLICABLE_NATIVE` (info); it is never counted as supported. API change (NA-NATIVE): `not-applicable` is a new `SupportAnswer` member, so a consumer that switches over every kind must handle it. An android possibilities query needs `{ kind: 'android', minSdk }` with an integer from 31 to 36. Today it answers `unsupported` for every declaration, because no android row is proven.
A declaration with any supported row answers `needs-context`, listing its contexts. A candidate's optional `note` names the environment its claim is limited to, as in explanations. A declaration with no row answers `unsupported`. On ios or android, a declaration on the not-applicable list (`profiles/not-applicable-native.ts`, today `cursor`, `scroll-behavior`, `-webkit-tap-highlight-color`, `-webkit-font-smoothing`, `text-size-adjust` and `-webkit-text-size-adjust`, `forced-color-adjust`, `-webkit-user-drag`, and `print-color-adjust` and `-webkit-print-color-adjust`) answers `not-applicable`, and so does a resolved query of that property once its element is found: the native output leaves it out and reports `DRAGON_NOT_APPLICABLE_NATIVE` (info); it is never counted as supported. API change (NA-NATIVE): `not-applicable` is a new `SupportAnswer` member, so a consumer that switches over every kind must handle it. An android possibilities query needs `{ kind: 'android', minSdk }` with an integer from 31 to 36. Today it answers `unsupported` for every declaration, because no android row is proven.

```ts
export function querySupport<K extends string>(query:
Expand Down
13 changes: 11 additions & 2 deletions packages/dragon/src/profiles/not-applicable-native.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// Owner ruling NA-NATIVE (notes/PM-2026-10-04.md): the reviewed list of CSS properties with no visible or behavioural effect on
// touch-native iOS and Android. On native the compiler emits nothing for an entry and reports DRAGON_NOT_APPLICABLE_NATIVE (info);
// the web target still refuses it until a Chrome proof exists. Nothing is not-applicable by default: anything off this list is
// refused as before. Reviewed and left off: scrollbar-width and -webkit-appearance (visible on native); will-change (transform makes
// a containing block and stacking context, analysis/paint-values/transform.ts); color-scheme (dark changes the UA colours,
// refused as before. Reviewed and left off: text-rendering (optimizeSpeed turns off kerning and ligatures); break-*, orphans and
// widows (they fragment columns too); scrollbar-width and -webkit-appearance (visible on native); will-change (transform makes a
// containing block and stacking context, analysis/paint-values/transform.ts); color-scheme (dark changes the UA colours,
// ua/datasets.ts); ::-webkit-slider-thumb (its appearance decides how a range paints, forms/appearance.ts); ::-moz-range-thumb
// (Chrome drops it, so Dragon already drops the rule on every target); scrollbar-color and ::-webkit-scrollbar* rules (several
// common forms hide the scrollbar, which is visible on native; deferred).
Expand All @@ -12,6 +13,14 @@ export type NotApplicableEntry = { readonly name: string; readonly reason: strin
export const NOT_APPLICABLE_NATIVE: readonly NotApplicableEntry[] = [
{ name: 'cursor', reason: 'it sets the mouse pointer shape, and a touch screen has no pointer' },
{ name: 'scroll-behavior', reason: 'it only animates scrolls that script, fragment links or focus start, and the native output starts none' },
{ name: '-webkit-tap-highlight-color', reason: 'it colours the flash a mobile browser draws over a tapped link, and native views draw no such flash' },
{ name: '-webkit-font-smoothing', reason: 'browsers honour it only on macOS, and iOS and Android text keeps the platform antialiasing' },
{ name: 'text-size-adjust', reason: 'it only limits the text inflation of mobile browsers, and the native output inflates no text' },
{ name: '-webkit-text-size-adjust', reason: 'it only limits the text inflation of mobile browsers, and the native output inflates no text' },
{ name: 'forced-color-adjust', reason: 'it only matters in forced colors mode, which neither iOS nor Android has' },
{ name: '-webkit-user-drag', reason: 'it decides whether a mouse drag of an element starts a drag and drop, and native views start none' },
{ name: 'print-color-adjust', reason: 'it only decides whether printing keeps backgrounds, and the native output is never printed' },
{ name: '-webkit-print-color-adjust', reason: 'it only decides whether printing keeps backgrounds, and the native output is never printed' },
];

/** The list entry for a property name (ASCII lower case), or null when it is not on the list. */
Expand Down
15 changes: 14 additions & 1 deletion packages/dragon/test/not-applicable-native.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ const NATIVE = { ios: { minimum: '15.0' }, android: { minSdk: 31 } } as const;
const CASES: Record<string, string> = {
cursor: '.a { cursor: pointer; }',
'scroll-behavior': '.a { scroll-behavior: smooth; }',
'-webkit-tap-highlight-color': '.a { -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }',
'-webkit-font-smoothing': '.a { -webkit-font-smoothing: antialiased; }',
'text-size-adjust': '.a { text-size-adjust: 100%; }',
'-webkit-text-size-adjust': '.a { -webkit-text-size-adjust: none; }',
'forced-color-adjust': '.a { forced-color-adjust: none; }',
'-webkit-user-drag': '.a { -webkit-user-drag: none; }',
'print-color-adjust': '.a { print-color-adjust: exact; }',
'-webkit-print-color-adjust': '.a { -webkit-print-color-adjust: exact; }',
};

function compile(css: string, targets: object) {
Expand Down Expand Up @@ -49,7 +57,10 @@ describe('the not-applicable list', () => {
it('has a test document for exactly the listed entries, each with a reason', () => {
expect(NOT_APPLICABLE_NATIVE.map((e) => e.name).sort()).toEqual(Object.keys(CASES).sort());
for (const e of NOT_APPLICABLE_NATIVE) expect(e.reason.length, e.name).toBeGreaterThan(20);
expect(NOT_APPLICABLE_NATIVE.map((e) => e.name)).toEqual(['cursor', 'scroll-behavior']);
expect(NOT_APPLICABLE_NATIVE.map((e) => e.name)).toEqual([
'cursor', 'scroll-behavior', '-webkit-tap-highlight-color', '-webkit-font-smoothing', 'text-size-adjust', '-webkit-text-size-adjust',
'forced-color-adjust', '-webkit-user-drag', 'print-color-adjust', '-webkit-print-color-adjust',
]);
});

for (const [name, extra] of Object.entries(CASES)) {
Expand Down Expand Up @@ -108,6 +119,8 @@ describe('off the list, a declaration or rule is still refused on every target',
'scrollbar-width (hides scroll indicators)': '.a { scrollbar-width: none; }',
'-webkit-appearance (changes form controls)': '.a { -webkit-appearance: none; }',
'color-scheme (changes the UA colours)': '.a { color-scheme: dark; }',
'text-rendering (optimizeSpeed turns off kerning and ligatures)': '.a { text-rendering: optimizeSpeed; }',
'break-inside (fragments columns, not only pages)': '.a { break-inside: avoid; }',
'::-webkit-slider-thumb (decides how a range paints)': '.a::-webkit-slider-thumb { width: 16px; }',
'::-webkit-scrollbar-corner (not listed)': '.a::-webkit-scrollbar-corner { background: red; }',
'scrollbar-color (deferred: common forms hide the scrollbar)': '.a { scrollbar-color: red blue; }',
Expand Down
6 changes: 3 additions & 3 deletions packages/tailwind-sweep/snapshot/summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
| target | supported | refused | invalid | mismatch | not applicable on native |
|---|---:|---:|---:|---:|---:|
| web | 4287 (18.4%) | 18998 (81.6%) | 1 | 0 | 0 |
| ios | 4260 (18.3%) | 18987 (81.5%) | 1 | 0 | 38 |
| android | 4260 (18.3%) | 18987 (81.5%) | 1 | 0 | 38 |
| ios | 4260 (18.3%) | 18985 (81.5%) | 1 | 0 | 40 |
| android | 4260 (18.3%) | 18985 (81.5%) | 1 | 0 | 40 |

As published (before the shell pre-pass), the sheet compiles for web 0, ios 0 and android 0 of 23286 utilities.

Expand All @@ -29,7 +29,7 @@ As published (before the shell pre-pass), the sheet compiles for web 0, ios 0 an
| transforms | 680 | 10 / 670 / 0 / 0 / 0 | 10 / 670 / 0 / 0 / 0 | 10 / 670 / 0 / 0 / 0 |
| interactivity | 1246 | 4 / 1242 / 0 / 0 / 0 | 4 / 1204 / 0 / 0 / 38 | 4 / 1204 / 0 / 0 / 38 |
| svg | 6 | 0 / 6 / 0 / 0 / 0 | 0 / 6 / 0 / 0 / 0 | 0 / 6 / 0 / 0 / 0 |
| accessibility | 4 | 0 / 4 / 0 / 0 / 0 | 0 / 4 / 0 / 0 / 0 | 0 / 4 / 0 / 0 / 0 |
| accessibility | 4 | 0 / 4 / 0 / 0 / 0 | 0 / 2 / 0 / 0 / 2 | 0 / 2 / 0 / 0 / 2 |

## Largest refusal groups (first blocking diagnostic)

Expand Down
8 changes: 4 additions & 4 deletions packages/tailwind-sweep/snapshot/tailwind-4.3.3.json
Original file line number Diff line number Diff line change
Expand Up @@ -2318,7 +2318,7 @@
{"u":"animate-ping","r":"animate","c":"transitions-animation","web":["refused","DRAGON_UNSUPPORTED_VALUE","value animation: var(--animate-ping) is unsupported: ANIM-b1 does not substitute var()","var(--animate-ping)",4],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE","DRAGON_UNSUPPORTED_PROPERTY"]},
{"u":"animate-pulse","r":"animate","c":"transitions-animation","web":["refused","DRAGON_UNSUPPORTED_VALUE","value animation: var(--animate-pulse) is unsupported: ANIM-b1 does not substitute var(","var(--animate-pulse)",4],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE","DRAGON_UNSUPPORTED_PROPERTY"]},
{"u":"animate-spin","r":"animate","c":"transitions-animation","web":["refused","DRAGON_UNSUPPORTED_VALUE","value animation: var(--animate-spin) is unsupported: ANIM-b1 does not substitute var()","var(--animate-spin)",4],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE","DRAGON_UNSUPPORTED_VALUE"]},
{"u":"antialiased","r":"antialiased","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property -webkit-font-smoothing","-webkit-font-smoothing: antialiased",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"antialiased","r":"antialiased","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property -webkit-font-smoothing","-webkit-font-smoothing: antialiased",0],"ios":["refused","DRAGON_UNSUPPORTED_PROPERTY","property -moz-osx-font-smoothing","-moz-osx-font-smoothing: grayscale",0],"android":"=ios","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"appearance-auto","r":"appearance-auto","c":"interactivity","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property appearance","appearance: auto",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"appearance-none","r":"appearance-none","c":"interactivity","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property appearance","appearance: none",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"aspect-auto","r":"aspect","c":"layout","web":["refused","DRAGON_UNSUPPORTED_VALUE","profile aspect-ratio:auto","aspect-ratio:auto",6],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
Expand Down Expand Up @@ -8152,8 +8152,8 @@
{"u":"font-stretch-ultra-condensed","r":"font-stretch-ultra-condensed","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property font-stretch","font-stretch: ultra-condensed",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"font-stretch-ultra-expanded","r":"font-stretch-ultra-expanded","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property font-stretch","font-stretch: ultra-expanded",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"font-thin","r":"font","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property font-weight","font-weight: var(--font-weight-thin)",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"forced-color-adjust-auto","r":"forced-color-adjust-auto","c":"accessibility","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property forced-color-adjust","forced-color-adjust: auto",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"forced-color-adjust-none","r":"forced-color-adjust-none","c":"accessibility","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property forced-color-adjust","forced-color-adjust: none",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"forced-color-adjust-auto","r":"forced-color-adjust-auto","c":"accessibility","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property forced-color-adjust","forced-color-adjust: auto",0],"ios":["na-native","forced-color-adjust: auto"],"android":"=ios","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"forced-color-adjust-none","r":"forced-color-adjust-none","c":"accessibility","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property forced-color-adjust","forced-color-adjust: none",0],"ios":["na-native","forced-color-adjust: none"],"android":"=ios","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"from-0%","r":"from","c":"backgrounds","with":["bg-conic","from-amber-50"],"web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property background-image","background-image: conic-gradient(var(--tw-gradient-stops))",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"from-5%","r":"from","c":"backgrounds","with":["bg-conic","from-amber-50"],"web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property background-image","background-image: conic-gradient(var(--tw-gradient-stops))",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"from-10%","r":"from","c":"backgrounds","with":["bg-conic","from-amber-50"],"web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property background-image","background-image: conic-gradient(var(--tw-gradient-stops))",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
Expand Down Expand Up @@ -21585,7 +21585,7 @@
{"u":"stroke-zinc-800","r":"stroke","c":"colours","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property stroke","stroke: var(--color-zinc-800)",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"stroke-zinc-900","r":"stroke","c":"colours","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property stroke","stroke: var(--color-zinc-900)",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"stroke-zinc-950","r":"stroke","c":"colours","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property stroke","stroke: var(--color-zinc-950)",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"subpixel-antialiased","r":"subpixel-antialiased","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property -webkit-font-smoothing","-webkit-font-smoothing: auto",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"subpixel-antialiased","r":"subpixel-antialiased","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property -webkit-font-smoothing","-webkit-font-smoothing: auto",0],"ios":["refused","DRAGON_UNSUPPORTED_PROPERTY","property -moz-osx-font-smoothing","-moz-osx-font-smoothing: auto",0],"android":"=ios","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"tab-2","r":"tab","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property tab-size","tab-size: 2",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"tab-4","r":"tab","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property tab-size","tab-size: 4",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
{"u":"tab-8","r":"tab","c":"typography","web":["refused","DRAGON_UNSUPPORTED_PROPERTY","property tab-size","tab-size: 8",0],"ios":"=web","android":"=web","published":["DRAGON_UNSUPPORTED_AT_RULE"]},
Expand Down
Loading