/*
Styles volontairement simples.
Le but de l'exemple n'est pas de créer une interface bancaire réaliste,
mais de rendre le composant assez lisible pour analyser son fonctionnement.
*/
body {
font-family: system-ui, sans-serif;
margin: 2rem;
line-height: 1.5;
}
/*
Largeur limitée pour garder le pavé compact.
Cela rapproche l'exemple d'un petit module de saisie plutôt que d'une page complète.
*/
.pin-component {
max-width: 22rem;
}
.pin-help {
margin-bottom: 1rem;
}
/*
Les pastilles indiquent uniquement la progression.
Elles ne révèlent pas les chiffres saisis.
*/
.pin-display {
display: flex;
gap: 0.5rem;
margin-bottom: 1rem;
}
/*
Pastille vide : aucun chiffre n'est encore saisi à cette position.
*/
.dot {
width: 0.85rem;
height: 0.85rem;
border: 2px solid currentColor;
border-radius: 50%;
}
/*
Pastille remplie : un chiffre a été sélectionné.
Attention : ce masquage est visuel. Il ne protège pas la valeur en mémoire côté client.
*/
.dot.is-filled {
background: currentColor;
}
/*
Affichage du clavier sous forme de grille.
Les chiffres seront injectés par JavaScript dans ce conteneur.
*/
.pin-pad {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.75rem;
margin-bottom: 1rem;
}
/*
Boutons assez grands pour être cliquables facilement.
Une bonne ergonomie réduit les erreurs de saisie, mais ne remplace pas les contrôles serveur.
*/
.pin-pad button,
.pin-actions button {
min-height: 3rem;
font-size: 1.2rem;
cursor: pointer;
}
/*
Les boutons d'action sont placés sur une même ligne.
*/
.pin-actions {
display: flex;
gap: 0.75rem;
margin-bottom: 1rem;
}
/*
Le message final est mis en évidence.
Dans une vraie application, on éviterait de donner trop de détails en cas d'échec.
*/
.pin-result {
font-weight: 700;
}