UI : liste scrollable, alignement auth, zones de dépôt retirées du DOM hors session
All checks were successful
Publier l'image Docker / test (push) Successful in 19s
Publier l'image Docker / publish (push) Successful in 8s

- `#list` plafonné à 55vh avec défilement interne (au lieu d'allonger la page).
- En-tête d'auth : suppression du <span> qui cassait l'alignement ; « Connecté : … »
  et le bouton « Se déconnecter » sont alignés (flex, space-between).
- Les zones de dépôt (`#dropzone` + `#dirRow`, regroupées dans `#dropArea`) sont
  retirées du DOM tant que l'on n'est pas connecté, réinsérées à la connexion.
- Ajout de `[hidden] { display: none !important }` : des règles `display` d'auteur
  (`.btn`, `#queueRow`) neutralisaient l'attribut `hidden` — bouton de déconnexion
  et barre « Tout annuler » restaient visibles hors contexte.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Nicolas 2026-09-10 19:40:49 +02:00
parent 8eb0470474
commit 8d8cfb6fad

View file

@ -31,6 +31,9 @@
* {
box-sizing: border-box;
}
[hidden] {
display: none !important;
}
body {
margin: 0;
padding: 2rem 1rem;
@ -85,8 +88,12 @@
background: transparent;
color: var(--accent);
}
form.inline {
.authrow form {
margin: 0;
display: flex;
}
.authrow .btn {
white-space: nowrap;
}
label {
display: block;
@ -119,13 +126,19 @@
background: color-mix(in srgb, var(--accent) 8%, transparent);
color: var(--text);
}
#dropzone.disabled {
opacity: 0.5;
cursor: not-allowed;
#dropArea {
display: grid;
gap: 1.25rem;
}
#list {
display: grid;
gap: 0.6rem;
max-height: 55vh;
overflow-y: auto;
overscroll-behavior: contain;
}
#list:not(:empty) {
padding-right: 0.25rem;
}
.item {
border: 1px solid var(--border);
@ -210,12 +223,10 @@
<div class="card">
<div class="authrow">
<span id="authState" class="muted">Chargement…</span>
<span>
<a id="loginLink" class="btn" href="/auth/login" hidden>Se connecter</a>
<form id="logoutForm" class="inline" method="post" action="/auth/logout" hidden>
<form id="logoutForm" method="post" action="/auth/logout" hidden>
<button class="btn secondary" type="submit">Se déconnecter</button>
</form>
</span>
</div>
<div id="banner" hidden></div>
</div>
@ -225,7 +236,8 @@
<select id="targetSelect"></select>
</div>
<div id="dropzone" class="card disabled">
<div id="dropArea">
<div id="dropzone" class="card">
<strong>Déposez fichiers ou dossiers ici</strong><br />
<span class="muted">ou cliquez pour parcourir</span>
<input id="picker" type="file" multiple hidden />
@ -236,6 +248,7 @@
<span class="muted"> — ou glissez un dossier dans la zone ci-dessus</span>
<input id="dirPicker" type="file" webkitdirectory multiple hidden />
</div>
</div>
<div id="queueRow" class="card" hidden>
<span id="queueInfo" class="muted"></span>
@ -252,6 +265,7 @@
const logoutForm = document.getElementById('logoutForm');
const targetCard = document.getElementById('targetCard');
const targetSelect = document.getElementById('targetSelect');
const dropArea = document.getElementById('dropArea');
const dropzone = document.getElementById('dropzone');
const picker = document.getElementById('picker');
const dirRow = document.getElementById('dirRow');
@ -272,6 +286,17 @@
let currentTarget = null;
let currentTargetAllowsDirs = false;
// Les zones de dépôt ne sont présentes dans le DOM que si l'on est connecté.
const dropAreaAnchor = queueRow;
dropArea.remove();
function setDropAreaPresent(present) {
if (present) {
if (!dropArea.isConnected) dropAreaAnchor.before(dropArea);
} else if (dropArea.isConnected) {
dropArea.remove();
}
}
function showBanner(message) {
banner.textContent = message;
banner.hidden = false;
@ -286,13 +311,12 @@
authenticated = Boolean(me && me.authenticated);
loginLink.hidden = authenticated;
logoutForm.hidden = !authenticated;
dropzone.classList.toggle('disabled', !authenticated);
setDropAreaPresent(authenticated);
authState.textContent = authenticated ? 'Connecté : ' + me.name : 'Non connecté';
if (authenticated) {
loadTargets();
} else {
targetCard.hidden = true;
dirRow.hidden = true;
}
}