Killian H.

Seanapps Pro

Design system atomique construit de zéro pour le Groupe Bénéteau

Design system
Figma
Atomic design
Documentation
Portrait de Killian
Killian Hocquet
Designer UX/UI - Vulpify
Logo du Groupe Beneteau
Groupe Beneteau
Partenaire
Seanapps Pro · Groupe Bénéteau

Depuis deux ans, en tâche de fond de mes autres missions, je construis le de Seanapps Pro, la plateforme de gestion de flotte du Groupe Bénéteau. Une atomique, documentée par composant, et lisible par une IA : les écrans ne se dessinent plus, ils s'assemblent. Tout ce qui suit n'existe que pour rendre ça possible : les deux couches de , les sources verrouillées, chaque propriété nommée.

0écrans construits avec la library
0composants, en 106 familles
0 en 6 collections
0 ansde construction, en tâche de fond

Une remarque avant de commencer

La library compte 2 069 composants répartis en 106 familles, organisées en cinq niveaux dans Figma, et elle sert à construire les 845 écrans répartis sur 34 pages du fichier produit. Tout ce qui suit prend la comme exemple, parce qu'elle traverse les trois niveaux atomiques et que c'est le composant le mieux documenté. Mais c'est 3 familles sur 106, à peu près 1 % du système. Tout le reste suit exactement les mêmes règles.

La library, page par page

ValidéEn coursÀ validerÀ refaire

Fondation

1 famille

TypographieColorsIcons

1 517

Atoms

51 familles

Brand & LogoButtonInputsAssetsInformation

280

Molecules

18 familles

Empty stateLabelClickableToastCard

92

Organisms

35 familles

DialogsListe PageHeaderNotificationAccordionNavigation

173

Templates

1 famille

Global Header

7

Deux ans de travail en tâche de fond, entre les autres missions. Un design system ne se livre pas, il se tient dans la durée : chaque écran de production ramène une question que le système doit apprendre à trancher. Les pastilles de statut ne sont pas décoratives, elles disent ce qui est validé, ce qui reste à reprendre, et c'est visible par toute l'équipe directement dans le nom des pages.

Construire le système

Deux couches de tokens, trois niveaux de composants, et des sources verrouillées. Les fondations décident de tout ce qui vient après.

Deux couches, une seule

La règle du système : un composant ne référence jamais une valeur brute. Il passe toujours par un . Le nom dit l'intention, pas la valeur.

Couche 1 : primitives

Couche 2 : tokens sémantiques

Typographie : Poppins, quatre tailles

Titre de la dialogLarge / SemiBold · 24px
Libellé de boutonDefault / Medium · 16px
Texte courantDefault / Light · 16px
Étiquette de champSmall / Medium · 14px
Description sous le titreSmall / Light · 14px
Mention secondaireSubtle / Regular · 12px

Formes et profondeur

radius/x-middle · 8px
elevation/large · 3 ombres
spacing · 2 / 4 / 16

 

Ci-dessus, les 13 tokens que la modale consomme réellement, sur les 24 de la collection sémantique et les 80 variables du système. Le jour où le gris de second niveau change, il change à un seul endroit et tous les écrans suivent. C'est tout l'intérêt de la deuxième couche.

La modale, démontée

Un ne connaît pas la modale, et la modale ne redessine aucun atome. C'est cette indépendance qui permet de changer le bouton une seule fois et de le voir changer partout.

Survolez une branche pour l'allumer dans la modale, ou l'inverse.

Batterie critique

Le Modèle 42 #08 est descendu sous 20 % de charge depuis 4 heures.

Dernière position connue : Port de La Rochelle.

Pourquoi les sources sont verrouillées

Les composants sources portent un cadenas et ne sont pas exposés. La library publie un par-dessus.

Structure de la library
📖 SeanappsPro / Library
├── 🔒 CtaButtons-Master      // verrouillé, jamais exposé
├── 🔒 IconsMaster            // verrouillé, jamais exposé
│
├── CtaButtons                // publié : Primary · Destructive · Tertiary
├── IconsVariants             // publié
├── Dialog/Basic              // publié : 10 propriétés
└── Dialog/FullScreen         // publié : 9 propriétés

Personne ne casse la source

Un designer ne peut ni ni modifier le par accident. L' qu'il pose est toujours conforme.

Je peux faire évoluer l'intérieur

