/*
 * naturalex.shop — Oxatis desktop-site theme override (throwaway at the switch to Odoo).
 *
 * SCOPE: every rule is prefixed `html.nx`. The class is added by naturalex.js. The preview
 * gate (cookie nx_preview=1) was REMOVED on 2026-09-20 with owner approval, so the class is
 * now added for every visitor and this file is live. To stage again, restore the gate line in
 * naturalex.js; the offline preview harness sets the cookie either way and is unaffected.
 *
 * Scope: the DESKTOP template only (#maincontainer.sccatalog / .webblock / .scshopcart /
 * .subscribe / .userlogin). Oxatis serves phones a separate mobile site that this file
 * never reaches. Selectors come from theme/fixtures/{fr,de}/*.html (19 Sept 2026).
 * Tokens: theme/TOKENS.md (Naturalex green, owner decision 2026-09-19).
 * Row numbers refer to the 146-row revamp list (docs/revamp/REVAMP_PLAN.md).
 */

/* ---------- Tokens + one font, one green, one promo colour — rows 107–111 ---------- */
html.nx {
  /* Naturalex green (owner 2026-09-19) — values and contrast ratios in theme/TOKENS.md */
  --nx-ink: #1c2a1f;
  --nx-ink-deep: #0e2e17;
  --nx-accent: #08571c;
  --nx-accent-hover: #2a7d32;
  --nx-accent-alt: #b8e986;
  --nx-accent-wash: #eaf4ea;
  --nx-bg: #f5f7f4;
  --nx-surface: #ffffff;
  --nx-surface-strong: #edf1ec;
  --nx-muted: #55645a;
  --nx-line: #d5ded5;
  --nx-promo: #f39c12;
  --nx-radius-frame: 16px;
  --nx-radius-card: 8px;
  --nx-radius-pill: 999px;
  --nx-shadow-soft: 0 2px 8px rgba(14, 46, 23, .04);
  --nx-shadow-mid: 0 8px 28px rgba(14, 46, 23, .08);
  --nx-shell: 1440px;
  --nx-control: 44px;
  --nx-font: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --nx-fs-xs: .75rem;
  --nx-fs-sm: .875rem;
  --nx-fs-base: 1rem;
  --nx-fs-lg: 1.25rem;
  --nx-fs-2xl: clamp(1.75rem, 3vw, 2.5rem);
  --nx-motion: 140ms;
  --nx-gutter: clamp(16px, 2.5vw, 32px);
  font-family: var(--nx-font); /* beats the Block <HEAD> rule html{font-family:"Arial Black"} */
}
html.nx body {
  font-family: var(--nx-font);
  color: var(--nx-ink);
  background: var(--nx-bg);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
/* Helvetica, Lato and Open Sans are set on many Oxatis elements; bring text back to the one family (Lato).
   Icon glyphs (Font Awesome / ox-iconfont) set their own family on ::before and are untouched. */
html.nx #maincontainer :is(h1, h2, h3, h4, p, a, span, div, td, th, li, label, input, select,
  textarea, button, font, small, strong, b):not([class*="fa-"]):not([class*="iconfont"]),
html.nx .nx-topstrip, html.nx .nx-topstrip * {
  font-family: var(--nx-font);
}
html.nx #maincontainer :is(h1, h2, h3, .PBSTitle, .PBCatTitle, .PBItemTitle) {
  color: var(--nx-ink);
  font-weight: 700;
  letter-spacing: -.025em;
  overflow-wrap: anywhere;
}
html.nx #maincontainer a { color: var(--nx-accent); }
html.nx #maincontainer a:hover { color: var(--nx-accent-hover); }

