fix(android): les refus se voient, et la croix se recale sur le champ

Un refus s'affichait du meme gris qu'un etat : "Master password: 8
characters at least" se lisait comme "Vault on this device", et rien ne
disait que l'application venait de refuser. StatusErr le met en rouge -
deux procedures plutot qu'un drapeau devine du texte, parce que trier des
messages sur leur contenu a deja detruit un cache dans ce projet. C'est
l'appelant qui sait s'il refuse.

La croix des champs etait calee a top: 8px, en compensation du margin-top
du champ. Les piles annulent ce margin depuis qu'on y a unifie
l'espacement, et la croix restait donc 8 px trop bas. Elle s'ancre
desormais au bord INFERIEUR, le seul que le champ touche dans les deux
cas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-28 16:25:07 +01:00
parent 494efddb44
commit 203f45eb7c
2 changed files with 41 additions and 18 deletions
+15 -3
View File
@@ -270,6 +270,10 @@
/* --- deverrouillage ----------------------------------------------------- */
.status { color: var(--muted); margin: 22px 4px 14px; min-height: 20px; }
/* UN REFUS N'EST PAS UN ETAT. "Master password: 8 characters at least" se
lisait du meme gris que "Vault on this device" - on ne voyait pas que
l'application venait de refuser quelque chose. */
.status.err { color: #ff9d9d; }
.stack { display: flex; flex-direction: column; gap: 8px; }
/* L'espace de 8 px vit A L'INTERIEUR de chaque pile. Deux piles voisines se
touchaient donc, et "Create vault" collait a "Download vault" alors que
@@ -304,8 +308,12 @@
.in-wrap { position: relative; }
/* Le champ laisse la place a la croix, sinon le texte passe dessous. */
.in-wrap .field-in { padding-right: 44px; }
/* ANCREE EN BAS, PAS EN HAUT. Le champ porte un margin-top de 8 px, que les
piles annulent : caler la croix a `top: 8px` la laissait donc 8 px trop bas
des que le margin disparaissait. Le bord INFERIEUR, lui, est celui que le
champ touche dans les deux cas - le margin est au-dessus. */
.in-x {
position: absolute; right: 0; top: 8px; width: 44px; height: 46px;
position: absolute; right: 0; bottom: 0; width: 44px; height: 46px;
display: flex; align-items: center; justify-content: center;
color: var(--muted); font-size: 22px;
}
@@ -1601,8 +1609,12 @@ var PM = {
document.body.classList.remove('on-list', 'on-detail', 'searching');
view = 'unlock';
},
setStatus: function (text) {
document.getElementById('status').textContent = text;
setStatus: function (text, err) {
var s = document.getElementById('status');
s.textContent = text;
// classList.toggle avec un second argument : la classe suit le drapeau,
// sans qu'un message neutre ait a penser a l'enlever.
s.classList.toggle('err', !!err);
},
/// Etat des deux actions : ouvrir n'a de sens qu'avec un coffre local
/// lisible, et synchroniser s'appelle autrement quand il n'y en a pas.