## Résumé
Suivi GTM des 4 formulaires : à chaque soumission HubSpot **réussie**, un event distinct est poussé dans `window.dataLayer` pour mapping GA4 / Google Ads dans GTM. Ajoute aussi le conteneur **GTM-K2Q2NXS** site-wide.

| Page | Event |
|---|---|
| `/diagnostic` | `form_diagnostic_submit` |
| `/contact` | `form_contact_submit` |
| `/devenir-applicateur` | `form_applicateur_submit` |
| `/guide-cool-roof` | `form_guide_submit` |

Payload : `{ event, form_name, form_location }` — **aucune donnée personnelle**.

## Détails
- `src/lib/dataLayer.ts` : helper `pushFormSubmit` (init défensif `window.dataLayer`, sans PII).
- Push placé sur le **chemin succès** du handler (après `await submit…()` HubSpot ; jamais sur erreur API ni validation échouée).
- `LeadCaptureForm` : prop `onSuccess` générique → `guide-cool-roof` l'utilise (`form_guide_submit`), `estimation` non.
- `app/layout.tsx` : conteneur GTM (head + `<noscript>`), ID surchargeable via `NEXT_PUBLIC_GTM_ID`.
- Anti-doublon : bouton `disabled` pendant l'envoi + RHF bloque la ré-entrance → **1 push / soumission**.

## Test plan
- [x] Typecheck OK sur les fichiers modifiés
- [x] 5 tests unitaires du helper (shape exacte, no-PII, anti-doublon) verts
- [x] Dev server : 4 pages HTTP 200, GTM rendu (head + noscript)
- [ ] GTM Preview sur preprod : soumettre chaque form → event unique → balises GA4/Ads
- [ ] Vérifier `NEXT_PUBLIC_HUBSPOT_*` configuré sur l'env de test (sinon submit échoue → pas d'event)

🤖 Generated with [Claude Code](https://claude.com/claude-code)
