Modale : voile de chargement opaque sous l'en-tete

This commit is contained in:
nathaninline committed 2026-08-05 21:50:23 +02:00
1 parent d1ffc97dc3
commit 76d0d16062
3 files changed
+24 -10

No files matched your search

+12 -5
View File
@@ -816,10 +816,12 @@ textarea.sctl{min-height:76px;resize:vertical;line-height:1.5}
/* Modale ouverte mais pas encore remplie : on affiche le voile de chargement À LA
PLACE du formulaire et du pied. Estomper le formulaire ne suffisait pas — on
voyait quand même les champs s'écrire un par un derrière le voile. */
/* Fond TRANSPARENT : le formulaire est déjà rendu invisible par `visibility`,
un fond opaque ne servirait qu'à masquer aussi le titre de la modale. */
.modal-load{display:none;position:absolute;inset:0;z-index:2;align-items:center;justify-content:center;
pointer-events:none}
/* Voile OPAQUE, posé sous l'en-tête (le titre reste lisible) : `visibility:hidden`
sur le formulaire suffirait en théorie, mais un fond plein garantit qu'aucun
reste du preset précédent (moteur coché, réglages) ne puisse apparaître une
fraction de seconde. --mh = hauteur mesurée de l'en-tête, posée à l'ouverture. */
.modal-load{display:none;position:absolute;inset:var(--mh,52px) 0 0 0;z-index:2;
align-items:center;justify-content:center;background:var(--bg);border-radius:0 0 12px 12px}
.modal-ov.loading .modal-load{display:flex}
/* visibility (et non display) : le formulaire garde sa place, donc la carte a
déjà sa taille finale — la révéler ne provoque plus d'à-coup de hauteur. */
@@ -2480,8 +2482,13 @@ async function openItem(kind, key){
rawToggle.style.display = 'none';
rawBody.style.display = '';
}
document.getElementById('modal').classList.add('loading');
const modalEl=document.getElementById('modal');
modalEl.classList.add('loading');
showModal('modal');
// Le voile s'arrête au bas de l'en-tête : on lui passe sa hauteur réelle. ⚠️ À
// mesurer APRÈS l'affichage — un élément en display:none mesure 0.
const mHead=modalEl.querySelector('.modal-head');
if(mHead) modalEl.querySelector('.modal-card').style.setProperty('--mh', mHead.offsetHeight+'px');
// ⚠️ APRÈS showModal, jamais avant : le corps de la modale est un conteneur
// défilant RÉUTILISÉ d'une ouverture à l'autre, et écrire scrollTop sur un
// élément en display:none ne fait RIEN (il n'a pas de boîte de rendu) — le
+6 -1
View File
@@ -102,8 +102,13 @@ async function openItem(kind, key){
rawToggle.style.display = 'none';
rawBody.style.display = '';
}
document.getElementById('modal').classList.add('loading');
const modalEl=document.getElementById('modal');
modalEl.classList.add('loading');
showModal('modal');
// Le voile s'arrête au bas de l'en-tête : on lui passe sa hauteur réelle. ⚠️ À
// mesurer APRÈS l'affichage — un élément en display:none mesure 0.
const mHead=modalEl.querySelector('.modal-head');
if(mHead) modalEl.querySelector('.modal-card').style.setProperty('--mh', mHead.offsetHeight+'px');
// ⚠️ APRÈS showModal, jamais avant : le corps de la modale est un conteneur
// défilant RÉUTILISÉ d'une ouverture à l'autre, et écrire scrollTop sur un
// élément en display:none ne fait RIEN (il n'a pas de boîte de rendu) — le
+6 -4
View File
@@ -790,10 +790,12 @@ textarea.sctl{min-height:76px;resize:vertical;line-height:1.5}
/* Modale ouverte mais pas encore remplie : on affiche le voile de chargement À LA
PLACE du formulaire et du pied. Estomper le formulaire ne suffisait pas — on
voyait quand même les champs s'écrire un par un derrière le voile. */
/* Fond TRANSPARENT : le formulaire est déjà rendu invisible par `visibility`,
un fond opaque ne servirait qu'à masquer aussi le titre de la modale. */
.modal-load{display:none;position:absolute;inset:0;z-index:2;align-items:center;justify-content:center;
pointer-events:none}
/* Voile OPAQUE, posé sous l'en-tête (le titre reste lisible) : `visibility:hidden`
sur le formulaire suffirait en théorie, mais un fond plein garantit qu'aucun
reste du preset précédent (moteur coché, réglages) ne puisse apparaître une
fraction de seconde. --mh = hauteur mesurée de l'en-tête, posée à l'ouverture. */
.modal-load{display:none;position:absolute;inset:var(--mh,52px) 0 0 0;z-index:2;
align-items:center;justify-content:center;background:var(--bg);border-radius:0 0 12px 12px}
.modal-ov.loading .modal-load{display:flex}
/* visibility (et non display) : le formulaire garde sa place, donc la carte a
déjà sa taille finale — la révéler ne provoque plus d'à-coup de hauteur. */