Tailwind CSS v4
Core Changes
CSS-first configuration: Configuration is now done in CSS instead of JavaScript
Use
@themedirective in CSS instead oftailwind.config.jsExample:
@import "tailwindcss"; @theme { --font-display: "Satoshi", "sans-serif"; --breakpoint-3xl: 1920px; --color-avocado-500: oklch(0.84 0.18 117.33); --ease-fluid: cubic-bezier(0.3, 0, 0, 1); }
Legacy
tailwind.config.jsfiles can still be imported using the@configdirective:@import "tailwindcss"; @config "../../tailwind.config.js";CSS import syntax: Use
@import "tailwindcss"instead of@tailwinddirectives- Old:
@tailwind base; @tailwind components; @tailwind utilities; - New:
@import "tailwindcss";
- Old:
Package changes:
- PostCSS plugin is now
@tailwindcss/postcss(nottailwindcss) - CLI is now
@tailwindcss/cli - Vite plugin is
@tailwindcss/vite - No need for
postcss-importorautoprefixeranymore
- PostCSS plugin is now
Native CSS cascade layers: Uses real CSS
@layerinstead of Tailwind's custom implementation
Theme Configuration
CSS theme variables: All design tokens are available as CSS variables
- Namespace format:
--category-name(e.g.,--color-blue-500,--font-sans) - Access in CSS:
var(--color-blue-500) - Available namespaces:
--color-*: Color utilities likebg-red-500andtext-sky-300--font-*: Font family utilities likefont-sans--text-*: Font size utilities liketext-xl--font-weight-*: Font weight utilities likefont-bold--tracking-*: Letter spacing utilities liketracking-wide--leading-*: Line height utilities likeleading-tight--breakpoint-*: Responsive breakpoint variants likesm:*--container-*: Container query variants like@sm:*and size utilities likemax-w-md--spacing-*: Spacing and sizing utilities likepx-4andmax-h-16--radius-*: Border radius utilities likerounded-sm--shadow-*: Box shadow utilities likeshadow-md--inset-shadow-*: Inset box shadow utilities likeinset-shadow-xs--drop-shadow-*: Drop shadow filter utilities likedrop-shadow-md--blur-*: Blur filter utilities likeblur-md--perspective-*: Perspective utilities likeperspective-near--aspect-*: Aspect ratio utilities likeaspect-video--ease-*: Transition timing function utilities likeease-out--animate-*: Animation utilities likeanimate-spin
- Namespace format:
Simplified theme configuration: Many utilities no longer need theme configuration
- Utilities like
grid-cols-12,z-40, andopacity-70work without configuration - Data attributes like
data-selected:opacity-100don't need configuration
- Utilities like
Dynamic spacing scale: Derived from a single spacing value
- Default:
--spacing: 0.25rem - Every multiple of the base value is available (e.g.,
mt-21works automatically)
- Default:
Overriding theme namespaces:
- Override entire namespace:
--font-*: initial; - Override entire theme:
--*: initial;
- Override entire namespace:
New Features
Container query support: Built-in now, no plugin needed
@containerfor container context@sm:,@md:, etc. for container-based breakpoints@max-md:for max-width container queries- Combine with
@min-md:@max-xl:hiddenfor ranges
3D transforms:
transform-3denables 3D transformsrotate-x-*,rotate-y-*,rotate-z-*for 3D rotationscale-z-*for z-axis scalingtranslate-z-*for z-axis translationperspective-*utilities (perspective-near,perspective-distant, etc.)perspective-origin-*utilitiesbackface-visibleandbackface-hidden
Gradient enhancements:
- Linear gradient angles:
bg-linear-45(renamed frombg-gradient-*) - Gradient interpolation:
bg-linear-to-r/oklch,bg-linear-to-r/srgb - Conic and radial gradients:
bg-conic,bg-radial-[at_25%_25%]
- Linear gradient angles:
Shadow enhancements:
inset-shadow-*andinset-ring-*utilities- Can be composed with regular
shadow-*andring-*
New CSS property utilities:
field-sizing-contentfor auto-resizing textareasscheme-light,scheme-darkforcolor-schemepropertyfont-stretch-*utilities for variable fonts
New Variants
Composable variants: Chain variants together
- Example:
group-has-data-potato:opacity-100
- Example:
New variants:
startingvariant for@starting-styletransitionsnot-*variant for:not()pseudo-classinertvariant forinertattributenth-*variants (nth-3:,nth-last-5:,nth-of-type-4:,nth-last-of-type-6:)in-*variant (likegroup-*but without addinggroupclass)openvariant now supports:popover-open**variant for targeting all descendants
Custom Extensions
Custom utilities: Use
@utilitydirective@utility tab-4 { tab-size: 4; }Custom variants: Use
@custom-variantto define project-specific variants. Use@variantonly to apply an existing Tailwind variant inside custom CSS.@custom-variant wide-gamut { @media (color-gamut: p3) { @slot; } } @custom-variant theme-midnight (&:where([data-theme="midnight"] *));Plugins: Use
@plugindirective@plugin "@tailwindcss/typography";
Breaking Changes
Removed deprecated utilities:
bg-opacity-*→ Usebg-black/50insteadtext-opacity-*→ Usetext-black/50instead- And others:
border-opacity-*,divide-opacity-*, etc.
Renamed utilities:
shadow-sm→shadow-xs(andshadow→shadow-sm)drop-shadow-sm→drop-shadow-xs(anddrop-shadow→drop-shadow-sm)blur-sm→blur-xs(andblur→blur-sm)rounded-sm→rounded-xs(androunded→rounded-sm)outline-none→outline-hidden(for the old behavior)
Default style changes:
- Default border color is now
currentColor(wasgray-200) - Default
ringwidth is now 1px (was 3px) - Placeholder text now uses current color at 50% opacity (was
gray-400) - Hover styles only apply on devices that support hover (
@media (hover: hover))
- Default border color is now
Syntax changes:
- CSS variables in arbitrary values:
bg-(--brand-color)instead ofbg-[--brand-color] - Stacked variants now apply left-to-right (not right-to-left)
- Use CSS variables instead of
theme()function
- CSS variables in arbitrary values:
Advanced Configuration
Using a prefix:
@import "tailwindcss" prefix(tw);- Results in classes like
tw:flex,tw:bg-red-500,tw:hover:bg-red-600
- Results in classes like
Source detection:
- Automatic by default (ignores
.gitignorefiles and binary files) - Add sources:
@source "../node_modules/@my-company/ui-lib"; - Disable automatic detection:
@import "tailwindcss" source(none);
- Automatic by default (ignores
Legacy config files:
@import "tailwindcss"; @config "../../tailwind.config.js";Dark mode configuration:
@import "tailwindcss"; @custom-variant dark (&:where(.dark, .dark *));Container customization: Extend with
@utility@utility container { margin-inline: auto; padding-inline: 2rem; }Using
@applyin Vue/Svelte:<style> @reference "../../my-theme.css"; /* or, when using only the default theme */ @reference "tailwindcss"; h1 { @apply text-2xl font-bold text-red-500; } </style>