PostCSS plugin to generate TypeScript types from your CSS class names.
It generates a global ClassNames type which is a union of all classes
used in your project whether written by you or from a framework such as
Bootstrap or Tailwind (which can get bit too slow).
Ex. for css
.button {
background: green;
}
.button-danger {
background: red;
}you'll get
type ClassNames = "button" | "button-danger";With it you can create a helper function like
function cn(...args: ClassNames[]) {
return args.join(" ");
}and have your editor autocomplete and validate the class names:
Install the plugin
npm install postcss-ts-classnames
In your PostCSS config add it close to the end before optimizing plugins such as cssnano or purgecss:
module.exports = {
plugins: [
require("postcss-import"),
require("tailwindcss"),
require("postcss-ts-classnames")({
dest: "src/classnames.d.ts",
// Set isModule if you want to import ClassNames from another file
isModule: true,
exportAsDefault: true, // to use in combination with isModule
}),
require("@fullhuman/postcss-purgecss")({
content: ["./src/**/*.html"],
}),
],
};There's also a ts-classnames module which is re-exported version of the
original classnames which uses the generated ClassNames type to
validate the class names
Install
npm install ts-classnames
Import
import { cn } from "ts-classnames";If you don't use TypeScript you can still leverage this as VSCode can pick up TypeScript types from JSDoc comments so you can do
/**
* @param {ClassNames[]} args
*/
function cn(...args) {
return args.join(" ");
}This will give the autocomplete but if you want the class names checking you
can add // @ts-check to the top of the file.
The ts-classnames will work with Vanilla JS too.
