Tailwind merge limitations and the lost classes
How to use use tailwind merge and it's mergeConfigs() for when creating custom classes in Tailwind CSS without losing classes.
Tailwind CSS is a utility-first CSS framework that allows you to build custom designs without writing any CSS. When creating custom classes in Tailwind CSS, you may run into issues where some classes are lost when merging utility classes. This is because Tailwind CSS has a set of default class groups that are used to merge utility classes.
For example, if you have a custom class that starts with text-, it will be removed when merging utility classes.
Tailwind-merge doesn't know that your custom text-biggest class is a text class, so it will
remove it when merging utility classes when a similar text-xs or text-bg-red-500 is present.
This is a known limitation of tailwind-merge, but you can work around it by extending the twMerge function to include your custom class groups.
In this article, we will look at how to merge utility classes when create custom classes in Tailwind CSS with tailwind-merge and mergeConfigs().
Adding custom classes to Tailwind CSS
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
// ...
],
theme: {
fontSize: {
smallest: [".625rem", { lineHeight: ".9375rem" }],
biggest: ["4.5rem", { lineHeight: "5.625rem" }],
},
},
};
Before
Normal twMerge behaviour with custom utilities and it's output:
twMerge("font-bold text-gray-800 text-biggest") => "font-bold text-biggest"
you can see that the
text-gray-800class is lost.
After
Our new twMerge function with custom class groups:
twMerge("font-bold text-gray-800 text-biggest") => "font-bold text-gray-800 text-biggest"
Create a new file
classes.helpers.tsin your project.
import {
createTailwindMerge,
getDefaultConfig,
mergeConfigs,
} from "tailwind-merge";
// Extends twMerge to allow for custom class groups
export const twMerge = createTailwindMerge(() =>
mergeConfigs(getDefaultConfig(), {
classGroups: {
text: [
{
text: ["smallest", "biggest"],
},
],
},
})
);
Now instead of importing twMerge from tailwind-merge, you can import it from your classes.helpers.ts file.
import { twMerge } from "./classes.helpers";
export function MyComponent() {
return (
<div className={twMerge("font-bold text-gray-800 text-biggest")}>
Hello world
</div>
);
}