Le wrapper garde son contrat de propriétés. Je change la mécanique dessous sans casser une seule instance posée dans un écran.

Le système reste lisible

Dans le panneau des composants, on ne voit que ce qu'on a le droit d'utiliser. Le reste, c'est de la plomberie.

Deux composants, pas un

La question s'est posée sérieusement : fusionner les deux modales en un seul set avec un variant Type. J'ai tranché contre, pour trois raisons.

Figma n'a pas de propriétés conditionnelles

Toutes les propriétés d'un set s'affichent sur tous ses variants. Fusionner les deux modales réintroduirait des propriétés inertes, affichées mais sans effet.

La distinction est sémantique, pas dimensionnelle

Le scroll, la fermeture au scrim, l'empilement et la forme du titre diffèrent. Ce ne sont pas deux tailles du même composant, ce sont deux composants.

Fusionner deux sets publiés est cassant

Toutes les instances posées dans les fichiers produit seraient à relier à la main. Le coût de la fusion retombe sur les autres.

Une décision de design system se documente avec ses raisons, sinon elle sera reprise dans six mois par quelqu'un qui refera le même raisonnement.

Documenter

Un composant non documenté est un composant mal utilisé. La modale a sa propre section : à quoi elle sert, comment elle est faite, comment elle se comporte, et comment on écrit dedans.

Deux composants, deux usages

Une modale bloque toute l'interface tant qu'elle est ouverte. À n'utiliser que quand l'interruption est justifiée.

Décider

Dialog/Basic

Faire confirmer, valider ou abandonner une action.

  • ·Confirmer une suppression ou une action irréversible
  • ·Alerter sur un évènement bloquant (batterie critique, abonnement expiré)
  • ·Faire trancher entre deux options simples
  • ·Faire saisir une seule information, même si elle prend deux champs

Mobile 288 · Desktop 448 · Ne scrolle pas

Saisir ou régler

Dialog/FullScreen

Faire saisir plusieurs informations, dérouler une tâche, ou régler des préférences.

  • ·Formulaire : plusieurs informations distinctes à renseigner
  • ·Sélection multiple dans une longue liste
  • ·Enchaînement d'étapes non enregistré au fil de l'eau
  • ·Réglages appliqués instantanément (dans ce cas, Show footer off)

Mobile plein écran 360 × 744 · Desktop 640 centré · Body scrollable

Quand ne pas utiliser de modale

Si l'utilisateur peut continuer à travailler sans y répondre, ce n'est pas une modale.

Information non bloquanteToast : se ferme seule, ne demande rien
Confirmation de succèsToast : ne jamais faire cliquer pour accuser réception d'une réussite
Choix parmi une liste d'optionsDropdown ou menu contextuel : pas de scrim, pas de perte de contexte
Contenu secondaire à consulterPanneau latéral ou page dédiée
Erreur liée à un champMessage inline sous le champ concerné

La question qui tranche

Combien d'informations distinctes l'utilisateur doit-il fournir ? Zéro ou une donne un Basic, plusieurs donnent un FullScreen. Le critère n'est pas le nombre de champs : « Modifier l'adresse email » demande deux champs (la nouvelle adresse et sa confirmation) mais une seule information, c'est un Basic. « Ajouter un bateau » demande le point de vente, le modèle et le numéro de série, trois informations sans rapport, c'est un FullScreen. Autrement dit : une action donne un Basic, une tâche donne un FullScreen.

Anatomie et propriétés

Les deux composants partagent la même structure et le même jeu de propriétés. C'est ce qui rend le système apprenable : on comprend l'un, on sait utiliser l'autre.

Trois zones

Header

Titre, description et croix de fermeture. Fixe : ne scrolle jamais.

Body

Le contenu. Seule zone scrollable, et uniquement sur Dialog/FullScreen.

Footer

Les actions, alignées à droite. Action 1 est toujours la plus à droite. Peut être masqué (Show footer) quand il n'y a rien à valider.

Le détail des propriétés19 propriétés · 3 slots

Propriétés de Dialog/Basic

TitleTexte

Le titre. Une ligne, deux au maximum, au-delà il est tronqué.

DescriptionTexte

Le contexte et la conséquence de l'action. Peut rester vide si le titre se suffit.

IconSlot

Pictogramme de statut à gauche du titre (alerte, erreur). Vide par défaut.