/* ---------- Focus + motion — rows 107–111 ---------- */
html.nx :focus-visible {
  outline: 3px solid var(--nx-accent) !important;
  outline-offset: 3px;
}
@media (prefers-reduced-motion: reduce) {
  html.nx *, html.nx *::before, html.nx *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ---------- Full width up to 1440 px — row 9 ---------- */
html.nx #bodyarea,
html.nx .container--content-width,
html.nx #hmenu,
html.nx #fmenu,
html.nx .viewtbl:not(.viewtblsplitted) {
  max-width: var(--nx-shell);
  min-width: 0;
  box-sizing: border-box;
}
html.nx #bodyarea { margin: 0 auto; padding: 0 var(--nx-gutter); }
html.nx #bodycolumn2 { max-width: none; flex: 1 1 auto; min-width: 0; }
html.nx .viewtbl:not(.viewtblsplitted) { width: 100%; }

/* ---------- Top strip: one slim line — rows 8, 23–24 ----------
   naturalex.js moves .cgv-bar (Block début <BODY>) into .nx-topstrip. Wave 1 merged the old
   grey ribbon and orange pro banner into that single bar, so .b2b-banner no longer exists on
   any page (checked FR and DE, 2026-09-20) and nothing here refers to it any more. */
html.nx .nx-topstrip {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 2px 24px;
  padding: 3px var(--nx-gutter);
  background: var(--nx-ink-deep);
  color: #fff;
  font-size: var(--nx-fs-xs);
  line-height: 18px;
}
html.nx .nx-topstrip .cgv-bar,
html.nx .nx-topstrip .cgv-bar__content {
  display: block; margin: 0; padding: 0; border: 0; width: auto; min-height: 0; height: auto;
  background: none; box-shadow: none; font: inherit; color: inherit; text-align: left;
}
html.nx .nx-topstrip .cgv-bar__list {
  display: flex; flex-wrap: wrap; gap: 0 18px; margin: 0; padding: 0; list-style: none;
}
html.nx .nx-topstrip .cgv-bar__list li { margin: 0; padding: 0; font: inherit; color: inherit; border: 0; }
html.nx .nx-topstrip .cgv-bar__list li::before,
html.nx .nx-topstrip .cgv-bar__list li::after { content: none; }
html.nx .nx-topstrip strong { font-weight: 700; color: #fff; }
html.nx .nx-topstrip a { color: #fff; text-decoration: underline; font-weight: 600; }

/* ---------- Slim sticky header: logo · search · account · cart — rows 6, 20–22, 25–26 ---------- */
html.nx #headercontainer {
  position: sticky;
  top: 0;
  z-index: 50;
  background: var(--nx-surface);
  border-bottom: 1px solid var(--nx-line);
  box-shadow: var(--nx-shadow-soft);
}
html.nx .header-main__container { padding: 0; margin: 0; background: var(--nx-surface); }
html.nx .header-main__inner {
  max-width: var(--nx-shell);
  margin: 0 auto;
  padding: 4px var(--nx-gutter) !important;
}
html.nx .header-main__inner > .l-ox-grid {
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: 16px 24px;
  margin: 0;
}
html.nx .header-main__inner > .l-ox-grid > [class*="l-ox-grid__col"] {
  flex: 0 0 auto; width: auto; max-width: none; padding: 0; margin: 0;
}
html.nx .header-main__inner > .l-ox-grid > .header-brand__container { order: 1; text-align: left; }
html.nx .header-main__inner > .l-ox-grid > .header-shop-search__container { order: 2; flex: 1 1 auto; min-width: 0; }
html.nx .header-main__inner > .l-ox-grid > .header-user-menu__container { order: 3; }
html.nx .header-brand__inner {
  display: flex; flex-direction: row; align-items: center; gap: 12px; text-align: left; padding: 0; margin: 0;
}
html.nx .header-logo__inner, html.nx .header-logo__inner a { display: block; margin: 0; padding: 0; }
html.nx .header-logo__inner img { display: block; height: 44px; width: auto; max-width: none; }
html.nx #headertext {
  max-width: 15rem; margin: 0; padding: 0;
  font-size: var(--nx-fs-xs); line-height: 1.3; color: var(--nx-muted); text-align: left;
}
html.nx .header-brand__inner #langflags { margin: 0; padding: 0; width: auto; }
html.nx .header-brand__inner #langflags ul { display: flex; gap: 6px; margin: 0; padding: 0; }
html.nx .header-shop-search__inner { margin: 0; padding: 0; }
html.nx #headerSearchBlock { max-width: 640px; width: 100%; margin: 0 auto; }
html.nx #headerSearchBlock form { display: flex; align-items: stretch; margin: 0; }
html.nx #headerSearchText {
  flex: 1 1 auto; min-width: 0; width: 100%;
  height: var(--nx-control); box-sizing: border-box;
  padding: 0 14px; margin: 0;
  border: 1px solid var(--nx-line); border-right: 0;
  border-radius: var(--nx-radius-card) 0 0 var(--nx-radius-card);
  background: var(--nx-bg); color: var(--nx-ink); font-size: var(--nx-fs-base);
}
html.nx #headerSearchBlock .blockbtn {
  position: static; flex: 0 0 auto;
  min-width: var(--nx-control); height: var(--nx-control); margin: 0; padding: 0 14px;
  border: 1px solid var(--nx-accent); border-radius: 0 var(--nx-radius-card) var(--nx-radius-card) 0;
  background: var(--nx-accent); color: #fff; font-weight: 600; cursor: pointer;
}
html.nx .header-user-menu__inner > .l-ox-grid { display: flex; gap: 16px; align-items: center; margin: 0; }
html.nx .header-user-menu__inner [class*="l-ox-grid__col"] { padding: 0; }
html.nx .header-account__inner a, html.nx .header-shop-cart__inner a { color: var(--nx-ink); text-decoration: none; }
html.nx #headercontainer .header-account__inner, html.nx #headercontainer #headerInfoCart.header-shop-cart__inner {
  width: auto; min-width: 0; height: auto; min-height: 0; padding: 0; margin: 0; flex-wrap: nowrap;
  display: flex; flex-direction: row; align-items: center; gap: 6px; font-size: var(--nx-fs-sm);
}
html.nx #headercontainer .accountLink:before, html.nx #headercontainer .cartLink:before { font-size: 22px; margin: 0; color: var(--nx-accent); }
html.nx #headercontainer .header-shop-cart__shop-cart { line-height: 1.2; }
html.nx .header-account__inner a, html.nx .header-shop-cart__inner a {
  display: inline-flex; flex-direction: row; align-items: center; gap: 6px; height: auto; min-height: var(--nx-control);
}

