Tailwind - Design System

illustration de l'article

Qu’est-ce que Tailwind ?

Tailwind est un framework CSS utilisant l’approche Utility first. C’est-à-dire l’isolement de chaque propriété css avec sa valeur dans une classe unique.

Par exemple on aura la classe m-0 qui correspondra à la classe appliquant une marge de 0 :

.m-0 {
  margin: 0;
}

Voici un exemple de comment utiliser tailwind pour créer un composant :

<div class="grid grid-cols-10 h-40 w-96 text-gray-700 shadow-md rounded-3xl">
  <div class="col-span-3 bg-blue-100 rounded-l-3xl"></div>
  <div class="col-span-7 flex flex-col justify-between p-2">
    <span
      >Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam tempor
      elit nisl. Vestibulum iaculis sit amet leo vitae pretium.</span
    >
    <span class="text-gray-900 font-bold">John Doe</span>
  </div>
</div>

Et voici le résultat que l’on obtient :

Tailwind exemple

Nous allons voir dans cet article en quoi Tailwind est intéressant, notamment dans la mise en place d’un Design System.

En quoi est-ce intéressant ?

L’objectif de cette approche “Utilisty First” est de rendre chaque classe réutilisable. Cela a beaucoup d’avantages, par exemple :

  • Alléger le code CSS produit : finie la re-déclaration des mêmes propriétés css partout dans les composants. Ici elle ne sera déclarée qu’une seule fois ! Par exemple la classe m-0 est déclarée une seule fois dans le css produit par Tailwind, et utilisable n’importe où.
  • Arrêter les allers et retours entre code HTML et feuilles de style CSS : ici le style est appliqué en faisant appel à des classes CSS dans le code HTML, ce qui représente un certain gain de temps dans le développement de sites web.
  • Apporter de la cohérence dans le code : cette approche facilite par exemple l’utilisation des bonnes couleurs et bonnes propriétés de fonts, sans sortir complètement des règles de design (utiliser une certaine palette de couleurs, utiliser des multiples de 8 pour tout ce qui est espacement, etc.).
  • Maintenir plus facilement le design de l’application : changer une propriété CSS telle qu’une couleur ou une taille de police d’écriture devient facile et s’effectue à un seul et même endroit.

Pour parler plus spécifiquement de Tailwind, l’un de ses avantages est d’être hautement personnalisable. Que ce soit pour les couleurs, les tailles d’écran, les polices d’écriture, les espacements… L’objectif est de pouvoir configurer un design cohérent et propre à l’application ou au service que l’on souhaite développer.

De plus, un autre avantage est qu’il permet la purge du css produit. Cela signifie que toutes les classes css générées par tailwind qui ne sont utilisées nulle part dans le code seront purgées (dans l’idéal, la purge est conseillée dans les envrionnements de production). Ce qui réduit considérablement la taille du fichier css produit. Il est également possible de manipuler la manière dont la purge est effectuée : des regex peuvent être appliquées lors de la purge pour créer une “safelist” de classes css à ne pas supprimer.

Tailwind permet aussi de préfixer ses classes css produites de sorte à ne pas causer de conflits avec d’autres librairies css ou tout simplement d’autres classes css. Ce sera très utile si l’on décide d’utiliser Tailwind en parallèle d’autres frameworks, librairies CSS, où les noms de classes css pourraient être les mêmes que celles générées par Tailwind.

Toutes ces règles sont définies dans le fichier de configuration de tailwind (tailwind.config.js) écrit en javascript, donc facilement manipulable. Cela donnera un fichier comme ci-dessous :

// tailwind.config.js
const colors = require("./tailwind/colors"); // JSON de couleurs
const purgeSafelist = require("./tailwind/purge"); // Tableau de regex

module.exports = {
  purge: {
    content: ["./src/**/*.vue"],
    options: {
      safelist: purgeSafelist,
    },
  },
  darkMode: false, // or 'media' or 'class'
  prefix: "myApp-",
  theme: {
    colors,
    extend: {
      spacing: {},
      borderRadius: {},
      boxShadow: {},
    },
  },
  variants: {
    extend: {
      backgroundColor: ["active"],
    },
  },
  plugins: [],
};

