fix(licence): Register ne clignote plus avant d'etre masque

Les onglets etaient visibles par defaut puis masques a la reponse de
/ping : Register restait affiche quelques millisecondes. Ils naissent
maintenant invisibles (visibility, place reservee) et ne sont reveles
qu'une fois la reponse connue — licence valide, ils apparaissent sans
rien decaler ; licence refusee, Register n'est jamais montre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-17 06:08:37 +01:00
parent 510b75d5bf
commit d8f4f19041
3 changed files with 18 additions and 7 deletions
+5
View File
@@ -293,6 +293,11 @@ input[type="range"]::-webkit-slider-thumb {
color: var(--text);
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
/* Invisibles MAIS presents tant que la 2e couche de licence n'a pas repondu
(applyRegisterVisibility) : visibles par defaut, ils laissaient voir Register
quelques millisecondes avant d'etre masques. visibility et non display : la
place reste reservee, donc rien ne saute quand ils apparaissent. */
.auth-tabs.is-pending { visibility: hidden; }
.auth-form { display: flex; flex-direction: column; }
.auth-form .btn-block { margin-top: 8px; }
+1 -1
View File
@@ -121,7 +121,7 @@
<p>Your passwords, encrypted locally.</p>
</div>
<div class="auth-tabs">
<div class="auth-tabs is-pending">
<button class="auth-tab is-active" data-tab="login">Login</button>
<button class="auth-tab" data-tab="register">Register</button>
</div>
+12 -6
View File
@@ -7037,14 +7037,20 @@ async function ensureLicence() {
// Pas d'await chez l'appelant : l'ecran d'authentification ne doit pas
// attendre ce test pour s'afficher.
async function applyRegisterVisibility() {
if (!Bridge.active) return;
let refused = false;
try { await api('/ping'); }
// Le 404 JSON exact de la 2e couche, pas n'importe quel 404 : le verrou du
// jeton repond aussi 404, mais sans corps JSON.
catch (e) { refused = (e.status === 404 && e.body && e.body.error === 'Not found'); }
if (Bridge.active) {
try { await api('/ping'); }
// Le 404 JSON exact de la 2e couche, pas n'importe quel 404 : le verrou
// du jeton repond aussi 404, mais sans corps JSON.
catch (e) { refused = (e.status === 404 && e.body && e.body.error === 'Not found'); }
}
const tabs = document.querySelector('.auth-tabs');
if (tabs) tabs.classList.toggle('is-hidden', refused);
// Les onglets naissent invisibles (is-pending) : on ne les revele qu'une
// fois la reponse connue, sinon Register clignote avant d'etre masque.
if (tabs) {
tabs.classList.toggle('is-hidden', refused);
tabs.classList.remove('is-pending');
}
if (refused) {
$$('.auth-tab').forEach(x => x.classList.toggle('is-active', x.dataset.tab === 'login'));
$('#loginForm').classList.remove('is-hidden');