/* Main menu row */
html.nx #headermenu { background: var(--nx-surface); border-top: 1px solid var(--nx-line); margin: 0; padding: 0; }
html.nx #hmenu {
  margin: 0 auto; padding: 0 var(--nx-gutter);
  background: transparent; display: flex; flex-wrap: wrap; align-items: stretch; justify-content: flex-start; gap: 0 4px;
}
html.nx #hmenu li.begin, html.nx #hmenu li.end, html.nx #hmenu li.misep { display: none; }
html.nx #hmenu li { background: none; border: 0; margin: 0; padding: 0; flex: 0 0 auto; }
html.nx #hmenu a.menu {
  display: inline-flex; align-items: center; min-height: 40px; padding: 0 12px;
  color: var(--nx-ink); background: none; font-size: var(--nx-fs-sm); font-weight: 600;
  text-transform: none; border-radius: var(--nx-radius-card);
}
html.nx #hmenu a.menu:hover { color: var(--nx-accent-hover); background: var(--nx-accent-wash); }
html.nx .nx-menu-toggle { display: none; }
/* Rows 27-28: menu entries that lead nowhere, marked .nx-hide by naturalex.js. They stay in the
   Oxatis menu editor; only the theme hides them, so rollback is removing the include. */
html.nx #hmenu li.nx-hide { display: none !important; }

/* Narrow desktop windows (< 900 px): menu behind a button, search full width — rows 6, 10, 34 */
@media (max-width: 899.98px) {
  html.nx .header-main__inner > .l-ox-grid { flex-wrap: wrap; gap: 8px 12px; }
  html.nx .header-main__inner > .l-ox-grid > .header-brand__container { flex: 1 1 auto; }
  html.nx .header-main__inner > .l-ox-grid > .header-shop-search__container { order: 3; flex: 1 1 100%; }
  html.nx .header-main__inner > .l-ox-grid > .header-user-menu__container { order: 2; }
  html.nx #maincontainer select { max-width: 100%; }
  html.nx #headertext { display: none; }
  html.nx .header-logo__inner img { height: 36px; }
  html.nx .nx-menu-toggle {
    display: inline-flex; align-items: center; gap: 8px;
    min-height: var(--nx-control); margin: 4px var(--nx-gutter); padding: 0 14px;
    border: 1px solid var(--nx-line); border-radius: var(--nx-radius-card);
    background: var(--nx-surface); color: var(--nx-ink); font: 600 var(--nx-fs-sm)/1 var(--nx-font);
    cursor: pointer;
  }
  html.nx .nx-menu-toggle::before { content: "\2630"; font-size: 1.1rem; }
  html.nx #hmenu { display: none; }
  html.nx.nx-menu-open #hmenu { display: flex; flex-direction: column; padding-bottom: 8px; }
  html.nx.nx-menu-open #hmenu a.menu { width: 100%; min-height: var(--nx-control); }
}

