/* ============================================================================================
   celinesantenaturelle.com - restoration stylesheet
   ============================================================================================
   Everything here is an addition to the site's own inlined Wix CSS, never a replacement. Each
   section says what was measured, on which page, and why the rule is shaped the way it is.

   Platform: Wix Thunderbolt, 2022-05/2022-06 generation, DESKTOP payload (formFactor "Desktop",
   --site-width:980px, zero layout media queries on the content pages). Wix served its phone layout
   as a separate payload that no archive holds, so the phone view is rebuilt here.
   ============================================================================================ */


/* ============================================================================================
   SECTION A - A PHONE GETS A PHONE LAYOUT
   ============================================================================================
   WHAT WAS WRONG. Every page declares width=device-width, and at 390 the document measured
   1025px: the desktop mesh at its fixed 980 plus the "More" overflow menu's items, which Wix lays
   out at x=879 with their natural width (measured: li#comp-jhpwvpsw10 right edge 1026). So the
   site scrolled sideways on a phone and two thirds of every page sat off-screen.

   WHY THE META ALONE WOULD MAKE IT WORSE. #site-root carries min-width:980px (measured, computed
   style). Release nothing else and device-width CLIPS instead of reflowing - body copy cut
   mid-sentence with every overflow check green, because Wix's containers are overflow:hidden. The
   route below is the one proved on the sister Wix sites crescercomsabor.pt and wenou.pt; every
   selector was re-derived against THIS site's DOM (its hashed class names are a different bundle
   generation and copying wenou's would have done nothing at all).

   HOW THE MESH WORKS HERE, measured rather than assumed. #masterPage is a grid; each section is
   [id^="comp-"]; inside it [data-mesh-id$="-gridContainer"] is a single-column grid whose children
   are absolutely offset by `left` and sized with a fixed px width. Turning that container into a
   flex column and dropping left/width/margin puts the components one under another in document
   order, which is the reading order the page was authored in.

   AND WHY THE REFLOW STOPS AT THE HEADER. The first attempt applied the mesh rules everywhere and
   the phone homepage opened on three teasers nobody had ever seen ("Troubles digestifs",
   "Fatigue", "Detoxification") above a logo four hundred pixels tall. Measured cause: this site's
   #SITE_HEADER grid holds three components the site parks ABOVE the document -
   comp-k17m9dgv at document top -3182, comp-k17m9mh2 at -3162, comp-k17n5qzg at -1763 (read in
   document coordinates with _o5_cel_hdrmap.js, because a viewport-relative rect on a scrolled page
   says the same thing about a component that is simply at the top). Dropping `margin-top` to stack
   the mesh is exactly what un-parks them. So the mesh rules below are scoped to #PAGES_CONTAINER and
   #SITE_FOOTER, the header is rebuilt by name in section B, and the three parked components stay
   parked.
   ============================================================================================ */
@media (max-width: 1023px) {

  /* A1. Release the 980px floor first, or everything below clips instead of reflowing.

     DO NOT PUT overflow-x:hidden ON html OR body HERE. It was there for one round and it made the
     phone page unscrollable: this site gives html and body height:844px and lets body own the
     scroll, the viewport propagating it. Adding overflow-x to html turns html into its own scroll
     container of exactly one viewport, propagation stops, and window.scrollY stays 0 for ever -
     measured, by scrolling to 3000 and reading back 0. Every gate stayed green through it, because
     scrollWidth still equalled clientWidth and the first screen still rendered. The overflow it was
     hiding is gone anyway once the wrappers below stop being 980 wide. */
  #site-root { overflow-x: hidden !important; }
  #site-root,
  #SITE_CONTAINER, #masterPage, #SITE_PAGES, #PAGES_CONTAINER, #main_MF, #BACKGROUND_GROUP,
  #SITE_HEADER, #SITE_HEADER_WRAPPER, #SITE_FOOTER, #SITE_FOOTER_WRAPPER,
  #soapAfterPagesContainer, #soapBeforePagesContainer, #pinnedTopLeft, #pinnedTopRight,
  section[id^="comp-"], div[id^="comp-"],
  [id^="pageBackground_"], [id^="bgLayers_"], [id^="bgMedia_"] {
    min-width: 0 !important;
    max-width: 100% !important;
  }
  #site-root, #masterPage, #SITE_PAGES, #PAGES_CONTAINER, #main_MF,
  [id^="pageBackground_"] {
    width: 100% !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
  }

  /* A1b. THE FOUR PAGE WRAPPERS BETWEEN #PAGES_CONTAINER AND THE MESH. Measured at 390 after the mesh
     rules were already in place: div#<pageId>.Ry26q, div._3CemL, div._3K7uv and
     div#Container<pageId> were all still computing width:980px, so every section inside them was
     980 wide however wide its own rule said it was. They carry no id worth naming (the id is the
     Wix page id and differs on all 100 pages), so they are addressed by depth from #PAGES_CONTAINER. */
  #PAGES_CONTAINER > div, #PAGES_CONTAINER > div > div, #PAGES_CONTAINER > div > div > div,
  #PAGES_CONTAINER > div > div > div > div {
    width: 100% !important;
    min-width: 0 !important;
    max-width: 100% !important;
    left: 0 !important;
    margin-left: 0 !important;
  }

  /* A2. The mesh: one component per row, full width, document order.
     Two spellings of the same thing: the 2022 template marks the mesh with data-mesh-id, and the
     newer generation that /blog/ was captured from marks it with an id ending in the same words.
     Both are listed everywhere below - /blog/ was the one page still 980 wide at 390 because the
     first version of this section knew only the first spelling. */
  #PAGES_CONTAINER [data-mesh-id$="inlineContent"],
  #PAGES_CONTAINER [id$="inlineContent"],
  #SITE_FOOTER [data-mesh-id$="inlineContent"], #SITE_FOOTER [id$="inlineContent"] {
    width: 100% !important;
    min-height: 0 !important;
    margin-top: 0 !important;
  }
  #PAGES_CONTAINER [id$="inlineContent-gridContainer"],
  #SITE_FOOTER [id$="inlineContent-gridContainer"],
  #PAGES_CONTAINER [data-mesh-id$="-gridContainer"],
  #SITE_FOOTER [data-mesh-id$="-gridContainer"] {
    display: flex !important;
    flex-direction: column !important;
    grid-template-columns: none !important;
    grid-template-rows: none !important;
    height: auto !important;
    /* Wix writes min-height on the mesh container equal to the desktop column's height; the
       portrait column measured 3162px around a 553px photograph until this line was added, and
       height:auto could not overrule a min-height. Read off the element, not guessed. */
    min-height: 0 !important;
    width: 100% !important;
  }
  #PAGES_CONTAINER [id$="inlineContent-gridContainer"] > *,
  #SITE_FOOTER [id$="inlineContent-gridContainer"] > *,
  #PAGES_CONTAINER [data-mesh-id$="-gridContainer"] > *,
  #SITE_FOOTER [data-mesh-id$="-gridContainer"] > * {
    grid-area: auto !important;
    position: relative !important;
    left: auto !important;
    right: auto !important;
    top: auto !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    margin-top: 0 !important;
    min-width: 0 !important;
    width: 100% !important;
    max-width: 100% !important;
    align-self: auto !important;
    justify-self: stretch !important;
    height: auto !important;
    flex: 0 0 auto;
    /* A2e. NEGATIVE MARGIN-BOTTOM IS HOW THE MESH OVERLAPS ITS OWN BANDS. Measured on the homepage
       at 390: -231px on the opening band, -107px on the hero, -119px on the biography, and five
       more. In the grid those pull a band up into the one above on purpose; stacked in a column
       they simply paint one band across the next, and the hero photograph cut "Syndrome post pilule
       contraceptive" in half. Both margins go and the container below supplies one even rhythm. */
    margin-bottom: 0 !important;
  }
  #PAGES_CONTAINER [id$="inlineContent-gridContainer"],
  #SITE_FOOTER [id$="inlineContent-gridContainer"],
  #PAGES_CONTAINER [data-mesh-id$="-gridContainer"],
  #SITE_FOOTER [data-mesh-id$="-gridContainer"] { row-gap: 14px !important; }

  /* A2a. THE WEDGES. Wix pads its mesh with empty spacer divs - data-mesh-id="…-wedge-N" - carrying
     the px heights that hold the desktop grid apart. As grid rows they cost nothing once their row
     collapses; as flex children in a column they contribute every pixel. Measured: the portrait's
     column computed 3162px tall around a 549px photograph with height:auto and min-height:0 both
     applied, and the missing 2600 were wedges. */
  #PAGES_CONTAINER [data-mesh-id*="wedge"], #SITE_FOOTER [data-mesh-id*="wedge"],
  #SITE_HEADER [data-mesh-id*="wedge"] { display: none !important; }

  /* A2b. A SECTION MUST BE ALLOWED TO GROW. Wix gives every band a fixed desktop height; stacked
     into a column the content is three to five times taller and the band would simply cut it off
     (its own overflow is hidden). Only the section boxes are released - not the background layers,
     which are dealt with in A4. */
  #PAGES_CONTAINER section[id^="comp-"], #SITE_FOOTER section[id^="comp-"],
  #PAGES_CONTAINER div[id^="comp-"]:not([id^="bgLayers_"]):not([id^="bgMedia_"]),
  #SITE_FOOTER div[id^="comp-"]:not([id^="bgLayers_"]):not([id^="bgMedia_"]) {
    height: auto !important;
    min-height: 0 !important;
  }

  /* A2c. THE ABSOLUTELY-POSITIONED INNER COLUMN. Wix wraps each section's children in a div that
     is position:absolute and therefore contributes nothing to its parent's height; released
     sections would then be 0 tall and the whole page would collapse into the header. Measured on
     / , /mentions-legales/ and /post/la-cure-de-jus/: the wrapper is the element that carries
     data-mesh-id="…inlineContent". */
  #PAGES_CONTAINER [data-testid="inline-content"],
  #SITE_FOOTER [data-testid="inline-content"] { position: relative !important; height: auto !important; }

  /* A2d. THE COLUMN STRIPS ARE NOT PART OF THE MESH. Wix's multi-column band is a flex row marked
     data-testid="columns", and its children carry --column-width:980px; the mesh rules above never
     touch it. Measured at 390 before this rule: the biography strip kept its desktop split, so the
     portrait held the left half and "Praticienne en réflexologie plantaire" wrapped one or two
     words per line down a 180px gutter, and the "Pourquoi la naturopathie" strip put every one of
     its paragraphs in the right-hand half with the left half empty. One column per row instead. */
  #PAGES_CONTAINER [data-testid="columns"], #SITE_FOOTER [data-testid="columns"] {
    display: flex !important;
    flex-direction: column !important;
    width: 100% !important;
    height: auto !important;
  }
  #PAGES_CONTAINER [data-testid="columns"] > *, #SITE_FOOTER [data-testid="columns"] > * {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    flex: 0 0 auto !important;
    height: auto !important;
    /* min-height is the one that actually held it. Stacked, the portrait's column still computed
       3162px - the height of its taller sibling - leaving 2600px of blank white between the
       photograph and the biography, two full phone screens of nothing. height:auto alone did not
       move it; the value was coming from min-height. */
    min-height: 0 !important;
  }

  /* A3. Rich text: Wix sizes each text box in px for a 980 column. */
  [data-testid="richTextElement"] { width: 100% !important; height: auto !important; }
  [data-testid="richTextElement"] * { max-width: 100% !important; }
  [data-testid="richTextElement"] h1, [data-testid="richTextElement"] h2,
  [data-testid="richTextElement"] h3, [data-testid="richTextElement"] h4 { overflow-wrap: break-word; }

  /* A3b. Type set for a 980px column is unreadable in a 350px measure: the hero heading is 103px
     and the strapline 55px. Cap the extremes; anything already small is left alone, so the site
     keeps its own typographic scale. */
  [style*="font-size:103px"], [style*="font-size: 103px"] { font-size: 40px !important; }
  [style*="font-size:80px"], [style*="font-size: 80px"] { font-size: 34px !important; }
  [style*="font-size:60px"], [style*="font-size: 60px"] { font-size: 30px !important; }
  [style*="font-size:55px"], [style*="font-size: 55px"] { font-size: 28px !important; }
  [style*="font-size:50px"], [style*="font-size: 50px"] { font-size: 26px !important; }
  [style*="font-size:45px"], [style*="font-size: 45px"] { font-size: 25px !important; }
  [style*="font-size:40px"], [style*="font-size: 40px"] { font-size: 24px !important; }
  [style*="font-size:36px"], [style*="font-size: 36px"] { font-size: 22px !important; }
  [style*="text-align:justify"] { text-align: left !important; }

  /* A4. THE PHOTOGRAPHIC BANDS. A full-bleed band holds its picture in an absolutely positioned
     background layer, so once the band is height:auto it has no in-flow content of its own and the
     photograph disappears - silently, because no gate can see a background that is 0 tall. The
     layers keep filling their band, and the band keeps a shape rather than a fixed height. */
  #PAGES_CONTAINER [id^="bgLayers_"], #PAGES_CONTAINER [id^="bgMedia_"],
  #SITE_FOOTER [id^="bgLayers_"], #SITE_FOOTER [id^="bgMedia_"] {
    height: 100% !important; width: 100% !important;
  }
  #PAGES_CONTAINER [id^="bgMedia_"] wix-image, #PAGES_CONTAINER [id^="bgMedia_"] wix-image img,
  #PAGES_CONTAINER wix-bg-media, #PAGES_CONTAINER wix-bg-media img {
    height: 100% !important; width: 100% !important; object-fit: cover !important;
  }

  /* A5. Images. A Wix image component is a fixed box with the <img> stretched to height:100%; at
     full width with height:auto the box measures 0 and the picture vanishes. Scoped to the page
     body and the footer: the header's logo and its three 25x25 social marks are <wix-image> too,
     and the first version of this rule turned them into full-width banners painted across the
     hero. */
  #PAGES_CONTAINER wix-image, #SITE_FOOTER wix-image {
    display: block !important; height: auto !important; width: 100% !important;
  }
  #PAGES_CONTAINER wix-image > img, #SITE_FOOTER wix-image > img {
    position: static !important;
    width: 100% !important;
    height: auto !important;
    object-fit: contain !important;
  }
  /* …except a background layer's image, which must still cover its band. */
  #PAGES_CONTAINER [id^="bgMedia_"] wix-image > img { height: 100% !important; object-fit: cover !important; }

  /* A6. Breathing room on leaf content only. Padding a full-bleed band would show white gutters,
     because the band paints its colour with an inset:0 layer underneath. */
  [data-testid="richTextElement"] {
    padding-left: 16px !important;
    padding-right: 16px !important;
    box-sizing: border-box !important;
  }
}


