Files
photobooth-qr/src/admin/gallery/index.html
T
KevinLecou ea3e49cc04 Étend la DA "Polaroid Néon" aux 4 derniers écrans
Upload invité (priorité haute, full traitement : fond #12100E, CTA
corail, General Sans/Inter, touche Caveat sur le message de succès),
galerie admin (exception admin du skill : sobre, sombre, cartes #1E1B18,
pas de rotation/confettis, corail réservé aux CTA), générateur QR (même
exception admin, traitement minimal), carton imprimable (reste clair —
un support papier n'a pas vocation à avoir un fond noir — mais adopte les
polices et l'accent corail de la nouvelle DA, contraste recalculé pour
l'impression).

Double thème clair/sombre de l'ancienne DA retiré au profit d'un thème
unique sombre, cohérent avec src/galerie/ (premier écran de cette DA,
déjà validé). Dégradés de texte et halo de fond de l'ancienne DA retirés
(skill : jamais de glow/neon artificiel).

Contrastes vérifiés par calcul WCAG AA pour toutes les nouvelles
combinaisons. Chemins d'assets absolus et pattern [hidden]/display
vérifiés sur les 4 écrans (bugs déjà rencontrés deux fois en prod).
2026-09-18 09:21:40 +02:00

88 lines
3.9 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Galerie événement — admin</title>
<!--
Cette page est servie pour toute URL du type /admin/<slug> (le slug est lu
côté client depuis window.location.pathname, le token depuis les query
params ?token=..., voir gallery.js). Comme pour /e/<slug> (voir
src/e/index.html), ça suppose une règle de réécriture côté serveur qui
renvoie ce fichier pour toute requête sous /admin/* — hors scope de ce
fichier front, à mettre en place lors du déploiement.
-->
<meta name="robots" content="noindex, nofollow">
<!-- Thème unique sombre "Polaroid Néon", exception admin (sobre/data-first,
voir src/admin/gallery/style.css). -->
<meta name="theme-color" content="#12100E">
<link rel="preload" href="/vendor/fonts/generalsans-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/admin/gallery/style.css">
</head>
<body>
<main class="page">
<header class="page__header">
<p class="brand" aria-hidden="true">
<svg class="brand__mark" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" focusable="false">
<path d="M4 8h3l1.5-2h7L17 8h3a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1Z"/>
<circle cx="12" cy="13" r="3.5"/>
</svg>
<span class="brand__name">photobooth</span>
</p>
<h1 id="event-name">Galerie événement</h1>
<p id="event-meta" class="event-meta" hidden></p>
</header>
<section id="status-loading" class="state-block" role="status">
<span class="spinner" aria-hidden="true"></span>
<p>Chargement de la galerie…</p>
</section>
<section id="status-error" class="state-block state-block--error" hidden role="alert">
<p id="status-error-message"></p>
<!-- class="btn btn--secondary" ajoutée passe 3 : ce bouton n'avait
jusqu'ici aucune classe et retombait donc sur le style navigateur
par défaut (papercut visuel repéré pendant la passe DA, corrigé
ici — rendu uniquement, aucune logique touchée). -->
<button type="button" id="retry-btn" class="btn btn--secondary" hidden>Réessayer</button>
</section>
<section id="gallery-content" hidden>
<p id="status-banner" class="status-banner" hidden></p>
<div class="toolbar">
<button type="button" id="refresh-btn" class="btn btn--secondary">
<svg class="btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
<path d="M20 11A8 8 0 1 0 18.5 16"/>
<path d="M20 5v6h-6"/>
</svg>
<span>Actualiser</span>
</button>
<button type="button" id="download-zip-btn" class="btn">
<svg class="btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
<path d="M12 4v11"/>
<path d="M7 10.5 12 15.5 17 10.5"/>
<path d="M5 19.5h14"/>
</svg>
<span>Télécharger tout (ZIP)</span>
</button>
</div>
<p id="zip-status" class="zip-status" aria-live="polite" hidden></p>
<p id="empty-state" class="state-block" hidden></p>
<ul id="photo-grid" class="photo-grid"></ul>
</section>
</main>
<!--
config.js n'est PAS commité (voir .gitignore) : copier config.example.js
en config.js et renseigner les vraies valeurs avant déploiement. Chargé en
script classique (donc synchrone, avant le module) pour garantir que
window.__PHOTOBOOTH_CONFIG__ existe avant l'exécution de gallery.js.
-->
<script src="/admin/gallery/config.js"></script>
<script type="module" src="/admin/gallery/gallery.js"></script>
</body>
</html>