Créer une librairie d’icônes avec React, Next.js et Typescript
Publié le 13 février 2024
Baptiste Drillien
Développeur front-end
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.
Pourquoi créer une librairie d’icônes sur mesure ?
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éer la librairie d’icônes
Créons ensemble une librairie composée de 10 icônes que l’on retrouve couramment dans des applications web.
Pour cela, nous allons créer dans un premier temps un projet React / Next.js avec Typescript et TailwindCSS (qui est optionnel).
Création du composant de l’icône
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 notre projet avec React & Next.js, il faut convertir notre svg, qui est construit sur une base de XML en jsx ou, dans notre cas, en tsx.
Si notre 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 ou notre 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.
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 nos icônes.
Comment importer nos icônes ?
Grâce à notre index, nous pouvons éviter d’avoir des imports trop conséquents, comme par exemple :
page.tsx
1import { ArrowDownTray } from "@/ui/components/icons/arrow-down-tray";
2import { Bell } from "@/ui/components/icons/bell";
3import { ChatBubble } from "@/ui/components/icons/chat-bubble";
4import { Check } from "@/ui/components/icons/check";
5import { Cog } from "@/ui/components/icons/cog";
6import { Home } from "@/ui/components/icons/home";
7import { Lock } from "@/ui/components/icons/lock";
8import { MagnifyingGlass } from "@/ui/components/icons/magnifying-glass";
9import { PencilSquare } from "@/ui/components/icons/pencil-square";
10import { Trash } from "@/ui/components/icons/trash";
11import { User } from "@/ui/components/icons/user";
12import { XMark } from "@/ui/components/icons/x-mark";
Mais également des imports à rallonge :
page.tsx
1import {
2 ArrowDownTray,
3 Bell,
4 ChatBubble,
5 Check,
6 Cog,
7 Home,
8 Lock,
9 MagnifyingGlass,
10 PencilSquare,
11 Trash,
12 User,
13 XMark,
14} from "@/ui/components/icons";
Nous pouvons simplement utiliser un composant unique sous cette forme :
Notre 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.
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 nos 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.