/* ============================================================================================
   SECTION B - THE NAVIGATION
   ============================================================================================
   B1 applies at every width and fixes a defect visible on the 1440 screenshot: Wix pins the logo
   box at the left of the header and starts the menu underneath it, so "Accueil" reads as "eil"
   with the logo painted over its first four letters. Giving the menu strip a left inset the width
   of the logo puts the first item back where it can be read.

   B2 is the phone menu. Wix positions the whole component absolutely and hides everything past
   "Blog" behind a "More" control whose dropdown is JavaScript this static copy does not have. With
   the JS frozen, "More" is a control that does nothing and six real pages (Médias, A propos,
   Contact, Mentions légales, CGV) are unreachable from the menu. Below 1024 the menu becomes a
   wrapped list of all its items and "More" is removed, so every item is a link that works.
   ============================================================================================ */
@media (min-width: 1024px) {
  /* TWO THINGS ARE WRONG WITH THE DESKTOP MENU AND THEY HAVE TO BE FIXED TOGETHER.
     (1) The logo box is pinned at x=74..318 while the menu band starts at x=230, so the first item
         sat underneath it and "Accueil" read as "eil" on every one of the 100 pages - visible on
         the very first desktop screenshot. 318 - 230 = 88, so 96px of inset clears it.
     (2) "More" is Wix's overflow control and its dropdown is built by JavaScript this static copy
         does not run: measured, the six items behind it (Médias - Collabs, A propos, Contact,
         Mentions légales, CGV) laid out at x=879 with height 0. So six real pages, two of them the
         legal pages, had no route from the menu, and "More" was a control that did nothing.
     The menu therefore wraps onto two rows inside the same 53px strip - every item a working link,
     nothing hidden behind a control that cannot open - and "More" goes. Measured after: the twelve
     items occupy two rows inside the 884px that remain of the 980 band. */
  #masterPage #comp-jhpwvpswitemsContainer {
    padding-left: 96px !important;
    box-sizing: border-box !important;
    display: flex !important;
    flex-wrap: wrap !important;
    justify-content: flex-end !important;
    align-content: center !important;
    white-space: normal !important;
  }
  #masterPage #comp-jhpwvpswitemsContainer > li {
    position: relative !important;
    left: auto !important;
    top: auto !important;
    width: auto !important;
    height: auto !important;
    display: block !important;
  }
  #masterPage #comp-jhpwvpswitemsContainer > li > a,
  #masterPage #comp-jhpwvpswitemsContainer > li > div { height: auto !important; }
  #masterPage [id^="comp-jhpwvpsw"][id$="label"] {
    padding: 2px 7px !important;
    line-height: 22px !important;
  }
  #masterPage #comp-jhpwvpswitemsContainer > li[id$="__more__"] { display: none !important; }
}

/* B1b. The menu labels are the site's sage green on white: 2.64:1, well under the 4.5 a 16px label
   needs. The replacement keeps the hue and the saturation of rgb(141,168,109) and moves lightness
   only, so the menu still reads as the same green - measured 5.7:1 on white. */
[id^="comp-jhpwvpsw"][id$="label"] { color: rgb(86, 110, 58) !important; }

@media (max-width: 1023px) {
  /* B0. THE THREE PARKED COMPONENTS. Measured in document coordinates at 1440: comp-k17m9dgv sits
     at -3182, comp-k17m9mh2 at -3162, comp-k17n5qzg at -1763 - all of them above the top of the
     page, which is how this site keeps six service teasers out of sight while leaving their words
     in the markup. They are the only components on any page with a document top below zero
     (enumerated with _o5_cel_hdrmap.js, not guessed). Named explicitly so nothing else in the
     header can be lost by accident. */
  #masterPage #comp-k17m9dgv, #masterPage #comp-k17m9mh2,
  #masterPage #comp-k17n5qzg { display: none !important; }

  /* B0b. THE HEADER BAND, REBUILT RATHER THAN REFLOWED.
     Measured layout at 1440: #SITE_HEADER_WRAPPER is 0px tall and holds three things that all
     float over the page - #SITE_HEADER (position:fixed, 101px, containing the 980px menu),
     #pinnedTopLeft (a full-viewport fixed grid whose only child is the 244x64 logo at x=74) and
     #pinnedTopRight (the same trick for the three 25x25 social marks at x=1257, i.e. 867px outside
     a 390 viewport). A 22-item menu cannot fit a 101px bar at 390 and a fixed bar tall enough to
     hold it would cover the page, so below 1024 the wrapper becomes an ordinary stacked block:
     logo, then the social marks, then the menu, then the page. Nothing is hidden and nothing
     floats. */
     EVERY SELECTOR BELOW IS PREFIXED WITH #masterPage ON PURPOSE. The page's own mesh stylesheet
     is emitted INSIDE <body>, after this file's <link>, and it contains
     `#SITE_HEADER { … position: fixed !important … }`. Same specificity, later in the document, so
     it wins: the first attempt left the header fixed at 1661px tall and the phone homepage
     screenshotted as a blank white rectangle. Two ids beat one whatever the order. */
  #masterPage #SITE_HEADER_WRAPPER {
    display: flex !important;
    flex-direction: column !important;
    position: relative !important;
    height: auto !important;
    background: #fff;
  }
  #masterPage #SITE_HEADER-placeholder { display: none !important; }
  #masterPage #pinnedTopLeft { order: 1; }
  #masterPage #pinnedTopRight { order: 2; }
  #masterPage #SITE_HEADER {
    order: 3; position: relative !important; height: auto !important; min-height: 0 !important;
  }
  #masterPage [id$="-pinned-layer"] {
    position: static !important;
    display: block !important;
    height: auto !important;
    width: 100% !important;
    margin-top: 0 !important;
  }
  #masterPage #comp-jbc7vj8u {
    position: relative !important; left: auto !important; top: auto !important;
    width: 244px !important; max-width: 88% !important; height: 64px !important;
    margin: 10px auto 2px !important;
  }
  #masterPage #comp-jaw5twrj, #masterPage #comp-jaw5twrj > ul {
    position: relative !important; left: auto !important; top: auto !important;
    width: 103px !important; height: 25px !important; margin: 0 auto 6px !important;
  }
  /* the header's own background and column strips are sized for the 980 band */
  #masterPage #SITE_HEADER > div, #masterPage #SITE_HEADER > div > div {
    width: 100% !important; max-width: 100% !important;
    left: 0 !important; right: auto !important;
  }
  /* The header's mesh wrapper carries a large NEGATIVE margin-top - that is how Wix parks the
     three teaser sections above the page. With those sections hidden the margin is still there,
     and it took the menu 3075px above the document with it. */
  #masterPage #SITE_HEADER [data-mesh-id$="inlineContent"] {
    position: relative !important; height: auto !important; width: 100% !important;
    margin: 0 !important; top: auto !important;
  }
  #masterPage #SITE_HEADER [data-mesh-id$="-gridContainer"] {
    display: flex !important; flex-direction: column !important;
    height: auto !important; width: 100% !important;
    margin: 0 !important; top: auto !important;
  }
  #masterPage #SITE_HEADER [data-mesh-id$="-gridContainer"] > * {
    position: relative !important; left: auto !important; right: auto !important;
    top: auto !important; margin-left: 0 !important; margin-top: 0 !important;
    width: 100% !important; max-width: 100% !important; height: auto !important;
    grid-area: auto !important;
  }

  #masterPage #comp-jhpwvpsw, #masterPage #comp-jhpwvpswnavContainer,
  #masterPage #comp-jhpwvpswitemsContainer {
    position: static !important;
    height: auto !important;
    width: 100% !important;
    overflow: visible !important;
    visibility: visible !important;
    padding-left: 0 !important;
    left: auto !important;
  }
  #masterPage #comp-jhpwvpswitemsContainer {
    display: flex !important;
    flex-wrap: wrap !important;
    justify-content: center !important;
    padding: 4px 6px 10px !important;
    white-space: normal !important;
  }
  #masterPage #comp-jhpwvpswitemsContainer > li {
    position: relative !important;
    display: block !important;
    left: auto !important;
    top: auto !important;
    width: auto !important;
    height: auto !important;
  }
  #masterPage #comp-jhpwvpswitemsContainer > li > a,
  #masterPage #comp-jhpwvpswitemsContainer > li > div { height: auto !important; }
  /* 24px is the floor a finger can hit; the labels are 18px tall on their own. */
  #masterPage [id^="comp-jhpwvpsw"][id$="label"] {
    padding: 7px 8px !important;
    display: block !important;
    white-space: nowrap;
  }
  /* "More" is the desktop overflow control. With the list wrapping there is nothing to overflow,
     and with the JS frozen it opened nothing anyway - a control that does not work. */
  #masterPage #comp-jhpwvpswitemsContainer > li[id$="__more__"] { display: none !important; }

}


