Ajoute la création d'événement via n8n et refond la DA en cartes papier

- Nouvelle Edge Function create-event + RPC public.create_event : génère
  slug/admin_token/expire_at et insère l'event, réservée à service_role,
  appelée par le workflow n8n "Créer un événement" (Form Trigger, publié).
- Passe DA "polaroid poussé à fond" : les cartes d'état (chargement/erreur/
  succès), la modale de bienvenue et le formulaire passent en papier clair
  avec ruban washi tape et léger tilt, plutôt qu'en carte sombre sur fond
  sombre (ombre invisible dans l'ancienne version). Admin resté sobre/sombre
  mais cartes plus lisibles (liseré coloré, contraste renforcé).
- Générateur QR et carton imprimable : lisent maintenant ?slug= et
  ?baseUrl= pour se pré-remplir depuis le lien renvoyé par create-event.
- Correctifs : icône manquante sur "Télécharger" (admin), bug [hidden]
  anticipé sur l'état vide de la galerie invité.
This commit is contained in:
2026-09-18 12:16:25 +02:00
parent d0131331a6
commit 8568b48461
11 changed files with 1038 additions and 92 deletions
+125
View File
@@ -5,6 +5,131 @@ la date à laquelle elles ont été prises. Toute nouvelle décision structurant
(schéma DB, auth, hébergement, etc.) doit être ajoutée ici après validation
par Kévin.
## 2026-09-18 (six)
- **Limitation connue (pas un bug à corriger)** : sur /e/OS + navigateur
DuckDuckGo, le bouton "Prendre une photo" (`capture="environment"`)
ouvre la galerie au lieu de l'appareil photo, et l'inverse pour "Depuis
la galerie". Vérifié : le HTML/JS est conforme à la spec (wiring
correct), c'est DuckDuckGo Android qui n'honore pas fiablement
l'attribut `capture`. Décision : ne rien coder de spécifique pour ce
navigateur (combo /e/OS + DuckDuckGo trop marginal côté invités réels,
qui arrivent très majoritairement via Safari/Chrome par défaut) — à
revérifier par Kévin sur iPhone/Android dès qu'il en a sous la main.
- **Événement de test créé en conditions réelles** via le workflow n8n +
`create-event` (slug `test-da-verification-kevin`) : premier passage
bout-en-bout du pipeline complet (n8n → Edge Function → Telegram),
fonctionnel. Confirme aussi que le déploiement de la passe DA
"polaroid poussé à fond" (voir entrée précédente) rend bien en
conditions réelles sur le domaine de prod, pas seulement en local —
modale de bienvenue et état vide de la galerie vérifiés par capture
d'écran sur `https://photobooth.assistantaikev.eu`.
- **Déployé sur le VPS** (scp direct des 7 fichiers modifiés vers
`/home/kevin/photobooth-qr/site/`, pas de rebuild nécessaire — site
statique servi par nginx).
## 2026-09-18 (cinq)
- **2e itération de la 4e passe DA, plus radicale** : retour Kévin sur la
version "rim light + grain" ("franchement c'est nul", captures à l'appui
après avoir vérifié moi-même dans Chrome) — l'effet était bien trop
subtil, l'app restait un grand vide noir avec une petite carte sombre
illisible. Changement structurel plutôt qu'un réglage plus fort du même
hack : les cartes "props" côté invité (bloc de chargement/erreur/succès,
modale de bienvenue, formulaire prénom+message) passent en **papier
clair** (`#FAF6F0`, encre `#12100E`) posé sur la table sombre, avec un
ruban "washi tape" en haut de carte et une légère inclinaison
(-2.2°/+1.8° selon l'état) — comme un vrai polaroid, plutôt qu'un panneau
UI sombre. Une carte claire sur fond quasi noir projette une vraie ombre
(`--shadow-paper`), contrairement à une carte sombre sur fond sombre :
ça résout le problème à la racine plutôt qu'en le maquillant.
- Bug technique corrigé au passage : l'inclinaison ne s'affichait pas du
tout au premier essai — une `animation` qui touche `transform`
(`fade-rise`) remplace toute la propriété, elle ne fusionne pas avec un
`rotate()` posé à côté en statique. Fix : rotation intégrée dans les
keyframes (`state-card-in`), avec repli statique sous
`prefers-reduced-motion: reduce`.
- **Écran admin** (galerie + générateur QR) : reste sombre/sobre, sans
tilt ni tape (exception du skill DA conservée), mais `--color-card`
légèrement éclairci (`#1E1B18``#241F1A`) et liseré coloré plein en
haut de carte (plus un fond teinté translucide) pour rester repérable —
même diagnostic que côté invité (contraste carte/fond trop faible pour
se voir), remède différent (sobre, pas de papier). Le générateur QR
(`src/admin/qrcode/`) n'avait quasiment aucune mise en forme avant cette
passe (champs nus sur le fond, aucun regroupement visuel, police
"General Sans" référencée mais jamais chargée dans ce fichier) : plus
gros écart identifié lors de l'audit, corrigé (carte de formulaire,
police chargée, contraste champs/carte).
- **Vérifié visuellement cette fois** : captures d'écran via Chrome headless
local (`google-chrome --headless=new --screenshot=...`) sur les 5 écrans
+ la modale de bienvenue forcée visible temporairement pour vérification
— pas juste une relecture de CSS. Contrastes WCAG AA recalculés pour les
nouvelles combinaisons papier (encre/muted sur `#FAF6F0`) : ≥5:1 sur tous
les textes ajoutés.
- Pas testé avec un vrai événement (formulaire rempli, grille de photos
garnie, écran de succès) faute de slug valide en local — seuls les états
vides/erreur ont pu être vérifiés en conditions réelles de rendu.
## 2026-09-18 (quater)
- **4e passe DA "Polaroid Néon"** : suite au retour "ça fait vraiment
low-cost, il faut me rendre cette application sexy", audit écran par
écran (upload, galerie invité, admin galerie, générateur QR, carton
imprimable). Diagnostic : ce n'était pas la direction elle-même
(conservée intégralement, aucune valeur de palette changée) mais des
défauts d'exécution — ombres noires invisibles sur fond quasi noir
(`#12100E`), fond en aplat sans texture, pastille de marque non
généralisée à tous les écrans, icône manquante sur le lien "Télécharger"
admin. Corrigé via : liseré clair ("rim light") sur les cartes/boutons,
grain de fond en SVG data URI inline (~350 octets, 0 requête réseau),
pastille corail derrière le logo sur tous les écrans, icône ajoutée au
lien de téléchargement admin. Bug `[hidden]` masqué par un `display`
auteur (déjà rencontré 3 fois sur ce projet) anticipé et corrigé au
passage sur `#empty-state` (galerie invité, passé en `display: flex`).
Contrastes WCAG AA revérifiés, aucun n'a changé (aucune couleur de texte/
fond modifiée). Non vérifié visuellement dans un navigateur avant cette
entrée (pas d'accès Chrome dans l'environnement) — à prévisualiser en
local avant déploiement.
## 2026-09-18 (ter)
- **`create-event` déployée en prod** sur `kevin-lecou-hub` (migration
`20260918100000_create_event_rpc.sql` + Edge Function
`supabase/functions/create-event/`). Vérifié après coup : grants limités à
`service_role` (n'apparaît pas dans les fonctions `SECURITY DEFINER`
exécutables par `anon`/`authenticated`, contrairement à
`get_public_event`/`insert_public_photo` qui le sont intentionnellement).
Un `search_path` manquant sur la fonction interne
`photobooth.generate_unique_slug` (signalé par le linter sécurité Supabase
juste après déploiement) a été corrigé dans la foulée
(`20260918101500_harden_generate_unique_slug_search_path.sql`).
- Le workflow n8n `photobooth-qr — Créer un événement` reste **inactif** :
à activer par Kévin une fois le DNS `git.assistantaikev.eu` et un premier
test réel du formulaire validés.
## 2026-09-18 (bis)
- **Création d'événement** : via un **formulaire n8n** (Form Trigger),
plutôt qu'un formulaire dans l'appli photobooth-qr ou du SQL manuel. Le
workflow insère l'event en base (génère `slug` + `admin_token`) et
renvoie les liens invité/admin à Kévin. Choisi pour rester cohérent avec
la stack n8n déjà en place et éviter d'ajouter une nouvelle couche
d'authentification "admin produit" dans l'appli (aujourd'hui il n'existe
que des tokens par événement, pas de compte admin global).
- **Pas de personnalisation visuelle par événement** : la DA "Polaroid
Néon" reste identique pour tous les événements ; seules les infos
textuelles varient par event (nom, date, limite de photos). Pas de
marque blanche (palette/logo par client) en V1 — jugé de la
sur-ingénierie pour un besoin V2/V3 pas encore confirmé par un client
réel.
- **Remote Git : Gitea auto-hébergé sur le VPS existant** (plutôt que
GitHub). Cohérent avec la préférence d'autonomie de Kévin — tout reste
chez lui, pas de dépendance à un service tiers pour le code source. Le
VPS héberge déjà n8n (Traefik/SSL en place) ; Gitea tournera comme
service Docker supplémentaire derrière le même reverse proxy. Détails
d'implémentation (sous-domaine, ressources, sauvegarde) à définir avant
déploiement.
## 2026-09-18
- **Galerie invité (revirement)** : les invités peuvent désormais voir