From fd9393355a7b4a120e29b02995be2a3ee43e0b83 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Wed, 22 Oct 2025 06:56:55 -0400 Subject: [PATCH 1/4] Fix formatting --- packages/tailwindcss/src/canonicalize-candidates.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tailwindcss/src/canonicalize-candidates.ts b/packages/tailwindcss/src/canonicalize-candidates.ts index 996859c539cd..095625c365ab 100644 --- a/packages/tailwindcss/src/canonicalize-candidates.ts +++ b/packages/tailwindcss/src/canonicalize-candidates.ts @@ -1649,8 +1649,9 @@ function modernizeArbitraryValuesVariant( !isSingleSelector(target.nodes) || // [foo][bar] is considered a single selector but has multiple nodes target.nodes.length !== 1 - ) + ) { continue + } // Expecting a single attribute selector if (!isAttributeSelector(target.nodes[0])) continue From e4e4ad7eae74ffa30ab1d4ac1bd5d4d0a62b6802 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Wed, 22 Oct 2025 06:57:19 -0400 Subject: [PATCH 2/4] Fix canonicalization of `&_[attr]` arbitrary variants --- packages/tailwindcss/src/canonicalize-candidates.test.ts | 2 ++ packages/tailwindcss/src/canonicalize-candidates.ts | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/packages/tailwindcss/src/canonicalize-candidates.test.ts b/packages/tailwindcss/src/canonicalize-candidates.test.ts index 1e76a7b7cfa4..dab0fed1b3e2 100644 --- a/packages/tailwindcss/src/canonicalize-candidates.test.ts +++ b/packages/tailwindcss/src/canonicalize-candidates.test.ts @@ -846,6 +846,8 @@ describe.each([['default'], ['with-variant'], ['important'], ['prefix']])('%s', ['[&_>_[data-visible]]:flex', '*:data-visible:flex'], ['[&>*]:flex', '*:flex'], ['[&_>_*]:flex', '*:flex'], + ['[&_>_[foo]]:flex', '*:[[foo]]:flex'], + ['[&_[foo]]:flex', '**:[[foo]]:flex'], ['[&_[data-visible]]:flex', '**:data-visible:flex'], ['[&_*]:flex', '**:flex'], diff --git a/packages/tailwindcss/src/canonicalize-candidates.ts b/packages/tailwindcss/src/canonicalize-candidates.ts index 095625c365ab..fd8b862490cf 100644 --- a/packages/tailwindcss/src/canonicalize-candidates.ts +++ b/packages/tailwindcss/src/canonicalize-candidates.ts @@ -1797,6 +1797,15 @@ function modernizeArbitraryValuesVariant( }, // aria-[foo~="true"], aria-[foo|="true"], … } satisfies Variant) } + + // Arbitrary attributes + else { + replaceObject(variant, { + kind: 'arbitrary', + selector: target.value, + relative: false, + } satisfies Variant) + } } if (prefixedVariant) { From 4055cfa0915ad1020df812e3fc2117ea54788c73 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Wed, 22 Oct 2025 07:08:47 -0400 Subject: [PATCH 3/4] Add two more tests --- packages/tailwindcss/src/canonicalize-candidates.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/tailwindcss/src/canonicalize-candidates.test.ts b/packages/tailwindcss/src/canonicalize-candidates.test.ts index dab0fed1b3e2..bcf992a886ea 100644 --- a/packages/tailwindcss/src/canonicalize-candidates.test.ts +++ b/packages/tailwindcss/src/canonicalize-candidates.test.ts @@ -848,6 +848,8 @@ describe.each([['default'], ['with-variant'], ['important'], ['prefix']])('%s', ['[&_>_*]:flex', '*:flex'], ['[&_>_[foo]]:flex', '*:[[foo]]:flex'], ['[&_[foo]]:flex', '**:[[foo]]:flex'], + ['[&_>_[foo=bar]]:flex', '*:[[foo=bar]]:flex'], + ['[&_[foo=bar]]:flex', '**:[[foo=bar]]:flex'], ['[&_[data-visible]]:flex', '**:data-visible:flex'], ['[&_*]:flex', '**:flex'], From 5f56bacd95627cd29af2d2e41c796bb3240b959e Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Wed, 22 Oct 2025 07:43:31 -0400 Subject: [PATCH 4/4] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 375288258a2d..36966fdfd681 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Discard candidates with an empty data type ([#19172](https://github.com/tailwindlabs/tailwindcss/pull/19172)) +- Fix canonicalization of arbitrary variants with attribute selectors ([#19176](https://github.com/tailwindlabs/tailwindcss/pull/19176)) ## [4.1.15] - 2025-10-20