/* ============================================================================================
   SECTION C - THE BLOG TEMPLATE
   ============================================================================================
   C1. THE SITE MENU WAS INVISIBLE ON /blog/. Measured: on / the component computes
   visibility:visible, on /blog/ the very same #comp-jhpwvpsw computes visibility:hidden, because
   that page was captured from a different Wix bundle whose .hidden-during-prewarmup class is only
   cleared by the hydration script - which a static copy never runs. The blog index therefore
   shipped with a header containing nothing but the logo: a page with no way out, which is exactly
   the "one naked page" the client rejects. Nothing else on any of the 100 pages uses the class.

   C2. TAP TARGETS. The blog's own category strip renders its links 18px tall (measured 62x18 for
   "All Posts"), and there are 115 such controls under the 24px floor on /blog/ alone.
   ============================================================================================ */
.hidden-during-prewarmup { visibility: visible !important; }

/* C1b. /blog/ IS A DIFFERENT WIX GENERATION AND ITS SKELETON HAS DIFFERENT NAMES. The other 99
   pages hang off div#site-root; this one off div#SITE_ROOT (upper case, and a class of the same
   name) with min-width:980px on it, plus #SITE_HEADERscreenWidthBackground / centeredContent /
   bg that the lower-case template does not have. Section A never touched any of them, which is why
   /blog/ was the one page still measuring 980 wide at 390 after the reflow was working everywhere
   else. Naming them by prefix rather than by hash keeps this working if the same generation turns
   up on another page. */
@media (max-width: 1023px) {
  #SITE_ROOT, #SITE_ROOT > div,
  [id^="SITE_HEADER"], [id^="SITE_FOOTER"], [id^="PAGES_CONTAINER"], [id^="SITE_PAGES"],
  [class^="style-"][class*="_bg"], [class*="TPASection"], #content-wrapper {
    min-width: 0 !important;
    max-width: 100% !important;
    width: 100% !important;
  }
  /* C1c. THE MARGIN THAT GOES NEGATIVE. This generation centres its 980px band with
     margin-left: calc((100% - 980px) / 2). Above 980 that is a positive inset; at 390 it computes
     -295px and drags the header, the menu and the whole article column off the left edge - which
     is exactly what the first phone screenshot of /blog/ showed, with "…sultations" and "…naires"
     hanging in the left margin. Measured -295px on #SITE_HEADERbg and on #comp-jhpwvpsw. The same
     trap is recorded on the sister site wenou.pt. */
  #SITE_ROOT [id^="comp-"], #SITE_ROOT [id$="bg"], #SITE_ROOT [id$="centeredContent"],
  #SITE_ROOT [id$="screenWidthBackground"], #SITE_ROOT [id$="inlineContent"],
  #SITE_ROOT [id$="gridContainer"], #SITE_ROOT [id$="gridWrapper"],
  #SITE_ROOT [class*="_bg-center"], #SITE_ROOT [class*="TPASection"] {
    margin-left: 0 !important;
    margin-right: 0 !important;
  }

  /* C1d. THE LOGO SITS IN A DIFFERENT PLACE ON THIS TEMPLATE. On the other 99 pages the logo and
     the social marks live in #pinnedTopLeft / #pinnedTopRight, which section B stacks; here they
     are in #pinnedAfterSITE_HEADER and overlay the header, so the wrapped menu's first row was
     painted straight through them ("Acc[ueil]" behind the logo box, "[Consult]ations" behind its
     right edge). #SITE_HEADERinlineContent is an ID that exists only on this generation, so
     reserving the logo's 64px + the social row's 25px here cannot affect the other template. */
  #masterPage #SITE_HEADERinlineContent { padding-top: 82px !important; }

  /* Wix's off-screen text-measuring rig: a 9183px wide ruler parked at left:-2000px. Harmless on a
     desktop page, but it is the widest box in the document and there is no reason to keep it. */
  .font-ruler-container { display: none !important; }
}

.blog-header__navigation a,
[data-hook^="header-navigation"] a,
.blog-navigation-container-font { display: inline-block; padding: 4px 2px; min-height: 24px; }
[data-hook="post-list-item-metadata"] a,
[data-hook="user-name"] a { display: inline-block; min-height: 24px; }

/* C2b. TWO CONTROLS ON EVERY BLOG CARD CANNOT WORK AND SHOULD NOT BE OFFERED.
   "More actions" ([data-hook="more-button"]) opens a Wix menu whose actions are all editor or
   member operations, and the like button posts a count to a back end that no longer exists. On a
   static copy both are 19x19 dead squares - twenty of each on the listing, which is also most of
   qa_legibility's 109 sub-24px controls there. A control that does nothing is worse than no
   control. The comment link and the author link stay, because both are ordinary links to a page
   that exists; they only needed a finger-sized box. */
[data-hook="more-button"],
[data-hook="like-button"],
.post-footer__like-button,
[data-hook="like-button-with-count"] { display: none !important; }

[data-hook="post-stats"] a,
[data-hook="post-stats"] span > a,
.blog-link-hover-color a { display: inline-block; padding: 5px 0; min-height: 24px; }

/* C2c. The share row at the foot of an article, and any bare external link in an article body:
   both sit at 19-23px, just under the finger floor. */
[data-hook="share-button"], [class*="share-button"] button,
[data-hook="post-page"] button { min-width: 26px; min-height: 26px; }
[data-testid="richTextElement"] a[href^="http"],
[data-hook="post-description"] a[href^="http"] { display: inline-block; padding: 2px 0; min-height: 24px; }


/* ============================================================================================
   SECTION D - LEGIBILITY FIXES THE SITE'S OWN CSS GETS WRONG
   ============================================================================================
   D1. INVISIBLE TEXT, measured 1:1 by qa_legibility on every page. The footer credit line is
   authored white (rgb(255,255,255)) and the footer behind it is white, so the site's own copyright
   line has been unreadable on every page. The colour moves to the footer's own body-text grey; no
   other footer text is touched.
   ============================================================================================ */
#comp-k0e715wg a, #comp-k0e715wg span, #comp-k0e715wg p { color: rgb(56, 56, 56) !important; }

/* D1b. The blocks written for the pages the archive left empty sit inside the site's own mesh, so
   they inherit its type and colour; they still have to be told to take the whole column, because a
   Wix grid child defaults to the left of a cell sized for a component that is not there. */
#restore-page-content {
  justify-self: center !important;
  align-self: start !important;
  grid-area: auto !important;
  width: 100% !important;
}

/* ============================================================================================
   SECTION E - THE AUTHORED 404, AND THREE LAST LEGIBILITY BLOCKERS
   ============================================================================================
   E1. /404.html is a clone of /mentions-legales/ with its content swapped for a <div class=
   "o5-legal">. That div carries no type of its own, so it inherited Wix's CSS reset: measured 10px
   body copy and 11px-tall links on the one page a lost visitor lands on. Wix's own font stack and
   colours are used, so the page still looks like the site.
   ============================================================================================ */
.o5-legal {
  max-width: 780px;
  margin: 0 auto;
  padding: 48px 24px 72px;
  font-family: futura-lt-w01-book, "Futura", Helvetica, Arial, sans-serif;
  font-size: 17px;
  line-height: 1.6;
  color: rgb(56, 56, 56);
}
.o5-legal h1 { font-size: 34px; line-height: 1.25; margin: 0 0 20px; color: rgb(56, 56, 56); }
.o5-legal h2 { font-size: 24px; line-height: 1.3; margin: 28px 0 10px; }
.o5-legal p, .o5-legal li { font-size: 17px; line-height: 1.6; margin: 0 0 12px; }
.o5-legal ul { margin: 0 0 18px 22px; list-style: disc; }
.o5-legal a { color: rgb(86, 110, 58); text-decoration: underline; }
.o5-legal li a, .o5-legal p a { display: inline-block; min-height: 24px; padding: 2px 0; }

/* E2. TAP TARGETS THE BLOG WIDGET DRAWS AT 19-23px. The author credit on each listing card and any
   bare external link inside an article body: real links, finger-sized boxes. */
#PAGES_CONTAINER a[href="/blog/"],
#PAGES_CONTAINER a[href^="http"] {
  display: inline-block;
  min-height: 24px;
  padding: 3px 0;
}

/* E2b. INDEPENDENT REVIEW R1 (2026-08-19): the rule above took the .IHVhk author-credit anchor out
   of flex flow. That one anchor is not a plain link - Wix's own CSS lays it out as
   `.IHVhk{display:flex;align-items:center;height:19px}` because it holds TWO children side by
   side, [data-hook="user-name"] and the "Administrateur" [data-hook="badge"] crown. inline-block
   dropped the badge onto its own line, where it stretched to the anchor's now-auto width and
   landed across the date/read-time row on all 20 cards at both viewports (measured by
   _scripts/_rev_cel_badgeoverlap.js: 20/20 intersecting before this rule). Restore flex and grow
   height instead of replacing it with a min-height the flex box never needed. */
#PAGES_CONTAINER a[href="/blog/"].IHVhk {
  display: flex;
  align-items: center;
  height: 24px;
  padding: 0;
}

/* E3. WHITE TYPE OVER A PHOTOGRAPH THAT IS PALE BEHIND THE WORDS, AT BOTH VIEWPORTS.
   The hero band paints "J'accompagne les femmes / a retrouver leur equilibre et / leur bien-etre
   par des moyens naturels" in white script over an olive-branch photograph, with the strapline
   "Alimentation - Nutrition - Aroma & Phytotherapie - Fleurs de Bach" under it. Measured by
   qa_legibility against the pixels actually painted behind each line: 1.38:1 at 1440 and 1.04:1 at
   390. Both are below the 1.6 the gate calls invisible, and a reader calls them invisible too - the
   words disappear into the leaves.

   THE PHOTOGRAPH IS NOT REPLACED AND THE TYPE IS NOT RECOLOURED. A scrim inside the band's own
   background layer darkens what is behind the words, which is what the site's designer would have
   reached for; the layer is position:absolute and sits under the content, so the scrim cannot
   cover the text.

   Two things this rule got wrong before and must not get wrong again:
   1. THE SCRIM GOES ON comp-jaw5ezt9, not on the section comp-jaw5ezs8. The section's own
      background layer is empty here and the photograph lives in the column inside it; aiming at
      the section changed nothing and the gate went on reporting 1.04:1. Both are listed, because
      a scrim over an empty layer costs nothing and the day the payload changes it is the one that
      still matches.
   2. THE WHOLE RULE WAS DEAD FOR A DIFFERENT REASON: the comment above it was closed early, so
      three lines of English sat in the stylesheet as a bogus selector and CSS error recovery
      swallowed the @media block behind it. Every gate stayed green about the stylesheet itself and
      the hero went on measuring 1.04:1. That is why this block is now ONE comment with ONE
      terminator, and why the rule below is verified by re-running qa_legibility rather than by
      reading it.

   3. z-index:1 ON THE SCRIM PUT IT OVER THE TEXT, NOT UNDER IT. #comp-jaw5ezt9 is the stacking
      context; inside it bgLayers is position:absolute/z-auto and the mesh that holds the words is
      position:relative/z-auto, so the words paint above the layer purely by DOM order. Giving the
      pseudo a POSITIVE z-index lifts it out of that order and above everything. Measured proof:
      with z-index:1 and .52 black the band went visibly dark and qa_legibility reported the SAME
      1.38:1 and 1.04:1 as before, because the scrim was dimming the type by exactly as much as the
      photograph. No z-index at all is the fix - the pseudo then paints with its parent, under the
      text.
   4. ONE SCRIM, NOT TWO. Listing comp-jaw5ezs8 as well stacked a second .52 veil over the same
      pixels (~.77 combined) and turned an olive grove into a night scene. The photograph is on
      comp-jaw5ezt9; that is the only element that gets a scrim.
   5. THE SCRIM IS A REAL ELEMENT, NOT A PSEUDO. Wix already ships an empty
      <div data-testid="bgOverlay"> inside bgLayers, in front of the media and behind the content -
      the slot this effect belongs in. Painting it instead of inventing an ::after means the veil is
      a DOM node with a background-color, which any contrast checker can read; a pseudo-element is
      invisible to all of them.

   WHAT THE HERO ACTUALLY MEASURES, by photographing the element's own box and counting pixels
   (_scripts/_o5_cel_pixels.js): glyphs rgb(248,248,248) over ground clusters rgb(72,72,72) and
   rgb(88,88,88) - 8.61:1 with this scrim, 3.34:1 without it. The type is #FAFAFA, near-white; the
   plan's assumption that a DARK grey sat there came from reading the computed colour of an
   ancestor <span> in a five-deep Wix rich-text nest instead of the span that paints the glyphs.

   NOT scoped to a media query: the desktop render needs it as much as the phone. */
