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