Added
- Add
@tailwindcss/turbopack, a Turbopack loader for using Tailwind CSS with Next.js (#20367)
Fixed
- Ensure watch mode detects changes to symlinked
@sourcefiles whose real paths aren't otherwise scanned (#20356) - Ensure variants using
@scopewrap generated utilities instead of nesting inside them (#20369) - Ensure nested
@scoperules preserve their scoping semantics when flattened (#20369) - Preserve declarations directly inside
@scopeby wrapping them in:where(:scope)(#20369) - Ensure generated utilities include a space in empty
var()fallbacks (e.g.var(--tw-blur,)→var(--tw-blur, )) (#20373) - Canonicalization: convert arbitrary breakpoint and container query variants to named equivalents (e.g.
max-[64rem]:flex→max-lg:flex) (#20380) - Prevent
@tailwindcss/vitefrom crashing on every edit under Vite's experimentalbundledDevmode (#20379) - Ensure
@tailwindcss/oxidefalls back to WASM on platforms without native bindings (#20383) - Extract class candidates from Ruby
%wand%Wliterals using angle brackets or custom delimiters (e.g.%w<flex>,%w|flex|), including in Slim and Haml templates (#20387) - Preserve whitespace in
--default(…)values in functional@utilitydefinitions (e.g.--default(box alphabetic)no longer becomesboxalphabetic) (#20392) - Ensure automatic source detection respects negation-based
.gitignorefiles (e.g./*followed by!/…patterns) (#20397) - Ensure root
theme('…')namespace lookups in JavaScript plugins and config files return the full namespace object instead of the value of itsDEFAULTkey (#20399) - Skip ignored directories when generating watch globs instead of walking their contents on every rebuild (#20408)
- Drop invalid UTF-8 candidates during class detection (#20389)
- Prevent
@tailwindcss/vitefrom forcing full-page reloads for scanned files that Vite does not handle as modules (e.g..phpfiles) (#20414) - Canonicalization: don't merge utilities that reference different theme variables set to CSS-wide keywords like
unset(#20417) - Don't generate utilities when a modifier is used that would otherwise be silently ignored (e.g.
rounded-sm/[5],shadow-sm/foo,stroke-2/50) (#20419) - Preserve
and,or, andnotinside selectors insupports-[…]variants (e.g.supports-[selector(a:not(.foo))]:flex) (#20420) - Don't warn about Angular's
::ng-deepand:host-context()when optimizing CSS (#20434) - Don't generate CSS for candidates containing an empty additional modifier (e.g.
bg-red-500/50/andgroup-hover/foo//bar:flex) (#20466) - Ensure
min-*,max-*, and container query variants with decimal values are sorted numerically (e.g.min-[40.25rem]beforemin-[40.5rem]) (#20512) - Ensure CSS comments ending with
\*/are closed correctly instead of swallowing the CSS that follows (e.g./* C:\temp\*/) (#20508) - Improve style invalidation performance of
group-*andpeer-*variants (#20513) - Ensure cached compilers release their
loadModuleandloadStylesheetcallbacks after compilation (#20531) - Canonicalization: preserve
&when moving a pseudo-element into*or**(e.g.[&_::before]:flex→**:[&::before]:flex) (#20550) - Ensure the
Set.prototype.intersectionpolyfill incanonicalizeCandidates(…)returns the intersection instead of the first set on Node.js < 22 (#20562) - Canonicalization: ensure inline
theme(…)alphas with more than 2 decimals migrate to a percentage modifier with the same opacity (e.g.theme(colors.red.500/.12345)→text-red-500/[12.345%], nottext-red-500/[12.345]) (#20563) - Canonicalization: preserve inline
theme(…)alphas as an arbitrary percentage when a custom--opacity-*theme value would change the opacity (e.g.theme(colors.red.500/50%)→text-red-500/[50%]with--opacity-50: 10%) (#20563) - Ensure the
@propertyfallback isn't applied in Safari versions that no longer supportmargin-trim: inline(#20569) - Treat viewport units like
dvminandsviand font-relative units likecapandrexas lengths in arbitrary values (e.g.text-[10dvmin]generatesfont-sizeinstead ofcolor) (#20516) - Write plugin logs to stderr in
tailwindcss canonicalizeso they don't end up in the results on stdout (#20561) - Extract class shorthands on later lines when Pug text, comments, or quoted attribute values contain unbalanced brackets, or a quote that doesn't start a string (e.g.
input(pattern=/"/.source)) (#20547, #20572) - Underline the correct occurrence of an unsupported data type in
--value(…)warnings (#20554) - Canonicalization: prefer an existing candidate when collapsing utilities over another utility with the same default theme value (e.g.
text-foreground text-primary→text-primary, nottext-card-checked-border) (#20540) - Canonicalization: don't collapse utilities into a utility that uses another theme variable with the same default value (e.g.
mt-card mb-card→my-card, notmy-4) (#20574) - Ensure
@tailwindcss/postcssrewrites relativeurl(…)s of stylesheets that are inlined before it runs (e.g.@imports in Vite) in optimized builds (#20576) - Drop nested rules that put a combinator after a pseudo-element when using pseudo-element variants (e.g.
selection:*on a utility with a nested& > *rule) (#20575) - Don't generate CSS for arbitrary values with unbalanced parentheses or brackets (e.g.
w-[calc(1px]or[--x:a[b]) (#20577) - Canonicalization: prevent
collapse: truefrom taking exponentially longer when classes are linked through a utility that sets many properties (e.g.sr-only) (#20558) - Ensure
&is substituted inside:-moz-any(…)and:-webkit-any(…)in custom variants (e.g.@custom-variant firefox (:-moz-any(&));) (#20486) - Ensure the standalone macOS binaries have a valid code signature, so macOS 27 no longer kills them at launch (#20578)
- Ensure
@tailwindcss/turbopackand@tailwindcss/webpackrebuild when the input CSS changes (e.g.next devwith Turbopack no longer serves the CSS of the previous edit) (#20582) - Canonicalization: don't drop a utility that sets a
--tw-*variable when an unrelated property has the same value (e.g.link mt-4no longer becomesmt-4whenlinksetsmargin-top: 16pxand--tw-translate-x: 16px) (#20593) - Decode single-digit hexadecimal escapes in theme variable and
@utilitynames as the CSS spec does (e.g.@theme { --color-\0: red; }no longer registers--color-0) (#20591) - Don't treat
!importantinside strings, comments orurl()in declaration values as the important flag (e.g.content: "a !important b") (#20627) - Parse a custom property at the end of the input when it has no trailing
;(e.g.--foo: baras the last declaration) (#20653) - Keep a declaration without a
;at the end of the CSS input (e.g.color: red) (#20655)