Show close buttonBooléen

Croix en haut à droite. Activée par défaut sur toutes les modales. Ne la retirer que lorsque l'utilisateur doit impérativement trancher, et jamais sur une modale sans Footer, où elle est la seule sortie.

Show contentBooléen

Affiche la zone de contenu entre le texte et les actions.

ContentSlot

Zone libre entre le texte et les actions : un bandeau de notification, un à deux champs pour une même information, ou des lignes de réglage. Ne scrolle pas.

Action 1Instance

Bouton principal, le plus à droite. Le résultat de l'action, ou l'étape suivante si la modale fait partie d'un parcours. CtaButtons / Primary par défaut, CtaButtons / Destructive pour une action irréversible.

Action 2Instance

Bouton secondaire. Selon le cas : abandon (Annuler), action alternative qui ne ferme pas la modale, retour en arrière, ou report. CtaButtons / Tertiary par défaut.

Show footerBooléen

Affiche la zone des actions. À désactiver quand les réglages s'appliquent instantanément : la modale n'a alors plus de bouton et se ferme par la croix.

DeviceVariant

Mobile (288, boutons S) ou Desktop (448, boutons M).

Propriétés de Dialog/FullScreen

TitleTexte

Le nom de la tâche en cours, pas une question.

DescriptionTexte

Une phrase de cadrage sous le titre. Optionnelle.

ContentSlot

Le contenu de la tâche : formulaire, liste, étapes. C'est la seule zone qui scrolle.

Show scrollbarBooléen

Barre de scroll du Body. À activer dès que le contenu dépasse la hauteur disponible.

Show close buttonBooléen

Croix en haut à droite. Activée par défaut sur toutes les modales. Ne la retirer que lorsque l'utilisateur doit impérativement trancher, et jamais sur une modale sans Footer, où elle est la seule sortie.

Action 1Instance

Bouton principal, le plus à droite. Le résultat de l'action, ou l'étape suivante si la modale fait partie d'un parcours.

Action 2Instance

Bouton secondaire. Abandon, action alternative, retour en arrière ou report. CtaButtons / Tertiary par défaut.

Show footerBooléen

Affiche la zone des actions. À désactiver quand les réglages s'appliquent instantanément.

DeviceVariant

Mobile (plein écran 360 × 744, boutons S) ou Desktop (640 centré, boutons M).

Les

Un slot accueille n'importe quel composant de la library, sans détacher l'instance. Y glisser un composant existant plutôt que de dessiner dedans : sinon la modale ne suivra pas les évolutions de la library.

IconIconsVariants

Un seul pictogramme, jamais un groupe. Réservé aux modales d'alerte ou d'erreur : une confirmation neutre n'en a pas besoin.

Content (Basic)Libre

Un bandeau, un à deux champs quand la modale demande une seule information, ou des lignes de réglage. Au-delà de plusieurs informations distinctes, ce n'est plus un Basic.

Content (FullScreen)Libre

Champs de formulaire, listes, étapes. Prévoir le comportement au scroll : le Header et le Footer restent fixes.

Les valeurs par défaut sont des consignes

Un détail dont je suis assez content : les textes par défaut ne sont pas du faux texte, ce sont les règles elles-mêmes. Le designer lit la consigne au moment exact où il remplit le champ, sans avoir à ouvrir la documentation.

Dialog/Basic

Titre de la modale

Ce qui va se passer, et pourquoi ça compte. Une à trois lignes.

Dialog/FullScreen

Nom de la tâche

Une phrase de sous le titre. Optionnelle.

Comportement

Une modale ne se ferme jamais d'elle-même, et jamais après un délai. Il faut une action explicite.

Croix

Dialog/Basic
Ferme sans rien appliquer

Dialog/FullScreen
Ouvre une modale/Basic de confirmation si des saisies sont en cours

Touche Échap

Dialog/Basic
Ferme

Dialog/FullScreen
Même comportement que la croix

Clic sur le scrim

Dialog/Basic
Ferme

Dialog/FullScreen
Ne ferme pas : trop de risque de perte de saisie

Action 2

Dialog/Basic
Ferme sans appliquer

Dialog/FullScreen
Même comportement que la croix

Action 1

Dialog/Basic
Applique puis ferme

Dialog/FullScreen
Enregistre puis ferme

Le fait partie du composant

