diff --git a/CHANGELOG.md b/CHANGELOG.md index fccae8e6f7a3..fa59703b512e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improve canonicalizations for `tracking-*` utilities ([#19827](https://github.com/tailwindlabs/tailwindcss/pull/19827)) - Fix crash due to invalid characters in candidate ([#19829](https://github.com/tailwindlabs/tailwindcss/pull/19829)) - Ensure query params in imports are considered unique resources when using `@tailwindcss/webpack` ([#19723](https://github.com/tailwindlabs/tailwindcss/pull/19723)) +- Collapse arbitrary values into shorthand utilities during canonicalization ([#19837](https://github.com/tailwindlabs/tailwindcss/pull/19837)) ## [4.2.2] - 2026-03-18 diff --git a/packages/tailwindcss/src/canonicalize-candidates.test.ts b/packages/tailwindcss/src/canonicalize-candidates.test.ts index fef9eee08008..c6d2068b7572 100644 --- a/packages/tailwindcss/src/canonicalize-candidates.test.ts +++ b/packages/tailwindcss/src/canonicalize-candidates.test.ts @@ -1310,3 +1310,34 @@ test( ) }, ) + +// https://github.com/tailwindlabs/tailwindcss/issues/19835 +test.each([ + // Arbitrary values should be collapsed to another arbitrary value + [ + ['px-[1.2rem]', 'py-[1.2rem]', 'text-left'], + ['text-left', 'p-[1.2rem]'], + ], + + // Arbitrary values could also be collapsed into a bare value + [ + ['px-[30.75rem]', 'py-[30.75rem]', 'text-left'], + ['text-left', 'p-123'], + ], +])( + 'collapse canonicalization works for arbitrary values', + { timeout }, + async (candidates, expected) => { + let designSystem = await designSystems.get(__dirname).get(css` + @import 'tailwindcss'; + `) + + let options: CanonicalizeOptions = { + collapse: true, + logicalToPhysical: true, + rem: 16, + } + + expect(designSystem.canonicalizeCandidates(candidates, options)).toEqual(expected) + }, +) diff --git a/packages/tailwindcss/src/canonicalize-candidates.ts b/packages/tailwindcss/src/canonicalize-candidates.ts index eaa055b25dd4..6f48f7c1c5b0 100644 --- a/packages/tailwindcss/src/canonicalize-candidates.ts +++ b/packages/tailwindcss/src/canonicalize-candidates.ts @@ -321,10 +321,7 @@ function collapseCandidates(options: InternalCanonicalizeOptions, candidates: st if (relevantProperties.size === 0) return result for (let parsedCandidate of parseCandidate(designSystem, candidate)) { - if ( - parsedCandidate.kind !== 'functional' || - parsedCandidate.value?.kind !== 'named' // Necessary for bare values - ) { + if (parsedCandidate.kind !== 'functional' || parsedCandidate.value === null) { continue }