diff --git a/docs/superpowers/specs/2026-06-03-required-asterisk-email-sanitization-design.md b/docs/superpowers/specs/2026-06-03-required-asterisk-email-sanitization-design.md new file mode 100644 index 0000000..6bcd0c7 --- /dev/null +++ b/docs/superpowers/specs/2026-06-03-required-asterisk-email-sanitization-design.md @@ -0,0 +1,145 @@ +# Design — État « obligatoire » cohérent + normalisation email + +- **Date** : 2026-06-03 +- **Ticket Malio UI** : MUI-41 (branche `feature/MUI-41-props-required-asterisque-dans-le-label-sur-les-co`) +- **Ticket Starseed lié** : ERP-101 (MAJ Malio UI + branchement `required` + stratégie de validation), découvert pendant ERP-63 (écran « Ajouter un client ») + +## Contexte & problème + +Pendant ERP-63, deux manques ont bloqué la mise en place de champs obligatoires : + +1. Certains composants de formulaire n'exposent pas de prop `required` (`MalioSelect`, `MalioSelectCheckbox`), et **aucun composant n'affiche d'indicateur visuel** de champ obligatoire. Résultat : le bouton « Valider » se bloque sans feedback à l'utilisateur — anti-pattern UX. +2. Tentation erronée de « masquer » l'email à la maska. Un email n'a **pas** de structure fixe : pas de masque. Le bon comportement est une **sanitisation** légère à la saisie + validation déléguée à la couche `error`. + +État réel constaté (inventaire) : la **majorité** des composants ont déjà la prop `required` (câblée sur l'attribut HTML natif uniquement, sans astérisque). Seuls **5** ne l'ont pas : `Select`, `SelectCheckbox`, `InputUpload`, `InputRichText`, `SiteSelector`. Aucun composant n'affiche d'astérisque. Il n'existe pas de composant de label partagé : chaque composant rend `{{ label }}` dans son propre `