# TODO — points en suspens et écarts assumés

Journal des décisions prises en autonomie et des points qui demandent une
action de Maxime ou de Maud.

---

## Règle appliquée depuis la réception des maquettes

Les maquettes `design-reference/front/*.dc.html` et
`design-reference/back/export-backoffice/Back-office.dc.html` **font foi** pour
tout ce qui touche à la structure, aux couleurs, aux espacements et aux
animations. Aucune initiative de design n'est prise. Quand le cahier des
charges et une maquette divergent, c'est la maquette qui l'emporte, et
l'écart est consigné ci-dessous.

Seule transformation de forme autorisée : les maquettes expriment les survols
par un attribut propriétaire `style-hover="…"` que les navigateurs ignorent.
Il est transcrit en règles `:hover` réelles (classes `.mgh-*` dans
`assets/styles/app.css`), valeur pour valeur.

---

## Écarts maquette ↔ cahier des charges

### MG-055 / MG-061 — pas de formulaire sur la page Ateliers

MG-055 demande « un formulaire de demande » sous chaque bloc atelier, et
MG-061 un `DemandeAtelierType`. **La maquette 5 n'affiche aucun formulaire** :
chaque bloc se termine par un lien « Demander des informations » pointant vers
la page Contact. La maquette a été suivie.

Conséquence : `DemandeAtelier` (entité, service, formulaire, vue back-office
MG-085) reste en place et fonctionnel, mais **aucune page publique ne l'expose
aujourd'hui**. À arbitrer : soit la fonctionnalité est abandonnée et le code
retiré, soit une maquette de formulaire atelier est fournie.

### MG-023 — widget hCaptcha absent de la maquette Contact

La maquette 7 ne montre pas de vérification anti-robot. MG-023 l'impose.
Le widget est rendu **uniquement si une clé publique est configurée**, juste
avant le bouton d'envoi. Sans lui, le formulaire partirait en ligne sans
aucune protection anti-spam, ce qui rendrait MG-023 non satisfait.

### Atelier — deux champs ajoutés pour l'encadré « Format »

L'encadré Format de la maquette 5 affiche des fourchettes
(« 6 à 10 participants », « adultes à partir de 18 ans ») que `nb_places`,
entier imposé par MG-011, ne peut pas restituer. Deux champs texte nullables
ont été ajoutés : `places_texte` et `public_texte`. `nb_places` est conservé
comme donnée de gestion pour le back-office.

### FAQ de l'accueil

La maquette d'accueil affiche 6 questions dont le texte diffère des 14 de la
page FAQ. Arbitrage retenu : l'accueil affiche **les 6 premières entrées de la
base**, dans le markup exact de la maquette. Le design est conforme, les
libellés restent éditables par Maud (MG-083).

### Corrections de contraste — appliquées

Écarts **volontaires et validés** par rapport aux maquettes. Partout où du
texte blanc repose sur une couleur d'accent, la teinte est assombrie jusqu'au
seuil WCAG AA de 4,5:1 :

| Couleur | Maquette | Retenue | Emplacements |
|---|---|---|---|
| Terracotta | `#C88772` 2,93:1 | `#A85E44` 4,83:1 | 12 |
| Terracotta survol | `#bd7761` 3,81:1 | `#96523B` 5,89:1 | — |
| Bleu | `#7895A5` 3,16:1 | `#5C7A8B` 4,55:1 | 14 |
| Bleu survol | `#688798` 3,81:1 | `#4B6675` 6,08:1 | — |

⚠️ `#5E7C8D`, initialement documenté pour le bleu, ne donne que **4,43:1** et
ne franchit pas le seuil. Erreur de calcul corrigée : `tools/contraste.php`
fait foi désormais, calibré sur la valeur WCAG de référence `#767676` (4,54:1).

Les teintes d'origine restent inchangées partout ailleurs : filets,
pictogrammes, glyphes Ψ, les deux moitiés du rideau du menu, numéros d'étapes,
textes terracotta ou bleus sur fond clair.

Contrôle : `bash design-reference/check-contraste.sh` → doit afficher `TOTAL 0`.
Détail et contrastes encore ouverts : `AUDIT_ACCESSIBILITE.md`.

### Navigation dupliquée — corrigée

`{% block nav_desktop %}` et `{% block nav_burger %}` étaient déclarés au
niveau racine de `base.html.twig`. Twig rend un bloc **à l'endroit de sa
déclaration** en plus de l'endroit où `{{ block(...) }}` l'appelle : la
navigation et le bouton burger étaient donc émis deux fois sur chaque page.

Corrigé en les extrayant dans `templates/components/nav_desktop.html.twig` et
`nav_burger.html.twig`, inclus depuis le header. Le même défaut affectait le
bloc `rubrique` de `base_admin.html.twig`, désormais capturé par
`{% set %}…{% endset %}`.

Contrôle : `bash design-reference/check-nav.sh`.

### Messages flash et bannière cookies

Absents des maquettes, imposés par MG-062 et MG-090. Leur style n'utilise que
des couleurs et des rayons déjà présents dans les maquettes ; aucune nouvelle
valeur n'a été introduite.