/* ---------- Page chrome that repeats the header — rows 59–60 ---------- */
html.nx #maincontainer.sccatalog tr.viewTitle .PBCompTitle,
html.nx #maincontainer.sccatalog #btnsearch,
html.nx #maincontainer.sccatalog #btnviewcart { display: none; }

/* Sub-category buttons as pills */
html.nx ul.subcatlist { display: flex; flex-wrap: wrap; gap: 8px; padding: 0; margin: 8px 0 16px; }
html.nx ul.subcatlist li { margin: 0; padding: 0; float: none; }
html.nx ul.subcatlist a.PBLink {
  display: inline-flex; align-items: center; min-height: 36px; padding: 0 14px;
  border: 1px solid var(--nx-line); border-radius: var(--nx-radius-pill);
  background: var(--nx-surface); color: var(--nx-ink); text-decoration: none; font-size: var(--nx-fs-sm);
}
html.nx ul.subcatlist a.PBLink:hover { border-color: var(--nx-accent); background: var(--nx-accent-wash); }
html.nx ul.subcatlist .PBMainTxt { font-size: inherit; color: inherit; }

/* ---------- Product grid replacing the 3-per-row table — rows 5–8, 10, 42 ----------
   Markup: tr.viewItemList > td > table.datatbl > tr.viewItemList__row (3 per row) > td.oxcell.
   The row wrappers become display:contents so all 18 cells flow into one grid. */
