
Product
Unify Your Security Stack with Socket Basics
A single platform for static analysis, secrets detection, container scanning, and CVE checks—built on trusted open source tools, ready to run out of the box.
prettier-plugin-tailwindcss
Advanced tools
A Prettier v3+ plugin for Tailwind CSS v3.0+ that automatically sorts classes based on our recommended class order.
To get started, install prettier-plugin-tailwindcss
as a dev-dependency:
npm install -D prettier prettier-plugin-tailwindcss
Then add the plugin to your Prettier configuration:
// .prettierrc
{
"plugins": ["prettier-plugin-tailwindcss"]
}
When using a JavaScript config, you can import the types for IntelliSense:
// prettier.config.js
/** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */
export default {
plugins: ["prettier-plugin-tailwindcss"],
}
As of v0.5.x, this plugin now requires Prettier v3 and is ESM-only. This means it cannot be loaded via require()
. For more information see our upgrade guide.
When using Tailwind CSS v4 you must specify your CSS file entry point, which includes your theme, custom utilities, and other Tailwind configuration options. To do this, use the tailwindStylesheet
option in your Prettier configuration.
Note that paths are resolved relative to the Prettier configuration file.
// .prettierrc
{
"tailwindStylesheet": "./resources/css/app.css"
}
To ensure that the class sorting takes into consideration any of your project's Tailwind customizations, it needs access to your Tailwind configuration file (tailwind.config.js
).
By default the plugin will look for this file in the same directory as your Prettier configuration file. However, if your Tailwind configuration is somewhere else, you can specify this using the tailwindConfig
option in your Prettier configuration.
Note that paths are resolved relative to the Prettier configuration file.
// .prettierrc
{
"tailwindConfig": "./styles/tailwind.config.js"
}
If a local configuration file cannot be found the plugin will fallback to the default Tailwind configuration.
By default this plugin sorts classes in the class
attribute, any framework-specific equivalents like className
, :class
, [ngClass]
, and any Tailwind @apply
directives.
You can sort additional attributes using the tailwindAttributes
option, which takes an array of attribute names:
// .prettierrc
{
"tailwindAttributes": ["myClassList"]
}
With this configuration, any classes found in the myClassList
attribute will be sorted:
function MyButton({ children }) {
return (
<button myClassList="rounded bg-blue-500 px-4 py-2 text-base text-white">
{children}
</button>
);
}
You can also use regular expressions to match multiple attributes. Patterns should be enclosed in forward slashes. Note that JS regex literals are not supported with Prettier:
// .prettierrc
{
"tailwindAttributes": ["myClassList", "/data-.*/"]
}
This example will sort classes in the myClassList
attribute as well as any attribute starting with data-
:
function MyButton({ children }) {
return (
<button
myClassList="rounded bg-blue-500 px-4 py-2 text-base text-white"
data-theme="dark:bg-gray-800 bg-white"
data-classes="flex items-center"
>
{children}
</button>
);
}
In addition to sorting classes in attributes, you can also sort classes in strings provided to function calls. This is useful when working with libraries like clsx or cva.
You can sort classes in function calls using the tailwindFunctions
option, which takes a list of function names:
// .prettierrc
{
"tailwindFunctions": ["clsx"]
}
With this configuration, any classes in clsx()
function calls will be sorted:
import clsx from 'clsx'
function MyButton({ isHovering, children }) {
let classes = clsx(
'rounded bg-blue-500 px-4 py-2 text-base text-white',
{
'bg-blue-700 text-gray-100': isHovering,
},
)
return (
<button className={classes}>
{children}
</button>
)
}
This plugin also enables sorting of classes in tagged template literals.
You can sort classes in template literals using the tailwindFunctions
option, which takes a list of function names:
// .prettierrc
{
"tailwindFunctions": ["tw"],
}
With this configuration, any classes in template literals tagged with tw
will automatically be sorted:
import { View, Text } from 'react-native'
import tw from 'twrnc'
function MyScreen() {
return (
<View style={tw`bg-white p-4 dark:bg-black`}>
<Text style={tw`text-md text-black dark:text-white`}>Hello World</Text>
</View>
)
}
This feature can be used with third-party libraries like twrnc
or you can create your own tagged template by defining this "identity" function:
const tw = (strings, ...values) => String.raw({ raw: strings }, ...values)
Once added, tag your strings with the function and the plugin will sort them:
const mySortedClasses = tw`bg-white p-4 dark:bg-black`
Like the tailwindAttributes
option, the tailwindFunctions
option also supports regular expressions to match multiple function names. Patterns should be enclosed in forward slashes. Note that JS regex literals are not supported with Prettier.
This plugin automatically removes unnecessary whitespace between classes to ensure consistent formatting. If you prefer to preserve whitespace, you can use the tailwindPreserveWhitespace
option:
// .prettierrc
{
"tailwindPreserveWhitespace": true,
}
With this configuration, any whitespace surrounding classes will be preserved:
import clsx from 'clsx'
function MyButton({ isHovering, children }) {
return (
<button className=" rounded bg-blue-500 px-4 py-2 text-base text-white ">
{children}
</button>
)
}
This plugin automatically removes duplicate classes from your class lists. However, this can cause issues in some templating languages, like Fluid or Blade, where we can't distinguish between classes and the templating syntax.
If removing duplicate classes is causing issues in your project, you can use the tailwindPreserveDuplicates
option to disable this behavior:
// .prettierrc
{
"tailwindPreserveDuplicates": true,
}
With this configuration, anything we perceive as duplicate classes will be preserved:
<div
class="
{f:if(condition: isCompact, then: 'grid-cols-3', else: 'grid-cols-5')}
{f:if(condition: isDark, then: 'bg-black/50', else: 'bg-white/50')}
grid gap-4 p-4
"
>
</div>
This plugin uses Prettier APIs that can only be used by one plugin at a time, making it incompatible with other Prettier plugins implemented the same way. To solve this we've added explicit per-plugin workarounds that enable compatibility with the following Prettier plugins:
@ianvs/prettier-plugin-sort-imports
@prettier/plugin-pug
@shopify/prettier-plugin-liquid
@trivago/prettier-plugin-sort-imports
prettier-plugin-astro
prettier-plugin-css-order
prettier-plugin-jsdoc
prettier-plugin-multiline-arrays
prettier-plugin-organize-attributes
prettier-plugin-organize-imports
prettier-plugin-svelte
prettier-plugin-sort-imports
One limitation with this approach is that prettier-plugin-tailwindcss
must be loaded last.
// .prettierrc
{
// ..
"plugins": [
"prettier-plugin-svelte",
"prettier-plugin-organize-imports",
"prettier-plugin-tailwindcss" // MUST come last
]
}
Headwind is a Visual Studio Code extension that also sorts Tailwind CSS classes automatically. It is similar to prettier-plugin-tailwindcss but is specifically designed for VS Code and does not require Prettier.
This package is a typed utility function to combine Tailwind CSS classes. While it does not sort classes, it provides a way to conditionally join class names together, which can be useful in conjunction with a sorting tool.
tailwind-merge is a utility to merge Tailwind CSS classes without duplicates and with optimized class precedence. It does not sort classes but ensures that the final class string is optimized for Tailwind CSS.
FAQs
A Prettier plugin for sorting Tailwind CSS classes.
The npm package prettier-plugin-tailwindcss receives a total of 3,800,171 weekly downloads. As such, prettier-plugin-tailwindcss popularity was classified as popular.
We found that prettier-plugin-tailwindcss demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
A single platform for static analysis, secrets detection, container scanning, and CVE checks—built on trusted open source tools, ready to run out of the box.
Product
Socket is launching experimental protection for the Hugging Face ecosystem, scanning for malware and malicious payload injections inside model files to prevent silent AI supply chain attacks.
Research
/Security News
The Socket Threat Research Team uncovered a coordinated campaign that floods the Chrome Web Store with 131 rebranded clones of a WhatsApp Web automation extension to spam Brazilian users.