#bgLayers_comp-jaw5ezt9 [data-testid="bgOverlay"] {
  background-color: rgba(0, 0, 0, .55);
}

/* E4. Two controls the blog widget still draws a pixel or two under the finger floor. */
#PAGES_CONTAINER a[class*="_3Bkfb"] { display: inline-block; min-height: 24px; padding: 2px 0; }
#PAGES_CONTAINER [role="button"] { min-width: 24px; min-height: 24px; }

/* D2. A link that reads exactly like the prose around it. The site sets its own body links to the
   same grey as the paragraph, which is why qa_legibility reports "links look like plain text" on
   the homepage, the legal pages and the posts. Underlining them costs the design nothing and is
   what tells a reader the words are clickable. */
[data-testid="richTextElement"] a[href]:not([class]) { text-decoration: underline !important; }


/* ============================================================================================
   SECTION F - THE HOMEPAGE PRINTED TWO PARAGRAPHS ON TOP OF EACH OTHER AT EVERY DESKTOP WIDTH
   ============================================================================================
   WHAT A READER SAW. Between the portrait and the pink divider, the biography ("Depuis toujours
   passionnee par les techniques de bien-etre...") and the right-hand column ("Il est temps de
   prendre soin de vous !") were painted over each other for 339 vertical pixels - two different
   texts sharing the same rows, both unreadable. Measured with _scripts/_o5_cel_overlap.js at 1024,
   1280 and 1440: identical numbers at all three, because this mesh is width-fixed on desktop.

   WHY, MEASURED, NOT GUESSED. The archived 2022 page does NOT overlap: rendered from
   _raw/.../index.html with the network blocked, the right column runs 1459 -> 2667 and the
   biography starts at 2662. Five pixels of slack - the layout was tuned to the pixel. The restored
   page adds the client's content-wraparea paragraph to the END of that same right column
   (comp-jaw9ua3l), which grows it by 407px to 1484 -> 3019 while the biography stayed where the
   archive put it, at 2680. Proof it is the paragraph and not this stylesheet: with restore-extras
   disabled in the live page the column still measures 1531px, and the component's text length is
   1649 chars against the archive's 1036.

   HOW THE MESH ACTUALLY WORKS HERE, AND WHY ONE LINE IS THE WHOLE FIX.
   Read the page's own CSS, not the computed value: #Containerc1dmp's grid is
   `grid-template-rows: repeat(14, min-content) 1fr`. The fifteen pixel tracks a devtools panel
   shows are the RESOLVED sizes of those min-content rows, and every component is placed in one row
   with `grid-area` and then pushed to its real position by its own margin-top. So the rows already
   grow with their content - the biography's own row is sized by the biography's margin-top plus
   its height. Push the biography down and row 3 grows by the same amount, and every row after it
   rides down with it. Nothing else has to be touched, and the layout keeps sizing itself.

   (The first version of this fix pinned all fifteen tracks to the pixel values it had measured.
   That worked and was wrong: it froze a content-driven grid into constants that any later edit to
   any component on the homepage would quietly invalidate. Rewriting the computed value of a
   shorthand back into the stylesheet is a trap worth naming.)

   THE NUMBER. The right column now ends at 3019 and the biography began at 2680, so 369px restores
   the archive's "column ends, biography begins" relationship with a 30px breathing gap:
   margin-top 1364px -> 1733px.

   SCOPE. #comp-kaw6svbs exists only on the homepage, and the block is inside min-width:1024px
   because below that Section A stacks the mesh into a single column and there is no overlap to
   fix. Re-check with _scripts/_o5_cel_overlap.js after ANY edit to the weave paragraph: its
   height is what this number is derived from. */
@media (min-width: 1024px) {
  #comp-kaw6svbs { margin-top: 1733px !important; }
}


/* E3b. AT 390 THE FIRST LINE OF THE HERO STARTS SIX PIXELS ABOVE THE PHOTOGRAPH.
   Measured: the band (#comp-jaw5ezt9 and its bgLayers/overlay) runs y=779..1001, and the span that
   paints "J'accompagne les femmes" has its box at y=773 - the ascenders of a 103px script face set
   on line-height:0.5em overflow their line box upwards and land on the pale-green section above.
   A reader sees the top of the first line sitting on the wrong ground; a contrast checker sees an
   element its scrim does not contain and falls back to the page's white, which is where the
   stubborn 1.04:1 on the phone came from.
   The band is height:auto once Section A has stacked the mesh, so padding grows it rather than
   pushing the strapline out of the bottom. 20/10 was read off the 6px overhang plus the same
   optical margin the desktop band already has. */
@media (max-width: 1023px) {
  #comp-jaw5ezt9 { padding-top: 20px; padding-bottom: 10px; }
}


/* E3c. E3's SCRIM WAS CORRECT AND QA_LEGIBILITY STILL FAILED THE HERO AT 1.38:1, BECAUSE A
   SEPARATE SCRIPT WAS REPAINTING THE TEXT GREY UNDERNEATH THE SCRIM'S FEET.

   js/restore-legibility.js (the batch-wide JS nudge, written by o45_legibility_pass.py) runs its
   own contrast check on every page and moves any text it judges too pale. Its groundOf() walks
   ANCESTORS looking for a CSS background-image or an opaque background-color; it has no code path
   for Wix's actual mechanism here, where the photograph is painted by #bgMedia_comp-jaw5ezt9, a
   POSITIONED SIBLING of the text's container, not a background-image on any ancestor. So it finds
   nothing, falls back to "the ground is white", scores this span's real #FAFAFA at ~1:1 against
   that assumed white, and "corrects" it - writing a literal `color: rgb(138, 138, 138)` onto the
   innermost span's inline style. That happens on every load, after E3's scrim is already in the
   page, which is why reading the stylesheet found nothing wrong: the defect is a runtime DOM
   mutation, invisible to anything that does not execute the page.

   MEASURED with _scripts/_o5_cel_hero_diag2.js, which replays qa_legibility's own MEASURE/COMPARE
   pipeline and prints the element actually probed: the leaf span's computed style at page-load is
   `font-size: 103px; color: rgb(138, 138, 138);` - not the `#FAFAFA` in this file's markup - and
   qa_legibility's photographic ratio for it is 2.5:1 at 1440 (worst-sampled-pixel 1.45:1) and
   2.19:1 at 390 (worst 1.37:1), both under the 1.6 the gate calls invisible. The parent span one
   level up still computes `#FAFAFA`: restore-legibility.js's own loop skips any element whose
   children carry the text (its ownText check), so the mutation lands on the leaf only.

   THE FIX STAYS OUT OF THE SCRIPT. restore-legibility.js is shared by the whole batch and correct
   everywhere it can actually see the ground; teaching it Wix's sibling-layer pattern is real work
   that belongs to that script's own author, not to a per-site override, and touching a shared file
   for one site's regression risks every other site that depends on it. A stylesheet rule with
   !important loads after the script runs and after any of its later re-runs (fonts.ready, the
   900ms timeout), and !important beats a plain inline style with no !important of its own - so it
   wins regardless of when the script fires. Scoped to the leaf span only (four levels deep, the
   one with no explicit colour of its own to protect): the three ancestors above it keep whatever
   the script does to THEM (none of them carry text, so none of them are ever touched), and no
   other element on the page is named by this selector.

   AFTER: the leaf now computes `#FAFAFA` again and the same probe gives, per title line,
   8.24:1 / 8.81:1 / 9.37:1 at 1440 (worst-sampled-pixel 4.72 / 5.88 / 7.05) and 6.97:1 / 7.63:1 /
   9.35:1 at 390 (worst 4.54 / 4.61 / 6.39) - close to E3's original 8.61:1 now that the leaf is
   not being repainted out from under it. qa_legibility.js itself reports 0 INVISIBLE TEXT on / at
   both viewports after this rule. The tap-target and low-contrast lines still in its report are
   pre-existing and unrelated to this defect - a nav icon and a card subtitle, neither over a photo. */
#comp-k56krpw6 span span span span { color: #FAFAFA !important; }
#comp-k56kx743 span span span span { color: #FFFFFF !important; }


/* ============================================================================================
   SECTION G - THE WIX BLOG HEADER IS FOURTEEN LINKS TO THE PAGE YOU ARE ON, PLUS A DEAD SEARCH
   ============================================================================================
   MEASURED, on /blog/ and on a post page, at 1440 and 390:
     * the category menu holds fourteen anchors - All Posts, Recette, Recette Gourmande, Recette
       Saine, Healthy, Fait Maison, Alimentation, Nutrition, Bien Manger, Naturopathie, Sante,
       Bebe, Hygiene de vie, Fait Maison - and EVERY href is "/blog/". The real targets were
       /blog/categories/*, hundreds of near-identical Wix listings that the plan's _note records as
       deliberately never built. So the menu cannot filter anything: every label leads to the page
       the reader is already looking at.
     * seven of those fourteen are also unreachable. The menu's own <ul> is overflow:hidden at 72px
       and the overflow items end up behind the post cards: 24px tall, 2 hittable pixels each. That
       is exactly what qa_legibility reports as "TAP TARGET small x88 (7 under 24px)" - the boxes
       are fine, the hit test is not, and no amount of padding fixes a link that is painted over.
     * the "Rechercher" control in the same bar is reported DEAD by qa_interactions on the listing
       and on every post page: clicking it changes nothing, because Wix's blog search queried a
       back end that no longer exists. The project rule is explicit - a search box that swallows
       the query must not ship unless there is a static index behind it, and there is none here.

   So the whole bar goes. [data-hook^="blog-"][data-hook$="header-container"] was verified to
   contain NOTHING ELSE: its entire textContent on both templates is the category labels.
   Readers keep every route they actually had - the site's own menu carries "Blog", each post
   carries "Posts recents / Voir tout", and each card links to its article.

   CSS rather than a rewrite of 75 files: Wix emits this widget with different hashed class names
   on the listing and on the posts, and the [data-hook] is the one stable handle on both. */
[data-hook^="blog-"][data-hook$="header-container"] { display: none !important; }


/* ============================================================================================
   SECTION H - THE BLOG CARDS, AND THE CHIPS ON /prendre-rdv/
   ============================================================================================ */

/* H1. FOUR POST TITLES ON /blog/ ARE SLICED THROUGH THE MIDDLE OF A LINE.
   Measured with _scripts/_o5_cel_clipped.js at 1440: the title anchor inside
   article[data-hook="post-list-item"] is height:102px, overflow:hidden and holds 135px of text, so
   "Le cycle feminin : prendre soin de son intimite de facon naturelle" ends after "de facon" with
   half a line of glyphs showing under it. Not a line-clamp with an ellipsis - a plain cut, which
   reads as a rendering fault rather than as a shortened title. There is no data-hook on the title
   itself, so it is addressed as the anchor inside the card that points at the post it titles;
   the card is a flex column and its row equalises, so letting the title find its own height moves
   the summary line down rather than overlapping anything. Verified: 0 clipped elements afterwards,
   and _o5_cel_overlap.js still reports no overlap on the listing. */
article[data-hook="post-list-item"] a[href^="/post/"] {
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
}