html.nx #maincontainer.sccatalog table.datatbl {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px;
  width: 100%;
  border: 0;
}
@media (min-width: 900px)  { html.nx #maincontainer.sccatalog table.datatbl { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } }
@media (min-width: 1200px) { html.nx #maincontainer.sccatalog table.datatbl { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 1440px) { html.nx #maincontainer.sccatalog table.datatbl { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
/* style.css forces .viewItemList__row to display:flex !important, so !important is needed here. */
html.nx #maincontainer.sccatalog table.datatbl > tbody,
html.nx #maincontainer.sccatalog table.datatbl tr.viewItemList__row { display: contents !important; }

/* Search results: #searchAnswers > a.oxcell — same grid */
html.nx #maincontainer div#searchAnswers {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 0;
}
html.nx #maincontainer div#searchAnswers .oxcell { max-width: none; margin: 0; }
@media (min-width: 900px)  { html.nx #maincontainer div#searchAnswers { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } }
@media (min-width: 1200px) { html.nx #maincontainer div#searchAnswers { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 1440px) { html.nx #maincontainer div#searchAnswers { grid-template-columns: repeat(5, minmax(0, 1fr)); } }

/* Brand pages (page builder, menu "NEW"): 4 fixed columns become the same responsive grid */
html.nx .ox-products .l-ox-row__inner {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 0;
}
@media (min-width: 900px)  { html.nx .ox-products .l-ox-row__inner { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } }
@media (min-width: 1200px) { html.nx .ox-products .l-ox-row__inner { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 1440px) { html.nx .ox-products .l-ox-row__inner { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
html.nx .ox-products .ox-product { width: auto; max-width: none; flex: none; padding: 0; }
html.nx .ox-products .ox-product > .sectiondata,
html.nx .ox-products .ox-product > .sectiondata > .sectiondataarea { height: 100%; margin: 0; padding: 0; }

/* ---------- One card design: image → name → price → pack line → one button — rows 47–58 ---------- */
/* #maincontainer in the selector: style.css sets .oxcell[width="33%"]{width:33.33%!important}. */
html.nx #maincontainer td.oxcell,
html.nx #maincontainer #searchAnswers a.oxcell,
html.nx #maincontainer .ox-product .oxcell {
  display: flex;
  flex-direction: column;
  min-width: 0;
  width: auto !important;
  height: auto !important;
  margin: 0;
  padding: 12px;
  box-sizing: border-box;
  background: var(--nx-surface);
  border: 1px solid var(--nx-line);
  border-radius: var(--nx-radius-card);
  text-decoration: none;
  color: var(--nx-ink);
  transition: border-color var(--nx-motion) ease, box-shadow var(--nx-motion) ease;
}
html.nx .ox-product .oxcell { height: 100% !important; }
html.nx td.oxcell:hover,
html.nx #searchAnswers a.oxcell:hover,
html.nx .ox-product .oxcell:hover { border-color: var(--nx-accent); box-shadow: var(--nx-shadow-mid); }
/* cellUniformizer.js writes equal inline heights; the grid already aligns rows. */
html.nx #maincontainer td.oxcell .sectiondata,
html.nx #maincontainer td.oxcell .sectiondataarea { height: auto !important; min-height: 0 !important; margin: 0; padding: 0; border: 0; background: none; box-shadow: none; }
html.nx td.oxcell .sectiondata { flex: 1 1 auto; display: flex; flex-direction: column; }
html.nx td.oxcell .sectiondataarea { flex: 1 1 auto; display: flex; flex-direction: column; gap: 6px; }
html.nx td.oxcell .sectiondataarea table,
html.nx td.oxcell .sectiondataarea tbody,
html.nx td.oxcell .sectiondataarea tr,
html.nx td.oxcell .sectiondataarea td { display: contents; }

html.nx .oxcell .PBItemImg { order: 1; margin: 0 0 6px; text-align: center; }
html.nx .oxcell .PBItemName { order: 2; text-align: left; }
html.nx .oxcell .PBItemSku { order: 3; text-align: left; }
html.nx .oxcell .PBItemPrice { order: 4; text-align: left; margin-top: auto; padding-top: 6px; }
html.nx .oxcell .PBItemPackQTY { order: 5; text-align: left; }
/* Stock message ("En stock" / "In stock") is not part of the card: owner ruling 2026-09-18,
   everything is buyable at zero and no page shows a stock level. */
html.nx #maincontainer .oxcell .PBItemStock { display: none; }
html.nx .oxcell .PBItemButtons { order: 7; text-align: left; padding-top: 6px; }
html.nx #searchAnswers .oxcell > * + * { margin-top: 6px; }

/* Image: square box, file shown at most at its real 175 px (no blurry upscaling) */
html.nx .oxcell .PBItemImg a, html.nx .oxcell .ox-product-img { display: block; }
html.nx .oxcell .PBItemImg img {
  display: block; margin: 0 auto;
  width: 100%; max-width: 175px; height: auto; aspect-ratio: 1 / 1; object-fit: contain;
}
/* Name: first text, 3 lines max, full name in the link title */
html.nx .oxcell .PBItemName a { color: var(--nx-ink); text-decoration: none; }
html.nx .oxcell .PBItemName :is(h3, .PBMainTxt), html.nx #searchAnswers .PBItemName {
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;
  margin: 0; font-size: var(--nx-fs-sm); font-weight: 600; line-height: 1.35; color: var(--nx-ink);
  letter-spacing: 0;
}
html.nx .oxcell .PBItemSku, html.nx .oxcell .PBItemSku * {
  font-size: var(--nx-fs-xs); color: var(--nx-muted);
}
/* Price: sales price, then struck price, then a whole-number badge (JS rounds it) */
html.nx #maincontainer .oxcell :is(.PBItemPrice, .PBCurrency, .PBItemPackQTY, .PBItemSku, .PBItemName, .PBItemButtons) { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; }
html.nx .oxcell .PBCurrency {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; justify-content: flex-start;
}
html.nx .PBCurrency .PBSalesPrice {
  order: 1; font-size: var(--nx-fs-lg); font-weight: 700; color: var(--nx-ink);
  font-variant-numeric: tabular-nums;
}
html.nx .PBCurrency .PBStrike {
  order: 2; display: inline; font-size: var(--nx-fs-sm); color: var(--nx-muted);
  text-decoration: line-through;
}
html.nx .PBCurrency .PBDiscount {
  order: 3; display: inline-block; padding: 1px 8px; border-radius: var(--nx-radius-pill);
  background: var(--nx-promo); color: var(--nx-ink); font-size: var(--nx-fs-xs); font-weight: 700;
}
html.nx #searchAnswers .PBItemPrice .PBCurrency { font-size: var(--nx-fs-lg); font-weight: 700; color: var(--nx-ink); }
/* Pack line: "prix à la pièce · carton de 8" (rewritten by JS) */
html.nx .oxcell .PBItemPackQTY, html.nx .oxcell .PBItemPackQTY * {
  font-size: var(--nx-fs-xs); color: var(--nx-muted);
}
/* One button: the card itself links to the product, so "Détails" goes */
html.nx .oxcell .btndetail, html.nx .oxcell .btnsep { display: none !important; }
html.nx .oxcell .PBItemButtons .btnaddtocart { width: 100%; }

/* Shared button look (primary = green) */
html.nx #maincontainer a.btnaddtocart,
html.nx #maincontainer a.btnmain {
  display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box;
  min-height: var(--nx-control); padding: 0 16px; margin: 0;
  border: 1px solid var(--nx-accent); border-radius: var(--nx-radius-card);
  background: var(--nx-accent); color: #fff; text-decoration: none; font-weight: 600;
  font-size: var(--nx-fs-sm); box-shadow: none;
}
html.nx #maincontainer a.btnaddtocart:hover,
html.nx #maincontainer a.btnmain:hover { background: var(--nx-accent-hover); border-color: var(--nx-accent-hover); color: #fff; }
html.nx #maincontainer a.btnmain span, html.nx #maincontainer a.btnaddtocart span { color: inherit; font: inherit; }

/* ---------- Product page: image + buy box above the fold — rows 59–60, 66–68 ----------
   Markup: tr.viewDetail … > table > tr.viewDetail__title (td title+code | td[itemprop=offers] buy)
           + tr.viewDetail__content > td (.c-ox-imgzoom + .PBItemDesc).
   One column below 900 px, two from 900 px up. Below 600 px the buy box comes BEFORE the
   gallery (title · buy · image · description) — see the 599.98 px block below. */
html.nx tr.viewDetail .sectiondataarea > table {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-areas: "title" "img" "buy" "desc";
  gap: 16px;
  width: 100%;
}
@media (min-width: 900px) {
  html.nx tr.viewDetail .sectiondataarea > table {
    grid-template-columns: minmax(0, 1.1fr) minmax(300px, 1fr);
    grid-template-areas: "img title" "img buy" "desc desc";
    grid-template-rows: auto 1fr auto;
    column-gap: clamp(24px, 4vw, 56px);
  }
}
/* Row 20 (finding 20, 2026-09-20): on a phone-width window the one-column order put the photo
   before the buy box, so "Ajouter au panier" fell from y 654 to y 1026 — below the fold. Swap
   the two areas below 600 px; the title stays first. Same selector and same specificity as the
   base rule above, so source order decides: this block must stay AFTER it. Nothing here applies
   at 600 px or wider, so the desktop and tablet layouts are untouched. */
@media (max-width: 599.98px) {
  html.nx tr.viewDetail .sectiondataarea > table {
    grid-template-areas: "title" "buy" "img" "desc";
  }
}
html.nx tr.viewDetail .sectiondataarea > table > tbody,
html.nx tr.viewDetail tr.viewDetail__title,
html.nx tr.viewDetail tr.viewDetail__content,
html.nx tr.viewDetail tr.viewDetail__content > td { display: contents; }
html.nx tr.viewDetail__title > td:first-child { grid-area: title; display: block; padding: 0; text-align: left; }
html.nx tr.viewDetail__title > td[itemprop="offers"] {
  grid-area: buy; display: block; align-self: start; text-align: left;
  padding: 20px; background: var(--nx-surface); border: 1px solid var(--nx-line);
  border-radius: var(--nx-radius-frame); box-shadow: var(--nx-shadow-soft);
}
html.nx tr.viewDetail .c-ox-imgzoom {
  grid-area: img; align-self: start; margin: 0; padding: 16px;
  background: var(--nx-surface); border: 1px solid var(--nx-line); border-radius: var(--nx-radius-frame);
}
html.nx tr.viewDetail #imgmain img { display: block; width: 100%; max-width: 480px; height: auto; max-height: 480px; object-fit: contain; margin: 0 auto; }
html.nx tr.viewDetail .c-ox-imgzoom__thumbs-list img { width: 72px !important; height: 72px; object-fit: contain; }
html.nx tr.viewDetail .PBItemDesc {
  grid-area: desc; display: block; padding: 24px; overflow-wrap: anywhere;
  background: var(--nx-surface); border: 1px solid var(--nx-line); border-radius: var(--nx-radius-card);
}
html.nx tr.viewDetail .PBItemDesc > div { font-family: var(--nx-font) !important; font-size: var(--nx-fs-base) !important; }
html.nx .PBItemTitle { font-size: clamp(1.5rem, 2.5vw, 2.25rem); line-height: 1.2; margin: 0 0 6px; }
html.nx tr.viewDetail__title .PBItemSku, html.nx tr.viewDetail__title .PBItemSku * { font-size: var(--nx-fs-sm); color: var(--nx-muted); }
html.nx td[itemprop="offers"] .PBItemPrice .PBCurrency { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; }
html.nx td[itemprop="offers"] .PBSalesPrice { font-size: var(--nx-fs-2xl); }
html.nx td[itemprop="offers"] .PBPackQty { margin: 6px 0 14px; color: var(--nx-muted); font-size: var(--nx-fs-sm); }
html.nx td[itemprop="offers"] .btnaddtocart { width: 100%; font-size: var(--nx-fs-base); }

/* "Meilleures ventes" block (Oxatis app last-product-view, drawn after load):
   JS marks an all-empty Stock column with .nx-empty-col — row 66 */
html.nx .c-app-last-product-view .nx-empty-col { display: none !important; }

/* ---------- Empty cart: no meaningless "5 %" order-progress bar — row 84 ---------- */
html.nx.nx-cart-empty .c-app-order-step--progress,
html.nx:has(#maincontainer.scshopcart tr.viewCartEmpty) .c-app-order-step--progress { display: none !important; }

/* ---------- Sign-up / login forms: readable, tappable fields — rows 88–89 ---------- */
html.nx #maincontainer:is(.subscribe, .userlogin) :is(input[type="text"], input[type="email"],
  input[type="password"], input[type="tel"], select, textarea) {
  min-height: var(--nx-control); box-sizing: border-box; max-width: 100%;
  padding: 0 12px; border: 1px solid var(--nx-line); border-radius: var(--nx-radius-card);
  background: var(--nx-surface); color: var(--nx-ink); font-size: var(--nx-fs-base);
}
html.nx #maincontainer:is(.subscribe, .userlogin) textarea { padding: 10px 12px; }
html.nx #maincontainer:is(.subscribe, .userlogin) :is(input, select, textarea):focus {
  border-color: var(--nx-accent); box-shadow: 0 0 0 3px var(--nx-accent-wash);
}

/* ---------- Footer in brand colours — rows 107–111 ---------- */
html.nx #footercontainer { background: var(--nx-ink-deep); color: #fff; }
html.nx #footercontainer * { background-color: transparent !important; }
html.nx #footercontainer #footerarea { max-width: var(--nx-shell); margin: 0 auto; }
html.nx #footercontainer a, html.nx #footercontainer span, html.nx #footercontainer li { color: #fff; }

/* ---------- Product page refinements, owner feedback 2026-09-20/21 (published as naturalex-6.css) ---------- */
/* 1. "Continuer les achats": a quiet text link, not a second call to action
      (feedback: competing navigation) */
html.nx #btnretitems.btnmain,
html.nx #btnretitems.btnmain:hover {
  background: transparent !important; color: var(--nx-accent) !important;
  border: 0 !important; box-shadow: none !important; padding: 0 !important;
  font-weight: 500; text-decoration: underline; text-underline-offset: 3px;
}
html.nx div.sectiontbarea { margin-bottom: 4px; }

/* 2. "Nous contacter" and other secondary actions: outline style, and breathing room
      between the stacked buttons (feedback: competing CTAs, buttons glued together) */
html.nx .c-app-addl-info-form a.btnmain.c-button--secondary,
html.nx .c-app-addl-info-form a.btnmain.c-button--secondary:hover {
  background: var(--nx-surface) !important; color: var(--nx-accent) !important;
  border: 1px solid var(--nx-accent) !important; box-shadow: none !important;
}
html.nx td[itemprop="offers"] .c-cs-quantity-box { margin: 12px 0 14px; }
html.nx td[itemprop="offers"] a.btnaddtocart { margin: 0 0 12px !important; }
html.nx td[itemprop="offers"] .c-app-addl-info-form,
html.nx td[itemprop="offers"] .c-app-addl-info-form__inner-container { margin-top: 12px; }
html.nx td[itemprop="offers"] a.btnmain + a.btnmain { margin-top: 12px; }

/* 3. Quantity selector: − / + and the field on one baseline
      (feedback: misaligned quantity selector) */
html.nx .c-cs-quantity-box__quantity-box { display: inline-flex !important; align-items: center; gap: 2px; }
html.nx .c-cs-quantity__button,
html.nx .c-cs-quantity__input-value {
  height: 36px !important; line-height: 36px !important; box-sizing: border-box;
  vertical-align: middle; margin: 0 !important;
}
html.nx .c-cs-quantity__input-value { text-align: center; }

/* 4. Buy box: soft surface instead of a hairline border
      (feedback: harsh border; the card itself is defined in naturalex.css) */
html.nx tr.viewDetail__title > td[itemprop="offers"] {
  border-color: transparent; background: var(--nx-surface-strong); box-shadow: var(--nx-shadow-mid);
}

/* 5. Description: readable line length, "Contenance / Origine" as a spec list
      (feedback: poor measure, orphaned metadata) */
html.nx tr.viewDetail .PBItemDesc > div { max-width: 72ch; line-height: 1.55; }
html.nx tr.viewDetail .PBItemDesc p { margin: 0 0 .8em; }
html.nx tr.viewDetail .PBItemDesc p > strong:first-child {
  display: inline-block; min-width: 9em; color: var(--nx-muted); font-weight: 600;
}

/* 6. Nutrition table: padding, right-aligned values, zebra rows
      (feedback: unstyled table) */
html.nx tr.viewDetail .PBItemDesc table {
  border-collapse: collapse; width: 100%; max-width: 56ch; margin: .6em 0 1.2em; font-size: var(--nx-fs-sm);
}
html.nx tr.viewDetail .PBItemDesc table td,
html.nx tr.viewDetail .PBItemDesc table th { padding: 6px 12px; border-bottom: 1px solid var(--nx-line); vertical-align: top; }
html.nx tr.viewDetail .PBItemDesc table td:last-child { text-align: right; white-space: nowrap; }
html.nx tr.viewDetail .PBItemDesc table tr:nth-child(even) td { background: var(--nx-surface-strong); }

/* 7. "Derniers articles vus" (app Last-Viewed-Products): switched in the app settings on
      2026-09-21 from "Tableau de produits" to "Bloc de produits", 5 items, fields image ·
      name · price · button (structure "inpb"), in both languages. These rules lay the
      blocks out as product cards (feedback: back-office table look). */
html.nx .c-app-last-product-view__content-products {
  display: grid !important; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 16px;
}
html.nx .c-app-last-product-view__product {
  width: auto !important; margin: 0 !important; padding: 12px; box-sizing: border-box;
  background: var(--nx-surface); border: 1px solid var(--nx-line); border-radius: var(--nx-radius-card);
  display: flex; flex-direction: column; gap: 8px; text-align: center;
}
html.nx .c-app-last-product-view__product img { width: 100% !important; max-width: 160px; height: auto !important; margin: 0 auto; }
html.nx .c-app-last-product-view__product .c-cs-product-name__name { font-size: var(--nx-fs-sm); line-height: 1.3; display: block; }
html.nx .c-app-last-product-view__product a.btnaddtocart.btnmain,
html.nx .c-app-last-product-view__product a.btnaddtocart.btnmain:hover {
  background: var(--nx-surface) !important; color: var(--nx-accent) !important;
  border: 1px solid var(--nx-accent) !important; box-shadow: none !important;
  padding: 6px 12px !important; font-size: var(--nx-fs-sm); margin-top: auto;
}

/* 9. Pages without the image-zoom app: the photo is a bare img.imgmain in the content
      row, which the grid auto-places into the title row (measured 2026-09-20: title row
      500 px for a 60 px title, buy box pushed down, description starting only after the
      buy row). Give the bare image the "img" area the theme reserves for .c-ox-imgzoom. */
html.nx tr.viewDetail img.imgmain {
  grid-area: img; align-self: start; justify-self: center;
  display: block; width: 100%; max-width: 480px; height: auto; max-height: 480px;
  object-fit: contain; margin: 0; padding: 16px; box-sizing: border-box;
  background: var(--nx-surface); border: 1px solid var(--nx-line); border-radius: var(--nx-radius-frame);
}

/* 8. Footer links: readable weight and size on the dark green
      (feedback: low contrast; colours already set in naturalex.css) */
html.nx #footerarea a.menu { font-size: 15px !important; font-weight: 500 !important; opacity: 1 !important; }
html.nx #footerarea a.menu:hover { text-decoration: underline; }