Le titre dit ce qui va se passer. La description dit pourquoi ça compte. Les boutons disent ce que l'on fait. Si les trois disent la même chose, il y en a deux de trop.

Les règles d'écriture, en détailtitres, descriptions, libellés · 24 cas

Le titre

À faire
  • Modifier l'adresse email

    Un nom de tâche : la forme par défaut

  • Supprimer ce bateau de l'inventaire ?

    Interrogatif, réservé au destructif

  • Abonnement Seanapps expiré

    Affirmatif : pour une alerte, c'est un constat

À éviter
  • Êtes-vous sûr ?

    Sûr de quoi ? Oblige à lire la description

  • Attention !

    Alarmiste et vide de contenu

  • Édition

    Un nom d'écran, pas une tâche

La description

À faire
  • Le bateau Modèle 42 #08 et son historique de trajets seront définitivement supprimés.

    Dit exactement ce qui disparaît

  • L'invitation sera envoyée à adeline.durand@dealer.fr. Elle expire dans 7 jours.

    Donne les deux informations que l'utilisateur n'a pas à l'écran

À éviter
  • Cette action est irréversible. Voulez-vous continuer ?

    Répète le titre et repose la question déjà posée par les boutons

  • Vous êtes sur le point de supprimer cet élément.

    « Cet élément » : l'utilisateur doit deviner lequel

Les libellés d'action

Action 1 dit ce qui se passe quand on clique. Un à trois mots, pas de point final, majuscule sur le premier mot uniquement.

OKLibre

Ne dit pas ce qui va se passer. Écrire plutôt : Le verbe de l'action : Supprimer, Envoyer, Enregistrer.

Oui / NonLibre

Oblige à remonter lire le titre pour savoir à quoi on répond. Écrire plutôt : Deux verbes explicites.

TerminéLibre

Ambigu : est-ce enregistré, ou abandonné ?. Écrire plutôt : Enregistrer.

SoumettreLibre

Jargon de formulaire. Écrire plutôt : Envoyer, Créer, Enregistrer.

FermerLibre

Acceptable quand le bouton n'a réellement aucun effet, ou quand la modale n'a pas de Footer et se ferme par la croix. Écrire plutôt : Annuler.

Action 2 n'est pas un bouton d'annulation

C'est le raccourci le plus courant, et il coûte cher : on met « Annuler » partout alors que le bouton secondaire prend quatre formes différentes, chacune avec son cas réel dans le produit.

AbandonAnnuler · Réglage d'une alerte
Action alternative, ne ferme pas la modaleNouveau client · Transférer la propriété
Retour à l'étape précédenteSaisir un autre numéro · Ajouter un bateau
ReportPlus tard

Les paires réellement en production

Modifier l'adresse email

Action 1
Continuer

Action 2
Annuler (abandon)

Transférer la propriété

Action 1
Valider

Action 2
Nouveau client (alternative)

Ajouter un bateau

Action 1
Confirmer

Action 2
Saisir un autre numéro (retour)

Réglage d'une alerte

Action 1
Enregistrer

Action 2
Annuler (abandon)

Nouvelle commande enregistrée

Action 1
aucune

Action 2
Show footer off

Sept écrans, sept leçons

La doc se termine par des cas réels du produit, chacun choisi pour ce qu'il enseigne. Les exemples sont des instances vivantes des composants : quand la library change, la doc change avec elle.

Modifier l'adresse emailBasic Mobile, 2 champs

Deux champs, une seule information, donc un Basic. Action 1 vaut « Continuer » parce qu'une confirmation suit.

Les six autres leçons6 écrans de production
Transférer la propriétéBasic Mobile, recherche client dans Content

Une recherche volumineuse reste une seule information. Action 2 vaut « Nouveau client » : une alternative qui ne ferme pas la modale.

Nouvelle commande enregistréeBasic Mobile, Show footer off

Une modale peut n'avoir aucune action. La croix devient alors la seule sortie.

Réglage d'une alerteFullScreen Mobile, réglages composites

Le seul cas où « Annuler » est le bon libellé : il y a un réglage non enregistré à jeter.

Ajouter un bateauFullScreen Desktop, formulaire

Trois informations distinctes, donc un formulaire, donc un FullScreen. Action 2 vaut « Saisir un autre numéro » : un retour en amont.