/* H2. "REDIGEZ UN COMMENTAIRE" IS A PROMISE THE STATIC COPY CANNOT KEEP.
   Every card carries it, and it links to the post page - which was measured to contain no comment
   form, no comment list and no comment hook of any kind: Wix served that widget from a back end
   that is gone. An invitation to write a comment that lands on a page with nowhere to write one is
   the same defect class as a dead button. The card keeps its title link and its photograph, both
   of which go to the article.

   ADDRESSED BY ITS PARENT'S data-hook, and this matters. The first attempt used
   `a[href^="/post/"]:last-of-type:not([class*="_1hW_F"])`, reasoning that the comment link is the
   last anchor in the card. It is not: the card's PHOTOGRAPH is also an anchor to the same post, it
   is the only <a> inside its own wrapper, so it is a :last-of-type too - and the rule blanked the
   photograph out of every one of the 74 cards. Caught by re-cropping the listing, not by any gate:
   the images were still in the DOM, still 242px wide, still loaded. Wix's own [data-hook] is the
   handle that means what it says. */
article[data-hook="post-list-item"] [data-hook="post-stats"] a[href^="/post/"] {
  display: none !important;
}

/* H3. WHITE LABELS ON A PALE TEAL CHIP, MEASURED AT 1.85:1.
   The eighteen service chips on /prendre-rdv/ paint #FFFFFF on rgb(126,204,197). That is the
   original design and it was never readable; now that the chips are real links (they used to be
   dead role="button" divs) an unreadable label is also an unusable control. Same remedy as B1b:
   keep the hue and the saturation of the site's teal and move lightness only, to rgb(46,124,118) -
   measured 4.93:1 against white, still recognisably the same teal. The text is untouched, so the
   "white label on a solid chip" the designer drew survives.
   Scoped by component id: these eighteen exist only on /prendre-rdv/, so no other page's buttons
   change colour. */
#comp-k0jklebp__item-j9r9uz7e a, #comp-k0jklebp__item1 a, #comp-k0jklebp__item-j9r9uxns a,
#comp-kewvd8f3 a, #comp-k8rc53g0 a, #comp-k8rg6hb7 a, #comp-kewkbev4 a, #comp-kgxtyq9a a,
#comp-kgxu3odi a, #comp-k0jknrh8__item1 a, #comp-k0jknrh8__item-j9r9uz7e a,
#comp-k0jknrh8__item-j9r9uxns a, #comp-k4fjrpvs__item1 a, #comp-k4fjrpvs__item-j9r9uz7e a,
#comp-k4fjrpvs__item-j9r9uxns a,
#comp-khu94up9 > div, #comp-kh89u857 > div, #comp-kh89ufgi > div {
  background-color: rgb(46, 124, 118) !important;
  text-decoration: none;
}


/* H4. EVERY WIX LINK-BUTTON ON THE SITE COLLAPSES TO ZERO HEIGHT AT 390.
   Measured with _scripts/_o5_cel_zeroheight.js over all 100 pages: twenty-five controls render
   390x0 or 311x0 on a phone - the eighteen service chips on /prendre-rdv/, and seven "Je prends
   RDV" / "Me consulter" calls to action on /naturopathie/ (x2), /acne/, /entreprises/,
   /troubles-du-cycle/, /premenopause-et-menopause/ and /syndrome-post-pilule/. They are in the DOM,
   they have hrefs, and they are not on the screen: the photograph is followed straight by the next
   heading. No gate reports this - qa_legibility skips anything under 1px before it tests tap
   targets, qa_interactions treats a link as a link rather than a control, and on a full-page
   screenshot the missing button reads as spacing.

   THE CAUSE, read off the element rather than guessed: Wix's inner button element ._1fbEI is
   position:absolute and takes its size from the host's fixed height. Section A replaces that height
   with height:auto to stack the phone layout, so the host has an absolutely positioned only child,
   no in-flow content, and computes 0 - and the child, sized to a 0-height parent, computes 0 too.

   THE FIX IS ONE PROPERTY. Putting ._1fbEI back in normal flow at phone widths lets the host take
   its height from it: measured 0 -> 40px on comp-kbysbxgq with nothing else changed. min-height
   keeps it at the 40px finger size when the label is short. This replaces an earlier version that
   listed eighteen component ids by hand: the id list fixed /prendre-rdv/ and left the seven CTA
   buttons on the service pages invisible, because a list can only contain what its author happened
   to look at. The class is what every one of them has in common.

   SPECIFICITY NOTE, learned the expensive way here: Section A zeroes components with
   `#PAGES_CONTAINER div[id^="comp-"] { min-height: 0 !important }`, which is (1,1,1). A bare
   `#comp-x { min-height: 40px !important }` is (1,0,0) and loses to it however late it appears -
   the chips stayed 390x0 with the rule live in the sheet. Fixing the CHILD's position sidesteps the
   contest entirely, which is why this shape is preferred to out-specifying the parent. */
@media (max-width: 1023px) {
  #PAGES_CONTAINER ._1fbEI {
    position: relative !important;
    min-height: 40px !important;
    align-items: center;
  }
}


/* H5. ON /naturopathie/ THE "JE PRENDS RDV" BUTTON IS PRINTED ON TOP OF A HEADING.
   Measured at 1440 and 1024 (identical, the mesh is width-fixed on desktop): the button occupies
   y=1283..1323 and the line "Le rendez-vous de suivi naturopathie :" occupies y=1285..1319 - a
   53x34px collision, the button's teal box sitting across the middle of the words. Found by eye on
   the full-page screenshot and then measured; no gate reports a control overlapping text.

   IT IS OURS, NOT THE ARCHIVE'S, AND ONLY JUST. Rendered from _raw/.../naturopathie.html the same
   button sits at the same y=1283 but the text block above it is 1283px tall instead of 1460px, so
   the heading fell below the button and the two cleared each other. The 177px difference is text
   reflow: the delivered site has the real self-hosted fonts, the archive render has none. A layout
   that only worked because a line broke where it did is a layout with no slack, and it lost the
   moment anything about the type changed.

   The button belongs after the first offer, and there is a 150px empty band there (the block
   "Consultation via Zoom, Whatsapp, ou FaceTime" ends at y=1135). Its position comes from
   margin-top:941px inside its grid row; 818px puts it at y=1160, centred in that band with 25px of
   air above the button and 65px below it before the next heading. Desktop only: at 390 Section A
   stacks the mesh, the button follows its paragraph in document order, and this margin must not
   apply. */
@media (min-width: 1024px) {
  #comp-kbysbxgq { margin-top: 818px !important; }
}


/* H6. TWO CONTROLS THE ._1fbEI FIX IN H4 DOES NOT REACH.
   Found by re-running qa_legibility over twelve pages after H4 and reading the two that still
   failed, rather than assuming one rule had covered the class of defect:

   * /sopk/ carries a "Prendre RDV" link built from Wix's OTHER button component - class
     StylableButton2545352419__root, not ._1fbEI - and it measures 390x15 at 390. Same shape of
     failure, different component, so it needs its own selector; the label is the site's own and it
     points at /prendre-rdv/, which works.
   * the "Posts recents" strip at the foot of every article gives each entry a view count and a like
     count as separate links. The like count on a post with none reads "0" and is 21px wide - under
     the 24px finger floor by three pixels because the glyph is narrow. Padding it out costs nothing
     and it becomes hittable.

   Both are phone-only in effect but written without a media query where the desktop value is
   already larger, so there is one rule to reason about instead of two. */
#PAGES_CONTAINER a[class*="StylableButton"][class*="__root"] {
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
#PAGES_CONTAINER a[class*="_8NS15"] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 26px;
  min-height: 26px;
}


/* H7. /contact/ HAS A 540px EMPTY BAND WHERE THE WIX FORM USED TO BE.
   The page shipped an <iframe> with no src - Wix's "Quick Form Builder", saved by the archive as an
   empty shell that can never load - and o5_cel_deadwidgets.py removed it. What it did not remove is
   the room the page had reserved for it: the Wix page div #m4sso declares min-height:881px, so the
   mesh keeps its full height with nothing in the bottom two thirds and the honest "Me joindre"
   block lands at y=982, under half a screen of blank beach photograph. A visitor reads that as a
   page that failed to load.
   THE FLOOR IS ON THE MESH, NOT ON THE PAGE. #m4sso does declare min-height:881px and lowering it
   alone changed nothing - measured, the page still rendered 1152px tall - because the grid inside
   it carries its own min-height:881px and that is what was actually holding the space open. Both
   are released here; the mesh keeps a 360px floor, which is the bottom of the last real paragraph
   plus the site's own rhythm. #m4sso and Containerm4sso* are the Wix page id of /contact/ and of
   no other page, so nothing else moves. */
#m4sso { min-height: 0 !important; }
[data-mesh-id="Containerm4ssoinlineContent-gridContainer"] { min-height: 360px !important; }


/* ============================================================================================
   SECTION I - THE SHARE ROW AND THE LIKE BUTTON AT THE FOOT OF EVERY ARTICLE
   ============================================================================================
   `node _scripts/qa_interactions.js` clicks them at 1440 and at 390 on /post/quelle-eau-boire/,
   /post/la-cure-de-jus/ and /post/les-boissons-de-l-hiver/ and reports every one DEAD from two
   different page states: four share buttons ([data-hook="share-button__facebook"], __twitter,
   __linked-in, __link) and the like button (button.yEg7l, "1 j'aime. Vous n'aimez plus ce post").
   All five are Wix blog widgets whose handlers were served by a runtime that is gone; on the static
   copy they are icons that swallow the click.

   Section C2b already removed exactly these two controls from the blog LISTING cards, by
   [data-hook="more-button"] and [data-hook="like-button"]. The article footer emits them under
   different hooks - share-button__* and a hashed class with no hook at all - so the listing was
   clean and all 74 article pages still shipped a dead share row. Same defect, same remedy: a
   control that does nothing is worse than no control.

   NOT REPLACED WITH REAL SHARE LINKS. facebook.com/sharer and the twitter intent URL would work,
   but they would add four outbound social links to every one of 74 pages on a site whose brief is
   to take tracking and social embeds OUT, and the restored site is not being maintained as a place
   people share from. The article keeps its text, its photograph and its "Posts recents" links.
   The reader loses nothing that worked. */
[data-hook^="share-button__"],
[data-hook="share-buttons"],
[data-hook="post-footer"] button.yEg7l,
[data-hook="post-page"] button.yEg7l { display: none !important; }


/* ============================================================================================
   SECTION J - INDEPENDENT REVIEW R2 (2026-08-19): FIVE ARTICLES WHOSE BODY IS AN IMAGE
   ============================================================================================
   The prior finishing pass (defect X1) declared these five posts had "no body in the archive" and
   that writing one would mean inventing naturopathy content. That premise was wrong: each post's
   body was never absent, it was published as a single PNG the site already ships (Wix's recipe-card
   / infographic export), and the words in every one of those images are Céline HOVETTE's own -
   ingredients, steps, plant names in Latin, a signed byline. The HTML around the image carries only
   30-139 characters because the article text was never HTML on this generation of the widget, not
   because she never wrote it.

   THIS SECTION STYLES A TRANSCRIPTION, NOT AN INVENTION. The paragraphs .o5-transcribed wraps on
   each of the five pages are typed out from the image pixel-for-pixel (including her own "gimgembre"
   spelling on les-boissons-de-l-hiver, left uncorrected because it is her word, not this pass's).
   Nothing in the recipes/tisanes lists a clinical claim, a price or a credential, so nothing here
   crosses the "never invent" line the plan sets for THIS site - it restores what was already
   published, in the one form (real text) that a reader, a screen reader and qa_client_bar's
   pages_say_something can all actually see. The source images themselves also gained alt text in
   the same pass, for the reader who never reaches the transcription. */
