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).
88 lines
3.9 KiB
HTML
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>
|