Confirmer une suppressionBasic Desktop, Action 1 en Destructive

Une action irréversible se signale par la couleur, pas seulement par le texte.

Le contre-exempleBasic Desktop

Bon composant, wording à refaire. Le composant juste ne sauve pas un texte raté.

Une matrice, pas une collection

Toutes ces vignettes sont le même composant. Seules les propriétés changent. C'est ce qui évite de redessiner une modale à chaque nouvel écran.

Dialog/Basic8 variantes · 1 composant · 0 duplicata
Défaut

Transférer la propriété

Le nouveau propriétaire recevra l'historique complet du bateau.

showCloseButton · showFooter

Avec pictogramme

Transférer la propriété

Le nouveau propriétaire recevra l'historique complet du bateau.

icon={…}

Action irréversible

Supprimer ce bateau ?

Le bateau et son historique seront définitivement supprimés.

variant="destructive"

Une seule action

Transférer la propriété

Le nouveau propriétaire recevra l'historique complet du bateau.

action2={undefined}

Sans description

Transférer la propriété

description={undefined}

Avec slot Content

Transférer la propriété

Le nouveau propriétaire recevra l'historique complet du bateau.

showContent

Réglages instantanés

Transférer la propriété

Le nouveau propriétaire recevra l'historique complet du bateau.

showFooter={false}

Choix obligatoire

Transférer la propriété

Le nouveau propriétaire recevra l'historique complet du bateau.

showCloseButton={false}

Rendre le système exécutable

Des fichiers .md déposés dans l'IDE permettent à Claude d'utiliser la library pour construire des écrans directement dans Figma. Et les propriétés Figma se traduisent une à une en props React.

Du dans l', des écrans dans Figma

C'est la partie que je trouve la plus intéressante. J'ai écrit des fichiers .md qui décrivent la library : composants disponibles, propriétés, règles de choix, conventions. On les dépose dans son IDE, et Claude peut alors utiliser correctement la library pour construire un écran directement dans Figma. La documentation passe de « ce qu'un humain lit » à « ce qu'une machine applique ».

01

La library Figma

Composants atomiques, variants, tokens sémantiques.

02

Les fichiers .md

La library décrite en règles applicables, posée dans l'IDE.

03

Claude dans l'IDE

Choisit les bons composants avec les bonnes propriétés.

04

L'écran dans Figma

Assemblé d'instances conformes, pas dessiné.

Les fichiers

La spec complète des deux modales : règle de choix, propriétés, wording, décisions d'architecture et écarts connus avec la production.

dialog.md
# Dialog · SeanappsPro Library

Fichier Figma : 📖 SeanappsPro Library, page ✅ DialogElements (accès interne)
Refonte du 30/07/2026, révisée le même jour à partir de cinq écrans réellement en production.

## Les deux composants

| Composant | Rôle | Mobile | Desktop |
|---|---|---|---|
| `Dialog/Basic` | **Une action** : la faire confirmer, valider ou abandonner | 288, boutons S | 448, boutons M |
| `Dialog/FullScreen` | **Une tâche** : formulaire, sélection multiple, étapes | plein écran 360 × 744, boutons S | 640 centré, boutons M |

### Règle de choix

**« Combien d'informations distinctes l'utilisateur doit-il fournir ? »**
Zéro ou une → `Dialog/Basic`. Plusieurs → `Dialog/FullScreen`.

Le critère n'est **pas le nombre de champs**, ni la hauteur de la dialog, mais le nombre d'informations distinctes :

- « Modifier l'adresse email » = deux champs (la nouvelle adresse + sa confirmation) mais **une seule information** → Basic
- « Transférer la propriété » = une recherche qui prend beaucoup de place, mais **une seule information** (le nouveau propriétaire) → Basic
- « Nouvelle commande enregistrée » = **zéro information**, juste des réglages → Basic, avec `Show footer` off
- « Ajouter un bateau » = point de vente + modèle + numéro de série, **trois informations sans rapport** → FullScreen
- « Réglage d'une alerte » = plusieurs réglages composites non enregistrés au fil de l'eau → FullScreen

Autrement dit : une action → Basic, une tâche → FullScreen.

Le Basic accueille champs et réglages dans son slot `Content`, mais **il ne scrolle pas** : si ça déborde, passer sur FullScreen.
Le FullScreen n'est plein écran que sur mobile. Sur desktop c'est une modale large scrollable (640, volontairement plus large que le Basic à 448).
Boutons en taille S sur mobile et M à partir de la tablette, même règle sur les deux composants.