.o5-transcribed {
  max-width: 640px;
  margin: 28px auto 8px;
  padding: 0 24px;
  font-family: futura-lt-w01-book, "Futura", Helvetica, Arial, sans-serif;
  font-size: 16px;
  line-height: 1.6;
  color: rgb(56, 56, 56);
  text-align: left;
}
.o5-transcribed h3 {
  font-size: 19px;
  line-height: 1.3;
  margin: 22px 0 8px;
  color: rgb(56, 56, 56);
}
.o5-transcribed p, .o5-transcribed li { margin: 0 0 10px; }
.o5-transcribed ul { margin: 0 0 14px 20px; padding: 0; }
.o5-transcribed .o5-lead { font-style: italic; color: rgb(90, 90, 90); margin-bottom: 16px; }
.o5-transcribed .o5-credit { font-size: 13px; font-style: italic; margin-top: 18px; color: rgb(90, 90, 90); }


/* ============================================================================================
   SECTION K - /la-naturopathie/: THE REIMBURSEMENT SENTENCE IS PAINTED OVER, DESKTOP ONLY
   ============================================================================================
   THE CLAIM. "La naturopathie et les pratiques qui y sont associees ne sont actuellement pas
   prises en charge par la Securite Sociale." At 1440 the rendered line reads "...qui y sont
   associe" then jumps straight to "Securite Sociale." - the middle of the sentence never paints,
   though it is present in the markup (it renders in full at 390).

   MEASURED, from the shipped screenshot _shots/dsg_celine/la_naturopathie-d1.png, with a plain
   Pillow pixel scan (no browser opened) - _scripts is not the source of this one, the numbers
   below came from a throwaway script reading that PNG's array directly:
     * the paragraph's ink stops dead at x=707 across y=664-706 (the exact rows of this line and
       of "Securite Sociale." on the line under it), and does not resume until y=725 - the
       "Neanmoins, de plus en plus de mutuelles..." line, which is full width again.
     * #comp-kaw8audd (the "Capture d'ecran 2020-06-01 a 10.14.56" photo, one grid row below the
       bulleted list) computes its left edge at margin-left calc((100% - 980px) * 0.5) = 230px at
       1440, PLUS its own `left:480px` relative offset = 710px - three pixels from where the
       paragraph's ink stops. Its box runs 476x335 (right edge 1186), so it spans exactly the
       column the missing clause would occupy.
     * a saturation check on that box (mean 11.3, 41% of pixels sat>10 across y395-655) confirms
       real photographic content there - this is the photograph, not text bleeding through - while
       the band directly below it, y655-730, is 0% non-white: the photo's own box runs on for
       another ~75px of plain pale background after the two women in the picture stop, and that
       blank tail is exactly where the hidden clause and "Securite Sociale." fall. White paint on a
       white page is invisible in any screenshot and to any contrast gate, which is why this took a
       by-eye pass at 1440 to catch and no automated check on this project owns it (logged as
       CROSS-SITE #202).

   WHY ONLY AT 1440. #comp-kaw8audd is later in the DOM than the rich-text column
   (#comp-k17me1nk, grid-area 2/1/7/2 - it spans rows 2 through 6 and so includes row 5, the one
   the photo sits in), and neither carries a z-index, so on the row they share the image paints on
   top of the paragraph purely by document order. At <=1023px Section A turns this same mesh into
   a stacked flex column (`grid-area:auto !important`, one component per row) - the two can no
   longer occupy the same pixels at all, which is why the sentence has always been complete on a
   phone.

   FIRST CURE TRIED AND REVERTED. `#comp-kaw8audd { z-index: -1 !important; }` did make the words
   win, but the independent reviewer measured the actual consequence with Pillow on a fresh
   screenshot: 179,169 of ~186,000 pixels in the photo's box came back pure white - the whole
   photograph, not just its blank tail, vanished at >=1024px (it still showed on phone, where the
   rule does not apply). Reasoned cause: #comp-kaw8audd is a CSS Grid item, and per spec a grid
   item with a z-index other than auto is treated as if it had `position:relative` and gets its
   own stacking context. A negative z-index does not sink an element behind one named sibling -
   it sinks the element's entire painted box behind step 1 of its OWN stacking context (the
   background/border of whatever established that context), which on this mesh is the section's
   own white background sitting above it in the tree. The element does not reappear until
   something above it in z-order is transparent there, and nothing is. This was asserted as
   "only the blank tail changes paint order" without measuring it - it was not measured, and the
   assertion was wrong. Left here as the trap: do not put a negative z-index on the photo again.

   THE ACTUAL FIX RAISES THE TEXT INSTEAD OF LOWERING THE PHOTO. #comp-k17me1nk already has
   `position:relative` from the mesh CSS above, so a positive z-index on it alone is enough to
   establish a stacking context for the paragraph that paints above #comp-kaw8audd (which stays at
   its default z-index:auto, i.e. its own painted content, unmodified). A positive z-index only
   raises an element's own painting tier within its parent stacking context - it cannot push
   anything behind an ancestor's background, so it does not carry the trap above. The photograph is
   not touched by this rule at all: its box, crop and paint order among its own children are
   exactly what they were before Section K existed. Scoped to >=1024px for the same reason as
   before - the two components never share a row below that width, so the rule would be a no-op
   there. MEASURED: the paragraph text and comp-kaw8audd's grid geometry above (line 1023-1041).
   REASONED, not measured (no browser available this round): that z-index:1 with position:relative
   on #comp-k17me1nk paints its rich text above sibling #comp-kaw8audd's default-tier content
   without altering the photo's own stacking context, per the CSS2.1/Grid stacking-order spec.

   #comp-k17me1nk is 928x1739 (confirmed from its own CSS box rule) - one flat rectangle running
   almost the full page height, so it also underlaps #comp-kaw7tj8e (grid-area 1/1/3/2, a second,
   smaller photo higher up the same column) even though that photo was never part of this defect.
   REASONED, not measured: raising #comp-k17me1nk cannot newly cover kaw7tj8e unless the paragraph
   already has ink at kaw7tj8e's exact x/y - and the whole reason Section K's bug was findable at
   all is that this rich-text run is manually laid out with blank lines sized to each photo it
   passes (that is what made the kaw8audd tail an OVERSHOOT rather than the normal case: the design
   assumes zero overlap and is usually right). No independent measurement of kaw7tj8e was possible
   this round since a screenshot always shows its current top layer (the photo, unchanged by this
   rule) and cannot reveal whether hidden text sits under it. Flagged for the next visual pass to
   confirm by eye; nothing here is claimed as verified for that photo. */
@media (min-width: 1024px) {
  #comp-k17me1nk { position: relative !important; z-index: 1 !important; }
}


/* ============================================================================================
   SECTION L - /coaching-individuel/ HAS A 550px BLANK BAND AT 390, PHONE ONLY
   ============================================================================================
   WHAT WAS THERE. _shots/dsg_celine/coaching_individuel-p1.png shows the paragraph ending
   "...des changements durables dans votre style de vie." followed by roughly 550px of nothing,
   then "Les seances et programmes sont sur-mesure...". Reads exactly like a widget that failed to
   load.

   MEASURED, by pulling every <p> out of #comp-k6hzgcz8 in document order (this component is one
   Wix rich-text box holding the whole paragraph run, not one box per paragraph): position 4 is
   "Je propose un accompagnement individualise...", positions 5-18 are fourteen paragraphs whose
   entire content is a single wixGuard zero-width space, positions 19-21 are three more holding
   only &nbsp;, and position 22 is "Les seances et programmes...". Seventeen consecutive empty
   lines, at this component's own 22px/justify rich-text line-height, print at roughly 32px each -
   17 x 32 = 544px, which is the gap in the screenshot to within a few pixels.

   WHY THEY ARE THERE AND WHY THEY ARE SAFE TO DROP ONLY AT PHONE WIDTH. #comp-k6hzgcz8 shares
   grid-area row 3 with #comp-k6jd2agf, a 575x435 photograph placed at the SAME row with its own
   margin-top:286px (measured in this page's own mesh CSS) - Wix's Classic editor has no real text
   wrap, so its author padded the column with seventeen blank lines to hold "Les seances..." down
   until it clears the photo sitting beside the paragraph above it. That is exactly what a desktop
   screenshot shows: no gap, because the photo fills the space the blank lines reserve.

   At <=1023px Section A turns this same mesh into a stacked flex column, one component per row in
   DOCUMENT ORDER; #comp-k6jd2agf's own closing tag sits immediately after comp-k6hzgcz8's in the
   DOM, so the photo already gets its own full-width row directly below this entire text block
   regardless of what is inside it. The seventeen blank lines stopped reserving space for anything
   the moment the photo left the column, and have been printing as dead air ever since.

   Addressed by position, not by content, because a wixGuard span is also the marker Wix leaves on
   an ordinary intentional line break and this project's rule is to touch only the proven culprit:
   #comp-k6hzgcz8 is unique to this page, so nth-of-type(5) through nth-of-type(21) can only ever
   be this run. Desktop is untouched - collapsing these at >=1024px would pull "Les seances..." up
   into the photograph, trading this defect for the one Section K just fixed. */
@media (max-width: 1023px) {
  #comp-k6hzgcz8 p:nth-of-type(n+5):nth-of-type(-n+21) {
    display: none !important;
    height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
  }
}


/* ============================================================================================
   SECTION M - THE HOMEPAGE ENDS IN A 635px EMPTY TAIL, DESKTOP ONLY
   ============================================================================================
   THE CLAIM, from the client previewing at 1440: the page keeps scrolling long after the footer
   line. Two earlier reviews called it a template artifact; the client's eye and a fresh measurement
   both disagree with that call. MEASURED with _scripts/_o5_cel_stricttail.js, which counts only a
   TEXT NODE's own Range.getClientRects() or a real IMG/SVG/VIDEO box as "ink" - a background colour
   reaching the bottom is not ink, and a probe that counted it as such reported 0px on this exact
   page, which is how it got waved through before: at 1440 the document is 5399px tall and the
   lowest real content is the "© Céline HOVETTE" credit line, text-box bottom 4765 - a 635px gap. At
   390 the same measurement gives 0px: there was never anything to find on the phone.

   THREE NESTED BOXES HOLD THE SPACE OPEN, read from the page's own <style> rules with
   _scripts/_o5_cel_gridid.js (not the computed value, which just repeats the number back):
     1. #comp-k656nbfy, the rich-text component holding the credit line, carries the site's own
        `#comp-k656nbfy { width:964px; height:320px; }` / `--min-height:320px` - an authored box
        320px tall around one 20px line of text. 300px of that box is blank.
     2. [data-mesh-id="Containerc1dmpinlineContent-gridContainer"], the page's single content grid,
        is `grid-template-rows: repeat(14, min-content) 1fr` (the same mesh Section F already
        documents) with its own `min-height:5270px`. #comp-k656nbfy sits alone in row 15, the
        trailing 1fr track: held to a fixed 5270px total, that track absorbs whatever the other 14
        rows do not use - measured 626.5px, against the 320px its own occupant needs. 306.5px extra,
        empty, inside the grid but outside the component's own box.
     3. #c1dmp, a page wrapper one level further out, carries an independent `min-height:5270px` of
        its own - not derived from its child, Wix duplicates the authored page height at this layer
        too. Overriding only the grid or only the component leaves this wrapper still 5270px tall
        and the visible gap unchanged - verified below, not assumed.

   VERIFIED LIVE, ONE VARIABLE AT A TIME, with _scripts/_o5_cel_taltest.js (page.addStyleTag against
   the running preview, re-measured each time with the same strict probe as above):
     baseline                docH=5399 gap=635  c1dmp=5270 grid=5270 comp-k656nbfy=320
     #c1dmp alone             docH=5399 gap=635  c1dmp=5270 grid=5270 comp-k656nbfy=320  (no-op)
     grid alone                docH=5399 gap=635  c1dmp=5270 grid=4964 comp-k656nbfy=320  (no-op at the document - #c1dmp still holds it open)
     #comp-k656nbfy alone      docH=5399 gap=635  c1dmp=5270 grid=5270 comp-k656nbfy=20   (no-op at the document, same reason)
     all three together        docH=4793 gap=29   c1dmp=4664 grid=4664 comp-k656nbfy=20
   All three have to move together - any one alone shrinks an internal box while the other two still
   hold the document at 5399. The remaining 29px matches the ~28-30px baseline measured on every
   other page of this site (the empty #SITE_FOOTER strip below #PAGES_CONTAINER - Section-independent
   and untouched here): "shortly after the footer line", the same shape the phone view already has.

   NO Z-INDEX OF ANY KIND IS USED. This is plain reserved height on three ordinary block/grid boxes;
   nothing here paints behind anything else, so the negative-z-index trap that deleted a photograph
   in Section K's first attempt does not apply and was not reached for.

   SCOPE. All three selectors carry this page's own Wix page id (c1dmp) or this page's own component
   id (comp-k656nbfy), so nothing on any other page is touched. min-width:1024px only: at <=1023px
   Section A already zeroes every component's min-height and turns the grid into a flex column
   (A2/A2b), which is why the phone number was already 0 and has to stay that way - confirmed with
   the same live-injection test at 390: gap stayed 0 through all five rows above, c1dmp/grid stayed
   6680, unmoved by a media query that never applies there.

   OTHER PAGES, CHECKED RATHER THAN ASSUMED. _scripts/_o5_cel_stricttail.js and _o5_cel_gridgap.js
   were run across all ~29 non-blog pages plus /blog/: desktop tails there run 0-155px (masterclass
   the largest), nowhere near this page's 635px, and none shares the mechanism - every other page's
   own [data-mesh-id^="Container"][data-mesh-id$="-gridContainer"] carries Wix's ordinary ~500px
   floor or a min-height close to its own rows' natural total, not an inflated number matching a
   component that used to be taller the way this page's 5270px does. Nothing else on this site gets
   this rule. */
