Skip to content

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 aussi architecture/frontend-build.md (tokens, PurgeCSS) et la note tools/fidelity/README.md.

Etat actuel (mesure le 2026-07-28)

  • Racine pdnHome (id 1383), theme styles/themes/pdn/, seeder Controllers/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.js pdn, 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 #fff texte-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 siteSettings restent 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).

Contributors

No contributors

Changelog

No recent changes