## Convention de structure

```
Header
├ Title row
│  ├ Icon (slot, Basic uniquement)
│  ├ Title
│  └ Close button
└ Description
Content         slot · Basic : bandeau, 1-2 champs ou réglages, ne scrolle pas
Body            FullScreen → Content (slot) + Scrollbar > Scrollbar handle
Footer          (masquable via Show footer)
├ Action 2
└ Action 1
```

## Propriétés

Nommage : anglais, `Show <x>` pour les booléens de visibilité, `Action 1` / `Action 2` pour les instance swaps.

**Dialog/Basic** : Title, Description, Icon, Show close button, Show content, Content, Action 1, Action 2, Show footer, Device
**Dialog/FullScreen** : Title, Description, Content, Show scrollbar, Show close button, Action 1, Action 2, Show footer, Device

Les libellés de boutons ne sont pas des props du Dialog : ils vivent sur l'instance `🔒CtaButtons-Master` imbriquée (`Label#99:0`).

### Valeurs par défaut

| Composant | Title | Description | Show close button |
|---|---|---|---|
| `Dialog/Basic` | Titre de la dialog | Ce qui va se passer, et pourquoi ça compte. Une à trois lignes. | true |
| `Dialog/FullScreen` | Nom de la tâche | Une phrase de cadrage sous le titre. Optionnelle. | true |

Les défauts texte sont rédigés comme des consignes : le designer lit la règle en remplissant le champ.

### Action 1 et Action 2

`Action 1` = ce qui se passe quand on clique. Le plus souvent le résultat (« Supprimer », « Enregistrer », « Confirmer »), mais **« Continuer » quand la dialog n'est qu'une étape d'un parcours**. Toujours la plus à droite.
**Action irréversible → variant `Destructive` de CtaButtons.** Le rouge signale la conséquence, le libellé seul ne suffit pas.

`Action 2` **n'est pas un bouton d'annulation.** C'est le bouton secondaire, sous quatre formes :

| Forme | Exemple réel |
|---|---|
| Abandon | `Annuler` : Réglage d'une alerte |
| Action alternative, ne ferme pas la dialog | `Nouveau client` : Transférer la propriété |
| Retour à l'étape précédente | `Saisir un autre numéro` : Ajouter un bateau |
| Report | `Plus tard` |

Et parfois il n'y a **aucune action** : réglages appliqués instantanément → `Show footer` off.

### Règle de la croix

Croix active **par défaut sur toutes les dialogs** : `Show close button` vaut `true` sur les deux composants depuis le 30/07/2026.
Retirée uniquement quand l'utilisateur doit impérativement trancher, et dans ce cas on retire aussi la fermeture au scrim.
Sur une dialog sans Footer, `Show close button` ne se désactive jamais : c'est la seule sortie.
Croix et Action 2 ne font pas doublon : la croix sort sans rien faire, Action 2 porte une intention nommée.

⚠️ **À surveiller** : ce changement de défaut fait apparaître une croix sur toutes les instances `Dialog/Basic` des fichiers produit qui n'avaient pas surchargé la prop. C'est voulu, mais ça mérite une relecture des écrans où une réponse est obligatoire, qui doivent repasser `Show close button` à `false`.

## Décision : deux composants, pas un seul avec un variant `Type`

Décision du 30/07/2026 : **on garde deux composants séparés.**

- Figma n'a pas de propriétés conditionnelles par variant : toutes les props d'un set s'affichent sur tous les variants. Fusionner réintroduirait des propriétés inertes.
- La distinction est sémantique, pas dimensionnelle : scroll, fermeture au scrim, empilement, forme du titre diffèrent.
- Fusionner deux sets publiés est cassant : toutes les instances des fichiers produit seraient à relier à la main.

## Ce qui a été corrigé lors de la refonte