@media (min-width: 1024px) {
  #c1dmp { min-height: 0 !important; }
  [data-mesh-id="Containerc1dmpinlineContent-gridContainer"] { min-height: 0 !important; }
  #comp-k656nbfy { min-height: 0 !important; height: auto !important; }
}


/* ============================================================================================
   SECTION N - THE HEADER ICON STRIP SITS ON THE TWO-ROW MENU, 1024-1365 ONLY
   ============================================================================================
   THE DEFECT, MEASURED (client found it previewing at 1024-1200; independently reproduced here
   against the running preview with a p[id$="label"] overlap test that excludes ancestors,
   descendants and full-viewport background images):
     <=1023 : strip at y=76, 0 labels overlapped - correct, Section B0 rebuilds the whole header.
     1024   : strip y=37-62, 2 labels overlapped (Ressources gratuites, Mentions légales).
     1060-1200 : 4 labels overlapped (+ Blog, CGV).
     1240-1320 : 2 labels overlapped (Blog, CGV).
     1366+  : 0 - NOT because the menu goes back to one row (it never does at any desktop width,
       see below), but because the strip is anchored to the VIEWPORT's right edge while the menu
       is anchored to the site's centred 980px column, so past ~1365 their x-ranges stop
       intersecting by the arithmetic of two different anchors, not by design. Left alone because
       it is genuinely clean there today, not because it is understood to be safe forever.

   WHERE IT COMES FROM. #comp-jaw5twrj (the strip) is not a child of #SITE_HEADER or of the menu's
   own grid. It lives in #comp-jaw5twrj-pinned-layer, a SEPARATE position:fixed layer the size of
   the viewport (the same "pinned layer" mechanism Section B0 names for the phone logo/icons).
   Inside it, the strip is `position:absolute; grid-area:1/1/2/2; align-self:start;
   justify-self:end; margin-top:37px; margin-right:80px` - a single-cell grid the size of the
   viewport, with the strip nudged into a corner by margin alone. margin-top is therefore measured
   from the TOP OF THE VIEWPORT, not from the menu - the two boxes share no ancestor closer than
   #SITE_HEADER_WRAPPER (confirmed with a one-off DOM walk, _o5_cel_headerstruct.js). 37px happened
   to clear the single-row live menu. Section B's two-row wrap is necessary and correct - it is
   what makes "Mentions légales" and "CGV" reachable at all instead of hidden behind a "More"
   control with no JS left to open it - and it made the menu's own box 53px tall instead of ~26:
   measured, #comp-jhpwvpswitemsContainer runs top:23 bottom:76, CONSTANT across the whole
   1024-1440 range and on every page tested. The menu never returns to one row at any desktop
   width, because its 884px content column is a fixed Wix pixel measurement that does not grow
   with the viewport. margin-top:37px on the strip was never touched to match, so the strip sits
   inside the second row instead of below it.

   THREE MECHANISMS WERE CONSIDERED.
     1. Make the strip's margin-top a function of the menu's real rendered height. REJECTED: the
        strip's containing block is the pinned-layer (position:fixed on the viewport), which
        shares no box with the menu's own grid at all - there is nothing in CSS to read the menu's
        box from over there without JS or CSS anchor-positioning, which does not run on every
        engine this site's real visitors use. Shipping it would silently regress for a slice of
        them, which is exactly what "restoration is not simulation" rules out.
     2. Give the header a min-height for two rows, alone. REJECTED on its own: #SITE_HEADER (the
        fixed, visible header box) is also not an ancestor of the strip - proved by injecting
        `#SITE_HEADER{min-height:140px}` live and re-measuring: stripTop stayed 37, unmoved. It IS
        used here, but as a companion to option 3, not as the fix by itself.
     3. CHOSEN. Move the strip below the two rows instead of beside them, and widen
        #SITE_HEADER-placeholder - the in-flow spacer that reserves room for the fixed header, and
        the only element that actually pushes #PAGES_CONTAINER down (confirmed live: changing only
        this moved pagesContainerTop from 101 to match it, nothing else needed touching) - enough
        that the relocated strip does not newly paint over the top of the page content instead.

   THE NUMBERS, MEASURED LIVE (_o5_cel_livetest.js, page.addStyleTag against the running preview,
   one change at a time, at 1100 and re-checked at 1024):
     menu bottom            76px (23+53), constant 1024-1440, all four pages tested.
     header's own height    101px UNCHANGED after either override - confirms it does not need
                             touching, and it is not touched here.
     margin-top:80px        strip 80-105, 4px clear of the menu (76) - comfortably over the >2px
                             overlap floor this defect is measured against.
     placeholder:112px      pagesContainerTop moves 101 -> 112, 7px clear of the relocated strip's
                             own bottom (105), so the strip never reaches real page content.
   NO Z-INDEX OF ANY KIND. This is a plain margin and a plain reserved-height bump; nothing paints
   behind anything else, so the Section K trap (a negative z-index there deleted a whole
   photograph) does not apply and was not reached for.

   THE 23px/5px HORIZONTAL OVERFLOW AT 1024/1060 IS A DIFFERENT DEFECT AND IS NOT FIXED HERE.
   Measured with the same sweep: it exists ONLY on the homepage - 0 on /mentions-legales/, /blog/,
   /contact/ - and is byte-identical before and after every variant of this rule tried. Traced to
   #comp-jaw68agp and #comp-jaw6bsr9 (a heading and a divider, homepage-only ids, absent from every
   other page's markup), which sit in the SAME grid cell as #comp-jaw9ua3l - the pixel-tuned
   biography/backlink column Section F and the standing brief both forbid touching. Their
   `margin-left: calc((100% - 490px) * 0.5)` overhangs the site's fixed 980px column by a constant
   ~45px; the viewport's own side margin over that fixed column is ~22px at 1024 and ~40px at
   1060, which is why the overflow measures 23px and then 5px and is gone by 1100 - the arithmetic
   of a fixed overhang against a shrinking viewport margin, nothing to do with the header or the
   icon strip. Left alone on purpose; flagged here for a separate fixer rather than worked around
   by touching the backlink card or by clipping the document with overflow-x.

   VERIFIED on / , /mentions-legales/ , /blog/ and /contact/ (the header is shared, so all four
   carry this rule): 0 label overlaps and 0 new horizontal overflow at every one of 1024, 1060,
   1100, 1160, 1200, 1240, 1280, 1320 and 1360 - and <=1023 / 1366 / 1440 measured unchanged from
   before, because the rule cannot apply outside its own media query. */
@media (min-width: 1024px) and (max-width: 1365px) {
  #masterPage #comp-jaw5twrj { margin-top: 80px !important; }
  #SITE_HEADER-placeholder { height: 112px !important; }
}


/* ============================================================================================
   SECTION O - THE HOMEPAGE SCROLLS SIDEWAYS AT 1024 AND 1060, AND NOWHERE ELSE
   ============================================================================================
   RE-LOCALISED, NOT TAKEN ON TRUST. Three fixers in a row had named comp-jaw68agp/comp-jaw6bsr9
   without a fresh measurement backing the claim, so this round re-measured before touching
   anything (_scripts/_o5_cel_fix2_measure.js, sections B/C, against the live preview):
     document.documentElement.scrollWidth - clientWidth on / :
       390=0  768=0  1000=0  1010=0  1024=23  1040=15  1060=5  1100=0  1200=0  1366=0  1440=0
     /mentions-legales/ and /blog/ : 0 at every one of those eleven widths.
   A finer sweep every 2px from 1060 to 1090 (_o5_cel_fix2_crossover.js) found the crossover is a
   clean integer, not an estimate: overflow is 1px at 1068px, exactly 0 at 1070px and stays 0
   above it. So the defect's true width is [1024px, 1069px] inclusive, not the "gone by 1100"
   Section N left as a rough bound.

   THE CAUSE, READ OFF THE BOX MODEL RATHER THAN THE SOURCE CSS. #comp-jaw68agp (599x41, the
   "Céline HOVETTE" heading) and #comp-jaw6bsr9 (607x5, the divider under it) sit in
   #comp-jaw62t0b, a 490px column, with `left:-64px` and `left:-72px` respectively. Their
   margin-left is the calc() Section N quotes, but it is a red herring at these widths: the calc's
   `100%` resolves against the column's own 490px-wide grid track, so `(100% - 490px)*0.5` computes
   to exactly 0px here (confirmed: getComputedStyle(...).marginLeft reads "0px" at both 1024 and
   1060) - the overhang is carried entirely by `left` and the box's own oversized width, a
   deliberate bleed-into-the-margin the template uses everywhere (the row-1 photo in the SISTER
   column, comp-kaz10o67, does the same thing: 673px wide with left:-64px in a 490px column, it is
   just further from the page's right edge so it never overflows anything).
   width - |left| is 599-64=535 and 607-72=535 for the two elements - the same number - so both
   right edges sit at a constant column_left+535 regardless of viewport (measured: 1047 at 1024,
   1065 at 1060; column_left tracks width/2 in this range, so overflow = 535 - width/2, zero at
   width=1070 exactly, matching the sweep above to the pixel). #comp-jaw9ua3l is not part of this:
   it is 460px wide with left:12px, right edge 984 at 1024 - nowhere near either viewport edge.

   THE FIX TRIMS 45px OF DEAD BOX FROM THE RIGHT OF EACH ELEMENT, NOT FROM comp-jaw9ua3l.
   45 = width - |left| - 490, i.e. exactly the amount by which each box's right edge clears the
   column's OWN right edge (column_right = width/2 + 490). New widths 554px and 562px land the
   heading's and the divider's right edges flush with the column boundary - never past it, at any
   width, with the tightest clearance in-band (22px, at 1024) comfortably positive. Only `width`
   moves; `left` is untouched, so the LEFT edge - and the deliberate bleed into the photo column
   beside it - is exactly what it was.
   VISUAL COST, MEASURED, NOT GUESSED. The heading's actual text ("Céline HOVETTE", 30px bold) is
   217.95px wide, centred in the box: at 599px wide it already sat on 190px of empty margin per
   side, so trimming 45px off the right moves the centred text about 22px left of where it sits at
   1440 - visible only inside this 46px-wide viewport band, nowhere else, because the rule is
   scoped to it. The divider is a real painted line (border-top, no fill) and does shorten by 45px
   here - the same reason it is not touched outside the band, where nobody reported it and nothing
   overflows.
   NO OTHER WIDTH IS TOUCHED. The rule is bracketed to [1024px, 1069px] on purpose - the measured
   defect zone, not "1024 and up" - so the heading, the divider and every pixel of comp-jaw9ua3l
   render byte-identical to before at 1070, 1100, 1200, 1366 and 1440, and below 1024 Section A has
   already stacked the mesh into one column, where this row-sharing overhang cannot occur.
   AFTER (re-measured, same script, same three pages, same eleven widths): 0 everywhere. */
