baptistedri/custom-icons-library
Exemple de librairie d'icônes avec React, Next.js et Typescript

Développeur Next.js - Freelance
Une icône est un symbole que l'on trouve dans les interfaces utilisateur (UI). Elles sont universelles et respectent des conventions. Contrairement aux images matricielles, les icônes sont vectorielles.
Elles peuvent être redimensionnées sans perte de qualité, ce qui les rend facilement responsives.
Les icônes sont largement utilisées pour représenter des actions ou des états. Elles participent à l'affordance d'une interface et donc à l'UX d'un produit, en plus de renforcer l'identité visuelle.
Leur pertinence n'est pas à prouver et la question du choix de la librairie d'icônes se fait pour chaque projet. Dans cet article, nous allons voir pourquoi il est préférable de créer sa propre librairie.
Bien qu'il existe de nombreuses librairies d'icônes gratuites et facilement utilisables telles que Material Symbols (Google) ou encore Font Awesome, créer une librairie sur mesure présente plusieurs avantages :
Droits d'auteur et licences : aucun problème avec une librairie créée sur mesure.
Optimisation : inutile d'installer des centaines d'icônes inutilisées.
Maintenabilité : il est facile de modifier des icônes, d'en ajouter et d'en supprimer.
Meilleure accessibilité : c'est une mauvaise pratique d'utiliser une police pour ses icônes.
Flexibilité : il est possible d'utiliser des icônes provenant de différentes librairies existantes, en plus d'en créer soi-même.
Créons une librairie composée de 10 icônes que l'on retrouve couramment dans des applications web.
Pour cela, je vais créer dans un premier temps un projet React / Next.js avec Typescript et TailwindCSS (qui est optionnel).

Imaginons que nous sommes en train d'intégrer une maquette fournie par un designer. Première étape, il faut exporter l'icône en svg.
Pour pouvoir l'utiliser dans le projet avec React & Next.js, il faut convertir le svg, qui est construit sur une base de XML en jsx ou, dans ce cas, en tsx.
Si le svg est uniquement utilisé avec des couleurs prédéfinies , il n'est pas nécessaire de modifier les fill et / ou stroke.
En revanche, dans la mesure où l'icône peut être utilisée dans différentes couleurs, le plus simple est de lui attribuer la même couleur que pour le texte. Il suffit de remplacer la valeur de la couleur par currentColor.
baptistedri/custom-icons-library
Exemple de librairie d'icônes avec React, Next.js et Typescript
Pour éviter d'avoir à importer un composant pour chaque icône, et permettre de typer les props à chaque fois sans dupliquer du code, il convient de passer par un index pour exporter les icônes.
Grâce à l'index, on peut éviter d'avoir des imports trop conséquents, comme par exemple :
Mais également des imports à rallonge :
On peut simplement utiliser un composant unique sous cette forme :
Le composant Icon est correctement typé et il est facile de changer la taille des icônes. Il est également possible d'utiliser tailwind via les classNames pour modifier la taille.
De plus, chaque composant d'icône est typé, et peut prendre les props du composant Icon.
Il est donc facile de modifier chaque icône selon le besoin via le composant parent Icon. On peut par exemple imaginer utiliser TailwindCSS au lieu de passer par une size.
La création d'une librairie d'icônes sur mesure avec React, Next.js et Typescript offre une meilleure optimisation, une maintenance simplifiée et une importante flexibilité : on a un contrôle total sur les icônes.
Pour tirer profit au maximum de sa librairie, il est possible de la documenter avec Storybook ou encore de la publier en tant que package npm.
baptistedri/custom-icons-library
Exemple de librairie d'icônes avec React, Next.js et Typescript