Sviluppo web

Scrivere un plugin Tailwind

In Tailwind 4 un plugin personalizzato è una regola @utility nel CSS. Il plugin JavaScript conviene solo quando devi distribuire utility come pacchetto.

In sintesi

  • @utility aggiunge una utility personalizzata senza JavaScript.
  • @plugin carica un plugin JavaScript, da pacchetto o da file locale.
  • safelist e corePlugins non esistono in Tailwind 4.

In Tailwind CSS 4 un plugin personalizzato si scrive con @utility nel CSS; il plugin JavaScript serve solo quando devi distribuirlo come pacchetto.

La via breve: @utility

@import "tailwindcss";

@utility content-auto {
  content-visibility: auto;
  contain-intrinsic-size: 1px 500px;
}

L'utility finisce nel layer utilities e accetta le varianti: hover:content-auto, lg:content-auto. Non serve JavaScript, non serve tailwind.config.js e non serve un pacchetto.

Utility con un valore

Una utility funzionale riceve un argomento tramite --value():

@theme {
  --tab-size-github: 8;
}

@utility tab-* {
  tab-size: --value(--tab-size-*, integer, [integer]);
}

Così funzionano tab-2, tab-76, tab-github e tab-[3]. --value() legge chiavi del tema, valori nudi e valori arbitrari; le dichiarazioni che non risolvono vengono omesse dall'output.

Quando serve un plugin JavaScript

Un plugin JavaScript resta utile se pubblichi utility per altri progetti. Si scrive con l'helper plugin():

import plugin from "tailwindcss/plugin";

export default plugin(({ addUtilities, addVariant }) => {
  addUtilities({
    ".content-auto": { "content-visibility": "auto" },
  });
  addVariant("hocus", ["&:hover", "&:focus-visible"]);
});

Si carica con la direttiva @plugin, che accetta un nome di pacchetto o un percorso locale. Le API stabili sono addUtilities, addComponents e addVariant.

@import "tailwindcss";
@plugin "./hocus-plugin.js";

Le opzioni corePlugins e safelist della configurazione JavaScript non sono supportate in 4. Al posto della safelist c'è @source inline().

La limitazione

Un plugin JavaScript è codice tuo: ha un nome, una versione e un test da mantenere, e le utility che genera non esistono nel progetto finché qualcuno non lo carica. In cambio non è tipizzato e un selettore sbagliato fallisce in silenzio. Per due utility interne @utility costa meno e resta nello stesso file.

Dove continuare

Nel catalogo: i componenti Tailwind, la libreria tailwind-admin e le sezioni hero, tutte costruite con utility. Il framework è spiegato in che cos'è Tailwind CSS, le classi mancanti in content paths; per scegliere una libreria leggi le migliori librerie Tailwind e il confronto Tailwind contro CSS Modules.

Domande frequenti

Devo ancora scrivere plugin JavaScript in Tailwind 4?

Solo se pubblichi utility per altri progetti. Dentro un'applicazione, @utility nel CSS copre quasi tutti i casi.

Come si carica un plugin in Tailwind 4?

Con la direttiva @plugin seguita dal nome del pacchetto o da un percorso locale. La direttiva va nel file CSS che importa tailwindcss.

Che differenza c'è tra @utility e addUtilities?

@utility è una regola CSS elaborata dalla build, addUtilities è una funzione dell'API JavaScript. La prima resta nel progetto, la seconda richiede un pacchetto.

Posso usare la safelist in Tailwind 4?

No, safelist e corePlugins della configurazione JavaScript non sono supportati in 4. Al loro posto c'è @source inline(), che elenca le classi da generare.

Un plugin può aggiungere una variante?

Sì, con addVariant nell'API JavaScript o con @custom-variant nel CSS. Per una variante sola, @custom-variant è la via più breve.