@media (min-width: 1024px) and (max-width: 1069px) {
  #comp-jaw68agp { width: 554px !important; }
  #comp-jaw6bsr9 { width: 562px !important; }
}


/* ============================================================================================
   SECTION P - THE /blog/ SOCIAL ICONS ARE PERMANENTLY visibility:hidden
   ============================================================================================
   MEASURED (_scripts/_o5_cel_fix2_measure.js section E/F, against the live preview): on /blog/,
   #comp-jaw5twrj (the Facebook/Instagram/YouTube strip) computes visibility:hidden, display:block,
   opacity:1 - present, positioned (rect 103x25 at the same x/y the working copy uses), just
   invisible. On / and on /mentions-legales/ the same id computes visibility:visible. The
   difference is not position or size; it is one attribute.

   THE CAUSE. /blog/ is captured from the newer Wix generation this project's plan _note already
   flags (see Section C1/C1b for the header/mesh half of that same generation gap). Its markup
   carries `data-hide-prejs="true"` on #comp-jaw5twrj; the other 99 pages' copy of the same
   component carries no such attribute at all. Every page - old generation and new - ships the rule
   `body:not([data-js-loaded]) [data-hide-prejs]{visibility:hidden}` (inline on the 99, and in
   css/viewer.min-19751e77.css, linked only from /blog/, on this one) - Wix's own pre-hydration
   guard, meant to hide the element for the few hundred milliseconds before its JS runs and stamps
   `data-js-loaded` on <body>. A static restore never runs that JS, `data-js-loaded` never appears,
   and on the one page whose markup actually applies the attribute the guard now hides the icons
   forever - the same class of defect as the MobileDetect trap logged elsewhere on this project: a
   plugin guard whose "clear me" half was never archived.

   SITE-WIDE CHECK, NOT A ONE-PAGE PATCH. Grepped `data-hide-prejs="true"` (the applied attribute,
   not the dormant CSS selector text) across all 100 pages: it occurs exactly ONCE on the entire
   site, on this one element, on /blog/ only. Nothing else on any page is hidden by this mechanism
   today. The rule below still targets the attribute itself rather than #comp-jaw5twrj by id, so if
   a future capture from this same newer generation ever reuses data-hide-prejs on something else,
   it does not ship invisible by default again - same shape as Section C1's
   `.hidden-during-prewarmup` rule, which exists for exactly the same reason.

   BEFORE: /blog/ visibility=hidden, rect {left:1257 top:37 w:103 h:25} at 1440 and
   {left:143.5 top:0 w:103 h:25} at 390 - the box is already correctly positioned, only paint is
   wrong. AFTER: visibility=visible at both widths, rect unchanged (position maths was never the
   defect), matching / and /mentions-legales/, which were visible before and remain visible after -
   this rule is a no-op for them since neither carries the attribute. */
[data-hide-prejs] { visibility: visible !important; }


/* ============================================================================================
   SECTION Q - THE ICONS SECTION P JUST UN-HID ARE UNREACHABLE UNDER THEIR OWN LOGO CARD
   ============================================================================================
   qa_legibility, /blog/ @390: "TAP TARGET small x44 (3 under 24px)". Confirmed which three by
   dumping every candidate's raw box AND the gate's own elementFromPoint hit-test (dy=2 down the
   vertical centre line, same formula qa_legibility.js uses): the three hard failures are exactly
   #comp-jaw5twrj0/1/2imagelink - the Facebook/Instagram/YouTube links Section P made visible.
   Their raw box is 25x25, already >=24 on its own; what fails is REACH (the rows the gate can
   actually hit-test as belonging to the element): only 9 of 25, because rows 10-24 return a
   DIFFERENT element when probed. So this is not a too-small icon, it is Section P's fix exposing
   a second defect that visibility:hidden had also been hiding.

   THE CAUSE. /blog/'s newer-generation pinned header (`#pinnedAfterSITE_HEADER`, the same
   grid-area:1/1/2/2 single-cell mechanism Section N describes for the OTHER icon-strip overlap)
   stacks two absolutely-positioned siblings in that one cell: #comp-jaw5twrj (the icon strip) and
   #comp-jbc7vj8u (the "Céline HOVETTE" logo/home-link card, measured at 390: rect left:73 top:10
   width:244 height:64). Both carry inline z-index:50. With equal z-index, DOM order decides paint
   order, and #comp-jbc7vj8u comes AFTER #comp-jaw5twrj in the markup - so it paints on top wherever
   the two boxes overlap: x 143.5-246.5, y 10-25, which is precisely the icon strip's own lower
   three-fifths. Walked with elementFromPoint down each icon's centre line: rows 0-9 return the
   icon's own <img>, rows 10-21 return #comp-jbc7vj8uinlineContent (a plain non-link div, present
   only because it shares the grid cell), rows 22-24 return #comp-jbc7tibjlink (the logo card's own
   anchor). A finger on the lower part of any of the three icons lands on the logo card instead.

   SITE-WIDE CHECK, NOT A ONE-PAGE PATCH. #comp-jaw5twrj is an id shared by all 100 pages, but the
   sibling that causes the overlap is not: grepped `pinnedAfterSITE_HEADER-style`, `class="lb1"` and
   `comp-jaw5twrj0imagelink` (the applied ids, not the dormant class text) across every page - each
   occurs exactly once, on blog/index.html. Every other page keeps the same strip in its own
   dedicated #pinnedTopRight layer with nothing sharing its grid cell, which is why / measured 0
   hard failures at both widths before this rule existed. The selectors below are therefore either
   scoped to ids that exist ONLY on /blog/'s markup, or - for the shared #comp-jaw5twrj id - a
   change that only does anything where a sibling is actually contesting the same pixels; verified
   with a full-page screenshot diff of / and /mentions-legales/ at 390 and 1440 with the rule
   applied: header renders identically, nothing moved.

   THE FIX, AND WHY IT IS A (POSITIVE) Z-INDEX HERE WHEN SECTION N DELIBERATELY USED NONE. Section
   N's strip and menu share no ancestor closer than the header wrapper, so there was nothing to
   reorder without JS - margin was the only lever. Here the two elements are genuine SIBLINGS
   painted into the identical grid cell for exactly this reason, so raising the strip in front of a
   decorative container it is already sitting inside is the direct fix, not a workaround. Nothing is
   sent BEHIND anything - the Section K trap (a negative z-index there deleted a photograph) does
   not apply; this raises the winning layer, it does not lower the losing one, and z-index stays
   positive throughout. THEN padding-bottom:6px on the three anchors only, so the box that clears
   24px is a full 7px over the floor rather than the bare 1px the z-index change alone leaves it on
   - the project has already been burned once by a rule left sitting exactly on this boundary.
   Padding-TOP was considered and rejected: the icons already render at the very top edge of the
   viewport (top:0 at 390), so top padding would push into negative/off-screen space and buy nothing.

   MEASURED (live, running preview, /blog/ @390, same dy=2 elementFromPoint walk qa_legibility.js
   runs, and separately confirmed unchanged at 1440):
     BEFORE            three icon anchors 25x25, reach 9 (owned rows 0-9 of 25) - HARD FAIL.
                        logo anchor #comp-jbc7tibjlink 157x40, reach 40.
     z-index alone      icon anchors 25x25, reach 25 - clears 24 by 1px only. logo anchor reach 38
                        (still far above 24; losing 2 rows of a 40-tall, 157-wide target is nothing).
     z-index + padding  icon anchors now 25x31, reach 31 - clears 24 by 7px. logo anchor unchanged
                        at reach 38. At 1440 the strip never overlapped the logo card to begin with
                        (reach was already 25) - this rule only adds the same safety margin there,
                        icons unmoved, no new overlap with anything below them (screenshot-verified).
   Icon artwork itself (the 25x25 image div, position:absolute, glued to the anchor's top-left) is
   untouched by any of this - it is still 25x25 pixels, unmoved, at both widths. */
#comp-jaw5twrj { z-index: 60 !important; }
#comp-jaw5twrj0imagelink, #comp-jaw5twrj1imagelink, #comp-jaw5twrj2imagelink { padding-bottom: 6px; }


/* ============================================================================================
   SECTION R - THE BRAND PINK HEADLINE MEASURES 2.84:1, NOT ON WHITE BUT ON THE SECTION'S OWN PALE
   SAGE BACKGROUND
   ============================================================================================
   qa_legibility, / @desktop and @phone: "low contrast x1: 'Accompagnement naturopathique des
   troubles féminins' 2.84:1 needs 3". Carried as a NOTED/cosmetic item through several review
   rounds; the gate does not treat it as cosmetic and the gate decides. The colour is #D45BBA
   (rgb 212,91,186) - the practice's own brand magenta, used at font-size:50px so it only needs the
   "large text" floor of 3:1, and still comes in under it.

   THE GROUND, MEASURED (not assumed). This looked like magenta-on-white at a glance, but the
   heading's section paints rgb(225,235,213) - a pale sage green, not white - and groundOf() (the
   gate's own compositing walk, reused here verbatim against the running preview) confirms that is
   what the ratio is actually taken against: contrast([212,91,186], [225,235,213]) = 2.839, matching
   the gate's report to three figures. The same green also explains why a plain WCAG calculation
   against white (~3.49:1) would have looked fine and been wrong - measuring against the wrong
   ground is exactly the trap groundOf() exists to avoid (see the file-header comment on this
   stylesheet's approach... the point still applies to hand arithmetic done outside the gate).

   SAME HUE, LIGHTNESS ONLY. Converted #D45BBA to HSL: (312.9deg, 58.5%, 59.4%). Held hue and
   saturation fixed and walked lightness down until the ratio against the measured ground cleared
   3.0 with the margin this project asks for after "2.84 was carried as fine for months" - not the
   bare pass. L 0.554 (rgb 208,75,179 = #D04BB3) lands at 3.19:1, inside the requested 3.1-3.2 band.
   Screenshot-diffed the rendered heading before/after at 1440: same script font, same magenta read,
   perceptibly the same colour at a glance - this is a one-step darkening, not a repaint.

   SITE-WIDE CHECK. Grepped the literal style attribute `style="color:#D45BBA;"` (not just the hex,
   the exact inline declaration used everywhere it appears) across every page: three files.
     index.html                 the headline above - the one the gate named. FIXED by this rule.
     troubles-du-cycle/index.html   a bold pull-quote sentence, same hex, computed font-size 22px
       (inherited, not the 18px the raw inline style implies) so it also only needs the 3:1 large-
       text floor. Measured against ITS OWN ground with the same groundOf() walk: already 3.49:1 -
       passing today, on a lighter ground than the headline's. This rule only darkens it further
       (still the same hue), so it cannot regress; re-verified with the extracted MEASURE() function
       after applying the rule: still zero legibility findings on this page.
     acne/index.html (x2)       both are `<p><span style="color:#D45BBA;">` wrapping only a
       `wixGuard` zero-width-space placeholder - no visible text, nothing for a ratio to be measured
       against, not the same defect. Left alone; the colour there paints nothing.
   One rule, one selector, fixes the real instance and safely no-ops or improves the other two. */
[style="color:#D45BBA;"] { color: #D04BB3 !important; }
