Écran de connexion : bouton afficher / masquer le mot de passe #134
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Origine : ticket #3, puce 7 — « Sur l'onglet de connexion, pouvoir afficher/masquer le mot de passe ».
LoginPagea un<input id="password" type="password">nu, sans bascule de visibilité (LoginPage.tsx:80-88).SignupPagea le même champ (SignupPage.tsx:100-108). Les deux pages partagentfeatures/auth/auth-form.scss.Comportement souhaité
Un bouton « œil » dans le champ mot de passe qui bascule
typeentre"password"et"text", sur l'écran de connexion (et, tant qu'on y est, l'inscription — même champ, même bénéfice).Conception proposée
Un petit composant réutilisable
apps/web/src/components/ui/PasswordInput.tsx(le dossiercomponents/ui/accueille déjàCheckbox/Radio/Tooltip/Dialog/BottomSheet) :<input>dont letypevient d'unuseStatelocal ("password"/"text"), +<button type="button">icône œil / œil-barré positionné en absolu dans le champ.lucide-reactdu reste de l'app (Eye/EyeOff), ou 2 SVG inline stroke 24×24 (même approche que les icônes locales deTechStepCorrectionPopover).aria-labeltraduit (« Afficher le mot de passe » / « Masquer le mot de passe »),aria-pressed.type="button"pour ne pas soumettre le formulaire.id,value,onChange,autoComplete(current-passwordpour login,new-passwordpour signup).Puis remplacer le
<input type="password">deLoginPage(etSignupPage) par<PasswordInput ...>.SCSS : dans
auth-form.scss, un wrapperposition: relativeautour du champ + le bouton enposition: absolute; right: …. Prévoir lepadding-rightde l'input pour ne pas passer sous l'icône.Découpage proposé
Une PR. Très petit.
Tests (obligatoires, cf.
specs/dev-conventions.md)cypress/component/PasswordInput.cy.tsx(composant autonome decomponents/ui/*) : au montagetype="password"; clic sur l'œil ⇒type="text"et texte lisible ; reclic ⇒ masqué ;aria-label/aria-pressedcorrects ; le clic ne soumet pas un<form>parent.login(layout.cy.tsou spec auth) : l'œil est présent et fonctionne sur/login.Documentation à mettre à jour
specs/frontend-architecture.mdsi la liste des composantscomponents/ui/*y est tenue.Points restant à trancher en revue
lucide-react(Eye/EyeOff) — déjà dépendance directe deapps/web(utilisé par la nav) — ou SVG inline.🤖 Filed by Claude Code