
# TailwindPHP

TailwindPHP est un **port 1:1 de TailwindCSS 4.x vers PHP**. Il analyse votre CSS, recherche les noms de classes dans votre balisage et génère le CSS utilitaire produit par TailwindCSS v4.3.3 — entièrement en PHP, sans Node.js ni étape de compilation.

- **PHP pur** — fourni comme package Composer, il fonctionne sur PHP 8.2+ avec les extensions standard `ctype` et `mbstring`. Sans `exec`, FFI ni outils de compilation natifs.
- **Vérifié par rapport à TailwindCSS** — les utilitaires, variantes, directives et fonctions CSS suivent TailwindCSS v4.3.3. Le résultat est vérifié avec les suites de tests propres à Tailwind, extraites du code source TypeScript et relancées à chaque push (plus de 4,400 tests). Les différences connues (quelques détails de sérialisation sans effet sur la cascade, ainsi que des problèmes ouverts) sont répertoriées dans [Compatibilité et mise à niveau](https://tailwindphp.inline0.dev/fr/docs/advanced/compatibility).
- **Toutes les fonctionnalités** — l'ensemble complet des utilitaires TailwindCSS v4.3.3 (dont `container`, les utilitaires de barre de défilement, `zoom-*` et `tab-*`), toutes les variantes (survol, focus, réactivité, mode sombre, requêtes de conteneur, valeurs arbitraires) et toutes les directives : `@import`, `@theme`, `@apply`, `@utility`, `@variant`, `@custom-variant`, `@layer`, `@plugin` et `@source`.
- **Tout inclus** — `cn()`, `merge()`, `join()` et `variants()` intègrent des ports PHP de clsx, tailwind-merge et CVA : les bibliothèques complémentaires utilisées par tous les projets Tailwind sont déjà incluses.
- **Plugins** — `@tailwindcss/typography` et `@tailwindcss/forms` sont entièrement portés, et un PHP plugin API permet d'écrire les vôtres.

## Pourquoi TailwindPHP existe

TailwindCSS est écrit en TypeScript et fonctionne sur Node.js. C'est une exigence incontournable pour tout projet PHP qui souhaite utiliser Tailwind : il faut un second environnement d'exécution, une installation npm et une étape de compilation dans la CI et Docker. Pour beaucoup d'applications PHP, cette complexité est peu souhaitable.

TailwindPHP élimine cette contrainte. Votre code PHP est compilé directement par Tailwind CSS, en utilisant uniquement la bibliothèque standard. Cela permet des usages difficiles, voire impossibles, avec la chaîne d'outils JavaScript :

- **Frameworks WordPress et PHP** — distribuez des thèmes et plugins reposant sur Tailwind sans demander aux utilisateurs d'installer Node.js ni de lancer une compilation. Il suffit de `composer require` pour commencer. Voir [TailwindWP](https://github.com/dnnsjsk/tailwindwp), un plugin WordPress d'exemple qui génère CSS pour l'éditeur de blocs avec TailwindPHP.
- **CSS à l'exécution** — générez à la volée des CSS utilitaires à partir de saisies utilisateur, de contenu de base de données ou de variables de template, plutôt qu'au moment de la compilation.
- **Déploiement simplifié** — aucun Node.js en production, aucune étape de compilation dans la CI, aucun npm dans votre image Docker.

C'est le même principe que celui apporté par [scssphp](https://github.com/scssphp/scssphp) à SCSS : le compilateur complet, en PHP.

## Fonctionnalités

- Compile l’ensemble d’utilitaires TailwindCSS v4.3.3, les variantes et les valeurs arbitraires à partir des noms de classes trouvés dans votre contenu.
- Résout toute la surface des directives : `@import` (y compris les modules virtuels comme `tailwindcss` et `tailwindcss/utilities`, ainsi que les imports `reference`), `@theme`, `@apply`, `@utility`, `@variant`, `@custom-variant`, `@layer`, `@plugin` et `@source`.
- Implémente les fonctions CSS de Tailwind — `theme()`, `--theme()`, `--spacing()` et `--alpha()` — ainsi que la conversion `color-mix()` → `oklab()` et les transformations CSS déléguées à LightningCSS par TailwindCSS.
- Résout `@import` depuis le système de fichiers, avec imports imbriqués, déduplication et résolveurs personnalisés, ou depuis des chaînes CSS intégrées.
- Fournit Preflight (la réinitialisation de base de Tailwind), la prise en charge des préfixes, les solutions de repli `@property`, l’ajout de préfixes fournisseurs et le déplacement des keyframes.
- Regroupe `cn()`, `merge()`, `join()` et `variants()`/`compose()` pour construire les noms de classes, résoudre les conflits et gérer les variantes de composants.
- Inclut les plugins de typographie et de formulaires, ainsi qu’un API de plugin (`addUtilities`, `matchUtilities`, `addComponents`, `addVariant`, `theme`, …) pour les plugins personnalisés.
- Fournit un CLI (`bin/tailwindphp`) avec les options de compilation `@tailwindcss/cli`, ainsi qu’une mise en cache des fichiers de sortie, un cache persistant de l’état du compilateur et un minificateur CSS pour la production.

## Ce que ce n'est pas

TailwindPHP est un compilateur CSS, pas une chaîne d’outils d’édition. Il exclut volontairement les éléments de l’écosystème Tailwind destinés aux IDE — IntelliSense, la complétion automatique, le tri des classes et les cartes source — car ce sont des fonctions d’éditeur, et non des éléments de la génération de CSS. Tout ce qui produit CSS est inclus ; tout ce qui alimente votre éditeur ne l’est pas.

## Par où commencer

- [Bien démarrer](https://tailwindphp.inline0.dev/fr/docs/getting-started) — installez le paquet et générez votre première feuille de style.
- [Utilisation](https://tailwindphp.inline0.dev/fr/docs/usage) — analysez le contenu, personnalisez le thème et utilisez les directives de Tailwind.
- [Utilitaires de classe](https://tailwindphp.inline0.dev/fr/docs/class-utilities) — `cn()`, `merge()`, `join()` et `variants()`.
- [Plugins](https://tailwindphp.inline0.dev/fr/docs/plugins) — typographie, formulaires et création de vos propres plugins.
- [API](https://tailwindphp.inline0.dev/fr/docs/api) — toute la surface `tw` et l’instance `TailwindCompiler`.
- [CLI](https://tailwindphp.inline0.dev/fr/docs/cli) — `bin/tailwindphp` pour les compilations basées sur des fichiers et le mode surveillance.
- [Avancé](https://tailwindphp.inline0.dev/fr/docs/advanced) — architecture, mise en cache, performances et notes de compatibilité.