On peut observer l’utilisation des champs extend, qui vont permettre d’ajouter des configurations aux configurations existantes. Par exemple, si l’on veut ajouter des possibilités de box-shadow (avec des valeurs et des couleurs différentes) tout en gardant les valeurs proposées initialement par Tailwind, ce sera dans le champ extend de theme qu’il faudra les ajouter. Si par contre on ne souhaite pas garder les valeurs par défaut de Tailwind, il faudra ajouter les nouvelles valeurs de box-shadow directement à la racine de theme.

Pour ce qui est des variants, il s’agit des circonstances durant lesquelles des propriétés et classes css vont être activées. Ces circonstances peuvent être des hover, active, focus, etc. Dans l’exemple ci-dessus, on peut voir qu’on étend le variant backgroundColor à l’état active. Cela va permettre de pouvoir appliquer des classes Tailwind sur le changement de couleur du background lors de l’état active (lorsque que le clic gauche de la souris est appuyé sur un bouton par exemple).

Pourquoi l’utiliser pour construire un Design System ?

→ Comme évoqué précédemment, Tailwind est un framework hautement personnalisable. Ce qui permet d’établir les règles du design system très facilement, qu’il s’agisse des règles d’espacement, des fonts à utiliser, des couleurs, etc.

→ La configuration de Tailwind se faisant dans un fichier javascript, il est très simple de le manipuler. On peut donc le configurer depuis des données externes. Prenons l’exemple des “design tokens” : certains outils de design, comme Zeroheight (application permettant de documenter un design system), permettent de générer et d’exposer des fichiers JSON via des URL. Ces fichiers peuvent être générés depuis des extraits de données venant d’autres outils de Design tels que Figma (outil de maquettage d’écrans d’applications en collaboratif), où les designers peuvent spécifier leurs règles de design, telles que les couleurs, les box-shadows, les fonts, etc. Voyons cela à l’aide d’un schéma, qui sera plus parlant. Schéma Design Tokens

→ La cohérence qu’il permet d’apporter au design de l’application en fait une très bonne solution pour mettre en place un design system, en appliquant facilement les mêmes codes dans chacun des composants.

→ Aucun thème par défaut n’est appliqué contrairement à d’autres librairies css. Il faudra donc définir soi-même tous les styles à appliquer.

→ Tailwind fournit des outils pour traiter un grand nombre de problématiques, dont le dark mode. Il suffira alors de préfixer les classes de couleurs par dark:, et d’en définir les couleurs dans le design system.

→ Enfin, il permet d’appliquer des règles pour rendre une application responsive, en donnant la possibilité de définir les comportements des composants développés selon les tailles d’écrans.

Quelles sont les différences de ce framework par rapport à d’autres comme Bootstrap ?

La première est que Tailwind, contrairement à Bootstrap, n’est pas un “UI kit” : il n’embarque ni de thème par défaut, ni de composants. Cela ne signifie pas que Tailwind ne propose rien pour autant. Des valeurs par défaut pour les palettes de couleurs ou les espacements sont à la disposition des développeurs, mais sont également très simples à écraser ou compléter. L’idée derrière cette logique est de ne pas imposer de règles de design.

Bootstrap va également apporter beaucoup sur le plan du responsive, tandis que Tailwind va plus s’axer autour d’une grande personnalisation.

En termes de chiffres, voici la comparaison des deux frameworks réalisée sur npm trends : Tailwind VS Bootstrap

Et pour ce qui est de l’utilisation des deux frameworks, Bootstrap est utilisé entre autres par Spotify, Twitter, et Lyft, tandis que Tailwind est utilisé par BlaBlaCar, überdosis et Superchat.

À retenir

Un grand nombre de solutions existent pour faciliter la mise en place d’un design dans une application, et Tailwind en fait partie. Il rendra le développement UI plus rapide et plus cohérent et permettra de configurer ses propres règles de design en toute simplicité.

Ainsi, son utilisation est tout à fait adaptée dans la mise en place d’un design system.

Commentaires

comments powered by Disqus

Date

Auteur

Avatar Guillaume COLLET

Guillaume COLLET

Développeur Web

Lab