Domaines Chevaliers — cartographie live -> blocs (Phase 1.4)
Source de verite : tools/seed-gen/chevaliers-bands.py -> tools/seed-gen/data/bands.json. Le tableau ci-dessous est genere depuis le DOM du live, pas transcrit a la main. Pour le regenerer : python tools/seed-gen/chevaliers-bands.py --refresh.
Etat : 1.4a a livre l'arbre activites + evenements (40 noeuds, 9dfae84). Les pages ci-dessous restent a semer (1.4b).
Correction de la v1 de ce document (2026-07-16)
La v1 se disait « mesuree a 1440 au
getComputedStyle». Les hauteurs de bande l'etaient ; la composition des bandes ne l'etait pas, et elle etait fausse sur 3 pages sur 6. Le live n'avait pas derive (HTML re-telecharge identique a l'octet pres) : c'est la lecture qui etait incomplete. Ce qui manquait :
/vinotheque/: « Nos horaires » et « Degustation » ne sont pas uncardCollection— ce sont deuxmediaText(chacun avec sa photo)./domaines-chevaliers/: la v1 ignorait la bande equipe — 5person-box(photo + nom + fonction) sous « NOTRE EQUIPE PASSIONNEE ». C'est unteamGrid./logement/: la v1 disait « liens Booking + AirBnb en texte riche, pas un widget ». La v1 avait raison. La page porte bien un moteur Seekda dans le DOM, mais le live le masque globalement -> zero pixel, non porte. Cf. « Le logement » ci-dessous etassets-substitues.md§6. (J'ai d'abord conclu l'inverse en lisant le DOM sans lire le CSS, et sans lireassets-substitues.md§6 qui l'avait deja mesure et tranche.)Lecon : lire une bande a l'oeil dans le HTML rend une bande sur deux. Le theme ecrit la meme ligne image+texte de quatre facons (
team-info-row,single-experience-row,section-left-right,welcome-boxes) : la regle fiable est structurelle — une.rowqui contient une.row-imgest unmediaText. C'est la regle qu'applique l'extracteur.
Pieges du theme (silencieux — ils font perdre du contenu)
- b-lazy :
<img src>est un GIF base64 de remplacement ; l'URL reelle est dansdata-src. Idem pour les fonds de bande. Le premier scrape lisaitsrc-> il n'avait trouve que 3 images sur la home. - Suffixes WordPress (
-900x600,-300x200) : on importe l'original, pas le recadrage. - lxml : un element sans enfant est falsy.
first(a) or first(b)saute donc un<a class="btn">Voir les vins</a>(aucun enfant) -> tous les CTA disparaissent. D'oufirstof().
Accueil — /fr/bienvenue/ (chevaliersHome) — 8 bandes
| # | Bande live | px @1440 | Bloc | Notes |
|---|---|---|---|---|
| 1 | section.rev-slider-wrap | 533 | heroSlider (layout=banner) | Promo Smart Slider « NOS SHERPA / 20% / GAMME SHERPA ». Meme campagne que gilliard.ch — chevaliers est un clone du theme. Meme derive attendue : quand la campagne finit, re-semer (assets-substitues.md §4). |
| 2 | .hero-boxes | 435 | cardCollection (3 card) | « Decouvrez nos activites », « Chevaliers on tour », « Notre appartement au coeur du vignoble ». 0 image -> cartes texte. |
| 3 | section.section-wine-selection-2 | 1041 | cardCollection display=products-5 + CTA | Titre « NOS GAMMES » (dans .section-main-info h2), 3 .col-wine-bottle : Vins Chevaliers · Vins Sherpa · Vins LUX VINA (titre = .wine-name). CTA « Decouvrez nos gammes » -> /gammes. |
| 4 | .experiences-2 | 265 | richIntro | Titre seul : « Nos activites ». |
| 5 | .row.hero-boxes | 455 | childListing source=Activites, layout=cards-activity, max=3 | Rend les 3 memes activites que /fr/activites/ (Wine & Visits / Wine & Events / Wine & Walk). Le live reutilise la classe hero-boxes (la v1 la decrivait comme « section sans classe »). C'est l'interet de source : une vue, pas du contenu duplique. |
| 6 | .newsletter.b-lazy | 559 | newsletterSignup | « Restez informe et inscrivez-vous a notre newsletter ». Fond wine_news.jpg (sur data-src). |
| 7-8 | .welcome-boxes-2.page-team | 1524 | mediaText x2 | Histoire (Front.jpg, CTA « En savoir plus » -> /domaines-chevaliers/) et « Notre Vinotheque » (Kuche.01-1.jpg, CTA « Decouvrir l'espace » -> /vinotheque/). |
Pages de contenu (chevaliersContentPage)
| Page | Bandes mesurees | Blocs |
|---|---|---|
/fr/gammes/ | 3 | mediaText x3 — Vins des Chevaliers · Sherpa Wine · Lux Vina, chacun texte + image + CTA « Voir les vins » (-> boutique du live, hors perimetre). Pas de banniere de titre. Attention : ici les lignes portent justify-content-center, ce qui fait passer la 1re ligne pour un intro si on ne filtre pas. |
/fr/vinotheque/ | 4 | richIntro (« NOTRE VINOTHEQUE ») + mediaText x2 (« Nos horaires » visite_cave2.jpg ; « Degustation » A23T7282.jpg) + ctaBanner (« Nos vins » -> /vins). |
/fr/domaines-chevaliers/ | 10 | La plus longue. pageHero (vinotheque.jpg) + richIntro « NOTRE HISTOIRE » + mediaText (Oswald Mathier-Kuchler, 1936) + richIntro « LE DOMAINE VITICOLE » + mediaText x2 (80 ans de developpement ; Une viticulture durable) + richIntro « NOTRE EQUIPE PASSIONNEE » + teamGrid (5 personnes) + richIntro + childListing (offres d'emploi, cf. ci-dessous) + ctaBanner (« NOS VINS »). |
/fr/logement/ | 6 | pageHero + richIntro (« Logement ») + mediaText x3 (« Appartement au coeur du vignoble » ; « Reservez » — liens Booking + AirBnb en texte riche ; « GRAPE ESCAPES ») + embed (Seekda, cf. ci-dessous). |
/fr/contact/ | 6 | pageHero + cardCollection display=list de 2 card avec icon (Bureaux · Vinotheque) + map (lat 46.3122853) + formBlock (CF7) + ctaBanner (« NOTRE HISTOIRE » -> /domaines-chevaliers). |
hero-custom-banner.left (720 px) revient sur vinotheque / domaines / contact -> un seul bloc ctaBanner, pas trois variantes.
L'equipe (/fr/domaines-chevaliers/)
.row.team-row > 5 x .person-box = <img> + .name + .position. Cela tombe exactement sur l'element person existant (nom / role / photo) dans teamGrid > teamGroup > person : un seul groupe, sans titre de groupe (le titre est le richIntro au-dessus). Aucun nouveau bloc. teamGrid (Key …-000000000012) a ete ajoute au jeu Chevaliers - Content Blocks — il n'y etait pas, la v1 n'ayant pas vu la bande.
Roster live : Damian Indermitte (Directeur) · Sebastien Meizoz (Caviste) · Luis Almeida (Logisticien) · Michaela Rouvinet (Service commercial) · Salome Roten (Service commercial).
Le logement et le moteur Seekda — ⚠️ NON PORTE (mesure)
/fr/logement/ charge bien cloud.seekda.com/w/w-dynamic-shop/hotel:CH_VS_1400/42.js et rend deux div[data-skd-widget] (check-availability, offer-list). Mais le live le masque globalement, par une regle non qualifiee presente dans le CSS inline de la page :
.page-id-7969 .page-id-7223 .section-form.tkw-seekda-container,
.section-form.tkw-seekda-container { display: none; }(commentaire du live : « cacher la reservation sur logements »). Conteneur et les deux .skd-widget mesurent 0x0 : le widget rend zero pixel. -> Non porte. Le porter ajouterait un bloc que le live n'affiche pas et ferait echouer le diff de fidelite ; ne pas le porter supprime en prime ~10 hotes tiers que le live charge pour rien sur chaque page. Cf. assets-substitues.md §6, qui l'avait deja mesure et tranche.
Chevaliers n'utilise donc AUCUN bloc embed. Le plan prevoyait un widget Airbnb : il n'existe pas (le live n'a que des liens Booking/Airbnb en texte riche dans les mediaText). Ni airbnb ni seekda ne figurent dans Core - Embed Provider : embarquer un fournisseur qu'on ne rend jamais, c'est exactement le piege du bloc speculatif.
Lecon (2e du meme genre) : lire le DOM ne suffit pas — il faut lire le CSS, et lire assets-substitues.md AVANT de proposer. Une bande peut etre presente dans le DOM et invisible a l'ecran.
« Emploi » n'est pas une page — mais les offres restent ajoutables
/fr/domaines-chevaliers/ porte une .section-vacancies :
<div class="section-vacancies">
<div class="section-title-underline">NOS OFFRES D'EMPLOIS</div>
<div class="text">Notre equipe est actuellement complete. Suivez-nous sur les reseaux
sociaux pour voir les offres d'emplois disponibles ou contactez-nous.</div>
<div class="positions-box"></div> <!-- la boucle WP, rendue vide -->
</div>Deux lectures a ne pas confondre :
- Le texte est editorial et permanent, pas un etat vide : le live l'affiche qu'il y ait ou non des postes. ->
richIntro(titre + prose). (La v1 disait « c'est un richIntro » — vrai pour la prose, mais elle en concluait qu'il n'y avait rien a lister.) .positions-boxest bien la boucle d'offres, simplement a zero ligne aujourd'hui. -> on pose aussi unchildListinglayout=linksdessous : il ne rend rien tant qu'il n'y a pas d'enfant — exactement ce que fait la.positions-boxvide du live — et il liste les offres des qu'on en ajoute.
Il n'y a donc pas de doctype chevaliersVacancyList ni de page /emploi/ (le plan en prevoyait une : elle n'existe pas sur le live ; la liste vit dans la page). Le seul type ajoute est chevaliersVacancy (Key f1b22001-…-000000000020), coquille pure : compositions pageHero + pageSettings + vacancyFacts, zero propriete, template Vacancy — deja agnostique de la marque (@inherits UmbracoViewPage + cast vers IVacancyFacts). Autorise sous chevaliersContentPage.
Ajouter une offre = travail d'editeur, sans dev : creer une « Offre d'emploi — Domaines Chevaliers » sous la page Domaines Chevaliers, la publier. Elle apparait dans la liste.
Autres pieges verifies
- L'adresse de contact est celle de Gilliard (« Rue de Loeche 70, 1950 Sion »,
reception@gilliard.ch) : les deux marques partagent les bureaux. Ce n'est pas une erreur de scraping — reproduire tel quel. - Le menu « Vins » est entierement e-commerce (
/fr/vins/+ 3product-category/) -> hors perimetre, liens absolus vers le live. /gammes(sans locale) 301 ->/fr/gammes/: lien relatif du live, pas un bug a reproduire.
Ce qui reste (1.4b)
Accueil (8 bandes) · 5 pages de contenu · 2 textPage (CGV, politique de confidentialite) · notFoundPage.