---

## Écarts techniques (phase 0)

**Symfony 7.4 au lieu de 7.3** — `symfony new --version="7.3.*"` échoue :
Composer 2.10 bloque les paquets visés par un avis de sécurité, et toutes les
versions 7.3.x de `symfony/runtime`, `symfony/yaml` et `symfony/cache` le sont.
La dernière 7.x stable embarque les correctifs.

**AssetMapper retiré au profit de Webpack Encore** — le pack `webapp` de
Symfony 7.4 installe AssetMapper ; MG-004 impose Encore.

**Encore 7.2 est en ESM pur** et **Babel 8 a supprimé `useBuiltIns`/`corejs`** :
`webpack.config.js` est en ESM (`"type": "module"`) et les polyfills passent
par `babel-plugin-polyfill-corejs3`.

**Bundles contrib enregistrés à la main** — `allow-contrib: false` fait ignorer
les recettes de Vich, Liip et Stof ; les trois sont déclarés dans
`config/bundles.php` et configurés manuellement.

**MySQL épinglé à 8.4** — le tag `mysql:8` pointe désormais sur 8.4, qui a
supprimé l'option `--default-authentication-plugin` (le conteneur refusait de
démarrer). `serverVersion` aligné à 8.4 dans `DATABASE_URL`.

**Ports Docker surchargeables** — 8080 est déjà pris par le projet `salam`,
3306/3310/3311 par MySQL hôte, `salam` et `amour-deshaies`. Les valeurs du
cahier des charges restent les défauts :

```bash
GAQUERE_HTTP_PORT=8090 docker compose up -d
```

MySQL est exposé sur **3312** côté hôte.

**MAILER_DSN pointe sur `mailhog`** — l'application tourne dans le conteneur
`php`, où `localhost` désigne le conteneur lui-même. Depuis l'hôte
(`symfony serve`), utiliser `smtp://localhost:1025`.

---

## Identité légale — source unique

SIRET, adresse du siège, numéro ADELI, adresse du cabinet et e-mail de contact
vivent **uniquement** dans les variables `LEGAL_*` et `MAIL_ADMIN` de `.env`,
exposées à Twig comme variables globales. La page Mentions légales et le
JSON-LD les lisent de là ; aucune de ces valeurs n'est écrite en dur dans un
gabarit, et **aucune n'est dans les fixtures** — celles-ci ne tournent jamais
en production, la valeur n'atteindrait donc jamais le site.

Renseigné : SIRET `519 644 108 00044`, siège `1345 route de la clinique,
97160 Le Moule`, Doctolib `…/saint-francois/maud-gaquere`, contact
`contact@maud-gaquere.com`.

Contrôle : `bash design-reference/check-identite.sh`.

## ⚠️ Bloquants avant mise en ligne

- [ ] **Numéro ADELI** — `LEGAL_ADELI` vaut encore `NUMERO_ADELI`. Obligatoire
      pour un psychologue ; sans lui le site n'est pas conforme à la LCEN.
      Le marqueur s'affiche **en surbrillance** sur la page Mentions légales
      tant qu'il n'est pas fourni.
- [ ] **Adresse du cabinet** — `LEGAL_ADRESSE_CABINET` vaut encore
      `ADRESSE_CABINET`. Même affichage en surbrillance. Une fois connue,
      **elle doit aussi remplacer le siège social dans le JSON-LD** de
      `base.html.twig` : c'est l'adresse de consultation que Google exploite
      pour la recherche locale, pas l'adresse administrative.
- [ ] **Domaine à trancher : `.fr` ou `.com` ?** L'e-mail fourni est en
      `maud-gaquere.com`, alors que `public/robots.txt`, `DEFAULT_URI`,
      `MAILER_DSN` et toute la documentation de déploiement supposent
      `maud-gaquere.fr`. Les deux ne peuvent pas coexister : le SPF, le DKIM
      et le sitemap dépendent du domaine retenu.
- [ ] **E-mail de contact à confirmer avec Maud** — `contact@maud-gaquere.com`
      est renseigné mais indiqué comme à valider.
- [ ] **Clés hCaptcha de production.** `.env.local` utilise les clés de test
      publiques, qui valident *toujours* : sans remplacement, aucune protection
      anti-spam réelle.
- [ ] **GA4_ID.** Vide. Tant que la variable l'est, aucun script Google n'est
      chargé et la bannière cookies ne s'affiche pas.
- [ ] **Contenus à faire relire par Maud.** Les textes viennent des maquettes,
      mais certains chiffres y figurent déjà (tarif indicatif 60–80 €, durées
      et effectifs des ateliers). À confirmer avant publication.

---

## Divergence Notion à corriger

La fiche **MG-080 indique « EasyAdmin 4 »**, alors que le cahier des charges dit
explicitement « Pas d'EasyAdmin, back-office 100% Twig custom » — et la maquette
back-office confirme un back-office sur mesure. La fiche Notion mérite d'être
corrigée pour éviter la confusion à la relecture.
