## Résumé

Refonte complète de l'architecture du site, en 2 chantiers liés :

### 1. Migration Vite + React Router → Next.js 16 (App Router, React 19)
- ~30 routes recréées sous `app/` (statiques + dynamiques blog/références/pages locales)
- SEO rendu server-side : Metadata API, JSON-LD en RSC, `app/sitemap.ts`, redirects 308 — les balises sont désormais dans le HTML initial (gain SEO vs SPA Vite)
- Vite, react-router, et 8 dépendances mortes supprimés ; dev server piloté par `.env.local` (aucun port en dur)

### 2. WordPress headless avec catalogue de blocks réorganisables
- **Infra** : Docker Compose (mariadb + WP 6.8 + redis + wpcli) sur le VPS srv1255941, admin sur https://covalba-admin.paf-studio.dev (TLS, basic auth, noindex), backups quotidiens
- **Modèle** : 4 CPT (produit, toiture, industrie, référence) + pages natives pour les one-off ; **26 layouts Flexible Content** partagés (catalogue de blocks filtré par type dans le BO) ; options globales (menu, footer, logos…) ; contrat de schéma documenté dans `wordpress/SCHEMA.md`
- **Front** : BlockRenderer (registry par suffixe) + 26 composants de blocks dérivés du design existant ; routes `[slug]` par CPT ; ISR par tags avec revalidation on-demand (bouton « Publier sur le site » dans l'admin WP)
- **Seed** : 36 documents extraits du contenu en dur (textes verbatim + 127 médias) via un seeder PHP idempotent
- Blog et pages locales villes/départements restent en dur (hors périmètre, architecture prête)

## Test plan
- [x] `npm run build` + `npm test` (24/24) verts
- [x] Toutes les routes répondent 200 sur la preview, redirects 308, 404 OK
- [x] Canonical + JSON-LD présents dans le HTML initial
- [x] Boucle éditoriale : modification dans le BO → webhook → revalidation front (vérifiée)
- [x] Requête GraphQL complète des 26 fragments validée contre le schéma réel
- [ ] Recette visuelle page à page (preview : https://covalba-wp-tom-passage-wp.paf-studio.dev) — à faire avant merge
- [ ] Déploiement Vercel + bascule des env vars (`WORDPRESS_GRAPHQL_URL`, `REVALIDATE_SECRET`)

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