NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #907 most downloaded on npm
A utility-first CSS framework for rapidly building custom user interfaces.
Last release 9 days ago
25 Sep 2026
Ships on a steady schedule
a new release about every 9 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
2661 releases · first in 2017
Pass extended color palette to theme closures so it can be used without installing Tailwind when using npx tailwindcss
npx tailwindcss (359252c)- is used as a custom separator (#4704)~ when stacking peer-* variants (#4757)purge if provided on the CLI (#4772)resolveConfig not being importable in Next.js pages (#4725)One column per quarter.
JIT: Reintroduce transform, filter, and backdrop-filter classes purely to create stacking contexts to minimize the impact of the breaking change
transform, filter, and backdrop-filter classes purely to create stacking contexts to minimize the impact of the breaking change (#4700)Recover from errors gracefully in CLI watch mode
I don't expect this will be a real problem for most people, but it's technically a breaking change which is why we've limited this improvment to the J…
Six weeks ago I didn't even have v2.2 on my roadmap and yet somehow here we are today, with one of the biggest Tailwind CSS feature releases of all-time?!
This release is loaded with tons of cool new stuff, mostly targeting the new Just-in-Time mode which unlocks so many cool ideas we probably couldn't have pulled off if we had to keep being mindful of the CSS file size in development.
To upgrade, install the latest version via npm:
npm install -D tailwindcss@latest
Note that we've had to make a couple small changes to the JIT engine as we've added features, fixed bugs, and improved the overall reliability, so make sure to read about the changes and deprecations when upgrading if you are using just-in-time mode.
<a name="new-features"></a>
<a name="all-new-improved-tailwind-cli"></a>
We've rewritten the Tailwind CLI tool from the ground-up with a performance-first mindset, while also adding support for a bunch of new features.
npx tailwindcss -o dist/tailwind.css --watch --jit --purge="./src/**/*.html"
Here are some of the highlights:
npx tailwindcss -o output.css to compile Tailwind from anywhere. You can even enable JIT mode with the --jit flag and pass in your content files using the --purge option, all without creating a config file.--minify flag.postcss.config.js file.It's fully backwards-compatible with the previous CLI, so if you've got any scripts set up already you should be able to upgrade to v2.2 without making any changes to your scripts.
Check out our updated Tailwind CLI documentation to learn more.
Note that if you were using the tailwindcss-cli wrapper package, you can safely switch to tailwindcss as we've managed to resolve the peer-dependency issues that forced us to create the wrapper package in the first place.
<a name="before-and-after-pseudo-element-variants"></a>
This feature is only available in Just-in-Time mode.
People have been asking for this for years and it's finally here! We've added first-party support for styling pseudo-elements like before and after:
<div class="before:block before:bg-blue-500 after:flex after:bg-pink-300"></div>
We set content: "" automatically any time you use a before or after variant to make sure the elements are rendered, but you can override it using the new content utilities which have full arbitrary value support:
<div class="before:content-['hello'] before:block ..."></div>
You can even grab the content from an attribute using the CSS attr() function:
<div before="hello world" class="before:content-[attr(before)] before:block ..."></div>
This can be super helpful when your content has spaces in it, since spaces can't be used in CSS class names.
<a name="first-letter-line-variants"></a>
This feature is only available in Just-in-Time mode.
We've added variants for the first-letter and first-line pseudo-elements, so you can do stuff like drop caps:
<p class="first-letter:text-4xl first-letter:font-bold first-letter:float-left">
The night was March 31, 1996, and it was finally time for Bret Hart to face off against Shawn
Michaels in the long anticipated Iron Man match — a 60 minute war of endurance where the man who
scored the most number of falls would walk away as the WWF World Heavyweight Champion.
</p>
<a name="selected-text-variants"></a>
This feature is only available in Just-in-Time mode.
We've added a new selection variant that makes it super easy to style highlighted to match your design:
<p class="selection:bg-pink-200">
After nearly a grueling hour of warfare with neither man scoring a fall, Hart locked in the
Sharpshooter, his signature submission hold. As Michaels screamed in pain, the crowd were certain
that Hart was about to walk away from WrestleMania XII as the still-World Heavyweight Champion.
</p>
We've even built this feature in such a way that it can be applied to a parent element and cascade down, so you can set a highlight color for your whole site by applying a utility to the body:
<body class="selection:bg-pink-200">
<!-- ... -->
<p>
But Michaels didn't give up — he held on until the bell rang and the designated 60 minutes was
up. Hart walked away content, thinking that without a clear winner, the title was his to hold.
He was not prepared for what would happen next, when Gorilla Monsoon declared the match would
continue under sudden death rules.
</p>
</body>
<a name="list-marker-variants"></a>
This feature is only available in Just-in-Time mode.
You can use the new marker variant to style the bullets or numbers at the beginning of a list:
<h1>WrestleMania XII Results</h1>
<ol class="marker:text-gray-500 marker:font-medium">
<li>
The British Bulldog, Owen Hart, and Vader defeated Ahmed Johnson, Jake Roberts, and Yokozuna
</li>
<li>Roddy Piper defeated Goldust</li>
<li>Stone Cold Steve Austin defeated Savio Vega</li>
<li>The Ultimate Warrior defeated Hunter Hearst Helmsley</li>
<li>The Undertaker defeated Diesel</li>
<li>Shawn Michaels defeated Bret Hart</li>
</ol>
Like the selection variant, we've implemented this in a way that it cascades from the parent, so you don't have to repeat it for each list item.
<a name="sibling-selector-variants"></a>
This feature is only available in Just-in-Time mode.
Tailwind CSS v2.2 adds new peer-* variants that behave much like the group-* variants, but for targeting sibling elements instead of parent elements.
This is useful for things like styling an element when a preceding checkbox is checked, doing things like floating labels, and lots more:
<label>
<input type="checkbox" class="peer sr-only">
<span class="h-4 w-4 bg-gray-200 peer-checked:bg-blue-500">
<!-- ... -->
</label>
Just like group can be combined with any other variant, peer can as well, so you have variants like peer-hover, peer-focus, peer-disabled, and loads more at your fingertips.
The generated CSS uses the general sibling combinator and looks like this:
.peer:checked ~ .peer-checked\:bg-blue-500 {
background-color: #3b82f6;
}
So just like in vanilla CSS, it will only work for targeting previous siblings, not siblings that appear later in the DOM.
<a name="exhaustive-pseudo-class-support"></a>
This feature is only available in Just-in-Time mode.
We've added variants for basically every single missing pseudo-class we could think of in this release:
only (only-child)first-of-typelast-of-typeonly-of-typetargetdefaultindeterminateplaceholder-shownautofillrequiredvalidinvalidin-rangeout-of-rangePersonal favorite in the list is placeholder-shown — when combined with the new sibling selector variants it makes it possible to do cool stuff like floating labels:
<div class="relative">
<input id="name" class="peer ...">
<label for="name" class="peer-placeholder-shown:top-4 peer-focus:top-0 ...">
</div>
<a name="shorthand-color-opacity-syntax"></a>
This feature is only available in Just-in-Time mode.
Instead of using utilities like bg-opacity-50, text-opacity-25, or placeholder-opacity-40, Tailwind CSS v2.2 gives you a new color opacity shorthand you can use to tweak the alpha channel of a color directly in the color utility itself:
- <div class="bg-red-500 bg-opacity-25">
+ <div class="bg-red-500/25">
This means you can now change the opacity of colors anywhere in Tailwind, even where we previously didn’t have specific opacity utilities, like in gradients for example:
<div class="bg-gradient-to-r from-red-500/50"></div>
The opacity values are taken from your opacity scale, but you can also use arbitrary opacity values using square bracket notation:
<div class="bg-red-500/[0.31]"></div>
If I'm being honest, I am more excited about never having to create another core plugin like placeholderOpacity.js for you people again than I am about actually using the feature. And I'm really excited about the feature, so that says something.
<a name="extended-arbitrary-value-support"></a>
This feature is only available in Just-in-Time mode.
We've gone over every core plugin in Tailwind to try and add the most flexible arbitrary value support we possibly could, and I think we've covered pretty much everything at this point.
You should be able to whatever arbitrary values you want, just about wherever you want:
<div class="col-start-[73] placeholder-[#aabbcc] object-[50%] ..."></div>
If you find one we missed, open an issue and we'll sort it out.
In addition to making arbitrary value support more comprehensive, we've also added a new type-hint syntax to handle ambiguous situations. For example, if you are using a CSS variable as an arbitrary value, it's not always clear what the generated CSS should be:
<!-- Is this a font size utility, or a text color utility? -->
<div class="text-[var(--mystery-var)]"></div>
Now you can provide a hint to the engine by prefixing the arbitrary value with the type name:
<div class="text-[color:var(--mystery-var)]"></div>
Currently, the supported types are:
lengthcoloranglelistWe'll probably flesh this out even more over time as people discover new edge cases but this should get you very far.
<a name="improved-nesting-support"></a>
Since Tailwind introduces a lot of non-standard CSS at-rules like @tailwind and @apply, you can often run into weird output when combining it with a PostCSS nesting plugin like postcss-nested or postcss-nesting.
To ease the pain here, we've included a new PostCSS plugin in the tailwindcss package that acts as a lightweight compatibility layer between existing nesting plugins and Tailwind itself.
So if you need nesting support in your project, use our plugin, and stick it before Tailwind in your PostCSS plugin list:
// postcss.config.js
module.exports = {
plugins: [
// ...
require('tailwindcss/nesting'),
require('tailwindcss'),
// ...
],
}
By default, it uses postcss-nested under the hood (since that's what we use to support nesting in Tailwind plugins), but if you'd like to use postcss-nesting instead, just call our plugin as a function and pass through the postcss-nesting plugin:
// postcss.config.js
module.exports = {
plugins: [
// ...
require('tailwindcss/nesting')(require('postcss-nesting')),
require('tailwindcss'),
// ...
],
}
Under the hood, this uses a new screen() function we've introduced that you can use to get the expanded media expression from any of your configured breakpoints:
/* Input */
@media screen(sm) {
/* ... */
}
/* Output */
@media (min-width: 640px) {
/* ... */
}
You probably won't need to use this yourself but it could be helpful if you're ever integrating Tailwind with another tool that understands @media but doesn't handle @screen properly.
- @screen sm { /* ... */ }
+ @media screen(sm) { /* ... */ }
<a name="caret-color-utilities"></a>
This feature is only available in Just-in-Time mode.
You can now set the color of the cursor in form fields using the new caret-{color} utilities:
<input class="caret-red-500" />
These are customizable using the caretColor key in the theme section of your tailwind.config.js file.
<a name="background-origin-utilities"></a>
We've added new utilities for the background-origin property, which let you control where an element's background is positioned relative to the element's border, padding box, or content:
<div class="bg-origin-border p-4 border-4 border-dashed ..." style="background-image: url(...)">
Background is rendered under the border
</div>
<div class="bg-origin-padding p-4 border-4 border-dashed ..." style="background-image: url(...)">
Background is rendered within the border but on top of any padding
</div>
<div class="bg-origin-content p-4 border-4 border-dashed ..." style="background-image: url(...)">
Background is rendered within any padding and under the content
</div>
Learn more in the background origin documentation.
<a name="simplified-transform-and-filter-composition"></a>
This feature is only available in Just-in-Time mode.
The transform, filter, and backdrop-filter classes are no longer necessary to "enable" their respective set of composable utilities.
- <div class="transform scale-50 filter grayscale backdrop-filter backdrop-blur-sm">
+ <div class="scale-50 grayscale backdrop-blur-sm">
Now those features are automatically enabled any time you use any of the relevant sub-utilities.
It's important to understand though that because these utilities aren't needed anymore, you can no longer expect transforms and filters to be "dormant" by default. If you were relying on conditionally "activating" transforms or filters by toggling these classes, you will want to make sure you are toggling the sub-utilities themselves instead:
- <div class="scale-105 -translate-y-1 hover:transform">
+ <div class="hover:scale-105 hover:-translate-y-1">
I don't expect this will be a real problem for most people, but it's technically a breaking change which is why we've limited this improvment to the JIT engine only.
<a name="per-side-border-color-utilities"></a>
This feature is only available in Just-in-Time mode.
Requested at least once a month for the last four years, I'm excited to share that we've finally added per-side border color support now that we don't have to sweat the development stylesheet size.
<div class="border-2 border-t-blue-500 border-r-pink-500 border-b-green-500 border-l-yellow-500">
<!-- ... -->
</div>
Go forth and build ugly websites! (Kidding, kidding, I know they are useful settle the hell down.)
<a name="built-in-safelist-transform-and-extract-support"></a>
We've added first-class support for a bunch of important PurgeCSS features and made them work in the JIT engine as well, which doesn't actually even use PurgeCSS.
First is safelist, which is super useful if you need to protect specific classes from being removed from your production CSS, perhaps because they are used in content that comes from a database or similar:
// tailwind.config.js
module.exports = {
purge: {
content: ['./src/**/*.html'],
safelist: [
'bg-blue-500',
'text-center',
'hover:opacity-100',
// ...
'lg:text-right',
],
},
// ...
}
Note that while the classic engine will accept regular expressions here, the JIT engine will not. That's because when we're generating classes on demand, the class doesn't exist until it's used so we have nothing to match the expression against. So if you're using just-in-time mode, make sure you're providing complete class names to get the expected result.
Next is transform, which lets you transform content for different file extensions before scanning it for potential class names:
// tailwind.config.js
let remark = require('remark')
module.exports = {
purge: {
content: ['./src/**/*.{html,md}'],
transform: {
md: (content) => {
return remark().process(content)
},
},
},
// ...
}
This is really useful if you have templates that are written in a language that compiles to HTML, like Markdown.
Finally we have extract, which lets you customize the logic that Tailwind uses to detect class names in specific file types:
// tailwind.config.js
module.exports = {
purge: {
content: ['./src/**/*.{html,md}'],
extract: {
pug: (content) => {
return /[^<>"'`\s]*/.match(content)
},
},
},
// ...
}
This is an advanced feature and most users won’t need it. The default extraction logic in Tailwind works extremely well for almost all projects.
For more information on these features, check out our optimizing for production documentation.
<a name="changes-and-deprecations"></a>
This release introduces a few small changes to the JIT engine that might impact you, and one deprecation:
matchUtilities API changes@tailwind screens for @tailwind variants in Just-in-Time modeIt also introduces two minor deprecations for both engines, which are non-breaking for now but will become breaking changes in v3.0 so you are encouraged to account for:
lightBlue for sky in the extended color paletteblur-0 for blur-none in the default theme<a name="new-dependency-tracking-system-for-just-in-time-mode"></a>
In Tailwind CSS v2.1, we tracked changes to your template files in just-in-time mode using our own separate watch process because most build tools were missing the APIs we needed to rebuild your CSS when template files changed using the watch system built-in to the build tool.
We've worked hard to make improvements to popular build tools over the past few months and change this, because using our own watch process makes builds prone to race conditions and very hard to debug problems.
So as of Tailwind CSS v2.2, the JIT engine relies on native dependency tracking in build tools by default, with an option to opt-in to the old system if your build tool doesn't support the APIs we need.
If you've followed along closely on GitHub or reported issues with watch mode, you may have seen us suggest using the TAILWIND_DISABLE_TOUCH=true flag — that mode is the default now in v2.2.
This new dependency tracking system is compatible with at least the following tools:
postcss-loader@^4)postcss-loader@^5)Tools with known incompatibilities include:
If you discover your build tool isn't yet compatible with the new dependency tracking system, you have two options:
Compile your CSS separately using the new Tailwind CLI. You can use packages like npm-run-all or concurrently to compile your CSS alongside your usual development command by adding some scripts to your project like this:
// package.json
{
// ...
"scripts": {
"dev": "npm-run-all --parallel dev:*",
"dev:server": "vite",
"dev:css": "tailwindcss -o src/tailwind.css -w",
"build": "tailwindcss -o src/tailwind.css && vite build",
"serve": "vite preview"
},
}
Set TAILWIND_MODE=watch to opt-in to the old dependency tracking system. If the previous default was working for you, this will let you just keep using that system until the build tool you're using has been updated to support the new system.
// package.json
{
// ...
scripts: {
// Set TAILWIND_MODE=watch when starting your dev server
"dev": "TAILWIND_MODE=watch vite",
// Do not set TAILWIND_MODE for one-off builds
"build": "vite build",
// ...
},
// ...
}
Note that setting TAILWIND_MODE=watch will start a long-running watch process in the background, so if you set that environment variable when trying to do a one-off build, it will look like the build is hanging. You should only set TAILWIND_MODE=watch when you are actually running a dev server/watch process.
<a name="transforms-and-filters-don-t-need-to-be-enabled-in-just-in-time-mode"></a>
The transform, filter, and backdrop-filter classes aren't necessary for "enabling" those features when using the JIT engine:
- <div class="transform scale-50 filter grayscale backdrop-filter backdrop-blur-sm">
+ <div class="scale-50 grayscale backdrop-blur-sm">
This means you can no longer expect transforms and filters to be dormant by default, and conditionally activated by adding transform, filter, or backdrop-filter.
Instead, you will want put any variants on the sub-utilities themselves:
- <div class="scale-105 -translate-y-1 hover:transform">
+ <div class="hover:scale-105 hover:-translate-y-1">
<a name="match-utilities-api-changes"></a>
matchUtilities API changesThe matchUtilities function that is used to register on-demand utilities in the JIT engine has changed significantly.
We consider this private API still which is why we haven't documented it, but I know a few sneaky people out there are playing with it anyways.
To understand how the API works in v2.2, read the pull request that explains the changes.
<a name="deprecate-tailwind-screens-for-tailwind-variants-in-just-in-time-mode"></a>
@tailwind screens for @tailwind variants in Just-in-Time modeIn the classic engine, all utility variants are injected as part of the @tailwind utilities directive.
In the JIT engine, variants like hover and focus are injected in the same place as your responsive variants, which has traditionally been the very end of the stylesheet, or at @tailwind screens if you've included it explicitly.
As of v2.2, the @tailwind screens directive has been renamed to @tailwind variants, since it is now the injection point for all variants, not just responsive variants.
This directive is optional (just like @tailwind screens always has been) and is only useful if you want explicit control over where utility variants are injected. By default, they are always injected at the very end of your stylesheet.
If you were using @tailwind screens before, you should update your code to use @tailwind variants:
@tailwind base;
@tailwind components;
@tailwind utilities;
- @tailwind screens;
+ @tailwind variants;
/* Some custom CSS... */
The @tailwind variants feature is considered an advanced escape hatch and we recommend omitting it by default. You should only use it if your project won't work properly without it, which is only ever really true if you are introducing Tailwind to a legacy system with a very fragile existing CSS codebase that has styles that absolutely need to be at the very end of the stylesheet for things to work.
<a name="deprecate-light-blue-for-sky-in-the-extended-color-palette"></a>
lightBlue for sky in the extended color paletteThe lightBlue color in the extended color palette has been renamed to sky. It was the only oddball color in the list without a fancy name (like emerald or rose) and we just couldn't stomach it anymore.
Using lightBlue will still work until v3.0, but you'll see a warning in the console suggesting you use the new name.
Note that it's totally okay to start using sky without actually updating your HTML, it's only at the place of import that the name matters:
// tailwind.config.js
let colors = require('tailwindcss/colors')
module.exports = {
theme: {
colors: {
// ...
- 'light-blue': colors.lightBlue,
+ 'light-blue': colors.sky,
}
}
}
<a name="deprecate-blur-0-for-blur-none-in-the-default-theme"></a>
blur-0 for blur-none in the default themeFor some unknown reason when I released Tailwind CSS v2.1 I thought blur-0 was a better name than blur-none, even though every other utility that uses a named size scale (like rounded-md and shadow-lg) use none, not 0.
In v2.2, we've added blur-none and stopped documenting blur-0. It still works, but it'll be removed from the default theme configuration in v3.0.
- <div class="blur-0">
+ <div class="blur-none">
<a name="fixes-and-improvements"></a>
Alongside the new features this release introduces, we've also fixed a bunch of little things that might have been bugging you.
Here's a list of the fixes and improvements we've made since the last release, with links to the relevant pull requests to learn more:
calc and var in arbitrary values (#4147)hsl colors to hsla when transforming for opacity support instead of rgba (#3850)backdropBlur variants not being generated (#4188)tailwind.config.js instead of the current working directory (#4214)border utility (#4277)@tailwind directives (2f15411)group variants (#4551)If you read this whole thing well damn, well done. Thanks as always for being part of the community and I hope you have fun with the new goodies!
JIT: Use "tracking" context by default instead of "watching" context for improved reliability with most bundlers (#4514)
Depending on which tooling you use, you may need to explicitly set TAILWIND_MODE=watch until your build runner has been updated to support PostCSS's dir-dependency message type.
background-origin utilities (#4117)@apply performance in projects that process many CSS sources (#3178)matchUtilities API to make it more suitable for third-party use (#4232)raw syntax in purge config (#4272)empty variant (#3298)modern-normalize to v1.1 (#4287)theme function internally, remove postcss-functions dependency (#4317)screen function to improve nesting plugin compatibility (#4318)@tailwind variants directive to replace @tailwind screens (#4356)dir-dependency messages in TAILWIND_DISABLE_TOUCH mode (#4388)before and after pseudo-element variants and content utilities (#4461)transform and extract APIs to simplify PurgeCSS/JIT customization (#4469)caret-color utilities (#4499)lightBlue to sky, emit console warning when using deprecated name (#4513)--watch mode, and more (#4526, 4558)peer-* variants for styling based on sibling state (#4556)safelist as a top-level option under purge for both JIT and classic engines (#4580)transform class when using classes like scale-*, rotate-*, etc. (#4604)filter and backdrop-filter classes when using classes like contrast-*, backdrop-blur-*, etc. (#4614)blur-none by default with intent to deprecate blur-0 (#4614)calc and var in arbitrary values (#4147)hsl colors to hsla when transforming for opacity support instead of rgba (#3850)backdropBlur variants not being generated (#4188)border utility (#4277)@tailwind directives (2f15411)group variants (#4551)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Skip raw PurgeCSS sources when registering template dependencies
raw PurgeCSS sources when registering template dependencies (#4542)Register PurgeCSS paths as PostCSS dependencies to guarantee proper cache-busting in webpack 5
Fix issue where JIT engine would generate the wrong CSS when using PostCSS 7
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix issue where JIT engine would fail to compile when a source path isn't provided by the build runner for the current input file
The first new feature update since Tailwind CSS v2.0 is here and loaded with lots of cool stuff!
The first new feature update since Tailwind CSS v2.0 is here and loaded with lots of cool stuff!
<a name="new-features"></a>
<a name="jit-engine-in-core"></a>
The brand-new JIT engine we announced in March has now been merged into core, and is available as an opt-in feature using a new mode option in your tailwind.config.js file:
// tailwind.config.js
module.exports = {
mode: 'jit',
purge: [
// ...
],
// ...
}
This feature is still in preview which means some details may change as we iron out the kinks, and it's not subject to semantic versioning.
If you were using @tailwindcss/jit before, you can now migrate to Tailwind CSS v2.1 instead, as that's where all new development on the engine will happen.
<a name="new-filter-and-backdrop-filter-utilities"></a>
filter and backdrop-filter utilities (#3923)This is a huge one — we've finally added first-class support for CSS filters!
They work a lot like our transform utilities, where you use filter to enable filters, and combine it with utilities like grayscale, blur-lg, or saturate-200 to compose filters on the fly.
Here's what filter looks like:
<div class="filter blur-md grayscale invert ...">
<!-- ... -->
</div>
...and here's what backdrop-filter looks like:
<div class="backdrop-filter backdrop-blur backdrop-brightness-50 ...">
<!-- ... -->
</div>
Check out the filter and backdrop-filter to learn more. We'll add a bunch of helpful visual examples there soon!
<a name="new-blending-mode-utilities"></a>
We've added brand new utilities for mix-blend-mode and background-blend-mode:
<div class="mix-blend-multiply ...">
<!-- ... -->
</div>
Check out the documentation to learn more.
<a name="new-isolation-utilities"></a>
isolation utilities (#3914)We've added new isolate and isolation-auto utilities for working with the isolation property:
<div class="isolate ...">
<!-- ... -->
</div>
This can be really helpful for scoping blending mode features or z-index adjustments and is super powerful. Check out the documentation to learn more.
I also highly recommend this great article by Josh Comeau to see it in action.
<a name="new-box-decoration-break-utilities"></a>
box-decoration-break utilities (#3911)We've added brand new utilities for the box-decoration-break property:
<div class="mix-blend-multiply ...">
<!-- ... -->
</div>
It's a bit of an obscure one but it can be really useful alongside text gradients. Learn more in our documentation and in the MDN article.
<a name="new-display-utilities"></a>
inline-table and list-item display utilities (#3563, #3929)We've added a couple display utilities we were missing:
<div class="inline-table ...">
<!-- ... -->
</div>
<div class="list-item ...">
<!-- ... -->
</div>
Maybe not quite as exciting as the rest but a welcome addition nonetheless.
mix-blend-mode and background-blend-mode utilities (#3920)box-decoration-break utilities (#3911)isolation utilities (#3914)inline-table display utility (#3563)list-item display utility (#3929)filter and backdrop-filter utilities (#3923)Nothing published for this version
Nothing published for this version
Pass full var(--bg-opacity) value as opacityValue when defining colors as functions
var(--bg-opacity) value as opacityValue when defining colors as functions (https://github.com/tailwindlabs/tailwindcss/commit/d98f2f829d2bca83e0d14a9e2680d6859f8f4d65)Ensure sourcemap input is deterministic when using @apply in Vue components
@apply in Vue components (#3356)theme() didn't work with colors defined as functions (#2919)dark variants by default for color opacity utilities (#2975)Fix issue with @apply not working as expected with !important inside an at-rule
Nothing, just the only thing I could do when I found out npm won't let me publish the same version under two tags.
Nothing published for this version
New @apply implementation, slight backwards incompatibilities with previous behavior
Tailwind CSS v2.0, woohoo!
Read the blog post for more details.
overflow-ellipsis and overflow-clip utilities (#1289)transform-gpu to force hardware acceleration on transforms when desired (#1380)inset plugin (#2630)translate, inset, and height plugins (#2630, 5259560)@apply with complex classes, including variants like lg:hover:bg-blue-500 (#2159)2xl breakpoint at 1536px by default (#2609)group-hover for color plugins, boxShadow, and textDecoration by default (28985b6, f6923b1)focus for z-index utilities by default (ae5b3d3)extend in variants configuration (#2651)max-w-prose class by default (#2574)extend (#2679, #2700)focus-within for all plugins that have focus enabled by default (1a21f072, f6923b1)ring utilities for creating outline/focus rings using box shadows (#2747, 879f088, e0788ef)5 and 95 to opacity scale (#2747)target feature and dropped any compatibility with IE 11 (#2571)shadow-outline, shadow-solid, and shadow-xs by default in favor of new ring API (#2747)normalize.css to modern-normalize (#2572)whitespace-no-wrap to whitespace-nowrap (#2664)flex-no-wrap to flex-nowrap (#2676)clearfix utility, recommend flow-root instead (#2766)hover and focus for fontWeight utilities by default (f6923b1)grid-gap fallbacks needed for old versions of Safari (5ec45fa)@apply implementation, slight backwards incompatibilities with previous behavior (#2159)theme retrieve the expected resolved value when theme value is complex (e13f083c4)truncate class to textOverflow core plugin (#2562)scrolling-touch and scrolling-auto utilities (#2573)text-6xl font-size to 3.75rem instead of 4rem (#2619)[hidden] elements within space and divide utilities instead of template elements (#2642)extend objects deeply by default (#2679)preserveHtmlElements option even when using custom PurgeCSS extractor (#2704)tw- to avoid collisions with end-user custom properties (#2771)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix issue where ring-offset-0 didn't work due to unitless 0 in calc function
ring-offset-0 didn't work due to unitless 0 in calc function (3de0c48)Don't override ring color when overriding ring width with a variant
Add scripts for generating a PostCSS 7 compatible build alongside PostCSS 8 version
~~All custom properties have been internally namespaced under tw- to avoid collisions with end-user custom properties (#2771)~~ I made a git booboo, c
tw- to avoid collisions with end-user custom properties (#2771)tw- to avoid collisions with end-user custom properties (#2771)Upgrade to PostCSS 8, Autoprefixer 10, move postcss and autoprefixer to peerDependencies
postcss and autoprefixer to peerDependencies (729b400)Remove clearfix utility, recommend flow-root instead
clearfix utility, recommend flow-root instead (#2766)Don't crash when color palette is empty
black and white have been added to colors.js
Remove grid-gap fallbacks needed for old versions of Safari
grid-gap fallbacks needed for old versions of Safari (5ec45fa)Enable focus, focus-within, and dark variants (when enabled) for all ring utilities by default
focus, focus-within, and dark variants (when enabled) for all ring utilities by default (e0788ef)Added ring-inset utility for rendering rings as inset shadows
Enable focus-within for outline utilities by default
focus-within for outline utilities by default (f6923b1)focus-within for ringWidth utilities by default (f6923b1)group-hover for boxShadow utilities by default (f6923b1)group-hover and focus-within for textDecoration utilities by default (f6923b1)hover and focus for fontWeight utilities by default (f6923b1)Add support for default duration and timing function values whenever enabling transitions
Prevent boxShadow utilities from overriding ring shadows added by components like in the custom forms plugin
boxShadow utilities from overriding ring shadows added by components like in the custom forms plugin (c3dd3b6)Convert none to 0 0 #0000 when used for shadows to ensure compatibility with ring utilities
none to 0 0 #0000 when used for shadows to ensure compatibility with ring utilities (4eecc27)Added 5 and 95 to opacity scale
Added shadow-solid utility, a 2px solid shadow that uses the current text color
Add percentage-based height values
Revert upgrading to PostCSS 8 lol (we'll still migrate to PostCSS 8 before release... maybe.)
Your coding agent can read these notes before it upgrades. Set up the MCP server →