diff --git a/content/design-systems-for-developers/react/fr/architecture.md b/content/design-systems-for-developers/react/fr/architecture.md new file mode 100644 index 000000000..7151ed65d --- /dev/null +++ b/content/design-systems-for-developers/react/fr/architecture.md @@ -0,0 +1,110 @@ +--- +title: "Systèmes d'architecture" +tocTitle: 'Architecture' +description: 'Comment extraire un design system à partir de librairies de composants' +commit: '341ea8a' +--- + +Dans ce chapitre 2, nous allons créer un design system à partir de librairies de composants existantes. Nous déterminerons au fur et à mesure quels composants correspondent au design system et nous mettrons en avant les défis communs que rencontrent les développeurs au début de ce processus. + +Dans les grandes entreprises, cette étape est faite en collaboration avec les équipes de design, de développement et relatives au produit. [Chromatic](https://www.chromatic.com/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook) (l'entreprise derrière Storybook) et [Storybook](https://storybook.js.org/) partagent une équipe dynamique chargée de l'infrastructure frontend qui aide plus de 1400 contributeurs et contributrices open source à travers plus de 3 propriétés. Nous allons donc vous expliquer le processus. + +## Le défi + +Si vous travaillez au sein d'une équipe de développement, vous avez probablement remarqué que les grandes équipes ne sont pas les plus efficaces. Une mauvaise communication peut vite s'installer au fur et à mesure que les équipes grandissent. Les modèles d'interface utilisateur existants ne sont pas documentés ou sont totalement abandonnés. En d'autres termes, les développeurs tentent de réinventer la roue plutôt que de développer de nouvelles fonctionnalités. Au fil du temps, les projets sont remplis de composants uniques. + +Nous nous sommes heurtés à cette situation inconfortable. Malgré de bonnes intentions au sein d'un équipe expérimentée, les composants UI étaient sans cesse refactorisés ou recopiés. Les modèles d'interface utilisateur, qui étaient censés être identiques, différaient en termes d'apparence ou de fonctionnalités. Chaque composant était une entité unique, ce qui rendait impossible pour les nouveaux développeurs de discerner la source de vérité, et encore moins de contribuer. + +![Les UIs divergent](/design-systems-for-developers/design-system-inconsistent-buttons.jpg) + +## Créer un design system + +Un design system rassemble les composants communs de l'interface utilisateur dans un répertoire central correctement maintenu et partagé via un gestionnaire de packages. Les développeurs importent ces composants UI standardisés au lieu de copier le même code dans plusieurs projets. + +La plupart des design system ne sont pas créés de A à Z. Ils sont plutôt assemblés à partir de composants UI testés, approuvés et utilisés dans toute l'entreprise, et sont ensuite regroupés sous la forme d'un design system. Notre projet ne fait pas exception. Nous sélectionnerons des composants à partir de librairies existantes en production afin de gagner du temps et de mettre à disposition le design system plus rapidement. + +![Que contient un design system](/design-systems-for-developers/design-system-contents.jpg) + +## Où se trouve le design system ? + +On peut imaginer qu'un design system est une librairie de composants de plus, mais elle est partagée à l'échelle d'une entreprise entière plutôt qu'à l'échelle d'une seule application. Un design system se concentre sur les premières briques de l'interface utilisateur, tandis que les librairies de composants spécifiques à un projet peuvent tout contenir : des composants aux écrans. + +Ainsi, notre design system doit être à la fois indépendant de n'importe quel projet tout en étant une dépendance de tous les projets. Les modifications se propagent au sein de l'organisation sous la forme d'un package versionné distribué par un gestionnaire de packages. Les projets peuvent réutiliser les composants du design system et les personnaliser davantage si besoin. Ces contraintes nous permettent de structurer nos projets frontend. + +![Qui utilise un design system](/design-systems-for-developers/design-system-consumers.jpg) + +## Créer un dépôt dans GitHub + +React est la couche de visualisation (view layer) la plus populaire selon l'enquête de [State of JS](https://stateofjs.com/). Un nombre incalculable de composants Storybook utilisent React : c'est la raison pour laquelle nous l'utiliserons dans ce tutoriel pour créer notre design system. + +Dans votre ligne de commande, exécutez les commandes suivantes : + +```shell:clipboard=false +# Clone the files +npx degit chromaui/learnstorybook-design-system-template learnstorybook-design-system + +cd learnstorybook-design-system + +# Install the dependencies +yarn install +``` + +
+💡 Nous utilisons degit pour télécharger les dossiers provenant de GitHub. Si vous souhaitez le faire manuellement, vous pouvez récupérer le contenu ici. +
+ +Une fois que tout est installé, nous pouvons publier le tout sur GitHub (que nous utiliserons pour héberger le code de notre design system). Commencez par vous connecter et créer un nouveau dépôt sur GitHub.com : + +![Créer un dépôt GitHub](/design-systems-for-developers/create-github-repository.png) + +Suivez ensuite les instructions de GitHub pour créer le dépôt (pour l'instant presque vide) : + +```shell:clipboard=false +git init +git add . +git commit -m "first commit" +git branch -M main +git remote add origin https://github.com/your-username/learnstorybook-design-system.git +git push -u origin main +``` + +Veillez à remplacer `votre-nom-d'utilisateur` par le nom de votre compte. + +![Commit initial dans le dépôt GitHub](/design-systems-for-developers/created-github-repository.png) + +
💡 D'autres méthodes valables existent pour créer un design system comme le HTML/CSS brut, l'utilisation d'autres couches de visualisation, la compilation de composants avec Svelte ou l'utilisation de composants web. Choisissez ce qui convient le mieux à votre équipe.
+ +## Ce qui appartient au design system et ce qui n’en fait pas partie + +Les design system ne devraient contenir que des composants dits « purs » (composants qui se réactualisent uniquement si leurs propriétés changent) et destinés à l'affichage. Ces composants sont liés à l'affichage au sein de l'interface utilisateur, ne fonctionnent qu'avec des propriétés et ne contiennent pas de logique métier ou spécifique à une application, ils ne sont pas déterminants dans le chargement de données. Ces propriétés sont essentielles pour rendre un composant réutilisable. + +Les design system ne sont pas un ensemble de librairies de composants au sein d'une organisation. Ce serait un véritable casse-tête. + +Les composants spécifiques à une application qui contiennent de la logique métier ne devraient pas être inclus de part leur difficulté à être réutilisés : ils fonctionnent dans des projets qui ont des contraintes métiers similaires. + +Oubliez les composants uniques qui ne sont pour le moment pas réutilisés. Même si vous pensez qu'ils feront partis du design system un jour, les équipes agiles évitent autant que possible de maintenir du code superflu. + +## Créer un inventaire + +La première tâche consiste à dresser un inventaire de vos composants afin d'identifier les plus utilisés. Cela implique souvent de parcourir les interfaces de plusieurs sites ou applications afin de repérer les composants UI qui se répètent. Les designers [Brad Frost](http://bradfrost.com/blog/post/interface-inventory/) et [Nathan Curtis](https://medium.com/eightshapes-llc/the-component-cut-up-workshop-1378ae110517) ont déjà publié des méthodes pratiques pour faire l'inventaire des composants, par conséquent nous ne rentrerons pas en détail dans ce tutoriel. + +Méthodes complètes et utiles pour les développeurs : + +- Si un modèle d'interface utilisateur est utilisé plus de 3 fois, transformez-le en composant UI. +- Si un modèle d'interface utilisateur est utilisé dans plus de 3 projets / équipes, ajoutez-le à votre design system. + +![Contenu d'un design system](/design-systems-for-developers/design-system-grid.png) + +En suivant cette méthode, nous obtenons des composants UI primitifs : Avatar, Badge, Button, Checkbox, Input, Radio, Select, Textarea, Highlight (pour le code), Icon, Link, Tooltip et plus encore. Ces blocs de constructions sont configurés de différentes manières afin de créer plein de fonctionnalités et mises en page uniques pour les applications clientes. + +![Variantes dans un seul composant](/design-systems-for-developers/design-system-consolidate-into-one-button.jpg) + +Nous avons sélectionné un sous-ensemble de ces composants pour ce tutoriel afin de simplifier la compréhension du dépôt. Certaines équipes utilisent aussi des composants tiers dans leurs design system pour d'autres composants comme les Tableaux ou les Formulaires. + +
💡 CSS-in-JS : Nous utilisons Emotion, une librairie conçue pour écrire du CSS avec du JavaScript. Elle fournit un modèle de composition de style puissant et intuitif. Il existe d'autres méthodes valables pour styliser les composants, notamment l'utilisation de classes, les modules CSS, etc.
+ +En plus de nos composants UI, il est pertinent d'ajouter des constantes liées au style comme la typographie, les couleurs, les espacements, etc., qui sont réutilisées dans les projets. Selon la nomenclature des design system, les variables de styles globales sont appelées «design tokens». Nous ne nous attarderons pas ici dans la théorie derrière ces design tokens, mais vous pouvez en apprendre plus en ligne (voici un [article intéressant](https://medium.com/eightshapes-llc/tokens-in-design-systems-25dd82d58421)). + +## Commençons à développer + +Nous avons défini ce qu'il faut construire et comment tout s'assemble. Rentrons dans le vif du sujet. Dans le chapitre 3, nous mettrons en place les outils fondamentaux pour les design system. Notre dossier de composants d'interface utilisateur sera organisé et consultable grâce à Storybook. diff --git a/content/design-systems-for-developers/react/fr/build.md b/content/design-systems-for-developers/react/fr/build.md new file mode 100644 index 000000000..be0ecb138 --- /dev/null +++ b/content/design-systems-for-developers/react/fr/build.md @@ -0,0 +1,233 @@ +--- +title: "Construire les composants de l'interface utilisateur" +tocTitle: 'Construction' +description: 'Configurer Storybook pour construire et classer les composants du design system' +commit: 'c5f4c8d' +--- + +Dans ce chapitre 3, nous mettrons en place les outils essentiels au design system en commençant par Storybook, l'outil de visualisation de composants le plus populaire. L'objectif de ce guide est de vous montrer comment les équipes professionnelles construisent des design system. Nous nous concentrerons donc sur des détails plus précis comme la qualité du code, les modules complémentaires (addons) Storybook qui permettent de gagner du temps, et la structure des dossiers. + +![La place de Storybook](/design-systems-for-developers/design-system-framework-storybook.jpg) + +## Formatage et linting pour l'hygiène du code + +Les design system étant collaboratifs, les outils qui corrigent la syntaxe et normalisent le formatage permettent d'améliorer la qualité des contributions. Garantir une cohérence du code à l'aide d'outils est beaucoup moins laborieuse que de corriger le code à la main, ce qui est un avantage pour l'auteur du design system qui sait comment s'y prendre. + +Dans ce tutoriel, nous utiliserons [VSCode](https://code.visualstudio.com/) comme éditeur de code, mais vous pouvez appliquer les mêmes principes à d'autres éditeurs modernes comme [Atom](https://atom.io/), [Sublime](https://www.sublimetext.com/), ou [IntelliJ](https://www.jetbrains.com/idea/). + +Pour garantir un style de code cohérent, nous utiliserons [Prettier] (https://prettier.io/). Ce formateur de code est largement utilisé et prend en charge plusieurs langages. Il s'intègre parfaitement à la plupart des éditeurs, y compris celui que nous utilisons, et était inclus dans le modèle que nous avons clôné plus haut dans ce guide lorsque nous avons initialisé notre design system. Si vous utilisez Prettier pour la première fois, vous devrez peut-être le configurer pour votre éditeur. Avec VSCode, installez l'extension Prettier. + +![Prettier pour VSCode](/design-systems-for-developers/prettier-addon.png) + +Activez le format de sauvegarde `editor.formatOnSave` si vous ne l'avez pas déjà fait. Une fois que vous avez installé Prettier, vous devriez constater qu'il formate automatiquement votre code chaque fois que vous enregistrez un fichier. + +## Installer Storybook + +Storybook est [l'outil de visualisation de composants](https://www.chromatic.com/blog/ui-component-explorers---your-new-favorite-tool) standard de l'industrie pour développer des composants UI en isolation. Puisque les design system se concentrent sur les composants UI, Storybook est l'outil idéal pour ce cas d'utilisation. Nous nous appuierons sur les caractéristiques suivantes : + +- 📕Cataloguer les composants de l'interface utilisateur +- 📄Enregistrer les variations de composants sous forme de stories +- ⚡️Utiliser un outil pour l'expérience développeur comme Hot Module Reloading +- 🛠Prendre en charge de nombreuses couches de visualisation, y compris React + +Installez et lancez Storybook avec les commandes suivantes : + +```shell:clipboard=false +# Installs Storybook +npx storybook@latest init + +# Starts Storybook in development mode +yarn storybook +``` + +Vous devriez voir ceci : + +![Interface de démarrage de Storybook](/design-systems-for-developers/storybook-initial-7-0.png) + +Bien, nous avons mis en place notre outil de visualisation de composants ! + +Chaque fois que vous installez Storybook dans une application, il ajoute des exemples dans le dossier `stories`. Si vous le souhaitez, prenez le temps de les explorer. Mais nous n'en aurons pas besoin pour notre design system, il vaut donc mieux supprimer le dossier `stories`. + +Votre Storybook devrait maintenant ressembler à ceci (vous voyez que les styles de police sont un peu différents, par exemple la story « Avatar : Initials ») : + + + +### Ajouter les styles globaux + +Notre design system nécessite que certains styles globaux (un reset CSS) soient appliqués au document pour afficher correctement nos composants. Nous pouvons les ajouter facilement à l'aide de la [propriété de style global](https://emotion.sh/docs/globals) d'Emotion. Mettez à jour votre fichier `src/shared/global.js` comme suit : + +```diff:title=src/shared/global.js +import { css } from '@emotion/react'; + +import { color, typography } from './styles'; + ++ export const fontUrl = 'https://fonts.googleapis.com/css?family=Nunito+Sans:400,700,800,900'; + +export const bodyStyles = css` + /* Same as before */ +`; + +export const GlobalStyle = css` + body { + ${bodyStyles} + } +`; +``` + +Pour utiliser le « composant » `Global` dans Storybook, nous pouvons utiliser un [décorateur](https://storybook.js.org/docs/react/writing-stories/decorators) (un élément qui enveloppe le composant, aussi appelé wrapper). En règle générale, nous placerions ce composant au plus haut niveau de notre application, mais dans Storybook, nous enveloppons toutes les stories en utilisant le fichier de configuration « preview » [`.storybook/preview.js`](https://storybook.js.org/docs/react/configure/overview#configure-story-rendering). +Renommez le fichier en `.storybook/preview.jsx` et mettez-le à jour comme suit : + +```diff:title=.storybook/preview.jsx ++ import { Global } from '@emotion/react'; + ++ import { GlobalStyle } from '../src/shared/global'; + +/** @type { import('@storybook/react').Preview } */ +const preview = { ++ decorators: [ ++ (Story) => ( ++ <> ++ ++ ++ ++ ), ++ ], + parameters: { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + }, +}; + +export default preview; +``` + +
💡 Le <> dans le décorateur n'est pas une faute de frappe : c'est un Fragment React que nous utilisons ici pour éviter d'ajouter une balise HTML supplémentaire inutile à notre élément de sortie.
+ +Le décorateur assure le rendu du `GlobalStyle` quelle que soit la story sélectionnée. + +![Storybook avec des styles globaux](/design-systems-for-developers/storybook-global-styles-7-0.png) + +## Optimiser Storybook avec des modules complémentaires + +Storybook comprend un puissant [écosystème d'addons](https://storybook.js.org/addons) créé par une vaste communauté. En tant que développeurs pragmatiques, il est plus facile de construire notre flux de travail en utilisant l'écosystème plutôt que de créer nous-mêmes des outils personnalisés (ce qui peut prendre beaucoup de temps). + +

L'addon Actions pour vérifier l'interactivité

+ +L'addon [actions](https://storybook.js.org/docs/react/essentials/actions) vous donne une information dans Storybook lorsqu'une action est effectuée sur un élément interactif comme un bouton ou un lien. Les actions sont installées par défaut dans Storybook, et vous les utilisez simplement en passant une « action » en tant que propriété à un composant. + +Voyons comment l'utiliser dans notre élément Button, qui prend en option un composant enveloppant pour réagir aux clics. Nous avons une story qui transmet une action à ce wrapper : + +```jsx:title=src/Button/Button.stories.jsx +import styled from '@emotion/styled'; + +import { Button } from './Button'; + +import { Icon } from '../Icon/Icon'; + +import { StoryLinkWrapper } from '../LinkWrapper'; + +// When the user clicks a button, it will trigger the `action()`, +// ultimately showing up in Storybook's addon panel. +function ButtonWrapper(props) { + return ; +} + +export const buttonWrapper = { + name: 'button wrapper', + render: () => ( +
+ Original Button Wrapper +
+ + /* Removed for brevity */ +
+ ), +}; +``` + + + +

Controls pour tester les composants de manière approfondie

+ +Les nouvelles fonctionnalités de Storybook incluent l'[addon Controls](https://storybook.js.org/docs/react/essentials/controls) configuré par défaut. + +Il vous permet d'interagir avec les entrées des composants (props) de façon dynamique dans l'interface utilisateur de Storybook. Vous pouvez fournir plusieurs valeurs à une propriété du composant via des [arguments](https://storybook.js.org/docs/react/writing-stories/args) (ou args en abrégé) et les ajuster via l'interface utilisateur. Il aide les créateurs de design system à tester les entrées des composants (props) en ajustant les valeurs de l'argument. Il permet également aux utilisateurs des design system de tester les composants avant de les intégrer afin de comprendre comment chaque entrée (prop) les affecte. + +Voyons comment ils fonctionnent en ajoutant une nouvelle story dans le composant `Avatar`, situé dans `src/Avatar/Avatar.stories.jsx` : + +```jsx:title=src/Avatar/Avatar.stories.jsx +import { Avatar } from './Avatar'; + +export default { + title: 'Design System/Avatar', + component: Avatar, + /* + * More on Storybook argTypes at: + * https://storybook.js.org/docs/react/api/argtypes + */ + argTypes: { + size: { + control: { + type: 'select', + }, + options: ['tiny', 'small', 'medium', 'large'], + }, + }, +}; + +// Other Avatar stories + +/* + * New story using Controls + * Read more about Storybook templates at: + * https://storybook.js.org/docs/react/writing-stories/introduction#using-args + */ +export const Controls = { + args: { + loading: false, + size: 'tiny', + username: 'Dominic Nguyen', + src: 'https://avatars.githubusercontent.com/u/263385', + }, +}; +``` + +Regardez l'onglet Controls dans le panneau des addons. Les Controls génèrent automatiquement une interface graphique permettant d'ajuster les propriétés. Par exemple, le sélecteur « size » nous permet de faire défiler les tailles d'Avatar disponibles : `tiny`, `small`, `medium`, et `large`. La même chose a été appliquée aux autres propriétés du composant (« loading », « username » et « src »), ce qui nous a permis de créer une méthode centrée sur l'utilisateur pour tester les composants. + + + +Ceci étant dit, les Controls ne remplacent pas les stories. Ils sont parfaits pour explorer les cas limites des composants et des stories, et pour mettre en avant les états supposés. + +Nous explorerons les addons Accessibility et Docs dans les prochains chapitres. + +> Storybook est un puissant outil d'environnement frontend qui permet aux équipes de concevoir, de construire et d'organiser des composants d'interface utilisateur (et même des écrans complets !) sans se laisser embrouiller par la logique métier et les détails techniques - Brad Frost, auteur de Atomic Design + +## Apprendre à automatiser la maintenance + +Maintenant que les composants de notre design system sont dans Storybook, nous avons fait un pas de plus vers la création d'un design system standard pour l'industrie. C'est maintenant le moment idéal pour livrer notre travail sur notre dépôt distant. Ensuite, nous pouvons commencer à réfléchir à la manière de mettre en place les outils automatisés qui simplifient la maintenance continue. + +Un design system, comme tout logiciel, doit évoluer. Le défi consiste à s'assurer que les composants de l'interface utilisateur conservent l'apparence et la fonctionnalité voulues au fur et à mesure que le design system se développe. + +Dans le chapitre 4, nous apprendrons à mettre en place l'intégration continue et à publier automatiquement le design system en ligne à des fins de collaboration. diff --git a/content/design-systems-for-developers/react/fr/conclusion.md b/content/design-systems-for-developers/react/fr/conclusion.md new file mode 100644 index 000000000..7caa68f09 --- /dev/null +++ b/content/design-systems-for-developers/react/fr/conclusion.md @@ -0,0 +1,86 @@ +--- +title: 'Conclusion' +tocTitle: 'Conclusion' +description: "Les design system efficaces permettent de gagner du temps et d'augmenter la productivité" +--- + +Des études appuyées par des recherches suggèrent que la réutilisation du code peut permettre de gagner [42-81% de temps](https://www.researchgate.net/publication/3188437_Evaluating_Software_Reuse_Alternatives_A_Model_and_Its_Application_to_an_Industrial_Case_Study?ev=publicSearchHeader&_sg=g8WraNGZNGPw0R-1-jGpy0XwUDeAr3qb472J6lhisyQ3l24pSmndO6anMdX2L3HdWHifsczPegR9wjA) et d'augmenter la productivité de [40%](http://www.cin.ufpe.br/~in1045/papers/art03.pdf). Il n'est donc pas surprenant que les design system, qui facilitent le partage du **code de l'interface utilisateur**, soient de plus en plus populaires auprès des développeurs. + +Au cours des dernières années, Tom et moi (Dominic) avons vu d'innombrables équipes chevronnées ancrer leur design system autour de Storybook. Ils se sont concentrés sur la réduction des frais généraux de communication, sur une architecture durable et sur l'automatisation des tâches manuelles répétitives. +Nous espérons que le partage de ces bonnes pratiques contribuera à l'épanouissement de votre design system. + +Merci d'apprendre avec nous. Abonnez-vous à la newsletter de Storybook pour être informé de la publication d'articles et de guides utiles comme celui-ci. + + + +## Exemple de code pour ce tutoriel + +Si vous codez avec nous, vos dépôts devraient ressembler à ceci : + +- [Dépôt du design system](https://github.com/chromaui/learnstorybook-design-system) +- [Dépôt de application d'exemple](https://github.com/chromaui/learnstorybook-design-system-example-app) + +Le code d'exemple est basé sur [le propre design system de Storybook](https://github.com/storybookjs/design-system) (SDS) qui alimente l'expérience utilisateur de dizaines de milliers de développeurs. Le SDS est en cours de développement – nous acceptons volontiers les contributions de la communauté. En tant que contributeur, vous aurez une expérience concrète des meilleures pratiques en matière de design system et des techniques émergentes. SDS est également le lieu où l'équipe de Storybook présente des fonctionnalités de pointe. + +## A propos + +_design system for Developers_ a été créé par [Dominic Nguyen](https://twitter.com/domyen) et [Tom Coleman](https://twitter.com/tmeasday). +Dominic a conçu l'interface utilisateur, la marque et le design system de Storybook. Tom est membre du comité de pilotage de Storybook dans le domaine de l'architecture frontend. Il a travaillé sur le Component Story Format, l'API des modules complémentaires et l'API des paramètres. + +Conseils d'experts de [Kyle Suss](https://github.com/kylesuss), responsable technique du design system de Storybook, et de [Michael Shilman](https://twitter.com/mshilman), créateur de Storybook Docs. + +Le contenu, le code et la production vous sont proposés par [Chromatic](https://www.chromatic.com/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook). Le [Design Forward Fund](https://www.invisionapp.com/design-forward-fund) d'InVision a gracieusement contribué au lancement en accordant une subvention. Nous recherchons des sponsors pour permettre la poursuite de la maintenance et l'élaboration de nouveaux guides comme celui-ci. +Envoyez un mail à [Dominic](mailto:dom@chromatic.com) pour plus de détails. + +## Élargissez votre champ d'action + +Il est utile d'élargir votre champ d'action afin d'obtenir une vision complète de la notion de design system. + +- [Atomic Design par Brad Frost](http://atomicdesign.bradfrost.com/) (livre) +- [Eightshapes par Nathan Curtis](https://medium.com/eightshapes-llc/tagged/design-systems) (blog) +- [Building design system par Sarrah Vesselov et Taurie Davis ](https://www.amazon.com/Building-Design-Systems-Experiences-Language/dp/148424513X) (livre) + +Pour davantage de contenus par les auteurs : + +- [Introduction to Storybook](https://storybook.js.org/tutorials/intro-to-storybook/) (guide) +- [Component-Driven Development par Tom Coleman](https://www.chromatic.com/blog/component-driven-development/) (article) +- [Why design system are a single point of failure par Dominic Nguyen](https://www.chromatic.com/blog/why-design-systems-are-a-single-point-of-failure/) (article) +- [UI Testing Playbook par Varun Vachhar](https://storybook.js.org/blog/ui-testing-playbook/) (article) +- [Visual Testing par Varun Vachhar](https://storybook.js.org/blog/visual-testing-in-storybook/) (article) + +## FAQ + +#### N'y a-t-il pas plus que cela dans les design system ? + +Les design system comprennent (sans s'y limiter) les fichiers de design, les librairies de composants, les design tokens, la documentation, les principes et les flux de travail et de contribution. Le guide est axé sur le point de vue du développeur sur les design system et nous couvrons donc un sous-ensemble de sujets. Plus précisément, les détails techniques, les API et l'infrastructure qui entrent dans la composition des design system de la production. + +#### Qu'en est-il de la gouvernance des design system ? + +La gouvernance est un sujet nuancé qui est plus vaste et plus spécifique aux organisations que ce que nous pouvons faire tenir en neuf chapitres. + +#### Storybook s'intègre-t-il aux outils de design ? + +Oui ! La communauté Storybook crée des modules complémentaires qui facilitent l'intégration des outils de design. Par exemple, le [Design System Manager](https://www.invisionapp.com/design-system-manager) d'InVision s'intègre à Storybook pour présenter des stories dans l'application InVision. Il existe également des modules complémentaires créés par la communauté pour les [design tokens](https://github.com/UX-and-I/storybook-design-token), [Sketch](https://github.com/chrisvxd/story2sketch) et [Figma](https://github.com/pocka/storybook-addon-design). + +![Intégrations d'outils de design](/design-systems-for-developers/storybook-integrations-design.jpg) + +#### Un design system est-il utile pour une seule application ? + +Non. La création et la maintenance d'un design system ont un coût. À petite échelle, un design system demande plus d'efforts qu'il n'en rapporte en termes de gain de temps. + +#### Comment les applications clientes se protègent-elles des changements inattendus du design system ? + +Personne n'est parfait. Votre design system comportera inévitablement un bug qui aura des répercussions sur les applications clientes. Limitez ces incidents en structurant le Storybook de votre application cliente avec des tests automatisés (visuels, unitaires, etc.) de la même manière que nous l'avons fait avec le design system. Ainsi, lorsque vous mettrez à jour les dépendances d'une branche (manuellement ou avec des services automatisés comme [Dependabot](https://dependabot.com/)), la série de tests de votre application cliente détectera les régressions entrantes du design system. + +![Mises à jour du design system](/design-systems-for-developers/design-system-update.png) + +#### Comment proposer des modifications au design system ? + +L'équipe du design system est une équipe de service. Au lieu d'interagir avec les utilisateurs finaux, elle a pour but de rendre les équipes internes travaillant sur les applications plus productives. +Les responsables du design system sont chargés de gérer les demandes et de communiquer sur l'état d'avancement aux autres équipes. De nombreuses équipes utilisent un gestionnaire de tâches comme Jira, Asana ou Trello pour assurer le suivi des propositions. + +## Remerciements + +Merci à l'incroyable communauté Storybook pour ses retours précieux. + +Gert Hengeveld et Norbert de Langen (Chroma), Alex Wilson (T. Rowe Price), Jimmy Somsanith (Talend), Dan Green-Leipciger (Wave), Kyle Holmberg (Air), Andrew Frankel (Salesforce), Fernando Carrettoni (Auth0), Pauline Masigla et Kathleen McMahon (O'Reilly Media), Shawn Wang (Netlify), Mark Dalgleish (SEEK), Stephan Boak (Datadog), Andrew Lisowski (Intuit), Kaelig Deloumeau-Prigent et Ben Scott (Shopify), Joshua Ogle (Hashicorp), Atanas Stoyanov, Daniel Miller (Agile Six), Matthew Bambach (2u), Beau Calvez (AppDirect), Jesse Clark (American Family Insurance), Trevor Eyre (Healthwise), Justin Anastos (Apollo GraphQL), Donnie D'Amato (Compass), Michele Legait (PROS), Guilherme Morais (doDoc), John Crisp (Acivilate), Marc Jamais (SBS Australia), Patrick Camacho (Framer), Brittany Wetzel (United Airlines), Luke Whitmore, Josh Thomas (Ionic), Ryan Williamson-Cardneau (Cisco), Matt Stow (Hireup), Mike Pitt (Zeplin), Jordan Pailthorpe (NextRequest), Jessie Wu (New York Times), Lee Robinson (Hy-Vee) diff --git a/content/design-systems-for-developers/react/fr/distribute.md b/content/design-systems-for-developers/react/fr/distribute.md new file mode 100644 index 000000000..8778c6a17 --- /dev/null +++ b/content/design-systems-for-developers/react/fr/distribute.md @@ -0,0 +1,545 @@ +--- +title: "Partager l'interface utilisateur au sein d'une organisation" +tocTitle: 'Partager' +description: "Apprenez à packager et à importer votre design system dans d'autres applications" +commit: '7a53150' +--- + +D'un point de vue architectural, les design system constituent une autre dépendance frontend. Ils ne sont pas tant différents des dépendances populaires telles que moment ou lodash. Les composants UI sont du code, nous pouvons donc nous appuyer sur des techniques établies pour la réutilisation du code. + +Ce chapitre traite du partage des design system, du packaging des composants de l'interface utilisateur à leur import dans d'autres applications. Nous découvrirons également des techniques permettant de gagner du temps pour simplifier la gestion des mises en production et les processus de publication. + +![Propager des composants dans les sites](/design-systems-for-developers/design-system-propagation.png) + +## Packager le design system + +Les entreprises disposent de milliers de composants d'interface utilisateur répartis dans différentes applications. Auparavant, nous avons extrait les composants les plus utilisés dans notre design system, et nous devons maintenant réintroduire ces composants dans les applications. + +Notre design system utilise npm, le gestionnaire de packages JavaScript pour gérer la distribution, les versions et la gestion des dépendances. + +Il existe de nombreuses méthodes valables pour packager les design system. Jetez un coup d'œil aux design system de Lonely Planet, Auth0, Salesforce, GitHub et Microsoft pour voir la diversité des approches. Certains livrent chaque élément séparément, tandis que d'autres livrent tous les éléments dans un seul package. + +Pour les design system naissants, la méthode la plus directe consiste à publier une version unique d'un package qui comprend : + +- 🏗 Les composants communs de l'interface utilisateur +- 🎨 Les design tokens (également appelés variables de style) +- 📕 La documentation + +![Packager un design system](/design-systems-for-developers/design-system-package.jpg) + +## Préparer votre design system pour l'exportation + +Nous avons utilisé un modèle personnalisé à des fins de développement, de test et de documentation. Toutefois, nous devons améliorer sa nature descriptive avant de publier notre design system. Il est essentiel de mettre de l'ordre dans certains éléments initiaux et de mettre à jour le fichier README.md avec une description détaillée de notre design system. + +```markdown:title=README.md +# Storybook design system tutorial + +The Storybook design system tutorial is a subset of the full [Storybook design system](https://github.com/storybookjs/design-system/), created as a learning resource for those interested in learning how to write and publish a design system using best in practice techniques. + +Learn more in [Storybook tutorials](https://storybook.js.org/tutorials/). +``` + +Voyons maintenant comment nous allons construire le système de packages. Pour compiler notre design system, nous utiliserons [Rollup](https://rollupjs.org/), un outil de regroupement de modules JavaScript qui combine de petits fragments de code dans de plus grandes librairies ou applications. L'avantage est que les paramètres requis et les points d'entrée communs sont déjà inclus dans le fichier `src/index.js` et `rollup.config.mjs`, il n'est donc pas nécessaire de les configurer nous-mêmes. + +```js:clipboard=false +// src/index.js + + +import * as styles from './shared/styles'; +import * as global from './shared/global'; +import * as animation from './shared/animation'; +import * as icons from './shared/icons'; + +export { styles, global, animation, icons }; + + +export * from './Avatar'; +export * from './Badge'; +export * from './Button'; +export * from './Icon'; +export * from './Link'; +``` + +```js:clipboard=false +// rollup.config.mjs + +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import terser from '@rollup/plugin-terser'; +import peerDepsExternal from 'rollup-plugin-peer-deps-external'; +import { babel } from '@rollup/plugin-babel'; + +// This is required to read package.json file when +// using Native ES modules in Node.js +// https://rollupjs.org/command-line-interface/#importing-package-json +import { createRequire } from 'node:module'; +const requireFile = createRequire(import.meta.url); +const packageJson = requireFile('./package.json'); + +export default [ + { + input: 'src/index.js', + output: [ + { + file: packageJson.main, + format: 'cjs', + sourcemap: true, + }, + { + file: packageJson.module, + format: 'esm', + exports: 'named', + sourcemap: true, + }, + ], + plugins: [ + peerDepsExternal(), + resolve({ + extensions: ['.js', '.jsx'], + }), + commonjs(), + terser(), + babel({ + extensions: ['.js', '.jsx'], + exclude: 'node_modules/**', + }), + ], + external: ['react', 'react-dom', '@emotion/react', '@emotion/styled'], + }, +]; +``` + +Maintenant nous pouvons lancer `yarn build` pour compiler notre code dans le dossier `dist`. Nous devrions aussi ajouter ce dossier à `.gitignore`, pour ne pas l'ajouter accidentellement à nos commits : + +```TEXT:title=.gitignore +// ... +dist +``` + +#### Ajouter les métadonnées du package pour la publication + +Nous allons devoir modifier notre `package.json` pour nous assurer que nos utilisateurs du package détiennent toutes les informations nécessaires. La façon la plus simple de le faire est de lancer `yarn init`, une commande qui initialise le package pour la publication : + +```shell:clipboard=false +# Initializes a scoped package +yarn init --scope=@your-npm-username + +yarn init v1.22.5 +question name (learnstorybook-design-system): @your-npm-username/learnstorybook-design-system +question version (0.1.0): +question description (Learn Storybook design system):Storybook design system tutorial +question entry point (dist/cjs/index.js): +question repository url (https://github.com/your-username/learnstorybook-design-system.git): +question author (your-npm-username ): +question license (MIT): +question private: no +``` + +La commande nous posera une série de questions, certaines sont pré-remplies, tandis que d'autres nécessiteront une réflexion. Vous devrez choisir un nom unique pour le package npm (vous ne pourrez pas utiliser `learnstorybook-design-system` : mais plutôt `@votre-nom-d'utilisateur-npm/learnstorybook-design-system`). + +En résumé, il mettra à jour le `package.json` avec les nouvelles valeurs résultant de ces questions : + +```json:clipboard=false +{ + "name": "@your-npm-username/learnstorybook-design-system", + "description": "Storybook design system tutorial", + "version": "0.1.0", + "license": "MIT", + "main": "dist/cjs/index.js", + "repository": "https://github.com/your-username/learnstorybook-design-system.git" + // ... +} +``` + +
Par souci de concision, les scopes du package n'ont pas été mentionnées. L'utilisation des scopes vous permet de créer un package portant le même nom qu'un package créé par un autre utilisateur ou une autre organisation sans qu'il n'y ait de conflit. +
+ +Maintenant que nous avons préparé notre package, nous pouvons le publier sur npm pour la première fois ! + +## Gestion des mises en production avec Auto + +Pour publier des mises en production sur npm, nous utiliserons un processus qui met également à jour un historique des versions (changelog) qui décrit les modifications, définit un numéro de version appropré, et crée un tag git qui lie ce numéro de version à un commit dans notre référentiel. Pour vous aider, nous utiliserons un outil open-source appelé [Auto](https://github.com/intuit/auto), conçu précisément dans ce but. Auto est un outil en ligne de commande que nous pouvons utiliser pour diverses tâches courantes liées à la gestion des mises en production. Vous pouvez en savoir plus sur Auto en consultant [leur site de documentation](https://intuit.github.io/auto/). + +#### Obtenir un token GitHub et npm + +Pour les prochaines étapes, Auto communiquera avec GitHub et npm. Pour que cela fonctionne correctement, nous avons besoin d'un token d'accès personnel. +Vous pouvez en obtenir un sur [cette page](https://github.com/settings/tokens) pour GitHub. Le token aura besoin des deux scopes `repo` et `workflow`. + +Pour npm, vous pouvez créer un token via l'URL suivante : https://www.npmjs.com/settings/<your-username>/tokens. + +Vous aurez besoin d'un token avec les permissions « Lecture et Publication ». + +Ajoutons ce token à un fichier appelé `.env` dans notre projet : + +```TEXT:title=.env +GH_TOKEN= +NPM_TOKEN= +``` + +En ajoutant le fichier à `.gitignore`, nous nous assurons que nous ne poussons pas accidentellement cette valeur dans un référentiel open-source que tous nos utilisateurs peuvent voir ! Ce point est crucial. Si d'autres mainteneurs ont besoin de publier le package localement (plus tard, nous mettrons en place une publication automatique lorsqu'une Pull Request (PR) est mergée dans la branche par défaut), ils doivent configurer leur propre fichier `.env` en suivant ce processus : + +```TEXT:title=.gitignore +dist +.env +``` + +#### Créer des labels sur GitHub + +La première chose à faire avec Auto est de créer un ensemble de labels dans GitHub. Nous utiliserons ces labels plus tard lorsque nous effectuerons des changements dans le package (voir le chapitre suivant), cela permettra à `auto` de mettre à jour la version du package de manière appropriée et de créer un historique des versions et des notes de publication. + +```shell +yarn auto create-labels +``` + +Si vous vérifiez sur GitHub, vous verrez maintenant un ensemble de labels que `auto` voudrait que nous utilisions : + +![Ensemble de labels créés sur GitHub par auto](/design-systems-for-developers/github-auto-labels.png) + +Nous devrions attribuer l'un des labels suivants à chaque prochaine Pull Request (PR) : `major`, `minor`, `patch`, `skip-release`, `prerelease`, `internal`, `documentation` avant de la merger. + +#### Publier notre première mise en production avec Auto manuellement + +Dans le futur, nous déterminerons les nouveaux numéros de version avec `auto` via des scripts, mais pour la première mise en production, lançons les commandes manuellement pour comprendre ce qu'elles font. Générons notre première entrée dans l'historique des versions : + +```shell +yarn auto changelog +``` + +La commande générera une longue entrée de l'historique des versions avec chaque commit que nous avons créé jusqu'à présent (et un avertissement que nous avons poussé vers la branche par défaut, ce que nous devrons bientôt cesser de faire). + +Bien qu'il soit utile d'avoir un l'historique des versions généré automatiquement, afin de ne pas manquer des choses, c'est aussi une bonne idée de l'éditer manuellement et de rédiger le message de la manière la plus claire pour les utilisateurs. Dans notre cas, les utilisateurs n'ont pas besoin de connaître toutes les modifications apportées en cours de route. Créons un message simple et agréable pour notre première version v0.1.0. Commencez par annuler le commit qu'Auto vient de créer (mais conservez les modifications) : + +```shell +git reset HEAD^ +``` + +Ensuite, nous mettrons à jour l'historique des versions et l'ajouterons au commit : + +```markdown:title=CHANGELOG.md +# v0.1.0 (Mon Jun 12 2023) + +- Created first version of the design system, with `Avatar`, `Badge`, `Button`, `Icon` and `Link` components. + +#### Authors: 1 + +- [your-username](https://github.com/your-username) +``` + +Ajoutons cet historique à git. Notez que nous utilisons `[skip ci]` pour indiquer aux plateformes CI d'ignorer ces commits, sinon nous nous retrouverons avec une boucle de build et de publications. + +```shell:clipboard=false +git add CHANGELOG.md +git commit -m "Changelog for v0.1.0 [skip ci]" +``` + +Nous pouvons maintenant publier : + +```shell:clipboard=false +npm --allow-same-version version 0.1.0 -m "Bump version to: %s [skip ci]" +npm publish --access=public +``` + +
+💡 N'oubliez pas d'ajuster les commandes en conséquence si vous utilisez yarn pour publier votre package. +
+ +Et utilisez Auto pour mettre en production sur GitHub : + +```shell:clipboard=false +git push --follow-tags origin main +yarn release +``` + +Super ! +Nous avons publié avec succès notre package sur npm et fait une première mise en production sur GitHub (avec un peu de chance !). + +![Package publié sur npm](/design-systems-for-developers/npm-published-package.png) + +![Version publiée sur GitHub](/design-systems-for-developers/github-published-release.png) + +
+ +💡 Bien que nous ayons modifié les notes de version initiales pour qu'elles aient un sens pour la première version, `auto` génère automatiquement les notes de version basées sur les messages de commit pour les prochaines versions. + +
+ +Maintenant, quand nous lançons `yarn release`, nous allons passer par toutes les étapes que nous avons exécutées ci-dessus (sauf l'utilisation de l'historique auto-généré) de manière automatisée. Toutes les modifications apportées à la branche par défaut seront publiées. + +Bravo ! Vous avez mis en place l'infrastructure nécessaire pour publier manuellement les versions de votre design system. Apprenez maintenant à les automatiser grâce à l'intégration continue. + +## Mettre en production automatiquement + +Nous utilisons GitHub Actions pour l'intégration continue. Mais avant de continuer, nous devons stocker de manière sécurisée les tokens GitHub et NPM de tout à l'heure afin que Actions puisse y accéder. + +#### Ajoutez vos tokens à GitHub Secrets + +GitHub Secrets nous permet de stocker des informations sensibles dans notre référentiel. Dans une fenêtre du navigateur, ouvrez votre référentiel GitHub. + +Cliquez sur l'onglet ⚙️ Settings (Paramètres), puis sur le menu déroulant `Secrets and variables` dans la barre latérale, suivi du lien `Actions`. L'écran suivant apparaît : + +![Page vide des secrets GitHub](/design-systems-for-developers/github-empty-secrets-page.png) + +Cliquez sur le bouton **New repository secret**. Utilisez `NPM_TOKEN` pour le nom et collez le token que vous avez obtenu de npm plus tôt dans ce chapitre. + +![Formulaire GitHub secrets rempli](/design-systems-for-developers/github-secrets-form-filled.png) + +Lorsque vous ajoutez le secret npm à votre référentiel, vous pourrez y accéder en via `secrets.NPM_TOKEN`. Vous n'avez pas besoin de définir un autre secret pour votre token GitHub. Tous les utilisateurs de GitHub ont automatiquement un `secrets.GITHUB_TOKEN` associé à leur compte. + +#### Automatiser les mises en production avec GitHub Actions + +Chaque fois que nous mergeons une Pull Request (PR), nous voulons publier automatiquement le design system. Créez un nouveau fichier appelé `push.yml` dans le même dossier que nous avons utilisé plus tôt pour publier Storybook et ajoutez le code suivant : + +```yml:title=.github/workflows/push.yml +# Name of our action +name: Release + +# The event that will trigger the action +on: + push: + branches: [main] + +# what the action will do +jobs: + release: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'ci skip') && !contains(github.event.head_commit.message, 'skip ci')" + steps: + - uses: actions/checkout@v2 + + - name: Prepare repository + run: git fetch --unshallow --tags + - name: Use Node.js 16.x + uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install dependencies + uses: bahmutov/npm-install@v1 + - name: Create Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + #👇 npm token, see https://storybook.js.org/tutorials/design-systems-for-developers/react/en/distribute/ to obtain it + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + yarn release +``` + +
+Des permissions supplémentaires peuvent être nécessaires pour permettre à GitHub Actions de récupérer le contenu du référentiel et de publier le package dans npm. Consultez la documentation de GitHub pour plus d'informations. +
+ +Enregistrez et effectuez un commit de vos modifications vers le dépôt distant. + +Bravo ! Désormais, chaque fois que vous mergerez une Pull Request (PR) dans la branche par défaut, une nouvelle version sera automatiquement publiée, en incrémentant le numéro de version comme il se doit grâce aux labels que vous avez ajoutés. + +
💡 Nous n'avons pas parcouru toutes les fonctionnalités et intégrations d'Auto qui pourraient être utiles pour les design system en devenir. Consultez la documentation ici.
+ +![Importer le design system](/design-systems-for-developers/design-system-import.png) + +## Importer le design system dans une application + +Maintenant que notre design system est en ligne, l'installation de la dépendance et l'utilisation des composants de l'interface utilisateur sont simples. + +#### Obtenir l'application d'exemple + +Plus tôt dans ce tutoriel, nous nous sommes basés sur un ensemble d'outils frontend populaires qui inclut React et Emotion. Cela signifie que notre application d'exemple doit également utiliser React et Emotion pour tirer pleinement parti du design system. + +
+ +💡 Bien que d'autres outils tels que Svelte ou Web Components, permettent de partager des composants UI sans dépendre d'un framework spécifique, nous nous sommes concentrés sur les méthodes les plus couramment utilisées et les plus documentées afin de garantir une prise en main rapide de ce tutoriel. +Soyez assurés que nous explorerons d'autres méthodes dans les prochaines mises à jour. + +
+ +L'application d'exemple utilise Storybook pour faciliter le [développement centré sur les composants](https://www.componentdriven.org/), une méthodologie de développement d'applications qui développe des interfaces utilisateur à partir de la base, en commençant par les composants et en terminant par les pages. Nous utiliserons deux Storybooks en parallèle pendant la démonstration : un pour notre application d'exemple et un pour notre design system. + +Exécutez les commandes suivantes dans votre ligne de commande pour configurer l'application d'exemple : + +```shell:clipboard=false +# Clones the files locally +npx degit chromaui/learnstorybook-design-system-example-app example-app + +cd example-app + +# Install the dependencies +yarn install + +## Start Storybook +yarn storybook +``` + +Vous devriez voir le Storybook se lancer avec les stories des composants simples utilisés par l'application : + +![Storybook initial pour l'application d'exemple](/design-systems-for-developers/example-app-starting-storybook-7-0.png) + +

Intégrer le design system

+ +Nous avons publié le Storybook de notre design system. Ajoutons-le à notre application d'exemple. Nous pouvons le faire en mettant à jour le fichier `.storybook/main.js` de l'application d'exemple avec ce qui suit : + +```diff:title=.storybook/main.js +/** @type { import('@storybook/react-vite').StorybookConfig } */ +const config = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + docs: { + autodocs: 'tag', + }, ++ refs: { ++ "design-system": { ++ title: 'My design system', ++ //👇 The url provided by Chromatic when it was deployed ++ url: 'https://your-published-url.chromatic.com', ++ }, ++ }, +}; +export default config; +``` + + + +
+Ajouter le refs qui pointe vers .storybook/main.js, nous permet de créer plusieurs Storybook en un. Cette fonction est utile lorsque l'on travaille sur de gros projets qui nécessitent plusieurs technologies différentes. +
+ +Vous pourrez désormais parcourir les composants du design system et la documentation tout en développant l'application d'exemple. La mise en place du design system pendant le développement de nouvelles fonctionnalités augmente la probabilité que les développeurs réutilisent les composants existants au lieu de perdre du temps à les réinventer. + +Nous avons tout ce dont nous avons besoin, il est temps d'ajouter notre design system et de commencer à l'utiliser. Exécutez la commande suivante dans votre terminal : + +```shell +yarn add @your-npm-username/learnstorybook-design-system +``` + +Nous devrons utiliser les mêmes styles globaux définis dans le design system, et donc mettre à jour le fichier de configuration [`.storybook/preview.jsx`](https://storybook.js.org/docs/react/configure/overview#configure-story-rendering) et ajouter un [décorateur global](https://storybook.js.org/docs/react/writing-stories/decorators#global-decorators). + +````diff:title=.storybook/main.js +```jsx:title=.storybook/preview.jsx +import { Global } from '@emotion/react'; + +// The styles imported from the design system. +import { global as designSystemGlobal } from '@your-npm-username/learnstorybook-design-system'; + +const { GlobalStyle } = designSystemGlobal; + +/** @type { import('@storybook/react').Preview } */ +const preview = { + /* + * Adds a global decorator to include the imported styles from the design system. + * More on Storybook decorators at: + * https://storybook.js.org/docs/react/writing-stories/decorators#global-decorators + */ + decorators: [ + (Story) => ( + <> + + + + ), + ], + /* + * More on Storybook parameters at: + * https://storybook.js.org/docs/react/writing-stories/parameters#global-parameters + */ + parameters: { + actions: { argTypesRegex: "^on[A-Z].*" }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + }, +}; + +export default preview; +```` + +![Le storybook de l'application d'exemple avec les stories du design system](/design-systems-for-developers/example-app-storybook-with-design-system-stories-7-0.png) + +Nous utiliserons le composant `Avatar` de notre design system dans le composant `UserItem` de l'application d'exemple. `UserItem` doit restituer des informations d'un utilisateur, notamment son nom et sa photo de profil. + +Dans votre éditeur, ouvrez le composant `UserItem` situé dans `src/components/UserItem.js`. Sélectionnez également `UserItem` dans votre Storybook pour voir les changements de code que nous sommes sur le point de faire instantanément avec le rechargement du hot module. + +Importez le composant Avatar. + +```js:title=src/components/UserItem.jsx +import { Avatar } from '@your-npm-username/learnstorybook-design-system'; +``` + +Nous voulons afficher le composant Avatar à côté du nom d'utilisateur. + +```diff:title=src/components/UserItem.jsx +import PropTypes from 'prop-types'; + +import styled from '@emotion/styled'; + ++ import { Avatar } from '@your-npm-username/learnstorybook-design-system'; + + +const Container = styled.div` + background: #eee; + +margin-bottom: 1em; + +padding: 0.5em; +`; + +- const Avatar = styled.img` +- border: 1px solid black; +- width: 30px; +- height: 30px; +- margin-right: 0.5em; +- `; + +const Name = styled.span` + +color: #333; + +font-size: 16px; +`; + +export default ({ user: { name, avatarUrl } }) => ( + + ++ + +{name} + + +); + + +UserItem.propTypes = { + user: PropTypes.shape({ + name: PropTypes.string, + avatarUrl: PropTypes.string, + +}), +}; + +``` + +Lors de la sauvegarde, le composant `UserItem` sera mis à jour dans Storybook pour afficher le nouveau composant Avatar. Comme `UserItem` fait partie du composant `UserList`, vous verrez également `Avatar` dans `UserList`. + +![L'application d'exemple qui utilise le design system](/design-systems-for-developers/example-app-storybook-using-design-system-7-0.png) + +Et voilà ! Vous venez d'importer un composant du design system dans l'application d'exemple. Chaque fois que vous publierez une mise à jour du composant Avatar dans le design system, cette modification sera également répercutée dans l'application d'exemple lorsque vous mettrez à jour le package. + +![Partager des design system](/design-systems-for-developers/design-system-propagation-storybook.png) + +## Maîtriser le flux de travail du design system + +Le flux de travail du design system commence par le développement de composants d'interface utilisateur dans Storybook et se termine par leur distribution aux applications clientes. Mais ce n'est pas tout. Les design system doivent évoluer en permanence pour répondre aux exigences toujours changeantes des produits, et notre travail ne fait que commencer. + +Le chapitre 8 illustre le flux de travail du design system de bout en bout que nous avons créé dans ce guide. Nous verrons comment les modifications de l'interface utilisateur se répercutent sur le design system. diff --git a/content/design-systems-for-developers/react/fr/document.md b/content/design-systems-for-developers/react/fr/document.md new file mode 100644 index 000000000..867e54c41 --- /dev/null +++ b/content/design-systems-for-developers/react/fr/document.md @@ -0,0 +1,466 @@ +--- +title: 'Documenter pour les utilisateurs' +tocTitle: 'Documentation' +description: 'Faciliter la prise en main du design system grâce à la documentation' +commit: '4af4d77' +--- + +Les [équipes](https://medium.com/@didoo/measuring-the-impact-of-a-design-system-7f925af090f7) [frontend](https://segment.com/blog/driving-adoption-of-a-design-system/) [professionnelles](https://product.hubspot.com/blog/how-to-gain-widespread-adoption-of-your-design-system) mesurent le succès d'un design system par sa prise en main. Pour bénéficier pleinement des avantages d'un design system en termes d'économie de travail, les composants doivent être largement diffusés. Sinon, quel est l'intérêt ? + +Dans ce chapitre, nous allons créer un « manuel d'utilisateur » du design system pour aider les utilisateurs à réutiliser les composants dans leurs applications. En cours de route, nous découvrirons les meilleures pratiques en matière de documentation de l'interface utilisateur utilisées par les équipes de Shopify, Microsoft, Auth0 et le gouvernement britannique. + +![Générer automatiquement une documentation avec Storybook](/design-systems-for-developers/design-system-generate-docs.jpg) + +## La documentation, c'est épuisant + +C'est évident : la documentation est inestimable pour le développement collaboratif de l'interface utilisateur. Elle aide les équipes à apprendre comment et quand utiliser les composants communs de l'interface utilisateur. Mais pourquoi cela demande-t-il tant d'efforts ? + +Si vous avez déjà créé une documentation, vous avez probablement consacré du temps à des tâches non liées à de la documentation, telles que l'infrastructure du site ou la gestion des rédacteurs techniques. Et même si vous trouvez le temps de publier une documentation, il est épuisant de la maintenir tout en développant de nouvelles fonctionnalités. + +**La plupart des documentations sont datées au moment même où elles sont créées.** Les documentations datées diminuent la confiance dans les composants du design system, ce qui incite les développeurs à créer de nouveaux composants au lieu de réutiliser ceux qui existent déjà. + +## Prérequis + +La création et la mise à jour de la documentation peuvent s'avérer difficiles, c'est pourquoi il est important de minimiser les obstacles. Voici ce qu'il faudrait faire : + +- **🔄 Rester à jour** en utilisant le code de production le plus récent +- **✍️ Faciliter l'écriture** en utilisant des outils d'écriture familiers comme Markdown +- **⚡️ Réduire le temps de maintenance** pour que les équipes puissent se concentrer sur l'écriture +- **📐Fournir des modèles standards** pour que les développeurs ne réécrivent pas les modèles communs. +- **🎨 Offrir des possibilités de personnalisation** pour les cas d'utilisation et les composants particulièrement complexes. + +En tant qu'utilisateurs de Storybook, nous avons une longueur d'avance car les variations des composants sont déjà enregistrées sous forme de stories : c'est une forme de documentation en soi. Une story montre comment un composant est censé fonctionner en fonction de différents inputs (propriétés). +Les stories sont faciles à écrire et se mettent à jour automatiquement car elles utilisent les composants de production. +De plus, les stories peuvent être testées par régression à l'aide des outils du chapitre précédent ! + +> Lorsque vous écrivez des stories, vous obtenez gratuitement de la documentation sur les composants ainsi que des exemples d'utilisation ! - Justin Bennett, ingénieur chez Artsy + +## Rédiger des stories, générer une documentation + +Avec l'addon Storybook Docs, nous pouvons générer une documentation riche à partir de stories existantes afin de réduire le temps de maintenance et d'obtenir des valeurs par défaut prêtes à l'emploi. +Comme les addons que nous avons couverts dans le chapitre [build](/design-systems-for-developers/react/fr/build/) (Controls et Actions), l'addon Docs est aussi inclus et configuré avec chaque installation de Storybook, ce qui nous permet de nous concentrer sur l'écriture d'une bonne documentation. + +Chaque fois que vous ouvrez votre Storybook, vous devriez voir une nouvelle entrée ajoutée à la barre latérale nommée « Docs » : + +![Onglet Docs dans Storybook](/design-systems-for-developers/storybook-docs-7-0.png) + +En parallèle, Storybook a rempli la barre latérale avec une entrée « Docs » pour chaque composant de la story qui a été configurée via la propriété de métadonnées [`tags`](https://storybook.js.org/docs/react/writing-docs/autodocs), créant une page de documentation auto-générée avec les éléments les plus fréquemment utilisés comme les aperçus interactifs, les visionneurs de code source, et une tableau d'arguments (args). Vous trouverez des caractéristiques similaires dans la documentation du design system de Shopify et d'Auth0. Le tout en moins de 2 minutes. + +## Générer la documentation + +Jusqu'à présent, nous avons bien avancé sans trop d'efforts, en veillant à ce que notre design system reste à jour du point de vue du code. Pourtant, la documentation manque encore d'une touche _humaine_. Nous devons la configurer et donner aux autres développeurs plus de contexte (pourquoi, quand et comment). Commencez par ajouter une propriété `tags` à la story du composant `Avatar` dans `src/Avatar/Avatar.stories.jsx` : + +```diff:title=src/Avatar/Avatar.stories.jsx +import { Avatar } from './Avatar'; + +export default { + title: 'Design System/Avatar', + component: Avatar, ++ tags: ['autodocs'], + /* + * More on Storybook argTypes at: + * https://storybook.js.org/docs/react/api/argtypes + */ + argTypes: { + size: { + control: { + type: 'select', + }, + options: ['tiny', 'small', 'medium', 'large'], + }, + }, +}; +``` + +Ensuite, ajoutons quelques métadonnées supplémentaires qui expliquent ce que fait le composant. Dans notre cas, nous ajouterons un sous-titre décrivant l'utilisation du composant Avatar : + +```diff:title=src/Avatar/Avatar.stories.jsx +import { Avatar } from './Avatar'; + +export default { + title: 'Design System/Avatar', + component: Avatar, + tags: ['autodocs'], ++ parameters: { ++ docs: { ++ subtitle: 'Displays an image that represents a user or organization', ++ }, ++ }, + /* + * More on Storybook argTypes at: + * https://storybook.js.org/docs/react/api/argtypes + */ + argTypes: { + size: { + control: { + type: 'select', + }, + options: ['tiny', 'small', 'medium', 'large'], + }, + }, +}; +``` + +Vous devriez maintenant avoir la documentation minimale pour le composant Avatar, générée automatiquement par la partie args de Storybook et les valeurs par défaut obtenues avec les `propTypes` du composant et [JSdoc](https://jsdoc.app/), ce qui constitue la première étape pour réduire le temps de maintenance et s'assurer que la documentation reste à jour. + +Cependant, nous n'avons pas encore terminé. Étant donné que nous élaborons de la documentation pour d'autres types utilisateurs, y compris des personnes non techniques comme les designers ou utilisateurs du design system, nous ne pouvons pas supposer qu'elles savent ce que chaque story représente. Ajoutons un texte descriptif pour les stories dans `src/Avatar/Avatar.stories.jsx` : + +```jsx:title=src/Avatar/Avatar.stories.jsx +import { Avatar } from './Avatar'; + +export default { + title: 'Design System/Avatar', + component: Avatar, + tags: ['autodocs'], + parameters: { + componentSubtitle: + 'Displays an image that represents a user or organization', + }, + /* + * More on Storybook argTypes at: + * https://storybook.js.org/docs/react/api/argtypes + */ + argTypes: { + size: { + control: { + type: 'select', + }, + options: ['tiny', 'small', 'medium', 'large'], + }, + }, +}; + +export const Standard = { + args: { + size: 'large', + username: 'Tom Coleman', + src: 'https://avatars2.githubusercontent.com/u/132554', + }, +}; + +/** + * 4 sizes are supported. + */ +export const Sizes = { + args: { + username: 'Tom Coleman', + src: 'https://avatars2.githubusercontent.com/u/132554', + }, + render: (args) => ( + <> + + + + + + ), +}; + +/** + * Shows the user's initials as a fallback when no image is provided. + */ +export const Initials = { + render: (args) => ( + <> + + + + + + ), +}; + +/** + * Shows a loading indicator. + */ +export const Loading = { + args: { + loading: true, + }, + render: (args) => ( + <> + + + + + + ), +}; + +/** + * Shows the user's avatar when provided with a `src` prop or in various states and sizes. + */ +export const Large = { + render: () => ( + <> + + + + + ), +}; + +/** + * Avatar component using Controls + */ +export const Controls = { + args: { + loading: false, + size: 'tiny', + username: 'Dominic Nguyen', + src: 'https://avatars.githubusercontent.com/u/263385', + }, +}; +``` + +Vous devriez à présent voir ceci : + + + +#### Optimiser la documentation avec Markdown/MDX + +Chaque composant a des exigences uniques en matière de documentation, ce qui peut s'avérer difficile à gérer. Nous avons utilisé la fonction de documentation automatique de Storybook avec l'addon Docs pour simplifier ce processus. Cela nous a permis de créer une documentation complète tout en adhérant aux meilleures pratiques, sans encourir de dépenses supplémentaires. À l'avenir, nous pourrons encore améliorer notre processus de documentation en identifiant tous les défis ou problèmes potentiels qui peuvent survenir lorsque nous travaillons avec nos composants. + +Markdown est un format simple pour écrire du texte. MDX vous permet d'utiliser du code interactif (JSX) dans Markdown. Storybook Docs utilise MDX pour donner aux développeurs un contrôle ultime sur le rendu de la documentation. + +Lors de l'installation de Storybook, les fichiers MDX sont enregistrés par défaut. Votre fichier `.storybook/main.js` devrait ressembler à ceci : + +```js:title=.storybook/main.js +/** @type { import('@storybook/react-vite').StorybookConfig } */ +const config = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/addon-a11y', + '@storybook/addon-coverage', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + docs: { + autodocs: 'tag', + }, +}; +export default config; + +``` + +Créez un nouveau fichier `src/Avatar/Avatar.mdx` et fournissez quelques détails. Nous allons supprimer les `tags` et les `parameters` du fichier `Avatar.stories.jsx` et recréer notre documentation dans le fichier mdx. + + + +```mdx:title=src/Avatar/Avatar.mdx +import { + Canvas, + Controls, + Description, + Meta, + Subtitle, + Story, +} from '@storybook/blocks'; + +import * as AvatarStories from './Avatar.stories'; + +# Avatar + + + +Displays an image that represents a user or organization + +Use an avatar for attributing actions or content to specific users. + +The user's name should _always_ be present when using Avatar – either printed beside the avatar or in a tooltip. + + + + + +## Additional variants + +### Sizes + + + + + +### Initials + + + + + +### Loading + + + + + +### Playground + +Interact with the component and see how it responds to the different input properties. + + + + + + +``` + + + +Dans Storybook, l'entrée « Docs » de votre composant Avatar devrait être remplacée par notre page MDX. + +![Documentation MDX pour Storybook](/design-systems-for-developers/storybook-docs-mdx-docblocks-7-0.png) + +Storybook Docs est livré avec [« Doc Blocks »](https://storybook.js.org/docs/react/writing-docs/doc-blocks), des composants prêts à l'emploi tels que les[aperçus interactifs](https://storybook.js.org/docs/react/api/doc-block-canvas), [l'iconographie](https://storybook.js.org/docs/react/api/doc-block-icongallery), et bien d'autres. Par défaut, ils sont utilisés en parallèle pour les pages de documentation générées automatiquement, mais ils peuvent également être extraits pour un usage individuel. Notre objectif est de personnaliser la documentation du composant Avatar sans tout refaire nous-même, donc nous réutiliserons les Doc Blocks dans la mesure du possible. + +Ajoutons le Doc Block [`ArgTypes`](https://storybook.js.org/docs/react/api/doc-block-argtypes) à notre fichier MDX. Il génère automatiquement un tableau avec toutes les propriétés du composant et ses types. + + + +```diff:title=src/Avatar/Avatar.mdx +import { ++ ArgTypes, + Canvas, + Controls, + Description, + Meta, + Subtitle, + Story, +} from '@storybook/blocks'; + +{/* Same content as before */} + + + + + ++ +``` + + + +![Storybook docs from MDX with blocks](/design-systems-for-developers/storybook-docs-mdx-argtypes-block.png) + +Super ! Nous sommes revenus au point de départ, mais avec un contrôle total sur les commandes et le contenu. Les avantages de la génération de documentation automatique persistent parce que nous utilisons Doc Blocks. + +Personnalisez la documentation du composant Avatar avec une note sur les cas d'utilisation. On explique aux développeurs comment utiliser pleinement ce composant. Nous pouvons simplement ajouter du markdown comme nous le ferions dans n'importe quel autre document markdown : + + + +```diff:title=src/Avatar/Avatar.mdx +{/* Same content as before */} + + + + + + + ++ ## Usage + ++ Avatar is used to represent a person or an organization. By default the avatar shows an image and gracefully falls back to the first initial of the username. While hydrating the component you may find it useful to render a skeleton template to indicate that Avatar is awaiting data. Avatars can be grouped with the AvatarList component. + +{/* Same content as before */} +``` + + + +![Storybook docs pour MDX avec des informations sur l'utilisation](/design-systems-for-developers/storybook-docs-mdx-usage-7-0.png) + +#### Pages personnalisées + +Chaque design system est accompagné d'une page de couverture. +Storybook Docs vous permet de créer des pages distinctes en utilisant MDX. + +Créer un nouveau fichier `src/Intro.mdx` : + + + +```mdx:title=src/Intro.stories.mdx +import { Meta } from '@storybook/blocks'; + + + +# Introduction to the Storybook design system tutorial + +The Storybook design system tutorial is a subset of the full [Storybook design system](https://github.com/storybookjs/design-system/), created as a learning resource for those interested in learning how to write and publish a design system using best practice techniques. + +Learn more in the [Storybook tutorials](https://storybook.js.org/tutorials/) + +``` + + + +La page de couverture que nous avons créée ici est un exemple de [« documentation non jointe »](https://storybook.js.org/docs/react/writing-docs/mdx#writing-unattached-documentation) qui apparaît différemment dans la barre latérale par rapport aux autres pages de documentation générées automatiquement. + +![Documentation Storybook avec une page d'introduction non classée](/design-systems-for-developers/storybook-docs-introduction-unsorted-7-0.png) + +Pour que la documentation apparaisse en premier, nous devons dire à Storybook de charger le fichier Introduction dans `.storybook/main.js` : + +```diff:title=.storybook/main.js +/** @type { import('@storybook/react-vite').StorybookConfig } */ +const config = { + stories: [ ++ '../src/Intro.mdx', + '../src/**/*.mdx', + '../src/**/*.stories.@(js|jsx|ts|tsx)', + ], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/addon-a11y', + '@storybook/addon-coverage', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + docs: { + autodocs: 'tag', + }, +}; +export default config; +``` + +![Documentation Storybook avec une page d'introduction](/design-systems-for-developers/storybook-docs-introduction-7-0.png) + +## Publier la documentation en ligne + +Si vous rédigez une documentation que personne ne lit, est-ce utile ? Non. Il ne suffit pas uniquement de créer du contenu d'apprentissage de grande qualité, nous devons faire connaître ce contenu aux utilisateurs et aux collègues. Pour l'instant, notre documentation est cachée dans le dépôt, ce qui signifie que les utilisateurs doivent exécuter Storybook localement pour la voir. + +Dans le chapitre précédent, nous avons publié le Storybook en ligne pour une relecture visuelle. Il est simple d'utiliser le même système pour publier notre documentation de composants. Ajoutons un nouveau script au `package.json` pour builder notre Storybook en mode documentation : + +```json:clipboard=false +{ + "scripts": { + "build-storybook-docs": "storybook build --docs" + } +} +``` + +Enregistrez et effectuez un commit. + +Lancer `build-storybook-docs` dans votre ligne de commande ou votre outil d'intégration continue produira un site statique dans la configuration « docs ». Mettez en place un outil de déploiement de sites statiques tel que [Netlify](https://www.netlify.com/) ou [Vercel](https://vercel.com/) pour déployer le site de documentation à chaque nouveau commit. + +
💡 Au fur et à mesure que votre design system se développe, vous pouvez être confronté aux exigences spécifiques de votre organisation qui justifient l'utilisation d'outils personnalisés ou même la création de votre propre site statique à l'aide d'outils tels que Gatsby ou Next. Il est facile de porter markdown et MDX vers d'autres solutions. +
+ +## Importer le design system dans d'autres applications + +Jusqu'à présent, nous nous sommes concentrés sur l'aspect interne. Tout d'abord, en créant des composants d'interface utilisateur durables. Ensuite, en les examinant, les testant et les documentant. Nous allons maintenant nous tourner vers l'extérieur pour examiner la manière dont les équipes utilisent les design system. + +Le chapitre 7 traite de la transformation du design system sous forme de paquet en vue de son utilisation dans d'autres applications. Apprenez à combiner npm, le gestionnaire de paquets JavaScript, avec Auto, un outil de gestion des versions qui permet de gagner du temps. diff --git a/content/design-systems-for-developers/react/fr/introduction.md b/content/design-systems-for-developers/react/fr/introduction.md new file mode 100644 index 000000000..dfc814a7c --- /dev/null +++ b/content/design-systems-for-developers/react/fr/introduction.md @@ -0,0 +1,104 @@ +--- +title: 'Introduction aux design system' +tocTitle: 'Introduction' +description: "Un guide sur les derniers outils pour créer des design system prêts à l'emploi" +--- + +
Ce guide a été créé pour les développeurs professionnels qui souhaitent apprendre à créer des design system. Un niveau intermédiaire en JavaScript, Git et en intégration continue est recommandé. Vous devriez également avoir quelques bases en matière de Storybook, comme par exemple savoir écrire une story et éditer des fichiers de configuration (Rendez-vous sur Introduction à Storybook pour apprendre les bases). +
+
+ +Les design system connaissent une popularité fulgurante. Des poids lourds en matière de tech comme Airbnb aux petites startups, les entreprises de toutes tailles réutilisent des modèles d'interface utilisateur (User Interface ou UI) dans le but de faire des économies de temps et d'argent. Il y a cependant une grande différence entre les design system créés par la BBC, Airbnb, IBM ou Microsoft et les design system créés par la plupart des développeurs. + +Pourquoi les équipes en charge des design system utilisent ces outils et ces techniques en particulier ? Mon co-auteur Tom et moi (Dominic) avons recherché les caractéristiques des design system les plus réussis de la communauté Storybook afin d'identifier les meilleures pratiques. + +Ce guide en plusieurs étapes présente les outils automatisés et les flux de travail minutieux utilisés dans les design system à grande échelle. Nous passerons en revue l'assemblage d'un design system à partir de librairies de composants existantes, puis nous mettrons en place les services de base, les librairies et les flux de travail. + +![Aperçu d'un design system](/design-systems-for-developers/design-system-overview.jpg) + +## Pourquoi autant d'engouement autour des design system ? + +Soyons clairs : le concept d'interface utilisateur réutilisable n'est pas nouveau. Les guides de style, les kits d'interface utilisateur et les widgets à partager existent depuis des décennies. Aujourd'hui, les designers et développeurs s'orientent vers la construction de composants d'interface utilisateur (UI). Un composant d'interface utilisateur encapsule les propriétés visuelles et fonctionnelles d'éléments distincts de l'interface utilisateur. Pensez aux LEGO. + +Les interfaces utilisateurs modernes sont constituées de centaines de composants modulaires qui sont réorganisés pour offrir différentes expériences utilisateurs. + +Les design system contiennent des composants d'interface utilisateur réutilisables qui aident les équipes à créer des interfaces utilisateur complexes, durables et accessibles pour tous les projets. Étant donné que les designers et les développeurs contribuent aux composants de l'interface utilisateur, le design system sert de lien entre les métiers. Il est également la « source de vérité » pour les composants communs d'une organisation. + +![Les design system sont un lien entre design et dévelopement](/design-systems-for-developers/design-system-context.jpg) + +Les designers parlent souvent de la création des design system au sein de leurs outils. Dans son entièreté, un design system englobe les images (Sketch, Figma, etc.), les principes généraux de conception, la structure de contribution, la gouvernance, etc. Il existe une multitude de guides destinés aux designers qui traitent ces sujets en profondeur, nous n'y reviendrons donc pas ici. + +Pour les développeurs, plusieurs choses sont certaines. Les design system de production doivent inclure les composants de l'interface utilisateur et l'infrastructure frontend qui les gère. Un design system comporte trois parties techniques dont nous parlerons dans ce guide : + +- 🏗 Des composants d'interface utilisateur réutilisables mis en commun +- 🎨 Des jetons de conception (design tokens): Variables spécifiques au style telles que les couleurs de la marque et les espacements +- 📕 Une documentation : Instructions d'utilisation, narration, bonnes pratiques et erreurs à éviter + +Les éléments sont compilés, versionnés et distribués aux applications qui les utilisent par l'intermédiaire d'un gestionnaire de packages. + +## Avez-vous besoin d'un design system ? + +Bien qu'il soit populaire, un design system n'est pas une solution miracle. Si vous travaillez au sein d'une équipe restreinte sur une seule application, un dossier de composants d'interface utilisateur sera amplement suffisant plutôt que la mise en place d'une infrastructure nécessaire à la création d'un design system. Pour les petits projets, le coût de la maintenance, de l'intégration et des outils dépasse largement les bénéfices en termes de productivité que vous pourriez observer. + +Les économies d'échelles avec un design system jouent en votre faveur lorsque vous partagez des composants UI entre plusieurs projets. Si vous vous retrouvez à dupliquer des composants UI dans différentes applications ou équipes, ce guide est fait pour vous. + +## Ce que nous construisons + +Storybook alimente les design system de la [BBC](https://www.bbc.co.uk/iplayer/storybook/index.html?path=/story/style-guide--colours), [Airbnb](https://github.com/airbnb/lunar), [IBM](https://www.carbondesignsystem.com/), [GitHub](https://primer.style/css/), et de centaines d'autres entreprises. Les recommandations formulées ici s'inspirent des meilleures pratiques et des outils des équipes les plus performantes. Pour ce faire, nous utiliserons les outils frontend suivants : + +#### Construire des composants + +- 📚 [Storybook](http://storybook.js.org) pour le développement des composants d'interface utilisateur et une documentation générée automatiquement +- ⚛️ [React](https://reactjs.org/) pour une UI déclarative centrée sur les composants (via create-react-app) +- 💅 [Emotion](https://emotion.sh/docs/introduction) pour un style centré sur les composants +- ✨ [Prettier](https://prettier.io/) pour le formatage automatique du code + +#### Maintenir le système + +- 🚥 [GitHub Actions](https://github.com/features/actions) pour l'intégration continue +- 📐 [ESLint](https://eslint.org/) pour le linting JavaScript +- ✅ [Chromatic](https://www.chromatic.com/?utm_source=storybook_websiteutm_medium=link&utm_campaign=storybook) pour détecter les bugs visuels dans les composants (par les mainteneurs de Storybook) +- 📦 [npm](https://npmjs.com) pour partager la librairie +- 🛠 [Auto](https://github.com/intuit/auto) pour la gestion des mises en production + +#### Les addons Storybook + +- ♿ [Accessibility](https://github.com/storybookjs/storybook/tree/master/addons/a11y) pour contrôler l'accessibilité pendant le développement +- 💥 [Actions](https://storybook.js.org/docs/react/essentials/actions) pour l'assurance qualité des interactions au clic et au toucher +- 🎛 [Contrôles](https://storybook.js.org/docs/react/essentials/controls) pour ajuster interactivement les propriétés afin d'expérimenter avec les composants +- 📕 [Docs](https://storybook.js.org/docs/react/writing-docs/introduction) pour la génération automatique de documentation à partir des stories +- 🔍 [Interactions](https://storybook.js.org/addons/@storybook/addon-interactions/) pour le débogage des interactions entre composants +- 🏎 [Test-runner](https://storybook.js.org/docs/react/writing-tests/test-runner) pour tester les composants de manière automatisée + +![Design system workflow](/design-systems-for-developers/design-system-workflow.jpg) + +## Comprendre le flux de travail + +Les design system sont un investissement dans l'infrastructure frontend. En plus de montrer comment utiliser la technologie ci-dessus, ce guide se concentre également sur les flux de travail de base qui favorisent la prise en main et simplifient la maintenance. Dans la mesure du possible, les tâches manuelles seront automatisées. Vous trouverez ci-dessous les activités que nous rencontrerons. + +#### Construire des composants d'interface utilisateur isolés + +Chaque design system est composé de composants d'interface utilisateur. +Nous utiliserons Storybook comme une sorte d' « atelier » pour construire des composants UI isolés en dehors de nos applications finales. Ensuite, nous intégrerons des addons qui vous aideront à garantir la durabilité des composants (Actions, A11y, Controls, Interactions). + +#### Relecture pour parvenir à un consensus et recueillir les retours + +Le développement de l'interface utilisateur est un travail d'équipe qui nécessite un alignement entre les développeurs, les designers et les autres acteurs du projet. Nous publierons des composants d'interface utilisateur en cours de développement afin d'intégrer les parties prenantes au processus de développement et d'accélérer les livraisons. + +#### Tester pour éviter les bugs de l'interface utilisateur + +Les design system sont une source de vérité et un point unique de défaillance. Des bugs mineurs dans des composants de base peuvent provoquer des incidents à l'échelle de l'entreprise. Nous automatiserons les tests pour vous aider à atténuer les bugs inévitables et à livrer en toute confiance des composants d'interface utilisateur durables et accessibles. + +#### Documenter pour accélérer la prise en main + +La documentation est essentielle, mais sa création est souvent la dernière priorité d'un développeur. Nous vous faciliterons la tâche pour documenter les composants de l'interface utilisateur en générant automatiquement une documentation minimale et durable qui peut être personnalisée. + +#### Partager le design system aux projets qui l'utilisent + +Une fois vos composants d'interface utilisateur finalisés et bien documentés, vous devez les partager aux autres équipes. Nous aborderons le packaging, la publication et la manière d'utiliser le design system dans d'autres Storybook. + +## Le design system de Storybook + +L'exemple de design system de ce guide s'inspire du [design system officiel](https://github.com/storybookjs/design-system) de Storybook. Il est utilisé par trois sites et touche des dizaines de milliers de développeurs dans l'écosystème Storybook. + +Dans le chapitre suivant, nous vous montrerons comment extraire un design system à partir de librairies de composants hétérogènes. diff --git a/content/design-systems-for-developers/react/fr/review.md b/content/design-systems-for-developers/react/fr/review.md new file mode 100644 index 000000000..c2f000bd8 --- /dev/null +++ b/content/design-systems-for-developers/react/fr/review.md @@ -0,0 +1,209 @@ +--- +title: 'Relecture avec les équipes' +tocTitle: 'Relecture' +description: "Collaborer grâce à l'intégration continue et l'examen visuel" +commit: 'fe0944a' +--- + +Dans ce chapitre 4, nous en apprendrons plus sur les flux de travail professionnels pour apporter des améliorations au design system tout en atténuant les incohérences. Ce chapitre présente les techniques permettant de recueillir des retours sur l'interface utilisateur et de parvenir à un consensus avec votre équipe. +Ces processus de production sont utilisés par des personnes travaillant pour Auth0, Shopify et Discovery Network. + +## Source unique de vérité ou point de défaillance unique + +Précédemment, j'ai écrit que les design system sont un [point de défaillance unique](https://www.chromatic.com/blog/why-design-systems-are-a-single-point-of-failure) pour les équipes frontend. Par essence, les design system sont des dépendances. Si vous modifiez un composant du design system, cette modification se propage aux applications dépendantes. Le mécanisme de publication des modifications n'est pas biaisé : il renvoie à la fois les améliorations et les bugs. + +![Dépendances du design system](/design-systems-for-developers/design-system-dependencies.png) + +Les bugs constituent un risque existentiel pour les design system, c'est pourquoi nous ferons tout pour les éviter. Des ajustements mineurs finissent par avoir des impacts et peuvent entraîner d'innombrables régressions. En l'absence d'une stratégie de maintenance continue, les design system se détériorent. + +> « Mais ça marche sur mon ordinateur ?! » - tout le monde + +## Revue visuelle des composants UI avec votre équipe + +La revue visuelle est le processus qui valide le comportement et le rendu des interfaces. Elle a lieu à la fois pendant le développement de l'interface utilisateur et pendant l'étape d'assurance qualité avec l'équipe. + +La plupart des développeurs connaissent bien la revue du code, qui consiste à recueillir les commentaires d'autres développeurs sur le code afin d'en améliorer la qualité. Étant donné que les composants de l'interface utilisateur expriment le code de manière graphique, une revue visuelle est nécessaire pour recueillir les commentaires sur l'UI (Interface Utilisateur) et l'UX (Expérience Utilisateur). + +### Établir un point de référence universel + +Supprimer le contenu du répertoire node_modules. Réinstaller les packages. Effacer le stockage local. +Supprimer les cookies. Si ces actions vous semblent familières, vous savez à quel point il est difficile de s'assurer que les coéquipiers se réfèrent au code le plus récent. Lorsque les gens n'ont pas des environnements de développement identiques, c'est un cauchemar de discerner les problèmes causés par l'environnement local des bugs réels. + +Heureusement, en tant que développeurs frontend, nous avons une cible de compilation commune : le navigateur. Les équipes avisées publient leur Storybook en ligne pour servir de point de référence universel lors de la revue visuelle, évitant ainsi les complications inhérentes aux environnements de développement locaux (il est de toute façon ennuyeux d'être le support technique). + +![Relire votre travail dans le cloud](/design-systems-for-developers/design-system-visual-review.jpg) + +Lorsque les composants existants de l'interface utilisateur sont accessibles via une URL, les utilisateurs peuvent confirmer l'aspect et la fonctionnalité de l'interface utilisateur simplement depuis leur navigateur. Cela signifie que les développeurs, les designers et les chefs de produit n'ont pas à se préoccuper d'un environnement de développement local, à faire circuler des captures d'écran ou à se référer à des interfaces utilisateur obsolètes. + +> « Déployer Storybook à chaque Pull Request (PR) rend la revue visuelle plus facile et aide les chefs de produits à penser en matière de composants ». - Norbert de Langen, mainteneur principal de Storybook + +

Publier le Storybook

+ +Nous ferons la démonstration d'un processus de revue visuelle avec [Chromatic](https://www.chromatic.com/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook), un service de publication gratuit créé par les mainteneurs de Storybook. Cela vous permet de déployer et d'héberger votre Storybook en toute sécurité dans le cloud, mais il est également assez simple de [développer Storybook comme un site statique et de le déployer](https://storybook.js.org/docs/react/sharing/publish-storybook) sur d'autres services d'hébergement. + +### Obtenir Chromatic + +Tout d'abord, allez sur [chromatic.com](https://www.chromatic.com/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook) et inscrivez-vous avec votre compte GitHub. + +![S'inscrire sur Chromatic](/design-systems-for-developers/chromatic-signup.png) + +A partir de là, sélectionnez le dépôt de votre design system. + +En arrière-plan, les autorisations d'accès seront synchronisées et les Pull Request (PR) vérifiées. + + + +Installez le package [chromatic](https://www.npmjs.com/package/chromatic) via npm. + +```shell +yarn add --dev chromatic +``` + +Une fois installé, lancez la commande suivante pour développer et déployer votre Storybook (vous devrez utiliser le `project-token` que Chromatic fournit sur le site web) : + +```shell +npx chromatic --project-token= +``` + +![Chromatic dans la ligne de commande](/design-systems-for-developers/chromatic-manual-storybook-console-log.png) + +Visualisez votre Storybook publié en copiant le lien fourni et en le collant dans une nouvelle fenêtre de votre navigateur. Vous constaterez que votre environnement de développement local Storybook est reproduit en ligne. + +![Storybook avec Chromatic](/design-systems-for-developers/chromatic-published-storybook-7-0.png) + +Cela permet à votre équipe d'examiner facilement les composants de l'interface utilisateur tels que vous les voyez localement. Et voici la confirmation que vous verrez dans Chromatic. + +![Résultat de notre premier développement dans Chromatic](/design-systems-for-developers/chromatic-first-build.png) + +Félicitations ! Maintenant que vous avez mis en place l'infrastructure pour publier Storybook, améliorons-la avec l'intégration continue. + +

Intégration continue

+ +L'intégration continue est la méthode la plus utilisée pour assurer la maintenance des applications web modernes. Elle vous permet d'effectuer des tests, des analyses et des déploiements à chaque fois que vous ajoutez du code. Nous adopterons cette technique pour nous épargner des actions manuelles et répétitives. + +Nous utiliserons GitHub Actions, qui est gratuit pour notre cas d'utilisation simple. Les mêmes principes s'appliquent aux autres services d'intégration continue. + +Ajoutez un dossier `.github` au plus au niveau de votre projet. Créez ensuite un autre dossier appelé `workflows`. + +Créez un fichier appelé chromatic.yml comme celui ci-dessous. Il nous permettra de scripter le comportement de notre processus d'intégration continue. Nous allons commencer avec quelque chose de simple pour l'instant et continuer à l'améliorer au fur et à mesure que nous avancerons : + +```yaml:title=.github/workflows/chromatic.yml +# Name of our action +name: 'Chromatic' +# The event that will trigger the action +on: push + +# What the action will do +jobs: + test: + # The operating system it will run on + runs-on: ubuntu-latest + # The list of steps that the action will go through + steps: + - uses: actions/checkout@v2 + with: + #👇 Fetches all history so Chromatic can compare against previous builds + fetch-depth: 0 + - uses: actions/setup-node@v3 + with: + #👇 Sets the version of Node.js to use + node-version: 16 + - run: yarn + #👇 Adds Chromatic as a step in the workflow + - uses: chromaui/action@v1 + # Options required for Chromatic's GitHub Action + with: + #👇 Chromatic projectToken, see https://storybook.js.org/tutorials/design-systems-for-developers/react/en/review/ to obtain it + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} +``` + +

+💡 Par souci de concision, les Github Secrets n'ont pas été mentionnés. Les secrets sont des variables d'environnement sécurisées fournies par GitHub afin que vous n'ayez pas à coder en dur le project-token.

+
+ +Ajoutez vos modifications avec : + +```shell +git add . +``` + +Effectuez un commit : + +```shell +git commit -m "Storybook deployment with GitHub action" +``` + +Enfin, poussez les modifications sur le dépôt distant avec : + +```shell +git push origin main +``` + +Super ! Nous avons amélioré notre infrastructure. + +## Demander une revue visuelle à votre équipe + +Lorsqu'une Pull Request (PR) contient des changements d'interface utilisateur, il est utile d'initier un processus de revue visuelle avec les parties prenantes pour atteindre un consensus sur ce qui est livré à l'utilisateur. +Ainsi, il n'y a pas de surprises indésirables ni de refactorisation. + +Nous allons faire une démonstration de la revue visuelle en apportant une modification à l'interface utilisateur sur une nouvelle branche. + +```shell +git checkout -b improve-button +``` + +Tout d'abord, modifiez le composant Button. "Faites-le ressortir", nos designers vont adorer. + +```jsx:title=src/Button/Button.jsx +// ... +const StyledButton = styled.button` + border: 10px solid red; + font-size: 20px; +`; +// ... +``` + +Effectuez un commit avec les changements et poussez-les sur votre dépôt GitHub. + +```shell:clipboard=false +git commit -am "make Button pop" +git push -u origin improve-button +``` + +Allez sur GitHub.com et ouvrez une Pull Request (PR) pour la branche `improve-button`. +Une fois la PR ouverte, le build de CI de Storybook s'exécutera. + +![PR créées dans GitHub](/design-systems-for-developers/github-created-pr-actions.png) + +Dans votre liste de vérifications de la PR en bas de la page, cliquez sur **Publication de Storybook** pour voir le Storybook publié avec les nouveaux changements. + +![Composant Button modifié dans le site déployé](/design-systems-for-developers/chromatic-deployed-site-with-changed-button.png) + +Pour chaque composant et story modifiés, copiez l'URL depuis la barre d'adresse du navigateur et collez-la dans les outils des gestion de tâches de votre équipe (GitHub, Asana, Jira, etc.) pour aider les coéquipiers à passer rapidement en revue les stories pertinentes. + +![PR Github avec un lien vers le Storybook](/design-systems-for-developers/github-created-pr-with-links-actions.png) + +Attribuez la Pull Request (PR) à vos coéquipiers et observez leurs retours. + +![Pourquoi ?!](/design-systems-for-developers/github-visual-review-feedback.gif) + +
💡 Chromatic propose également un flux de travail complet de revue de l'interface utilisateur intégré au produit avec son offre payante. La technique qui consiste à copier les liens Storybook dans une PR GitHub fonctionne à plus petite échelle (et avec n'importe quel service qui héberge votre Storybook, pas seulement Chromatic), mais au fur et à mesure que votre utilisation augmente, vous pouvez considérer ce service car il automatise le processus. +
+ +Dans le domaine du développement de logiciels, la plupart des défauts sont dus à une mauvaise communication et non à la technologie. La revue visuelle permet aux équipes de recueillir un retour d'information continu pendant le développement afin de livrer plus rapidement les design system. + +![Processus de revue visuelle](/design-systems-for-developers/visual-review-loop.jpg) + +> Déployer une URL Storybook pour chaque Pull Request est quelque chose que nous faisons depuis un certain temps dans le design system de Shopify, Polaris, et cela s'est avéré incroyablement utile. Ben Scott, Ingénieur chez Shopify + +## Tester votre design system + +La revue visuelle est inestimable. Cependant, relire et examiner des centaines de stories de composants peut prendre des heures. Idéalement, nous voulons voir uniquement les changements intentionnels (ajouts / améliorations) et détecter automatiquement les régressions non intentionnelles. + +Dans le chapitre 5, nous présentons les stratégies de tests qui allègent la revue visuelle et garantissent la durabilité de nos composants dans le temps. diff --git a/content/design-systems-for-developers/react/fr/test.md b/content/design-systems-for-developers/react/fr/test.md new file mode 100644 index 000000000..1ebf222be --- /dev/null +++ b/content/design-systems-for-developers/react/fr/test.md @@ -0,0 +1,339 @@ +--- +title: 'Tester pour garantir la qualité' +tocTitle: 'Tester' +description: "Comment tester l'apparence, les fonctionnalités et l'accessibilité du design system" +commit: 'f5a815f' +--- + +Dans ce chapitre 5, nous automatisons les tests du design system pour éviter les bugs de l'interface utilisateur. Ce chapitre explore en profondeur les caractéristiques des composants UI qui justifient des tests et les pièges potentiels à éviter. Nous avons observé les équipes professionnelles de chez Wave, BBC et Salesforce pour aboutir à une stratégie de test qui concilie une couverture complète, une configuration simple et une maintenance réduite. + + + +## Les fondamentaux des tests de composants UI + +Avant de commencer, déterminons ce qu'il est judicieux de tester. Les design system sont composés d'éléments d'interface utilisateur. Chaque composant UI comprend des stories (variations) qui décrivent l'apparence et la fonctionnalité souhaitées en fonction d'un ensemble de paramètres (propriétés). Les stories sont ensuite affichées par le navigateur ou l'appareil à l'utilisateur final. + +![Les états des composants sont combinatoires](/design-systems-for-developers/component-test-cases.png) + +Wouah ! Comme vous pouvez le constater, un composant contient plusieurs états. +Multipliez le nombre d'états par le nombre de composants du design system et vous comprendrez pourquoi il est difficile de les répertorier. En réalité, il n'est pas viable de tester chaque élément à la main, en particulier au fur et à mesure que le design system se développe. Une raison de plus de mettre en place des tests automatisés **dès maintenant** afin d'économiser du travail **à l'avenir**. + +## Préparer les tests + +J'ai interrogé 4 équipes équipes frontend sur les flux de travail professionnels de Storybook dans un [article précédent](https://www.chromatic.com/blog/the-delightful-storybook-workflow). Ils se sont mis d'accord sur ces bonnes pratiques pour rédiger des stories afin de rendre les tests faciles et complets. + +**Articuler les états des composants pris en charge** en tant que stories pour clarifier quelles combinaisons de paramètres produisent un état donné. Eliminer les états non utilisés pour alléger le composant. +**Affichez les composants de manière cohérente** pour atténuer la variabilité qui peut être déclenchée par des fonctions aléatoires (Math.random()) ou relatives (Date.now()). + +> Les meilleures stories vous permettent de visualiser tous les états que votre composant pourrait connaître dans l'application » - Tim Hingston, Tech lead chez Apollo GraphQL + +## Tests visuels + +Les design system contiennent des composants d'interface utilisateur dédiés à de l'affichage, qui sont intrinsèquement visuels. Les tests visuels valident les aspects visuels de l'interface utilisateur affichée. + +Les tests visuels capturent une image de chaque composant de l'interface utilisateur dans un environnement de navigation cohérent. Les nouvelles captures d'écran sont automatiquement comparées aux captures d'écran de référence précédemment acceptées. Lorsqu'il y a des différences visuelles, vous en êtes informé. + +![Composants de test visuel](/design-systems-for-developers/component-visual-testing.gif) + +Si vous développez une interface utilisateur moderne, les tests visuels permettent à votre équipe frontend d'éviter les modifications manuelles fastidieuses et les régressions coûteuses de l'interface utilisateur. + +Dans le chapitre précédent, nous avons appris à publier un Storybook en utilisant [Chromatic](https://www.chromatic.com/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook). Nous avons ajouté une bordure rouge en gras autour de chaque composant `Button`, puis nous avons demandé l'avis de nos coéquipiers. + +![Bouton avec une bordure rouge](/design-systems-for-developers/chromatic-button-border-change.png) + +Voyons maintenant comment fonctionnent les tests visuels à l'aide des [outils de test](https://www.chromatic.com/features/test/?utm_source=storybook_website&utm_medium=link&utm_campaign=storybook) intégrés de Chromatic. Lorsque nous avons créé la Pull Request (PR), Chromatic a capturé des images de nos modifications et les a comparées aux versions précédentes des mêmes composants. Quatre changements ont été trouvés : + +![Liste des vérifications dans la Pull Request](/design-systems-for-developers/chromatic-list-of-checks.png) + +Cliquez sur la partie **🟡 UI Tests** pour les passer en revue. + +![Second build dans Chromatic avec les modifications](/design-systems-for-developers/chromatic-second-build-from-pr.png) + +Passez-les en revue pour confirmer s'ils sont intentionnels (améliorations) ou non intentionnels (bugs). Si vous acceptez les modifications, les bases de référence des tests seront mises à jour. Cela signifie que les modifications ultérieures seront comparées aux nouvelles références afin de détecter les bugs. + +![Examiner les modifications dans Chromatic](/design-systems-for-developers/chromatic-review-changes-pr.png) + +Dans le dernier chapitre, notre coéquipier ne voulait pas d'une bordure rouge autour des `Button` pour une raison ou une autre. Refusez les modifications pour indiquer qu'elles doivent être annulées. + +![Refuser des modifications dans Chromatic](/design-systems-for-developers/chromatic-review-deny.png) + +Annulez les changements et faites un commit pour relancer et valider vos tests visuels. + +## Tests d'interaction + +Jusqu'à présent, nous avons vu comment les tests visuels nous permettaient de vérifier l'apparence et de détecter les régressions de l'interface utilisateur. Mais au fur et à mesure que nous développons notre design system, nos composants deviendront responsables de bien plus que le simple rendu de l'interface utilisateur. À un moment donné, ils s'occuperont de la gestion de l'état ou même de la recherche de données. C'est là que les tests d'interaction entre les composants nous aideront. + +Le test d'interaction est un modèle bien connu pour vérifier le comportement de l'utilisateur. Vous commencez par fournir des données simulées pour mettre en place votre test, simuler les interactions de l'utilisateur avec une librairie de test et vérifier les modifications de l'interface utilisateur. Dans Storybook, cela se déroule dans le navigateur, ce qui facilite le débogage parce que vous exécutez les tests dans le même environnement que celui dans lequel vous développez les composants : le navigateur. + +Pour l'activer, nous allons cliquer sur la fonction [`play`](https://storybook.js.org/docs/react/writing-stories/play-function) de Storybook et sur les librairies de test instrumentées pour configurer nos tests, puis utiliser le [test-runner](https://storybook.js.org/docs/react/writing-tests/test-runner) pour vérifier que le rendu de notre composant est correct. + +### Configurer le test runner + +Commencez par ajouter les dépendances nécessaires avec : + +```shell +yarn add --dev @storybook/test-runner +``` + +Ensuite, ajoutez une nouvelle tâche de test à vos scripts dans le `package.json` : + +```json:clipboard=false +{ + "scripts": { + "test-storybook": "test-storybook" + } +} +``` + +### Ecrire un test d'interaction en utilisant la fonction play + +Les tests d'interaction sont centrés sur la façon dont l'interface utilisateur gère les actions de l'utilisateur, soit en utilisant le clavier, la souris ou d'autres périphériques d'entrée et en vérifiant si les éléments visuels de l'interface utilisateur sont affichés et fonctionnent correctement. Les libraires de test telles que [Jest](https://jestjs.io/) fournissent des API utiles pour simuler les interactions humaines et vérifier l'état de l'interface utilisateur. Nous utiliserons des versions instrumentées de ces outils pour écrire nos tests. Le but est donc de conserver une syntaxe commune, mais avec des données d'analyse supplémentaires pour nous aider à déboguer. + +Le test lui-même est défini dans une fonction [`play`](https://storybook.js.org/docs/react/writing-stories/play-function) reliée à une story. Il s'agit de petits bouts de code qui s'exécutent après le rendu de la story. + +Voyons comment cela fonctionne en mettant à jour la story `Button` et en mettant en place notre premier test d'interaction en ajoutant ce qui suit : + +```diff:title=src/Button/Button.stories.jsx +import styled from '@emotion/styled'; + +import { Button } from './Button'; +import { Icon } from '../Icon/Icon'; +import { StoryLinkWrapper } from '../LinkWrapper'; + ++ import { expect, userEvent, within } from '@storybook/test'; + +export default { + title: 'Design System/Button', + component: Button, +}; + +// Other Button stories + +/* + * New story using the play function. + * See https://storybook.js.org/docs/react/writing-stories/play-function + * to learn more about the play function. + */ ++ export const WithInteractions = { ++ args: { ++ appearance: 'primary', ++ href: 'http://storybook.js.org', ++ ButtonWrapper: StoryLinkWrapper, ++ children: 'Button', ++ }, ++ play: async ({ canvasElement }) => { ++ // Assigns canvas to the component root element ++ const canvas = within(canvasElement); ++ await userEvent.click(canvas.getByRole('link')); ++ expect(canvas.getByRole('link')).toHaveAttribute( ++ 'href', ++ 'http://storybook.js.org', ++ ); ++ }, ++ }; +``` + +
+ +💡 Le package `@storybook/test` remplace les packages de tests `@storybook/jest` et `@storybook/testing-library`, offrant une taille de package plus petite et une API plus directe basée sur le package [Vitest](https://vitest.dev/). + +
+ + + +Lorsque Storybook a fini d'afficher la story, il exécute les étapes définies à l'intérieur de la fonction `play`, en interagissant avec le composant, de la même manière qu'un utilisateur le ferait. Cliquez sur le panneau [`Interactions`](https://storybook.js.org/docs/react/writing-tests/interaction-testing#interactive-debugger). Vous verrez un flux d'exécution détaillé tout en disposant d'un ensemble pratique de contrôles d'interface utilisateur pour mettre en pause, reprendre, revenir en arrière et passer en revue chaque interaction. + +### Automatiser les tests avec le test runner + +Nous avons vu de quelle manière les tests d'interaction avec la fonction `play` nous ont aidé à vérifier comment un composant réagit lorsque nous interagissons avec lui. Mais avec l'évolution des design system, la vérification manuelle de chaque modification peut rapidement devenir irréaliste. Storybook test runner automatise ce processus. Il s'agit d'un utilitaire autonome alimenté par [Playwright](https://playwright.dev/), qui fonctionne en parallèle de votre Storybook, exécutant tous les tests d'interaction et détectant les stories cassées. Avec Storybook en cours d'exécution, ouvrez une nouvelle fenêtre dans votre terminal et exécutez le test runner avec : + +```shell +yarn test-storybook --watch +``` + +![Exécution du programme de test Storybook](/design-systems-for-developers/test-runner-execution.png) + +Il vérifiera que toutes nos stories sont affichées sans erreur et que tous les cas passent automatiquement pendant l'exécution. De plus, si un test échoue, il nous fournira un lien qui ouvrira le composant concerné dans le navigateur. + +### Exécuter des tests d'interaction dans la CI (intégration continue) + +Les tests d'interaction avec la fonction `play` et l'automatisation avec le test runner nous ont aidé à simuler les interactions de l'utilisateur et à vérifier l'état de l'interface utilisateur de nos composants. Cependant, les exécuter localement peut être une tâche longue et répétitive, même si notre design system continue à se développer. Une fois de plus, c'est là que la CI intervient. Voyons comment la mettre en place dans notre flux de travail d'intégration continue existant. Mettez à jour le flux de travail existant que nous avons créé dans le [chapitre précédent](/design-systems-for-developers/react/fr/review/#chromatic-ci) et activez les tests d'interaction comme suit : + +```yaml:title=.github/workflows/chromatic.yml +# Name of our action +name: 'Chromatic' +# The event that will trigger the action +on: push + +# What the action will do +jobs: + # Run interaction tests + interaction-tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v3 + with: + #👇 Sets the version of Node.js to use + node-version: 16 + - name: Install dependencies + run: yarn + - name: Install Playwright + run: npx playwright install --with-deps + - name: Build Storybook + run: yarn build-storybook --quiet + - name: Serve Storybook and run tests + run: | + npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ + "npx http-server storybook-static --port 6006 --silent" \ + "npx wait-on tcp:6006 && yarn test-storybook" + visual-tests: + # The operating system it will run on + runs-on: ubuntu-latest + # The list of steps that the action will go through + steps: + - uses: actions/checkout@v2 + with: + #👇 Fetches all history so Chromatic can compare against previous builds + fetch-depth: 0 + - uses: actions/setup-node@v3 + with: + #👇 Sets the version of Node.js to use + node-version: 16 + - run: yarn + #👇 Adds Chromatic as a step in the workflow + - uses: chromaui/action@v1 + # Options required for Chromatic's GitHub Action + with: + #👇 Chromatic projectToken, see https://storybook.js.org/tutorials/design-systems-for-developers/react/en/review/ to obtain it + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} +``` + +Notre flux de travail s'exécutera lorsque le code sera ajouté sur n'importe quelle branche du dépôt de notre design system, et il aura deux tâches : une pour les tests d'interaction et une pour les tests visuels. La tâche de test d'interaction commence par le build du Storybook et exécute ensuite le programme de test, en nous informant des tests qui ne fonctionnent pas. La tâche de test visuel fonctionnera comme auparavant, en exécutant Chromatic pour vérifier l'état visuel de nos composants. + +## Test d'accessibilité + +« L'accessibilité signifie que toutes les personnes, y compris les personnes en situation de handicap, peuvent comprendre, naviguer et interagir avec votre application ... En ligne, [des exemples présentent] des moyens alternatifs d'accéder au contenu, comme l'utilisation de la touche de tabulation et d'un lecteur d'écran pour parcourir un site », écrit le développeur [Alex Wilson de T.Rowe Price](https://medium.com/storybookjs/instant-accessibility-qa-linting-in-storybook-4a474b0f5347). + +Les handicaps touchent 15 % de la population, selon [l'Organisation mondiale de la santé](https://www.who.int/disabilities/world_report/2011/report/en/). Les design system ont un impact considérable sur l'accessibilité car ils contiennent les éléments constitutifs des interfaces utilisateur. L'amélioration de l'accessibilité d'un seul composant signifie que toutes les instances de ce composant dans votre entreprise en bénéficient. + +![addon Accessibility de Storybook](/design-systems-for-developers/a11y-workflow.png) + +Prenez une longueur d'avance en matière d'interface utilisateur inclusive grâce à l'addon Accessibility de Storybook, un outil en temps réel permettant de vérifier les normes d'accessibilité du Web (WCAG). + +```shell +yarn add --dev @storybook/addon-a11y +``` + +Mettez à jour votre configuration Storybook pour inclure l'addon. + +```diff:title=.storybook/main.js +/** @type { import('@storybook/react-vite').StorybookConfig } */ +const config = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', ++ '@storybook/addon-a11y', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + docs: { + autodocs: 'tag', + }, +}; +export default config; + +``` + +Une fois que tout est configuré, vous verrez un nouvel onglet « Accessibilité » dans le panneau des addons de Storybook. + +![addon Accessibility de Storybook](/design-systems-for-developers/storybook-addon-a11y-7-0.png) + +Il vous montre les niveaux d'accessibilité des éléments DOM (violations et validations). Cliquez sur la case à cocher « mettre en évidence les résultats » pour visualiser les violations directement dans le composant UI. + + + +À partir de là, suivez les recommandations de l'addon en matière d'accessibilité. + +## Autres stratégies de test + +Paradoxalement, les tests peuvent faire gagner du temps mais aussi ralentir la vitesse de développement en raison de la maintenance. Faites preuve de discernement en testant les bons éléments uniquement. Bien que le développement de logiciels comporte de nombreuses stratégies de test, nous avons découvert à nos dépens que certaines d'entre elles ne sont pas adaptées aux design system. + +### Tests de couverture du code + +Les tests de couverture du code mesurent la part de votre base de code couverte par les tests. C'est un bon moyen de s'assurer que vos tests testent réellement quelque chose. Cependant, ils ne constituent pas un bon moyen de mesurer la qualité de vos tests, mais ils peuvent être utiles pour vérifier que tous les composants et utilitaires fournis par le design system fonctionnent comme prévu, ce qui permet d'identifier toute lacune ou tout problème potentiel dans la mise en œuvre du design system. Storybook fournit un [addon](https://storybook.js.org/addons/@storybook/addon-coverage/) pour nous aider dans cette tâche. Développé par [Istanbul](https://istanbul.js.org/), l'addon coverage de Storybook génère un rapport de couverture de code pour vos stories Storybook. Voyons comment. + +Commencez par lancer la commande suivante pour installer l'addon coverage : + +```shell +yarn add --dev @storybook/addon-coverage +``` + +Ensuite, mettez à jour votre configuration Storybook pour inclure l'addon : + +```diff:title=.storybook/main.js +/** @type { import('@storybook/react-vite').StorybookConfig } */ +const config = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/addon-a11y', ++ '@storybook/addon-coverage', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + docs: { + autodocs: 'tag', + }, +}; +export default config; +``` + +Enfin, un fois que Storybook est affiché, lancer le test runner (dans une nouvelle fenêtre du terminal) avec le flag `--coverage` : + +```shell +yarn test-storybook --coverage +``` + +![Rapport des tests de couverture de Storybook](/design-systems-for-developers/test-runner-coverage-testing.png) + +A partir d'ici, suivez les recommandations pour améliorer votre couverture de code. + +#### Tests instantanés (Jest) + +Cette technique permet de capturer le code des composants de l'interface utilisateur et de le comparer aux versions précédentes. Tester le balisage des composants de l'interface utilisateur revient à tester les détails de l'implémentation (code), et non l'expérience de l'utilisateur dans le navigateur. + +Les tests instantanés (snapshots) sont imprévisibles et sujets à des faux positifs. Au niveau des composants, le test instantané ne tient pas compte des changements globaux tels que les design tokens, les feuilles de style CSS et les mises à jour d'API tierces (polices web, formulaires Stripe, Google Maps, etc.). Dans la pratique, les développeurs ont recours à l'«approbation totale» ou ignorent complètement les tests instantanés. + +> La plupart des tests d'instantanés de composants ne sont en fait qu'une version aggravée des tests d'instantanés d'écran. Testez l'affichage. Testez ce qui est affiché, et non le balisage sous-jacent (inutile !). - Mark Dalgliesh, infrastructure Frontend chez SEEK, créateur de modules CSS + +#### Tests end-to-end (Selenium, Cypress) + +Les tests end-to-end traversent le DOM du composant pour simuler le parcours de l'utilisateur. Ils conviennent mieux à la vérification des parcours d'applications tels que le processus d'inscription ou de paiement. Plus la fonctionnalité est complexe, plus cette stratégie de test est utile. + +Les design system contiennent des composants atomiques dotés d'une fonctionnalité relativement simple. La validation des parcours utilisateurs est souvent exagérée pour cette tâche, car les tests sont longs à créer et difficiles à maintenir. Toutefois, dans de rares cas, les composants peuvent bénéficier de tests end-to-end. Par exemple, la validation d'interfaces utilisateur complexes telles que les sélecteurs de date ou les formulaires de paiement autonomes. + +## Favoriser la prise en main grâce à la documentation + +Un design system n'est pas complet si l'on se contente de tests. Étant donné que les design system sont au service des acteurs de l'ensemble de l'équipe, nous devons enseigner aux autres comment tirer le meilleur parti de nos composants d'interface utilisateur bien testés. + +Dans le chapitre 6, nous apprendrons comment faciliter la prise en main des design system grâce à la documentation. Découvrez pourquoi Storybook Docs est l'arme secrète pour créer une documentation complète en un claquement de doigts. diff --git a/content/design-systems-for-developers/react/fr/workflow.md b/content/design-systems-for-developers/react/fr/workflow.md new file mode 100644 index 000000000..66f5fda81 --- /dev/null +++ b/content/design-systems-for-developers/react/fr/workflow.md @@ -0,0 +1,257 @@ +--- +title: 'Flux de travail pour les design system' +tocTitle: 'Flux de travail' +description: "Un aperçu du flux de travail d'un design system pour les développeurs frontend" +commit: '9d13d12' +--- + +La manière dont les outils frontend fonctionnent ensemble a un impact significatif sur la valeur finale que les équipes de design et de développement peuvent réaliser. S'il est bien fait, le développement et la réutilisation des composants UI devraient se faire en toute transparence. + +Ce chapitre présente le flux de travail en cinq étapes en introduisant un nouveau composant, AvatarList. + +![Flux de travail d'un design system](/design-systems-for-developers/design-system-workflow-horizontal.jpg) + +## Construire + +`AvatarList` est un composant qui affiche plusieurs Avatars. Comme les autres composants du design system, `AvatarList` a commencé par être réutilisé dans de nombreux projets, et c'est la raison pour laquelle il mérite d'être inclus dans le design system. Supposons que le composant ait été développé dans un autre projet et passons directement au code final de cette démonstration. + +![AvatarList](/design-systems-for-developers/AvatarList.jpg) + +Tout d'abord, créez une nouvelle branche dans laquelle nous suivrons ce travail. + +```shell +git checkout -b create-avatar-list-component +``` + +Téléchargez le composant `AvatarList` et la story sur votre machine et placez-les dans le dossier `/src/AvatarList` : + +- [Fichier du composant](https://raw.githubusercontent.com/chromaui/learnstorybook-design-system/bd9a7647bfa61717c2388153955756e1591227de/src/AvatarList/AvatarList.jsx) +- [Fichier de la story](https://raw.githubusercontent.com/chromaui/learnstorybook-design-system/bd9a7647bfa61717c2388153955756e1591227de/src/AvatarList/AvatarList.stories.jsx) +- [Fichier index](https://raw.githubusercontent.com/chromaui/learnstorybook-design-system/bd9a7647bfa61717c2388153955756e1591227de/src/AvatarList/index.js) + +![Storybook avec le composant AvatarList](/design-systems-for-developers/storybook-with-avatarlist-7-0.png) + +
+ +💡 Storybook est configuré pour détecter automatiquement les fichiers se terminant par `*.stories.js|jsx` et les afficher dans l'interface utilisateur. + +
+ +Super ! Maintenant, articulons chaque état de l'interface utilisateur pris en charge par `AvatarList`. A première vue, il est clair que `AvatarList` comporte certaines propriétés de `Avatar` comme `small` et `loading`. + +```jsx:title=src/AvatarList/AvatarList.stories.jsx +export const SmallSize = { + args: { + ...Short.args, + size: 'small', + }, +}; + +export const Loading = { + args: { + ...Short.args, + loading: true, + }, +}; +``` + +![Storybook avec des stories AvatarList supplémentaires](/design-systems-for-developers/storybook-with-avatarlist-loading-7-0.png) + +Etant donné qu'il s'agit d'une liste, elle devrait afficher beaucoup d'Avatars. Ajoutons des stories qui illustrent ce qui se passe avec de nombreux éléments et avec peu d'éléments dans la liste. + +```jsx:title=src/AvatarList/AvatarList.stories.jsx +export const Ellipsized = { + args: { + users: [ + ...Short.args.users, + { + id: '3', + name: 'Zoltan Olah', + avatarUrl: 'https://avatars0.githubusercontent.com/u/81672', + }, + { + id: '4', + name: 'Tim Hingston', + avatarUrl: 'https://avatars3.githubusercontent.com/u/1831709', + }, + ], + }, +}; + +export const BigUserCount = { + args: { + users: Ellipsized.args.users, + userCount: 100, + }, +}; + +export const Empty = { + args: { + users: [], + }, +}; +``` + + + +Sauvegardez vos modifications et validez. + +```shell +git commit -am « Added AvatarList and stories » +``` + +## Documenter + +Avec la fonction [auto-documentation](https://storybook.js.org/docs/react/writing-docs/autodocs) du Storybook, créer une documentation personnalisable est un jeu d'enfant. C'est un avantage pour ceux qui veulent apprendre à utiliser AvatarList, car ils peuvent facilement se référer à la partie Docs dans l'interface utilisateur de Storybook. + +![Storybook docs avec des informations de base sur AvatarList](/design-systems-for-developers/storybook-docs-minimal-avatarlist-7-0.png) + +Et voilà une documentation minimale et utilisable ! + +Ajoutons à AvatarList un aspect un peu plus humain en fournissant un contexte supplémentaire sur la façon de l'utiliser. + +```jsx:title=src/AvatarList/AvatarList.jsx +/** + * A list of Avatars, ellipsized to at most 3. Supports passing only a subset of the total user count. + */ +export function AvatarList({ loading, users, userCount, size, ...props }) {} +``` + +Ajoutez quelques détails supplémentaires sur les propriétés supportées. + +```jsx:title=src/AvatarList/AvatarList.jsx +AvatarList.propTypes = { + /** + * Are we loading avatar data from the network? + */ + loading: PropTypes.bool, + /** + * A (sub)-list of the users whose avatars we have data for. Note: only 3 will be displayed. + */ + users: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.string.isRequired, + name: PropTypes.string, + avatarUrl: PropTypes.string, + }) + ), + /** + * The total number of users, if a subset is passed to `users`. + */ + userCount: PropTypes.number, + /** + * AvatarList comes in four sizes. In most cases, you’ll be fine with `medium`. + */ + size: PropTypes.oneOf(Object.keys(sizes)), +}; +``` + +Facile comme bonjour ! Ce niveau de détail est suffisant pour l'instant, nous pourrons toujours personnaliser davantage à l'aide de MDX par la suite. + +![Storybook docs avec des informations complètes sur AvatarList](/design-systems-for-developers/storybook-docs-full-avatarlist-7-0.png) + +La documentation n'a pas besoin d'être fastidieuse. Grâce à des outils automatisés, nous avons supprimé les tâches lourdes pour passer directement à l'écriture. + +Effectuez un commit avec les modifications et publiez-les sur GitHub. + +```shell +git commit -am "Improved AvatarList docs" +``` + +### Préparer la publication + +Avant de publier notre composant dans le design system, nous devons nous assurer qu'il est disponible une fois tout d'installé. Ajoutons-le au fichier`index.js` du design system. + +```diff:title=src/index.js +import * as styles from './shared/styles'; +import * as animation from './shared/animation'; +import * as icons from './shared/icons'; +import * as global from './shared/global'; + +export { styles, animation, icons, global }; + +export * from './Avatar'; ++ export * from './AvatarList'; +export * from './Badge'; +export * from './Button'; +export * from './Icon'; +export * from './Link'; +export * from './LinkWrapper'; + +``` + +#### Créer une Pull Request (PR) + +Poussons notre branche `AvatarList` sur GitHub et créons une PR : + +```shell +git push -u origin create-avatar-list-component +``` + +Ensuite, allez sur GitHub et ouvrez une PR. + +![PR créée pour AvatarList](/design-systems-for-developers/github-pr-create-avatarlist.png) + +## Relecture + +A ce stade, `AvatarList` est une proposition d'ajout dans le design system. +Les membres de l'équipe doivent relire le code du composant pour voir s'il répond aux attentes en matière de fonctionnalités et d'apparence. Le Storybook du design system est automatiquement publié avec chaque Pull Request (PR) afin de simplifier la revue. Faites défiler la page jusqu'aux vérifications de la PR pour y trouver un lien vers le Storybook déployé. + +![Vérifications de la PR déployée](/design-systems-for-developers/avatarlist-github-pr-checks-chromatic-changes.png) + +Cherchez `AvatarList` dans votre Storybook en ligne. Il devrait être identique à votre Storybook local. + +![AvatarList dans le Storybook en ligne](/design-systems-for-developers/chromatic-deployed-avatarlist-stories-7-0.png) + +Le Storybook en ligne est un point de référence universel pour l'équipe. Partagez le lien vers `AvatarList` avec d'autres membres pour obtenir un retour d'information plus rapide. Votre équipe appréciera parce qu'elle n'aura pas à s'occuper du code ou à mettre en place un environnement de développement. + +![Ca semble bon, c'est parti !](/design-systems-for-developers/visual-review-shipit.png) + +Parvenir à un consensus avec de nombreuses équipes ressemble souvent à un exercice futile. Les gens font référence à du code obsolète, n'ont pas d'environnement de développement ou dispersent leurs commentaires dans plusieurs outils. La revue en ligne du Storybook est aussi simple que le partage d'une URL. + +## Test + +Notre série de tests s'exécute en arrière-plan à chaque validation. + +`AvatarList` est un simple composant d'affichage, les tests unitaires ne sont donc pas nécessaires. Mais si nous examinons les vérifications des Pull Request (PR), notre outil de test visuel Chromatic a déjà détecté des changements qui doivent être revus. + +![Changements Chromatic affichés dans les vérifications de la PR Github](/design-systems-for-developers/avatarlist-github-pr-checks-chromatic-changes.png) + +Comme AvatarList est un nouveau composant, il ne possède pas encore de tests visuels. Nous devrons ajouter des références de tests pour chaque story. Accepter les « nouvelles stories » dans Chromatic pour augmenter la couverture des tests visuels. + +![Changements Chromatic pour les stories du composant AvatarList](/design-systems-for-developers/chromatic-avatarlist-changes.png) + +Une fois que vous avez terminé, la compilation passera dans Chromatic. + +![Changements Chromatic validés pour les stories du composant AvatarList](/design-systems-for-developers/chromatic-avatarlist-changes-accepted.png) + +Ce qui, à son tour, met à jour la vérification de la Pull Request (PR) dans GitHub. + +![Changements Chromatic pour les stories du composant AvatarList validés sur Github](/design-systems-for-developers/avatarlist-github-pr-checks-chromatic-changes-accepted.png) + +Les tests ont été mis à jour avec succès. À l'avenir, les régressions auront du mal à se faufiler dans le design system. + +## Partager + +Nous avons une Pull Request (PR) ouverte qui ajoute `AvatarList` au design system. Nous avons écrit nos stories, les tests sont passés et la documentation existe. Enfin, nous sommes prêts à mettre à jour notre design system avec Auto et npm. Ajouter le label « minor » à la PR. Cela indique à Auto de mettre à jour la version mineure du paquet lors du merge. + +![PR GitHub avec les labels](/design-systems-for-developers/github-pr-labelled.png) + +Maintenant mergez votre PR, naviguez vers votre paquet sur npm, et attendez quelques minutes le temps que le paquet se mette mis à jour. + +![Paquet publié sur npm](/design-systems-for-developers/npm-published-package-minor.png) + +Bravo ! Le paquet de votre design system a été mis à jour grâce à GitHub. Pas besoin de toucher à la ligne de commande ou de s'occuper de npm. + +Mettez à jour la dépendance `learnstorybook-design-system` dans l'application d'exemple pour commencer à utiliser AvatarList. + +## Votre voyage commence + +_design system for Developers_ met en évidence le flux de travail de bout en bout utilisé par les équipes frontend professionnelles pour vous donner une longueur d'avance lorsque vous développez le vôtre. Au fur et à mesure que votre design system se développe, ajoutez, réorganisez et étendez ces outils pour répondre aux besoins de votre équipe. + +Le chapitre 9 se termine par un exemple de code complet, des ressources utiles et une liste de questions fréquemment posées par les développeurs.