- Sets renommés : `Dialog/BasicDialog` → `Dialog/Basic`, `Dialog` → `Dialog/FullScreen`
- Axes de variants morts supprimés (`Slot Active ? = Yes`, `New Slot active = on`)
- Propriétés renommées sans casser les overrides (IDs `#xxx` préservés par `editComponentProperty`)
- `Show scrollbar` était une propriété **morte** sur FullScreen : recâblée sur la visibilité du Scrollbar
- `Description`, `Show close button`, `Action 1`, `Action 2` ajoutées sur FullScreen
- **`Show footer` ajoutée sur les deux** pour supporter les dialogs sans actions
- **`Notification` / `Show notification` renommés `Content` / `Show content`** sur Basic : slot générique, même nom sur les deux composants
- **Valeurs par défaut passées en français**, et `Show close button` passé à `true` sur Basic
- Calques par défaut renommés, noms à espace en fin supprimés
- Descriptions réécrites en français + `documentationLinks` vers la page

## Documentation

5 frames, section `📖 Dialogs · Documentation` : **Usage**, **Anatomie et propriétés**, **Comportement**, **Wording**, **Exemples**.
Anatomie et Exemples utilisent des instances vivantes des composants.
L'ancienne doc Material en anglais est dans la section `🗄️ Archive`, à supprimer une fois la nouvelle validée.

## Règles de wording retenues

- Le titre dit ce qui va se passer, la description pourquoi ça compte, les boutons ce qu'on fait. Pas de redite.
- **Titre : un nom de tâche par défaut**. La forme interrogative est réservée aux confirmations destructives. Pas de point final, 2 lignes max, pas d'« Attention ! ».
- Description : 1 à 3 lignes, nomme l'objet concerné plutôt que « cet élément ».
- Actions : 1 à 3 mots, pas de point final. Interdits : OK, Oui/Non, Terminé, Soumettre.
- « Fermer » toléré quand le bouton n'a aucun effet, ou sur une dialog sans Footer.
- Textes traduits : jamais de phrase construite par concaténation.

## Bugs produit repérés (à remonter)

- Écran « Add a boat » : titre non traduit, « innexistant » (deux N), « Concession de reception » (accent manquant), pas de croix.
- Écran « Réglage d'une alerte » : pas de croix alors que le choix n'est pas obligatoire.

## Point à trancher

L'instance de l'exemple 5 est affichée à **448 de large** alors que le variant Desktop de `Dialog/FullScreen` est spécifié à **640**. Soit la spec passe à 448, soit l'exemple doit être remis à 640.

La démonstration

Le même composant, en code

Les propriétés Figma se traduisent une à une en , parce qu'elles ont été pensées pour ça dès le départ. C'est là qu'on vérifie que le système tient : s'il faut renommer ou réinventer des propriétés au moment du code, c'est que le composant Figma était mal découpé.

La modale ci-dessous est le vrai composant, avec ses vrais tokens. Elle reste en identité Seanapps même si vous passez le site en .

Modifier l'adresse email

L'invitation sera envoyée à adeline.durand@dealer.fr. Elle expire dans 7 jours.

Dialog/Basic · Desktop · 448 px · boutons M

Dialog.tsx
<Dialog.Basic
  device="desktop"
  title="Modifier l'adresse email"
  description="L'invitation sera envoyée à adeline.durand@dealer.fr. Elle expire dans 7 jours."
  showCloseButton
  showContent
  showFooter
  action1={{ label: "Continuer", variant: "primary" }}
  action2={{ label: "Annuler" }}
>
  <TextField label="Nouvelle adresse" />
  <TextField label="Confirmer l'adresse" />
</Dialog.Basic>

Ce que je retiens

Le nommage est le vrai travail

Une propriété bien nommée s'utilise sans lire la doc. Le reste du temps passé à documenter compense un nommage raté.

Documenter le « quand ne pas l'utiliser »

C'est ce que les gens cherchent réellement. Le « comment » se devine, le « quand » se décide.

Le wording est un composant

Une modale parfaite avec un bouton « OK » reste un mauvais écran. Le texte n'est pas une couche par-dessus, il fait partie du design.

Verrouiller rend modifiable

Ce n'est pas de la rigidité. C'est ce qui me permet de faire évoluer un composant sans casser les écrans qui l'utilisent.

Un design system à construire ou à remettre d'aplomb ?

Vous venez de voir un composant sur des dizaines, traité en entier. C'est le niveau d'exigence que j'applique au reste. Que ce soit pour poser les fondations ou pour rationaliser une library qui a dérivé, on peut en parler.

Mes autres projets

Ouvert aux missions freelance immédiatement et au CDI à partir de septembre 2026.