Plan de migration — Porte de Novembre (portedenovembre.ch)
But : finir la migration de PDN au meme niveau de fidelite 1:1 que gilliard.ch et chevaliers.ch. Ce document est le plan de reference ; on y revient a chaque session PDN.
Meme discipline que gilliard + chevaliers (ne rien reinventer) :
- LA BOUCLE, par page ET par composant, sans raccourci : mesurer le live (DOM, styles calcules, geometrie, polices, couleurs) aux 5 largeurs 375 / 768 / 1024 / 1440 / 1920 -> construire les blocs Umbraco + seeder -> verifier avec le harnais pixel
tools/fidelity/diff.mjs(0 px hors d'un masque justifie par ecrit) + captures live-vs-local + lecture DOM -> diff -> corriger la CAUSE -> boucler jusqu'au vert ET editabilite backoffice confirmee.- Source de verite = le DOM + le CSS/JS minifie du live, jamais l'image rendue, jamais l'oeil. Mesurer TOUT a CHAQUE taille.
- Corriger ce qui est manifestement faux AVANT de montrer a l'utilisateur (il n'est pas l'outil de diff). Un audit d'agents donne ~50 % de faux positifs : verifier chaque candidat contre le live avant ET apres de corriger.
- Editabilite d'abord : chaque bande = un bloc / une composition / un element partage, editable dans le backoffice (reordonner, ajouter, retirer). L'export WP est du CONTENU + une reference structurelle, jamais un schema a cloner.
- Commit par cause racine, utilisateur seul auteur, PAS de trailer Co-Authored-By.
- Deviations assumees ->
assets-substitues.md; masques ->tools/fidelity/config.js(avec raison ecrite). Voir aussiarchitecture/frontend-build.md(tokens, PurgeCSS) et la notetools/fidelity/README.md.
Etat actuel (mesure le 2026-07-28)
- Racine
pdnHome(id 1383), themestyles/themes/pdn/, seederControllers/DevSeedPdnController.cs(1456 lignes). - Tokens theme presents : schema SOMBRE,
$primary = $pdn-panel #11131a(l'action mesuree = le panneau quasi-noir a label clair, le rose est decoratif), rose#fc8da3, ambre#ffcc66; polices GothamPro (corps, REELLE / auto-hebergee, NON substituee — cf.assets-substitues.md§1), Yeseva One (display), Krona One (boutons). - WIP theme NON COMMITTE dans l'arbre de travail (
_bootstrap_variables/_fonts/_overrides, ~94 insertions) — a finir + committer d'abord. - Pages seedees : accueil, Vins, Cocktails, News, Evenements, News & Events, Le Club, Idees cadeaux, Goodies, Contact, Politique de confidentialite + 10
pdnArticle(news / cocktails). - La fidelite est LOIN du 1:1 : base harnais accueil PDN @1440 = 34,8 % px / 21 % align / 60 noeuds manquants. C'est l'essentiel du travail restant.
Structure du live PDN (recon 2026-07-28)
- WordPress + Elementor + theme muzicon-child (
body_wrap,sc_layouts) — PAS l'aa-base-theme partage par gilliard/chevaliers. Les mises en page different : mesurer la vraie structure, ne pas reprendre leurs hypotheses. - Portail d'age : NON (MESURE le 2026-07-29 sur le HTML rendu serveur du live, 5 verifications : aucun markup de portail, aucun plugin de verification d'age, aucun cookie d'age). Le popup « Gerer le consentement » du live est Complianz (banniere cookies), PAS un portail d'age. Le portail des sites soeurs est une fonctionnalite de l'aa-base-theme ; le theme muzicon de PDN ne l'a pas. Decision utilisateur 2026-07-29 : on colle au live => AUCUN portail d'age sur PDN. (L'ancienne recon « OUI » etait fausse.)
- Pages : accueil ; listing Vins + 7 pages DETAIL de vin (
/vins/{johannisberg-pdn,mousseux,ice-pdn,ice-rose-pdn,ice-0-0,rose-pdn,rouge-pdn}/) ; Cocktails ; News & Events ; News ; Events (/evenements/) ; Le Club (/club/) ; Goodies ; Idees cadeaux ; Contact ; confidentialite ;/de/(HORS scope, FR uniquement). - Les 7 pages detail de vin sont e-commerce-adjacentes = DANS le scope visuellement (product-detail 1:1) ; les boutons d'achat pointent vers
gilliard.ch/fr/vins/...(cablage e-commerce hors scope). Pas encore construites localement comme pages distinctes. - Masques (
config.jspdn, deja faits) : banniere cookies Complianz (live) vs notre vanilla-cookieconsent ; feed Instagram (Smash Balloon). 44 boutons d'achat -> gilliard.ch/fr/vins.
Phases
P0 — Committer le WIP theme
Relire + finir themes/pdn/{_bootstrap_variables,_fonts,_overrides}.scss + config.js (le diff actuellement non committe), verifier zero regression au harnais, committer. Base propre avant de bâtir.
P1 — Recon + backlog par page (MESURE, sans WXR)
Comme l'audit gilliard/chevaliers : chaque page PDN x 5 largeurs, DOM / styles calcules / geometrie / polices / couleurs -> liste de defauts MESUREE (systemique vs par-page). Mapper honnetement les sections Elementor sur notre modele de blocs.
P2 — Fidelite theme / tokens
Palette sombre + polices + en-tete/pied + contrat de surfaces sombres. Piege PDN : le contrat de tokens (§0.7 multi-site) bascule base/ en sombre via :root, MAIS var() ne se resout pas dans un SVG data-URI — les 3 icones a or code en dur dans _card-collection.scss exigent de redeclarer toute la declaration background dans pdn/_overrides.scss. Verifier que la bascule est propre.
P3 — Templates manquants / blocs structurels (contenu representatif)
Construire les 7 pages detail de vin comme UN template product-detail partage (reutiliser le display: product de mediaText qui existe deja), achat -> live. Verifier que le bloc heroSlider structure colle aux slides live (Share / Enjoy / Cheers) + masquer la zone hero freeform. Toute section Elementor propre a PDN -> la mapper sur un bloc Core existant ou ajouter UN bloc partage (jamais par page).
P4 — Portail d'age PDN (+ gilliarday) — ANNULE (2026-07-29)
Mesure + decision utilisateur : PAS de portail d'age sur PDN. Le live n'en a pas (voir la recon corrigee plus haut), et l'ajouter ferait echouer le diff pixel (ajouter un composant que le live ne montre pas = lecon « ne pas porter une bande invisible sur le live »). On ne cable donc PAS le @use ".../age-gate" dans pdn/main.scss. gilliarday n'existe pas non plus (hors scope depuis le 2026-07-24, aucun theme dans le repo) — rien a cabler. Phase close sans build.
P5 — LA BOUCLE de fidelite par page (l'essentiel)
Chaque page (accueil, vins, 7 detail-vin, cocktails, news, events, news&events, club, goodies, idees cadeaux, contact, confidentialite) : mesurer live 5 largeurs -> diff.mjs -> corriger la cause -> vert (hors masques justifies) + editabilite confirmee. Systemique d'abord (un token corrige plusieurs pages), puis par-page. Documenter deviations (assets-substitues.md) + masques (config.js) avec raison.
P6 — Re-seed du contenu depuis le WXR (PLUS TARD, quand le XML arrive)
Parser le WXR PDN -> JSON sans PII (tools/seed-gen/wxr-extract.mjs, comme gilliard/chevaliers -> data/sources/pdn/). Re-seeder TOUT le contenu PDN (texte exact, articles, descriptifs produits, images, dates) depuis le JSON. Re-passer la fidelite (le contenu decale la mise en page) -> confirmer le vert. Confirmer l'editabilite.
P7 — Passe harnais complete + validation
Toutes les pages x 5 largeurs vertes (hors masques) ET editabilite confirmee. Mettre a jour la doc (carte des blocs pdn-block-map.md, deviations, content-model.md pour tout nouveau champ).
Debloque MAINTENANT vs a faire APRES le WXR
- MAINTENANT (sans WXR) : tout le visuel/structurel — theme, tokens, mise en page, geometrie, typographie, les 7 templates detail-vin, le hero slider, LA BOUCLE par page — avec le DOM/CSS du live comme source + contenu representatif/approximatif. (P0-P3, P5, P7 partiel ; P4 portail d'age ANNULE, le live n'en a pas.)
- APRES (WXR) : la seule exactitude du CONTENU — texte, articles, descriptifs, images, dates. (P6.) Le texte seede approximatif reste jusque-la ; le re-seed fait partie de la manoeuvre, pas du nettoyage.
Pieges specifiques PDN (en plus des apprentissages migration partages)
- Elementor/muzicon != aa-base-theme : ne pas reutiliser les hypotheses de mise en page gilliard/chevaliers — mesurer.
- Theme sombre : icones data-URI SVG a or code en dur (redeclarer tout le
background) ; le#ffftexte-sur-scrim de page-hero/cta/newsletter/hero-slider est voulu, pas un token oublie. - GothamPro est REELLE (auto-hebergee, identite dans
config.js) — une famille inattendue fait quand meme echouer le harnais. - Complianz (live) + Instagram = masques ;
/de/hors scope ; boutons d'achat -> live. - Pas de portail d'age sur PDN (le live n'en a pas, decision 2026-07-29). Les champs age-gate de
siteSettingsrestent non seedes pour PDN — sans effet, le partial ne rend rien sans texte. - Nouveaux champs (tout champ produit) => regen ModelsBuilder avant l'acces type (regle #10) — mais l'import uSync au demarrage declenche la regen SourceCodeAuto (prouve le 2026-07-28).
- Harnais : CSS builde (PurgeCSS), prefixe
MSYS_NO_PATHCONV=1, il dismisse le portail d'age, le live derive (promos).

