feat(auth): bouton afficher / masquer le mot de passe (#134) #141
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/login-password-toggle"
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
Closes #134(puce 7 de #3).LoginPageetSignupPageavaient un<input id="password" type="password">nu, sans moyen de relire ce qu'on a tapé — un mot de passe mal saisi mais invisible est une cause fréquente de connexion ratée.Changements
components/ui/PasswordInput.tsx(nouveau, +password-input.scss) — un<input>de mot de passe avec un bouton œil (lucide-reactEye/EyeOff) qui bascule letypeentre"password"et"text".useStatelocal, toujours masquée au montage, jamais persistée (révéler un mot de passe est une action ponctuelle délibérée, pas une préférence).<button type="button">— ne soumet jamais le formulaire ;aria-labeltraduit (common.passwordInput.show/.hide),aria-pressedporte l'état.id,value,onChange(valeur déjà déballée, commeCheckboxOption),autoComplete.components/ui/(pasfeatures/auth/) : rien dedans n'est spécifique à l'auth. Le style du champ lui-même est hérité du contexte (.auth-card input), commeCheckboxOptions'appuie surglobal.scss; la feuille colocalisée ne fait que positionner le bouton et réserver la place de l'icône.LoginPage/SignupPage—<input type="password">remplacé par<PasswordInput>(autoComplete="current-password"/"new-password").auth-form.scss— la règle.auth-card buttonest resserrée sur.auth-card button[type="submit"]: sinon le bouton œil (type="button", imbriqué) héritait du traitement plein-largeur / primaire du bouton de connexion.i18n —
common.passwordInput.show= « Afficher le mot de passe » /.hide= « Masquer le mot de passe » (namespacecommon, le composant est générique).Docs —
specs/frontend-architecture.md: entréePasswordInputdans la liste des composantscomponents/ui/.Points du ticket tranchés
lucide-reactEye/EyeOff(déjà dépendance directe, cf.nav-icons.tsx).Tests
cypress/component/PasswordInput.cy.tsx(nouveau, composant isolé, 7 cas) : masqué au montage ; clic œil ⇒type="text"+ valeur lisible ; reclic ⇒ re-masqué ;aria-label/aria-pressedcorrects ; le clic ne soumet pas un<form>parent ; contrôlé (valeur +onChange) ; re-masqué sur un nouveau montage.cypress/e2e/auth-form.cy.ts(nouveau, mode layout) : l'œil est présent et bascule#passwordsur/loginet/signup; le clic ne déclenche pasPOST /auth/login.Vérification locale
pnpm lint✓ ·pnpm --filter ./apps/web build✓ · Cypress :PasswordInput.cy.tsx7/7, suite composant complète verte,auth-form.cy.ts3/3, régressionauth.feature6/6. Vérifié visuellement dans le navigateur (positionnement de l'icône, bascule, bouton de connexion intact).🤖 Generated with Claude Code