{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/caplia-app.js?x=1791419539740"],
  "sourcesContent": ["/* Construit par shopify/outils/construire-theme.mjs : maquettes/verre-salon/app.js (commit 067238a0) + shopify/outils/adaptateur-shopify.js, 51 retouches document\u00E9es dans le script. Ne pas modifier \u00E0 la main. */\n/* =========================================================\n   Caplia \u2014 maquette \u00AB Verre \u00B7 Salon \u00BB \u2014 application\n   Routage par hash, rendu depuis /site/data/*.json\n   ========================================================= */\n(() => {\n  'use strict';\n  /* =========================================================\r\n     Adaptateur Shopify (ins\u00E9r\u00E9 dans app.js par shopify/outils/construire-theme.mjs, juste apr\u00E8s 'use strict')\r\n     - window.CAPLIA (snippets/caplia-config.liquid) : adresses des fichiers du th\u00E8me, page ouverte, produits et\r\n       panier Shopify, m\u00E9dias du produit ouvert ;\r\n     - adresses : les chemins de la maquette (/site/assets/\u2026, #/\u2026) deviennent ceux de Shopify ;\r\n     - produits : prix, couleurs et tailles en vente lus dans les variantes Shopify ;\r\n     - panier : le tableau `cart` de la maquette est le reflet du panier Shopify (Cart AJAX API) ;\r\n     - formulaires : contact, r\u00E9tractation, inscription e-mail et \u00AB Me pr\u00E9venir \u00BB envoy\u00E9s \u00E0 Shopify.\r\n     ========================================================= */\r\n  const CAPLIA = window.CAPLIA || {};\r\n  const ROOT = String(CAPLIA.racine || '/').replace(/\\/$/, '');\r\n  const R = (path) => ROOT + path;\r\n  const BASE = CAPLIA.base || '';\r\n  /* param\u00E8tres de l'adresse (?couleur=, ?s=, ?m=, ?variant=) : la maquette les lisait apr\u00E8s le \u00AB # \u00BB */\r\n  const qsAll = () => new URLSearchParams(location.search);\r\n\r\n  /* ---------- Fichiers du th\u00E8me : /site/assets/a/b.webp -> <assets>/a--b.webp ---------- */\r\n  const THEME_PHOTOS = new Set();\r\n  const flat = (u) => u.replace(/^\\/site\\/assets\\//, '').replace(/^\\/maquettes\\//, 'maquettes/').replace(/\\//g, '--');\r\n  function ASSET(u) {\r\n    if (typeof u !== 'string' || !/^\\/(site\\/assets|maquettes)\\//.test(u)) return u;\r\n    const m = u.match(/^\\/site\\/assets\\/produits\\/([^/]+)\\/([^/]+)-(\\d+)\\.(\\w+)$/);\r\n    if (m && !THEME_PHOTOS.has(u)) {\r\n      /* photo du th\u00E8me (k1\u2026) demand\u00E9e \u00E0 une autre largeur (vignettes en 300) : son fichier de 640 */\r\n      const u640 = u.replace(/-\\d+\\.(\\w+)$/, '-640.$1');\r\n      return MEDIA_URL(m[1], m[2], Number(m[3])) || (THEME_PHOTOS.has(u640) ? BASE + flat(u640) : CUT(m[1]));\r\n    }\r\n    return BASE + flat(u);\r\n  }\r\n  /* images du th\u00E8me : version ajout\u00E9e (?v=) pour que le cache d'un an des navigateurs ne garde pas une ancienne image */\r\n  let IMGV = '';\r\n  const BASE_RE = new RegExp(BASE.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '[^\"\\'\\\\s,)<>?]+\\\\.(?:webp|avif|jpe?g|png)(?![?\\\\w])', 'g');\r\n  const VERSION = (html) => (IMGV && BASE ? html.replace(BASE_RE, (u) => `${u}?v=${IMGV}`) : html);\r\n  const ASSETS_IN = (html) => VERSION(String(html).replace(/(?<![\\w.:\\/-])\\/(?:site\\/assets|maquettes)\\/[^\"'\\s,)<>]+/g, (u) => ASSET(u)));\r\n  /* donn\u00E9es : toute cha\u00EEne qui commence par /site/assets/ (fichier ou dossier) pointe vers les fichiers du th\u00E8me */\r\n  function MAP_DATA(o) {\r\n    if (typeof o === 'string') return /^\\/(site\\/assets|maquettes)\\//.test(o) ? BASE + flat(o) : o;\r\n    if (Array.isArray(o)) return o.map(MAP_DATA);\r\n    if (o && typeof o === 'object') { Object.keys(o).forEach((k) => { o[k] = MAP_DATA(o[k]); }); }\r\n    return o;\r\n  }\r\n  /* image de repli d'une pi\u00E8ce (la maquette avait ses d\u00E9tour\u00E9s) : sa carte en vraie photo dans le studio gris */\r\n  function CUT(slug) {\r\n    const e = PHOTO && PHOTO.pieces && PHOTO.pieces[typeof slug === 'string' ? slug : slug.slug];\r\n    return e && e.fichier ? `${PHOTO.dossier}${e.fichier}-720.webp` : '';\r\n  }\r\n\r\n  /* ---------- M\u00E9dias Shopify du produit ouvert, reli\u00E9s aux photos du catalogue ---------- */\r\n  const MEDIA = {};   /* slug -> { id photo du catalogue -> adresse Shopify } */\r\n  let MEDIAS_IMPORT = {};   /* slug -> { fichiers: { nom -> id }, alts: { texte -> id } }, depuis caplia-donnees.json */\r\n  const normTxt = (s) => String(s || '').toLowerCase().replace(/\u0153/g, 'oe').replace(/\u00E6/g, 'ae').normalize('NFD').replace(/[\u0300-\u036F]/g, '').replace(/[^a-z0-9]+/g, ' ').trim();\r\n  const withWidth = (src, w) => (/[?&]width=\\d+/.test(src) ? src.replace(/([?&]width=)\\d+/, `$1${w}`) : src + (src.includes('?') ? '&' : '?') + 'width=' + w);\r\n  function MEDIA_URL(slug, id, w) {\r\n    const m = MEDIA[slug];\r\n    const src = (m && m[id]) || MEDIA_ANY(slug, id);\r\n    return src ? withWidth(src, w) : '';\r\n  }\r\n  /* Vitesse (08/10) : photos des pi\u00E8ces (galerie, cartes, \u00AB la pi\u00E8ce \u00BB) en 375 \u00E0 1 600 px au lieu de 640 et 1 280 (le\r\n     t\u00E9l\u00E9phone prenait 1 280 px pour un \u00E9cran de 375). M\u00EAmes largeurs que la 1re photo rendue par Liquid\r\n     (snippets/caplia-img-galerie.liquid) : le navigateur reprend le fichier d\u00E9j\u00E0 charg\u00E9. Photos du th\u00E8me (k1\u2026) : 640 et 1 280. */\r\n  /* 18/10 (audit 04, constat 2) : 828, 1 000 et 1 200 px en plus (390 px \u00D72 prenait 1 100 px, un iPhone \u00D73 1 400 px) */\r\n  const GAL_W = [375, 550, 750, 828, 1000, 1200, 1400, 1600];\r\n  function GAL_SRCSET(p, id, ext = 'webp') {\r\n    const u = (w) => `/site/assets/produits/${p.slug}/${id}-${w}.${ext}`;\r\n    if (THEME_PHOTOS.has(u(1280)) || !MEDIA_URL(p.slug, id, 1280)) return [640, 1280].map((w) => `${ASSET(u(w))} ${w}w`).join(', ');\r\n    return GAL_W.map((w) => `${MEDIA_URL(p.slug, id, w)} ${w}w`).join(', ');\r\n  }\r\n  /* Refonte du 07/10 : les cartes et les pages montrent aussi les photos de salon des autres pi\u00E8ces. Elles viennent des\r\n     m\u00E9dias Shopify de chaque produit (caplia-produits-json > m : texte alternatif et adresse), reli\u00E9s aux photos du\r\n     catalogue par leur texte alternatif, comme sur la fiche ; rien n'est copi\u00E9 dans le th\u00E8me. */\r\n  const MEDIA_ALL = {};\r\n  function MEDIA_ANY(slug, id) {\r\n    if (!(slug in MEDIA_ALL)) {\r\n      MEDIA_ALL[slug] = {};\r\n      const p = BY[slug], sp = p && shopOf(p);\r\n      if (sp && Array.isArray(sp.m)) {\r\n        const byAlt = new Map(p.images.map((im) => [normTxt(im.alt), im.id]));\r\n        sp.m.forEach((x) => { const k = byAlt.get(normTxt(x.a)); if (k && !MEDIA_ALL[slug][k]) MEDIA_ALL[slug][k] = x.s; });\r\n      }\r\n    }\r\n    return MEDIA_ALL[slug][id] || '';\r\n  }\r\n  /* nom de fichier d'un m\u00E9dia sans extension ni suffixe ajout\u00E9 par Shopify (\u00AB 01-1280_3f2a\u2026webp \u00BB -> \u00AB 01-1280 \u00BB) */\r\n  const mediaName = (n) => String(n || '').toLowerCase().replace(/\\.[a-z0-9]+$/, '').replace(/_[0-9a-f]{8}-[0-9a-f-]{20,}$/, '');\r\n  function idFromName(name, slug, ids) {\r\n    const n = mediaName(name);\r\n    return ids.find((id) => { const i = String(id).toLowerCase(); return n === i || n.startsWith(i + '-') || n.endsWith('-' + i) || n.includes(`${slug}-${i}-`) || n.includes(`${slug}_${i}`) || n === `${slug}-${i}`; }) || null;\r\n  }\r\n  function LINK_MEDIA(p) {\r\n    const list = (CAPLIA.medias || []).filter((m) => m.src);\r\n    if (!list.length || !shopOf(p) || (CAPLIA.route || {}).handle !== shopOf(p).handle) return;\r\n    const ids = p.images.map((im) => im.id);\r\n    const byAlt = new Map(p.images.map((im) => [normTxt(im.alt), im.id]));\r\n    /* fichiers et textes de l'import (shopify/import/images/correspondance.csv) */\r\n    const imp = MEDIAS_IMPORT[p.slug] || { fichiers: {}, alts: {} };\r\n    Object.entries(imp.alts || {}).forEach(([a, id]) => { if (!byAlt.has(normTxt(a))) byAlt.set(normTxt(a), id); });\r\n    const map = {}, used = new Set();\r\n    list.forEach((m) => {\r\n      /* par le texte alternatif seulement (unique, tenu \u00E0 jour par sync-produits.mjs). Bug du 07/10 : les noms de\r\n         fichier de l'import sont renum\u00E9rot\u00E9s quand une photo est ins\u00E9r\u00E9e et pointaient vers une photo d'une autre couleur */\r\n      const id = byAlt.get(normTxt(m.alt)) || idFromName(m.nom, p.slug, ids);\r\n      if (id && !map[id]) { map[id] = m.src; used.add(m.id); }\r\n    });\r\n    const extra = list.filter((m) => !used.has(m.id));\r\n    if (!Object.keys(map).length) {\r\n      /* aucun m\u00E9dia reli\u00E9 : la galerie montre les m\u00E9dias Shopify dans leur ordre ; une couleur cit\u00E9e dans le texte\r\n         alternatif (ou l'image de la variante) range la photo dans cette couleur */\r\n      p.images = list.map((m, i) => ({ id: 's' + i, alt: m.alt || p.nom }));\r\n      list.forEach((m, i) => { map['s' + i] = m.src; });\r\n      const g = { _communes: [] };\r\n      const sp = shopOf(p);\r\n      list.forEach((m, i) => {\r\n        const a = normTxt(m.alt);\r\n        const c = p.couleurs.find((k) => a.includes(normTxt(k.nom)) || (sp && sp.variantes.some((v) => v.media === m.id && colorMatch(p, sp, v, k))));\r\n        if (c && p.couleurs.length > 1) (g[c.nom] = g[c.nom] || []).push('s' + i); else g._communes.push('s' + i);\r\n      });\r\n      GALERIES[p.slug] = g;\r\n      CADRAGE[p.slug] = {};\r\n    } else {\r\n      /* photos du catalogue absentes de Shopify : retir\u00E9es de la galerie ; m\u00E9dias en plus (inconnus du catalogue) : jamais\r\n         montr\u00E9s, car leur couleur n'est pas connue (r\u00E8gle stricte du 07/10 : une galerie ne montre que sa couleur) */\r\n      /* les photos refaites de la refonte (k1\u2026, KSCENES d'app.js) sont des fichiers du th\u00E8me, pas des m\u00E9dias Shopify : gard\u00E9es */\r\n      const keepK = (id) => /^k\\d+$/.test(id);\r\n      p.images = p.images.filter((im) => map[im.id] || keepK(im.id));\r\n      if (extra.length) console.warn('Caplia : m\u00E9dias Shopify inconnus du catalogue, non montr\u00E9s :', extra.map((m) => m.alt || m.nom));\r\n      const g = GALERIES[p.slug];\r\n      if (g) {\r\n        Object.keys(g).forEach((k) => { if (Array.isArray(g[k]) && k !== '_retirees') g[k] = g[k].filter((id) => map[id] || keepK(id)); });\r\n      }\r\n      const x = MAT && MAT.pieces && MAT.pieces[p.slug];\r\n      if (x && x.gros) Object.keys(x.gros).forEach((k) => { const v = x.gros[k]; if (v && !v.includes('/') && !map[v]) delete x.gros[k]; });\r\n    }\r\n    MEDIA[p.slug] = map;\r\n  }\r\n\r\n  /* ---------- Produits Shopify ---------- */\r\n  const SHOP = CAPLIA.produits || {};\r\n  const SHOP_LIST = Object.values(SHOP);\r\n  const SHOP_EMPTY = !SHOP_LIST.length;\r\n  let HANDLES = {};          /* slug -> handle (seo-pages.json), depuis caplia-donnees.json */\r\n  let SEO_ACCUEIL = {};      /* H1 de l'accueil (seo-pages.json > accueil, audit SEO du 15/10), depuis caplia-donnees.json */\r\n  function shopOf(p) {\r\n    if (!p) return null;\r\n    if (p._sp !== undefined) return p._sp;\r\n    let sp = SHOP[HANDLES[p.slug]] || null;\r\n    if (!sp) { const base = refBase(p).toUpperCase(); sp = SHOP_LIST.find((x) => x.variantes.some((v) => v.sku && (v.sku.toUpperCase() === base || v.sku.toUpperCase().startsWith(base + '-')))) || null; }\r\n    if (!sp) { const n = normTxt(p.nom); sp = SHOP_LIST.find((x) => (` ${normTxt(x.titre)} `).includes(` ${n} `)) || null; }\r\n    p._sp = sp;\r\n    if (sp) p._h = sp.handle;\r\n    return sp;\r\n  }\r\n  const handleOf = (slug) => { const p = (CAT && CAT.produits || []).find((x) => x.slug === slug); return (p && shopOf(p) && p._h) || HANDLES[slug] || slug; };\r\n  const slugOfHandle = (h) => { const p = (CAT && CAT.produits || []).find((x) => !x.masque && (HANDLES[x.slug] === h || (shopOf(x) && x._h === h))); return p ? p.slug : null; };\r\n  function optIdx(p, sp) {\r\n    if (sp._oi) return sp._oi;\r\n    const names = (sp.options || []).map(normTxt);\r\n    let c = names.findIndex((n) => /couleur|color|coloris|teinte/.test(n));\r\n    let t = names.findIndex((n) => /taille|size|dimension|format/.test(n));\r\n    if (c < 0 && p.couleurs.length > 1) c = names.findIndex((n, i) => i !== t && sp.variantes.some((v) => p.couleurs.some((k) => normTxt(k.nom) === normTxt(v.o[i]))));\r\n    if (t < 0 && p.tailles) t = names.findIndex((n, i) => i !== c && sp.variantes.some((v) => /\\d/.test(v.o[i] || '')));\r\n    return (sp._oi = { c, t });\r\n  }\r\n  const sizeKey = (s) => (String(s || '').match(/\\d+/g) || []).join('x');\r\n  function colorMatch(p, sp, v, k) {\r\n    const { c } = optIdx(p, sp);\r\n    if (c >= 0) return normTxt(v.o[c]) === normTxt(k.nom) || (!!k.cle && normTxt(v.o[c]) === normTxt(k.cle));\r\n    if (v.sku && /^CAP-/.test(k.ref || '')) return v.sku.toUpperCase() === k.ref.toUpperCase() || v.sku.toUpperCase().startsWith(k.ref.toUpperCase() + '-');\r\n    return p.couleurs.filter((x) => !x.retiree).length === 1;\r\n  }\r\n  function sizeMatch(p, sp, v, t) {\r\n    const { t: i } = optIdx(p, sp);\r\n    if (i >= 0) return sizeKey(v.o[i]) === sizeKey(t.nom);\r\n    if (v.sku && t.ref) return v.sku.toUpperCase().endsWith('-' + String(t.ref).toUpperCase());\r\n    return p.tailles.length === 1;\r\n  }\r\n  function SHOP_VARIANT(p, colorName, sizeName) {\r\n    const sp = shopOf(p);\r\n    if (!sp) return null;\r\n    const live = p.couleurs.filter((x) => !x.retiree);\r\n    if (sp.variantes.length === 1 && live.length === 1 && !(p.tailles && p.tailles.length > 1)) return sp.variantes[0];\r\n    const k = p.couleurs.find((x) => x.nom === colorName || x.cle === colorName) || p.couleurs[0];\r\n    const t = p.tailles ? p.tailles.find((x) => x.nom === sizeName) || p.tailles[0] : null;\r\n    return sp.variantes.find((v) => colorMatch(p, sp, v, k) && (!t || sizeMatch(p, sp, v, t))) || null;\r\n  }\r\n  /* une pi\u00E8ce existe sur le site si elle existe dans la boutique (aper\u00E7u complet tant que la boutique n'a aucun produit) */\r\n  const SHOP_KEEP = (p) => SHOP_EMPTY || !!shopOf(p);\r\n  function SHOP_MERGE(p) {\r\n    const sp = shopOf(p);\r\n    if (!sp) return p;\r\n    const vs = sp.variantes;\r\n    const live = p.couleurs.filter((k) => !k.retiree);\r\n    live.forEach((k) => { k.rupture = !vs.some((v) => v.dispo && colorMatch(p, sp, v, k)); });\r\n    if (p.tailles) {\r\n      p.tailles.forEach((t) => {\r\n        const mine = vs.filter((v) => sizeMatch(p, sp, v, t));\r\n        if (!mine.length) { t.rupture = true; return; }\r\n        t.prix = Math.min(...mine.map((v) => v.prix)) / 100;\r\n        t.rupture = !mine.some((v) => v.dispo);\r\n        t.ruptureCouleurs = live.filter((k) => !mine.some((v) => v.dispo && colorMatch(p, sp, v, k))).map((k) => k.nom);\r\n      });\r\n    }\r\n    const sold = vs.filter((v) => v.dispo);\r\n    p.prix = Math.min(...(sold.length ? sold : vs).map((v) => v.prix)) / 100;\r\n    return p;\r\n  }\r\n  /* variante Shopify -> ligne de panier de la maquette */\r\n  const VARIANT_INDEX = {};\r\n  function INDEX_VARIANTS() {\r\n    PRODS.forEach((p) => {\r\n      if (!shopOf(p)) return;\r\n      const sizes = p.tailles ? p.tailles.map((t) => t.nom) : [''];\r\n      p.couleurs.forEach((k) => sizes.forEach((s) => { const v = SHOP_VARIANT(p, k.nom, s); if (v && !VARIANT_INDEX[v.id]) VARIANT_INDEX[v.id] = { slug: p.slug, color: k.nom, size: s }; }));\r\n    });\r\n  }\r\n  /* ?variant=<id> : la couleur (et la taille) de la variante ; sinon -1 */\r\n  function SHOP_VARIANT_COLOR(p, id) {\r\n    const hit = id && VARIANT_INDEX[id];\r\n    if (!hit || hit.slug !== p.slug) return -1;\r\n    if (p.tailles && hit.size) { const k = p.tailles.findIndex((t) => t.nom === hit.size); if (k >= 0) PDP.size = k; }\r\n    return p.couleurs.findIndex((k) => k.nom === hit.color);\r\n  }\r\n  /* adresse partageable de la fiche pour une couleur : ?variant= (Shopify), sinon ?couleur= */\r\n  function SHOP_URL(p, colorName) {\r\n    const v = SHOP_VARIANT(p, colorName, p.tailles ? (p.tailles[PDP.size] || p.tailles[0]).nom : '');\r\n    return location.pathname + (v ? `?variant=${v.id}` : `?couleur=${colorSlug(colorName)}`);\r\n  }\r\n  /* un ensemble ne s'annonce \u00AB dans votre panier \u00BB que si chacune de ses pi\u00E8ces peut y entrer */\r\n  function SHOP_ENS_OK(e) {\r\n    const ok = e.items.every(([slug, color, size]) => {\r\n      const p = BY[slug];\r\n      if (!p) return false;\r\n      const c = colorIn(p, color), s = sizeFor(p, c, size || '');\r\n      return s !== null && !isOut(p.couleurs.find((k) => k.nom === c)) && !!SHOP_VARIANT(p, c, s);\r\n    });\r\n    if (!ok) toast(null, SHOP_EMPTY ? `${e.nom} n\u2019est pas encore en vente en ligne.` : `${e.nom} n\u2019est pas disponible en entier pour le moment.`, true);\r\n    return ok;\r\n  }\r\n  function SHOP_CAN_ADD(p, color, size) {\r\n    if (SHOP_VARIANT(p, color, size)) return true;\r\n    toast(null, SHOP_EMPTY ? `${p.nom} n\u2019est pas encore en vente en ligne.` : `${p.nom} n\u2019est pas disponible dans cette version.`, true);\r\n    return false;\r\n  }\r\n\r\n  /* ---------- Adresses : #/\u2026 de la maquette -> vraies pages Shopify ---------- */\r\n  const PAGE_ROUTES = ['livraison', 'matieres', 'arrivee', 'cadeaux', 'a-propos', 'questions', 'contact', 'renoncer', 'mentions-legales',\r\n    'conditions-de-vente', 'confidentialite', 'garantie', 'tout-va-bien', 'un-souci', 'petits-espaces', 'jeunes-parents', 'pourquoi-caplia', 'selection', 'paiement'];\r\n  const PAGE_HANDLE = (r) => (CAPLIA.pages && CAPLIA.pages[r]) || r;\r\n  function TO_URL(h) {\r\n    const raw = String(h).replace(/^#/, '');\r\n    const i = raw.indexOf('?');\r\n    const path = i < 0 ? raw : raw.slice(0, i), q = i < 0 ? '' : raw.slice(i);\r\n    let m;\r\n    if (!path || path === '/') return R('/') + q;\r\n    if ((m = path.match(/^\\/p\\/([\\w-]+)\\/?$/))) return R('/products/' + handleOf(m[1])) + q;\r\n    if ((m = path.match(/^\\/(canapes|fauteuils|decoration|sleep)\\/?$/))) return R('/collections/' + m[1]) + q;\r\n    if ((m = path.match(/^\\/(?:collections|sleep)\\/([\\w-]+)\\/?$/))) return R('/collections/' + m[1]) + q;\r\n    if (/^\\/(panier|reserver-en-3-fois)\\/?$/.test(path)) return R('/cart') + q;\r\n    if (/^\\/merci\\/?$/.test(path)) return R('/');\r\n    if ((m = path.match(/^\\/([\\w-]+)\\/?$/))) return R('/pages/' + PAGE_HANDLE(m[1])) + q;\r\n    return R('/');\r\n  }\r\n  const LINKS = (html) => String(html).replace(/href=\"(#\\/[^\"]*)\"/g, (all, h) => `href=\"${TO_URL(h.replace(/&amp;/g, '&')).replace(/&/g, '&amp;')}\"`);\r\n  function FIX_LINKS(root) { $$('a[href^=\"#/\"]', root || document).forEach((a) => a.setAttribute('href', TO_URL(a.getAttribute('href')))); }\r\n  /* filet de s\u00E9curit\u00E9 : un lien #/\u2026 oubli\u00E9 m\u00E8ne quand m\u00EAme \u00E0 la bonne page */\r\n  document.addEventListener('click', (e) => {\r\n    const a = e.target.closest && e.target.closest('a[href^=\"#/\"]');\r\n    if (!a || e.defaultPrevented || a.hasAttribute('data-toc')) return;\r\n    e.preventDefault();\r\n    location.href = TO_URL(a.getAttribute('href'));\r\n  });\r\n\r\n  /* ---------- Page ouverte (pos\u00E9e par Liquid) -> route de la maquette ; null = garder le rendu Liquid ---------- */\r\n  function CAPLIA_PATH() {\r\n    const r = CAPLIA.route || {};\r\n    const el = document.querySelector('[data-caplia-route]');\r\n    const forced = el ? el.getAttribute('data-caplia-route') : '';\r\n    const h = forced || r.handle || '';\r\n    switch (r.gabarit) {\r\n      case 'index': return '/';\r\n      case 'product': { const s = slugOfHandle(r.handle); return s ? '/p/' + s : null; }\r\n      case 'collection': return catBy(h) ? '/' + h : SUBS[h] || SEO[h] ? '/collections/' + h : null;\r\n      case 'page': return PAGE_ROUTES.includes(h) ? '/' + h : null;\r\n      case 'cart': return '/panier';\r\n      case '404': return '/__introuvable';\r\n      default: return null;\r\n    }\r\n  }\r\n  /* rendu Liquid gard\u00E9 (page inconnue des donn\u00E9es) : on l'affiche, liens et en-t\u00EAte compris */\r\n  function KEEP_SSR() {\r\n    document.documentElement.classList.add('caplia-pret');\r\n    FIX_LINKS(document);\r\n  }\r\n  /* formulaires Shopify (contact, r\u00E9tractation) rendus par Liquid : d\u00E9plac\u00E9s \u00E0 leur place dans la page de la maquette */\r\n  function KEEP_TAKE(app) {\r\n    const out = {};\r\n    $$('[data-caplia-keep]', app).forEach((w) => { const f = w.firstElementChild; if (f) out[w.getAttribute('data-caplia-keep')] = f; });\r\n    return out;\r\n  }\r\n  /* Paiement express (07/10) : les boutons Shopify (payment_button de la fiche, content_for_additional_checkout_buttons\r\n     du panier) sont gard\u00E9s en m\u00E9moire ; sans place dans le rendu (accessoire, pi\u00E8ce pas encore en vente), ils ne\r\n     s'affichent pas ; le panier refait (refreshCart) les remet \u00E0 leur place (SLOT_REFILL). */\r\n  const KEPT_LIVE = {};\r\n  /* gard\u00E9s en m\u00E9moire et remis \u00E0 chaque rendu : boutons express et logos de paiement (16/10), jamais ajout\u00E9s en fin de page */\r\n  const isLiveKey = (k) => /^(express|paiements)/.test(k);\r\n  function KEEP_PUT(app, kept) {\r\n    Object.keys(kept).forEach((k) => { if (isLiveKey(k)) KEPT_LIVE[k] = kept[k]; });\r\n    $$('[data-caplia-slot]', app).forEach((s) => { const k = s.getAttribute('data-caplia-slot'), f = kept[k]; if (f) { s.replaceWith(f); delete kept[k]; } else s.remove(); });\r\n    /* un \u00E9l\u00E9ment gard\u00E9 sans place dans le rendu (page sans pied de page\u2026) : \u00E0 la fin ; jamais les boutons express */\r\n    Object.keys(kept).forEach((k) => { if (!isLiveKey(k)) app.appendChild(kept[k]); });\r\n    SHOP_EXPRESS_SYNC();\r\n  }\r\n  function SLOT_REFILL(root) {\r\n    $$('[data-caplia-slot]', root).forEach((s) => { const f = KEPT_LIVE[s.getAttribute('data-caplia-slot')]; if (f) s.replaceWith(f); else s.remove(); });\r\n  }\r\n  /* la variante choisie sur la fiche (couleur, taille) part dans le formulaire des boutons express */\r\n  function SHOP_EXPRESS_SYNC() {\r\n    const f = KEPT_LIVE.express && KEPT_LIVE.express.querySelector('input[name=\"id\"]');\r\n    if (!f || !PDP.p) return;\r\n    const p = PDP.p;\r\n    const v = SHOP_VARIANT(p, p.couleurs[PDP.color].nom, p.tailles ? (p.tailles[PDP.size] || p.tailles[0]).nom : '');\r\n    if (v && String(f.value) !== String(v.id)) { f.value = v.id; f.dispatchEvent(new Event('change', { bubbles: true })); }\r\n    /* variante absente ou \u00E9puis\u00E9e, couleur \u00E9puis\u00E9e, pi\u00E8ce pas encore en vente : pas de paiement express */\r\n    const box = KEPT_LIVE.express.closest('.fp-express');\r\n    if (box) box.hidden = !v || !v.dispo || isOut(p.couleurs[PDP.color]) || notYet(p);\r\n  }\r\n\r\n  /* ---------- Panier Shopify ---------- */\r\n  let SHOPCART = CAPLIA.panier || { items: [] };\r\n  const GIFT_IDS = (CAPLIA.cadeaux || []).map((x) => Number(x) || 0);\r\n  const isGiftItem = (it) => GIFT_IDS.includes(it.variant_id) || !!(it.properties && it.properties._cadeau);\r\n  function SHOP_CART_LINES() {\r\n    return (SHOPCART.items || []).filter((it) => VARIANT_INDEX[it.variant_id]).map((it) => ({ ...VARIANT_INDEX[it.variant_id], qty: it.quantity }));\r\n  }\r\n  /* lignes du panier Shopify que la maquette ne conna\u00EEt pas (autre produit de la boutique) : montr\u00E9es et compt\u00E9es */\r\n  const SHOP_EXTRAS = () => (SHOPCART.items || []).filter((it) => !VARIANT_INDEX[it.variant_id] && !isGiftItem(it));\r\n  const SHOP_EXTRA_TOTAL = () => SHOP_EXTRAS().reduce((s, it) => s + it.final_line_price / 100, 0);\r\n  const SHOP_EXTRA_COUNT = () => SHOP_EXTRAS().reduce((s, it) => s + it.quantity, 0);\r\n  function SHOP_EXTRA_HTML() {\r\n    return SHOP_EXTRAS().map((it) => {\r\n      const img = it.featured_image && it.featured_image.url ? `<img src=\"${esc(withWidth(it.featured_image.url, 240))}\" alt=\"\" loading=\"lazy\" decoding=\"async\">` : '';\r\n      return `<li class=\"line line--shop\" data-line=\"${esc(it.key)}\">\r\n        <a class=\"line__thumb\" href=\"${esc(it.url)}\" aria-label=\"${esc(it.product_title)}\">${img}</a>\r\n        <div class=\"line__info\"><a class=\"line__name\" href=\"${esc(it.url)}\">${esc(it.product_title)}</a>${it.variant_title ? `<p class=\"line__var\">${esc(it.variant_title)}</p>` : ''}</div>\r\n        <div class=\"qty\" role=\"group\" aria-label=\"Quantit\u00E9 de ${esc(it.product_title)}\">\r\n          <button type=\"button\" data-action=\"shop-qty\" data-key=\"${esc(it.key)}\" data-q=\"${it.quantity - 1}\" aria-label=\"Retirer un exemplaire\"${it.quantity < 2 ? ' disabled' : ''}>${I.minus}</button>\r\n          <output aria-live=\"polite\">${it.quantity}</output>\r\n          <button type=\"button\" data-action=\"shop-qty\" data-key=\"${esc(it.key)}\" data-q=\"${it.quantity + 1}\" aria-label=\"Ajouter un exemplaire\">${I.plus}</button>\r\n        </div>\r\n        <p class=\"line__total\">${price(it.final_line_price / 100)}</p>\r\n        <button class=\"line__x\" type=\"button\" data-action=\"shop-qty\" data-key=\"${esc(it.key)}\" data-q=\"0\" aria-label=\"Retirer ${esc(it.product_title)} du panier\">Retirer</button>\r\n      </li>`;\r\n    }).join('');\r\n  }\r\n  const cartJSON = (r) => r.json().then((j) => { if (!r.ok) throw j; return j; });\r\n  const post = (url, body) => fetch(R(url), { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify(body) }).then(cartJSON);\r\n  /* la maquette change `cart` puis appelle saveCart() : on envoie l'\u00E9tat voulu \u00E0 Shopify, un envoi \u00E0 la fois (le dernier \u00E9tat gagne) */\r\n  let syncBusy = false, syncAgain = false, syncDone = Promise.resolve();\r\n  let syncResolve = null;\r\n  function SHOP_CART_SYNC() {\r\n    syncAgain = true;\r\n    if (syncBusy) return syncDone;\r\n    syncBusy = true;\r\n    syncDone = new Promise((ok) => { syncResolve = ok; });\r\n    (async () => {\r\n      while (syncAgain) {\r\n        syncAgain = false;\r\n        const want = {};\r\n        cart.forEach((l) => { const v = SHOP_VARIANT(BY[l.slug], l.color, l.size); if (v) want[v.id] = (want[v.id] || 0) + l.qty; });\r\n        const cur = {};\r\n        (SHOPCART.items || []).forEach((it) => { if (VARIANT_INDEX[it.variant_id]) cur[it.variant_id] = (cur[it.variant_id] || 0) + it.quantity; });\r\n        Object.keys(cur).forEach((id) => { if (!(id in want)) want[id] = 0; });\r\n        const add = [], upd = {};\r\n        Object.keys(want).forEach((id) => { if (!(id in cur)) { if (want[id] > 0) add.push({ id: Number(id), quantity: want[id] }); } else if (cur[id] !== want[id]) upd[id] = want[id]; });\r\n        try {\r\n          if (Object.keys(upd).length) SHOPCART = await post('/cart/update.js', { updates: upd });\r\n          if (add.length) { await post('/cart/add.js', { items: add }); SHOPCART = await fetch(R('/cart.js'), { headers: { Accept: 'application/json' } }).then(cartJSON); }\r\n          await SHOP_GIFTS_SYNC();\r\n        } catch (err) {\r\n          /* refus\u00E9 (stock insuffisant, pi\u00E8ce retir\u00E9e) : on reprend le panier tel que Shopify le conna\u00EEt */\r\n          await SHOP_CART_RELOAD(true);\r\n          toast(null, (err && (err.description || err.message)) ? `${err.description || err.message}` : 'Le panier n\u2019a pas pu \u00EAtre mis \u00E0 jour. R\u00E9essayez.', true);\r\n          syncAgain = false;\r\n        }\r\n      }\r\n      syncBusy = false;\r\n      syncResolve();\r\n    })();\r\n    return syncDone;\r\n  }\r\n  /* relit le panier Shopify ; la page n'est refaite que s'il a chang\u00E9 (ou apr\u00E8s un refus) */\r\n  const cartSig = (c) => ((c && c.items) || []).map((it) => `${it.key}:${it.quantity}`).join('|');\r\n  async function SHOP_CART_RELOAD(force) {\r\n    /* un envoi en cours (panier recr\u00E9\u00E9 par un lien \u00AB Envoyer mon panier \u00BB) passe d'abord : sinon la relecture le d\u00E9fait */\r\n    if (syncBusy && !force) await syncDone;\r\n    const avant = cartSig(SHOPCART);\r\n    try { SHOPCART = await fetch(R('/cart.js'), { headers: { Accept: 'application/json' } }).then(cartJSON); } catch (e) { return; }\r\n    if (!force && cartSig(SHOPCART) === avant) return;\r\n    loadCart(); updateBadge(); refreshCart();\r\n  }\r\n  /* Cadeaux par palier (site.json > paliers) : r\u00E9glages du th\u00E8me \u00AB Cadeaux \u00BB (une variante par palier). Vides = rien\r\n     n'est ajout\u00E9 (le panier les montre seulement). Remplis : la variante du palier atteint est ajout\u00E9e (propri\u00E9t\u00E9 _cadeau),\r\n     retir\u00E9e sous le seuil ; une remise automatique Shopify la rend gratuite. */\r\n  async function SHOP_GIFTS_SYNC() {\r\n    if (!GIFT_IDS.some(Boolean) || !SITE || !SITE.paliers) return;\r\n    /* les meubles seulement : les coussins et plaids achet\u00E9s seuls ne comptent pas pour les cadeaux (giftBase, app.js) */\r\n    const total = giftBase();\r\n    const items = SHOPCART.items || [];\r\n    const add = [], upd = {};\r\n    SITE.paliers.forEach((pl, i) => {\r\n      const id = GIFT_IDS[i];\r\n      if (!id) return;\r\n      const have = items.filter((it) => it.variant_id === id).reduce((s, it) => s + it.quantity, 0);\r\n      const want = total >= pl.seuil ? 1 : 0;\r\n      if (have === want) return;\r\n      /* plaid offert \u00E0 la place d'un plaid achet\u00E9 (plaidSwap, app.js) : sa couleur part avec le cadeau, visible sur la commande */\r\n      const coul = pl.produit === PLAID && i === SITE.paliers.findIndex((x) => x.produit === PLAID) ? plaidPref() : '';\r\n      if (!have) add.push({ id, quantity: 1, properties: Object.assign({ _cadeau: String(pl.seuil) }, coul ? { Couleur: coul } : {}) }); else upd[id] = want;\r\n    });\r\n    if (Object.keys(upd).length) SHOPCART = await post('/cart/update.js', { updates: upd });\r\n    if (add.length) { await post('/cart/add.js', { items: add }); SHOPCART = await fetch(R('/cart.js'), { headers: { Accept: 'application/json' } }).then(cartJSON); }\r\n  }\r\n  async function SHOP_CHECKOUT(btn) {\r\n    if (btn) btn.setAttribute('aria-busy', 'true');\r\n    await SHOP_CART_SYNC();\r\n    location.href = R('/checkout');\r\n  }\r\n  document.addEventListener('click', (e) => {\r\n    const b = e.target.closest && e.target.closest('[data-action=\"shop-qty\"]');\r\n    if (!b) return;\r\n    e.preventDefault();\r\n    post('/cart/change.js', { id: b.dataset.key, quantity: Math.max(0, Number(b.dataset.q) || 0) })\r\n      .then((c) => { SHOPCART = c; updateBadge(); refreshCart(); })\r\n      .catch(() => SHOP_CART_RELOAD(true));\r\n  });\r\n  /* retour arri\u00E8re (page gard\u00E9e en m\u00E9moire par le navigateur) : le panier a pu changer ailleurs */\r\n  window.addEventListener('pageshow', (e) => { if (e.persisted && CAT) SHOP_CART_RELOAD(); });\r\n\r\n  /* ---------- Formulaires ---------- */\r\n  const MAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n  /* inscription Shopify (form_type=customer) : client avec ses \u00E9tiquettes, accord e-mail donn\u00E9 */\r\n  async function SHOP_SUBSCRIBE(email, tags) {\r\n    const fd = new FormData();\r\n    fd.append('form_type', 'customer'); fd.append('utf8', '\u2713');\r\n    fd.append('contact[email]', email);\r\n    fd.append('contact[tags]', ['caplia', ...tags].filter(Boolean).join(', ').slice(0, 250));\r\n    try {\r\n      const r = await fetch(R('/contact'), { method: 'POST', body: fd, credentials: 'same-origin' });\r\n      return r.ok && !/\\/challenge/.test(r.url);\r\n    } catch (e) { return false; }\r\n  }\r\n  /* inscription (pied de page : vrai formulaire Shopify ; \u00AB Ma s\u00E9lection \u00BB : envoy\u00E9 en arri\u00E8re-plan) */\r\n  function SHOP_NEWS(e, nf) {\r\n    const msg = $('[data-news-msg]', nf);\r\n    const input = nf.querySelector('input[type=\"email\"]');\r\n    const ok = nf.querySelector('input[type=\"checkbox\"]');\r\n    const mail = input ? input.value.trim() : '';\r\n    const sel = nf.hasAttribute('data-selmail');\r\n    const say = (t) => { if (msg) { msg.hidden = false; msg.textContent = fr(t); } };\r\n    if (!MAIL_RE.test(mail)) { e.preventDefault(); say('Indiquez une adresse e-mail valide.'); if (input) input.focus(); return; }\r\n    if (!sel && ok && !ok.checked) { e.preventDefault(); say('Cochez la case pour recevoir nos e-mails.'); return; }\r\n    if (nf.getAttribute('action')) return;   /* formulaire Shopify : il part tel quel */\r\n    e.preventDefault();\r\n    const tags = sel ? ['selection', ...fav.map((s) => 'piece-' + s)] : ['newsletter'];\r\n    if (sel && ok && ok.checked) tags.push('newsletter');\r\n    SHOP_SUBSCRIBE(mail, tags).then((done) => {\r\n      if (!done) { say('L\u2019envoi n\u2019a pas abouti. R\u00E9essayez dans un instant.'); return; }\r\n      say(sel ? `C\u2019est not\u00E9 : votre s\u00E9lection part \u00E0 ${mail}${ok && ok.checked ? ', avec les nouvelles couleurs et le guide' : ''}.` : `Merci : c\u2019est not\u00E9 pour ${mail}.`);\r\n    });\r\n  }\r\n  /* contact et \u00AB Un souci \u00BB (18/10) : nom, e-mail valide et message, sinon rien ne part */\r\n  const FORM_CHAMPS = { 'caplia-contact': ['#f-nom', '#f-mail', '#f-msg', '[data-form-msg]'], 'caplia-souci': ['#s-nom', '#s-mail', '#s-msg', '[data-souci-msg]'] };\r\n  document.addEventListener('submit', (e) => {\r\n    const f = e.target;\r\n    if (FORM_CHAMPS[f.id]) {\r\n      const [nom, mail, txt, msg] = FORM_CHAMPS[f.id].map((s) => f.querySelector(s));\r\n      if (!nom.value.trim() || !MAIL_RE.test(mail.value.trim()) || !txt.value.trim()) {\r\n        e.preventDefault();\r\n        if (msg) { msg.hidden = false; msg.textContent = fr('Merci d\u2019indiquer votre nom, une adresse e-mail valide et votre message.'); }\r\n      }\r\n      return;\r\n    }\r\n    if (f.id === 'caplia-renonce') {\r\n      const m = $('[data-renonce-msg]', f);\r\n      const nom = f.querySelector('#r-nom'), cmd = f.querySelector('#r-cmd'), mail = f.querySelector('#r-mail');\r\n      const bad = !nom.value.trim() ? nom : !cmd.value.trim() ? cmd : !MAIL_RE.test(mail.value.trim()) ? mail : null;\r\n      if (bad) {\r\n        e.preventDefault();\r\n        m.hidden = false; m.classList.add('is-warn');\r\n        m.textContent = bad === mail ? 'Indiquez une adresse e-mail valide : l\u2019accus\u00E9 de r\u00E9ception y sera envoy\u00E9.' : bad === nom ? 'Indiquez votre nom et votre pr\u00E9nom.' : 'Indiquez votre num\u00E9ro de commande : il figure dans l\u2019e-mail de confirmation.';\r\n        bad.focus();\r\n      }\r\n    }\r\n  }, true);\r\n\n\n  const KEY = 'prelasse-maquette-verre-salon';\n  const NB = '\u00A0';\n  const NNB = '\u202F';\n  const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  const isMobile = () => window.innerWidth < 760;\n\n  let CAT = null;\n  let SITE = null;\n  const STUDIO = {};   /* images studio gris HD par slug (site/data/studio.json) */\n  let DETOURE = {};    /* taille [largeur, hauteur] des d\u00E9tour\u00E9s de repli */\n  /* Galerie des fiches, lues au chargement (une autre \u00E9quipe les compl\u00E8te : rien n'est cod\u00E9 en dur) :\n     GALERIES = vraies photos par couleur (galeries.json : _communes, _retirees) ; VUES = vues studio par couleur\n     (vues-couleurs.json) ; MODELES = mod\u00E8les 3D et couleurs qu'ils savent montrer (modeles-3d.json). */\n  let GALERIES = {};\n  /* place de la pi\u00E8ce dans chaque vraie photo de galerie (cadrage-photos.json, BiRefNet) : la galerie ne la coupe jamais */\n  let CADRAGE = {};\n  /* notices en fran\u00E7ais par produit (site/data/notices.json, 07/10) : volet \u00AB Montage et notice \u00BB de la fiche, facultatif */\n  let NOTICES = {};\n  /* pi\u00E8ces masqu\u00E9es (catalogue.json \u00AB masque \u00BB, 05/10 : pas de vraie photo) : absentes de PRODS et de BY, donc de tout le\n     site ; MASK_RE reconna\u00EEt leur nom dans les textes des pages (seo-pages.json) pour sauter la phrase qui les cite */\n  let MASK_RE = null;\n  let VUES = {};\n  let MODELES = {};\n  /* pages de valeur (05/10) : mati\u00E8res, arriv\u00E9e et cadeaux (site/data/matieres.json, livraison.json, cadeaux.json), facultatives */\n  let MAT = null, ARR = null, GIFTS = null, AVIS = null;\n  /* fiches techniques (site/data/fiches-techniques.json, 07/10) : confort, tissu, d\u00E9ballage, technique relev\u00E9s chez le vendeur */\n  let FT = {};\n  /* images des cartes et des ensembles, toutes les pi\u00E8ces \u00E0 la m\u00EAme distance (site/data/cartes.json,\n     maquettes/outils/cartes-echelle.py) : { cartes: { largeurs, echelle: { slug } }, ensembles: { slug: { largeurs } } } */\n  let CARTES = { cartes: { echelle: {} }, ensembles: {} };\n  /* cartes en vraies photos (cartes.json > photo) : voir pieceImg ; null tant qu'elles ne sont pas charg\u00E9es */\n  let PHOTO = null;\n  let PRODS = [];\n  const BY = {};\n  let lenis = null;\n  let cleanups = [];\n  let firstRender = true;\n\n  const G = () => (window.gsap ? window.gsap : null);\n  const ST = () => (window.ScrollTrigger ? window.ScrollTrigger : null);\n\n  const $ = (s, r = document) => r.querySelector(s);\n  const $$ = (s, r = document) => Array.from(r.querySelectorAll(s));\n  const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n  const pad = (n) => String(n).padStart(2, '0');\n\n  /* Typographie fran\u00E7aise : ins\u00E9cables avant : ; ? ! et dans les guillemets */\n  const frTxt = (s) => s\n    .replace(/ ([:;?!])(?=[\\s<\"&]|$)/g, NB + '$1')\n    .replace(/\u00AB /g, '\u00AB' + NB)\n    .replace(/ \u00BB/g, NB + '\u00BB')\n    /* \u00AB e-mail \u00BB ne se coupe jamais apr\u00E8s le trait d'union (\u00AB par e- / mail \u00BB) : un liant invisible (U+2060) */\n    .replace(/e-mail/g, 'e-\\u2060mail')\n    /* de m\u00EAme \u00AB \u00C9crivez-nous \u00BB, \u00AB envoyez-nous \u00BB, \u00AB \u00E9co-participation \u00BB : jamais coup\u00E9s apr\u00E8s le trait d'union */\n    .replace(/([a-z\u00E0-\u00FF])-(nous|vous)\\b/gi, '$1-\\u2060$2')\n    .replace(/\u00E9co-participation/g, '\u00E9co-\\u2060participation');\n  const fr = (s) => LINKS(ASSETS_IN(fr0(s)));\n  /* les attributs href restent tels quels (supervision du 08/10) : ni ins\u00E9cable ni liant invisible dans une adresse ou le\n     texte pr\u00E9rempli d'un lien mailto:, que le client enverrait dans son e-mail */\n  const fr0 = (s) => String(s).split(/(href=\"[^\"]*\")/).map((x, i) => (i % 2 ? x : frTxt(x))).join('');\n\n  const price = (n) => String(Math.round(n)).replace(/\\B(?=(\\d{3})+(?!\\d))/g, NNB) + NB + '\u20AC';\n  const numFr = (n) => String(n).replace('.', ',');\n  const cm = (n) => numFr(n) + NB + 'cm';\n  /* chiffres et unit\u00E9s jamais s\u00E9par\u00E9s en fin de ligne (\u00AB 200 \u00D7 182 cm \u00BB) */\n  const nbUnits = (s) => String(s).replace(/(\\d) \u00D7 (\\d)/g, `$1${NB}\u00D7${NB}$2`).replace(/(\\d) (cm|kg|\u20AC)/g, `$1${NB}$2`);\n  /* textes des pages (seo-pages.json) : ni \u00AB 290 / \u20AC \u00BB, ni \u00AB 1 / 090 \u20AC \u00BB, ni \u00AB 4 / cm \u00BB coup\u00E9s en fin de ligne */\n  const nbTxt = (s) => nbUnits(String(s).replace(/(\\d) (\\d{3})(?=\\D|$)/g, `$1${NNB}$2`));\n\n  /* ---------------- Chemins d'images ---------------- */\n  const photo = (p, id, size = 1280, ext = 'webp') => ASSET(`/site/assets/produits/${p.slug}/${id}-${size}.${ext}`);\n  const cut = (p) => CUT(p.slug);\n  const tab = (id, v = '1920', ext = 'webp') => ASSET(`/site/assets/tableaux/${id}-${v}.${ext}`);\n\n  /* Image studio gris tir\u00E9e des rendus 3D (maquettes/outils/images-site.py) : seulement la vue studio des galeries de fiches.\n     Partout ailleurs, la vraie photo de la pi\u00E8ce (carte ou cadres : voir pieceImg). Options : alt, sizes (largeur affich\u00E9e),\n     eager (image vue d\u00E8s l'arriv\u00E9e), cls (sur <picture>), imgCls (sur <img>). */\n  function studioImg(p, { alt = '', sizes = '(max-width: 760px) 100vw, 50vw', eager = false, cls = '', imgCls = '', carte = false, cadres = null } = {}) {\n    if ((carte || cadres) && carteOf(p)) return pieceImg(p, { alt, sizes, eager, cls, imgCls, cadres: cadres || ['45'] });\n    const s = null;\n    const charge = eager ? 'loading=\"eager\" fetchpriority=\"high\"' : 'loading=\"lazy\"';\n    const ic = imgCls ? ` class=\"${esc(imgCls)}\"` : '';\n    if (!s) {\n      const d = DETOURE[p.slug];\n      return `<img${ic} src=\"${cut(p)}\" alt=\"${esc(alt)}\"${d ? ` width=\"${d[0]}\" height=\"${d[1]}\"` : ''} ${charge} decoding=\"async\" draggable=\"false\">`;\n    }\n    const dir = '/site/assets/studio/';\n    const set = (ext) => s.largeurs.map((w) => `${dir}${p.slug}-${w}.${ext} ${w}w`).join(', ');\n    const repli = s.largeurs.includes(1080) ? 1080 : s.largeurs[s.largeurs.length - 1];\n    const w = s.largeurs[s.largeurs.length - 1];\n    return `<picture class=\"simg${cls ? ' ' + esc(cls) : ''}\">`\n      + `<source type=\"image/avif\" srcset=\"${set('avif')}\" sizes=\"${esc(sizes)}\">`\n      + `<source type=\"image/webp\" srcset=\"${set('webp')}\" sizes=\"${esc(sizes)}\">`\n      + `<img${ic} src=\"${dir}${p.slug}-${repli}.webp\" alt=\"${esc(alt)}\" width=\"${w}\" height=\"${Math.round(w / s.ratio)}\" ${charge} decoding=\"async\" draggable=\"false\">`\n      + '</picture>';\n  }\n\n  /* ---------------- Vraies photos des pi\u00E8ces (cartes, vignettes, pages) ----------------\n     maquettes/outils/cartes-echelle.py photo : la vraie pi\u00E8ce d\u00E9tour\u00E9e, pos\u00E9e dans le studio gris avec son ombre de contact,\n     toutes \u00E0 la m\u00EAme distance (site/data/cartes.json > photo). Une carte par couleur en vente qui a sa photo, et des\n     recadrages du m\u00EAme studio pour les cadres des pages : \u00AB 45 \u00BB (carte enti\u00E8re), \u00AB 11 \u00BB, \u00AB 54 \u00BB, \u00AB 43 \u00BB. La pi\u00E8ce n'est\n     jamais coup\u00E9e : chaque cadre re\u00E7oit l'image \u00E0 son rapport. */\n  const carteOf = (p, color) => {\n    const e = PHOTO && PHOTO.pieces && PHOTO.pieces[p.slug];\n    if (!e || !e.fichier) return null;\n    /* sans couleur demand\u00E9e : la couleur de la carte par d\u00E9faut si elle est en vente, sinon la premi\u00E8re en vente */\n    const inSale = (n) => p.couleurs.some((k) => !k.rupture && (k.nom === n || k.cle === n));\n    const want = color || (e.couleur && !inSale(e.couleur) ? (p.couleurs.find((k) => !k.rupture) || {}).nom : '');\n    const c = want && e.couleurs && e.couleurs[want];\n    return c && c.fichier && c.fichier !== e.fichier ? { fichier: c.fichier, box: c.box, fen: null } : e;\n  };\n  /* cadres : [cadre] ou [[media, cadre], \u2026, [null, cadre]] (le dernier sans media) */\n  function pieceImg(p, { color = '', alt = '', sizes = '(max-width: 760px) 100vw, 33vw', eager = false, cls = '', imgCls = '', cadres = ['45'] } = {}) {\n    const c = carteOf(p, color);\n    const charge = eager ? 'loading=\"eager\" fetchpriority=\"high\"' : 'loading=\"lazy\"';\n    const ic = imgCls ? ` class=\"${esc(imgCls)}\"` : '';\n    if (!c) return `<img${ic} src=\"${cut(p)}\" alt=\"${esc(alt)}\" ${charge} decoding=\"async\" draggable=\"false\">`;\n    const ws = PHOTO.largeurs, w = ws[ws.length - 1], d = PHOTO.dossier;\n    const list = cadres.map((x) => (Array.isArray(x) ? x : [null, x]));\n    const nom = (r) => (r === '45' || !c.fen || c.fen[r] == null ? c.fichier : `${c.fichier}-r${r}`);\n    const rat = (r) => (nom(r) === c.fichier ? PHOTO.ratio || .8 : PHOTO.cadres[r]);\n    const set = (r, ext) => ws.map((x) => `${d}${nom(r)}-${x}.${ext} ${x}w`).join(', ');\n    const src = (m, r) => ['avif', 'webp'].map((ext) => `<source${m ? ` media=\"${m}\"` : ''} type=\"image/${ext}\" srcset=\"${set(r, ext)}\" sizes=\"${esc(sizes)}\">`).join('');\n    const last = list[list.length - 1][1];\n    return `<picture class=\"simg${cls ? ' ' + esc(cls) : ''}\">${list.map(([m, r]) => src(m, r)).join('')}`\n      + `<img${ic} src=\"${d}${nom(last)}-${ws.includes(1080) ? 1080 : w}.webp\" alt=\"${esc(alt)}\" width=\"${w}\" height=\"${Math.round(w / rat(last))}\" ${charge} decoding=\"async\" draggable=\"false\"></picture>`;\n  }\n  /* Vignette carr\u00E9e (panier, suggestions, barre d'achat, Merci) : la pi\u00E8ce enti\u00E8re et grande (80 % du cadre), centr\u00E9e, sur le\n     studio de sa carte, dans la couleur choisie quand elle a sa photo. px : c\u00F4t\u00E9 de la vignette affich\u00E9e. */\n  function pieceFit(p, color, px = 96) {\n    const c = carteOf(p, color);\n    if (!c) return studio(p, { cls: 'studio--mini' });\n    const [x0, y0, x1, y1] = c.box, R = 1 / (PHOTO.ratio || .8);\n    const k = Math.max(1, .8 / Math.max(x1 - x0, (y1 - y0) * R));\n    const left = Math.min(0, Math.max(1 - k, .5 - (x0 + x1) / 2 * k));\n    const top = Math.min(0, Math.max(1 - R * k, .5 - (y0 + y1) / 2 * R * k));\n    const ws = PHOTO.largeurs, w = ws.find((x) => x >= px * k * 2) || ws[ws.length - 1];\n    return `<img class=\"tthumb\" src=\"${PHOTO.dossier}${c.fichier}-${w}.webp\" alt=\"\" width=\"${w}\" height=\"${Math.round(w * R)}\" loading=\"lazy\" decoding=\"async\" draggable=\"false\" style=\"width:${(k * 100).toFixed(1)}%;height:auto;left:${(left * 100).toFixed(1)}%;top:${(top * 100).toFixed(1)}%\">`;\n  }\n\n  const TABLEAU = {\n    incurve: 'incurve-sel',\n    'petit-incurve': 'petit-incurve-galerie',\n    capiton: 'capiton-matin',\n    meridienne: 'meridienne-platre',\n    'petit-mouton': 'petit-mouton-paris',\n    causeuse: 'causeuse-arches'\n  };\n  /* Fond flou pour les pi\u00E8ces sans tableau */\n  const SOFT = {\n    courbe: 'capiton-matin',\n    'noix-de-cajou': 'incurve-sel',\n    galet: 'petit-mouton-paris',\n    berceuse: 'capiton-matin',\n    veilleuse: 'meridienne-platre',\n    'miroir-onde': 'petit-incurve-galerie',\n    'table-nuage': 'incurve-sel'\n  };\n  const CAUSEUSE_FINAL = '/final/causeuse-verte--arches-ocre-16x9--reserve.jpg';\n  /* Proportions des d\u00E9tour\u00E9s (largeur / hauteur) */\n  const RATIO = { berceuse: .93, capiton: 2.4, causeuse: 2.26, courbe: 2.02, galet: .91, incurve: 3.01, meridienne: 1.68, 'miroir-onde': .33, 'noix-de-cajou': 1.72, 'petit-incurve': 2.18, 'petit-mouton': 1.62, 'table-nuage': 1.38, veilleuse: 1.27, 'angle-cotele': 2.72, 'u-cotele': 2.79, coquillage: .72, 'miroir-organique': 1.38 };\n  const shape = (p) => { const r = RATIO[p.slug] || 1.6; return r < .6 ? 'tall' : r < 1.32 ? 'square' : 'wide'; };\n\n  const PAYS_DE = { FR: 'la France', DE: \"l'Allemagne\", ES: \"l'Espagne\", PL: 'la Pologne', CN: 'la Chine' };\n  const PAYS_EN = { FR: 'en France', DE: 'en Allemagne', ES: 'en Espagne', PL: 'en Pologne', CN: 'en Chine' };\n  /* Entrep\u00F4ts europ\u00E9ens hors de France, lus dans site.json > livraison.delais : une seule source pour les textes g\u00E9n\u00E9raux\n     (09/10 : la Pologne, d'o\u00F9 partent Hamac et Lierre, manquait dans la page Livraison, les CGV et les questions) */\n  const EU_KEYS = () => Object.keys(SITE.livraison.delais).filter((k) => k !== 'FR');\n  const euDe = (ap = \"'\") => orList(EU_KEYS().map((k) => PAYS_DE[k])).replace(/'/g, ap);\n  const euEn = () => orList(EU_KEYS().map((k) => PAYS_EN[k]));\n  const euMin = () => Math.min(...EU_KEYS().map((k) => SITE.livraison.delais[k][0]));\n  const euMax = () => Math.max(...EU_KEYS().map((k) => SITE.livraison.delais[k][1]));\n  /* Co\u00FBt de retour d'une pi\u00E8ce volumineuse (art. L221-23) : hypoth\u00E8se \u00E0 confirmer avec le transporteur, voir _tests/AUDIT.md */\n  /* Co\u00FBt d'un retour : une seule source (site.json > retours.estimation), la m\u00EAme phrase partout (information due, ton neutre) */\n  /* 07/10 : retour offert pour les fauteuils, poufs, coussins, plaids et objets de d\u00E9coration (site.json > retours.retourOffert) ;\n     canap\u00E9s et lits : frais \u00E0 la charge du client, montants estim\u00E9s de site.json > retours.estimation */\n  const retourOffert = (p) => !!p && (SITE.retours.retourOffert || []).includes(p.collection) && !isBed(p);\n  /* 18/10 (audit 03 \u00AB Bancs coffre \u00BB) : la r\u00E8gle d\u00E9j\u00E0 appliqu\u00E9e par retourOffert, \u00E9crite en entier (tapis, miroirs, t\u00EAtes de\n     lit et bancs coffre nomm\u00E9s), la m\u00EAme phrase pour les pages Livraison, Questions et Conditions de vente */\n  const retourCout = () => { const E = SITE.retours.estimation; return `Le retour est offert pour les fauteuils, les poufs, les coussins, les plaids, les tapis, les miroirs et la d\u00E9coration : nous payons le transport du retour. Pour un canap\u00E9, un lit, une t\u00EAte de lit ou un banc coffre, les frais de retour sont \u00E0 votre charge : environ ${price(E.canapes)} pour un canap\u00E9${E.lits ? `, ${price(E.lits)} pour un lit en kit` : ''}, ${price(E.deco)} pour une t\u00EAte de lit ou un banc coffre. Une pi\u00E8ce volumineuse repart avec un transporteur adapt\u00E9, que nous vous indiquons.`; };\n  /* Contact : une seule coordonn\u00E9e mise en avant, l'e-mail ; un seul d\u00E9lai de r\u00E9ponse, le m\u00EAme sur le site et dans les\n     e-mails (site.json > reponse). Le nom complet et le t\u00E9l\u00E9phone ne figurent que dans les mentions l\u00E9gales. */\n  const reponse = () => SITE.reponse || 'sous 24 h, du lundi au samedi';\n  const mailLink = (cls = 'link') => `<a${cls ? ` class=\"${cls}\"` : ''} href=\"mailto:${SITE.email}\">${SITE.email}</a>`;\n\n  /* ---------------- Ic\u00F4nes ---------------- */\n  const sv = (d, extra = '') => `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" ${extra}>${d}</svg>`;\n  const I = {\n    ne: sv('<path d=\"M7 17L17 7M9 7h8v8\"/>', 'class=\"arrow-ne\"'),\n    right: sv('<path d=\"M5 12h14M13 6l6 6-6 6\"/>'),\n    left: sv('<path d=\"M19 12H5M11 6l-6 6 6 6\"/>'),\n    chevL: sv('<path d=\"M14.5 6l-6 6 6 6\"/>'),\n    chevR: sv('<path d=\"M9.5 6l6 6-6 6\"/>'),\n    plus: sv('<path d=\"M12 5v14M5 12h14\"/>'),\n    minus: sv('<path d=\"M5 12h14\"/>'),\n    x: sv('<path d=\"M6 6l12 12M18 6L6 18\"/>'),\n    loupe: sv('<circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"M20 20l-4.5-4.5M11 8.5v5M8.5 11h5\"/>'),\n    truck: sv('<path d=\"M3 7h11v9H3zM14 10h4l3 3v3h-7\"/><circle cx=\"7\" cy=\"17.5\" r=\"1.8\"/><circle cx=\"17.5\" cy=\"17.5\" r=\"1.8\"/>'),\n    back: sv('<path d=\"M9 14L4 9l5-5\"/><path d=\"M4 9h10a6 6 0 0 1 0 12h-3\"/>'),\n    card: sv('<rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"3\"/><path d=\"M3 10h18M7 15h4\"/>'),\n    gift: sv('<rect x=\"4\" y=\"10\" width=\"16\" height=\"10\" rx=\"2\"/><path d=\"M3 7.5h18V10H3zM12 7.5V20M12 7.5c-1.4-3.2-5.2-3.2-5.2-1.2 0 1.2 2.6 1.2 5.2 1.2zm0 0c1.4-3.2 5.2-3.2 5.2-1.2 0 1.2-2.6 1.2-5.2 1.2z\"/>'),\n    check: sv('<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M8 12.5l2.6 2.5L16 9.5\"/>'),\n    box: sv('<path d=\"M4 8l8-4 8 4v8l-8 4-8-4zM4 8l8 4 8-4M12 12v8\"/>'),\n    ruler: sv('<path d=\"M3 15L15 3l6 6L9 21zM7 11l2 2M10 8l2 2M13 5l2 2\"/>'),\n    door: sv('<path d=\"M6 21V4h12v17M3 21h18M14.5 12.5h.01\"/>'),\n    seat: sv('<path d=\"M4 18v-5a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v5M4 15h16M6 18v2M18 18v2M7 10V7a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v3\"/>'),\n    mail: sv('<path d=\"M4 6.5h16v11H4zM4.5 7l7.5 6 7.5-6\"/>'),\n    phone: sv('<path d=\"M5 4h4l2 5-2.5 1.5a11 11 0 0 0 5 5L15 13l5 2v4a2 2 0 0 1-2 2A16 16 0 0 1 3 6a2 2 0 0 1 2-2z\"/>'),\n    pin: sv('<path d=\"M12 21s-7-6.2-7-11a7 7 0 0 1 14 0c0 4.8-7 11-7 11z\"/><circle cx=\"12\" cy=\"10\" r=\"2.5\"/>'),\n    bag: sv('<path d=\"M6 8h12l-1 11H7L6 8zM9 8V7a3 3 0 0 1 6 0v1\"/>'),\n    shield: sv('<path d=\"M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z\"/><path d=\"M8.5 12l2.4 2.4 4.6-4.8\"/>'),\n    pause: sv('<rect x=\"6\" y=\"5\" width=\"4\" height=\"14\" rx=\"1.2\"/><rect x=\"14\" y=\"5\" width=\"4\" height=\"14\" rx=\"1.2\"/>'),\n    play: sv('<path d=\"M7 5l12 7-12 7z\"/>'),\n    leaf: sv('<path d=\"M5 19c0-8 5-13 14-14-1 9-6 14-14 14zM5 19l7-7\"/>'),\n    euro: sv('<path d=\"M17 6.5a6.5 6.5 0 1 0 0 11M4 10.5h9M4 13.5h9\"/>'),\n    arc: sv('<path d=\"M3 17c0-6 4-10 9-10s9 4 9 10\"/><path d=\"M7 17c0-3.5 2.2-6 5-6s5 2.5 5 6\"/>'),\n    hand: sv('<path d=\"M8 13V6.5a1.5 1.5 0 0 1 3 0V12M11 11.5V5a1.5 1.5 0 0 1 3 0v6.5M14 11.5V6.5a1.5 1.5 0 0 1 3 0V14c0 4-2.5 7-6 7-2.6 0-4-1.4-5.5-3.6L4 15a1.5 1.5 0 0 1 2.4-1.8L8 15\"/>'),\n    foam: sv('<rect x=\"3\" y=\"14\" width=\"18\" height=\"5\" rx=\"2.5\"/><rect x=\"4.5\" y=\"9\" width=\"15\" height=\"5\" rx=\"2.5\"/><path d=\"M8 6.5c1.5-1 2.5 1 4 0s2.5 1 4 0\"/>'),\n    palette: sv('<circle cx=\"8\" cy=\"9\" r=\"3\"/><circle cx=\"16\" cy=\"9\" r=\"3\"/><circle cx=\"12\" cy=\"16\" r=\"3\"/>'),\n    modules: sv('<rect x=\"2.5\" y=\"9\" width=\"8.5\" height=\"8\" rx=\"3\"/><rect x=\"13\" y=\"9\" width=\"8.5\" height=\"8\" rx=\"3\"/><path d=\"M5 9V7M19 9V7\"/>'),\n    cushion: sv('<path d=\"M5 6c2 1 12 1 14 0 1 4 1 8 0 12-2-1-12-1-14 0-1-4-1-8 0-12z\"/>'),\n    wave: sv('<path d=\"M3 15c3-5 6 3 9-2s6 3 9-2\"/><path d=\"M3 19h18\"/>'),\n    rock: sv('<path d=\"M7 4v8a3 3 0 0 0 3 3h4a3 3 0 0 0 3-3V8\"/><path d=\"M3 19c5 2.5 13 2.5 18 0\"/><path d=\"M8 15l-1.5 4.5M16 15l1.5 4.5\"/>'),\n    feet: sv('<rect x=\"4\" y=\"9\" width=\"16\" height=\"7\" rx=\"3.5\"/><path d=\"M6.5 16v3M17.5 16v3\"/>'),\n    shelf: sv('<path d=\"M5 4h14v16H5zM5 11h14M10 7.5h4M10 14.5h4\"/>'),\n    mirror: sv('<path d=\"M12 3c3.3 0 5 3 5 9s-1.7 9-5 9-5-3-5-9 1.7-9 5-9z\"/><path d=\"M10 8l2-2M10 12l4-4\"/>'),\n    legs: sv('<path d=\"M3 10h18M6 10v9M18 10v9M9.5 10v5M14.5 10v5\"/>'),\n    plate: sv('<path d=\"M4 10c0-2.5 3-4 8-4s8 1.5 8 4-3 4-8 4-8-1.5-8-4z\"/><path d=\"M7 13.5V19M17 13.5V19\"/>'),\n    sun: sv('<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6l1.4 1.4M17 17l1.4 1.4M5.6 18.4L7 17M17 7l1.4-1.4\"/>'),\n    camera: sv('<path d=\"M4 8h3l1.5-2h7L17 8h3v11H4z\"/><circle cx=\"12\" cy=\"13\" r=\"3.5\"/>'),\n    knot: sv('<path d=\"M3 8c3-2 6 1 9 4s6 6 9 4M3 16c3 2 6-1 9-4s6-6 9-4\"/>'),\n    throw: sv('<path d=\"M4 5h16v11H4zM4 16l2 3M8 16l1 3M12 16v3M16 16l-1 3M20 16l-2 3\"/>'),\n    pouf: sv('<ellipse cx=\"12\" cy=\"9.5\" rx=\"8\" ry=\"3\"/><path d=\"M4 9.5v4.5c0 1.7 3.6 3 8 3s8-1.3 8-3V9.5\"/>'),\n    paw: sv('<ellipse cx=\"12\" cy=\"15.5\" rx=\"4.2\" ry=\"3.6\"/><circle cx=\"6.5\" cy=\"10.5\" r=\"1.7\"/><circle cx=\"9.8\" cy=\"6.8\" r=\"1.7\"/><circle cx=\"14.2\" cy=\"6.8\" r=\"1.7\"/><circle cx=\"17.5\" cy=\"10.5\" r=\"1.7\"/>'),\n    ask: sv('<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M9.6 9.4a2.5 2.5 0 0 1 4.8.9c0 1.7-2.4 2.2-2.4 3.7M12 17h.01\"/>'),\n    ok: sv('<path d=\"M5 12.5l4.5 4.5L19 7.5\"/>'),\n    heart: sv('<path d=\"M12 20s-7.5-4.6-7.5-10.2A4.3 4.3 0 0 1 12 7.2a4.3 4.3 0 0 1 7.5 2.6C19.5 15.4 12 20 12 20z\"/>'),\n    link: sv('<path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1\"/><path d=\"M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1\"/>'),\n    cal: sv('<rect x=\"4\" y=\"5.5\" width=\"16\" height=\"14\" rx=\"3\"/><path d=\"M4 10h16M8.5 3.5v4M15.5 3.5v4\"/>')\n  };\n  /* Ic\u00F4ne d'un point fort (champ \u00AB icone \u00BB du catalogue) */\n  const FORT_ICON = { courbe: 'arc', matiere: 'hand', assise: 'seat', carton: 'box', mousse: 'foam', couleurs: 'palette', mesure: 'ruler', modules: 'modules', coussins: 'cushion', vague: 'wave', dossier: 'seat', bascule: 'rock', repos: 'feet', rangement: 'shelf', lumiere: 'sun', miroir: 'mirror', pieds: 'legs', plateau: 'plate' };\n  const fortIcon = (k) => I[FORT_ICON[k]] || I.check;\n\n  /* ---------------- Al\u00E9atoire d\u00E9terministe (suggestions) ---------------- */\n  const hash = (s) => { let h = 2166136261; for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 16777619); } return h >>> 0; };\n\n  /* ---------------- Fonds doux tir\u00E9s du produit ---------------- */\n  /* Couleur de fond de la grande carte pour la 1re couleur de chaque pi\u00E8ce */\n  const FOND = {\n    incurve: '#E8DCCB',          /* sable */\n    'petit-incurve': '#E4E0D4',  /* lin */\n    capiton: '#EEDFD3',          /* cr\u00E8me ros\u00E9e */\n    causeuse: '#D5DCC9',         /* sauge */\n    courbe: '#E3DCCD',           /* gr\u00E8ge */\n    'noix-de-cajou': '#EBDBC6',  /* biscuit */\n    meridienne: '#DCDFCF',       /* sauge p\u00E2le */\n    'petit-mouton': '#ECE3D6',   /* cr\u00E8me */\n    galet: '#E2D8CB',            /* argile */\n    berceuse: '#EAD9C8',         /* caramel clair */\n    veilleuse: '#D7E3DD',        /* vert d'eau */\n    'miroir-onde': '#E7DFD3',    /* pl\u00E2tre */\n    'table-nuage': '#DCE2E3'     /* ciel p\u00E2le */\n  };\n  const NOM_FOND = { incurve: 'sable', 'petit-incurve': 'lin', capiton: 'cr\u00E8me ros\u00E9e', causeuse: 'sauge', courbe: 'gr\u00E8ge', 'noix-de-cajou': 'biscuit', meridienne: 'sauge', 'petit-mouton': 'cr\u00E8me', galet: 'argile', berceuse: 'caramel', veilleuse: \"vert d'eau\", 'miroir-onde': 'pl\u00E2tre', 'table-nuage': 'ciel' };\n  const hexRgb = (h) => { const n = parseInt(h.replace('#', ''), 16); return [(n >> 16) & 255, (n >> 8) & 255, n & 255]; };\n  const mixHex = (h1, h2, t) => { const a = hexRgb(h1), b = hexRgb(h2); return '#' + a.map((v, i) => Math.round(v + (b[i] - v) * t).toString(16).padStart(2, '0')).join(''); };\n  /* Fond pour une couleur : la 1re garde sa teinte choisie, les autres sont des pastels de la couleur */\n  /* Un seul studio pour toutes les pi\u00E8ces : la charte prime sur la couleur du tissu */\n  const STUDIO_BG = '#F0EFEB';   /* fond clair des photos (studio-clair.py) */\n  function bgOf() { return STUDIO_BG; }\n\n  /* une nouvelle tentative, puis repli sur la premi\u00E8re vraie photo gard\u00E9e (jamais une photo retir\u00E9e de galeries.json) */\n  const fallbackAttr = (p) => { const im = okImages(p)[0]; return `onerror=\"if(!this.dataset.retry){this.dataset.retry=1;var i=this;setTimeout(function(){i.src='${cut(p)}?r=1'},500)}else{this.onerror=null;${im ? `this.src='${photo(p, im.id, 640)}';this.classList.add('is-photo')` : ''}}\"`; };\n\n  function prodImg(p, { alt = '', eager = false } = {}) {\n    return `<img src=\"${cut(p)}\" alt=\"${esc(alt)}\" ${eager ? 'fetchpriority=\"high\"' : 'loading=\"lazy\"'} decoding=\"async\" draggable=\"false\" ${fallbackAttr(p)}>`;\n  }\n  function objHtml(p, o = {}) {\n    return `<span class=\"studio__shadow\" aria-hidden=\"true\"></span>${prodImg(p, o)}`;\n  }\n\n  /* Studio : fond doux, sol, ombre de contact r\u00E9aliste, pi\u00E8ce d\u00E9tour\u00E9e pos\u00E9e au sol */\n  function studio(p, { cls = '', alt = '', eager = false, k = 0, extra = '', attrs = '' } = {}) {\n    return `<div class=\"studio studio--${shape(p)} ${cls}\" style=\"--bg:${bgOf(p, k)};--r:${RATIO[p.slug] || 1.6}\" ${attrs}>\n      <div class=\"studio__obj\">${objHtml(p, { alt, eager })}</div>\n      ${extra}\n    </div>`;\n  }\n  /* compatibilit\u00E9 : ancien nom */\n  const stage = (p, o = {}) => studio(p, { k: o.k || 0, cls: o.cls || '' });\n\n  /* Vignette : la carte en vraie photo de la couleur choisie (pi\u00E8ce enti\u00E8re, voir pieceFit) ; sans carte, la photo gard\u00E9e de\n     la couleur, sinon le d\u00E9tour\u00E9 */\n  function thumbFor(p, colorName) {\n    if (carteOf(p)) return pieceFit(p, colorName);\n    const k = Math.max(0, p.couleurs.findIndex((x) => x.nom === colorName));\n    const c = p.couleurs[k];\n    if (c.image && k > 0 && !retirees(p).has(c.image)) return `<img class=\"thumb-photo\" src=\"${photo(p, c.image, 640)}\" alt=\"\" loading=\"lazy\" decoding=\"async\">`;\n    return studio(p, { k, cls: 'studio--mini' });\n  }\n\n  /* ---------------- Dates de livraison (jours ouvr\u00E9s) ---------------- */\n  function easter(y) {\n    const a = y % 19, b = Math.floor(y / 100), c = y % 100, d = Math.floor(b / 4), e = b % 4, f = Math.floor((b + 8) / 25), g = Math.floor((b - f + 1) / 3), h = (19 * a + b - d - g + 15) % 30, i = Math.floor(c / 4), k = c % 4, l = (32 + 2 * e + 2 * i - h - k) % 7, m = Math.floor((a + 11 * h + 22 * l) / 451);\n    const month = Math.floor((h + l - 7 * m + 114) / 31), day = ((h + l - 7 * m + 114) % 31) + 1;\n    return new Date(y, month - 1, day);\n  }\n  function holidays(y) {\n    const e = easter(y);\n    const add = (dt, n) => { const x = new Date(dt); x.setDate(x.getDate() + n); return x; };\n    return [new Date(y, 0, 1), add(e, 1), new Date(y, 4, 1), new Date(y, 4, 8), add(e, 39), add(e, 50), new Date(y, 6, 14), new Date(y, 7, 15), new Date(y, 10, 1), new Date(y, 10, 11), new Date(y, 11, 25)].map((x) => x.toDateString());\n  }\n  function addBusiness(from, n) {\n    const d = new Date(from);\n    const hs = new Set(holidays(d.getFullYear()).concat(holidays(d.getFullYear() + 1)));\n    let c = 0;\n    while (c < n) { d.setDate(d.getDate() + 1); const w = d.getDay(); if (w !== 0 && w !== 6 && !hs.has(d.toDateString())) c++; }\n    return d;\n  }\n  const JOURS = ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'];\n  const MOIS = ['janvier', 'f\u00E9vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao\u00FBt', 'septembre', 'octobre', 'novembre', 'd\u00E9cembre'];\n  const dayLbl = (d, m) => `${JOURS[d.getDay()]}${NB}${d.getDate() === 1 ? '1er' : d.getDate()}${m ? NB + MOIS[d.getMonth()] : ''}`;\n  /* D\u00E9lai d'une pi\u00E8ce : celui de son pays d'exp\u00E9dition ; les accessoires vendus seuls ont aussi les leurs (site.json >\n     livraison > delaisAccessoires, coussins n\u0153ud depuis la Chine), hors des d\u00E9lais g\u00E9n\u00E9raux du site */\n  const DL = (p) => SITE.livraison.delais[p.pays] || (SITE.livraison.delaisAccessoires || {})[p.pays] || SITE.livraison.delais.FR;\n  /* Date de livraison (07/10, chantier 2) : une seule date, la borne la plus prudente du d\u00E9lai de l'entrep\u00F4t de la pi\u00E8ce\n     (3 \u00E0 7 jours ouvr\u00E9s depuis la France, 4 \u00E0 8 depuis l'Allemagne, l'Espagne ou la Pologne), en jours ouvr\u00E9s hors jours f\u00E9ri\u00E9s.\n     \u00AB d\u2019ici le vendredi 16 octobre \u00BB ; le th\u00E8me Shopify sert la m\u00EAme date dans le HTML (snippets/caplia-date-livraison). */\n  function delivery(p) {\n    return `d\u2019ici le ${dayLbl(addBusiness(new Date(), DL(p)[1]), true)}`;\n  }\n  /* Date d'un cadeau (supervision du 08/10) : celle de l'article vendu seul qu'il est (site.json > paliers > produit) :\n     coussins depuis la Chine (6 \u00E0 12 jours ouvr\u00E9s), plaid depuis l'Espagne ; il voyage dans son propre colis */\n  const giftProd = (pl) => (pl && BY[pl.produit]) || null;\n  const giftWhen = (pl) => { const g = giftProd(pl); return g ? delivery(g) : ''; };\n  /* la m\u00EAme date, courte (barre d'achat du t\u00E9l\u00E9phone) : \u00AB d\u2019ici le 16 octobre \u00BB */\n  const MOIS_C = ['janv.', 'f\u00E9vr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'ao\u00FBt', 'sept.', 'oct.', 'nov.', 'd\u00E9c.'];\n  const deliveryShort = (p) => { const d = addBusiness(new Date(), DL(p)[1]); return `${isFem(p) ? 'Livr\u00E9e' : 'Livr\u00E9'} d\u2019ici le ${d.getDate() === 1 ? '1er' : d.getDate()}${NB}${MOIS_C[d.getMonth()]}`; };\n  const delayTxt = (p) => { const [a, b] = DL(p); return `${a} \u00E0 ${b} jours ouvr\u00E9s`; };\n  const deliveryEnd = (p) => dayLbl(addBusiness(new Date(), DL(p)[1]), true);\n\n  /* ---------------- Libell\u00E9s produit ---------------- */\n  function dimsLabel(p) {\n    if (p.tailles) return p.tailles.map((t) => t.nom.replace(/ cm$/, '')).join(', ').replace(/, ([^,]*)$/, ' ou $1') + NB + 'cm';\n    const d = p.dimensions;\n    return `${numFr(d.largeur)}${NB}\u00D7${NB}${numFr(d.profondeur)}${NB}cm`;\n  }\n  const heightLabel = (p) => (p.tailles && isMirror(p) ? sizeNums(p, 0) : cm(p.dimensions.hauteur));\n  const colorsLabel = (p) => (p.couleurs.length === 1 ? p.couleurs[0].nom : `${p.couleurs.length} couleurs`);\n  function specs(p, which = 'all') {\n    const [a, b] = DL(p);\n    const all = [\n      ['Dimensions', dimsLabel(p)],\n      ['Hauteur', heightLabel(p)],\n      ['Mati\u00E8re', p.matiere],\n      [p.couleurs.length === 1 ? 'Couleur' : 'Couleurs', colorsLabel(p)],\n      ['Exp\u00E9dition', `Depuis ${PAYS_DE[p.pays]}`],\n      ['Livraison', `Offerte \u00B7 ${a} \u00E0 ${b} j ouvr\u00E9s`]\n    ];\n    const list = which === 'short' ? all.slice(0, 3) : all;\n    return list.map(([k, v]) => `<div><dt>${k}</dt><dd>${esc(v)}</dd></div>`).join('');\n  }\n  const unitPriceOf = (p, size) => { if (p.tailles) { const t = p.tailles.find((x) => x.nom === size) || p.tailles[0]; return t.prix; } return p.prix; };\n  const colName = (slug) => CAT.collections.find((c) => c.slug === slug);\n\n  /* ---------------- Cadeaux (paliers de site.json) ---------------- */\n  const GIFT_SHORT = ['coussins n\u0153ud', 'plaid', 'second plaid'];\n  const GIFT_TO = ['aux coussins n\u0153ud offerts', 'au plaid offert', 'au second plaid offert'];\n  const cap1 = (s) => s.charAt(0).toUpperCase() + s.slice(1);\n  const lc1 = (s) => s.charAt(0).toLowerCase() + s.slice(1);\n  /* Couleurs en rupture (\u00AB rupture \u00BB: true dans catalogue.json) : visibles, jamais ajout\u00E9es au panier */\n  const isOut = (c) => !!(c && c.rupture);\n  /* Rupture d'une taille : \u00AB ruptureCouleurs \u00BB (les couleurs \u00E9puis\u00E9es dans cette taille) ou \u00AB rupture \u00BB: true (toutes) */\n  const sizeOutFor = (t, color) => !!(t && (t.rupture === true || (t.ruptureCouleurs || []).includes(color)));\n  /* Pi\u00E8ce visible mais pas encore en vente (\u00AB bientot \u00BB: true) : ni bouton d'achat, ni panier, l'e-mail de mise en vente */\n  const notYet = (p) => !!(p && p.bientot);\n  /* Accessoire vendu seul (catalogue.json \u00AB accessoire \u00BB : coussins n\u0153ud, plaid) : hors des paliers, des suggestions et des salons */\n  const isAcc = (p) => !!(p && p.accessoire);\n  /* En vente : pas \u00AB bient\u00F4t \u00BB, et au moins une couleur encore disponible dans au moins une taille (Mirage, 06/10 : plus aucune) */\n  const onSale = (p) => !!p && !notYet(p) && p.couleurs.some((c) => !c.rupture && (!p.tailles || p.tailles.some((t) => !sizeOutFor(t, c.nom))));\n  /* Ce qui est en vente, pr\u00E9par\u00E9 une fois au chargement :\n     - une couleur \u00AB retiree \u00BB (plus aucun fournisseur) n'appara\u00EEt nulle part, ses donn\u00E9es restent dans catalogue.json ;\n     - une taille \u00E9puis\u00E9e dans toutes les couleurs montr\u00E9es dispara\u00EEt, et le prix de la pi\u00E8ce devient celui des tailles\n       restantes (Mirage, seul en 160 \u00D7 50 cm : \u00AB 290 \u20AC \u00BB, sans \u00AB d\u00E8s \u00BB). */\n  function prepare(p) {\n    const keep = p.couleurs.filter((c) => !c.retiree);\n    if (keep.length) p.couleurs = keep;\n    if (p.tailles) {\n      const shown = p.couleurs.filter((c) => !c.rupture);\n      const ref = shown.length ? shown : p.couleurs;\n      const ts = p.tailles.filter((t) => ref.some((c) => !sizeOutFor(t, c.nom)));\n      if (ts.length) p.tailles = ts;\n      p.prix = Math.min(...p.tailles.map((t) => t.prix));\n    }\n    return p;\n  }\n  /* \u00AB d\u00E8s \u00BB seulement quand plusieurs prix restent en vente */\n  const fromOf = (p) => (p.tailles && new Set(p.tailles.map((t) => t.prix)).size > 1 ? 'd\u00E8s ' : '');\n  /* Taille \u00E0 enregistrer pour une couleur : celle demand\u00E9e si elle est en vente dans cette couleur, sinon la premi\u00E8re\n     en vente ('' sans tailles ; null quand la combinaison demand\u00E9e est \u00E9puis\u00E9e) */\n  const sizeFor = (p, color, size) => {\n    if (!p.tailles) return '';\n    const t = size ? p.tailles.find((x) => x.nom === size) : p.tailles.find((x) => !sizeOutFor(x, color));\n    return t && !sizeOutFor(t, color) ? t.nom : null;\n  };\n  /* Couleur montr\u00E9e par l'image studio : la premi\u00E8re, sauf quand elle est \u00E9puis\u00E9e et qu'une image de la couleur en vente\n     a \u00E9t\u00E9 faite (maquettes/outils/variantes-stock.py) */\n  const STUDIO_COLOR = { berceuse: 'Caramel beurre sal\u00E9', 'miroir-onde': 'Sable blond' };\n  const studioColor = (p) => STUDIO_COLOR[p.slug] || p.couleurs[0].nom;\n  const firstIn = (p) => Math.max(0, p.couleurs.findIndex((c) => !c.rupture));\n  const colorIn = (p, name) => { const c = p.couleurs.find((x) => x.nom === name || (x.cle && x.cle === name)); return c && !c.rupture ? c.nom : p.couleurs[firstIn(p)].nom; };\n  function swatchBtn(c, k, checked, action) {\n    const out = isOut(c);\n    return `<button class=\"swatch${out ? ' is-out' : ''}\" type=\"button\" role=\"radio\" aria-checked=\"${checked}\" aria-label=\"${esc(c.nom)}${out ? ', bient\u00F4t de retour' : ''}\" title=\"${esc(c.nom)}${out ? ' \u00B7 Bient\u00F4t de retour' : ''}\" style=\"--c:${c.hex}\" data-action=\"${action}\" data-k=\"${k}\"></button>`;\n  }\n  /* \u00AB un plaid c\u00F4tel\u00E9 et sherpa \u00BB \u2192 \u00AB Plaid c\u00F4tel\u00E9 et sherpa \u00BB */\n  const giftLabel = (pl) => cap1(pl.cadeau.replace(/^(un|une)\\s+/i, ''));\n  /* accord tir\u00E9 du texte : \u00AB Offerts \u00BB, \u00AB Offert \u00BB, \u00AB Offerte \u00BB */\n  const giftWord = (pl) => (pl.detail.match(/^Offerte?s?/) || ['Offert'])[0];\n  const giftsFor = (total) => SITE.paliers.filter((pl) => total >= pl.seuil);\n  /* Valeur d'un cadeau : le prix de vente sur le site du m\u00EAme article vendu seul (site.json > paliers > produit, catalogue.json\n     \u00AB accessoire \u00BB) ; rien quand l'article n'est pas en vente (jamais une valeur invent\u00E9e) */\n  const giftValue = (pl) => { const a = pl && pl.produit && BY[pl.produit]; return a && onSale(a) ? a.prix : null; };\n  const giftsSaved = (list) => list.reduce((s, pl) => s + (giftValue(pl) || 0), 0);\n  /* valeur d'un cadeau : son prix vendu seul, jamais barr\u00E9 (refonte du 07/10, r\u00E8gle de l'utilisateur) */\n  const strike = (v) => (v ? `<span class=\"was num\">(valeur ${price(v)})</span>` : '');\n  /* Vraie photo du cadeau (cadeaux.json : la pi\u00E8ce pos\u00E9e dans le studio gris, 640 px), chargement diff\u00E9r\u00E9 */\n  function giftPic(pl, cls = 'gpic') {\n    const i = SITE.paliers.indexOf(pl);\n    const ph = GIFTS && GIFTS.paliers && GIFTS.paliers[i] && GIFTS.paliers[i].photos && GIFTS.paliers[i].photos[0];\n    if (!ph) return '';\n    const k = ph.tailles && ph.tailles['640'] ? '640' : Object.keys(ph.tailles || { 640: 1 })[0];\n    return `<span class=\"${cls}\"><picture>${ph.avif ? `<source type=\"image/avif\" srcset=\"/site/assets/${ph.src}-${k}.avif\">` : ''}<img src=\"/site/assets/${ph.src}-${k}.webp\" alt=\"\" width=\"640\" height=\"640\" loading=\"lazy\" decoding=\"async\" draggable=\"false\"></picture></span>`;\n  }\n  const andList = (a) => (a.length < 2 ? a.join('') : a.slice(0, -1).join(', ') + ' et ' + a[a.length - 1]);\n  const orList = (a) => (a.length < 2 ? a.join('') : a.slice(0, -1).join(', ') + ' ou ' + a[a.length - 1]);\n\n  /* ---------------- Ensembles \u00AB Le salon assorti \u00BB (prix = somme exacte) ---------------- */\n  /* L'image de chaque ensemble (cartes-echelle.py) montre ces couleurs-l\u00E0 : la changer ici, c'est refaire l'image */\n  const ENS = [\n    { nom: 'Le salon Corolle', photo: ['incurve', '03'], items: [['incurve', 'Cr\u00E8me de lait'], ['miroir-onde', 'Sable blond', '160 \u00D7 50 cm']] },\n    { nom: 'Le salon \u00C9clipse', photo: ['noix-de-cajou', '10'], items: [['noix-de-cajou', 'Cr\u00E8me clair de lune'], ['galet', 'Cr\u00E8me meringue']] },\n    { nom: 'Le salon Jade', img: 'causeuse-arches', items: [['causeuse', 'Vert sous-bois'], ['galet', 'Cr\u00E8me meringue'], ['miroir-onde', 'Sable blond', '160 \u00D7 50 cm']] },\n    { nom: 'Le salon Ondine', img: 'meridienne-platre', items: [['meridienne', 'Blanc coquillage'], ['galet', 'Cr\u00E8me meringue']] },\n    { nom: 'Le salon Opaline', img: 'petit-incurve-galerie', items: [['petit-incurve', \"Blanc coquille d'\u0153uf\"], ['galet', 'Cr\u00E8me meringue']] },\n    { nom: 'Le petit salon Flocon', img: 'petit-mouton-paris', items: [['petit-mouton', 'Cr\u00E8me guimauve'], ['galet', 'Cr\u00E8me meringue']] },\n    /* Caplia Sleep : les chambres assorties, montr\u00E9es seulement dans l'univers Sleep (sleepSets) */\n    { nom: 'La chambre Songe', sleep: true, items: [['songe', 'Beige lin', '140 \u00D7 200 cm'], ['dune', 'Cr\u00E8me meringue']] },\n    { nom: 'La chambre Brume', sleep: true, items: [['brume', 'Blanc ivoire', '140 \u00D7 200 cm'], ['sillon', 'Gris tourterelle']] },\n    /* 18/10 (audit 09, 3.9) : \u00AB Le salon \u00BB de l'accueil avec les pi\u00E8ces en pub ; seulement sur l'accueil (pas sur la fiche de\n       Cumulus, ensFor), en Terracotta, la couleur que Google fait cliquer */\n    { nom: 'Le salon Cumulus', accueil: true, items: [['bulle-294', 'Terracotta'], ['galet', 'Cr\u00E8me meringue']] }\n  ];\n  const ensTotal = (e) => e.items.reduce((s, [slug, , size]) => s + unitPriceOf(BY[slug], size), 0);\n  /* un ensemble n'est propos\u00E9 que si chacune de ses pi\u00E8ces est en vente dans la couleur et la taille de l'ensemble\n     (jamais une pi\u00E8ce masqu\u00E9e, \u00E9puis\u00E9e ou pas encore en vente) */\n  const ensOk = (e) => e.items.every(([s, color, size]) => {\n    const p = BY[s];\n    if (!onSale(p)) return false;\n    const c = p.couleurs.find((x) => x.nom === color);\n    return !!c && !c.rupture && sizeFor(p, c.nom, size || '') !== null;\n  });\n  const ensFor = (slug) => ENS.find((e) => !e.accueil && e.items[0][0] === slug && ensOk(e));\n\n  /* ---------------- \u00AB Passera-t-il chez vous ? \u00BB ----------------\n     Un meuble passe une porte de profil : il suffit que sa plus petite mesure soit plus \u00E9troite que la porte (2 cm de marge).\n     Pi\u00E8ce compress\u00E9e : c'est son plus grand carton qui passe la porte. Ses cotes (livraison.json > pieces > carton_cm,\n     [longueur, largeur, hauteur] en cm) ne sont \u00E9crites que quand le vendeur les donne ; sans elles, aucune r\u00E9ponse ne dit\n     qu'elle passe : le client envoie ses mesures, nous v\u00E9rifions les cotes du carton et r\u00E9pondons par \u00E9crit sous 24 h, du lundi au samedi.\n     Pi\u00E8ce livr\u00E9e mont\u00E9e ou en modules (Corolle, fauteuils) : ses propres mesures. */\n  const isCompressed = (p) => /compress/i.test((p.carton || []).join(' ') + ' ' + p.description.join(' '));\n  const cartonCm = (p) => { const a = arrOf(p), c = a && a.carton_cm; return Array.isArray(c) && c.length === 3 && c.every((x) => x > 0) ? c : null; };\n  /* la mesure qui passe la porte : la plus petite du plus grand carton (pi\u00E8ce compress\u00E9e), sinon celle de la pi\u00E8ce ; null = pas encore connue */\n  /* Pi\u00E8ce livr\u00E9e en kit (livraison.json \u00AB kit \u00BB : Valse) : c'est son colis qui passe la porte, pas la pi\u00E8ce mont\u00E9e */\n  const isKit = (p) => !isCompressed(p) && !!(arrOf(p) && arrOf(p).kit);\n  /* Pi\u00E8ce livr\u00E9e en colis \u00E0 monter (07/10 : la notice du fabricant le dit, fiches-techniques.json > deballage > Montage) :\n     ce sont ses colis qui passent la porte, pas le canap\u00E9 mont\u00E9 */\n  const isFlat = (p) => !isCompressed(p) && !isKit(p) && (((FT[p.slug] || {}).deballage || []).some(([a, v]) => a === 'Montage' && !/^aucun/i.test(v)));\n  const boxed = (p) => isCompressed(p) || isKit(p) || isFlat(p);\n  const doorMin = (p) => { if (boxed(p)) { const c = cartonCm(p); return c ? Math.min(...c) : null; } return minDim(p); };\n  const dims3 = (c) => `${c.slice(0, 2).map(numFr).join(`${NB}\u00D7${NB}`)}${NB}\u00D7${NB}${cm(c[2])}`;\n  /* Ce qui rassure sur l'arriv\u00E9e, en faits : compress\u00E9 (carton plus petit que la pi\u00E8ce, sans outil) ou en modules */\n  function easyIn(p) {\n    const f = isFem(p) ? 'e' : '';\n    if (isCompressed(p)) {\n      const n = colisN(p), c = cartonCm(p), il = f ? 'Elle' : 'Il';\n      /* nombre de cartons inconnu (18/10, audit 02 Mi1) : rien sur leur nombre */\n      return [`Livr\u00E9${f} compress\u00E9${f}`, c ? `Son plus grand carton mesure ${dims3(c)} : il passe une porte de ${cm(Math.ceil(Math.min(...c) + 2))}. ${il} s'installe sans outil.`\n        : !n ? `${il} s'installe sans outil.`\n        : `${n > 1 ? `Ses ${n} cartons sont plus petits` : 'Son carton est plus petit'} ${f ? \"qu'elle\" : 'que lui'}, et ${il.toLowerCase()} s'installe sans outil.`];\n    }\n    if (isFlat(p)) { const n = colisN(p); return [n ? `Livr\u00E9${f} en ${n} colis` : `Livr\u00E9${f} en colis`, `${n > 1 ? 'Ses colis sont plus petits' : 'Son colis est plus petit'} ${f ? \"qu'elle\" : 'que lui'}, et ${f ? 'elle' : 'il'} se monte sur place.`]; }\n    if (isKit(p)) { const c = cartonCm(p); return [`Livr\u00E9${f} en kit`, c ? `Son colis mesure ${dims3(c)} : il passe une porte de ${cm(Math.ceil(Math.min(...c) + 2))}. Le montage est simple.` : `Son colis est plus petit ${f ? \"qu'elle\" : 'que lui'}, et le montage est simple.`]; }\n    const parts = (p.carton || []).find((t) => /^\\d+ (modules|parties)$/i.test(t));\n    if (parts) return [`Livr\u00E9${f} en ${parts.toLowerCase()}`, `De profil, chacun passe une porte de ${cm(Math.ceil(minDim(p) + 2))}.`];\n    return null;\n  }\n  function doorAnswer(p, w, x = {}) {\n    const e = isFem(p), il = e ? 'elle' : 'il';\n    const ok = w >= 30 && w <= 300;\n    /* escalier ou couloir (facultatif, 07/10) : le passage le plus \u00E9troit des deux compte */\n    const st = x.esc >= 30 && x.esc <= 300 ? x.esc : null;\n    const lim = ok && st ? Math.min(w, st) : w;\n    const where = ok && st && st < w ? `votre escalier ou couloir de ${cm(st)}` : `votre porte de ${cm(w)}`;\n    /* l'e-mail part pr\u00E9rempli : la largeur tap\u00E9e, l'escalier et l'\u00E9tage s'ils sont donn\u00E9s */\n    const body = `Bonjour,\\n\\nPi\u00E8ce : ${p.nom}\\nLargeur de ma porte la plus \u00E9troite : ${ok ? numFr(w) : '\u2026'} cm\\nLargeur de mon escalier ou couloir : ${st ? numFr(st) : '\u2026'} cm\\n\u00C9tage : ${x.etage || '\u2026'}\\n`;\n    const ask = (t) => `<a href=\"mailto:${SITE.email}?subject=${encodeURIComponent('Passera-t-il chez moi ? ' + p.nom)}&body=${encodeURIComponent(body)}\">${t} vos mesures</a>`;\n    if (!ok) return { ok: false, done: false, html: 'Indiquez la largeur de votre porte la plus \u00E9troite, en centim\u00E8tres.' };\n    const min = doorMin(p), c = boxed(p) ? cartonCm(p) : null;\n    /* cotes du carton pas encore connues : jamais \u00AB elle passe \u00BB, la v\u00E9rification se fait par \u00E9crit */\n    if (min == null && isFlat(p)) return { ok: null, done: true, html: `<b>${e ? 'Elle arrive' : 'Il arrive'} en ${colisN(p) > 1 ? `${colisN(p)} colis` : 'colis'}</b>, plus petits ${e ? \"qu'elle\" : 'que lui'}, et se monte sur place. Pour ${where}, ${ask('envoyez-nous')}${st ? '' : ', escalier compris'} : nous v\u00E9rifions les cotes des colis et vous r\u00E9pondons par \u00E9crit sous 24 h, du lundi au samedi.` };\n    if (min == null && isKit(p)) return { ok: null, done: true, html: `<b>${e ? 'Elle arrive en kit' : 'Il arrive en kit'}</b>, dans un colis plus petit ${e ? \"qu'elle\" : 'que lui'}. Pour ${where}, ${ask('envoyez-nous')}${st ? '' : ', escalier compris'} : nous v\u00E9rifions et vous r\u00E9pondons par \u00E9crit sous 24 h, du lundi au samedi.` };\n    if (min == null) return { ok: null, done: true, html: `<b>${e ? 'Elle arrive compress\u00E9e' : 'Il arrive compress\u00E9'}</b>, ${colisN(p) > 1 ? 'dans des cartons plus petits' : 'dans un carton plus petit'} ${e ? \"qu'elle\" : 'que lui'}. Pour ${where}, ${ask('envoyez-nous')}${st ? '' : ', escalier compris'} : nous v\u00E9rifions les cotes du carton et vous r\u00E9pondons par \u00E9crit sous 24 h, du lundi au samedi.` };\n    const what = c ? `la plus petite mesure de son plus grand carton fait ${cm(min)}` : `sa plus petite mesure fait ${cm(min)}`;\n    if (lim >= min + 2) return { ok: true, done: true, html: `<b>Bonne nouvelle</b> : ${what}, ${c ? 'il passe' : `${il} passe`} de profil ${where}. Pour la confirmation \u00E9crite qui nous engage, ${ask('envoyez-nous')}${st ? '' : ', escalier et couloir compris'}.` };\n    return { ok: false, done: true, html: `<b>C'est juste</b> : ${what}, pour ${where}. ${ask('Envoyez-nous')}, porte, escalier et \u00E9tage : nous vous r\u00E9pondons par \u00E9crit avant l'achat.` };\n  }\n\n  /* ---------------- Panier ---------------- */\n  let cart = [];\n  function loadCart() {\n    try {\n      const v = SHOP_CART_LINES();\n      /* jamais une couleur \u00E9puis\u00E9e ou retir\u00E9e, une taille \u00E9puis\u00E9e dans la couleur, ni une pi\u00E8ce pas encore en vente */\n      const rows = Array.isArray(v) ? v.filter((l) => l && BY[l.slug] && l.qty > 0 && !notYet(BY[l.slug]) && !(l.color && !BY[l.slug].couleurs.some((x) => x.nom === l.color || x.cle === l.color)) && !isOut(BY[l.slug].couleurs.find((x) => x.nom === l.color)))\n        .map((l) => { const p = BY[l.slug], color = colorIn(p, l.color || ''); return { slug: l.slug, color, size: sizeFor(p, color, l.size || ''), qty: Math.min(9, Math.max(1, l.qty | 0)) }; })\n        .filter((l) => l.size !== null) : [];\n      cart = [];\n      rows.forEach((l) => { const o = cart.find((x) => x.slug === l.slug && x.color === l.color && x.size === l.size); if (o) o.qty = Math.min(9, o.qty + l.qty); else cart.push(l); });\n    } catch (e) { cart = []; }\n    plaidGifts = plaidGiftCount();\n  }\n  function saveCart() { plaidSwap(); SHOP_CART_SYNC(); }\n  /* Plaid achet\u00E9 seul et plaid offert ne vont jamais ensemble (supervision du 08/10). Quand le panier franchit un palier\n     qui offre le plaid alors qu'un plaid pay\u00E9 y est d\u00E9j\u00E0, le plaid offert le remplace : la ligne pay\u00E9e part, sa couleur\n     devient celle du plaid offert (PLAID_PREF, envoy\u00E9e \u00E0 Shopify avec le cadeau) et le panier le dit (SWAP_MSG).\n     Un plaid ajout\u00E9 expr\u00E8s quand le plaid est d\u00E9j\u00E0 offert reste (on ne compare qu'au franchissement du palier). */\n  const PLAID = 'plaid', PLAID_PREF = 'caplia-plaid-offert';\n  let plaidGifts = 0, SWAP_MSG = '';\n  const plaidGiftCount = () => giftsFor(giftBase()).filter((pl) => pl.produit === PLAID).length;\n  const plaidPref = () => { try { return localStorage.getItem(PLAID_PREF) || ''; } catch (e) { return ''; } };\n  function plaidSwap() {\n    SWAP_MSG = '';\n    swapSeen();\n    const n = plaidGiftCount(), before = plaidGifts;\n    plaidGifts = n;\n    try { if (!n) localStorage.removeItem(PLAID_PREF); } catch (e) { /* stockage indisponible */ }\n    const l = cart.find((x) => x.slug === PLAID);\n    if (n <= before || !l) return;\n    try { localStorage.setItem(PLAID_PREF, l.color); } catch (e) { /* stockage indisponible */ }\n    l.qty -= 1;\n    if (l.qty < 1) cart.splice(cart.indexOf(l), 1);\n    plaidGifts = plaidGiftCount();\n    SWAP_MSG = `Votre plaid ${lc1(l.color)} est maintenant offert : nous l\u2019avons retir\u00E9 de vos achats, ${price(BY[PLAID].prix)} de moins.`;\n    try { sessionStorage.setItem(PLAID_PREF + '-msg', SWAP_MSG); } catch (e) { /* stockage indisponible */ }\n  }\n  /* le message suit le client jusqu'au panier (ajout depuis une fiche, puis \u00AB Voir le panier \u00BB) jusqu'au changement suivant du panier */\n  const swapMsg = () => { if (SWAP_MSG) return SWAP_MSG; try { return sessionStorage.getItem(PLAID_PREF + '-msg') || ''; } catch (e) { return ''; } };\n  const swapSeen = () => { try { sessionStorage.removeItem(PLAID_PREF + '-msg'); } catch (e) { /* stockage indisponible */ } };\n  const lineKey = (l) => `${l.slug}|${l.color}|${l.size}`;\n  const lineTotal = (l) => unitPriceOf(BY[l.slug], l.size) * l.qty;\n  const cartCount = () => cart.reduce((s, l) => s + l.qty, 0) + SHOP_EXTRA_COUNT();\n  const cartTotal = () => cart.reduce((s, l) => s + lineTotal(l), 0) + SHOP_EXTRA_TOTAL();\n  /* Montant qui compte pour les cadeaux : les meubles seulement (un plaid achet\u00E9 ne fait pas gagner le plaid offert) */\n  const giftBase = () => cart.reduce((s, l) => (isAcc(BY[l.slug]) ? s : s + lineTotal(l)), 0);\n\n  function updateBadge(bump) {\n    const n = cartCount();\n    $$('[data-cart-count]').forEach((el) => {\n      el.textContent = n ? String(n) : '';\n      if (bump) { el.classList.remove('bump'); void el.offsetWidth; el.classList.add('bump'); }\n    });\n    const link = $('.nav__cart');\n    if (link) link.setAttribute('aria-label', `Panier, ${n} article${n > 1 ? 's' : ''}`);\n  }\n  function addToCart(slug, color, size, qty = 1, silent = false) {\n    const p = BY[slug];\n    if (!p) return false;\n    if (p.couleurs.every(isOut) || notYet(p)) return false;\n    const c = colorIn(p, color);\n    const s = sizeFor(p, c, size);\n    if (s === null) return false;\n    if (!SHOP_CAN_ADD(p, c, s)) return false;\n    const before = giftsFor(giftBase()).length;\n    const l = cart.find((x) => x.slug === slug && x.color === c && x.size === s);\n    if (l) l.qty = Math.min(9, l.qty + qty); else cart.push({ slug, color: c, size: s, qty });\n    saveCart();\n    updateBadge(true);\n    const what = [p.nom].concat(c && p.couleurs.length > 1 ? [lc1(c)] : [], s ? [s] : []);\n    if (!silent) addedToast(`${what.join(', ')}${what.length > 1 ? ',' : ''} est dans votre panier.${SWAP_MSG ? ' ' + SWAP_MSG : ''}`, giftsFor(giftBase()).slice(before));\n    if (PDP.p === p && !silent) { PDP.done.cart = true; pdpSteps(); }\n  }\n  /* firstColor : la couleur choisie sur la fiche pour la premi\u00E8re pi\u00E8ce (sinon celle de l'ensemble) */\n  function addEnsemble(i, firstColor) {\n    const e = ENS[i];\n    if (!e) return;\n    if (!SHOP_ENS_OK(e)) return;\n    const before = giftsFor(giftBase()).length;\n    e.items.forEach(([slug, color, size], k) => addToCart(slug, colorIn(BY[slug], k === 0 && firstColor ? firstColor : color), size, 1, true));\n    addedToast(`${e.nom} est dans votre panier.`, giftsFor(giftBase()).slice(before));\n    refreshCart();\n  }\n  /* Confirmation sans fen\u00EAtre bloquante : la phrase, le total et \u00AB Voir le panier \u00BB ; un cadeau d\u00E9bloqu\u00E9 passe devant,\n     avec sa photo (\u00AB Coussins n\u0153ud offerts \u2713 \u00BB) */\n  function addedToast(text, won) {\n    const tot = `Total : ${price(cartTotal())}.`;\n    const g = won && won.length ? won[won.length - 1] : null;\n    if (g) {\n      const ss = won.map((pl) => GIFT_SHORT[SITE.paliers.indexOf(pl)]);\n      const many = ss.length > 1 || plural(ss[0]);\n      toast(null, '', false, '', `${giftPic(g, 'toast__pic')}<p><b>${esc(cap1(andList(ss)))} offert${many ? 's' : ''} \u2713</b><br>${esc(text)} ${tot}</p>`);\n    } else toast(null, `${text} ${tot}`);\n  }\n  /* L'effet d'ajout, sobre et sous 600 ms : la vignette part vers le panier, le compteur rebondit (updateBadge), le bouton\n     dit \u00AB Ajout\u00E9 \u2713 \u00BB 1,5 s ; une vibration tr\u00E8s courte au t\u00E9l\u00E9phone. Mouvement r\u00E9duit demand\u00E9 : seul l'\u00E9tat change. */\n  function cartFx(btn, src) {\n    try { if (navigator.vibrate && matchMedia('(pointer: coarse)').matches) navigator.vibrate(12); } catch (err) { /* sans vibration */ }\n    if (btn) {\n      const lbl = $('.cta__label', btn) || btn;\n      if (!btn.dataset.lbl) btn.dataset.lbl = lbl.textContent;\n      lbl.textContent = 'Ajout\u00E9 \u2713'; btn.classList.add('is-done');\n      clearTimeout(btn._t); btn._t = setTimeout(() => { lbl.textContent = btn.dataset.lbl; delete btn.dataset.lbl; btn.classList.remove('is-done'); }, 1500);\n    }\n    if (reduce || !src || !src.animate) return;\n    const img = src.tagName === 'IMG' ? src : $('img', src);\n    const to = $$('.nav__cart').find((x) => x.getBoundingClientRect().width > 0);\n    if (!img || !to) return;\n    const a = src.getBoundingClientRect(), b = to.getBoundingClientRect();\n    if (!a.width || !b.width || a.bottom < 0 || a.top > innerHeight) return;\n    const sz = Math.min(120, a.width, a.height);\n    const g = document.createElement('img');\n    g.src = img.currentSrc || img.src; g.alt = ''; g.className = 'fly';\n    Object.assign(g.style, { left: `${a.left + a.width / 2 - sz / 2}px`, top: `${a.top + a.height / 2 - sz / 2}px`, width: `${sz}px`, height: `${sz}px` });\n    document.body.appendChild(g);\n    const dx = b.left + b.width / 2 - (a.left + a.width / 2), dy = b.top + b.height / 2 - (a.top + a.height / 2);\n    const an = g.animate([{ transform: 'translate(0, 0) scale(1)', opacity: 1 }, { transform: `translate(${dx}px, ${dy}px) scale(.18)`, opacity: .4 }], { duration: 520, easing: 'cubic-bezier(.22, 1, .36, 1)' });\n    const end = () => g.remove();\n    an.onfinish = end; setTimeout(end, 700);\n  }\n\n  /* ---------------- Ma s\u00E9lection (favoris, stockage local) ---------------- */\n  const FAV_KEY = KEY + '-selection';\n  let fav = [];\n  function loadFav() {\n    try { const v = JSON.parse(localStorage.getItem(FAV_KEY) || '[]'); fav = Array.isArray(v) ? [...new Set(v.filter((s) => BY[s]))] : []; } catch (e) { fav = []; }\n  }\n  function saveFav() { try { localStorage.setItem(FAV_KEY, JSON.stringify(fav)); } catch (e) { /* stockage indisponible */ } }\n  const isFav = (slug) => fav.includes(slug);\n  function favBadge() {\n    $$('[data-fav-count]').forEach((el) => { el.textContent = fav.length ? String(fav.length) : ''; });\n    $$('[data-fav-link]').forEach((el) => { el.hidden = !fav.length; });\n    document.documentElement.classList.toggle('has-fav', fav.length > 0);\n    const l = $('.nav__fav');\n    if (l) l.setAttribute('aria-label', `Mes favoris, ${fav.length} pi\u00E8ce${fav.length > 1 ? 's' : ''}`);\n  }\n  function favBtnSync() {\n    $$('[data-action=\"fav\"]').forEach((b) => {\n      const on = isFav(b.dataset.slug);\n      b.setAttribute('aria-pressed', String(on));\n      const t = $('[data-fav-label]', b);\n      if (t) t.textContent = on ? 'Dans ma s\u00E9lection' : 'Enregistrer dans ma s\u00E9lection';\n    });\n  }\n  function toggleFav(slug, force) {\n    if (!BY[slug]) return;\n    const on = force === undefined ? !isFav(slug) : force;\n    fav = fav.filter((s) => s !== slug);\n    if (on) fav.unshift(slug);\n    saveFav(); favBadge(); favBtnSync();\n  }\n\n  /* ---------------- Commande simul\u00E9e (page Merci) ---------------- */\n  const ORDER_KEY = KEY + '-commande';\n  function loadOrder() { try { const o = JSON.parse(localStorage.getItem(ORDER_KEY) || 'null'); return o && Array.isArray(o.items) ? o : null; } catch (e) { return null; } }\n  function saveOrder(o) { try { localStorage.setItem(ORDER_KEY, JSON.stringify(o)); } catch (e) { /* stockage indisponible */ } }\n\n  /* ---------------- Dates ---------------- */\n  const plusDays = (n, from = new Date()) => { const d = new Date(from); d.setDate(d.getDate() + n); return d; };\n  const dateLbl = (d) => `${d.getDate() === 1 ? '1er' : d.getDate()} ${MOIS[d.getMonth()]}`;\n\n  /* ---------------- La peur n\u00B0 1 de chaque avatar, en une ligne sous le prix ---------------- */\n  const FEAR = {\n    incurve: ['paw', 'Enfants, chat : une tache se tamponne au chiffon humide, sans frotter.'],\n    'noix-de-cajou': ['paw', 'Enfants, chat : une tache se tamponne au chiffon humide, sans frotter.'],\n    capiton: ['paw', 'Enfants, chien : une tache se tamponne au chiffon humide, sans frotter.'],\n    meridienne: ['paw', 'Une tache sur la chenille ? Elle se tamponne au chiffon humide, sans frotter.'],\n    causeuse: ['door', '\u00C0 deux, sans h\u00E9siter : envoyez-nous vos mesures, nous v\u00E9rifions qu\u2019il passe chez vous et vous r\u00E9pondons par \u00E9crit.'],\n    'petit-incurve': ['door', '\u00C0 deux, sans h\u00E9siter : envoyez-nous vos mesures, nous v\u00E9rifions qu\u2019il passe chez vous et vous r\u00E9pondons par \u00E9crit.'],\n    courbe: ['door', 'Envoyez-nous vos mesures : nous v\u00E9rifions qu\u2019il passe chez vous et vous r\u00E9pondons par \u00E9crit.'],\n    'petit-mouton': ['box', 'Un carton, aucun outil : il reprend sa forme en 72 heures.'],\n    veilleuse: ['seat', 'Apr\u00E8s b\u00E9b\u00E9, il reste au salon : le fauteuil des soir\u00E9es lecture, repose-pieds compris.'],\n    berceuse: ['seat', 'D\u2019abord dans la chambre de b\u00E9b\u00E9, ensuite au salon : il va partout.'],\n    galet: ['hand', 'Une tache sur la bouclette ? Elle se tamponne au chiffon humide, sans frotter.'],\n    'miroir-onde': ['camera', 'Un souci \u00E0 la livraison ? Une photo par e-mail suffit, nous nous en occupons.'],\n    'table-nuage': ['camera', 'Un souci \u00E0 la livraison ? Une photo par e-mail suffit, nous nous en occupons.']\n  };\n\n  /* Copier un texte (lien de fiche) : presse-papiers, sinon s\u00E9lection manuelle */\n  async function copyText(txt, input) {\n    try { await navigator.clipboard.writeText(txt); return true; } catch (e) {\n      if (input) { input.focus(); input.select(); try { return document.execCommand('copy'); } catch (e2) { return false; } }\n      return false;\n    }\n  }\n  const pageUrl = (hash) => location.origin + TO_URL(hash);\n\n  /* ---------------- Envoyer (fiche, panier, s\u00E9lection) ----------------\n     Un canap\u00E9 se choisit en plusieurs fois, souvent d'abord au t\u00E9l\u00E9phone : le client s'envoie la page pour la rouvrir\n     plus tard, ici ou sur un ordinateur. T\u00E9l\u00E9phone : le partage du syst\u00E8me (e-mail, messagerie, notes). Ailleurs : un\n     petit menu \u00AB Copier le lien \u00BB, \u00AB M'envoyer par e-mail \u00BB (objet et lien d\u00E9j\u00E0 \u00E9crits, le client met son adresse).\n     Les liens rouvrent la m\u00EAme couleur et la m\u00EAme taille (fiche), recr\u00E9ent le panier ou la s\u00E9lection (takeShared). */\n  const touchShare = () => !!navigator.share && matchMedia('(pointer: coarse)').matches;\n  function shareData(kind) {\n    if (kind === 'fiche' && PDP.p) {\n      const p = PDP.p, c = p.couleurs[PDP.color] || p.couleurs[0], t = p.tailles ? p.tailles[PDP.size] : null;\n      const q = [`couleur=${colorSlug(c.nom)}`, t ? `taille=${colorSlug(t.nom)}` : ''].filter(Boolean).join('&');\n      const what = [p.couleurs.length > 1 ? c.nom : '', t && p.tailles.length > 1 ? t.nom : ''].filter(Boolean).join(', ');\n      const line = `${p.nom}${what ? ` (${what})` : ''} : ${price(unitPriceOf(p, t ? t.nom : ''))}`;\n      return { url: pageUrl(`#/p/${p.slug}?${q}`), title: `${p.nom} \u00B7 Caplia`, line, subject: `Caplia : ${p.nom}` };\n    }\n    if (kind === 'panier') {\n      const code = cart.map((l) => [l.slug, colorSlug(l.color || ''), l.size ? colorSlug(l.size) : '', l.qty].join('.')).join(',');\n      const names = cart.map((l) => BY[l.slug].nom + (l.qty > 1 ? ` \u00D7 ${l.qty}` : ''));\n      return { url: pageUrl(`#/panier?pieces=${code}`), title: 'Mon panier Caplia', line: `Mon panier Caplia : ${names.join(', ')}. Total : ${price(cartTotal())}, livraison offerte.`, subject: 'Mon panier Caplia' };\n    }\n    const list = fav.filter((s) => BY[s]);\n    return { url: pageUrl(`#/selection?pieces=${list.join(',')}`), title: 'Ma s\u00E9lection Caplia', line: `Ma s\u00E9lection Caplia : ${list.map((s) => BY[s].nom).join(', ')}.`, subject: 'Ma s\u00E9lection Caplia' };\n  }\n  const shareUi = (kind, label) => `<div class=\"share\" data-share=\"${kind}\">\n      <button class=\"share__btn\" type=\"button\" data-action=\"share-open\" aria-expanded=\"false\" aria-controls=\"share-${kind}\">${label}</button>\n      <div class=\"share__menu\" id=\"share-${kind}\" hidden>\n        <button class=\"share__item\" type=\"button\" data-action=\"share-copy\">Copier le lien</button>\n        <a class=\"share__item\" href=\"mailto:\" data-sharemail>M\u2019envoyer par e-mail</a>\n        <p class=\"share__msg\" role=\"status\" aria-live=\"polite\"></p>\n      </div>\n    </div>`;\n  function shareMenu(box, open) {\n    $$('[data-share]').forEach((b) => { if (b !== box || !open) { const m = $('.share__menu', b); if (m) m.hidden = true; $('.share__btn', b).setAttribute('aria-expanded', 'false'); } });\n    if (!open) return;\n    const d = shareData(box.dataset.share);\n    const m = $('.share__menu', box);\n    $('[data-sharemail]', box).href = `mailto:?subject=${encodeURIComponent(d.subject)}&body=${encodeURIComponent(`${d.line}\\n\\n${d.url}\\n`)}`;\n    $('.share__msg', box).textContent = '';\n    m.hidden = false;\n    /* le menu s'ouvre vers la gauche quand le mot est dans la moiti\u00E9 droite : jamais coup\u00E9 par le bord de l'\u00E9cran */\n    m.classList.toggle('share__menu--end', box.getBoundingClientRect().left > innerWidth / 2);\n    $('.share__btn', box).setAttribute('aria-expanded', 'true');\n  }\n  document.addEventListener('click', (e) => { if (!e.target.closest('[data-share]') || e.target.closest('[data-sharemail]')) { const o = $('.share__menu:not([hidden])'); if (o) shareMenu(o.closest('[data-share]'), false); } });\n  document.addEventListener('keydown', (e) => { if (e.key !== 'Escape') return; const o = $('.share__menu:not([hidden])'); if (o) { const b = o.closest('[data-share]'); shareMenu(b, false); $('.share__btn', b).focus(); } });\n  /* Lien envoy\u00E9 : #/panier?pieces=<pi\u00E8ce.couleur.taille.quantit\u00E9>,\u2026 recr\u00E9e le panier (jamais une couleur \u00E9puis\u00E9e, une\n     taille absente ni une pi\u00E8ce pas encore en vente ; ouvrir deux fois le lien ne double rien), #/selection?pieces=a,b\n     ajoute les pi\u00E8ces \u00E0 la s\u00E9lection. Le param\u00E8tre est ensuite retir\u00E9 de l'adresse. */\n  function takeShared(kind) {\n    const raw = qsAll().get('pieces');\n    if (raw == null) return;\n    history.replaceState(history.state, '', location.pathname + location.hash.split('?')[0]);\n    const bits = raw.split(',').map((x) => x.trim()).filter(Boolean).slice(0, 40);\n    if (kind === 'selection') {\n      const ok = [...new Set(bits)].filter((s) => BY[s]);\n      ok.slice().reverse().forEach((s) => { if (!isFav(s)) toggleFav(s, true); });\n      if (ok.length) setTimeout(() => toast(null, ok.length > 1 ? `${ok.length}${NB}pi\u00E8ces ajout\u00E9es \u00E0 votre s\u00E9lection.` : `${BY[ok[0]].nom} est dans votre s\u00E9lection.`, true), 300);\n      return;\n    }\n    const later = [];\n    let n = 0;\n    bits.forEach((b) => {\n      const [slug, cs = '', ts = '', qn] = b.split('.');\n      const p = BY[slug];\n      if (!p || notYet(p)) return;\n      const c = p.couleurs.find((k) => colorSlug(k.nom) === cs || (k.cle && colorSlug(k.cle) === cs)) || (p.couleurs.length === 1 ? p.couleurs[0] : null);\n      const t = p.tailles ? p.tailles.find((x) => colorSlug(x.nom) === ts) : null;\n      if (!c || isOut(c) || (p.tailles && (!t || sizeOutFor(t, c.nom)))) { later.push(p.nom); return; }\n      const size = sizeFor(p, c.nom, t ? t.nom : '');\n      if (size === null) { later.push(p.nom); return; }\n      const qty = Math.min(9, Math.max(1, parseInt(qn, 10) || 1));\n      const l = cart.find((x) => x.slug === slug && x.color === c.nom && x.size === size);\n      if (l) l.qty = Math.max(l.qty, qty); else cart.push({ slug, color: c.nom, size, qty });\n      n++;\n    });\n    if (n) { saveCart(); updateBadge(true); }\n    const soon = later.length ? ` ${andList([...new Set(later)])} revien${later.length > 1 ? 'nent' : 't'} bient\u00F4t dans cette version : retrouvez-${later.length > 1 ? 'les' : 'le'} sur ${later.length > 1 ? 'leur' : 'sa'} fiche.` : '';\n    if (n || soon) setTimeout(() => toast(null, `${n ? 'Votre panier est pr\u00EAt.' : ''}${soon}`.trim(), true), 300);\n  }\n\n  let toastTimer = 0;\n  function toast(p, text, plain, colorName, html) {\n    const t = $('#toast');\n    /* une bande d'encre plate, une phrase et un lien : pas d'ombre (au t\u00E9l\u00E9phone, elle prend la place de la barre d'achat\n       le temps du message) ; html : un cadeau d\u00E9bloqu\u00E9, avec sa photo */\n    const body = html || `<p>${esc(text)}</p>`;\n    t.innerHTML = fr(plain ? body : `${body}<a class=\"toast__go\" href=\"#/panier\">Voir le panier</a>`);\n    t.classList.remove('is-on'); void t.offsetWidth; t.classList.add('is-on');\n    document.documentElement.classList.add('toast-on');\n    clearTimeout(toastTimer);\n    /* 18/10 (audit 03 \u00AB 4,2 secondes \u00BB) : 8 s pour lire le message et toucher \u00AB Voir le panier \u00BB */\n    toastTimer = setTimeout(() => { t.classList.remove('is-on'); document.documentElement.classList.remove('toast-on'); }, 8000);\n  }\n\n  /* ---------------- Fond (sc\u00E8ne) ---------------- */\n  const SC = { cur: 'a', key: '', token: 0, userPaused: reduce, wantVideo: false };\n  function setTint(hex) {\n    const sc = $('#scene');\n    if (hex) sc.style.setProperty('--tint', hex);\n    sc.classList.toggle('has-tint', !!hex);\n  }\n  function setScene(o) {\n    const sc = $('#scene');\n    const v = $('.scene__video', sc);\n    setTint(o.tint || null);\n    sc.classList.toggle('is-dim', !!o.dim);\n    SC.wantVideo = !!o.video;\n    if (o.video) {\n      if (!v.dataset.ready) {\n        const m = isMobile();\n        v.poster = m ? tab('incurve-sel', 'mobile', 'webp') : tab('incurve-sel', '1920', 'webp');\n        v.innerHTML = m\n          ? '<source src=\"/site/assets/tableaux/incurve-sel-mobile.webm\" type=\"video/webm\"><source src=\"/site/assets/tableaux/incurve-sel-mobile.mp4\" type=\"video/mp4\">'\n          : '<source src=\"/site/assets/tableaux/incurve-sel-1080.webm\" type=\"video/webm\"><source src=\"/site/assets/tableaux/incurve-sel-1080.mp4\" type=\"video/mp4\">';\n        v.dataset.ready = '1';\n        v.preload = 'auto';\n        v.load();\n      }\n      v.classList.add('is-on');\n      playVideo();\n    } else {\n      v.classList.remove('is-on');\n      v.pause();\n    }\n    const key = o.img + '|' + (o.soft ? 1 : 0);\n    if (key === SC.key) return;\n    SC.key = key;\n    const token = ++SC.token;\n    const next = SC.cur === 'a' ? 'b' : 'a';\n    const el = $(`[data-layer=\"${next}\"]`, sc);\n    const old = $(`[data-layer=\"${SC.cur}\"]`, sc);\n    const pre = new Image();\n    const swap = () => {\n      if (token !== SC.token) return;\n      el.style.backgroundImage = `url(\"${o.soft ? softUrl(pre, o.img) : o.img}\")`;\n      el.classList.toggle('is-soft', !!o.soft);\n      el.classList.add('is-on');\n      old.classList.remove('is-on');\n      SC.cur = next;\n    };\n    pre.onload = swap;\n    pre.onerror = () => { if (o.fallback && token === SC.token) { o.img = o.fallback; o.fallback = null; pre.src = o.img; } else swap(); };\n    pre.src = o.img;\n  }\n  /* Fond flou pr\u00E9-calcul\u00E9 (petite image liss\u00E9e) : ne d\u00E9pend pas du filtre CSS */\n  const SOFT_CACHE = {};\n  function softUrl(im, src) {\n    if (SOFT_CACHE[src]) return SOFT_CACHE[src];\n    try {\n      const w = 120, h = Math.max(1, Math.round(w * (im.naturalHeight / Math.max(1, im.naturalWidth))));\n      const c = document.createElement('canvas');\n      c.width = w; c.height = h;\n      const ctx = c.getContext('2d');\n      ctx.filter = 'blur(3px) saturate(1.12)';\n      ctx.drawImage(im, -6, -6, w + 12, h + 12);\n      SOFT_CACHE[src] = c.toDataURL('image/jpeg', .86);\n    } catch (e) { SOFT_CACHE[src] = src; }\n    return SOFT_CACHE[src];\n  }\n  function playVideo() {\n    const v = $('.scene__video');\n    if (!SC.wantVideo || SC.userPaused || document.hidden) return;\n    const pr = v.play();\n    if (pr && pr.catch) pr.catch(() => {});\n  }\n  function pauseVideo() { $('.scene__video').pause(); }\n  function syncVideoButtons() {\n    $$('[data-action=\"video-toggle\"]').forEach((b) => {\n      const paused = SC.userPaused;\n      b.innerHTML = paused ? I.play : I.pause;\n      b.setAttribute('aria-label', paused ? 'Relancer la vid\u00E9o du fond' : 'Mettre en pause la vid\u00E9o du fond');\n      b.setAttribute('aria-pressed', paused ? 'true' : 'false');\n    });\n  }\n\n  /* ---------------- Composants ---------------- */\n  /* Cartel des cartes (accueil, collections, s\u00E9lection, \u00AB Pour finir le salon \u00BB) : le nom et le prix, puis la forme en\n     quelques mots. Ni mati\u00E8re, ni mesures, ni pastilles : la carte reste l\u00E9g\u00E8re au t\u00E9l\u00E9phone, tout est sur la fiche.\n     tag : \u00E9l\u00E9ment du nom (h3 dans un article, span dans un lien). */\n  function cartel(p, { tag = 'h3', cls = '' } = {}) {\n    const from = fromOf(p);\n    const inner = tag === 'span' ? 'span' : 'p';\n    return `<span class=\"cartel${cls ? ' ' + cls : ''}\">\n        <span class=\"cartel__row\"><${tag} class=\"cartel__name\">${esc(p.nom)}</${tag}><${inner} class=\"cartel__price num\">${from}${price(p.prix)}</${inner}></span>\n        <${inner} class=\"cartel__type\">${esc(cardType(p)).replace(/(\\d) /g, `$1${NB}`)}</${inner}>${p.couleurs.every(isOut) ? `\n        <${inner} class=\"cartel__type\">Bient\u00F4t de retour</${inner}>` : ''}\n      </span>`;\n  }\n  /* Carte produit : la pi\u00E8ce dans le studio gris, \u00E0 la m\u00EAme distance que ses voisines (cartes-echelle.py : un miroir de\n     70 cm para\u00EEt vraiment plus petit qu'un canap\u00E9 de 277 cm), puis un cartel de mus\u00E9e : le nom et le prix, la forme et\n     les couleurs, la mati\u00E8re et les mesures. Toute la carte m\u00E8ne \u00E0 la fiche. L'affiche large (big) prend l'image \u00E9largie. */\n  const VIDE = '/site/assets/studio/_vide-';\n  /* Photos en situation refaites (refonte du 07/10, 2e boucle) : l\u00E0 o\u00F9 la photo du vendeur \u00E9tait la plus faible (cadrage\n     serr\u00E9, d\u00E9cor charg\u00E9, pi\u00E8ce sombre), une image Krea (GPT Image 2) rendue avec la photo du vendeur en r\u00E9f\u00E9rence, la\n     pi\u00E8ce int\u00E9gr\u00E9e et fid\u00E8le, dans la m\u00EAme pi\u00E8ce \u00E0 la chaux que l'accueil. Fichiers site/assets/produits/<slug>/k1-*.\n     Ce n'est pas une photo du produit : elle ne passe jamais en 1re image (fiche ni carte), elle vient apr\u00E8s les vraies\n     photos du vendeur comme image d'ambiance, avec un texte alternatif \u00AB Mise en sc\u00E8ne de\u2026 \u00BB, et au survol des cartes.\n     Elle n'est jamais envoy\u00E9e dans les m\u00E9dias Shopify (donc jamais \u00E0 Google). */\n  /* 23/10 : plus aucune image d'ambiance g\u00E9n\u00E9r\u00E9e (Krea), retir\u00E9es \u00E0 la demande du propri\u00E9taire (\u00AB trop IA \u00BB) et par sa r\u00E8gle :\n     jamais d'image g\u00E9n\u00E9r\u00E9e d'un vrai produit. Les entr\u00E9es d'avant sont dans l'historique Git. */\n  const KSCENES = {\n  };\n  function kScenes() {\n    Object.entries(KSCENES).forEach(([slug, k]) => {\n      const p = CAT.produits.find((x) => x.slug === slug);\n      if (!p || p.images.some((im) => im.id === 'k1')) return;\n      p.images.push({ id: 'k1', alt: k.alt, legende: k.alt });\n      const g = GALERIES[slug] = GALERIES[slug] || {};\n      g[k.couleur] = [...(g[k.couleur] || []).filter((id) => id !== 'k1'), 'k1'];\n      CADRAGE[slug] = CADRAGE[slug] || {};\n      CADRAGE[slug].k1 = [k.r || 4 / 3, ...k.box];\n    });\n  }\n  /* Carte en vraie photo de salon (refonte du 07/10, direction photo) : la photo en situation du vendeur, recadr\u00E9e sur la\n     pi\u00E8ce ; au survol, une autre photo en situation (sinon la pi\u00E8ce seule sur fond clair). Sans photo en situation dans\n     cette couleur : la carte du studio, comme avant. */\n  const focusXY = (p, id) => { const c = (CADRAGE[p.slug] || {})[id]; return c ? `${Math.round(((c[1] + c[3]) / 2) * 100)}% ${Math.round(Math.min(.62, Math.max(.38, (c[2] + c[4]) / 2)) * 100)}%` : '50% 55%'; };\n  const focusWide = (p, id) => { const c = (CADRAGE[p.slug] || {})[id]; return c ? `${Math.round(((c[1] + c[3]) / 2) * 100)}% ${Math.round(((c[2] + c[4]) / 2) * 100)}%` : '50% 55%'; };\n  /* 08/10 : une photo de salon large recadr\u00E9e dans une carte carr\u00E9e est agrandie d'autant (cover) : le navigateur doit\n     choisir un fichier plus large que la carte, sinon elle est floue (x1,5 \u00E0 x2 sur les cartes au survol) */\n  const sceneSizes = (p, im, sizes, wide) => { const c = (CADRAGE[p.slug] || {})[im.id], f = wide || !c ? 1 : Math.min(2.5, Math.max(1, c[0])); return f > 1.05 ? sizes.replace(/(\\d+(?:\\.\\d+)?)vw/g, (m, n) => `${Math.round(n * f)}vw`) : sizes; };\n  const sceneImg = (p, im, { alt, sizes: sz, eager, cls, wide = false }) => { const sizes = sceneSizes(p, im, sz, wide); return `<picture class=\"${cls}\"><source type=\"image/avif\" srcset=\"${GAL_SRCSET(p, im.id, 'avif')}\" sizes=\"${esc(sizes)}\"><img src=\"${photo(p, im.id, 640)}\" srcset=\"${GAL_SRCSET(p, im.id)}\" sizes=\"${esc(sizes)}\" alt=\"${esc(alt)}\" width=\"1280\" height=\"960\" style=\"object-position:${wide ? focusWide(p, im.id) : focusXY(p, im.id)}\" ${eager ? 'loading=\"eager\"' : 'loading=\"lazy\"'} decoding=\"async\" draggable=\"false\"></picture>`; };\n  /* Cadrages du 07/10 (soir) : dans une grille, toutes les cartes suivent la m\u00EAme r\u00E8gle. 1re image = la vraie photo\n     studio du vendeur, sur le fond clair du studio, la pi\u00E8ce enti\u00E8re et \u00E0 l'\u00E9chelle de ses voisines (cartes-echelle.py) ;\n     au survol, l'image d'ambiance (Krea, sinon la vraie photo de salon). Seule une pi\u00E8ce sans photo studio garde sa\n     photo de salon en 1re image. Les rang\u00E9es de l'accueil prennent le m\u00EAme cadre carr\u00E9 que\n     les collections (le carr\u00E9 recadr\u00E9 en 4:5 coupait les c\u00F4t\u00E9s de la pi\u00E8ce). */\n  /* M\u00EAme marge dans chaque carte : la plupart des photos studio remplissent d\u00E9j\u00E0 la place pr\u00E9vue (80 % de la largeur ou\n     52 % de la hauteur du cadre 4:5) ; quelques-unes, faites \u00E0 l'\u00E9chelle \u00AB compress\u00E9e \u00BB (\u00C9clipse, Ondine, Capucine,\n     Nu\u00E9e\u2026), restent plus petites. k = agrandissement qui les am\u00E8ne \u00E0 la m\u00EAme place, autour de leur point au sol. */\n  const fitK = (p, color) => { const c = carteOf(p, color), b = c && c.box; if (!b) return 1; const k = Math.min(.8 / (b[2] - b[0]), .52 / (b[3] - b[1])); return k > 1.04 ? +Math.min(k, 2).toFixed(3) : 1; };\n  /* Photos des cartes (08/10, demande de l'utilisateur) : sans ouvrir la fiche, on voit les autres photos de la pi\u00E8ce.\n     T\u00E9l\u00E9phone : on fait glisser la photo (d\u00E9filement natif aimant\u00E9), des points donnent la place ; ordinateur : fl\u00E8ches et\n     points au survol. Toute la photo reste un lien vers la fiche, les fl\u00E8ches sont de vrais boutons.\n     Photos montr\u00E9es : celles de la galerie de la fiche pour la couleur de la carte, dans le m\u00EAme ordre (photoOrder), 5 au\n     plus avec la 1re de la carte ; jamais le sch\u00E9ma des dimensions, ni une photo que la fiche ne montre pas, ni une photo\n     o\u00F9 le vendeur a coup\u00E9 la pi\u00E8ce. La photo de la carte elle-m\u00EAme n'est pas r\u00E9p\u00E9t\u00E9e (carte studio = la photo \u00AB fond\n     clair \u00BB 40 + n\u00B0 de la couleur, carte de salon = sa photo en situation).\n     Vitesse : seule la 1re photo se charge ; les suivantes re\u00E7oivent leur adresse au premier survol, toucher ou focus\n     (cgalWake), en 360 \u00E0 720 px. CARD_W et cardPhotoOk sont retouch\u00E9s pour Shopify par construire-theme.mjs. */\n  const CARD_MAX = 5;\n  const CARD_W = [360, 540, 720];\n  const cardPhotoOk = (p, id) => { const u = photo(p, id, 720); return !!u && u !== CUT(p.slug); };\n  /* couleur montr\u00E9e par la carte (m\u00EAme r\u00E8gle que carteOf et scenesFor) */\n  const cardColor = (p, color, studio) => {\n    if (color) return color;\n    const e = studio && PHOTO && PHOTO.pieces && PHOTO.pieces[p.slug];\n    if (e && e.couleur && p.couleurs.some((k) => !k.rupture && k.nom === e.couleur)) return e.couleur;\n    return (p.couleurs[firstIn(p)] || {}).nom || '';\n  };\n  function cardMore(p, cName, skip) {\n    const c = p.couleurs.find((x) => x.nom === cName) || p.couleurs[firstIn(p)];\n    if (!c) return [];\n    const pics = colorPhotos(p, c), l0 = leadOf(p, c), lead = l0 && pics.find((im) => im.id === l0.id);\n    return [lead, ...restOrder(pics, lead)].filter((im) => im && !skip.includes(im.id) && !coupee(p, im) && cardPhotoOk(p, im.id)).slice(0, CARD_MAX - 1);\n  }\n  const cardSlide = (p, im, sizes, wide) => `<div class=\"cimg cimg--more\" data-photo=\"${esc(im.id)}\"><img data-srcset=\"${CARD_W.map((w) => `${photo(p, im.id, w)} ${w}w`).join(', ')}\" data-src=\"${photo(p, im.id, CARD_W[CARD_W.length - 1])}\" sizes=\"${esc(sceneSizes(p, im, sizes, wide))}\" alt=\"${esc(im.alt)}\" width=\"1280\" height=\"960\" style=\"object-position:${wide ? focusWide(p, im.id) : focusXY(p, im.id)}\" loading=\"lazy\" decoding=\"async\" draggable=\"false\"></div>`;\n  /* adresse de la fiche, ouverte sur une couleur pr\u00E9cise quand la carte la montre (18/10 : \u00AB Canap\u00E9s verts \u00BB) */\n  const pieceHref = (p, color) => `#/p/${p.slug}${color ? `?couleur=${colorSlug(color)}` : ''}`;\n  function cardGal(p, first, more, sizes, wide, href = pieceHref(p)) {\n    if (!more.length) return first;\n    const n = more.length + 1;\n    return `<div class=\"cgal\" data-cgal><a class=\"cgal__track\" href=\"${href}\" tabindex=\"-1\" aria-hidden=\"true\" draggable=\"false\">${first}${more.map((im) => cardSlide(p, im, sizes, wide)).join('')}</a>`\n      + `<button class=\"cgal__nav cgal__nav--prev\" type=\"button\" data-action=\"cgal\" data-d=\"-1\" aria-label=\"Photo pr\u00E9c\u00E9dente\">${I.chevL}</button>`\n      + `<button class=\"cgal__nav cgal__nav--next\" type=\"button\" data-action=\"cgal\" data-d=\"1\" aria-label=\"Photo suivante\">${I.chevR}</button>`\n      + `<span class=\"cgal__dots\" aria-hidden=\"true\">${Array.from({ length: n }, (x, i) => `<i${i ? '' : ' class=\"is-on\"'}></i>`).join('')}</span></div>`;\n  }\n  function cardImg(p, { alt = '', sizes = '(max-width: 760px) 100vw, 33vw', eager = false, big = false, deux = false, color = '', studioOnly = false, href = '' } = {}) {\n    const link = href || pieceHref(p);\n    const sc = studioOnly ? [] : scenesFor(p, color);\n    const gen = studioOnly ? null : genFor(p, color);\n    const hov = (wide) => (gen ? sceneImg(p, gen, { alt: '', sizes, eager: false, cls: 'cimg__b', wide })\n      : sc[0] ? sceneImg(p, sc[0], { alt: '', sizes, eager: false, cls: 'cimg__b', wide }) : '');\n    if (carteOf(p, color)) {\n      const cadres = deux ? [['(max-width: 760px)', '11'], [null, '54']] : ['11'];\n      const k = deux ? 1 : fitK(p, color);   /* le cadre 5:4 (fichier r54) a sa propre mise en place */\n      const sz = k > 1 ? sizes.replace(/(\\d+(?:\\.\\d+)?)vw/g, (m, n) => `${Math.round(n * k)}vw`) : sizes;\n      const cn = cardColor(p, color, true), ci = p.couleurs.findIndex((x) => x.nom === cn);\n      const more = studioOnly ? [] : cardMore(p, cn, [String(40 + Math.max(0, ci))]);\n      return cardGal(p, `<div class=\"cimg cimg--hov\"${k > 1 ? ` style=\"--k:${k}\"` : ''}>${pieceImg(p, { alt, sizes: sz, eager, color, cadres })}${more.length ? '' : hov(big)}</div>`, more, sizes, big, link);\n    }\n    if (sc.length) {\n      const more = cardMore(p, cardColor(p, color, false), [sc[0].id]);\n      const back = more.length ? '' : gen ? sceneImg(p, gen, { alt: '', sizes, eager: false, cls: 'cimg__b', wide: big }) : sc[1] ? sceneImg(p, sc[1], { alt: '', sizes, eager: false, cls: 'cimg__b', wide: big }) : '';\n      return cardGal(p, `<div class=\"cimg cimg--scene${big ? ' cimg--wide' : ''}\">${sceneImg(p, sc[0], { alt, sizes, eager, cls: 'cimg__a', wide: big })}${back}</div>`, more, sizes, big, link);\n    }\n    const r = RATIO[p.slug] || 1.6;\n    const mur = p.dimensions && p.dimensions.profondeur < 6;   /* miroir mural : plus petit, pos\u00E9 contre le fond */\n    const w = Math.min(mur ? 56 : 80, 52.5 * r);\n    const set = (ext) => [720, 1080, 1600].map((x) => `${VIDE}${x}.${ext} ${x}w`).join(', ');\n    const charge = eager ? 'loading=\"eager\"' : 'loading=\"lazy\"';\n    /* d\u00E9tour\u00E9 avec son ombre de contact cuite (maquettes/outils/ombres-repli.py : marges de 5 % sur les c\u00F4t\u00E9s, 10 % en bas) ;\n       sans ce fichier, le d\u00E9tour\u00E9 nu */\n    return `<div class=\"cimg cimg--repli\" style=\"--w:${w.toFixed(1)}%\"><picture class=\"simg\"><source type=\"image/avif\" srcset=\"${set('avif')}\" sizes=\"${esc(sizes)}\"><source type=\"image/webp\" srcset=\"${set('webp')}\" sizes=\"${esc(sizes)}\"><img src=\"${VIDE}1080.webp\" alt=\"\" width=\"1600\" height=\"2000\" ${charge} decoding=\"async\" draggable=\"false\"></picture>`\n      + `<img class=\"cimg__obj\" src=\"/site/assets/studio/repli/${p.slug}.webp\" alt=\"${esc(alt)}\" ${charge} decoding=\"async\" draggable=\"false\" onerror=\"this.onerror=null;this.classList.add('is-nu');this.src='${cut(p)}'\"></div>`;\n  }\n  /* la forme, sans la largeur quand elle est d\u00E9j\u00E0 dans les mesures (\u00AB Canap\u00E9 courb\u00E9 240 cm \u00BB -> \u00AB Canap\u00E9 courb\u00E9 \u00BB) */\n  /* forme courte pour les cartels (une ou deux lignes sur une carte de t\u00E9l\u00E9phone, jamais plus) */\n  const CARD_TYPE = {\n    veilleuse: 'Fauteuil d\u2019allaitement', 'chauffeuse-dossier': 'Chauffeuse convertible', chauffeuse: 'Chauffeuse convertible',\n    'convertible-coffre': 'Canap\u00E9 d\u2019angle convertible', 'angle-reversible': 'Canap\u00E9 d\u2019angle c\u00F4tel\u00E9', gigogne: 'Canap\u00E9 convertible gigogne',\n    'angle-modulable': 'Canap\u00E9 d\u2019angle modulable', 'petit-angle': 'Petit canap\u00E9 d\u2019angle', 'petit-incurve': 'Canap\u00E9 nuage arrondi',\n    'u-modulable': 'Canap\u00E9 en U modulable', plaid: 'Plaid c\u00F4tel\u00E9 et sherpa', 'petit-velours': 'Petit canap\u00E9 velours',\n    'cotele-poches': 'Canap\u00E9 velours c\u00F4tel\u00E9', 'cotele-230': 'Canap\u00E9 velours c\u00F4tel\u00E9', 'grand-arrondi': 'Grand canap\u00E9 arrondi',\n    meridienne: 'M\u00E9ridienne ondul\u00E9e', 'noix-de-cajou': 'Canap\u00E9 arrondi 2 modules', 'coussins-noeud': 'Coussins en velours'\n  };\n  /* 18/10 (audit 03) : la mesure en fin de type part en entier, \u00AB 294 cm \u00BB comme \u00AB 160 \u00D7 50 cm \u00BB (avant : \u00AB Miroir sur pied\n     ondul\u00E9, 160 \u00D7 \u00BB) ; donnees-theme.mjs recopie cette ligne pour les cartes Liquid */\n  const cardType = (p) => CARD_TYPE[p.slug] || p.type.replace(/,?\\s+\\d+(?:[,.]\\d+)?(?:\\s?\u00D7\\s?\\d+(?:[,.]\\d+)?)?\\s?cm$/, '');\n  /* opts.color : la couleur que la page veut montrer (seo-pages.json > couleurs, \u00AB Canap\u00E9s verts \u00BB) : photo et lien de la carte */\n  function pcard(p, opts = {}) {\n    const from = fromOf(p);\n    const big = /pcard--big/.test(opts.cls || '');\n    const quick = opts.quick && onSale(p) ? quickAdd(p) : '';\n    const color = opts.color && p.couleurs.some((c) => c.nom === opts.color && !isOut(c)) ? opts.color : '';\n    const href = pieceHref(p, color);\n    return `<article class=\"pcard${opts.cls ? ' ' + opts.cls : ''}${quick ? ' pcard--quick' : ''}\" data-piece=\"${p.slug}\">\n      <a class=\"pcard__link\" href=\"${href}\" aria-label=\"${esc(p.nom)}, ${esc(lc1(p.type))}, ${from}${price(p.prix)}\"></a>\n      ${cardImg(p, { alt: `${p.nom}, ${lc1(p.type)}`, sizes: opts.sizes || '(max-width: 760px) 80vw, 30vw', eager: !!opts.eager, big, deux: !!opts.deux, color: color || (quick ? quickColor(p) : ''), href })}\n      <div class=\"pcard__body\">${cartel(p)}</div>\n      ${quick}\n    </article>`;\n  }\n\n  /* Ajout rapide sur une carte (\u00AB Pour finir le salon \u00BB) : les couleurs en vente en pastilles cliquables, la premi\u00E8re en vente\n     choisie (celle de la photo de la carte quand elle est en vente), puis \u00AB Ajouter \u00BB, sans passer par la fiche */\n  const saleColors = (p) => p.couleurs.filter((c) => !c.rupture && (!p.tailles || p.tailles.some((t) => !sizeOutFor(t, c.nom))));\n  const quickColor = (p) => { const cs = saleColors(p), e = PHOTO && PHOTO.pieces && PHOTO.pieces[p.slug]; return (cs.find((c) => e && c.nom === e.couleur) || cs[0]).nom; };\n  function quickAdd(p) {\n    const cs = saleColors(p), c0 = quickColor(p);\n    const sw = cs.length > 1 ? `<div class=\"qa__sw\" role=\"radiogroup\" aria-label=\"Couleur de ${esc(p.nom)}\">${cs.map((c) => `<button class=\"swatch\" type=\"button\" role=\"radio\" aria-checked=\"${c.nom === c0}\" aria-label=\"${esc(c.nom)}\" title=\"${esc(c.nom)}\" style=\"--c:${c.hex}\" data-action=\"qa-color\" data-slug=\"${p.slug}\" data-color=\"${esc(c.nom)}\"></button>`).join('')}<span class=\"qa__cn\" data-qa-cn>${esc(c0)}</span></div>` : '';\n    return `<div class=\"qa\">${sw}<button class=\"pill qa__add\" type=\"button\" data-action=\"qa-add\" data-slug=\"${p.slug}\" data-color=\"${esc(c0)}\" aria-label=\"Ajouter ${esc(p.nom)}${cs.length > 1 ? ', ' + esc(c0) : ''}, au panier\"><span class=\"cta__label\">Ajouter</span></button></div>`;\n  }\n  function quickColorPick(btn) {\n    const card = btn.closest('.pcard'), p = BY[btn.dataset.slug];\n    if (!card || !p) return;\n    const c = btn.dataset.color;\n    $$('[data-action=\"qa-color\"]', card).forEach((b) => b.setAttribute('aria-checked', String(b === btn)));\n    const cn = $('[data-qa-cn]', card); if (cn) cn.textContent = c;\n    const add = $('[data-action=\"qa-add\"]', card);\n    if (add) { add.dataset.color = c; add.setAttribute('aria-label', `Ajouter ${p.nom}, ${c}, au panier`); }\n    const im = $('.cgal', card) || $('.cimg', card);   /* la carte et ses autres photos suivent la couleur */\n    if (im) im.outerHTML = fr(cardImg(p, { alt: `${p.nom}, ${lc1(p.type)}`, sizes: '(max-width: 760px) 80vw, 30vw', color: c }));\n  }\n  /* D\u00E9lai des accessoires exp\u00E9di\u00E9s d'ailleurs (coussins n\u0153ud depuis la Chine), pour la page Livraison et les CGV */\n  const accDelay = () => { const a = (SITE.livraison.delaisAccessoires || {}).CN; const c = PRODS.find((x) => x.pays === 'CN'); return a && c ? ` Les ${esc(c.nom.toLowerCase())}, vendus seuls ou offerts, partent de Chine : ${a[0]} \u00E0 ${a[1]} jours ouvr\u00E9s.` : ''; };\n  const CHAPO = 'N\u2019offrez \u00E0 votre int\u00E9rieur que ce que vous aimez vraiment.';\n  /* Ce qui compte pour les paliers, dit sans jargon (panier, questions, livraison, page des cadeaux) */\n  /* ce qui compte pour les cadeaux (giftBase) et ce qui ne compte pas : les m\u00EAmes mots ici et dans les conditions de vente */\n  const GIFT_MEUBLES = 'canap\u00E9s, fauteuils, lits, t\u00EAtes de lit, bancs coffres et miroirs';\n  const GIFT_HORS = 'les coussins, les plaids, les tapis et les poufs';\n  const GIFT_RULE = `Seuls vos meubles comptent pour les cadeaux (${GIFT_MEUBLES}) : ${GIFT_HORS} achet\u00E9s seuls s\u2019ajoutent en plus. La valeur de chaque cadeau est son prix quand il est vendu seul sur caplia.fr.`;\n\n  /* Pied de page : trois colonnes de liens, l'inscription, puis qui vend (marque, SIRET, ville, e-mail : une marque\n     inconnue se montre identifiable, PLAN-MAITRE C4 ; identit\u00E9 compl\u00E8te dans les mentions l\u00E9gales) et les moyens de\n     paiement, sans commentaire (K5). */\n  const FOOT_COLS = [\n    ['Boutique', [['#/canapes', 'Canap\u00E9s'], ['#/fauteuils', 'Fauteuils'], ['#/decoration', 'D\u00E9coration'], ['#/sleep', 'Caplia Sleep'], ['#/petits-espaces', 'Petits espaces'], ['#/jeunes-parents', 'Jeunes parents']]],\n    ['Aide', [['#/livraison', 'Livraison et retours'], ['#/questions', 'Vos questions'], ['#/paiement', 'Paiement et s\u00E9curit\u00E9'], ['#/garantie', 'Garantie l\u00E9gale'], ['#/livraison?s=nouvelles', 'Suivre ma commande'], ['#/un-souci', 'Un souci \u00E0 la livraison ?'], ['#/contact', 'Contact']]],\n    ['La maison', [['#/pourquoi-caplia', 'Pourquoi Caplia'], ['#/matieres', 'Nos mati\u00E8res'], ['#/arrivee', 'L\u2019arriv\u00E9e chez vous'], ['#/cadeaux', 'Les cadeaux'], ['#/a-propos', 'Qui sommes-nous']]]\n  ];\n  /* 17/10 (table d'experts) : \u00AB G\u00E9rer les cookies \u00BB rouvre les choix du bandeau (data-action=\"cookies\") ; sans bandeau, le\n     lien m\u00E8ne \u00E0 la rubrique \u00AB Mesure d'audience et publicit\u00E9 \u00BB de la page Confidentialit\u00E9 */\n  const FOOT_LEGAL = [['#/mentions-legales', 'Mentions l\u00E9gales'], ['#/conditions-de-vente', 'Conditions de vente'], ['#/confidentialite', 'Confidentialit\u00E9'], ['#/confidentialite?s=mesure', 'G\u00E9rer les cookies', 'cookies'], ['#/renoncer', 'Renoncer au contrat ici']];\n  function footer() { return '<div data-caplia-slot=\"caplia-pied\"></div>'; }\n  function footerMaquette() {\n    const list = (items) => `<ul>${items.map(([h, t]) => `<li><a href=\"${h}\">${t}</a></li>`).join('')}</ul>`;\n    return `<footer class=\"foot wrap\">\n      <div class=\"foot__top\">\n        <a class=\"foot__logo\" href=\"#/\" aria-label=\"Caplia, accueil\"><span class=\"brand\">Caplia.<span class=\"brand-mark\" aria-hidden=\"true\"></span></span></a>\n        <nav class=\"foot__cols\" aria-label=\"Plan du site\">\n          ${FOOT_COLS.map(([t, items]) => `<div><h2 class=\"foot__h\">${t}</h2>${list(items)}</div>`).join('')}\n        </nav>\n        <div class=\"foot__news\">\n          <h2 class=\"foot__h\">Les nouvelles couleurs, par e-mail</h2>\n          ${newsForm()}\n        </div>\n      </div>\n      <div class=\"foot__id\">\n        <p>\u00C9crivez-nous \u00E0 <a href=\"mailto:${SITE.email}\">${SITE.email}</a> : r\u00E9ponse ${reponse()}, par e-mail.</p>\n        <p class=\"foot__pay\"><span class=\"sr-only\">Moyens de paiement : </span>${SITE.paiements.map((m) => `<span>${esc(m)}</span>`).join('')}</p>\n      </div>\n      <div class=\"foot__bottom\">\n        <p>\u00A9 ${new Date().getFullYear()} Caplia</p>\n        <ul class=\"foot__legal\">${FOOT_LEGAL.map(([h, t, act]) => `<li><a href=\"${h}\"${act ? ` data-action=\"${act}\"` : ''}>${t}</a></li>`).join('')}</ul>\n      </div>\n    </footer>`;\n  }\n  /* \u00AB G\u00E9rer les cookies \u00BB : rouvre les choix du bandeau Shopify (API Customer Privacy, privacyBanner.showPreferences()).\n     false = pas de bandeau sur la page (maquette, visiteur hors de la zone du bandeau) : le lien suit son adresse. */\n  function cookiePrefs(a) {\n    const pb = window.privacyBanner;\n    if (!pb || typeof pb.showPreferences !== 'function') return false;\n    Promise.resolve().then(() => pb.showPreferences()).catch(() => { location.href = a.href; });\n    return true;\n  }\n  /* Inscription sans code promo : case d'accord jamais pr\u00E9-coch\u00E9e (r\u00E8gle CNIL pour les prospects) */\n  let newsN = 0;\n  function newsForm(cls = '') {\n    const id = 'nl' + (++newsN);\n    return `<form class=\"news ${cls}\" data-news novalidate>\n      <label class=\"news__lbl\" for=\"${id}-m\">Votre adresse e-mail</label>\n      <div class=\"news__row\">\n        <input id=\"${id}-m\" name=\"email\" type=\"email\" autocomplete=\"email\" inputmode=\"email\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"nom@exemple.fr\">\n        <button class=\"btn\" type=\"submit\">Recevoir</button>\n      </div>\n      <label class=\"check\" for=\"${id}-c\"><input id=\"${id}-c\" name=\"ok\" type=\"checkbox\"><span>Recevoir nos nouveaut\u00E9s, nos conseils et un rappel des pi\u00E8ces vues. D\u00E9sinscription en un clic.</span></label>\n      <p class=\"news__msg\" data-news-msg aria-live=\"polite\" hidden></p>\n    </form>`;\n  }\n  /* 13013872000011 \u2192 130 138 720 00011 */\n  const siretFmt = (s) => String(s).replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{5})$/, `$1${NB}$2${NB}$3${NB}$4`);\n\n  /* Sous le titre de l'accueil : une seule ligne courte, deux faits vrais pour toutes les pi\u00E8ces. Les preuves longues\n     (passage v\u00E9rifi\u00E9, nouvelles \u00E0 chaque \u00E9tape) sont sur les fiches et dans les conditions, avec leurs conditions.\n     Point de s\u00E9paration port\u00E9 par chaque morceau et masqu\u00E9 en d\u00E9but de ligne (m\u00EAme proc\u00E9d\u00E9 que le cartel). */\n  const HERO_LINE = ['Livraison offerte', 'Date de livraison avant de payer'];\n  const heroLine = (cls) => `<p class=\"${cls}\"><span class=\"${cls}-in\">${HERO_LINE.map((t) => `<span>${t}</span>`).join('')}</span></p>`;\n\n  /* Parallaxe en couches : tableau / mot g\u00E9ant / canap\u00E9 d\u00E9tour\u00E9, dans un m\u00EAme cadre.\n     Bo\u00EEte du canap\u00E9 mesur\u00E9e sur les pixels opaques de chaque calque (fractions de l'image) :\n     [gauche, droite, haut du dossier (m\u00E9diane de la partie centrale), bas] */\n  const SOFA = {\n    'incurve-sel': [.355, .653, .508, .699],\n    'capiton-matin': [.240, .963, .533, .953],\n    'meridienne-platre': [.191, .685, .585, .881],\n    'petit-mouton-paris': [.356, .883, .465, .975],\n    'petit-incurve-galerie': [.180, .657, .591, .844],\n    'causeuse-arches': [.282, .718, .534, .799]\n  };\n  const STAR = '<svg viewBox=\"0 0 48 48\" aria-hidden=\"true\"><path d=\"M24 1.5c.7 12.4 9.6 21.3 22.5 22.5C33.6 25.2 24.7 34.1 24 46.5 23.3 34.1 14.4 25.2 1.5 24 14.4 22.8 23.3 13.9 24 1.5z\"/></svg>';\n\n  /* ---------------- Plan cot\u00E9 SVG ---------------- */\n  function planKind(p) {\n    if (p.slug === 'miroir-onde' || p.slug === 'miroir-ondule') return 'mirror';\n    /* 07/10 : t\u00EAtes de lit, tapis et plaid n'ont pas de plan dessin\u00E9 ici (le sch\u00E9ma des dimensions est dans la galerie) */\n    if (['tete-de-lit-murale', 'tete-de-lit-boudins', 'tapis-vagues', 'plaid-sherpa'].includes(p.slug)) return null;\n    if (['angle-pouf-beige', 'angle-cotele-nuage', 'angle-convertible-cotele', 'angle-convertible-effet-lin', 'angle-reversible-chenille-bleu', 'angle-chenille-pouf-moutarde'].includes(p.slug)) return 'L';\n    if (p.slug === 'u-cotele-poufs') return 'U';\n    if (p.slug === 'pouf-plisse' || p.slug === 'pouf-bouclette') return 'cyl';\n    if (p.slug === 'miroir-organique') return 'wall';\n    if (['angle-cotele', 'angle-reversible', 'angle-modulable'].includes(p.slug)) return 'L';\n    if (['u-cotele', 'u-modulable'].includes(p.slug)) return 'U';\n    if (p.slug === 'table-nuage') return 'table';\n    if (p.slug === 'galet') return 'round';\n    if (p.slug === 'songe' || p.slug === 'brume' || p.slug === 'lit-coffre-bouclette') return 'bed';\n    if (p.slug === 'dune' || p.slug === 'sillon') return 'bench';\n    if (p.slug === 'bulle') return 'cyl';\n    if (p.slug === 'duo') return 'nest';\n    if (p.slug === 'lune') return 'ctable';\n    if (p.collection === 'fauteuils') return 'chair';\n    if (['incurve', 'petit-incurve', 'courbe', 'noix-de-cajou'].includes(p.slug)) return 'curve';\n    return 'sofa';\n  }\n  /* PK : taille des cotes (1 ; 2 pour le plan du t\u00E9l\u00E9phone, voir planSVG) */\n  let PK = 1;\n  function chip(x, y, t, cls = '') {\n    const w = (t.length * 8.6 + 20) * PK, hh = 12 * PK;\n    return `<rect class=\"chip\" x=\"${(x - w / 2).toFixed(1)}\" y=\"${(y - hh).toFixed(1)}\" width=\"${w.toFixed(1)}\" height=\"${2 * hh}\" rx=\"${hh}\"/><text class=\"${cls}\" x=\"${x.toFixed(1)}\" y=\"${(y + 4.5 * PK).toFixed(1)}\" text-anchor=\"middle\">${t}</text>`;\n  }\n  function hdim(x1, x2, y, t) {\n    return `<line class=\"dim\" x1=\"${x1}\" y1=\"${y}\" x2=\"${x2}\" y2=\"${y}\"/><line class=\"dim\" x1=\"${x1}\" y1=\"${y - 6}\" x2=\"${x1}\" y2=\"${y + 6}\"/><line class=\"dim\" x1=\"${x2}\" y1=\"${y - 6}\" x2=\"${x2}\" y2=\"${y + 6}\"/>${chip((x1 + x2) / 2, y, t)}`;\n  }\n  function vdim(x, y1, y2, t, cls) {\n    return `<line class=\"${cls ? 'seat' : 'dim'}\" x1=\"${x}\" y1=\"${y1}\" x2=\"${x}\" y2=\"${y2}\"/><line class=\"dim\" x1=\"${x - 6}\" y1=\"${y1}\" x2=\"${x + 6}\" y2=\"${y1}\"/><line class=\"dim\" x1=\"${x - 6}\" y1=\"${y2}\" x2=\"${x + 6}\" y2=\"${y2}\"/>${chip(x, (y1 + y2) / 2, t, cls || '')}`;\n  }\n  function wavy(cx, cy, rx, ry, waves, amp, phase = 0, square = 0) {\n    const pts = [];\n    for (let k = 0; k < 240; k++) {\n      const t = (k / 240) * Math.PI * 2;\n      const c = Math.cos(t), s = Math.sin(t);\n      /* super-ellipse pour les formes rectangulaires */\n      const e = square ? 2 / (2 + square * 6) : 1;\n      const bx = Math.sign(c) * Math.pow(Math.abs(c), e);\n      const by = Math.sign(s) * Math.pow(Math.abs(s), e);\n      const m = 1 + amp * Math.sin(waves * t + phase);\n      pts.push(`${(cx + bx * rx * m).toFixed(1)},${(cy + by * ry * m).toFixed(1)}`);\n    }\n    return `M${pts.join('L')}Z`;\n  }\n  /* Plan cot\u00E9 dessin\u00E9 \u00E0 partir de catalogue.json (traits fins, cotes en Geist, voir fiche.css).\n     La vignette reprend la m\u00EAme figure ; ses cotes et ses textes y sont masqu\u00E9s en CSS. */\n  /* contour ferm\u00E9 et lisse passant par des points (Catmull-Rom converti en courbes de B\u00E9zier) */\n  function blob(pts) {\n    const n = pts.length, P = (i) => pts[(i + n) % n], f = (v) => v.toFixed(1);\n    let d = `M${f(pts[0][0])},${f(pts[0][1])}`;\n    for (let i = 0; i < n; i++) {\n      const p0 = P(i - 1), p1 = P(i), p2 = P(i + 1), p3 = P(i + 2);\n      d += ` C${f(p1[0] + (p2[0] - p0[0]) / 6)},${f(p1[1] + (p2[1] - p0[1]) / 6)} ${f(p2[0] - (p3[0] - p1[0]) / 6)},${f(p2[1] - (p3[1] - p1[1]) / 6)} ${f(p2[0])},${f(p2[1])}`;\n    }\n    return d + 'Z';\n  }\n  /* silhouette du miroir Mirage (relev\u00E9e sur la photo du produit), en proportions de sa largeur et de sa hauteur */\n  const MIRAGE = [[.56, 0], [.82, .04], [.9, .18], [.84, .38], [.93, .58], [1, .8], [.9, .98], [.6, 1], [.28, .985], [.1, .9], [.07, .68], [0, .46], [.08, .27], [.2, .13], [.34, .05]];\n  /* Plan cot\u00E9. big : version du t\u00E9l\u00E9phone, cotes deux fois plus grosses (lisibles sans zoomer dans un cadre de 390 px),\n     marges \u00E9largies pour qu'aucune cote ne sorte du dessin */\n  function planSVG(p, big) {\n    if (!big) return planSVG0(p);\n    PK = 2;\n    try {\n      return planSVG0(p).replace('class=\"plan-svg\"', 'class=\"plan-svg plan-svg--big\"')\n        .replace(/viewBox=\"0 0 600 ([\\d.]+)\"/, (m, h) => `viewBox=\"-80 -14 760 ${(Number(h) + 44).toFixed(0)}\"`);\n    } finally { PK = 1; }\n  }\n  function planSVG0(p) {\n    const D = p.dimensions;\n    const kind = planKind(p);\n    const f = (n) => numFr(n) + ' cm';\n    if (kind === 'mirror') {\n      /* les tailles en vente seulement (\u00AB 160 \u00D7 50 cm \u00BB = hauteur \u00D7 largeur) ; la plus petite, s'il y en a deux, en pointill\u00E9 */\n      const T = (p.tailles || [{ nom: `${D.hauteur} \u00D7 ${D.largeur} cm` }]).map((t) => (t.nom.match(/[\\d,.]+/g) || []).map((v) => Number(v.replace(',', '.'))));\n      const [H1, W1] = T[T.length - 1], small = T.length > 1 ? T[0] : null;\n      const s = 300 / H1, w = W1 * s, h = H1 * s, x0 = 300 - w / 2, y0 = 44;\n      const h2 = small ? small[0] * s : 0, w2 = small ? small[1] * s : 0;\n      return `<svg class=\"plan-svg\" viewBox=\"0 0 600 ${y0 + h + 50}\" role=\"img\" aria-label=\"Plan cot\u00E9 du ${esc(p.nom)} : ${T.map(([a, b]) => `${numFr(a)} \u00D7 ${numFr(b)} cm`).join(' ou ')}\">\n        <text class=\"lbl\" x=\"300\" y=\"22\" text-anchor=\"middle\">${small ? 'Vue de face \u00B7 deux tailles' : 'Vue de face'}</text>\n        <path class=\"shape\" d=\"${blob(MIRAGE.map(([a, b]) => [x0 + a * w, y0 + b * h]))}\"/>\n        ${small ? `<path class=\"ln\" d=\"${blob(MIRAGE.map(([a, b]) => [300 - w2 / 2 + a * w2, y0 + h - h2 + b * h2]))}\" stroke-dasharray=\"4 4\"/>` : ''}\n        <line class=\"ext\" x1=\"${x0 - 50}\" y1=\"${y0 + h}\" x2=\"${x0 + w + 50}\" y2=\"${y0 + h}\"/>\n        ${vdim(x0 + w + 46, y0, y0 + h, f(H1))}\n        ${small ? vdim(x0 - 46, y0 + h - h2, y0 + h, f(small[0]), 'seat-t') : ''}\n        ${hdim(x0, x0 + w, y0 + h + 30, f(W1))}\n      </svg>`;\n    }\n    if (kind === 'wall') {\n      const s = 380 / D.largeur, w = D.largeur * s, h = D.hauteur * s, x0 = 300 - w / 2, y0 = 44;\n      return `<svg class=\"plan-svg\" viewBox=\"0 0 600 ${y0 + h + 56}\" role=\"img\" aria-label=\"Plan cot\u00E9 de ${esc(p.nom)} : ${f(D.largeur)} \u00D7 ${f(D.hauteur)}\">\n        <text class=\"lbl\" x=\"${x0}\" y=\"22\">Vue de face</text>\n        <path class=\"shape\" d=\"${wavy(300, y0 + h / 2, w / 2 / 1.07, h / 2 / 1.07, 3, .06, 2.2, .1)}\"/>\n        <path class=\"ln\" d=\"${wavy(300, y0 + h / 2, w / 2 / 1.07 - 12, h / 2 / 1.07 - 12, 3, .06, 2.2, .1)}\"/>\n        ${vdim(x0 + w + 34, y0, y0 + h, f(D.hauteur))}\n        ${hdim(x0, x0 + w, y0 + h + 30, f(D.largeur))}\n      </svg>`;\n    }\n    const W = D.largeur, P = D.profondeur, H = D.hauteur;\n    const s = Math.min(420 / W, 190 / P, 170 / H);\n    const w = W * s, d = P * s, h = H * s;\n    const x0 = (600 - w) / 2 - 10, y0 = 46;\n    let top = '';\n    if (kind === 'curve') {\n      const k = w * .13;\n      top = `<path class=\"shape\" d=\"M${x0},${y0 + d} C${x0},${y0 - d / 3} ${x0 + w},${y0 - d / 3} ${x0 + w},${y0 + d} L${x0 + w - k},${y0 + d} C${x0 + w - k},${y0 + d * .35} ${x0 + k},${y0 + d * .35} ${x0 + k},${y0 + d} Z\" stroke-linejoin=\"round\"/>\n        <path class=\"ln\" d=\"M${x0 + w * .055},${y0 + d * .9} C${x0 + w * .055},${y0 + d * .02} ${x0 + w * .945},${y0 + d * .02} ${x0 + w * .945},${y0 + d * .9}\"/>`;\n    } else if (kind === 'table') {\n      top = `<path class=\"shape\" d=\"${wavy(x0 + w / 2, y0 + d / 2, w / 2 * .93, d / 2 * .9, 6, .07, .6)}\"/>`;\n    } else if (kind === 'round') {\n      top = `<rect class=\"shape\" x=\"${x0}\" y=\"${y0}\" width=\"${w}\" height=\"${d}\" rx=\"${w * .44}\"/>\n        <path class=\"ln\" d=\"M${x0 + w * .12},${y0 + d * .55} C${x0 + w * .12},${y0 + d * .14} ${x0 + w * .88},${y0 + d * .14} ${x0 + w * .88},${y0 + d * .55}\"/>`;\n    } else if (kind === 'bed') {\n      const hb = Math.max(6, 9 * s), pw = (w - 3 * 10) / 2;\n      top = `<rect class=\"shape\" x=\"${x0}\" y=\"${y0}\" width=\"${w}\" height=\"${d}\" rx=\"10\"/>\n        <rect class=\"inner\" x=\"${x0 + 6}\" y=\"${y0 + hb + 4}\" width=\"${w - 12}\" height=\"${d - hb - 10}\" rx=\"8\"/>\n        <line class=\"ln\" x1=\"${x0 + 4}\" y1=\"${y0 + hb}\" x2=\"${x0 + w - 4}\" y2=\"${y0 + hb}\"/>\n        <rect class=\"ln\" x=\"${x0 + 10}\" y=\"${y0 + hb + 10}\" width=\"${pw}\" height=\"${Math.min(d * .16, 34)}\" rx=\"9\"/>\n        <rect class=\"ln\" x=\"${x0 + 20 + pw}\" y=\"${y0 + hb + 10}\" width=\"${pw}\" height=\"${Math.min(d * .16, 34)}\" rx=\"9\"/>`;\n    } else if (kind === 'bench') {\n      top = `<rect class=\"shape\" x=\"${x0}\" y=\"${y0}\" width=\"${w}\" height=\"${d}\" rx=\"${d / 2}\"/>\n        <rect class=\"ln\" x=\"${x0 + 7}\" y=\"${y0 + 7}\" width=\"${w - 14}\" height=\"${d - 14}\" rx=\"${d / 2 - 7}\"/>`;\n    } else if (kind === 'cyl' || kind === 'ctable') {\n      top = `<rect class=\"shape\" x=\"${x0}\" y=\"${y0}\" width=\"${w}\" height=\"${d}\" rx=\"${Math.min(w, d) / 2}\"/>\n        <rect class=\"ln\" x=\"${x0 + 6}\" y=\"${y0 + 6}\" width=\"${w - 12}\" height=\"${d - 12}\" rx=\"${Math.min(w, d) / 2 - 6}\"/>`;\n    } else if (kind === 'nest') {\n      top = `<path class=\"ln\" d=\"${wavy(x0 + w * .6, y0 + d * .62, w / 2 * .7, d / 2 * .72, 2, .05, 1.2)}\" stroke-dasharray=\"4 4\"/>\n        <path class=\"shape\" d=\"${wavy(x0 + w / 2, y0 + d / 2, w / 2 * .96, d / 2 * .94, 2, .05, .3)}\"/>`;\n    } else if (kind === 'L' || kind === 'U') {\n      /* vue de dessus en L (m\u00E9ridienne \u00E0 gauche) ou en U (une m\u00E9ridienne de chaque c\u00F4t\u00E9), coins arrondis */\n      const cw = (kind === 'L' ? 100 : 93.5) * s, bd = d * (kind === 'L' ? 104 / 175 : .55), back = 18 * s, r = 14;\n      const pts = kind === 'L'\n        ? [[x0, y0], [x0 + w, y0], [x0 + w, y0 + bd], [x0 + cw, y0 + bd], [x0 + cw, y0 + d], [x0, y0 + d]]\n        : [[x0, y0], [x0 + w, y0], [x0 + w, y0 + d], [x0 + w - cw, y0 + d], [x0 + w - cw, y0 + bd], [x0 + cw, y0 + bd], [x0 + cw, y0 + d], [x0, y0 + d]];\n      const n = pts.length;\n      let dP = '';\n      pts.forEach((pt, i) => {\n        const a = pts[(i + n - 1) % n], b = pts[(i + 1) % n];\n        const u = (q) => { const dx = q[0] - pt[0], dy = q[1] - pt[1], l = Math.hypot(dx, dy); return [pt[0] + dx / l * r, pt[1] + dy / l * r]; };\n        const p1 = u(a), p2 = u(b);\n        dP += `${i ? 'L' : 'M'}${p1[0].toFixed(1)},${p1[1].toFixed(1)} Q${pt[0].toFixed(1)},${pt[1].toFixed(1)} ${p2[0].toFixed(1)},${p2[1].toFixed(1)} `;\n      });\n      const xs = kind === 'L' ? [x0 + cw, x0 + cw + (w - cw) / 2] : [x0 + cw, x0 + w - cw];\n      let cuts = `<line class=\"ln\" x1=\"${x0 + 8}\" y1=\"${y0 + back}\" x2=\"${x0 + w - 8}\" y2=\"${y0 + back}\"/>`;\n      xs.forEach((cx) => { cuts += `<line class=\"ln\" x1=\"${cx}\" y1=\"${y0 + back + 6}\" x2=\"${cx}\" y2=\"${y0 + bd - 6}\"/>`; });\n      const mer = kind === 'L' ? `<text class=\"lbl lbl-in\" x=\"${(x0 + cw / 2).toFixed(1)}\" y=\"${(y0 + (bd + d) / 2 + 5).toFixed(1)}\" text-anchor=\"middle\">M\u00E9ridienne</text>` : '';\n      top = `<path class=\"shape\" d=\"${dP}Z\"/>${cuts}${mer}`;\n    } else {\n      const arm = p.slug === 'meridienne' ? 0 : Math.min(w * .1, 17 * s);\n      const back = Math.min(d * .3, 18 * s);\n      const rx = Math.min(d * .3, kind === 'chair' ? 30 : 26);\n      const inX = x0 + arm + 4, inW = w - 2 * arm - 8, inY = y0 + back, inH = d - back - 6;\n      const n = kind === 'chair' ? 1 : (W > 180 ? 3 : 2);\n      let cuts = '';\n      for (let c = 1; c < n; c++) { const cx = inX + (inW / n) * c; cuts += `<line class=\"ln\" x1=\"${cx}\" y1=\"${inY + 6}\" x2=\"${cx}\" y2=\"${inY + inH - 6}\"/>`; }\n      top = `<rect class=\"shape\" x=\"${x0}\" y=\"${y0}\" width=\"${w}\" height=\"${d}\" rx=\"${rx}\"/>\n        <rect class=\"inner\" x=\"${inX}\" y=\"${inY}\" width=\"${inW}\" height=\"${inH}\" rx=\"${Math.max(8, rx * .6)}\"/>${cuts}`;\n    }\n    const yD = y0 + d + 30;\n    const yF = yD + 74;\n    let front = '';\n    const floor = yF + h;\n    if (kind === 'bed') {\n      const fr0 = floor - h * .42;\n      front = `<rect class=\"shape\" x=\"${x0}\" y=\"${yF}\" width=\"${w}\" height=\"${h}\" rx=\"12\"/>\n        <rect class=\"shape\" x=\"${x0 - 4}\" y=\"${fr0}\" width=\"${w + 8}\" height=\"${h * .3}\" rx=\"10\"/>\n        <line class=\"ln\" x1=\"${x0 + w * .06}\" y1=\"${fr0 + h * .3}\" x2=\"${x0 + w * .06}\" y2=\"${floor}\"/><line class=\"ln\" x1=\"${x0 + w * .94}\" y1=\"${fr0 + h * .3}\" x2=\"${x0 + w * .94}\" y2=\"${floor}\"/>`;\n    } else if (kind === 'bench') {\n      const lift = h * .26;\n      front = `<rect class=\"shape\" x=\"${x0}\" y=\"${yF}\" width=\"${w}\" height=\"${h - lift}\" rx=\"${Math.min((h - lift) * .45, 30)}\"/>\n        <path class=\"ln\" d=\"M${x0 + w * .12},${yF + h - lift} L${x0 + w * .1},${floor} M${x0 + w * .88},${yF + h - lift} L${x0 + w * .9},${floor}\"/>`;\n    } else if (kind === 'cyl') {\n      front = `<rect class=\"shape\" x=\"${x0}\" y=\"${yF}\" width=\"${w}\" height=\"${h}\" rx=\"10\"/>\n        <line class=\"ln\" x1=\"${x0 + 3}\" y1=\"${yF + h / 3}\" x2=\"${x0 + w - 3}\" y2=\"${yF + h / 3}\"/><line class=\"ln\" x1=\"${x0 + 3}\" y1=\"${yF + h * 2 / 3}\" x2=\"${x0 + w - 3}\" y2=\"${yF + h * 2 / 3}\"/>`;\n    } else if (kind === 'ctable') {\n      const t = Math.max(4, 3 * s);\n      front = `<path class=\"shape\" d=\"M${x0},${yF} H${x0 + w} V${yF + t} H${x0 + w * .22 + t} V${floor - t} H${x0 + w * .86} V${floor} H${x0 + w * .22} V${yF + t} H${x0} Z\" stroke-linejoin=\"round\"/>`;\n    } else if (kind === 'nest') {\n      const th = Math.max(4, 3 * s);\n      front = `<rect class=\"shape\" x=\"${x0}\" y=\"${yF}\" width=\"${w}\" height=\"${th}\" rx=\"${th / 2}\"/>\n        <path class=\"ln\" d=\"M${x0 + w * .14},${yF + th} L${x0 + w * .08},${floor} M${x0 + w * .86},${yF + th} L${x0 + w * .92},${floor} M${x0 + w * .36},${yF + th} L${x0 + w * .32},${floor} M${x0 + w * .64},${yF + th} L${x0 + w * .68},${floor}\"/>`;\n    } else if (kind === 'table') {\n      const th = 6 * s, leg = 16 * s;\n      front = `<rect class=\"shape\" x=\"${x0}\" y=\"${yF}\" width=\"${w}\" height=\"${th}\" rx=\"${th / 2}\"/>\n        <rect class=\"inner\" x=\"${x0 + w * .08}\" y=\"${yF + th}\" width=\"${leg}\" height=\"${h - th}\" rx=\"3\"/>\n        <rect class=\"inner\" x=\"${x0 + w * .92 - leg}\" y=\"${yF + th}\" width=\"${leg}\" height=\"${h - th}\" rx=\"3\"/>\n        <rect class=\"inner\" x=\"${x0 + w * .55}\" y=\"${yF + th}\" width=\"${leg}\" height=\"${h - th}\" rx=\"3\"/>`;\n    } else {\n      /* fauteuils \u00E0 bascule : des patins ; fauteuils sur pieds : quatre pieds fins ; chauffeuse : pos\u00E9e au sol */\n      const rocking = ['berceuse', 'veilleuse'].includes(p.slug), legs = kind === 'round' || p.slug === 'coquillage';\n      const lift = legs ? (kind === 'round' ? 12 : 22) * s : rocking ? 10 * s : 0;\n      const bodyH = h - lift;\n      front = `<rect class=\"shape\" x=\"${x0}\" y=\"${yF}\" width=\"${w}\" height=\"${bodyH}\" rx=\"${Math.min(bodyH * .3, 26)}\"/>`;\n      if (legs) front += `<line class=\"ln\" x1=\"${x0 + w * .2}\" y1=\"${yF + bodyH}\" x2=\"${x0 + w * .16}\" y2=\"${floor}\"/><line class=\"ln\" x1=\"${x0 + w * .8}\" y1=\"${yF + bodyH}\" x2=\"${x0 + w * .84}\" y2=\"${floor}\"/>`;\n      if (rocking) front += `<path class=\"ln\" d=\"M${x0 - 8},${floor - 8} Q${x0 + w / 2},${floor + 10} ${x0 + w + 8},${floor - 8}\"/>`;\n      if (D.hauteurAssise) {\n        const ys = floor - D.hauteurAssise * s;\n        front += `<line class=\"seat\" x1=\"${x0 + 6}\" y1=\"${ys}\" x2=\"${x0 + w - 6}\" y2=\"${ys}\"/>`;\n        front += vdim(x0 - 34, ys, floor, f(D.hauteurAssise), 'seat-t');\n      }\n    }\n    return `<svg class=\"plan-svg\" viewBox=\"0 0 600 ${floor + 34}\" role=\"img\" aria-label=\"Plan cot\u00E9 de ${esc(p.nom)} : largeur ${f(W)}, profondeur ${f(P)}, hauteur ${f(H)}${D.hauteurAssise ? ', assise \u00E0 ' + f(D.hauteurAssise) : ''}\">\n      <text class=\"lbl\" x=\"${x0}\" y=\"24\">Vue de dessus</text>\n      ${top}\n      <line class=\"ext\" x1=\"${x0}\" y1=\"${y0 + d + 4}\" x2=\"${x0}\" y2=\"${yD + 6}\"/><line class=\"ext\" x1=\"${x0 + w}\" y1=\"${y0 + d + 4}\" x2=\"${x0 + w}\" y2=\"${yD + 6}\"/>\n      ${hdim(x0, x0 + w, yD, f(W))}\n      ${vdim(x0 + w + 34, y0, y0 + d, f(P))}\n      <text class=\"lbl\" x=\"${x0}\" y=\"${yF - 18}\">Vue de face</text>\n      ${front}\n      <line class=\"ext\" x1=\"${x0 - 60}\" y1=\"${floor}\" x2=\"${x0 + w + 60}\" y2=\"${floor}\"/>\n      ${vdim(x0 + w + 34, yF, floor, f(H))}\n    </svg>`;\n  }\n\n  /* =========================================================\n     PAGES\n     ========================================================= */\n\n  /* ---------------- Accueil ---------------- */\n  const H = { i: 0, k: 0, s: 0, timer: 0, stop: false, busy: 0 };\n\n  const SALON = () => [\n    ['incurve', 'incurve-sel'],\n    ['capiton', 'capiton-matin'],\n    ['causeuse', 'causeuse-arches'],\n    ['meridienne', 'meridienne-platre'],\n    ['petit-mouton', 'petit-mouton-paris'],\n    ['petit-incurve', 'petit-incurve-galerie']\n  ];\n  /* Texte alternatif d'un tableau (Jade n'a pas encore de tableau dans le catalogue) */\n  const tabAlt = (p, id) => (id === 'causeuse-arches' || !p.tableau ? `${p.nom} en velours c\u00F4tel\u00E9 Vert sous-bois devant des arches ocre` : p.tableau.alt);\n\n  function heroBuy(p) {\n    const c = p.couleurs[H.k] || p.couleurs[0];\n    const size = p.tailles ? p.tailles[H.s].nom : '';\n    return `\n      <h2 class=\"buy__name display\"><a href=\"#/p/${p.slug}\">${esc(p.nom)}</a></h2>\n      <div class=\"buy__price\"><strong class=\"num\" data-hero-price>${price(unitPriceOf(p, size))}</strong><a class=\"round round--white\" href=\"#/p/${p.slug}\" aria-label=\"Voir la fiche de ${esc(p.nom)}\">${I.ne}</a></div>\n      <fieldset class=\"opt\"><legend class=\"sr-only\">Couleur : <span data-hero-colname>${esc(c.nom)}</span></legend>\n        <div class=\"swatches\" role=\"radiogroup\" aria-label=\"Couleur de ${esc(p.nom)}\">\n          ${p.couleurs.map((x, k) => swatchBtn(x, k, k === H.k, 'hero-color')).join('')}\n        </div>\n      </fieldset>\n      ${p.tailles && p.tailles.length > 1 ? `<fieldset class=\"opt\"><legend class=\"sr-only\">Taille</legend>\n        <div class=\"sizes\" role=\"radiogroup\" aria-label=\"Taille\">\n          ${p.tailles.map((t, k) => `<button class=\"pill pill--sm${sizeOutFor(t, c.nom) ? ' is-out' : ''}\" type=\"button\" role=\"radio\" aria-checked=\"${k === H.s}\" data-action=\"hero-size\" data-k=\"${k}\"${sizeOutFor(t, c.nom) ? ' disabled' : ''}>${esc(t.nom)}</button>`).join('')}\n        </div>\n      </fieldset>` : ''}\n      <div class=\"buy__perks\">\n        <div class=\"buy__ship\"><span class=\"round round--white\">${I.truck}</span><p><strong>Livraison offerte</strong><span>Chez vous ${delivery(p)}</span></p></div>\n        ${(() => { const e = easyIn(p); return e ? `<div class=\"buy__ship\"><span class=\"round round--white\">${I.door}</span><p><strong>${esc(e[0])}</strong><span>${esc(e[1])}</span></p></div>` : ''; })()}\n      </div>\n      <button class=\"cta cta--block buy__cta\" type=\"button\" data-action=\"hero-add\"${isOut(c) || notYet(p) ? ' disabled' : ''}><span class=\"cta__label\">${notYet(p) ? 'Bient\u00F4t disponible' : isOut(c) ? 'Bient\u00F4t de retour' : 'Ajouter au panier'}</span><span class=\"cta__plus\">${I.plus}</span></button>`;\n  }\n\n  function heroPeek(p) {\n    const c = p.couleurs[H.k];\n    if (!c || !c.image || H.k === 0 || retirees(p).has(c.image)) return '';\n    return `<img src=\"${photo(p, c.image, 640)}\" alt=\"${esc(p.nom)} en ${esc(c.nom.toLowerCase())}, photo du produit\" decoding=\"async\">`;\n  }\n\n\n  /* Carte d'un ensemble : les pi\u00E8ces pos\u00E9es ensemble dans le studio, la liste, le prix exact, les cadeaux d\u00E9bloqu\u00E9s.\n     Le bouton est un lien soulign\u00E9 : plusieurs cartes sont visibles \u00E0 la fois, et un seul bouton noir par \u00E9cran. */\n  /* L'image de l'ensemble : ses pi\u00E8ces pos\u00E9es c\u00F4te \u00E0 c\u00F4te dans le studio, \u00E0 l'\u00E9chelle r\u00E9elle entre elles\n     (cartes-echelle.py) ; sans cette image, les d\u00E9tour\u00E9s pos\u00E9s sur le studio dessin\u00E9 en CSS */\n  /* l'image d'un ensemble en vraies photos (cadre 4:3, cartes.json > photo > ensembles), ou '' */\n  function ensPic(first, alt, sizes = '(max-width: 980px) min(84vw, 420px), 31vw') {\n    /* refonte du 07/10 : plus de d\u00E9tour\u00E9s coll\u00E9s c\u00F4te \u00E0 c\u00F4te, la vraie photo de la premi\u00E8re pi\u00E8ce dans une pi\u00E8ce */\n    const fp = BY[first], fs = fp && scenesFor(fp, '');\n    if (fs && fs.length) return sceneImg(fp, fs[0], { alt: fs[0].alt, sizes, eager: false, cls: '', wide: true });\n    const E = PHOTO && PHOTO.ensembles, im = E && E.images && E.images[first];\n    if (!im) return '';\n    const set = (ext) => im.largeurs.map((w) => `${E.dossier}${first}-${w}.${ext} ${w}w`).join(', ');\n    const w = im.largeurs[im.largeurs.length - 1];\n    return `<picture><source type=\"image/avif\" srcset=\"${set('avif')}\" sizes=\"${sizes}\"><source type=\"image/webp\" srcset=\"${set('webp')}\" sizes=\"${sizes}\"><img src=\"${E.dossier}${first}-${im.largeurs.includes(1200) ? 1200 : w}.webp\" alt=\"${esc(alt)}\" width=\"${w}\" height=\"${Math.round(w / (im.ratio || 4 / 3))}\" loading=\"lazy\" decoding=\"async\" draggable=\"false\"></picture>`;\n  }\n  function ensMedia(e) {\n    const first = e.items[0][0];\n    const label = andList(e.items.map(([sl]) => BY[sl].nom));\n    const pic = ensPic(first, `${label}, c\u00F4te \u00E0 c\u00F4te dans le studio`);\n    if (!pic) return `<div class=\"ens__media ens__media--studio\" role=\"img\" aria-label=\"${esc(label)}\">${e.items.map(([sl]) => `<span class=\"ens__piece\" style=\"--h:${BY[sl].dimensions.hauteur || 70};--w:${BY[sl].dimensions.largeur || 100}\">${prodImg(BY[sl], { alt: '' })}</span>`).join('')}</div>`;\n    return `<div class=\"ens__media ens__media--scene\">${pic}</div>`;\n  }\n  /* Carte d'un ensemble : l'image, le nom, pour qui, puis la liste des pi\u00E8ces comme un cartel (nom et taille \u00E0 gauche,\n     prix \u00E0 droite), les cadeaux en une phrase, le prix exact et l'ajout. Pas de vignettes : l'image montre d\u00E9j\u00E0 chaque pi\u00E8ce. */\n  function ensCard(e, i) {\n    const total = ensTotal(e);\n    const gifts = giftsFor(total);\n    const sizeOf = (p, size) => (size && p.tailles ? (isBed(p) ? `, ${size.replace(/ /g, NB)}` : `, ${(size.match(/^\\d+/) || [''])[0]}${NB}cm`) : '');\n    return `<article class=\"ens\">\n      ${ensMedia(e)}\n      <div class=\"ens__body\">\n        <h3 class=\"ens__name\">${esc(e.nom)}</h3>\n        <div class=\"ens__contenu\"><ul class=\"ens__list\">${e.items.map(([slug, , size]) => { const p = BY[slug]; return `<li><a href=\"#/p/${slug}\">${esc(p.nom)}<span class=\"ens__kind\">${esc(lc1(cardType(p)))}${sizeOf(p, size)}</span></a><span class=\"num\">${price(unitPriceOf(p, size))}</span></li>`; }).join('')}</ul>\n        ${gifts.length ? `<p class=\"ens__offer\">Offerts avec l\u2019ensemble : ${esc(andList(gifts.map((pl) => GIFT_HOME[SITE.paliers.indexOf(pl)] || pl.cadeau)))}.</p>` : ''}</div>\n        <div class=\"ens__foot\"><strong class=\"num\">${price(total)}</strong><button class=\"btn btn--sm ens__add\" type=\"button\" data-action=\"ens-add\" data-i=\"${i}\">Ajouter l\u2019ensemble</button></div>\n      </div>\n    </article>`;\n  }\n\n\n  /* Accueil, charte \u00AB affiche de meuble \u00BB : un seul studio gris (les rendus studio-gris), une pi\u00E8ce par cadre,\n     un grand mot, beaucoup de vide.\n     Ouverture : le mot g\u00E9ant \u00AB Caplia \u00BB passe entre le studio et le canap\u00E9 (deux calques du m\u00EAme cadrage,\n     maquettes/outils/hero-accueil.py), puis passage au noir et \u00E9toile, au fil du d\u00E9filement natif\n     (section collante, aucun \u00E9pinglage JavaScript : rien ne bloque la molette). */\n  const HERO_SLUG = 'bulle-294';   /* 18/10 (audit, d\u00E9cision D3) : Cumulus, la pi\u00E8ce en pub la plus rentable (\u00D72,78), \u00E0 la place de Corolle */\n  /* Pi\u00E8ces secondaires (plan ma\u00EEtre A19, L5) : en fin de grille, apr\u00E8s les formes douces, de la plus ch\u00E8re \u00E0 la moins ch\u00E8re */\n  const SECONDAIRES = ['angle-cotele', 'u-cotele', 'coquillage', 'miroir-organique'];\n  const byChoice = (list) => [...list.filter((p) => !SECONDAIRES.includes(p.slug)), ...list.filter((p) => SECONDAIRES.includes(p.slug))];\n  /* les cadeaux des paliers, \u00E9crits pour la phrase du \u00AB salon assorti \u00BB (m\u00EAme ordre que SITE.paliers) */\n  const GIFT_HOME = ['2 coussins n\u0153ud', 'un plaid', 'un second plaid'];\n  /* Description de la page pour les moteurs de recherche, remise par d\u00E9faut quand on quitte la page */\n  let DESC_DEFAULT = null;\n  /* Description (balise meta) propre \u00E0 chaque page d'aide et l\u00E9gale (07/10, chantier 9) : plus la phrase g\u00E9n\u00E9rique du site.\n     Une page qui \u00E9crit la sienne (setDesc dans son \u00AB after \u00BB) la remplace. */\n  const PAGE_DESC = {\n    livraison: () => `Livraison offerte en France m\u00E9tropolitaine : ${SITE.livraison.delais.FR[0]} \u00E0 ${SITE.livraison.delais.FR[1]} jours ouvr\u00E9s depuis la France, ${euMin()} \u00E0 ${euMax()} depuis ${euDe('\u2019')}. La date sur chaque fiche, ${SITE.retours.delaiJours} jours pour changer d\u2019avis.`,\n    matieres: () => 'Bouclette, chenille, velours c\u00F4tel\u00E9, effet lin : le toucher de chaque tissu Caplia, en photos de pr\u00E8s, et comment l\u2019entretenir au quotidien.',\n    arrivee: () => 'Comment arrive votre canap\u00E9 : colis, carton compress\u00E9, temps de reprise de forme et installation sans outil, \u00E9tape par \u00E9tape en photos.',\n    'a-propos': () => 'Qui est derri\u00E8re Caplia : une boutique en ligne fran\u00E7aise de canap\u00E9s aux formes douces, livr\u00E9s depuis des entrep\u00F4ts en Europe.',\n    questions: () => 'Livraison, passage de porte, colis, retours, garantie, entretien : les r\u00E9ponses aux questions pos\u00E9es le plus souvent avant d\u2019acheter chez Caplia.',\n    contact: () => `Une question sur une pi\u00E8ce, une mesure ou une commande ? \u00C9crivez \u00E0 ${SITE.email} : la r\u00E9ponse arrive ${reponse()}.`,\n    renoncer: () => `Renoncer \u00E0 votre commande Caplia dans les ${SITE.retours.delaiJours} jours qui suivent la r\u00E9ception : le formulaire, et la marche \u00E0 suivre pour le retour.`,\n    'mentions-legales': () => 'Mentions l\u00E9gales du site Caplia : \u00E9diteur, h\u00E9bergeur, m\u00E9diation de la consommation et propri\u00E9t\u00E9 des contenus.',\n    'conditions-de-vente': () => 'Conditions g\u00E9n\u00E9rales de vente de Caplia : commande, prix, paiement, livraison, droit de r\u00E9tractation, garanties et m\u00E9diation.',\n    confidentialite: () => 'Comment Caplia utilise vos donn\u00E9es : commande, e-mails choisis, cookies, dur\u00E9e de conservation et vos droits.',\n    paiement: () => 'Paiement chez Caplia : carte bancaire, Shop Pay, PayPal ou Apple Pay, paiement chiffr\u00E9 par Shopify, remboursement sous 14 jours si vous changez d\u2019avis.',\n    garantie: () => 'La garantie l\u00E9gale de conformit\u00E9 de 2 ans, expliqu\u00E9e simplement avec des exemples : ce qu\u2019elle couvre et comment la faire jouer chez Caplia.',\n    'tout-va-bien': () => 'Votre pi\u00E8ce Caplia est arriv\u00E9e : les gestes des premiers jours, l\u2019entretien et \u00E0 qui \u00E9crire si une question se pose.',\n    'un-souci': () => 'Un pied ab\u00EEm\u00E9, une pi\u00E8ce qui manque \u00E0 l\u2019arriv\u00E9e ? Envoyez une photo : Caplia s\u2019occupe du reste, sans frais pour vous.',\n    'petits-espaces': () => 'Petits canap\u00E9s et fauteuils pour studio ou petit salon : largeurs, passage de porte et livraison compress\u00E9e, chez Caplia.',\n    'jeunes-parents': () => 'Fauteuils \u00E0 bascule et d\u2019allaitement pour la chambre de b\u00E9b\u00E9 : balancement doux, repose-pieds et livraison offerte.',\n    'pourquoi-caplia': () => 'Pourquoi acheter chez Caplia : la date de livraison, le passage de porte et le prix connus avant de payer.'\n  };\n  function setDesc() { /* Shopify : la balise description est celle de Liquid, jamais r\u00E9\u00E9crite */ }\n\n  /* Accueil (refonte du 07/10) : un r\u00E9cit en formats altern\u00E9s, jamais deux fois le m\u00EAme de suite :\n     affiche (la pi\u00E8ce dans une vraie pi\u00E8ce \u00E0 la chaux, montr\u00E9e enti\u00E8re \u00E0 chaque largeur : cadrages du 07/10, le mot\n     \u00AB Caplia. \u00BB en surimpression et le d\u00E9filement d\u00E9cal\u00E9 de la photo sont retir\u00E9s), rang\u00E9e de pi\u00E8ces,\n     diptyque (la mati\u00E8re), affiche d'univers, rang\u00E9e, diptyque (un salon assorti), affiche d'univers, rang\u00E9e, et une\n     derni\u00E8re image pleine largeur avant le pied de page. */\n  const HOME_HERO = { img: 'accueil', alt: 'Mise en sc\u00E8ne de Corolle, canap\u00E9 arrondi en bouclette cr\u00E8me, dans un salon aux murs \u00E0 la chaux, au soleil de fin d\u2019apr\u00E8s-midi' };\n  /* Affiche de l'accueil (08/10, pi\u00E8ce chang\u00E9e le 18/10) : Cumulus entier, la vraie photo d\u00E9tour\u00E9e sur le fond clair du site\n     (hero-accueil.py --photo cumulus) ; cadre bas au t\u00E9l\u00E9phone (780 x 470 : \u00AB Voir les canap\u00E9s \u00BB tient dans le premier \u00E9cran),\n     cadre large au-del\u00E0 de 700 px, une largeur par \u00E9cran (AVIF puis WebP), demand\u00E9e tout de suite. Le th\u00E8me Shopify la rend\n     aussi par Liquid et la pr\u00E9charge (caplia-affiche-accueil). La photo et le nom m\u00E8nent \u00E0 la fiche (critique du 18/10). */\n  const HY_LG = [750, 1080, 1600, 2400], HY_HT = [720, 1080, 1440];\n  const HY_ALT = 'Cumulus, canap\u00E9 bulle en chenille blanc cr\u00E8me de 294 cm, en trois blocs';\n  const hySet = (cadre, ws, ext) => ws.map((l) => `/site/assets/affiches/cumulus-${cadre}-${l}.${ext} ${l}w`).join(', ');\n  const hyPic = () => `<picture class=\"hy__img\"><source media=\"(max-width: 700px)\" type=\"image/avif\" srcset=\"${hySet('haut', HY_HT, 'avif')}\" sizes=\"100vw\"><source media=\"(max-width: 700px)\" type=\"image/webp\" srcset=\"${hySet('haut', HY_HT, 'webp')}\" sizes=\"100vw\"><source type=\"image/avif\" srcset=\"${hySet('large', HY_LG, 'avif')}\" sizes=\"100vw\"><img src=\"/site/assets/affiches/cumulus-large-1600.webp\" srcset=\"${hySet('large', HY_LG, 'webp')}\" sizes=\"100vw\" width=\"1600\" height=\"800\" alt=\"${esc(HY_ALT)}\" loading=\"eager\" fetchpriority=\"high\" draggable=\"false\"></picture>`;\n  function homeRow(c) {\n    if (!c || picksOf(c).length < 2) return '';\n    return `<section class=\"wrap hrow\" aria-labelledby=\"hrow-${c.slug}\">\n      <div class=\"hrow__head\"><h2 class=\"t-2 hrow__t\" id=\"hrow-${c.slug}\"><a href=\"${c.route}\">${esc(c.nom)}</a></h2>\n        <ul class=\"hrow__subs\" role=\"list\">${subsOf(c).map((s) => `<li><a href=\"${subHref(s)}\">${esc(s.nom)}</a></li>`).join('')}</ul></div>\n      <div class=\"hrow__grid hrow__grid--n${picksOf(c).length}\">${picksOf(c).map((p) => pcard(p, { sizes: '(max-width: 760px) 80vw, 25vw' })).join('')}</div>\n      <a class=\"link hrow__all\" href=\"${c.route}\">${CAT_LINK[c.slug] || `Voir : ${esc(c.nom)}`}</a>\n    </section>`;\n  }\n  function homeUni(slug, h) {\n    const u = UNIVERS[slug], ref = SUBS[slug];\n    if (!u || !ref) return '';\n    /* 18/10 (audit 09, 3.11) : pas d'aria-label, le texte visible du lien le nomme (commande \u00E0 la voix) */\n    return `<a class=\"uni uni--home${u.shade ? ' uni--shade' : ''}${u.ty != null ? ' uni--top' : ''}\" href=\"${subHref(ref.sub)}\" style=\"${uniVars(u)}\">${uniImg(u, false)}\n      <span class=\"uni__txt\"><span class=\"t-1 uni__t\">${esc(h)}</span><span class=\"uni__l\">${esc(u.line)}</span><span class=\"uni__go\">Voir la collection</span></span></a>`;\n  }\n  function homeMatiere() {\n    const p = BY.galet || BY.incurve;\n    const m = MAT && MAT.matieres && MAT.matieres.bouclette;\n    if (!p || !m) return '';\n    const im = p.images.find((x) => x.id === '07') || p.images.find((x) => closeUp(x.alt));\n    if (!im) return '';\n    return `<section class=\"wrap hdip\" aria-labelledby=\"hdip-mat\">\n      <figure class=\"hdip__img\">${momentPic(p, im, '(max-width: 760px) 100vw, 58vw')}</figure>\n      <div class=\"hdip__txt\"><h2 class=\"t-2\" id=\"hdip-mat\">La bouclette, de pr\u00E8s</h2><p class=\"hdip__p\">${esc(m.toucher)}</p><a class=\"link\" href=\"#/matieres\">Nos mati\u00E8res</a></div>\n    </section>`;\n  }\n  const GIFT_SHORT_TXT = ['2 coussins n\u0153ud', 'un plaid', 'un second plaid'];\n  function homeSalon() {\n    const k = [ENS.findIndex((e) => e.accueil), 1, 3, 4, 0, 2, 5].find((i) => i >= 0 && ENS[i] && ensOk(ENS[i]));\n    if (k == null) return '';\n    const e = ENS[k], first = BY[e.items[0][0]];\n    const sc = scenesFor(first, e.items[0][1]);\n    /* sans photo en situation enti\u00E8re (Cumulus : celles du vendeur coupent le canap\u00E9), la vraie photo de la pi\u00E8ce sur fond clair */\n    const im = sc[1] || sc[0];\n    const fig = im ? sceneImg(first, im, { alt: im.alt, sizes: '(max-width: 760px) 100vw, 58vw', eager: false, cls: '' })\n      : pieceImg(first, { color: e.items[0][1], alt: `${first.nom} en ${e.items[0][1]}, ${lc1(cardType(first))}, sur fond clair`, sizes: '(max-width: 760px) 100vw, 58vw' });\n    const total = ensTotal(e), g = giftsFor(total), P = SITE.paliers;\n    const row = ([slug, c, size]) => {\n      const x = BY[slug], xs = scenesFor(x, c);\n      return `<li class=\"hset__i\"><a href=\"${pieceHref(x, c)}\"><span class=\"hset__pic\">${xs.length ? sceneImg(x, xs[0], { alt: '', sizes: '96px', eager: false, cls: '' }) : pieceFit(x, c, 72)}</span><span class=\"hset__n\"><b>${esc(x.nom)}</b><span>${esc(cardType(x))}</span></span><span class=\"num\">${price(unitPriceOf(x, size))}</span></a></li>`;\n    };\n    return `<section class=\"wrap hdip hdip--r\" aria-labelledby=\"hdip-set\">\n      <figure class=\"hdip__img\">${fig}</figure>\n      <div class=\"hdip__txt\"><h2 class=\"t-2\" id=\"hdip-set\">${esc(e.nom)}</h2>\n        <ul class=\"hset\" role=\"list\">${e.items.map(row).join('')}</ul>\n        <p class=\"hset__tot\"><span>L\u2019ensemble</span><span class=\"num\">${price(total)}</span></p>\n        ${g.length ? `<p class=\"hset__g\">Offerts avec : ${esc(andList(g.map((pl) => GIFT_SHORT_TXT[P.indexOf(pl)] || pl.cadeau)))}.</p>` : ''}\n        <button class=\"pill hset__add\" type=\"button\" data-action=\"ens-add\" data-i=\"${k}\"><span class=\"cta__label\">Ajouter l\u2019ensemble</span></button>\n      </div>\n    </section>`;\n  }\n  function homeEnd() {\n    const p = BY.incurve, im = p && p.images.find((x) => x.id === '06');\n    return im ? `<figure class=\"hend\">${momentPic(p, im, '100vw')}</figure>` : '';\n  }\n  function renderHome() {\n    const hp = BY[HERO_SLUG];\n    const cat = (k) => CATS.find((c) => c.slug === k);\n    const html = `\n    <section class=\"hy\" data-hy aria-labelledby=\"hy-t\">\n      ${hp ? `<a class=\"hy__frame\" href=\"${pieceHref(hp)}\" tabindex=\"-1\" aria-hidden=\"true\" draggable=\"false\">${hyPic()}</a>` : `<div class=\"hy__frame\">${hyPic()}</div>`}\n      <div class=\"hy__cartel\">\n        ${SEO_ACCUEIL.h1 ? `<h1 class=\"hy__t\" id=\"hy-t\">${esc(SEO_ACCUEIL.h1)}</h1>\n        <p class=\"hy__s\">${esc(SITE.slogan)}</p>` : `<h1 class=\"hy__t\" id=\"hy-t\">${esc(noDot(SITE.slogan))}</h1>`}\n        <p class=\"hy__p\">${hp ? `<a href=\"${pieceHref(hp)}\">${esc(hp.nom)}</a>, ${esc(lc1(cardType(hp)))}${hp.dimensions?.largeur ? ` de ${hp.dimensions.largeur} cm` : ''}, <span class=\"num\">${price(hp.prix)}</span>. ` : ''}<span class=\"hy__l\">Livraison offerte, date connue avant de payer.</span></p>\n        <a class=\"btn hy__go\" href=\"#/canapes\">Voir les canap\u00E9s</a>\n      </div>\n    </section>\n    ${homeRow(cat('canapes'))}\n    ${homeMatiere()}\n    ${homeUni('canape-bulle', 'Canap\u00E9s bulle') || homeUni('canape-nuage', 'Canap\u00E9s nuage')}\n    ${homeRow(cat('fauteuils'))}\n    ${homeSalon()}\n    ${homeUni('canape-modulable', 'Canap\u00E9s modulables') || homeUni('canape-angle', 'Canap\u00E9s d\u2019angle')}\n    ${homeRow(cat('decoration'))}\n    ${homeEnd()}\n    ${footer()}`;\n    return { title: `Caplia \u00B7 ${SITE.slogan.replace(/\\.$/, '')}`, html, scene: null, after: afterHome };\n  }\n\n  function afterHome(root) {\n    setDesc(`${SITE.slogan} Canap\u00E9s aux formes douces en bouclette, chenille ou velours c\u00F4tel\u00E9, fauteuils et miroirs. Livraison offerte, et la date de livraison connue avant de payer : ${SITE.livraison.delais.FR[0]} \u00E0 ${Math.max(...Object.values(SITE.livraison.delais).map((x) => x[1]))} jours ouvr\u00E9s.`);\n  }\n  function rackFilter(btn) {\n    const sec = btn.closest('.coll');\n    const col = btn.dataset.col;\n    $$('.tab', sec).forEach((b) => b.setAttribute('aria-selected', String(b === btn)));\n    $$('.tile', sec).forEach((it) => { it.hidden = col !== 'all' && it.dataset.col !== col; });\n    /* la pi\u00E8ce mise en avant ne garde sa grande place que dans \u00AB Tout \u00BB */\n    sec.classList.toggle('is-filtered', col !== 'all');\n  }\n\n  function heroSyncPicker(root, i) {\n    const row = $('[data-picker]', root);\n    $$('.pick', row).forEach((b, j) => b.setAttribute('aria-pressed', String(j === i)));\n    const act = $$('.pick', row)[i];\n    if (act && row.scrollWidth > row.clientWidth + 4) row.scrollTo({ left: act.offsetLeft - row.clientWidth / 2 + act.offsetWidth / 2, behavior: reduce ? 'auto' : 'smooth' });\n  }\n\n  function heroGo(target, dir) {\n    const n = PRODS.length;\n    const i = (target + n) % n;\n    if (i === H.i) return;\n    H.i = i; H.k = firstIn(PRODS[i]); H.s = 0;\n    const p = PRODS[i];\n    const root = $('[data-hero]');\n    if (!root) return;\n    const g = G();\n    const anim = g && !reduce;\n    const show = $('[data-hero-studio]', root);\n    const obj = $('[data-hero-obj]', root);\n    const buy = $('[data-hero-buy]', root);\n    const peek = $('[data-hero-peek]', root);\n    heroSyncPicker(root, i);\n    show.style.setProperty('--bg', bgOf(p, H.k));\n    peek.hidden = true; peek.innerHTML = '';\n    const token = ++H.busy;\n    const swapObj = () => {\n      show.className = `studio studio--hero studio--${shape(p)}`;\n      show.style.setProperty('--r', RATIO[p.slug] || 1.6);\n      obj.innerHTML = objHtml(p, { alt: p.nom + ', ' + p.type.toLowerCase(), eager: true });\n    };\n    const swapText = () => { buy.innerHTML = fr(heroBuy(p)); if (H.k) heroColor(H.k); };\n    if (!anim) { swapObj(); swapText(); return; }\n    g.killTweensOf([obj, buy]);\n    g.to(obj, {\n      x: -70 * dir, opacity: 0, duration: .32, ease: 'power2.in',\n      onComplete: () => {\n        if (token !== H.busy) return;\n        swapObj();\n        g.fromTo(obj, { x: 90 * dir, opacity: 0 }, { x: 0, opacity: 1, duration: .9, ease: 'expo.out' });\n      }\n    });\n    g.to(buy, {\n      opacity: 0, y: -8, duration: .22, ease: 'power2.in',\n      onComplete: () => {\n        if (token !== H.busy) return;\n        swapText();\n        g.fromTo(buy, { opacity: 0, y: 10 }, { opacity: 1, y: 0, duration: .55, ease: 'expo.out' });\n      }\n    });\n  }\n\n  function heroColor(k) {\n    const root = $('[data-hero]');\n    if (!root) return;\n    const p = PRODS[H.i];\n    H.k = k;\n    const c = p.couleurs[k];\n    $$('[data-action=\"hero-color\"]', root).forEach((b) => b.setAttribute('aria-checked', String(Number(b.dataset.k) === k)));\n    $('[data-hero-colname]', root).textContent = c.nom;\n    const hb = $('[data-action=\"hero-add\"]', root);\n    if (hb) { hb.disabled = isOut(c) || notYet(p); $('.cta__label', hb).textContent = notYet(p) ? 'Bient\u00F4t disponible' : isOut(c) ? 'Bient\u00F4t de retour' : 'Ajouter au panier'; }\n    /* une taille \u00E9puis\u00E9e dans cette couleur ne se choisit pas */\n    $$('[data-action=\"hero-size\"]', root).forEach((b) => { const o = sizeOutFor(p.tailles[Number(b.dataset.k)], c.nom); b.disabled = o; b.classList.toggle('is-out', o); });\n    if (p.tailles && sizeOutFor(p.tailles[H.s], c.nom)) { const k2 = p.tailles.findIndex((t) => !sizeOutFor(t, c.nom)); if (k2 >= 0) heroSize(k2, $(`[data-action=\"hero-size\"][data-k=\"${k2}\"]`, root)); }\n    $('[data-hero-studio]', root).style.setProperty('--bg', bgOf(p, k));\n    const peek = $('[data-hero-peek]', root);\n    const ph = heroPeek(p);\n    peek.innerHTML = ph;\n    peek.hidden = !ph;\n    if (ph && G() && !reduce) G().fromTo(peek, { opacity: 0, y: 14, scale: .96 }, { opacity: 1, y: 0, scale: 1, duration: .6, ease: 'expo.out' });\n  }\n\n  function heroSize(k, btn) {\n    const root = $('[data-hero]');\n    const p = PRODS[H.i];\n    H.s = k;\n    $$('[data-action=\"hero-size\"]', root).forEach((b) => b.setAttribute('aria-checked', String(b === btn)));\n    const s = $('[data-hero-sizename]', root); if (s) s.textContent = p.tailles[k].nom;\n    const el = $('[data-hero-price]', root);\n    el.textContent = price(unitPriceOf(p, p.tailles[k].nom));\n    if (G() && !reduce) G().fromTo(el, { yPercent: 30, opacity: 0 }, { yPercent: 0, opacity: 1, duration: .5, ease: 'expo.out' });\n  }\n\n  function heroAuto() {\n    clearInterval(H.timer);\n    if (reduce || H.stop) return;\n    H.timer = setInterval(() => { if (!document.hidden) heroGo(H.i + 1, 1); }, 7000);\n  }\n  function heroStop() { H.stop = true; clearInterval(H.timer); }\n\n\n  /* Rail horizontal : glisser \u00E0 la souris, molette, boutons */\n  function setupRail(root) {\n    $$('[data-rail]', root).forEach((rail) => {\n      const bar = rail.parentElement.querySelector('[data-rail-bar]');\n      const upd = () => {\n        if (!bar) return;\n        const ratio = rail.clientWidth / Math.max(1, rail.scrollWidth);\n        bar.style.width = `${Math.min(100, ratio * 100)}%`;\n        bar.style.transform = `translateX(${(rail.scrollLeft / Math.max(1, rail.clientWidth)) * 100}%)`;\n      };\n      rail.addEventListener('scroll', upd, { passive: true });\n      window.addEventListener('resize', upd);\n      cleanups.push(() => window.removeEventListener('resize', upd));\n      upd();\n      let wheelT = 0;\n      rail.addEventListener('wheel', (e) => {\n        if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;\n        const max = rail.scrollWidth - rail.clientWidth;\n        const dir = Math.sign(e.deltaY);\n        if ((dir > 0 && rail.scrollLeft < max - 2) || (dir < 0 && rail.scrollLeft > 2)) {\n          e.preventDefault();\n          rail.classList.add('is-wheel');\n          rail.style.scrollSnapType = 'none';\n          rail.scrollLeft += e.deltaY * (e.deltaMode === 1 ? 40 : 1.2);\n          clearTimeout(wheelT);\n          wheelT = setTimeout(() => { rail.style.scrollSnapType = ''; rail.classList.remove('is-wheel'); }, 220);\n        }\n      }, { passive: false });\n      let down = false, moved = false, startX = 0, startL = 0;\n      rail.addEventListener('pointerdown', (e) => {\n        if (e.pointerType !== 'mouse' || e.button !== 0 || e.target.closest('button')) return;\n        down = true; moved = false; startX = e.clientX; startL = rail.scrollLeft;\n      });\n      window.addEventListener('pointermove', onMove);\n      window.addEventListener('pointerup', onUp);\n      cleanups.push(() => { window.removeEventListener('pointermove', onMove); window.removeEventListener('pointerup', onUp); });\n      function onMove(e) {\n        if (!down) return;\n        const dx = e.clientX - startX;\n        if (!moved && Math.abs(dx) > 5) { moved = true; rail.classList.add('is-drag'); }\n        if (moved) { rail.scrollLeft = startL - dx; e.preventDefault(); }\n      }\n      function onUp() {\n        if (!down) return;\n        down = false;\n        if (moved) setTimeout(() => rail.classList.remove('is-drag'), 30);\n      }\n      rail.addEventListener('click', (e) => { if (moved) { e.preventDefault(); e.stopPropagation(); moved = false; } }, true);\n      rail.addEventListener('dragstart', (e) => e.preventDefault());\n    });\n  }\n\n  /* Parallaxe en couches :\n     - tableau + calque du canap\u00E9 : m\u00EAmes dimensions, m\u00EAme mouvement (mont\u00E9e + zoom lent) ;\n     - mot g\u00E9ant : monte moins vite, donc le dossier du canap\u00E9 recouvre peu \u00E0 peu le bas des lettres ;\n     - ouverture (mode \u00AB hero \u00BB) : section \u00E9pingl\u00E9e, le texte s'efface, la sc\u00E8ne passe au noir, puis l'\u00E9toile ;\n     - tableaux : pas d'\u00E9pinglage, le mouvement suit simplement le passage de la section \u00E0 l'\u00E9cran. */\n  const K0 = .2, K1 = .5; /* part de la hauteur des capitales cach\u00E9e par le dossier, au d\u00E9but et \u00E0 la fin */\n  const clamp01 = (v) => Math.max(0, Math.min(1, v));\n  function capHeight(fs) {\n    try {\n      const ctx = document.createElement('canvas').getContext('2d');\n      ctx.font = `800 ${fs}px \"Plus Jakarta Sans\"`;\n      const m = ctx.measureText('H');\n      if (m.actualBoundingBoxAscent > 0) return m.actualBoundingBoxAscent;\n    } catch (e) { /* repli */ }\n    return fs * .72;\n  }\n\n  /* ---------------- Collection ---------------- */\n  /* Filtres d\u00E9duits des fiches (type, mati\u00E8re, largeur, prix) : une nouvelle pi\u00E8ce se range toute seule. */\n  const CF_FORME = {\n    canapes: [['arrondis', 'Arrondis', (p) => !/angle|m\u00E9ridienne|panoramique/i.test(p.type) && /arrondi|nuage|incurv|courb/i.test(p.type)],\n      ['droits', 'Droits', (p) => !/angle|m\u00E9ridienne|panoramique|arrondi|nuage|incurv|courb/i.test(p.type)],\n      ['meridienne', 'Angle et m\u00E9ridienne', (p) => /angle|m\u00E9ridienne|panoramique/i.test(p.type)]],\n    fauteuils: [['bascule', '\u00C0 bascule', (p) => /bascule/i.test(p.type)], ['fixes', 'Fixes', (p) => !/bascule/i.test(p.type)]],\n    decoration: [['miroirs', 'Miroirs', (p) => /miroir/i.test(p.type)], ['tables', 'Tables', (p) => /table/i.test(p.type)]]\n  };\n  const cfMat = (p) => (/bouclette/i.test(p.matiere) ? 'Bouclette' : /chenille/i.test(p.matiere) ? 'Chenille' : /velours/i.test(p.matiere) ? 'Velours' : /lin/i.test(p.matiere) ? 'Effet lin' : /mouton/i.test(p.matiere) ? 'Effet mouton' : p.matiere);\n  const CF_LARG = [['lt200', 'Moins de 2 m', (p) => p.dimensions.largeur < 200], ['200-240', `2 \u00E0 2,40${NB}m`, (p) => p.dimensions.largeur >= 200 && p.dimensions.largeur <= 240], ['gt240', `Plus de 2,40${NB}m`, (p) => p.dimensions.largeur > 240]];\n  const PRIX = [\n    ['lt1000', `Moins de 1${NNB}000${NB}\u20AC`, (p) => p.prix < 1000],\n    ['1000-1200', `1${NNB}000 \u00E0 1${NNB}200${NB}\u20AC`, (p) => p.prix >= 1000 && p.prix <= 1200],\n    ['gt1200', `Plus de 1${NNB}200${NB}\u20AC`, (p) => p.prix > 1200]\n  ];\n  const CF_TRI = [['choix', 'Nos choix'], ['prix-asc', 'Prix croissant'], ['prix-desc', 'Prix d\u00E9croissant'], ['largeur', 'Largeur, du plus \u00E9troit']];\n  /* list : les pi\u00E8ces de la page (renderSub, 18/10) ; sans elle, toute la collection (ancien gabarit renderCollection) ;\n     colors : la couleur montr\u00E9e par carte (seo-pages.json > couleurs) */\n  const COLF0 = { slug: '', list: null, colors: null, forme: 'all', mat: 'all', larg: 'all', prix: 'all', tri: 'choix' };\n  const COLF = { ...COLF0 };\n  const CF_NOUN = { canapes: ['canap\u00E9', 'canap\u00E9s'], fauteuils: ['fauteuil', 'fauteuils'], decoration: ['pi\u00E8ce', 'pi\u00E8ces'] };\n  const cfWords = (slug) => CF_NOUN[slug] || ['pi\u00E8ce', 'pi\u00E8ces'];\n  const cfNoun = (slug, n) => `${n}${NB}${cfWords(slug)[n > 1 ? 1 : 0]}`;\n  /* tri de la page : \u00AB nos choix \u00BB (l'ordre de la page), prix croissant ou d\u00E9croissant, largeur */\n  function cfSort(list, t) {\n    const out = list.slice();\n    if (t === 'prix-asc') out.sort((a, b) => a.prix - b.prix);\n    else if (t === 'prix-desc') out.sort((a, b) => b.prix - a.prix);\n    else if (t === 'largeur') out.sort((a, b) => a.dimensions.largeur - b.dimensions.largeur);\n    return out;\n  }\n  function cfItems() {\n    const all = COLF.list || PRODS.filter((p) => p.collection === COLF.slug);\n    const f = (CF_FORME[COLF.slug] || []).find((x) => x[0] === COLF.forme);\n    const l = CF_LARG.find((x) => x[0] === COLF.larg);\n    const pr = PRIX.find((x) => x[0] === COLF.prix);\n    const out = all.filter((p) => (!f || f[2](p)) && (COLF.mat === 'all' || cfMat(p) === COLF.mat) && (!l || l[2](p)) && (!pr || pr[2](p)));\n    if (COLF.tri === 'choix') return { all, out: COLF.list ? out : byChoice(out) };\n    return { all, out: cfSort(out, COLF.tri) };\n  }\n  const CG_SIZES = '(max-width: 760px) 47vw, (max-width: 1100px) 50vw, 32vw';\n  const CG_SIZES_BIG = '(max-width: 1100px) 100vw, 66vw';\n  /* Mise en page sans trou, la m\u00EAme grille sur les trois collections : 3 colonnes sur ordinateur (2 au t\u00E9l\u00E9phone),\n     et une ou deux affiches larges (sur 2 colonnes) pour finir les lignes : la pi\u00E8ce y garde sa taille, avec plus de\n     studio autour. Les pi\u00E8ces basses et larges passent en large de pr\u00E9f\u00E9rence ; 4 pi\u00E8ces : la premi\u00E8re et la derni\u00E8re.\n     Au t\u00E9l\u00E9phone, deux cartes par ligne ; l'affiche large garde la hauteur de ses voisines. */\n    /* cadrages du 07/10 : toutes les cartes d'une grille ont le m\u00EAme cadre carr\u00E9 (plus de carte sur deux colonnes : sa\n     photo large ne gardait pas la m\u00EAme \u00E9chelle que ses voisines) ; une ou deux pi\u00E8ces : deux colonnes */\n  function cgLayout(list) {\n    return { cls: list.length <= 2 ? 'cgrid--2' : '', big: {} };\n  }\n  const CG_SIZES_2 = '(max-width: 760px) 100vw, 50vw';\n  /* colors : { slug : nom de couleur } que la page montre (seo-pages.json > couleurs) */\n  function cgCards(list, eagerN = 3, colors = null) {\n    const { big, cls } = cgLayout(list);\n    const sz = cls ? CG_SIZES_2 : CG_SIZES;   /* une ou deux pi\u00E8ces : deux par ligne */\n    const bigSz = cls === 'cgrid--1' ? '(max-width: 760px) 100vw, 92vw' : CG_SIZES_BIG;   /* pi\u00E8ce seule : toute la largeur */\n    return list.map((p, i) => pcard(p, { eager: i < eagerN, sizes: big[i] ? bigSz : sz, cls: big[i] || '', deux: cls === 'cgrid--2', color: (colors || {})[p.slug] })).join('');\n  }\n  const cgClass = (list) => `cgrid ${cgLayout(list).cls}`.trim();\n  function cfGrid(list, all) {\n    if (!list.length) {\n      const w = cfWords(COLF.slug);\n      return `<div class=\"cempty\"><p class=\"t-3\">\u00C9largissons un peu la recherche.</p><p class=\"cempty__txt\">Retirez un filtre pour revoir les ${all.length} ${w[1]}.</p><button class=\"link\" type=\"button\" data-cf-reset>Revoir les ${all.length} ${w[1]}</button></div>`;\n    }\n    return cgCards(list, 3, COLF.colors);\n  }\n  /* 18/10 (audit 03 \u00AB Collections : ni tri ni filtre \u00BB) : la barre \u00AB Filtrer et trier \u00BB (mati\u00E8re, largeur, prix, tri) de\n     l'ancien gabarit, sortie de renderCollection pour les pages de sous-cat\u00E9gorie de plus de CF_MIN pi\u00E8ces (renderSub) */\n  const CF_MIN = 8;\n  /* le menu \u00AB Trier \u00BB (barre des sous-cat\u00E9gories, page de cat\u00E9gorie) ; \u00AB Largeur \u00BB seulement l\u00E0 o\u00F9 on le demande */\n  const cfTri = (attr, largeur) => `<label class=\"cf__field cf__field--tri\"><span class=\"sr-only\">Trier</span><select class=\"input cf__select\" ${attr}>${CF_TRI.filter(([v]) => v !== 'largeur' || largeur).map(([v, t]) => `<option value=\"${v}\">${v === 'choix' ? 'Trier : nos choix' : t}</option>`).join('')}</select></label>`;\n  function cfBar(slug, all, formes = []) {\n    const mats = [...new Set(all.map(cfMat))];\n    const largs = CF_LARG.filter((x) => all.some(x[2]));\n    const prix = PRIX.filter((x) => all.some(x[2]));\n    const sel = (key, label, first, opts) => `<label class=\"cf__field\"><span class=\"sr-only\">${label}</span><select class=\"input cf__select\" data-cf=\"${key}\"><option value=\"all\">${first}</option>${opts.map(([v, t]) => `<option value=\"${esc(v)}\">${t}</option>`).join('')}</select></label>`;\n    const more = [\n      mats.length > 1 ? sel('mat', 'Mati\u00E8re', 'Mati\u00E8re', mats.map((m) => [m, esc(m)])) : '',\n      largs.length > 1 ? sel('larg', 'Largeur', 'Largeur', largs) : '',\n      prix.length > 1 ? sel('prix', 'Prix', 'Prix', prix) : ''\n    ].join('');\n    const tri = cfTri('data-cf=\"tri\"', slug === 'canapes');\n    return `<div class=\"cf cf--more\" data-cf-bar>\n        ${formes.length > 1 ? `<div class=\"cf__formes\" role=\"group\" aria-label=\"Forme\">\n          <button class=\"tab\" type=\"button\" data-action=\"filter\" data-group=\"forme\" data-value=\"all\" aria-pressed=\"true\">Tous</button>\n          ${formes.map(([id, l]) => `<button class=\"tab\" type=\"button\" data-action=\"filter\" data-group=\"forme\" data-value=\"${id}\" aria-pressed=\"false\">${l}</button>`).join('')}\n        </div>` : ''}\n        <div class=\"cf__status\"><p class=\"cf__count\" data-cf-count aria-live=\"polite\">${cfNoun(slug, all.length)}</p><button class=\"link cf__reset\" type=\"button\" data-cf-reset hidden>Tout effacer</button><button class=\"link cf__toggle\" type=\"button\" aria-expanded=\"false\" aria-controls=\"cf-more\" data-cf-toggle>Filtrer et trier</button></div>\n        <div class=\"cf__more\" id=\"cf-more\">${more}${tri}</div>\n      </div>`;\n  }\n  /* la barre et la remise \u00E0 z\u00E9ro, une fois la page pos\u00E9e */\n  function cfBind() {\n    const bar = $('[data-cf-bar]');\n    if (!bar) return;\n    $$('[data-cf]', bar).forEach((s) => s.addEventListener('change', () => applyFilter(s.dataset.cf, s.value)));\n    const tg = $('[data-cf-toggle]', bar);\n    if (tg) tg.addEventListener('click', () => { const on = tg.getAttribute('aria-expanded') !== 'true'; tg.setAttribute('aria-expanded', String(on)); bar.classList.toggle('is-open', on); });\n    $('.cpage').addEventListener('click', (e) => { if (e.target.closest('[data-cf-reset]')) applyFilter('reset'); });\n  }\n  /* Textes de chaque collection : titre de l'onglet, phrase d'introduction (faits + livraison), description pour les moteurs.\n     Le d\u00E9lai est celui des pi\u00E8ces de la collection, du plus court au plus long. */\n  const COL_COPY = {\n    canapes: {\n      title: 'Canap\u00E9s arrondis et incurv\u00E9s, livraison offerte \u00B7 Caplia',\n      /* la pi\u00E8ce la plus large de la cat\u00E9gorie, nomm\u00E9e par sa forme (\u00AB au canap\u00E9 panoramique en U modulable de 369 cm \u00BB) */\n      intro: (r, dl) => `Du 2 places de ${r.min}${NB}cm au ${lc1(r.large.type.replace(/,.*$/, ''))} de ${r.max}${NB}cm, en ${orList(r.mats)}. Livraison offerte, chez vous en ${dl}.`,\n      desc: (r, dl) => `Canap\u00E9s aux formes douces : arrondis, nuage, d\u2019angle, modulables, convertibles, en velours, m\u00E9ridienne, de ${r.min} \u00E0 ${r.max} cm, en ${orList(r.mats)}. Livraison offerte en ${dl}. Envoyez vos mesures : nous v\u00E9rifions qu\u2019il passe chez vous.`\n    },\n    fauteuils: {\n      title: 'Fauteuils ronds, \u00E0 bascule et d\u2019allaitement \u00B7 Caplia',\n      intro: (r, dl) => `Un fauteuil rond pour le coin lecture, un fauteuil \u00E0 bascule, un fauteuil d\u2019allaitement et son repose-pieds${r.slugs.includes('chauffeuse') ? ', des chauffeuses qui se d\u00E9plient en lit d\u2019appoint' : ''}. Livraison offerte, chez vous en ${dl}.`,\n      desc: (r, dl) => `Fauteuils aux formes douces : fauteuil rond en bouclette, fauteuil \u00E0 bascule, fauteuil d\u2019allaitement avec repose-pieds. Livraison offerte en ${dl}.`\n    },\n    decoration: {\n      title: 'Miroirs ondul\u00E9s et table basse nuage \u00B7 Caplia',\n      intro: (r, dl) => `${r.slugs.filter((k) => /^miroir/.test(k)).length > 1 ? 'Des miroirs aux bords ondul\u00E9s' : 'Un miroir sur pied aux bords ondul\u00E9s'}${r.slugs.includes('table-nuage') ? ' et une table basse en forme de nuage' : ''}, pour prolonger les courbes du canap\u00E9. Livraison offerte, chez vous en ${dl}.`,\n      desc: (r, dl) => `${andList(['Miroir sur pied ondul\u00E9', r.slugs.includes('miroir-organique') ? 'miroir mural aux contours arrondis' : '', r.slugs.includes('table-nuage') ? 'table basse en forme de nuage' : ''].filter(Boolean))} : la d\u00E9coration qui va avec les canap\u00E9s arrondis. Livraison offerte en ${dl}.`\n    }\n  };\n  /* Trois largeurs de canap\u00E9, trois prix (plan ma\u00EEtre M8, L2) : le milieu de gamme se lit comme le choix raisonnable */\n  const SIZE_TRIO = ['petit-incurve', 'courbe', 'capiton', 'incurve'];   /* la plus petite, la 1re du milieu en ligne, la plus grande */\n  function sizeTrio() {\n    const all = SIZE_TRIO.map((k) => BY[k]).filter(Boolean);\n    const list = all.length > 3 ? [all[0], all[1], all[all.length - 1]] : all;\n    if (list.length < 3) return '';\n    const max = Math.max(...list.map((p) => p.dimensions.largeur));\n    return `<nav class=\"ctrio\" aria-labelledby=\"ctrio-t\">\n      <h2 class=\"ctrio__t\" id=\"ctrio-t\">Quelle largeur pour votre salon ?</h2>\n      <ul class=\"ctrio__list\">${list.map((p) => `<li><a class=\"ctrio__a\" href=\"#/p/${p.slug}\">\n        <span class=\"ctrio__bar\" style=\"--w:${(p.dimensions.largeur / max * 100).toFixed(1)}%\" aria-hidden=\"true\"></span>\n        <span class=\"ctrio__w num\">${cm(p.dimensions.largeur)}</span>\n        <span class=\"ctrio__name\">${esc(p.nom)}<span class=\"ctrio__type\">, ${esc(lc1(cardType(p)))}</span></span>\n        <span class=\"ctrio__p num\">${price(p.prix)}</span>\n      </a></li>`).join('')}</ul>\n    </nav>`;\n  }\n  function renderCollection(slug) {\n    const c = colName(slug);\n    Object.assign(COLF, COLF0, { slug });\n    const { all, out } = cfItems();\n    const cc = COL_COPY[slug] || {};\n    const ws = all.map((p) => p.dimensions.largeur);\n    const r = { min: Math.min(...ws), max: Math.max(...ws) };\n    const ds = all.map((p) => DL(p));\n    const dl = `${Math.min(...ds.map((d) => d[0]))} \u00E0 ${Math.max(...ds.map((d) => d[1]))}${NB}jours ouvr\u00E9s`;\n    const intro = cc.intro ? cc.intro(r, dl) : c.intro;\n    const big = all.length > 6;\n    const formes = (CF_FORME[slug] || []).filter((x) => all.some(x[2]));\n    const others = CAT.collections.filter((x) => x.slug !== slug);\n    const html = `\n    <section class=\"wrap cpage\">\n      <header class=\"chead\">\n        <h1 class=\"t-display chead__title\">${esc(c.nom)}</h1>\n        ${intro ? `<p class=\"lead chead__intro\">${esc(intro)}</p>` : ''}\n      </header>\n      ${slug === 'canapes' ? sizeTrio() : ''}\n      ${big ? cfBar(slug, all, formes) : `<div class=\"cf cf--seul\" data-cf-bar><div class=\"cf__status\"><p class=\"cf__count\" data-cf-count>${cfNoun(slug, all.length)}</p></div></div>`}\n      <div class=\"${cgClass(out)}\" data-grid>${cfGrid(out, all)}</div>\n      <p class=\"cpage__promise\">${HERO_LINE.map((t) => `<span>${t}</span>`).join('')}</p>\n      <nav class=\"cnext\" aria-label=\"Autres collections\">\n        ${others.map((o) => `<a class=\"cnext__a\" href=\"#/${o.slug}\"><span class=\"cnext__name\">${esc(o.nom)}</span><span class=\"cnext__n\">${cfNoun(o.slug, PRODS.filter((p) => p.collection === o.slug).length)}</span></a>`).join('')}\n      </nav>\n    </section>\n    ${footer()}`;\n    return {\n      title: cc.title || `${c.nom} \u00B7 Caplia`,\n      html,\n      scene: {},\n      nav: slug,\n      after: () => {\n        if (cc.desc) setDesc(cc.desc(r, dl));\n        cfBind();\n      }\n    };\n  }\n  /* Filtre de collection : forme (choix .pill), mati\u00E8re, largeur, prix et tri (listes) ; \u00AB reset \u00BB remet tout \u00E0 z\u00E9ro sauf le tri */\n  function applyFilter(group, value) {\n    const bar = $('[data-cf-bar]');\n    if (!bar) return;\n    if (group === 'reset') {\n      Object.assign(COLF, { forme: 'all', mat: 'all', larg: 'all', prix: 'all' });\n      $$('[data-cf]', bar).forEach((s) => { if (s.dataset.cf !== 'tri') s.value = 'all'; });\n    } else COLF[group] = value;\n    $$('[data-action=\"filter\"][data-group=\"forme\"]', bar).forEach((b) => b.setAttribute('aria-pressed', String(b.dataset.value === COLF.forme)));\n    const { all, out } = cfItems();\n    const active = ['forme', 'mat', 'larg', 'prix'].filter((k) => COLF[k] !== 'all').length;\n    $('[data-cf-count]', bar).textContent = active ? `${out.length} sur ${cfNoun(COLF.slug, all.length)}` : cfNoun(COLF.slug, all.length);\n    const rs = $('.cf__reset', bar); if (rs) rs.hidden = !active;\n    const tg = $('[data-cf-toggle]', bar);\n    if (tg) { const n = ['mat', 'larg', 'prix'].filter((k) => COLF[k] !== 'all').length; tg.textContent = n ? `Filtrer et trier (${n})` : 'Filtrer et trier'; }\n    const grid = $('[data-grid]');\n    grid.className = cgClass(out);\n    grid.innerHTML = fr(cfGrid(out, all));\n    if (ST()) ST().refresh();\n  }\n\n  /* ---------------- Fiche produit ---------------- */\n  const PDP = { p: null, color: 0, size: 0, img: -1, list: [], done: {} };\n  /* \u00AB 21 h. Personne\u2026 \u00BB : l'heure en relief */\n  const sceneHtml = (s) => { const m = String(s).match(/^([^.]*\\d+ h[^.]*)\\.\\s*(.*)$/); return m ? `<b>${esc(m[1])}.</b> ${esc(m[2])}` : esc(s); };\n  /* Sous le prix : ce que le prix comprend, et le garde-fou du prix (M4, M5) */\n  /* Montant d'\u00E9co-participation : affich\u00E9 d\u00E8s que l'adh\u00E9sion Ecomaison donne les vrais montants (site.json > ecomaison) */\n  const ecoOf = (p) => { const E = SITE.ecomaison; if (!E || E.aConfirmer) return null; const m = E.montants || {}; return p.collection === 'canapes' ? m.canapes : p.collection === 'fauteuils' ? m.fauteuils : m.deco; };\n  const priceNote = (p) => { const e = p ? ecoOf(p) : null; return e != null ? `Prix tout compris : livraison offerte, dont ${price(e)} d\u2019\u00E9co-participation.` : 'Prix tout compris : livraison offerte, \u00E9co-participation comprise.'; };\n  /* Plus petite mesure : c'est elle qui passe la porte, de profil (m\u00EAme r\u00E8gle que doorAnswer) */\n  /* Mirage : 160 cm pr\u00E9s\u00E9lectionn\u00E9, l'option par d\u00E9faut est celle qu'on garde (plan ma\u00EEtre A17) */\n  const defSize = (p) => (p.tailles && p.slug === 'miroir-onde' ? p.tailles.length - 1 : 0);\n  const minDim = (p) => { const D = p.dimensions; return Math.min(D.largeur, D.profondeur, D.hauteur); };\n  /* Outil de porte : seulement pour les canap\u00E9s et les grands fauteuils (plus de 85 cm de haut, les berceuses).\n     Un miroir, une table ou une petite pi\u00E8ce passe toujours : la question n'a pas de sens. */\n  const hasDoor = (p) => p.collection === 'canapes' || (p.collection === 'fauteuils' && p.dimensions.hauteur >= 85);\n  /* Une ligne de cotes toujours visible sous le prix (F2), avec le passage de porte (playbook \u00A77.2) */\n  /* Les mesures qui comptent selon la pi\u00E8ce : lit = couchage + t\u00EAte de lit ; miroir = hauteur \u00D7 largeur ;\n     assise = largeur \u00D7 profondeur + hauteur d'assise ; table, chevet = plateau + hauteur */\n  const isBed = (p) => /^Lit\\b/.test(p.type);\n  const isMirror = (p) => /^Miroir\\b/.test(p.type);\n  const xy = (a, b) => `${numFr(a)}${NB}\u00D7${NB}${cm(b)}`;\n  /* \u00AB 140 \u00D7 45 cm \u00BB -> [140, 45] (tailles des miroirs : hauteur \u00D7 largeur) */\n  const sizeNums = (p, i) => p.tailles.map((t) => (t.nom.match(/[\\d,.]+/g) || [])[i]).join(' ou ') + NB + 'cm';\n  function cotesParts(p) {\n    const D = p.dimensions;\n    /* convertible : la taille en lit, premi\u00E8re question de l\u2019acheteur (dimensions.lit, chauffeuse \u00AB d\u00E9pli\u00E9e \u00BB) ; 18/10\n       (audit 02 M1) : aussi pour les pi\u00E8ces sans hauteur d\u2019assise (R\u00EAverie, P\u00E9tale, Escale, Hamac), \u00AB environ \u00BB quand le\n       vendeur le dit (dimensions.litEnviron) */\n    const lit = D.lit ? [`${/^Chauffeuse/.test(p.type) ? 'd\u00E9pli\u00E9e' : `en${NB}lit`}${NB}${D.litEnviron ? `environ${NB}` : ''}${xy(D.lit[0], D.lit[1])}`] : [];\n    if (isBed(p)) return [`Couchage ${p.tailles ? dimsLabel(p) : xy(D.largeur, D.profondeur)}`, `t\u00EAte de lit de ${cm(D.hauteur)} de haut`];\n    if (isMirror(p)) return p.tailles ? [`${sizeNums(p, 0)} de haut`, `${sizeNums(p, 1)} de large`] : [`${cm(D.hauteur)} de haut`, `${cm(D.largeur)} de large`];\n    if (D.hauteurAssise) return [xy(D.largeur, D.profondeur), `assise \u00E0 ${cm(D.hauteurAssise)} du sol`, ...lit];\n    if (D.epaisseur) return [xy(D.largeur, D.profondeur), `${cm(D.epaisseur)} d\u2019\u00E9paisseur`];\n    if (D.diametre) return [`\u00D8${NB}${cm(D.diametre)}`, `${cm(D.hauteur)} de haut`];\n    if (D.petite) return [`${xy(D.largeur, D.profondeur)} et ${xy(D.petite.largeur, D.petite.profondeur)}`, `${numFr(D.hauteur)} et ${cm(D.petite.hauteur)} de haut`];\n    /* textile pos\u00E9 \u00E0 plat (plaid) : ses deux mesures, pas \u00AB 1,5 cm de haut \u00BB */\n    if (D.hauteur < 3) return [xy(D.largeur, D.profondeur)];\n    return [xy(D.largeur, D.profondeur), `${cm(D.hauteur)} de haut`, ...lit];\n  }\n  /* 18/10 (audit 02 M1, M2) : la ligne s'affiche sous le type de la fiche. Ligne \u00E9crite \u00E0 la main quand la mesure qui compte\n     n'est pas un calcul (catalogue.json > cotes : \u00C9glantine, Alb\u00E2tre, Lou) ; lit : la taille du matelas, jamais celle du\n     cadre ni une taille \u00E9puis\u00E9e (prepare les retire) ; le vrai nombre de colis (doorTxt). */\n  function cotesLine(p) {\n    if (p.cotes) return esc(p.cotes);\n    const parts = cotesParts(p);\n    if (isBed(p) && /sommier/i.test((p.carton || []).join(' '))) {\n      const sans = p.details.concat(ftOf(p).technique || []).some(([a, b]) => a === 'Matelas' && /non fourni/i.test(b));\n      return `Sommier \u00E0 lattes compris<span class=\"fp__sep\"> \u00B7 </span><span class=\"fp__door\">${esc(`pour un matelas de ${p.tailles ? dimsLabel(p) : xy(p.dimensions.largeur, p.dimensions.profondeur)}${sans ? ' (non fourni)' : ''}`)}</span>`;\n    }\n    if (!hasDoor(p)) return esc(parts.join(', '));\n    return `${esc(parts.join(', '))}<span class=\"fp__sep\"> \u00B7 </span><span class=\"fp__door\">${doorTxt(p)}</span>`;\n  }\n  /* la porte que la pi\u00E8ce passe (ou, carton aux cotes inconnues, le fait seul : \u00AB livr\u00E9 compress\u00E9 en 2 cartons \u00BB) ;\n     18/10 (audit 02 Mi1) : nombre de colis inconnu, rien d'invent\u00E9 (\u00AB livr\u00E9 compress\u00E9 \u00BB, et plus \u00AB en 1 carton \u00BB) */\n  function doorTxt(p) {\n    const n = parseInt(p.colis, 10), dm = doorMin(p), f = isFem(p) ? 'e' : '';\n    if (isFlat(p)) return `livr\u00E9${f} en ${n > 1 ? `${n} colis` : 'colis'}, \u00E0 monter`;\n    return isKit(p) ? (dm != null ? `son colis passe une porte de ${cm(Math.ceil(dm + 2))}` : `livr\u00E9${f} en kit${n > 0 ? `, en ${n} colis` : ''}`)\n      : isCompressed(p) ? (dm != null ? `son plus grand carton passe une porte de ${cm(Math.ceil(dm + 2))}` : `livr\u00E9${f} compress\u00E9${f}${n > 0 ? ` en ${n > 1 ? `${n} cartons` : '1 carton'}` : ''}`)\n        : `passe une porte de ${cm(Math.ceil(dm + 2))}`;\n  }\n  /* Pi\u00E8ces propos\u00E9es ensuite : \u00E9crites \u00E0 la main (P3). Les pi\u00E8ces secondaires ne sont jamais sugg\u00E9r\u00E9es. */\n  const SECONDARY = ['angle-cotele', 'u-cotele', 'coquillage', 'miroir-organique'];\n  const RELATED = {\n    /* grand salon o\u00F9 l'on re\u00E7oit : Valse plut\u00F4t qu'Aurore (fauteuil d'allaitement) quand la table \u00C9cume est masqu\u00E9e */\n    incurve: ['miroir-onde', 'galet', 'table-nuage', 'berceuse'],\n    'noix-de-cajou': ['miroir-onde', 'galet', 'table-nuage', 'berceuse'],\n    'petit-incurve': ['galet', 'berceuse', 'miroir-onde'],\n    causeuse: ['galet', 'miroir-onde', 'table-nuage'],\n    capiton: ['galet', 'miroir-onde', 'table-nuage'],\n    courbe: ['galet', 'miroir-onde', 'table-nuage'],\n    meridienne: ['miroir-onde', 'table-nuage', 'galet'],\n    'petit-mouton': ['galet', 'berceuse', 'miroir-onde'],\n    veilleuse: []\n  };\n  /* Frais de retour estim\u00E9s selon le type de pi\u00E8ce (information due, ton neutre).\n     18/10 (audit 02 Mo2, audit 03 \u00AB Bancs coffre \u00BB) : la phrase nomme la pi\u00E8ce (\u00AB Retour de Cumulus \u00E0 votre charge \u00BB) ; un\n     banc coffre ou une t\u00EAte de lit n'est plus appel\u00E9 \u00AB une pi\u00E8ce de d\u00E9coration \u00BB (cat\u00E9gorie au retour offert ailleurs) */\n  function returnCost(p) {\n    const E = SITE.retours.estimation;\n    if (isBed(p) && E.lits) return E.lits;\n    return p.collection === 'canapes' ? E.canapes : p.collection === 'fauteuils' ? E.fauteuils : E.deco;\n  }\n  const retourTxt = (p) => `Retour ${deN(p.nom)} \u00E0 votre charge : environ ${price(returnCost(p))}.`;\n  /* Les \u00AB oui \u00BB successifs : chaque \u00E9tape se coche quand elle est faite */\n  function pdpSteps() {\n    const d = PDP.done;\n    const state = { color: d.color, door: d.door, date: d.door, cart: d.cart };\n    $$('[data-yes] [data-step]').forEach((li) => li.classList.toggle('is-done', !!state[li.dataset.step]));\n  }\n\n  /* Marque Apple dessin\u00E9e simplement (logo de moyen de paiement accept\u00E9) */\n  const APPLE = '<svg class=\"apple\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.9-3.5.9s-1.8-.9-3-.8C6.9 7.4 5.4 8.3 4.6 9.8c-1.7 2.9-.4 7.2 1.2 9.5.8 1.1 1.7 2.4 2.9 2.4 1.2 0 1.6-.8 3-.8s1.8.8 3 .8c1.3 0 2.1-1.2 2.8-2.3.9-1.3 1.3-2.6 1.3-2.6s-2.5-1-2.4-4.2zM14.1 5.8c.6-.8 1.1-1.9 1-3-1 0-2.1.7-2.8 1.5-.6.7-1.1 1.8-1 2.9 1 .1 2.1-.6 2.8-1.4z\"/></svg>';\n  /* Liste de naissance : copie le lien de la fiche et explique comment l'ajouter */\n  const birthBtn = (p) => `<div class=\"birth\" data-birth>\n      <button class=\"savebtn\" type=\"button\" data-action=\"birth\" data-slug=\"${p.slug}\">${I.gift}<span>Ajouter \u00E0 ma liste de naissance</span></button>\n      <div class=\"birth__help\" hidden>\n        <p><b>Lien copi\u00E9.</b> Sur votre liste de naissance en ligne, choisissez l\u2019ajout d\u2019un article d\u2019un autre site (souvent \u00AB ajouter un lien \u00BB), puis collez-le : vos proches pourront vous offrir ${esc(p.nom)}.</p>\n        <label class=\"sr-only\" for=\"birth-${p.slug}\">Lien de la fiche ${esc(p.nom)}</label>\n        <input id=\"birth-${p.slug}\" class=\"birth__url\" type=\"text\" readonly value=\"\">\n      </div>\n    </div>`;\n\n  /* ---------------- Fiche produit : aides ---------------- */\n  let SANTE = null;   /* site/data/sante.json, lu \u00E0 la premi\u00E8re fiche ouverte */\n  /* Fermet\u00E9 : seulement quand le fournisseur la d\u00E9crit (catalogue.json) */\n  const FERMETE = {\n    causeuse: ['Ferme mais moelleuse', 'Mousse haute densit\u00E9 32\u00A0kg/m\u00B3 (32D) : l\u2019assise tient, on ne s\u2019y enfonce pas.'],\n    courbe: ['Souple et stable', 'La mousse c\u00E8de un peu, les lattes \u00E0 ressorts vous tiennent.'],\n    'angle-cotele': ['Ferme et douce', 'Les ressorts ensach\u00E9s soutiennent, la mousse adoucit.'],\n    'u-cotele': ['Enveloppante', 'La mousse \u00E0 m\u00E9moire de forme \u00E9pouse le dos, puis reprend sa forme.']\n  };\n  const isSeat = (p) => p.collection !== 'decoration' && !!p.dimensions.hauteurAssise;\n  const colisTxt = (p) => (/^\\d/.test(p.colis) ? p.colis : isCompressed(p) ? 'Colis compress\u00E9s' : 'Plusieurs colis');\n  /* Place de la pi\u00E8ce dans l'image studio (4:5) : cadrage vertical pour un cadre de proportion A (largeur / hauteur) */\n  function studioPos(p, A) {\n    const s = STUDIO[p.slug];\n    if (!s || A <= s.ratio) return 50;\n    const f = s.ratio / A, cy = (s.piece[1] + s.piece[3]) / 2;\n    return Math.round(Math.max(0, Math.min(1, (cy - 0.56 * f) / (1 - f))) * 100);\n  }\n  /* Format du cadre de la galerie (06/10/2026, r\u00E8gle de l'utilisateur : pi\u00E8ce jamais coup\u00E9e, aucune bande vide) : pour la\n     couleur montr\u00E9e, le format (de 1:1 \u00E0 16:10) o\u00F9 ses vraies photos remplissent le mieux le cadre sans que la bo\u00EEte de la\n     pi\u00E8ce (cadrage-photos.json) en sorte. Co\u00FBt d'une photo = la part du cadre qu'elle laisse vide ; les gros plans\n     remplissent toujours. M\u00EAme format au t\u00E9l\u00E9phone et \u00E0 l'ordinateur. */\n  const FORMATS = [1, 1.1, 1.2, 4 / 3, 1.45, 1.6];\n  function stageFormat(p, k) {\n    const c = p.couleurs[k] || p.couleurs[0];\n    const ph = colorPhotos(p, c).filter((im) => !/^(D\u00E9tail|Une main)/.test(im.alt)).map((im) => (CADRAGE[p.slug] || {})[im.id]).filter(Boolean);\n    if (!ph.length) return 1.2;\n    let best = 1.2, bestCout = Infinity;\n    for (const A of FORMATS) {\n      let cout = 0;\n      for (const [N, x0, y0, x1, y1] of ph) {\n        const cover = Math.max(A, N);                      /* largeur de la photo (cadre A x 1) qui couvre le cadre */\n        const tient = Math.min(A / Math.max(.01, x1 - x0 + .02), N / Math.max(.01, y1 - y0 + .02));\n        const W = Math.min(cover, Math.max(Math.min(A, N), tient));\n        cout += 1 - Math.min(1, W / cover) * Math.min(1, W / cover);   /* part vide du cadre */\n      }\n      cout += Math.abs(A - 1.2) * .01;                     /* \u00E0 \u00E9galit\u00E9 : pr\u00E8s de 1,2 (la pi\u00E8ce grande \u00E0 l'\u00E9cran) */\n      if (cout < bestCout) { bestCout = cout; best = A; }\n    }\n    return best;\n  }\n  /* refonte du 07/10 : au t\u00E9l\u00E9phone, la photo en situation en t\u00EAte donne son format au cadre (aucune bande autour) */\n  /* Cadrages du 08/10 (r\u00E8gle : la pi\u00E8ce jamais coup\u00E9e).\n     fitsIn : la bo\u00EEte de la pi\u00E8ce (cadrage-photos.json) tient-elle dans un cadre de format A quand la photo le couvre ?\n     bandsIn : part du cadre que les photos d'une couleur laisseraient aux couleurs de leurs bords si elles y \u00E9taient\n     r\u00E9duites juste assez pour garder la pi\u00E8ce enti\u00E8re (photoFit) ; 0 quand toutes tiennent (gros plans except\u00E9s). */\n  const fitsIn = (b, A) => { const [N, x0, y0, x1, y1] = b, ex = Math.min(1, x1 + .01) - Math.max(0, x0 - .01), ey = Math.min(1, y1 + .01) - Math.max(0, y0 - .01); return N > A ? ex * N / A <= 1.001 : ey * A / N <= 1.001; };   /* marge de photoFit (FIT_MARGE) */\n  const bandIn = (b, A) => { const [N, x0, y0, x1, y1] = b; return fitsIn(b, A) ? 0 : 1 - Math.min(1, N > A ? (A / N) / (Math.min(1, x1 + .01) - Math.max(0, x0 - .01)) : (N / A) / (Math.min(1, y1 + .01) - Math.max(0, y0 - .01))); };\n  const bandsIn = (p, c, A) => colorPhotos(p, c).filter((im) => !closeUp(im.alt)).reduce((s, im) => {\n    const b = (CADRAGE[p.slug] || {})[im.id];\n    return s + (b ? bandIn(b, A) : 0);\n  }, 0);\n  /* la 1re photo de la galerie d'une couleur : une photo en situation enti\u00E8re, sinon la pi\u00E8ce seule (gallerySlides) */\n  const leadOf = (p, c) => {\n    const pics = colorPhotos(p, c);\n    return sceneOf(p, pics) || pics.find((im) => !closeUp(im.alt) && !isGen(im) && !coupee(p, im)) || pics.find((im) => !closeUp(im.alt) && !isGen(im)) || null;\n  };\n  /* cadre du t\u00E9l\u00E9phone (une piste, un seul format pour toutes les photos) : le format de la photo de t\u00EAte si toutes les\n     pi\u00E8ces y tiennent, sinon le format qui laisse le moins de place aux bords, pr\u00E8s de celui de la photo de t\u00EAte */\n  const FORMATS_M = [1, 1.1, 1.2, 4 / 3, 1.45, 1.6, 16 / 9, 2];\n  const mobileFrame = (p, c, im, a) => {\n    const b = im && (CADRAGE[p.slug] || {})[im.id];\n    const n = b && isScene(im.alt) && b[0] > 0.75 && b[0] < 2.2 ? b[0] : 0, pref = n || Number(a);\n    let best = pref, score = Infinity;\n    for (const A of [pref, ...FORMATS_M]) { const sc = bandsIn(p, c, A) + 0.15 * Math.abs(A - pref); if (sc < score - 1e-9) { score = sc; best = A; } }\n    return String(Math.round(best * 1000) / 1000);\n  };\n  /* ordinateur : la 1re case de la mosa\u00EFque prend le format de sa photo (photo en situation, ou pi\u00E8ce qui ne tiendrait pas\n     enti\u00E8re en 4:3) ; sinon 4:3 */\n  const leadAspect = (p, im) => {\n    const b = im && (CADRAGE[p.slug] || {})[im.id];\n    return b && ((isScene(im.alt) && b[0] > 0.75 && b[0] < 2.2) || !fitsIn(b, 4 / 3)) ? b[0].toFixed(3) : '';\n  };\n  const STAGE_A = (p, k) => {\n    const kk = k == null ? PDP.initColor : k, a = stageFormat(p, kk);\n    const c = p.couleurs[kk] || p.couleurs[0], lead = leadOf(p, c);\n    return { m: mobileFrame(p, c, lead, a), d: a, lead: leadAspect(p, lead) };\n  };\n  /* le cadre suit la couleur choisie */\n  function stageSet(p, k) {\n    const st = $('[data-fp-stage]'), th = $('.fp-thumbs');\n    if (!st) return;\n    const A = STAGE_A(p, k);\n    st.style.setProperty('--am', A.m); st.style.setProperty('--ad', A.d); if (A.lead) st.style.setProperty('--lead', A.lead); else st.style.removeProperty('--lead');\n    if (th) th.style.setProperty('--ad', A.d);   /* vignettes au format du cadre : la pi\u00E8ce y reste enti\u00E8re */\n  }\n\n  /* Cadeaux de la fiche, en vraies photos, juste sous le bouton : ceux que la pi\u00E8ce d\u00E9bloque seule (valeur barr\u00E9e = prix de\n     l'article vendu seul) et la somme \u00E9conomis\u00E9e ; sous le premier palier, le cadeau suivant en plus petit. Jamais sur un accessoire, ni sur\n     Aurore (repose-pieds compris), ni dans Caplia Sleep quand le premier cadeau n'y est pas atteignable. */\n  function giftsBlock(p) {\n    if (notYet(p) || isAcc(p) || p.slug === 'veilleuse' || !GIFTS || !GIFTS.paliers) return '';\n    if (isSleep(p) && !giftReachable(true)) return '';\n    const P = SITE.paliers, v = unitPriceOf(p);\n    const got = P.filter((pl) => v >= pl.seuil), next = P.find((pl) => v < pl.seuil);\n    const the = (pl) => { const s = GIFT_SHORT[P.indexOf(pl)]; return `${plural(s) ? 'Les' : 'Le'} ${s}`; };\n    const offert = (pl) => (plural(GIFT_SHORT[P.indexOf(pl)]) ? 'vous sont offerts' : 'vous est offert');\n    const voir = '<a class=\"fp-inline\" href=\"#/cadeaux\">Voir les cadeaux</a>';\n    /* \u00E0 moins de 300 \u20AC du premier palier : la pi\u00E8ce assortie la moins ch\u00E8re qui le d\u00E9bloque (jamais une pi\u00E8ce secondaire) */\n    const gap = P[0].seuil - v;\n    const add = !got.length && gap <= 300 ? PRODS.filter((x) => x.slug !== p.slug && sameWorld(x, p) && !SECONDARY.includes(x.slug) && onSale(x) && !isAcc(x) && unitPriceOf(x) >= gap).sort((a, b) => unitPriceOf(a) - unitPriceOf(b))[0] : null;\n    /* 17/10 (table d'experts) : le palier suivant n'est dit que sous le premier palier (jamais \u00AB \u2026 s'y ajoute d\u00E8s \u2026 \u00BB) */\n    const nextTxt = !next || got.length ? ''\n      : add ? `Avec ${esc(add.nom)} (${price(unitPriceOf(add))}), ${lc1(the(next))} ${strike(giftValue(next))} ${offert(next)}.`\n      : `${the(next)} ${strike(giftValue(next))} ${offert(next)} d\u00E8s ${price(next.seuil)} de meubles.`;\n    const saved = giftsSaved(got);\n    if (!got.length) return next ? `<div class=\"fp-gift fp-gift--next\"><p class=\"fp-gift__next\">${giftPic(next, 'fp-gift__mini')}<span>${nextTxt} ${voir}</span></p></div>` : '';\n    return `<div class=\"fp-gift\">\n      <div class=\"fp-gift__pics\">${got.map((pl) => giftPic(pl, 'fp-gift__pic')).join('')}</div>\n      <div class=\"fp-gift__txt\">\n        <p class=\"fp-gift__t\"><b>Offerts avec ${esc(p.nom)}</b> : ${andList(got.map((pl) => `${esc(pl.cadeau)} ${strike(giftValue(pl))}`))}.</p>\n        ${saved ? `<p class=\"fp-gift__save\">Vous \u00E9conomisez <b class=\"num\">${price(saved)}</b>. ${voir}</p>` : `<p class=\"fp-gift__save\">${voir}</p>`}\n      </div>\n    </div>`;\n  }\n  /* Le salon assorti de la pi\u00E8ce (canap\u00E9s) : la pi\u00E8ce dans la couleur choisie + son fauteuil, le total, ce qui est offert,\n     et l'ajout des deux d'un clic */\n  function salonBlock(p, color) {\n    if (p.collection !== 'canapes') return '';\n    const e = ensFor(p.slug);\n    if (!e) return '';\n    const i = ENS.indexOf(e), total = ensTotal(e), g = giftsFor(total), saved = giftsSaved(g);\n    const P = SITE.paliers;\n    const many = g.length > 1 || (g.length && plural(GIFT_SHORT[P.indexOf(g[0])]));\n    const thumb = (slug, c, first) => `<a class=\"fp-ens__pic\" href=\"#/p/${slug}\" aria-label=\"${esc(BY[slug].nom)}\"${first ? ' data-ens-first' : ''}>${pieceFit(BY[slug], c, 72)}</a>`;\n    return `<div class=\"fp-ens\">\n      <div class=\"fp-ens__pics\">${e.items.map(([s, c], k) => thumb(s, k ? c : color, !k)).join('<span class=\"fp-ens__plus\" aria-hidden=\"true\">+</span>')}</div>\n      <div class=\"fp-ens__txt\">\n        <p class=\"fp-ens__t\"><b>${esc(e.nom)}</b> : ${esc(andList(e.items.map(([s]) => BY[s].nom)))}, <span class=\"num\">${price(total)}</span></p>\n        ${g.length ? `<p class=\"fp-ens__g\">${esc(cap1(andList(g.map((pl) => GIFT_SHORT[P.indexOf(pl)]))))} offert${many ? 's' : ''}${saved ? ` ${strike(saved)}` : ''}</p>` : ''}\n      </div>\n      <button class=\"pill fp-ens__add\" type=\"button\" data-action=\"ens-add\" data-i=\"${i}\" data-pdp=\"1\"><span class=\"cta__label\">Ajouter les deux</span></button>\n    </div>`;\n  }\n\n  /* Cadeaux d\u00E9bloqu\u00E9s par la pi\u00E8ce seule (17/10, table d'experts : sans le palier suivant) ; le lien m\u00E8ne aux cadeaux en\n     photos (#/cadeaux) */\n  function giftsTxt(p) {\n    const P = SITE.paliers, v = unitPriceOf(p);\n    const got = P.filter((pl) => v >= pl.seuil);\n    const voir = GIFTS && GIFTS.paliers ? ` <a class=\"fp-inline\" href=\"#/cadeaux\">Voir les cadeaux</a>` : '';\n    if (got.length) return `<b>Offerts avec ${esc(p.nom)}</b> : ${esc(andList(got.map((pl) => pl.cadeau)))}.${voir}`;\n    if (p.slug === 'veilleuse') return '<b>Repose-pieds assorti compris</b>, dans le m\u00EAme colis que le fauteuil.';\n    /* \u00C0 moins de 300 \u20AC du premier palier : la pi\u00E8ce assortie la moins ch\u00E8re qui le d\u00E9bloque (jamais une pi\u00E8ce secondaire) */\n    const gap = P[0].seuil - v;\n    const add = gap <= 300 ? PRODS.filter((x) => x.slug !== p.slug && sameWorld(x, p) && !SECONDARY.includes(x.slug) && !notYet(x) && unitPriceOf(x) >= gap).sort((a, b) => unitPriceOf(a) - unitPriceOf(b))[0] : null;\n    if (add) return `<b>Ajoutez ${esc(add.nom)} (${price(unitPriceOf(add))})</b> : ${esc(P[0].cadeau)} vous sont offerts.${voir}`;\n    return `<b>Offerts d\u00E8s ${price(P[0].seuil)} d\u2019achat</b> : ${esc(P[0].cadeau)}. Puis le ${GIFT_SHORT[1]} d\u00E8s ${price(P[1].seuil)}, le ${GIFT_SHORT[2]} d\u00E8s ${price(P[2].seuil)}.${voir}`;\n  }\n\n  /* \u00AB Avec un chat \u00BB, \u00AB Avec des enfants \u00BB : deux questions de la FAQ, dites en positif\n     (une pi\u00E8ce dont le catalogue pose d\u00E9j\u00E0 la question ne la re\u00E7oit pas deux fois) */\n  function petsKids(p) {\n    const m = p.matiere.toLowerCase();\n    const asked = (re) => p.faq.some(([q]) => re.test(q));\n    if (p.slug === 'table-nuage') return [['Et avec des enfants ?', 'Un plateau tout en courbes, sans angle vif. Le blanc laqu\u00E9 se nettoie d\u2019un coup d\u2019\u00E9ponge.']];\n    if (p.collection === 'decoration' || p.collection === 'sleep') return [];\n    if (p.slug === 'veilleuse') return [['Et avec b\u00E9b\u00E9 ?', matOf(p) ? 'Une goutte de lait se tamponne tout de suite, avec les gestes d\u2019entretien plus haut : le tissu reste net nuit apr\u00E8s nuit.' : 'Une goutte de lait se tamponne tout de suite au chiffon humide, avec un peu de savon de Marseille, sans frotter. Le tissu reste net nuit apr\u00E8s nuit.']];\n    let chat;\n    /* aucune promesse sur les griffes (dossiers produit) : la place du chat, le geste si un fil se tire, la brosse */\n    if (/teddy|moumoute/.test(m)) chat = 'Un plaid sur le dossier devient vite sa place pr\u00E9f\u00E9r\u00E9e. La moumoute a un poil court et boucl\u00E9 : un coup de brosse douce enl\u00E8ve les poils et lui garde son gonflant.';\n    else if (/boucl|mouton|sherpa/.test(m)) chat = 'Un plaid sur le dossier devient vite sa place pr\u00E9f\u00E9r\u00E9e ; une boucle tir\u00E9e se recoupe aux ciseaux, sans tirer. Les poils partent d\u2019un coup de brosse douce.';\n    else chat = 'Un plaid sur le dossier devient vite sa place pr\u00E9f\u00E9r\u00E9e ; un fil tir\u00E9 se recoupe aux ciseaux, sans tirer. Les poils partent d\u2019un coup de brosse douce.';\n    /* 18/10 (audit 02 M3) : le conseil seul, sans parler du plaid offert (\u00AB d\u00E8s 1 300 \u20AC d'achat \u00BB sous une pi\u00E8ce \u00E0 449 \u20AC) */\n    const plaid = 'Un plaid sur l\u2019assise la prot\u00E8ge des petites mains.';\n    const care = !!matOf(p);\n    if (care) chat = 'Un plaid sur le dossier devient vite sa place pr\u00E9f\u00E9r\u00E9e. Un fil tir\u00E9, des poils : les gestes d\u2019entretien, plus haut, suffisent.';\n    const kids = care ? plaid : `Une tache se tamponne au chiffon humide, avec un peu de savon de Marseille, sans frotter. ${plaid}`;\n    return [asked(/chat/i) ? null : ['Et avec un chat ?', chat], asked(/enfant/i) ? null : ['Et avec des enfants ?', kids]].filter(Boolean);\n  }\n\n  /* ---------------- Le confort, mesur\u00E9 (avec ce que dit la science) ----------------\n     Une seule section : les mesures, chacune sur une r\u00E8gle gradu\u00E9e, la phrase qui la traduit,\n     puis la ligne de science qui l'explique. Les autres faits de sante.json suivent, sans jamais\n     redire une phrase d\u00E9j\u00E0 \u00E9crite sur la fiche (points forts compris). */\n  const norm = (t) => String(t || '').toLowerCase().replace(/[\u2019']/g, ' ').replace(/[^a-z0-9\u00E0\u00E2\u00E7\u00E9\u00E8\u00EA\u00EB\u00EE\u00EF\u00F4\u00FB\u00F9\u00FC\u00FF\u0153]+/g, ' ').trim();\n  const lead1 = (t) => (norm(t).match(/^\\d+(?: \\d+)? cm/) || [''])[0];\n  /* faits de mesure : \u00AB Assise \u00E0 40 cm du sol \u00BB, \u00AB 52 cm de profondeur d'assise \u00BB */\n  const isHsFact = (f) => /du sol/i.test(f.fait);\n  const isPrFact = (f) => /profondeur/i.test(f.fait);\n  /* points forts montr\u00E9s dans \u00AB de pr\u00E8s \u00BB : sans ceux qui redisent une mesure d\u00E9j\u00E0 montr\u00E9e plus haut */\n  /* Un m\u00EAme sujet n'est trait\u00E9 qu'une fois sur la fiche :\n     - le tissu appartient \u00E0 \u00AB de pr\u00E8s \u00BB (le toucher) : ses faits de science n'y sont pas r\u00E9p\u00E9t\u00E9s ;\n     - un fait de science qui reprend la mesure d'un point fort (\u00AB 277 cm\u2026 \u00BB) laisse la place au point fort ;\n     - un point fort qui reprend un fait de science (\u00AB Dossier ondul\u00E9 \u00BB) ou la phrase d'accroche s'efface. */\n  const FABRIC = /velours|chenille|boucl|teddy|\\blin\\b|sherpa|mouton|tissu/i;\n  const STOP = new Set(['assise', 'assises', 'votre', 'vous', 'avec', 'dans', 'toute', 'tout', 'pieces', 'piece']);\n  const keys = (t) => new Set(norm(t).split(' ').filter((w) => w.length >= 5 && !STOP.has(w)).map((w) => w.replace(/(es|s|e)$/, '')));\n  const overlap = (a, b) => { const B = keys(b); return [...keys(a)].some((k) => B.has(k)); };\n  function sciFacts(p, S) {\n    const x = S && S.pieces && S.pieces[p.slug];\n    if (!x || x.blocScience === false) return { x: null, faits: [], rest: [] };\n    const seat = isSeat(p);\n    const fortsLead = new Set((p.forts || []).map((f) => lead1(f.fait)).filter(Boolean));\n    const fortsTxt = new Set((p.forts || []).map((f) => norm(f.consequence)));\n    const rest = x.faits.filter((f) => !(seat && (isHsFact(f) || isPrFact(f))) && !(p.toucher && FABRIC.test(f.fait))\n      && !fortsTxt.has(norm(f.pourVous)) && !(lead1(f.fait) && fortsLead.has(lead1(f.fait))));\n    return { x, faits: x.faits, rest };\n  }\n  function storyForts(p, S) {\n    const D = p.dimensions, { x, rest } = sciFacts(p, S);\n    const acc = x && x.accroche ? norm(x.accroche) : '';\n    return (p.forts || []).filter((f) => !(isSeat(p) && ((D.hauteurAssise && /du sol/i.test(f.fait)) || (D.profondeurAssise && /profondeur/i.test(f.fait))))\n      && !rest.some((r) => overlap(r.fait, f.fait))\n      && !(acc && lead1(f.fait) && acc.includes(lead1(f.fait))));\n  }\n  const fortsHtml = (forts) => (forts.length ? `<ul class=\"fp-forts\" data-forts>${forts.map((f) => `<li><h3>${esc(f.fait)}</h3><p>${esc(f.consequence)}</p></li>`).join('')}</ul>` : '<ul class=\"fp-forts\" data-forts hidden></ul>');\n  function ruler({ lo, hi, v, me, refs = [], zones = [], label }) {\n    const pos = (x) => ((Math.max(lo, Math.min(hi, x)) - lo) / (hi - lo)) * 100;\n    const side = (x) => (pos(x) < 14 ? ' is-l' : pos(x) > 86 ? ' is-r' : '');\n    return `<div class=\"fp-ruler\" role=\"img\" aria-label=\"${esc(label)}\">\n      <span class=\"fp-ruler__line\"></span>\n      ${zones.slice(1).map((z) => `<span class=\"fp-ruler__tick\" style=\"left:${pos(z[0]).toFixed(1)}%\"></span>`).join('')}\n      ${zones.map((z) => `<span class=\"fp-ruler__zone\" style=\"left:${pos(z[0]).toFixed(1)}%;width:${(pos(z[1]) - pos(z[0])).toFixed(1)}%\">${esc(z[2])}</span>`).join('')}\n      ${refs.map(([x, t]) => `<span class=\"fp-ruler__mark fp-ruler__mark--ref${side(x)}\" style=\"left:${pos(x).toFixed(1)}%\"><i></i><em>${t}</em></span>`).join('')}\n      <span class=\"fp-ruler__mark fp-ruler__mark--me${side(v)}\" style=\"left:${pos(v).toFixed(1)}%\"><i></i><em>${esc(me)}</em></span>\n    </div>`;\n  }\n  const confItem = (k, v, unit, rl, txt, sci) => `<div class=\"fp-conf__item\">\n      <h3 class=\"fp-conf__k\">${k}</h3>\n      <p class=\"fp-conf__v num\">${v}<small>${unit}</small></p>\n      ${rl}\n      <p class=\"fp-conf__p\">${esc(txt)}</p>\n      ${sci ? `<p class=\"fp-conf__sci\">${esc(sci)}</p>` : '<span></span>'}\n    </div>`;\n  function confortHtml(p, S) {\n    const { x, faits, rest: sciRest } = sciFacts(p, S);\n    const sciOk = !!x;\n    const D = p.dimensions, hs = D.hauteurAssise, pr = D.profondeurAssise;\n    const items = [];\n    const used = new Set((p.forts || []).map((f) => norm(f.consequence)));\n    const shown = [];\n    if (isSeat(p)) {\n      const hsF = faits.find(isHsFact), prF = faits.find(isPrFact);\n      const hTxt = hs >= 45 ? '\u00C0 hauteur de chaise : on s\u2019assoit et on se rel\u00E8ve sans effort.'\n        : hs >= 41.5 ? 'Plus haut que la moyenne des canap\u00E9s : on se rel\u00E8ve sans effort.'\n          : hs > 38 ? 'Un peu plus haut que la moyenne des canap\u00E9s de salon.'\n            : 'Plus bas que la moyenne des canap\u00E9s : une assise de d\u00E9tente, o\u00F9 l\u2019on se pose sans se tenir droit.';\n      const t1 = hsF ? hsF.pourVous : hTxt;\n      items.push(confItem('Hauteur d\u2019assise', numFr(hs), 'cm', ruler({ lo: 30, hi: 52, v: hs, me: p.nom, refs: [[38, 'Salon, en moyenne<br>38 cm'], [45, 'Chaise<br>45 cm']], label: `${p.nom} : assise \u00E0 ${numFr(hs)} cm. Si\u00E8ges de salon, en moyenne : 38 cm. Chaise : environ 45 cm.` }), t1, hsF && hsF.science));\n      used.add(norm(t1)); if (hsF) shown.push(hsF);\n      if (pr) {\n        const pTxt = pr <= 56 ? 'Assis au fond, le dos touche le dossier et les pieds restent \u00E0 plat.'\n          : pr <= 68 ? 'De quoi replier une jambe sous soi. Un coussin dans le dos, et l\u2019on s\u2019adosse droit.'\n            : 'De quoi s\u2019asseoir en tailleur ou s\u2019allonger. Un coussin dans le dos, et l\u2019on s\u2019adosse droit.';\n        const t2 = prF ? prF.pourVous : pTxt;\n        items.push(confItem('Profondeur d\u2019assise', numFr(pr), 'cm', ruler({ lo: 40, hi: 88, v: pr, me: p.nom, zones: [[40, 56, 'Assis droit'], [56, 68, 'Jambe pli\u00E9e'], [68, 88, 'En tailleur']], label: `${p.nom} : ${numFr(pr)} cm de profondeur d\u2019assise. Jusqu\u2019\u00E0 56 cm, on s\u2019assoit droit ; de 56 \u00E0 68 cm, on replie une jambe ; au-del\u00E0, on s\u2019assoit en tailleur.` }), t2, prF && prF.science));\n        used.add(norm(t2)); if (prF) shown.push(prF);\n      }\n      const fm = FERMETE[p.slug];\n      if (fm && p.fermete) {\n        items.push(confItem('Fermet\u00E9', p.fermete, 'sur 5', ruler({ lo: 1, hi: 5, v: p.fermete, me: p.nom, zones: [[1, 2.33, 'Moelleux'], [2.33, 3.67, '\u00C9quilibr\u00E9'], [3.67, 5, 'Ferme']], label: `Fermet\u00E9 de ${p.nom} : ${p.fermete} sur 5.` }), `${fm[0]}. ${fm[1]}`, ''));\n      } else if (D.hauteur - hs >= 12) {\n        const up = Math.round(D.hauteur - hs);\n        const txt = p.slug === 'veilleuse' ? `Dossier \u00E0 oreilles, ${cm(up)} au-dessus de l\u2019assise : il enveloppe le dos pendant la t\u00E9t\u00E9e.`\n          : p.slug === 'berceuse' ? `Dossier capitonn\u00E9 de ${cm(up)} au-dessus de l\u2019assise, coussin d\u2019appui-t\u00EAte compris.`\n          : up >= 55 ? `Le dossier monte \u00E0 ${cm(up)} au-dessus de l\u2019assise : le dos est soutenu jusqu\u2019aux \u00E9paules.`\n            : D.hauteur <= 66 ? 'Un dossier bas : il laisse la pi\u00E8ce ouverte et la vue d\u00E9gag\u00E9e.'\n              : `Le dossier monte \u00E0 ${cm(up)} au-dessus de l\u2019assise : il tient le bas${up >= 35 ? ' et le milieu' : ''} du dos.`;\n        items.push(confItem('Hauteur totale', numFr(D.hauteur), 'cm', ruler({ lo: 55, hi: 95, v: D.hauteur, me: p.nom, zones: [[55, 66, 'Dossier bas'], [66, 85, 'Mi-dos'], [85, 95, 'Dossier haut']], label: `${p.nom} : ${numFr(D.hauteur)} cm de haut, dossier compris.` }), txt, ''));\n        used.add(norm(txt));\n      }\n    }\n    /* les autres faits : seulement ceux qui n'ont pas d\u00E9j\u00E0 \u00E9t\u00E9 dits (m\u00EAme phrase, ou m\u00EAme mesure qu'un point fort) */\n    const rest = sciRest.filter((f) => !shown.includes(f) && !used.has(norm(f.pourVous)));\n    rest.forEach((f) => shown.push(f));\n    if (!items.length && !rest.length) return '<section class=\"wrap fp-sec fp-conf\" data-fp-conf hidden></section>';\n    const ids = S ? [...new Set(shown.flatMap((f) => f.sources || []))].filter((id) => S.sources[id]) : [];\n    const title = items.length ? 'Le confort, mesur\u00E9' : 'Ce que dit la science';\n    /* le nombre de mesures annonc\u00E9 est celui des mesures montr\u00E9es (un banc n'en a qu'une : sa hauteur d'assise) */\n    const lead = sciOk && x.accroche ? x.accroche\n      : items.length > 1 ? `${['', '', 'Deux', 'Trois', 'Quatre'][items.length] || items.length} mesures font la sensation d\u2019une assise. Les voici, \u00E0 c\u00F4t\u00E9 de rep\u00E8res que vous connaissez d\u00E9j\u00E0.`\n        : items.length ? 'Sa hauteur d\u2019assise fait la sensation du si\u00E8ge. La voici, \u00E0 c\u00F4t\u00E9 de rep\u00E8res que vous connaissez d\u00E9j\u00E0.' : '';\n    return `<section class=\"wrap fp-sec fp-conf\" data-fp-conf aria-labelledby=\"fp-conf-t\">\n      <div class=\"fp-sec__head\">\n        <h2 class=\"t-2 fp-h\" id=\"fp-conf-t\">${title}</h2>\n        ${lead ? `<p class=\"lead\">${esc(lead)}</p>` : ''}\n      </div>\n      ${items.length ? `<div class=\"fp-conf__grid\" style=\"--n:${items.length}\">${items.join('')}</div>` : ''}\n      ${rest.length ? `<ul class=\"fp-conf__more\">${rest.map((f) => `<li><h3>${esc(f.fait)}</h3><p>${esc(f.pourVous)}</p><p class=\"fp-conf__sci\">${esc(f.science)}</p></li>`).join('')}</ul>` : ''}\n      ${ids.length ? `<div class=\"fp-conf__src\">${acc('Les \u00E9tudes cit\u00E9es', `<ul class=\"fp-src\">${ids.map((id) => { const s = S.sources[id]; return `<li>${s.lien ? `<a href=\"${esc(s.lien)}\" target=\"_blank\" rel=\"noopener\">${esc(s.court)}</a>` : esc(s.court)}${s.resultat ? `<span>${esc(s.resultat)}</span>` : ''}</li>`; }).join('')}</ul>`)}</div>` : ''}\n    </section>`;\n  }\n\n  /* ---------------- La mati\u00E8re (site/data/matieres.json) ----------------\n     Sur chaque fiche de salon en tissu : un gros plan r\u00E9el du tissu, dans la couleur choisie (photo de d\u00E9tail de sa galerie,\n     ou recadrage d'une vraie photo), le toucher en mots simples et l'entretien en trois gestes. Rien d'invent\u00E9 : les phrases\n     reprennent les fiches et les dossiers produit. Sans gros plan pour la couleur, le bloc reste en texte seul. */\n  const asset = (src, w) => ASSET(`/site/assets/${src}-${w}.webp`);\n  const deN = (n) => (/^[aeiouy\u00E0\u00E2\u00E9\u00E8\u00EA\u00EE\u00F4\u0153h]/i.test(n) ? 'd\u2019' : 'de ') + n;\n  function matOf(p) {\n    const x = MAT && MAT.pieces && MAT.pieces[p.slug];\n    const m = x && MAT.matieres && MAT.matieres[x.matiere];\n    return m && !isSleep(p) ? { key: x.matiere, m, x } : null;\n  }\n  function matPic(p, k) {\n    const o = matOf(p);\n    if (!o) return null;\n    const c = p.couleurs[k] || p.couleurs[0];\n    const g = o.x.gros || {};\n    const v = g[c.nom] || (c.cle && g[c.cle]);\n    if (!v) return null;\n    const alt = `${cap1(o.x.court || o.m.court)} ${deN(p.nom)} en ${c.nom}, de pr\u00E8s`;\n    return v.includes('/') ? { src: asset(v, 640), srcset: `${asset(v, 640)} 640w`, alt }\n      : { src: photo(p, v, 1280), srcset: `${photo(p, v, 640)} 640w, ${photo(p, v, 1280)} 1280w`, alt };\n  }\n  const careHtml = (m) => `<ol class=\"mat-care\">${m.entretien.map(([t, d]) => `<li><h4 class=\"mat-care__t\">${esc(t)}</h4><p>${esc(d)}</p></li>`).join('')}</ol>`;\n  function matiereHtml(p, k) {\n    const o = matOf(p);\n    if (!o) return '';\n    const v = matPic(p, k);\n    return `<section class=\"wrap fp-sec fp-mat${v ? '' : ' fp-mat--txt'}\" data-mat aria-labelledby=\"fp-mat-t\">\n      <figure class=\"fp-mat__img\"${v ? '' : ' hidden'}><img ${v ? `src=\"${v.src}\" srcset=\"${v.srcset}\" alt=\"${esc(v.alt)}\"` : 'alt=\"\"'} sizes=\"(max-width: 980px) calc(100vw - 32px), 40vw\" data-mat-img loading=\"lazy\" decoding=\"async\"></figure>\n      <div class=\"fp-mat__txt\">\n        <h2 class=\"t-2 fp-h\" id=\"fp-mat-t\">${esc(cap1(o.x.court || o.m.court))} ${esc(deN(p.nom))}</h2>\n        <p class=\"fp-mat__touch\">${esc(o.m.toucher)}</p>\n        <h3 class=\"mat-h3\">L\u2019entretien, en trois gestes</h3>\n        ${careHtml(o.m)}\n        ${o.x.plus ? `<p class=\"fp-mat__plus\">${esc(o.x.plus)}</p>` : ''}\n        <p class=\"fp-mat__more\"><a class=\"link\" href=\"#/matieres?m=${o.key}\">Nos mati\u00E8res, de pr\u00E8s</a></p>\n      </div>\n    </section>`;\n  }\n\n  /* ---------------- Comment il arrive chez vous (site/data/livraison.json) ----------------\n     Pi\u00E8ces compress\u00E9es : les colis, l'ouverture, le temps exact de reprise de forme (recopi\u00E9 de la fiche, contr\u00F4l\u00E9 par\n     maquettes/outils/verifier-pages-valeur.js), la mise en place. Les photos d'\u00E9tapes ne vont que sur la fiche de la pi\u00E8ce\n     qu'elles montrent (Opaline, Nacre) ; les autres fiches renvoient \u00E0 la page #/arrivee. */\n  const arrOf = (p) => (ARR && ARR.pieces && ARR.pieces[p.slug]) || null;\n  const stepOf = (id) => (ARR && ARR.etapes ? ARR.etapes.find((e) => e.id === id) : null);\n  const colisN = (p) => Number((String(p.colis || '').match(/^\\d+/) || [0])[0]);\n  const isFem = (p) => /^(m\u00E9ridienne|chauffeuse)/i.test(p.type);\n  const stepPic = (e, sizes) => `<img src=\"${asset(e.photo.src, 640)}\" srcset=\"${asset(e.photo.src, 640)} 640w${e.photo.w > 640 ? `, ${asset(e.photo.src, 1280)} ${Math.min(1280, e.photo.w)}w` : ''}\" sizes=\"${sizes}\" alt=\"${esc(e.photo.alt)}\" width=\"${e.photo.w}\" height=\"${e.photo.h}\" loading=\"lazy\" decoding=\"async\">`;\n  function arrSteps(p, a) {\n    const n = colisN(p), f = isFem(p);\n    const dans = p.carton ? `Dans ${n > 1 ? 'les cartons' : 'le carton'} : ${esc(lc1(p.carton.map((t, i) => (i ? t.toLowerCase() : t)).join(', ')))}. ` : '';\n    return [\n      [n ? `${n} colis` : 'Ses colis', `${dans}${a.poids ? esc(a.poids) + '. ' : ''}${n === 1 ? 'Le colis a' : 'Chaque colis a'} son num\u00E9ro de suivi.`],\n      ['L\u2019ouverture', 'Des ciseaux \u00E0 bouts ronds pour ouvrir le film, en douceur.'],\n      [a.forme, a.detail ? esc(a.detail) : `Le temps qu\u2019${f ? 'elle' : 'il'} reprenne sa forme, une fois le carton ouvert.`],\n      ['En place', esc(a.geste)]\n    ];\n  }\n  function arriveeHtml(p) {\n    const a = arrOf(p);\n    if (!a || !a.compresse) return '';\n    const pics = (a.photos || []).map(stepOf).filter((e) => e && e.photo);\n    return `<div class=\"fp-arr\">\n        <h2 class=\"t-2 fp-h\" id=\"fp-arr-t\">Comment ${isFem(p) ? 'elle' : 'il'} arrive chez vous</h2>\n        <ol class=\"fp-arr__steps\">${arrSteps(p, a).map(([t, d], i) => `<li><h3 class=\"${i === 2 ? 'fp-arr__fig num' : 'fp-arr__t'}\">${esc(t)}</h3><p>${d}</p></li>`).join('')}</ol>\n        ${pics.length ? `<div class=\"fp-arr__pics\" style=\"--n:${pics.length}\">${pics.map((e) => `<figure>${stepPic(e, `(max-width: 760px) calc(100vw - 32px), ${Math.round(100 / pics.length)}vw`)}</figure>`).join('')}</div>` : ''}\n        <p class=\"fp-arr__more\"><a class=\"link\" href=\"#/arrivee\">Les \u00E9tapes en photos</a></p>\n      </div>`;\n  }\n\n\n  /* ---------------- Avis des clients Caplia (site/data/avis.json > caplia) ----------------\n     17/10 (table d'experts) : seuls les avis de nos clients s'affichent, d\u00E8s le premier, bons ou mauvais (art. L111-7-2 et\n     D111-17 du Code de la consommation). Le code des avis d'autres revendeurs (avis.json > produits, plus montr\u00E9s depuis le\n     12/10) est retir\u00E9 ; les fichiers de donn\u00E9es restent. Une pi\u00E8ce : { avis: [{ note (1 \u00E0 5), texte, nom (pr\u00E9nom et initiale,\n     avec l'accord du client), date (jour de l'avis, AAAA-MM-JJ), livraison (mois de la livraison, \u00AB octobre 2026 \u00BB) }],\n     reponse } ; le nombre et la moyenne affich\u00E9s sont calcul\u00E9s sur les avis montr\u00E9s. Class\u00E9s du plus r\u00E9cent au plus ancien ;\n     \u00AB Comment nous traitons les avis \u00BB (site.json > avis > traitement) \u00E0 c\u00F4t\u00E9. Jamais de photo d'acheteur, aucune donn\u00E9e\n     structur\u00E9e d'avis, rien vers Google. */\n  const AVIS_VUS = 4;\n  const avisListe = (c) => (c && Array.isArray(c.avis) ? c.avis.filter((x) => x && Number(x.note) >= 1) : []);\n  const avisOf = (p) => {\n    const c = AVIS && AVIS.caplia && AVIS.caplia[p.slug], l = avisListe(c);\n    return l.length ? Object.assign({}, c, { avis: l, nombre: l.length, moyenne: l.reduce((s, x) => s + Number(x.note), 0) / l.length }) : null;\n  };\n  /* \u00AB 2026-11-03 \u00BB \u2192 \u00AB 3 novembre 2026 \u00BB */\n  const dateAvis = (iso) => { const [y, m, d] = String(iso).split('-').map(Number); return d && MOIS[m - 1] ? `${d === 1 ? '1er' : d}${NB}${MOIS[m - 1]} ${y}` : esc(iso); };\n  const note1 = (n) => n.toFixed(1).replace('.', ',');\n  const AVIS_STAR = '<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\"><path d=\"M10 1.6l2.6 5.3 5.8.8-4.2 4.1 1 5.8-5.2-2.7-5.2 2.7 1-5.8L1.6 7.7l5.8-.8z\"/></svg>';\n  const stars = (n) => `<span class=\"stars\" style=\"--fill:${Math.round((n / 5) * 100)}%\" aria-hidden=\"true\"><span class=\"stars__bg\">${AVIS_STAR.repeat(5)}</span><span class=\"stars__fg\">${AVIS_STAR.repeat(5)}</span></span>`;\n  function avisRate(p) {\n    const a = avisOf(p);\n    return a ? `<button class=\"fp-rate\" type=\"button\" data-fp=\"avis\">${stars(a.moyenne)}<span><b class=\"num\">${note1(a.moyenne)}</b> \u00B7 ${a.nombre} avis sur ce mod\u00E8le</span></button>` : '';\n  }\n  function avisHtml(p) {\n    const a = avisOf(p);\n    if (!a) return '';\n    /* chaque avis montre sa date et le mois de la livraison (D111-17) */\n    const meta = (x) => [x.nom && esc(x.nom), x.date && `Avis du ${dateAvis(x.date)}`, x.livraison && `livraison en ${esc(x.livraison)}`].filter(Boolean).join(' \u00B7 ');\n    const li = (x, i) => `<li class=\"fp-avis__it\"${i >= AVIS_VUS ? ' hidden data-avis-more' : ''}>\n          <p class=\"fp-avis__n\">${stars(Number(x.note))}<span class=\"sr-only\">${Number(x.note)} sur 5</span></p>\n          ${x.texte ? `<blockquote class=\"fp-avis__q\"><p>${esc(x.texte)}</p></blockquote>` : ''}\n          <p class=\"fp-avis__m\">${meta(x)}</p>\n        </li>`;\n    const recents = a.avis.slice().sort((x, y) => String(y.date || '').localeCompare(String(x.date || '')));\n    const reste = a.nombre - AVIS_VUS;\n    const traitement = SITE.avis && SITE.avis.traitement;\n    return `<section class=\"wrap fp-sec fp-avis\" id=\"fp-avis\" aria-labelledby=\"fp-avis-t\">\n      <div class=\"fp-avis__head\">\n        <h2 class=\"t-2 fp-h\" id=\"fp-avis-t\">Ils l\u2019ont d\u00E9j\u00E0 chez eux</h2>\n        <p class=\"fp-avis__sum\">${stars(a.moyenne)}<span><b class=\"num\">${note1(a.moyenne)}</b> \u00B7 ${a.nombre} avis sur ce mod\u00E8le</span></p>\n        <p class=\"fp-avis__src\">Avis de nos clients, apr\u00E8s la livraison, du plus r\u00E9cent au plus ancien.</p>\n        ${traitement ? `<details class=\"fp-avis__how\"><summary>Comment nous traitons les avis</summary><p>${esc(traitement)}</p></details>` : ''}\n      </div>\n      <div class=\"fp-avis__body\">\n        <ul class=\"fp-avis__list\">${recents.map(li).join('')}</ul>\n        ${reste > 0 ? `<button class=\"pill fp-avis__more\" type=\"button\" data-fp=\"avis-more\">Voir ${reste > 1 ? `les ${reste} autres avis` : 'l\u2019autre avis'}</button>` : ''}\n        ${a.reponse ? `<p class=\"fp-avis__rep\"><b>Notre r\u00E9ponse</b>${esc(a.reponse)}</p>` : ''}\n      </div>\n    </section>`;\n  }\n\n  /* \u00AB Il passe chez vous \u00BB : colis, porte, escalier (canap\u00E9s et grands fauteuils seulement, voir hasDoor) */\n  /* Poids et cotes des colis : seulement quand le vendeur les donne (livraison.json > poids, carton_cm) ; jamais un chiffre estim\u00E9 */\n  const colisFacts = (p) => {\n    const a = arrOf(p), c = cartonCm(p);\n    if (!a || (!a.poids && !c)) return '';\n    return `<p><b>Les colis</b> : ${a.poids ? esc(lc1(a.poids)) : ''}${a.poids && c ? ' ; ' : ''}${c ? `le plus grand mesure ${dims3(c)}` : ''}.</p>`;\n  };\n  const cartonTxt = (p) => (p.carton ? `Dans le carton : ${esc(lc1(p.carton.map((t, i) => (i ? t.toLowerCase() : t)).join(', ')))}. ` : '');\n  function passeHtml(p) {\n    const arr = arriveeHtml(p);\n    if (!hasDoor(p)) return arr ? `<section class=\"wrap fp-sec fp-passe fp-passe--arr\" id=\"fp-arrivee\" aria-labelledby=\"fp-arr-t\">${arr}</section>` : '';\n    const e = easyIn(p);\n    const D = p.dimensions;\n    const H = arr ? 'h3' : 'h2';\n    return `<section class=\"wrap fp-sec fp-passe${arr ? ' fp-passe--arr' : ''}\" id=\"fp-passe\" aria-labelledby=\"${arr ? 'fp-arr-t' : 'fp-passe-t'}\">\n      ${arr}\n      <div class=\"fp-passe__txt\">\n        <${H} class=\"${arr ? 't-3' : 't-2'} fp-h\" id=\"fp-passe-t\">${doorMin(p) == null ? `Passera-t-${isFem(p) ? 'elle' : 'il'} chez vous${NB}?` : `${isFem(p) ? 'Elle' : 'Il'} passe chez vous`}</${H}>\n        ${arr ? '' : `<p class=\"fp-passe__p\">${e ? `<b>${esc(e[0])}.</b> ${esc(e[1])}` : `<b>Sa plus petite mesure : ${cm(Math.min(D.largeur, D.profondeur, D.hauteur))}.</b> De profil, ${isFem(p) ? 'elle' : 'il'} passe une porte de ${cm(Math.ceil(minDim(p) + 2))}.`} ${cartonTxt(p)}${colisN(p) === 1 ? 'Le colis a' : 'Chaque colis a'} son num\u00E9ro de suivi.</p>`}\n      </div>\n      <div class=\"fp-passe__check\">\n        <form class=\"fp-door\" data-door novalidate>\n          <div class=\"field\">\n            <label for=\"door-w\">Largeur de votre porte la plus \u00E9troite, en cm</label>\n            <div class=\"fp-door__row\">\n              <input id=\"door-w\" name=\"w\" type=\"number\" inputmode=\"numeric\" min=\"30\" max=\"300\" placeholder=\"Par exemple 73\">\n              <button class=\"btn fp-door__go\" type=\"submit\">V\u00E9rifier</button>\n            </div>\n          </div>\n          <p class=\"fp-door__msg\" data-door-msg aria-live=\"polite\" hidden></p>\n        </form>\n      </div>\n    </section>`;\n  }\n  /* Photo de \u00AB de pr\u00E8s \u00BB : une vraie photo de la couleur choisie, autre que la premi\u00E8re de la galerie\n     (jamais celle d'une autre couleur). Sans seconde photo, la section reste en texte seul. */\n  function storyPic(p, k) {\n    const c = p.couleurs[k] || p.couleurs[0];\n    /* le gros plan du tissu appartient au bloc \u00AB la mati\u00E8re \u00BB : jamais deux fois la m\u00EAme photo sur la fiche */\n    const o = matOf(p), gid = o && o.x.gros ? (o.x.gros[c.nom] || (c.cle && o.x.gros[c.cle]) || '') : '';\n    if (p.couleurs.length > 1) {\n      const im = colorPhotos(p, c).slice(1).find((x) => x.id !== gid);\n      return im ? { src: photo(p, im.id, 1280), alt: im.alt } : null;\n    }\n    const imgs = okImages(p).filter((im) => im.id !== gid), tid = TABLEAU[p.slug];\n    const touchIm = imgs.find((im) => /^(D\u00E9tail|Une main)/.test(im.alt));\n    if (touchIm) return { src: photo(p, touchIm.id, 1280), alt: touchIm.alt };\n    if (tid && tid !== 'causeuse-arches' && p.tableau) return { src: tab(tid, 'portrait-1080'), alt: p.tableau.alt };\n    const im = imgs[1] || imgs[0];\n    return im ? { src: photo(p, im.id, 1280), alt: im.alt } : null;\n  }\n\n  /* ---------------- Galerie d'une couleur ----------------\n     R\u00E8gles (audit n\u00B0 2 et supervision du 05/10) : une fiche ne montre que la couleur choisie, toujours dans cet ordre :\n     1. les vraies photos de la couleur (galeries.json, dans l'ordre donn\u00E9 : la vraie pi\u00E8ce dans le studio gris,\n        l'ambiance, les gros plans, les autres vues ; _communes \u00E0 la fin, jamais _retirees) ;\n     2. le plan cot\u00E9 dessin\u00E9 (planSVG).\n     Jamais d'image de synth\u00E8se (ni vue 3D, ni rendu studio) : s'il manque des photos, la galerie en montre moins. */\n  const GAL_SIZES = '(max-width: 980px) 100vw, min(58vw, 800px)';\n  const colorSlug = (n) => String(n).toLowerCase().replace(/\u0153/g, 'oe').replace(/\u00E6/g, 'ae').normalize('NFD').replace(/[\u0300-\u036F]/g, '').replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n  const photoPic = (p, im, eager) => `<picture>\n      <source type=\"image/avif\" srcset=\"${GAL_SRCSET(p, im.id, 'avif')}\" sizes=\"${GAL_SIZES}\">\n      <img src=\"${photo(p, im.id, 1280)}\" srcset=\"${GAL_SRCSET(p, im.id)}\" sizes=\"${GAL_SIZES}\" alt=\"${esc(im.alt)}\" ${eager ? 'loading=\"eager\" fetchpriority=\"high\"' : 'loading=\"lazy\" fetchpriority=\"low\"'} decoding=\"async\" draggable=\"false\">\n    </picture>`;\n  const thumbImg = (src, cls = '') => `<img${cls ? ` class=\"${cls}\"` : ''} src=\"${src}\" alt=\"\" loading=\"lazy\" fetchpriority=\"low\" decoding=\"async\" draggable=\"false\">`;\n  const retirees = (p) => new Set(((GALERIES[p.slug] || {})._retirees || []).map((r) => (typeof r === 'string' ? r : r.id)));\n  /* photos du catalogue encore montrables (sans les retir\u00E9es) */\n  /* sch\u00E9ma des dimensions (\u00AB Dimensions de \u2026 \u00BB) : seulement dans la galerie, jamais comme photo de la pi\u00E8ce ailleurs */\n  const isDimsAlt = (alt) => /^Dimensions d(e |\u2019)/.test(alt || '');\n  const okImages = (p) => { const out = retirees(p); return p.images.filter((im) => !out.has(im.id) && !isDimsAlt(im.alt)); };\n  function colorPhotos(p, c, withDims) {\n    const g = GALERIES[p.slug], out = retirees(p);\n    /* \u00AB cle \u00BB : l'ancien nom de la couleur, encore utilis\u00E9 par galeries.json quand le nom affich\u00E9 a chang\u00E9 */\n    const ids = g ? [...(g[c.nom] || (c.cle && g[c.cle]) || []), ...(g._communes || [])]\n      : c.image ? [c.image] : p.couleurs.length === 1 ? p.images.map((im) => im.id) : [];\n    return ids.filter((id, i, a) => !out.has(id) && a.indexOf(id) === i).map((id) => {\n      const im = p.images.find((x) => x.id === id);\n      return { id, alt: im ? im.alt : `${p.nom} en ${c.nom}`, taille: (im && im.taille) || '' };\n    }).filter((im) => withDims || !isDimsAlt(im.alt));\n  }\n  function gallerySlides(p, k) {\n    const c = p.couleurs[k] || p.couleurs[0];\n    const s = [];\n    const all = colorPhotos(p, c, true);\n    /* 18/10 (audit 01 M2) : un sch\u00E9ma dessin\u00E9 pour une seule taille (catalogue.json > images > taille : Brume en 140 \u00D7 190) dit\n       les autres tailles en vente dessous (\u00AB Existe aussi en 140 \u00D7 200 cm \u00BB), jamais une taille \u00E9puis\u00E9e */\n    const autres = (im) => (im.taille && p.tailles ? p.tailles.filter((t) => t.nom !== im.taille && !sizeOutFor(t, c.nom)).map((t) => t.nom.replace(/ cm$/, '')) : []);\n    const cap = (im) => { const a = autres(im); return a.length ? `<figcaption class=\"fp-cap\">Existe aussi en ${esc(andList(a))}${NB}cm</figcaption>` : ''; };\n    const photoSlide = (im) => ({ kind: 'photo', key: 'p' + im.id, id: im.id, html: photoPic(p, im, !s.length) + cap(im), label: im.alt, thumb: thumbImg(photo(p, im.id, 300)), zoom: photo(p, im.id, 1280), scene: isScene(im.alt) });\n    const plan = { kind: 'plan', key: 'plan', html: `<div class=\"fp-plan\">${planSVG(p)}${planSVG(p, true)}</div>`, label: `Plan cot\u00E9 de ${p.nom}`, thumb: `<span class=\"fp-thumb__plan\" aria-hidden=\"true\">${planSVG(p)}</span><span class=\"fp-thumb__lbl\" aria-hidden=\"true\">Cotes</span>` };\n    /* ordre (refonte du 07/10, direction photo, avec les r\u00E8gles strictes de marketing/CONSIGNE-GALERIES-2026-10-07-STRICT.md) :\n       la pi\u00E8ce dans une vraie pi\u00E8ce d'abord (photo du vendeur, sans personne), la vid\u00E9o du vendeur, la pi\u00E8ce seule sur\n       fond clair, les gros plans du tissu, les autres photos en situation, et EN DERNIER le sch\u00E9ma des dimensions avec\n       le rep\u00E8re d'1,75 m (photo \u00AB Dimensions de \u2026 \u00BB), ou \u00E0 d\u00E9faut le plan cot\u00E9. Une couleur sans photo en situation\n       s'ouvre sur la pi\u00E8ce seule. */\n    const dims = all.find((im) => isDimsAlt(im.alt));\n    /* 16/10 (propri\u00E9taire) : images d'ambiance gard\u00E9es comme avant, sans mention \u00AB cr\u00E9\u00E9e par IA \u00BB */\n    const pics = all.filter((im) => im !== dims);\n    const l0 = leadOf(p, c), lead = l0 && pics.find((im) => im.id === l0.id);\n    if (lead) s.push(photoSlide(lead));\n    const v = p.video;\n    if (v && v.src && (!v.couleur || v.couleur === c.nom)) {\n      s.push({ kind: 'video', key: 'video', label: v.label || `Vid\u00E9o de ${p.nom}`,\n        html: `<video class=\"fp-video\" muted loop playsinline disablepictureinpicture preload=\"none\" poster=\"${esc(v.poster || '')}\" data-src=\"${esc(v.src)}\" aria-label=\"${esc(v.label || `Vid\u00E9o de ${p.nom}`)}\"${reduce ? ' controls' : ''}></video>`,\n        thumb: `${thumbImg(v.poster || '')}<span class=\"fp-thumb__play\" aria-hidden=\"true\"></span>` });\n    }\n    restOrder(pics, lead).forEach((im) => s.push(photoSlide(im)));\n    if (dims) s.push({ ...photoSlide(dims), thumb: thumbImg(photo(p, dims.id, 300), 'fp-thumb__dims') });\n    /* 18/10 : une pi\u00E8ce sans plan dessin\u00E9 (tapis, t\u00EAtes de lit, plaid) n'a pas de case vide quand sa couleur n'a pas de\n       sch\u00E9ma (Lou Cr\u00E8me : le sch\u00E9ma 230 \u00D7 160 cm n'est pas le sien) */\n    else if (planKind(p)) s.push(plan);\n    return mosaic(p, s);\n  }\n  /* Mosa\u00EFque de l'ordinateur (refonte.css, 2 colonnes de cases 4:3) : une photo dont la pi\u00E8ce ne tient pas enti\u00E8re dans une\n     case 4:3 prend toute la largeur, \u00E0 son propre format (fp-slide--own) ; la case rest\u00E9e seule avant elle, ou en fin de\n     liste, prend toute la largeur (fp-slide--row). Vignettes du t\u00E9l\u00E9phone : chacune au format de sa photo (--own). */\n  function mosaic(p, s) {\n    let col = 0, prev = null;\n    s.forEach((x, i) => {\n      const b = x.id && x.kind === 'photo' ? (CADRAGE[p.slug] || {})[x.id] : null;\n      if (b) x.own = b[0];\n      if (i === 0 || x.kind === 'plan') return;\n      if (b && !closeUp(x.label) && !isDimsAlt(x.label) && !fitsIn(b, 4 / 3)) { if (prev) prev.lay = 'row'; x.lay = 'own'; col = 0; prev = null; return; }\n      col = 1 - col; prev = col ? x : null;\n    });\n    if (prev) prev.lay = 'row';\n    return s;\n  }\n  const ownCss = (s) => (s.own ? ` style=\"--own:${s.own.toFixed(3)}\"` : '');\n  const slideHtml = (p, s, i) => `<figure class=\"fp-slide fp-slide--${s.kind}${s.lay ? ` fp-slide--${s.lay}` : ''}\" data-i=\"${i}\"${s.id ? ` data-photo=\"${esc(s.id)}\"` : ''}${ownCss(s)} role=\"group\" aria-label=\"${esc(s.label)}\">${s.html}</figure>`;\n  const thumbHtml = (s, i, cur) => `<button class=\"fp-thumb fp-thumb--${s.kind}\" type=\"button\" role=\"tab\" aria-selected=\"${i === cur}\" data-fp=\"go\" data-i=\"${i}\"${s.id ? ` data-photo=\"${esc(s.id)}\"` : ''}${ownCss(s)} aria-label=\"${esc(s.label)}\">${s.thumb}</button>`;\n\n  /* ---------------- Cadrage des photos de la galerie ----------------\n     R\u00E8gle de l'utilisateur : la pi\u00E8ce se voit en entier, jamais coup\u00E9e. Le cadre change de proportion selon l'\u00E9cran\n     (presque carr\u00E9 sur grand \u00E9cran, plus large \u00E0 1440 \u00D7 900, 4:3 au t\u00E9l\u00E9phone) : chaque photo le remplit autant que\n     possible SANS que la bo\u00EEte de la pi\u00E8ce (cadrage-photos.json) en sorte. Une photo qui remplit d\u00E9j\u00E0 le cadre sans rien\n     couper garde son rendu (cover, centr\u00E9e) ; sinon elle est un peu moins agrandie, d\u00E9cal\u00E9e vers la pi\u00E8ce si besoin,\n     et le studio gris finit le cadre. Les gros plans (\u00AB D\u00E9tail\u2026 \u00BB, \u00AB Une main\u2026 \u00BB) remplissent toujours le cadre.\n     Photo absente de cadrage-photos.json : elle reste enti\u00E8re \u00E0 1,5 % pr\u00E8s. */\n  const FIT_MARGE = 0.01, FIT_INCONNU = 0.015;\n  const closeUp = (alt) => /^(D\u00E9tail|Une main)/.test(alt || '');\n  /* Photo \u00AB en situation \u00BB : la pi\u00E8ce dans une vraie pi\u00E8ce, d'apr\u00E8s son texte alternatif (galeries.json n'y garde aucune\n     personne). SCENE_PICK : la plus belle quand la premi\u00E8re de la liste ne l'est pas (relu photo par photo le 07/10). */\n  const isScene = (alt) => !closeUp(alt) && /\\b(dans (un|une|la|le)|pos[\u00E9e]+ contre|devant (un|une)|au pied d|sur (un|une) (canap\u00E9|lit|console)|pr\u00E8s d['\u2019]un)/i.test(alt || '');\n  const SCENE_PICK = { dune: ['60', '61'], 'chauffeuse-dossier': ['50', '60'], 'petit-mouton': ['60', '54'], 'plaid-sherpa': ['52', '50'] };\n  const isGen = (im) => !!im && /^k\\d+$/.test(im.id);   /* image d'ambiance g\u00E9n\u00E9r\u00E9e (KSCENES) */\n  /* ordre des photos apr\u00E8s la 1re (galerie de la fiche, photos des cartes) : la pi\u00E8ce seule sur fond clair, les gros plans\n     du tissu, les autres photos en situation, les images d'ambiance */\n  /* 18/10 (audit 01 Mi2) : une vue de dos passe apr\u00E8s les photos en situation (Cumulus Blanc cr\u00E8me : le dos en 2e) */\n  const deDos = (im) => /\\bvu de dos\\b/i.test(im.alt || '');\n  const restRank = (im) => (isGen(im) ? 4 : closeUp(im.alt) ? 1 : isScene(im.alt) ? 2 : deDos(im) ? 3 : 0);\n  const restOrder = (pics, lead) => pics.filter((im) => im !== lead).sort((a, b) => restRank(a) - restRank(b));\n  /* 08/10 : photos en situation o\u00F9 le VENDEUR a coup\u00E9 la pi\u00E8ce (bord de la photo d'origine sur la pi\u00E8ce, bo\u00EEte de\n     cadrage-photos.json au bord, v\u00E9rifi\u00E9 \u00E0 l'\u0153il) : jamais en 1re photo ni sur les cartes, elles restent plus loin dans la\n     galerie. Sans autre photo en situation enti\u00E8re, la couleur s'ouvre sur la pi\u00E8ce seule sur fond clair. */\n  /* 18/10 (audit 01 Mo7, Mi1) : Brise 51 (coup\u00E9 en haut et \u00E0 gauche), P\u00E9tunia 51 (pied coup\u00E9), Coussins n\u0153ud 50 (granuleuse) */\n  const SCENE_COUPEE = { 'convertible-coffre': ['60'], 'bulle-294': ['50', '51', '53', '54'], 'grand-arrondi': ['50'], 'chauffeuse-2-places': ['50'], 'tete-de-lit-murale': ['50'], 'tete-de-lit-boudins': ['50'], 'convertible-tiroir': ['50'], 'angle-convertible-effet-lin': ['50'], 'cotele-230': ['51'], 'fauteuil-pivotant-petales': ['51'], 'coussins-noeud': ['50'] };\n  const coupee = (p, im) => (SCENE_COUPEE[p.slug] || []).includes(im.id);\n  function sceneOf(p, list) {\n    const sc = list.filter((im) => isScene(im.alt) && !isGen(im) && !coupee(p, im));\n    const want = SCENE_PICK[p.slug];\n    return (want && want.map((id) => sc.find((im) => im.id === id)).find(Boolean)) || sc[0] || null;\n  }\n  /* Les photos en situation d'une pi\u00E8ce dans une couleur (la 1re = celle des cartes et des fiches), sinon [] */\n  function scenesFor(p, colorName) {\n    const c = p.couleurs.find((x) => x.nom === colorName) || p.couleurs[firstIn(p)];\n    const all = colorPhotos(p, c), lead = sceneOf(p, all);\n    return lead ? [lead, ...all.filter((im) => im !== lead && isScene(im.alt) && !isGen(im) && !coupee(p, im))] : [];\n  }\n  /* l'image d'ambiance g\u00E9n\u00E9r\u00E9e d'une pi\u00E8ce dans une couleur (survol des cartes, moment \u00AB la pi\u00E8ce \u00BB), sinon null */\n  function genFor(p, colorName) {\n    const c = p.couleurs.find((x) => x.nom === colorName) || p.couleurs[firstIn(p)];\n    return colorPhotos(p, c).find(isGen) || null;\n  }\n  /* taille et place de la photo (px) dans un cadre w \u00D7 h ; null = rendu par d\u00E9faut */\n  function photoFit(slug, id, alt, w, h, nat) {\n    const c = (CADRAGE[slug] || {})[id];\n    const N = c ? c[0] : nat;\n    if (!N || !w || !h || closeUp(alt)) return null;\n    const m = c ? FIT_MARGE : 0, b = c ? c.slice(1) : [FIT_INCONNU, FIT_INCONNU, 1 - FIT_INCONNU, 1 - FIT_INCONNU];\n    const x0 = Math.max(0, b[0] - m), y0 = Math.max(0, b[1] - m), x1 = Math.min(1, b[2] + m), y1 = Math.min(1, b[3] + m);\n    const cover = Math.max(w, h * N), contain = Math.min(w, h * N);\n    /* 07/10 (r\u00E8gles strictes) : jamais de bande autour d'une photo, elle remplit toujours le cadre (recadr\u00E9e, jamais\n       d\u00E9form\u00E9e), d\u00E9cal\u00E9e vers la pi\u00E8ce ; seul le sch\u00E9ma des dimensions reste entier (son fond est celui du studio) */\n    /* 08/10 : quand la pi\u00E8ce ne tiendrait pas enti\u00E8re dans le cadre (photo du vendeur cadr\u00E9e serr\u00E9, format tr\u00E8s\n       diff\u00E9rent du cadre commun du t\u00E9l\u00E9phone), la photo est r\u00E9duite juste assez pour la garder enti\u00E8re ; le reste du\n       cadre prend les couleurs de ses bords (bords-photos, fitOne). Jamais plus petite que la photo enti\u00E8re. */\n    let W = isDimsAlt(alt) ? contain : cover;\n    const need = c ? Math.max((x1 - x0) * W / w, (y1 - y0) * (W / N) / h) : 1;\n    if (need > 1.001) W = Math.max(contain, W / need);\n    const H = W / N;\n    /* centr\u00E9e comme avant, d\u00E9cal\u00E9e juste assez pour garder la pi\u00E8ce ; plus petite que le cadre : centr\u00E9e */\n    /* cadrages du 07/10 : si la bo\u00EEte de la pi\u00E8ce ne tient pas dans le cadre (photo sans bo\u00EEte mesur\u00E9e, bo\u00EEte presque\n       pleine), la photo se centre sur la bo\u00EEte au lieu de se caler sur son bord droit */\n    const at = (f, z, a0, a1) => (z <= f ? (f - z) / 2 : (a1 - a0) * z > f ? Math.min(0, Math.max(f - z, f / 2 - (a0 + a1) / 2 * z)) : Math.min(Math.max((f - z) / 2, f - z, -a0 * z), 0, f - a1 * z));\n    const L = at(w, W, x0, x1), T = at(h, H, y0, y1);\n    if (W >= cover - 0.05 && Math.abs(L - (w - W) / 2) < 0.05 && Math.abs(T - (h - H) / 2) < 0.05) return null;\n    return { W, H, L, T };\n  }\n  function fitOne(box, img, slug) {\n    if (!box || !img) return;\n    const w = box.clientWidth, h = box.clientHeight;\n    const nat = img.naturalWidth && img.naturalHeight ? img.naturalWidth / img.naturalHeight : 0;\n    if (!nat && !(CADRAGE[slug] || {})[box.dataset.photo]) { img.addEventListener('load', () => fitOne(box, img, slug), { once: true }); return; }\n    const f = photoFit(slug, box.dataset.photo, img.alt || box.getAttribute('aria-label'), w, h, nat);\n    box.classList.toggle('is-fit', !!f);\n    img.style.cssText = f ? `width:${(f.W / w * 100).toFixed(2)}%;height:${(f.H / h * 100).toFixed(2)}%;left:${(f.L / w * 100).toFixed(2)}%;top:${(f.T / h * 100).toFixed(2)}%` : '';\n    /* photo r\u00E9duite pour garder la pi\u00E8ce enti\u00E8re (08/10) : le cadre prend les couleurs de ses bords, mur en haut et sol en\n       bas (ou les deux c\u00F4t\u00E9s), au lieu du studio gris ; le sch\u00E9ma des dimensions garde le studio */\n    const bd = ((CADRAGE[slug] || {})[box.dataset.photo] || [])[5];\n    const bande = f && bd && !isDimsAlt(img.alt || box.getAttribute('aria-label')) && (f.W < w - 1 || f.H < h - 1);\n    if (bande) {\n      /* bord o\u00F9 la pi\u00E8ce touche la photo (cadr\u00E9e serr\u00E9 par le vendeur) : la couleur du bord oppos\u00E9, pas celle de la pi\u00E8ce */\n      const k = CADRAGE[slug][box.dataset.photo], e = bd.split(','), v = f.H < h - 1;\n      const t = k[2] <= .01 ? e[1] : e[0], b = k[4] >= .99 ? t : e[1], l = k[1] <= .01 ? e[3] : e[2], r = k[3] >= .99 ? l : e[3]; box.style.background = v ? `linear-gradient(${t} 50%, ${b} 50%)` : `linear-gradient(90deg, ${l} 50%, ${r} 50%)`; box.dataset.bande = v ? 'v' : 'h'; }\n    else { box.style.removeProperty('background'); delete box.dataset.bande; }\n  }\n  /* toutes les photos de la galerie visible (diapositives et vignettes) */\n  function fitGallery() {\n    const p = PDP.p;\n    if (!p) return;\n    /* 08/10 : et la grande photo \u00AB la pi\u00E8ce \u00BB sous la galerie (mo__full) */\n    $$('[data-fp-track] .fp-slide[data-photo], .fp-thumbs .fp-thumb[data-photo], .mo__full[data-photo]').forEach((box) => fitOne(box, $('img', box), p.slug));\n  }\n  /* Choix de taille de la fiche : une taille \u00E9puis\u00E9e dans la couleur choisie est barr\u00E9e et ne se choisit pas */\n  const sizePill = (t, k, checked, color) => { const out = sizeOutFor(t, color); return `<button class=\"pill pill--sm${out ? ' is-out' : ''}\" type=\"button\" role=\"radio\" aria-checked=\"${checked}\" data-action=\"pdp-size\" data-k=\"${k}\"${out ? ' disabled' : ''}>${esc(t.nom)}<small>${price(t.prix)}</small>${out ? '<span class=\"sr-only\">, \u00E9puis\u00E9e dans cette couleur</span>' : ''}</button>`; };\n\n  /* Identification du produit (r\u00E8glement GPSR, art. 19) : r\u00E9f\u00E9rence Caplia de la variante choisie, type et image de la pi\u00E8ce.\n     catalogue.json : securite.identifiant = CAP-<NOM> (mod\u00E8le), couleurs[].ref = CAP-<NOM>-<COULEUR>, tailles[].ref = suffixe.\n     Jamais de num\u00E9ro d'annonce ni de code-barres du fabricant ici (r\u00E8gle des jumeaux) : ils restent dans sourcing.json. */\n  const refBase = (p) => (/^CAP-/.test((p.securite && p.securite.identifiant) || '') ? p.securite.identifiant\n    : 'CAP-' + p.nom.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toUpperCase().replace(/[^A-Z0-9]+/g, '-'));\n  function refOf(p, k, sz) {\n    const c = p.couleurs[k] || p.couleurs[0], t = p.tailles && p.tailles[sz];\n    return (/^CAP-/.test(c.ref || '') ? c.ref : refBase(p)) + (t && t.ref ? '-' + t.ref : '');\n  }\n  const refVar = (p, k, sz) => [(p.couleurs[k] || p.couleurs[0]).nom, p.tailles && p.tailles[sz] ? p.tailles[sz].nom : ''].filter(Boolean).join(', ');\n  const refHtml = (p, k, sz) => {\n    const c = p.couleurs[k] || p.couleurs[0];\n    return `<div class=\"fp-ref__row\"><span class=\"fp-ref__th\" role=\"img\" aria-label=\"${esc(`${p.nom} en ${c.nom}`)}\" data-ref-th>${tightThumb(p, c.nom)}</span>\n      <p><span data-ref-id>${esc(refOf(p, k, sz))}</span><br>${esc(p.type)}<br><span data-ref-var>${esc(refVar(p, k, sz))}</span></p></div>`;\n  };\n  /* la r\u00E9f\u00E9rence suit la couleur et la taille choisies */\n  function refSync() {\n    const p = PDP.p, box = $('.fp-ref');\n    if (!p || !box) return;\n    const id = $('[data-ref-id]', box), v = $('[data-ref-var]', box), th = $('[data-ref-th]', box), c = p.couleurs[PDP.color] || p.couleurs[0];\n    if (id) id.textContent = refOf(p, PDP.color, PDP.size);\n    if (v) v.textContent = refVar(p, PDP.color, PDP.size);\n    if (th && th.dataset.c !== c.nom) { th.dataset.c = c.nom; th.innerHTML = fr(tightThumb(p, c.nom)); th.setAttribute('aria-label', `${p.nom} en ${c.nom}`); }\n  }\n\n  /* ---------------- Fiche \u00E9pur\u00E9e (06/10/2026) : petits morceaux du premier \u00E9cran et des volets ---------------- */\n  /* Paiement en 4X PayPal (contrat PayPal FR lu le 08/10/2026 : TAEG 0 %, frais de d\u00E9faut de paiement \u00AB Aucun \u00BB,\n     de 20 \u00E0 3 000 \u20AC). Seul le message officiel de PayPal est affich\u00E9 (SDK \u00AB messages \u00BB de PayPal, compte PayPal de Caplia),\n     jamais un texte fait main. Offre forc\u00E9e sur le 4X (PAY_LATER_SHORT_TERM) : sans elle, PayPal annonce aussi les 6, 12\n     ou 24 mensualit\u00E9s avec int\u00E9r\u00EAts, refus\u00E9es par Caplia.\n     Il n'appara\u00EEt que si le paiement Shopify propose vraiment le 4X : bouton PayPal \u00AB paylater \u00BB \u00E9ligible dans le SDK des\n     boutons de Shopify (au 08/10/2026 : non, PayPal passe par Shopify Payments, qui ne propose pas le 4X). Alors seulement\n     le SDK \u00AB messages \u00BB est charg\u00E9 (l'app embed PayPal Pay Later Messaging est \u00E9teinte : elle ajoutait 40 Ko et son panneau\n     de r\u00E9glage \u00E0 chaque page). R\u00E9ponse gard\u00E9e pour la session (le panier vide n'a pas le SDK des boutons) ; tant qu'elle est\n     \u00AB non \u00BB, rien ne s'affiche, rien ne se charge et rien ne bouge. */\n  const PP4X_MIN = 20, PP4X_MAX = 3000, PP4X_KEY = 'caplia-pp4x';\n  const PP4X_SDK = 'https://www.paypal.com/sdk/js?client-id=AbtXlp5R3xc83T9xW_ZXKTK8IVZ-14EMelDioU4VC285IqSuxUI4yotKxjV0sz_X6YsONYi10vSBPNKM&merchant-id=QLU3PDPLPQKSA&components=messages&currency=EUR';\n  const ppMsgOk = () => !!(window.PayPalSDK && typeof window.PayPalSDK.Messages === 'function');\n  function ppMsgLoad() {\n    if (ppMsgOk()) return Promise.resolve(true);\n    return new Promise((done) => {\n      const s = document.createElement('script');\n      s.src = PP4X_SDK; s.async = true; s.dataset.namespace = 'PayPalSDK';\n      s.onload = () => done(ppMsgOk()); s.onerror = () => done(false);\n      document.head.appendChild(s);\n    });\n  }\n  let pp4xAsk = null;\n  function pp4xEligible() {\n    if (pp4xAsk) return pp4xAsk;\n    pp4xAsk = new Promise((done) => {\n      let n = 0;\n      const tick = () => {\n        const k = Object.keys(window).find((x) => x.startsWith('paypal-https') && x.includes('componentsbuttons'));\n        const sdk = k && window[k];\n        if (sdk && typeof sdk.Buttons === 'function') {\n          let ok = false;\n          try { ok = sdk.Buttons({ fundingSource: sdk.FUNDING.PAYLATER }).isEligible(); } catch (e) { ok = false; }\n          try { sessionStorage.setItem(PP4X_KEY, ok ? '1' : '0'); } catch (e) { /* stockage indisponible */ }\n          return done(ok);\n        }\n        if (++n < 40) return setTimeout(tick, 250);\n        let mem = null;\n        try { mem = sessionStorage.getItem(PP4X_KEY); } catch (e) { /* stockage indisponible */ }\n        pp4xAsk = null;   /* SDK des boutons absent (panier vide) : la prochaine page refera la v\u00E9rification */\n        done(mem === '1');\n      };\n      tick();\n    }).then((ok) => (ok ? ppMsgLoad() : false));\n    return pp4xAsk;\n  }\n  /* place (ou met \u00E0 jour) le message officiel dans chaque [data-pp4x] pr\u00E9sent, au montant port\u00E9 par data-amount */\n  function pp4xRender(root = document) {\n    const slots = $$('[data-pp4x]', root);\n    if (!slots.length) return;\n    pp4xEligible().then((ok) => {\n      slots.forEach((el) => {\n        const amount = Number(el.dataset.amount);\n        const show = ok && document.contains(el) && amount >= PP4X_MIN && amount <= PP4X_MAX;\n        if (!show) { el.hidden = true; return; }\n        if (el.dataset.done === String(amount)) return;\n        el.dataset.done = String(amount);\n        const box = document.createElement('div');   /* bloc neuf \u00E0 chaque rendu : jamais deux messages ni l'ancien montant */\n        el.replaceChildren(box);\n        el.hidden = false;\n        window.PayPalSDK.Messages({\n          amount, currency: 'EUR', offer: 'PAY_LATER_SHORT_TERM', placement: el.dataset.place || 'product',\n          style: { layout: 'text', logo: { type: 'inline' }, text: { color: 'black', size: 12, align: el.dataset.align || 'left' } },\n        }).render(box).catch(() => { if (box.isConnected) el.hidden = true; });\n      });\n    });\n  }\n  /* d\u00E9j\u00E0 \u00AB oui \u00BB dans cette session : la place est gard\u00E9e d\u00E8s le rendu, le message arrive sans rien pousser */\n  const pp4xKnown = () => { try { return sessionStorage.getItem(PP4X_KEY) === '1'; } catch (e) { return false; } };\n  const pp4xSlot = (cls, amount, place, align) => {\n    const keep = pp4xKnown() && amount >= PP4X_MIN && amount <= PP4X_MAX;\n    return `<div class=\"${cls} pp4x\" data-pp4x data-amount=\"${amount}\" data-place=\"${place}\"${align ? ` data-align=\"${align}\"` : ''}${keep ? '' : ' hidden'}></div>`;\n  };\n  /* 18/10 (audit 02 Mi6) : \u00AB Prix final \u00BB plut\u00F4t que \u00AB Prix TTC \u00BB, que le panier semblait contredire (\u00AB TVA non applicable \u00BB) */\n  const ecoTxt = (p) => { const e = ecoOf(p); return e != null ? `Prix final, dont ${price(e)} d\u2019\u00E9co-participation` : 'Prix final, \u00E9co-participation comprise'; };\n  /* couleur en vignette photo : la vraie pi\u00E8ce dans cette couleur, nom au survol et lu \u00E0 voix haute */\n  function photoSwatch(p, c, k, checked) {\n    const out = isOut(c);\n    return `<button class=\"pswatch${out ? ' is-out' : ''}\" type=\"button\" role=\"radio\" aria-checked=\"${checked}\" aria-label=\"${esc(c.nom)}${out ? ', bient\u00F4t de retour' : ''}\" title=\"${esc(c.nom)}${out ? ' \u00B7 Bient\u00F4t de retour' : ''}\" data-action=\"pdp-color\" data-k=\"${k}\">${thumbFor(p, c.nom)}</button>`;\n  }\n  /* Cadeaux de la pi\u00E8ce seule. 18/10 (audit 02 M3 et Mo4, audit 03 MAJEUR 2) : une seule ligne avec la petite photo du\n     premier cadeau, sous le bouton d'achat : \u00AB Offerts : 2 coussins n\u0153ud en velours (valeur 69 \u20AC), ajout\u00E9s tout seuls au\n     panier. \u00BB ; valeur = prix de l'article vendu seul (jamais barr\u00E9). Sous le premier palier, rien : \u00AB Encore 1 \u20AC \u00BB co\u00FBtait\n     en vrai 199 \u00E0 259 \u20AC de meuble ; la jauge du panier, elle, reste. Pi\u00E8ce \u00E9puis\u00E9e partout (Mirage) : rien. */\n  const GIFT_ITEM = ['2 coussins n\u0153ud en velours', 'Plaid c\u00F4tel\u00E9 et sherpa', 'Second plaid, l\u2019autre couleur'];\n  function giftLine(p) {\n    if (!onSale(p) || isAcc(p) || !SITE.paliers || !SITE.paliers.length) return '';\n    if (isSleep(p) && !giftReachable(true)) return '';\n    const v = unitPriceOf(p, p.tailles ? p.tailles[PDP.size].nom : '');\n    const got = giftsFor(v);\n    if (!got.length) return '';\n    const val = giftsSaved(got);\n    return `<p class=\"fp-gift1\">${giftPic(got[0], 'fp-gift1__pic')}<span><b>Offerts :</b> ${esc(andList(got.map((pl) => pl.cadeau)))}${val ? ` <span class=\"num\">(valeur ${price(val)})</span>` : ''}, ajout\u00E9s tout seuls au panier.</span></p>`;\n  }\n  /* \u00AB Ce que vous recevez \u00BB (refonte du 07/10) : un re\u00E7u typographique sous le bouton d'achat, \u00E0 la place du tableau\n     \u00AB Caplia ou ailleurs \u00BB et de la rang\u00E9e d'ic\u00F4nes. Seulement des faits \u00E9crits ailleurs sur le site (prix, cadeaux et\n     leur prix vendus seuls, livraison offerte, date, v\u00E9rification de la porte) ; aucun concurrent, aucun droit l\u00E9gal\n     pr\u00E9sent\u00E9 comme un avantage. */\n  /* 18/10 : rien pour une pi\u00E8ce \u00E9puis\u00E9e partout (Mirage, audit 02 Mi4) ; \u00AB valeur 69 \u20AC \u00BB et \u00AB de cadeaux \u00BB (audit 02 Mo4) ;\n     les lignes propres \u00E0 la pi\u00E8ce (catalogue.json > recu : \u00AB Matelas \u2014 non fournis \u00BB pour \u00C9glantine, audit 02 M7) */\n  function recuHtml(p) {\n    if (!onSale(p)) return '';\n    const size = p.tailles ? p.tailles[PDP.size].nom : '';\n    const v = unitPriceOf(p, size), P = SITE.paliers || [];\n    const got = P.filter((pl) => v >= pl.seuil);\n    const line = (a, b, cls = '') => `<li class=\"recu__l${cls}\"><span>${a}</span><i aria-hidden=\"true\"></i><span class=\"num\">${b}</span></li>`;\n    const saved = giftsSaved(got);\n    const rows = [\n      line(`${esc(p.nom)}, ${esc(lc1(cardType(p)))}${size ? ` ${esc(size)}` : ''}`, price(v)),\n      ...(p.recu || []).map(([a, b]) => line(esc(a), esc(b))),\n      line(`Livraison ${delivery(p)}`, 'offerte'),\n      ...got.map((pl) => { const k = P.indexOf(pl), val = giftValue(pl); return line(`${esc(GIFT_ITEM[k] || giftLabel(pl))} <small>(${val ? `valeur ${price(val)}, ` : ''}colis \u00E0 part, ${giftWhen(pl)})</small>`, plural(GIFT_SHORT[k]) ? 'offerts' : 'offert'); })\n    ];\n    const tot = saved ? `<p class=\"recu__tot\"><span class=\"num\">${price(saved)}</span> de cadeaux, pour le m\u00EAme prix</p>`\n      : `<p class=\"recu__tot recu__tot--s\">Vous payez <span class=\"num\">${price(v)}</span>, livraison comprise</p>`;\n    const door = hasDoor(p) ? `<p class=\"recu__door\">Une porte \u00E9troite ? Envoyez sa largeur : nous v\u00E9rifions avant l\u2019achat, et si nous avons dit oui et qu\u2019${isFem(p) ? 'elle' : 'il'} ne passe pas, nous ${isFem(p) ? 'la' : 'le'} reprenons \u00E0 nos frais. <button class=\"fp-inline\" type=\"button\" data-action=\"open-passe\">V\u00E9rifier ma porte</button></p>` : '';\n    return `<section class=\"recu\" aria-labelledby=\"recu-t\"><h2 class=\"recu__h\" id=\"recu-t\">Ce que vous recevez</h2><ul class=\"recu__list\">${rows.join('')}</ul>${tot}${door}</section>`;\n  }\n  /* Rep\u00E8res de confiance juste sous le bouton (fiche) et sous \u00AB Passer au paiement \u00BB (panier), l\u00E0 o\u00F9 la peur arrive\n     (Baymard : 19 % des abandons \u00AB pas confiance pour ma carte \u00BB, 13 % \u00AB retours insuffisants \u00BB ; chantier confiance du 08/10).\n     Seulement des faits v\u00E9rifiables : paiement trait\u00E9 par Shopify Payments ou PayPal (num\u00E9ro de carte jamais transmis,\n     Protection des achats PayPal : non re\u00E7u ou non conforme \u00E0 la description) ; suivi de chaque colis (e-mail d'exp\u00E9dition) ; le d\u00E9lai de\n     r\u00E9tractation pr\u00E9sent\u00E9 comme la loi le pr\u00E9voit, jamais comme un cadeau (sauf retour offert, pay\u00E9 par Caplia) ; e-mail. */\n  /* \u00AB Comment se passe un retour \u00BB en 3 \u00E9tapes courtes (supervision du 08/10) : sur la fiche, dans \u00AB Livraison et retour \u00BB ;\n     au panier, le lien m\u00E8ne \u00E0 la m\u00EAme marche \u00E0 suivre, en d\u00E9tail, sur la page Livraison (?s=retractation) */\n  const retourSteps = (offert) => {\n    const R = SITE.retours.delaiJours;\n    return [`\u00C9crivez-nous \u00E0 ${mailLink('')} avec votre num\u00E9ro de commande, dans les ${R} jours qui suivent la r\u00E9ception.`,\n      `Nous vous envoyons l\u2019adresse de retour et un transporteur adapt\u00E9 \u00E0 la pi\u00E8ce${offert ? ', pay\u00E9 par nous' : ''}.`,\n      `Vous \u00EAtes rembours\u00E9 au plus tard ${R} jours apr\u00E8s votre demande, une fois la pi\u00E8ce re\u00E7ue ou sa preuve d\u2019envoi.`];\n  };\n  /* ouvre un repli de la fiche (\u00AB Livraison et retour \u00BB, \u00AB Est-ce que \u00E7a passe \u00BB) et le fait venir \u00E0 l'\u00E9cran */\n  function openAcc(sel) {\n    const d = $(sel);\n    if (!d) return null;\n    d.open = true;\n    d.scrollIntoView({ behavior: reduce ? 'auto' : 'smooth', block: 'start' });\n    return d;\n  }\n  /* 16/10 (analyse des concurrents) : les logos des moyens de paiement sous le bouton, l\u00E0 o\u00F9 na\u00EEt la peur pour la carte.\n     Dans la boutique, la place [data-caplia-slot=\"paiements\"] re\u00E7oit les logos officiels rendus par Shopify\n     (shop.enabled_payment_types, layout/theme.liquid) ; la maquette en montre l'aper\u00E7u en texte (site.json > paiements). */\n  const payIcons = () => `<ul class=\"pay-icons\" data-caplia-slot=\"paiements\" aria-label=\"Moyens de paiement accept\u00E9s\">${(SITE.paiements || []).map((t) => `<li class=\"pay-icons__txt\">${esc(t)}</li>`).join('')}</ul>`;\n  /* 17/10 (table d'experts) : ce que le client paie pour renvoyer une pi\u00E8ce (0 si le retour est offert). Au panier, la ligne\n     de retour est celle de la pi\u00E8ce dont le retour co\u00FBte le plus (un canap\u00E9 passe avant un fauteuil). */\n  const retourFrais = (p) => (retourOffert(p) ? 0 : returnCost(p));\n  const retourLePlusCher = (items) => items.reduce((a, b) => (retourFrais(b) > retourFrais(a) ? b : a));\n  /* 18/10 (audit 02 Mo1) : la peur de payer un inconnu d'abord (PayPal et sa protection, carte jamais transmise), puis le\n     colis suivi et ab\u00EEm\u00E9 (page \u00AB Un souci \u00BB), le droit de changer d'avis \u00AB comme la loi le pr\u00E9voit \u00BB avec le co\u00FBt du retour\n     de la pi\u00E8ce nomm\u00E9e (retourTxt), la question et qui nous sommes (sans ligne \u00AB pas encore d'avis \u00BB depuis le 20/10 : le propri\u00E9taire la juge rebutante).\n     Fiche : la pi\u00E8ce ; panier : retourLePlusCher(\u2026), panier = true. */\n  function trustHtml(p, panier = false) {\n    const R = SITE.retours.delaiJours;\n    const ret = retourOffert(p)\n      ? `<b>Retour offert sous ${R} jours</b> : nous payons le transport du retour.`\n      : `<b>${R} jours pour changer d\u2019avis</b>, comme la loi le pr\u00E9voit. ${esc(retourTxt(p))}`;\n    const how = panier ? '<a href=\"#/livraison?s=retractation\">Comment se passe un retour</a>' : `<button class=\"fp-inline\" type=\"button\" data-action=\"open-retour\">Comment se passe un retour</button>`;\n    return `<ul class=\"trust\" aria-label=\"Avant de payer\">\n      <li><span class=\"trust__i\" aria-hidden=\"true\">${I.shield}</span><p><b>Payez par carte ou avec PayPal.</b> Avec PayPal, la Protection des achats peut vous rembourser si la commande n\u2019arrive pas ou ne correspond pas \u00E0 la fiche. Votre num\u00E9ro de carte ne nous est jamais transmis.</p>${payIcons()}</li>\n      <li><span class=\"trust__i\" aria-hidden=\"true\">${I.truck}</span><p><b>Chaque colis est suivi.</b> Arriv\u00E9 ab\u00EEm\u00E9 ? Une photo par e-mail suffit : nous vous renvoyons la pi\u00E8ce ou la partie ab\u00EEm\u00E9e, ou vous remboursons, sans frais pour vous, comme la loi le pr\u00E9voit.</p></li>\n      <li><span class=\"trust__i\" aria-hidden=\"true\">${I.check}</span><p>${ret} ${how}</p></li>\n      <li><span class=\"trust__i\" aria-hidden=\"true\">${I.mail}</span><p><b>Une question ?</b> ${mailLink('')}, r\u00E9ponse ${reponse()}. ${esc(SITE.nom)} est une entreprise fran\u00E7aise. <a href=\"#/a-propos\">Qui sommes-nous</a></p></li>\n    </ul>`;\n  }\n  /* Trois moments sous la galerie (refonte du 07/10) : la mati\u00E8re en gros plan, l'\u00E9chelle dessin\u00E9e, la pi\u00E8ce en situation.\n     Trois formats diff\u00E9rents (diptyque, plan sur le studio, grande photo avec cartel), un seul texte court chacun, tir\u00E9\n     de la fiche. Une pi\u00E8ce sans gros plan, sans plan ou sans 2e photo en situation saute le moment qui lui manque. */\n  const noDot = (t) => String(t || '').trim().replace(/[.\\s]+$/, '');\n  const focusX = (p, id) => { const c = (CADRAGE[p.slug] || {})[id]; return c ? Math.round(((c[1] + c[3]) / 2) * 100) : 50; };\n  const momentPic = (p, im, sizes) => `<picture><source type=\"image/avif\" srcset=\"${GAL_SRCSET(p, im.id, 'avif')}\" sizes=\"${sizes}\"><img src=\"${photo(p, im.id, 1280)}\" srcset=\"${GAL_SRCSET(p, im.id)}\" sizes=\"${sizes}\" alt=\"${esc(im.alt)}\" loading=\"lazy\" decoding=\"async\" draggable=\"false\" style=\"object-position:${focusX(p, im.id)}% 50%\"></picture>`;\n  function momentsHtml(p, k) {\n    if (isAcc(p)) return '';\n    const c = p.couleurs[k] || p.couleurs[0];\n    const all = colorPhotos(p, c);\n    const close = all.filter((im) => closeUp(im.alt));\n    const MAT_RE = /bouclette|chenille|velours|tissu|texture|lin\b|sherpa|teddy|mouton|c\u00F4tel\u00E9/i;\n    /* le gros plan qui montre la mati\u00E8re ET une courbe de la pi\u00E8ce (plus vivant qu'un aplat de tissu) */\n    const macro = close.find((im) => MAT_RE.test(im.alt) && /accoudoir|dossier|arrondi|capiton/i.test(im.alt) && !/pied|charni|fermeture|coussin et/i.test(im.alt))\n      || close.find((im) => MAT_RE.test(im.alt) && !/coussin|pied|accoudoir|charni|fermeture|bouton/i.test(im.alt))\n      || close.find((im) => /bouclette|chenille|velours|tissu|texture|sherpa|teddy|mouton|c\u00F4tel\u00E9/i.test(im.alt)) || close[0];\n    const sc = scenesFor(p, c.nom);\n    const room = sc[1] || null;\n    const D = p.dimensions || {};\n    const out = [];\n    if (macro && p.toucher) out.push(`<div class=\"mo mo--mat\">\n        <figure class=\"mo__img\">${momentPic(p, macro, '(max-width: 760px) 100vw, 58vw')}</figure>\n        <div class=\"mo__txt\"><h2 class=\"t-2 mo__h\">${esc(p.matiere)}, ${esc(lc1(c.nom))}</h2><p class=\"mo__p\">${esc(p.toucher)}</p></div>\n      </div>`);\n    if (planKind(p) && D.largeur && !isMirror(p)) {\n      const seat = D.hauteurAssise ? `Assise \u00E0 ${cm(D.hauteurAssise)} du sol${D.profondeurAssise ? `, ${cm(D.profondeurAssise)} de profondeur` : ''}.` : '';\n      out.push(`<div class=\"mo mo--plan\">\n        <div class=\"mo__txt\"><h2 class=\"mo__fig num${p.tailles ? ' mo__fig--s' : ''}\">${p.tailles ? esc(dimsLabel(p)) : cm(D.largeur)}</h2><p class=\"mo__p\">${p.tailles ? '' : `${cm(D.profondeur)} de profondeur, ${cm(D.hauteur)} de haut. `}${seat}</p></div>\n        <div class=\"mo__plan fp-plan-big\" aria-label=\"Plan cot\u00E9 de ${esc(p.nom)}\">${planSVG(p)}${planSVG(p, true)}</div>\n      </div>`);\n    }\n    if (room) {\n      const h = noDot((p.accroche || []).join(' ')) || p.nom;\n      out.push(`<figure class=\"mo mo--room\"><div class=\"mo__full\" data-photo=\"${esc(room.id)}\"${(CADRAGE[p.slug] || {})[room.id] ? ` style=\"--own:${CADRAGE[p.slug][room.id][0].toFixed(3)}\"` : ''}>${momentPic(p, room, '100vw')}</div><figcaption class=\"mo__cartel\"><h2 class=\"t-2 mo__h\">${esc(h)}</h2>${p.scene ? `<p class=\"mo__p\">${esc(p.scene)}</p>` : ''}</figcaption></figure>`);\n    }\n    return out.length ? `<section class=\"wrap fp-sec mos\" aria-label=\"${esc(p.nom)} de pr\u00E8s\">${out.join('')}</section>` : '';\n  }\n  /* volet repli\u00E9, titre court et ic\u00F4ne */\n  /* volet \u00AB Montage et notice \u00BB : notice du fabricant en fran\u00E7ais, ou fiche d'entretien et de s\u00E9curit\u00E9 (site/data/notices.json) */\n  const noticeAcc = (p) => {\n    const n = NOTICES[p.slug];\n    if (!n || !n.fichier || n.type === 'fiche') return '';   /* 22/10 : une notice seulement quand il y a du montage */\n    const fab = n.type !== 'fiche';   /* fabricant (notice d'origine) ou montage (notice \u00E9crite par Caplia, 22/10) */\n    const poids = n.ko >= 1024 ? `${String(Math.round(n.ko / 102.4) / 10).replace('.', ',')} Mo` : `${n.ko} Ko`;\n    return accI(I.box, fab ? 'Montage et notice' : 'Entretien et s\u00E9curit\u00E9', `<p>${fab\n      ? (n.type === 'montage' ? 'Le montage \u00E9tape par \u00E9tape, en fran\u00E7ais, avec le sch\u00E9ma du fabricant.' : 'La notice du fabricant, avec les consignes en fran\u00E7ais et les sch\u00E9mas de montage \u00E9tape par \u00E9tape.')\n      : 'D\u00E9ballage, entretien et consignes de s\u00E9curit\u00E9, en fran\u00E7ais.'}</p>\n        <p class=\"fp-notice\"><a href=\"${esc(n.fichier)}\" target=\"_blank\" rel=\"noopener\">${fab ? 'Notice de montage' : \"Fiche d'entretien et de s\u00E9curit\u00E9\"}</a><span class=\"fp-notice__meta\">PDF, ${n.pages} page${n.pages > 1 ? 's' : ''}, ${poids}</span></p>\n        <p class=\"fp-more__ask\">Une question ? ${mailLink('')}</p>`);\n  };\n  const accI = (ico, q, r, attrs = '') => `<details class=\"acc acc--i\"${attrs ? ' ' + attrs : ''}><summary><span class=\"acc__ico\" aria-hidden=\"true\">${ico}</span>${q}<span class=\"round\" aria-hidden=\"true\">${I.plus}</span></summary><div class=\"acc__body\">${r}</div></details>`;\n  /* mati\u00E8re : gros plan de la couleur choisie, composition, entretien en trois gestes */\n  function matBody(p, k) {\n    const o = matOf(p), v = o ? matPic(p, k) : null;\n    return `${o ? `<figure class=\"fp-more__mat\"${v ? '' : ' hidden'}><img ${v ? `src=\"${v.src}\" srcset=\"${v.srcset}\" alt=\"${esc(v.alt)}\"` : 'alt=\"\"'} sizes=\"(max-width: 760px) 40vw, 200px\" data-mat-img loading=\"lazy\" decoding=\"async\"></figure>` : ''}\n      <table class=\"table\"><tbody>\n        ${p.details.filter(([a]) => /^(Rev\u00EAtement|Tissu|Cadre|Dessus|Dessous|Lot)$/.test(a)).concat(ftOf(p).tissu || []).map(([a, b]) => `<tr><th scope=\"row\">${esc(a)}</th><td>${esc(b)}</td></tr>`).join('')}\n        <tr><th scope=\"row\">${p.couleurs.length > 1 ? 'Couleurs' : 'Couleur'}</th><td>${esc(p.couleurs.map((c) => c.nom).join(', '))}</td></tr>\n      </tbody></table>\n      ${o ? `<h3 class=\"fp-more__h\">L\u2019entretien</h3><ul class=\"fp-more__list\">${o.m.entretien.map(([t, d]) => `<li><b>${esc(t)}</b> : ${esc(lc1(d))}</li>`).join('')}</ul>` : ''}`;\n  }\n  /* pi\u00E8ce compress\u00E9e : le temps de reprise de forme, en une phrase */\n  const compLine = (p) => { const a = arrOf(p); return a && a.compresse ? ` Livr\u00E9${isFem(p) ? 'e' : ''} compress\u00E9${isFem(p) ? 'e' : ''} : ${isFem(p) ? 'elle' : 'il'} reprend sa forme en ${esc(a.forme)}.` : ''; };\n  const passeLine = (p) => { const e = easyIn(p); return e ? `${e[0]}. ${e[1]}` : `${cap1(doorTxt(p))}.`; };\n\n  /* ---------------- Doutes du canap\u00E9 (07/10, chantier 3) ----------------\n     Blocs repli\u00E9s de la fiche, seulement avec les donn\u00E9es relev\u00E9es chez le vendeur (site/data/fiches-techniques.json) :\n     une donn\u00E9e absente n'a pas de ligne, un bloc vide n'existe pas. */\n  const ftOf = (p) => FT[p.slug] || {};\n  const debOf = (p, re) => ((ftOf(p).deballage || []).find(([a]) => re.test(a)) || [])[1];   // d\u00E9ballage : \u00AB Colis \u00BB, \u00AB Montage \u00BB\u2026\n  const kvTable = (rows) => `<table class=\"table\"><tbody>${rows.map(([a, v]) => `<tr><th scope=\"row\">${esc(a)}</th><td>${esc(nbTxt(v))}</td></tr>`).join('')}</tbody></table>`;\n  const sameLbl = (a, b) => norm(a).split(' ')[0] === norm(b).split(' ')[0];\n  function confortBody(p) {\n    const rows = ftOf(p).confort || [];\n    return rows.length ? kvTable(rows) : '';\n  }\n  function deballageBody(p) {\n    const rows = ftOf(p).deballage || [];\n    if (!rows.length) return '';\n    const a = arrOf(p);\n    return `${kvTable(rows)}${a && a.compresse && ARR && ARR.etapes ? '<p class=\"fp-more__ask\"><a href=\"#/arrivee\">Les \u00E9tapes du d\u00E9ballage en photos</a></p>' : ''}`;\n  }\n  /* 18/10 (audit 08 M14, art. L111-4 et D111-4 du Code de la consommation) : sans p\u00E9riode donn\u00E9e par le fabricant, les pi\u00E8ces\n     d\u00E9tach\u00E9es d'un meuble sont r\u00E9put\u00E9es non disponibles, et le client doit le lire avant l'achat. Une ligne de la fiche\n     technique de chaque meuble (poufs compris, pas les coussins, plaids et tapis), et une phrase des conditions de vente. */\n  const PIECES_DETACHEES = ['Pi\u00E8ces d\u00E9tach\u00E9es', 'Non disponibles (le fabricant ne nous a pas communiqu\u00E9 de p\u00E9riode de disponibilit\u00E9)'];\n  const isMeuble = (p) => !isAcc(p) || /^Pouf\\b/.test(p.type);\n  /* fiche technique : tout ce qui est relev\u00E9, en une table (dimensions, catalogue, vendeur, colis, exp\u00E9dition, couleurs) */\n  function techRows(p) {\n    const D = p.dimensions, rows = [];\n    if (!p.tailles && D.largeur && D.profondeur && D.hauteur && !D.diametre && !D.epaisseur) rows.push(['Dimensions', `${numFr(D.largeur)} \u00D7 ${numFr(D.profondeur)} \u00D7 ${numFr(D.hauteur)} cm (L \u00D7 P \u00D7 H)`]);\n    if (D.hauteurAssise && isSeat(p)) rows.push(['Hauteur d\u2019assise', `${numFr(D.hauteurAssise)} cm`]);\n    if (D.profondeurAssise) rows.push(['Profondeur d\u2019assise', `${numFr(D.profondeurAssise)} cm`]);\n    p.details.filter(([a]) => !rows.some(([r]) => sameLbl(r, a))).forEach((d) => rows.push(d));\n    (ftOf(p).technique || []).filter(([a]) => !rows.some(([r]) => sameLbl(r, a))).forEach((d) => rows.push(d));\n    if (/^\\d/.test(p.colis || '') && !rows.some(([r]) => /colis/i.test(r))) rows.push(['Colis', p.colis]);\n    rows.push(['Exp\u00E9dition', `Depuis ${PAYS_DE[p.pays]}, en ${delayTxt(p)}`]);\n    rows.push([p.couleurs.length > 1 ? 'Couleurs' : 'Couleur', p.couleurs.map((c) => c.nom).join(', ')]);\n    if (isMeuble(p)) rows.push(PIECES_DETACHEES);\n    return rows;\n  }\n  /* questions propres \u00E0 la pi\u00E8ce, tir\u00E9es de ses donn\u00E9es (date, colis et montage), quand sa FAQ ne les pose pas d\u00E9j\u00E0 */\n  function dataFaq(p) {\n    const out = [];\n    /* 18/10 (audit 02 Mi1) : une pi\u00E8ce vendue par lot (catalogue.json \u00AB pluriel \u00BB : les coussins n\u0153ud) dit \u00AB Quand seront-ils\u2026 \u00BB ;\n       pas de question de colis ni de montage pour un accessoire */\n    const plur = !!p.pluriel;\n    const f = isFem(p), il = plur ? 'ils' : f ? 'elle' : 'il', Il = cap1(il);\n    if (!notYet(p)) out.push([plur ? 'Quand seront-ils chez moi ?' : `Quand sera-t-${il} chez moi ?`, `Command\u00E9${plur ? 's' : f ? 'e' : ''} aujourd\u2019hui, ${il} arrive${plur ? 'nt' : ''} chez vous ${delivery(p)} : ${delayTxt(p)} depuis ${PAYS_DE[p.pays]}. La livraison est offerte.`]);\n    const col = debOf(p, /^Colis$/), mont = debOf(p, /^(Montage|Installation)$/), forme = debOf(p, /^Reprise de forme$/);\n    if ((col || mont) && !isAcc(p)) {\n      const parts = [];\n      if (col) parts.push(`${Il} arrive en ${lc1(col)}.`);\n      /* 18/10 (audit 02 Mi1) : \u00AB livr\u00E9 compress\u00E9 \u00BB seulement pour une pi\u00E8ce compress\u00E9e ; \u00AB Coussins : 72 heures \u00BB (Mimosa) */\n      const cs = forme && forme.match(/^Coussins\\s*:\\s*(.+)$/i);\n      if (forme) parts.push(cs ? `Les coussins reprennent leur forme en ${cs[1]}.` : isCompressed(p) ? `Livr\u00E9${f ? 'e' : ''} compress\u00E9${f ? 'e' : ''}, ${il} reprend sa forme en ${lc1(forme)}.` : `${Il} reprend sa forme en ${lc1(forme)}.`);\n      if (mont) parts.push(/^aucun/i.test(mont) ? 'Aucun montage.' : `Montage : ${lc1(mont)}.`);\n      out.push([`Combien de colis, et faut-il ${f ? 'la' : 'le'} monter ?`, parts.join(' ')]);\n    }\n    return out.filter(([q]) => !p.faq.some(([x]) => overlap(x, q)));\n  }\n  /* \u00AB Recevoir cette fiche et ses dimensions par e-mail \u00BB (marketing/FICHE-PAR-EMAIL.md) : sans case coch\u00E9e, rien n'est\n     enregistr\u00E9 (PDF, ou e-mail envoy\u00E9 par la messagerie du visiteur) ; case coch\u00E9e, abonnement (client Shopify \u00E9tiquet\u00E9). */\n  const FICHE_MAIL_AUTO = false;   /* true quand l'automatisation Shopify Flow \u00AB Votre fiche \u00BB existe (envoi par Caplia) */\n  const keepBlock = (p) => `<div class=\"fp-keep\" data-keep>\n      <button class=\"fp-keep__open\" type=\"button\" data-action=\"keep-open\" aria-expanded=\"false\" aria-controls=\"fp-keep-form\">${I.mail}<span>Recevoir cette fiche et ses dimensions par e-mail</span></button>\n      <form class=\"fp-keep__form\" id=\"fp-keep-form\" data-keep-form novalidate hidden>\n        <p class=\"fp-keep__t\">Gardez cette fiche</p>\n        <p class=\"fp-keep__lead\">Les dimensions, les colis et le d\u00E9lai de ${esc(p.nom)}, pour mesurer tranquillement chez vous.</p>\n        <label class=\"sr-only\" for=\"keep-mail\">Votre adresse e-mail</label>\n        <input id=\"keep-mail\" class=\"input\" type=\"email\" autocomplete=\"email\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"Votre adresse e-mail\" required aria-describedby=\"keep-note\">\n        <label class=\"check fp-keep__ok\" for=\"keep-ok\"><input id=\"keep-ok\" type=\"checkbox\"><span>Je veux aussi recevoir les e-mails de Caplia : au plus deux par mois, sur des pi\u00E8ces semblables. Je peux me d\u00E9sinscrire en un clic dans chaque e-mail.</span></label>\n        <button class=\"btn btn--block\" type=\"submit\">Recevoir la fiche</button>\n        <p class=\"fp-keep__note\" id=\"keep-note\">Caplia utilise votre adresse pour vous envoyer cette fiche et, seulement si vous avez coch\u00E9 la case, ses e-mails. Elle n\u2019est ni vendue ni pr\u00EAt\u00E9e. Vous pouvez demander \u00E0 tout moment sa suppression \u00E0 ${mailLink('')}. D\u00E9tails : <a href=\"#/confidentialite\">Confidentialit\u00E9</a>.</p>\n        <div class=\"fp-keep__msg\" data-keep-msg aria-live=\"polite\" hidden></div>\n      </form>\n    </div>`;\n  function keepMailto(p, mail) {\n    const size = p.tailles ? p.tailles[PDP.size].nom : '';\n    const c = p.couleurs[PDP.color] || p.couleurs[0];\n    const D = p.dimensions;\n    const lines = [`${p.nom}, ${lc1(p.type)}`, `Couleur : ${c.nom}${size ? `, taille ${size}` : ''}`, `Prix : ${price(unitPriceOf(p, size)).replace(/\\s/g, ' ')}, livraison offerte`,\n      D.largeur && D.profondeur && D.hauteur && !p.tailles ? `Dimensions : ${numFr(D.largeur)} \u00D7 ${numFr(D.profondeur)} \u00D7 ${numFr(D.hauteur)} cm (L \u00D7 P \u00D7 H)` : '',\n      D.hauteurAssise && isSeat(p) ? `Hauteur d\u2019assise : ${numFr(D.hauteurAssise)} cm` : '', /^\\d/.test(p.colis || '') ? `Colis : ${p.colis}` : '',\n      `Livraison : ${delayTxt(p)} depuis ${PAYS_DE[p.pays]}`, '', `La fiche : ${location.href}`].filter(Boolean);\n    return `mailto:${mail.split('@').map(encodeURIComponent).join('@')}?subject=${encodeURIComponent(`Ma fiche Caplia : ${p.nom}`)}&body=${encodeURIComponent(lines.join('\\n'))}`;\n  }\n  /* Paiement express (07/10, chantier 2). Dans la boutique, la place [data-caplia-slot] re\u00E7oit les vrais boutons de\n     paiement acc\u00E9l\u00E9r\u00E9 de Shopify (Apple Pay, Shop Pay, PayPal selon les r\u00E9glages de paiement), rendus par Liquid\n     (sections/caplia-produit et caplia-panier) ; la maquette y montre leur aper\u00E7u.\n     18/10 (audit 03 MAJEUR 1, audit 02 M9) : seulement pour un meuble dont toutes les versions co\u00FBtent moins que le premier\n     palier des cadeaux (500 \u20AC). Au-dessus, l'achat express sauterait le panier et la commande partirait sans la ligne\n     cadeau : la pi\u00E8ce se paie par le panier. M\u00EAme r\u00E8gle dans sections/caplia-produit.liquid (seuil lu dans le snippet\n     caplia-seuil-cadeaux, g\u00E9n\u00E9r\u00E9 depuis site.json). Une pi\u00E8ce \u00E9puis\u00E9e n'en a pas (onSale), comme c\u00F4t\u00E9 Shopify. */\n  const prixMax = (p) => Math.max(...(p.tailles ? p.tailles.map((t) => t.prix) : [p.prix]));\n  const expressOk = (p) => onSale(p) && !isAcc(p) && prixMax(p) < ((SITE.paliers || [])[0] || { seuil: Infinity }).seuil;\n  const APPLE_PAY = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M16.4 12.6c0-2 1.6-2.9 1.7-3a3.7 3.7 0 0 0-2.9-1.6c-1.2-.1-2.4.7-3 .7s-1.6-.7-2.6-.7a3.9 3.9 0 0 0-3.3 2c-1.4 2.4-.4 6 1 8 .7 1 1.5 2 2.5 2s1.4-.6 2.6-.6 1.5.6 2.6.6 1.8-1 2.4-2a8.6 8.6 0 0 0 1.1-2.3 3.4 3.4 0 0 1-2.1-3.1zM14.5 6.6A3.4 3.4 0 0 0 15.3 4a3.5 3.5 0 0 0-2.3 1.2 3.3 3.3 0 0 0-.8 2.5 2.9 2.9 0 0 0 2.3-1.1z\"/></svg>';\n  const expressMock = (where) => `<div class=\"express${where === 'fiche' ? ' express--fiche' : ''}\" role=\"group\" aria-label=\"Paiement express\" data-caplia-slot=\"${where === 'fiche' ? 'express' : 'express-panier'}\">\n      <div class=\"express__row\">\n        <button class=\"express__b\" type=\"button\" data-action=\"${where === 'fiche' ? 'pdp-express' : 'checkout'}\" data-express=\"1\" aria-label=\"Payer avec Apple Pay\">${APPLE_PAY}Pay</button>\n        <button class=\"express__b\" type=\"button\" data-action=\"${where === 'fiche' ? 'pdp-express' : 'checkout'}\" data-express=\"1\" aria-label=\"Payer avec PayPal\">PayPal</button>\n      </div>\n    </div>`;\n  function renderProduct(slug) {\n    const p = BY[slug];\n    if (!p) return render404();\n    PDP.p = p; PDP.color = 0; PDP.size = defSize(p); PDP.img = -1; PDP.slide = 0; PDP.done = { color: p.couleurs.length === 1 && !p.tailles };\n    const qs = qsAll();\n    const qc = Number(qs.get('c') || 0);\n    /* ?couleur=<nom> : lien partag\u00E9 d'une couleur pr\u00E9cise (m\u00EAme \u00E9puis\u00E9e : la fiche le dit et propose l'e-mail de retour) */\n    const qk = qs.get('couleur') ? p.couleurs.findIndex((c) => colorSlug(c.nom) === qs.get('couleur')) : SHOP_VARIANT_COLOR(p, qs.get('variant'));\n    /* sinon chaque fiche s'ouvre sur la premi\u00E8re couleur disponible, celle du rendu studio quand elle est en stock :\n       ce qu'on voit en arrivant est ce que montrent la carte et l'affiche de l'accueil */\n    PDP.initColor = qk >= 0 ? qk : qc > 0 && qc < p.couleurs.length && !isOut(p.couleurs[qc]) ? qc : firstIn(p);\n    /* ?taille=<nom> : lien envoy\u00E9 depuis la fiche (bouton \u00AB Envoyer \u00BB) */\n    const qt = p.tailles && qs.get('taille') ? p.tailles.findIndex((t) => colorSlug(t.nom) === qs.get('taille')) : -1;\n    if (qt >= 0) PDP.size = qt;\n    /* la taille d'ouverture est en vente dans la couleur d'ouverture */\n    if (p.tailles && sizeOutFor(p.tailles[PDP.size], p.couleurs[PDP.initColor].nom)) PDP.size = Math.max(0, p.tailles.findIndex((t) => !sizeOutFor(t, p.couleurs[PDP.initColor].nom)));\n    const tid = TABLEAU[slug];\n    const c0 = p.couleurs[PDP.initColor];   /* couleur d'ouverture : en stock, sauf lien partag\u00E9 ?couleur= */\n    const D = p.dimensions;\n    const slides = gallerySlides(p, PDP.initColor);\n    PDP.slides = slides; PDP.galColor = PDP.initColor; PDP.moColor = PDP.initColor; PDP.galSeq = 0;\n    const A = STAGE_A(p, PDP.initColor);\n\n    const dims = isBed(p)\n      ? [['Couchage', p.tailles ? dimsLabel(p) : xy(D.largeur, D.profondeur)],\n        [p.tailles ? `Au sol (matelas ${p.tailles[0].nom.replace(/ cm$/, '')})` : 'Au sol', xy(D.largeur, D.profondeur)],\n        ['Hauteur de la t\u00EAte de lit', cm(D.hauteur)]]\n      : isMirror(p)\n      ? [['Hauteur', p.tailles ? sizeNums(p, 0) : cm(D.hauteur)], ['Largeur', p.tailles ? sizeNums(p, 1) : cm(D.largeur)], ['\u00C9paisseur', cm(D.profondeur)]]\n      : D.epaisseur ? [['Dimensions', xy(D.largeur, D.profondeur)], ['\u00C9paisseur', cm(D.epaisseur)]]\n      : D.diametre ? [['Diam\u00E8tre', cm(D.diametre)], ['Hauteur', cm(D.hauteur)]]\n      : D.petite ? [['Grande table', `${xy(D.largeur, D.profondeur)}, ${cm(D.hauteur)} de haut`], ['Petite table', `${xy(D.petite.largeur, D.petite.profondeur)}, ${cm(D.petite.hauteur)} de haut`]]\n      : [['Largeur', cm(D.largeur)], [p.slug === 'miroir-organique' ? '\u00C9paisseur' : 'Profondeur', cm(D.profondeur)], ['Hauteur', cm(D.hauteur)]]\n        .concat(D.hauteurAssise ? [['Hauteur d\u2019assise', cm(D.hauteurAssise)]] : [])\n        .concat(D.profondeurAssise ? [['Profondeur d\u2019assise', cm(D.profondeurAssise)]] : []);\n\n\n    const ens = ensFor(p.slug);\n    const mates = ens ? ens.items.slice(1).map(([s]) => s) : [];\n    const auto = () => PRODS.filter((x) => x !== p && sameWorld(x, p) && !(isBed(p) && isBed(x)) && !SECONDARY.includes(x.slug) && carteOf(x) && onSale(x) && !isAcc(x))\n      .map((x) => ({ x, k: mates.includes(x.slug) ? -1 : (x.collection !== p.collection ? 0 : 1) * 10 + (hash(x.slug + p.slug) % 10) }))\n      .sort((a, b) => a.k - b.k).slice(0, 4).map((o) => o.x);\n    const hand = RELATED[p.slug] ? RELATED[p.slug].map((s) => BY[s]).filter((x) => x && onSale(x)) : null;\n    /* liste \u00E9crite \u00E0 la main : les trois premi\u00E8res pi\u00E8ces en ligne (une quatri\u00E8me sert de relais quand l'une est masqu\u00E9e) */\n    const related = !hand ? auto() : hand.length >= 3 || !RELATED[p.slug].length ? hand.slice(0, 3) : [...hand, ...auto().filter((x) => !hand.includes(x))].slice(0, 3);\n\n    /* Bloc affich\u00E9 seulement quand fabricant et responsable UE sont relev\u00E9s (sinon la pi\u00E8ce n'est pas en vente) */\n    /* Bloc affich\u00E9 d\u00E8s que fabricant et responsable UE sont relev\u00E9s, avec ce qui est relev\u00E9 (\u00AB aConfirmer \u00BB ne le cache pas) */\n    const secReady = (x) => !!(x.securite && x.securite.fabricant && x.securite.responsableUE && !/compl/i.test(x.securite.fabricant.nom + x.securite.responsableUE.nom));\n    const person = (o) => `${esc(o.nom)}<br>${esc(o.adresse)}${o.email ? '<br>' + esc(o.email) : ''}${o.telephone ? '<br>' + esc(o.telephone) : ''}`;\n    const pk = petsKids(p);\n    const faqs = p.faq.filter(([q]) => !(matOf(p) && /^comment entretenir/i.test(q))).concat(pk).concat(dataFaq(p));\n    const confort = confortBody(p), deballage = deballageBody(p);\n\n    const html = `\n    <section class=\"wrap fp\" aria-label=\"${esc(p.nom)}\">\n      ${crumbOf(p)}\n      <div class=\"fp__media\">\n        <div class=\"fp-stage fp-stage--${shape(p)}\" data-fp-stage style=\"--am:${A.m};--ad:${A.d};${A.lead ? `--lead:${A.lead};` : ''}--py-m:${studioPos(p, A.m)}%;--py-d:${studioPos(p, A.d)}%\">\n          <div class=\"fp-track\" data-fp-track tabindex=\"0\" role=\"region\" aria-roledescription=\"carrousel\" aria-label=\"Images de ${esc(p.nom)}\">\n            ${slides.map((s, i) => slideHtml(p, s, i)).join('')}\n          </div>\n          <button class=\"round round--white fp-zoom\" type=\"button\" data-action=\"pdp-zoom\" aria-label=\"Agrandir la photo\" hidden>${I.loupe}</button>\n          <button class=\"round round--white fp-fav\" type=\"button\" data-action=\"fav\" data-slug=\"${p.slug}\" aria-pressed=\"${isFav(p.slug)}\">${I.heart}<span class=\"sr-only\" data-fav-label>${isFav(p.slug) ? 'Dans ma s\u00E9lection' : 'Enregistrer dans ma s\u00E9lection'}</span></button>\n          <div class=\"fp-nav\">\n            <button class=\"round round--white\" type=\"button\" data-fp=\"prev\" aria-label=\"Image pr\u00E9c\u00E9dente\">${I.chevL}</button>\n            <button class=\"round round--white\" type=\"button\" data-fp=\"next\" aria-label=\"Image suivante\">${I.chevR}</button>\n          </div>\n        </div>\n        <div class=\"fp-thumbs\" role=\"tablist\" aria-label=\"Choisir une image\" style=\"--n:${slides.length};--ad:${A.d}\">\n          ${slides.map((s, i) => thumbHtml(s, i, 0)).join('')}\n        </div>\n      </div>\n\n      <aside class=\"fp__buy\" aria-label=\"Acheter ${esc(p.nom)}\">\n        <h1 class=\"fp__h1\"><span class=\"fp__name\">${esc(p.nom)}</span><span class=\"sr-only\">, </span><span class=\"fp__type\">${esc(p.type)}</span></h1>\n        <p class=\"fp__cotes\">${cotesLine(p)}</p>\n        ${avisRate(p)}\n        <div class=\"fp__price\">\n          <strong class=\"num price\" data-pdp-price>${price(unitPriceOf(p, p.tailles ? p.tailles[PDP.size].nom : ''))}</strong>\n          <p class=\"fp__incl\">${esc(ecoTxt(p))}</p>\n          ${pp4xSlot('fp__4x', unitPriceOf(p, p.tailles ? p.tailles[PDP.size].nom : ''), 'product')}\n          ${onSale(p) ? `<p class=\"fp__when\" data-pdp-when><b>Livraison offerte</b>, chez vous ${delivery(p)}</p>` : ''}\n        </div>\n\n        <div class=\"fp-opt${p.couleurs.length === 1 ? ' fp-opt--seule' : ''}\">\n          <p class=\"fp-opt__q\">${esc(p.libelleCouleur || 'Couleur')} : <b data-pdp-colname>${esc(c0.nom)}</b><span class=\"soon\" data-pdp-soon${isOut(c0) ? '' : ' hidden'}> \u00B7 Bient\u00F4t de retour</span></p>\n          ${p.couleurs.length > 1 ? `<div class=\"pswatches\" role=\"radiogroup\" aria-label=\"${esc(p.libelleCouleur || 'Couleur')}\">\n            ${p.couleurs.map((c, k) => photoSwatch(p, c, k, k === PDP.initColor)).join('')}\n          </div>` : ''}\n          ${p.sens ? `<p class=\"fp-opt__sens\">${esc(p.sens)}</p>` : ''}\n        </div>\n        ${p.tailles && p.tailles.length > 1 ? `<div class=\"fp-opt\">\n          <p class=\"fp-opt__q\">Taille : <b data-pdp-sizename>${esc(p.tailles[PDP.size].nom)}</b></p>\n          <div class=\"sizes\" role=\"radiogroup\" aria-label=\"Taille\">\n            ${p.tailles.map((t, k) => sizePill(t, k, k === PDP.size, c0.nom)).join('')}\n          </div>\n        </div>` : ''}\n\n        <div class=\"fp-ctas\" data-buy>\n          ${notYet(p) ? '' : `<button class=\"btn btn--block\" type=\"button\" data-action=\"pdp-add\"${isOut(c0) ? ' hidden' : ''}><span class=\"cta__label\">Ajouter au panier</span></button>`}\n          ${notYet(p) || !expressOk(p) ? '' : `<div class=\"fp-express\"${isOut(c0) ? ' hidden' : ''}>${expressMock('fiche')}</div>`}\n          <form class=\"notify\" data-notify novalidate${isOut(c0) || notYet(p) ? '' : ' hidden'}>\n            <p class=\"notify__t\">${notYet(p) ? 'Bient\u00F4t disponible. Recevez un e-mail le jour de sa mise en vente.' : 'Cette couleur revient bient\u00F4t. Recevez un e-mail le jour de son retour.'}</p>\n            <div class=\"notify__row\">\n              <label class=\"sr-only\" for=\"notify-mail\">Votre e-mail</label>\n              <input id=\"notify-mail\" name=\"email\" type=\"email\" autocomplete=\"email\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"Votre e-mail\" required>\n              <button class=\"pill pill--sm\" type=\"submit\">Me pr\u00E9venir</button>\n            </div>\n            <label class=\"check notify__ok\" for=\"notify-ok\"><input id=\"notify-ok\" name=\"ok\" type=\"checkbox\" required><span>${notYet(p) ? `J'accepte de recevoir l'e-mail de la mise en vente de ${esc(p.nom)}.` : \"J'accepte de recevoir l'e-mail du retour de cette couleur.\"}</span></label>\n            <p class=\"notify__msg\" data-notify-msg aria-live=\"polite\" hidden></p>\n          </form>\n        </div>\n        <div data-pdp-gift>${giftLine(p)}</div>\n        ${notYet(p) ? '' : trustHtml(p)}\n        <div data-pdp-recu>${recuHtml(p)}</div>\n      </aside>\n    </section>\n\n    ${momentsHtml(p, PDP.initColor)}\n\n    ${avisHtml(p)}\n\n    <section class=\"wrap fp-sec fp-more\" aria-labelledby=\"fp-more-t\">\n      <h2 class=\"t-2 fp-h fp-detail-h\" id=\"fp-more-t\">${esc(p.nom)}, en d\u00E9tail</h2>\n      <div data-caplia-slot=\"caplia-matiere\"></div>\n      ${accI(I.ruler, 'Dimensions', `${planKind(p) ? `<div class=\"fp-more__plan\">${planSVG(p)}</div>` : ''}\n        <dl class=\"fp-dims\">${dims.map(([l, v]) => `<div><dt>${esc(l)}</dt><dd class=\"num\">${esc(v)}</dd></div>`).join('')}</dl>\n        ${hasDoor(p) ? `<p class=\"fp-more__door\">${esc(cap1(doorTxt(p)))}.</p>` : ''}`)}\n      ${hasDoor(p) ? accI(I.door, 'Est-ce que \u00E7a passe chez vous ?', `<p>${esc(passeLine(p))}</p>\n        <form class=\"fp-door\" data-door novalidate>\n          <div class=\"field\">\n            <label for=\"door-w\">Votre porte la plus \u00E9troite, largeur en cm</label>\n            <input id=\"door-w\" class=\"input\" name=\"w\" type=\"number\" inputmode=\"numeric\" min=\"30\" max=\"300\" placeholder=\"Par exemple 73\">\n          </div>\n          <div class=\"fp-door__more\">\n            <div class=\"field\">\n              <label for=\"door-s\">Escalier ou couloir, largeur en cm <span class=\"fp-door__opt\">(facultatif)</span></label>\n              <input id=\"door-s\" class=\"input\" name=\"s\" type=\"number\" inputmode=\"numeric\" min=\"30\" max=\"300\" placeholder=\"Par exemple 85\">\n            </div>\n            <div class=\"field\">\n              <label for=\"door-e\">\u00C9tage</label>\n              <select id=\"door-e\" name=\"etage\" class=\"input\"><option value=\"\">Choisir</option><option>Rez-de-chauss\u00E9e</option><option>\u00C9tage avec ascenseur</option><option>\u00C9tage sans ascenseur</option></select>\n            </div>\n          </div>\n          <button class=\"btn fp-door__go\" type=\"submit\">V\u00E9rifier</button>\n          <p class=\"fp-door__msg\" data-door-msg aria-live=\"polite\" hidden></p>\n        </form>\n        <p class=\"fp-door__engage\">Notre engagement : si nous vous avons confirm\u00E9 par \u00E9crit qu\u2019${isFem(p) ? 'elle' : 'il'} passe, d\u2019apr\u00E8s vos mesures et les cotes de son carton, et qu\u2019${isFem(p) ? 'elle' : 'il'} ne passe pas, nous ${isFem(p) ? 'la' : 'le'} reprenons \u00E0 nos frais et vous remboursons. <a href=\"#/conditions-de-vente?s=passage\">Les conditions</a></p>`, 'id=\"fp-passe\"') : ''}\n      ${confort ? accI(I.seat, 'Confort', confort) : ''}\n      ${accI(I.hand, 'Mati\u00E8re et entretien', matBody(p, PDP.initColor), 'data-mat')}\n      ${deballage ? accI(I.box, isCompressed(p) ? 'D\u00E9ballage' : 'D\u00E9ballage et montage', deballage) : ''}\n      ${accI(I.card, 'Fiche technique', kvTable(techRows(p)))}\n      ${noticeAcc(p)}\n      ${accI(I.truck, 'Livraison et retour', `<ul class=\"fp-more__list\">\n          <li><b>Livraison offerte</b>, en ${delayTxt(p)}, depuis ${PAYS_DE[p.pays]}.</li>\n          <li>${esc(colisTxt(p))}, ${colisN(p) === 1 ? 'avec son' : 'chacun avec son'} num\u00E9ro de suivi.${compLine(p)}</li>\n          <li><b>${SITE.retours.delaiJours} jours pour changer d\u2019avis.</b> ${retourOffert(p) ? 'Retour offert : nous payons le transport du retour.' : esc(retourTxt(p))}\n            <p class=\"fp-ret__h\">Comment se passe un retour</p>\n            <ol class=\"fp-ret\">${retourSteps(retourOffert(p)).map((t) => `<li>${t}</li>`).join('')}</ol></li>\n          <li>Garantie l\u00E9gale de 2 ans. <a href=\"#/livraison\">Tout sur la livraison</a></li>\n        </ul>`, 'id=\"fp-retour\"')}\n\n      ${faqs.length ? accI(I.ask, 'Questions', `<div class=\"fp-qs\">${faqs.map(([q, r]) => `<details class=\"fp-q\"><summary>${esc(q)}</summary><p>${esc(r)}</p></details>`).join('')}</div>`) : ''}\n      ${secReady(p) ? accI(I.shield, 'S\u00E9curit\u00E9 du produit', `<p>Votre contact pour toute question sur ce produit : ${esc(SITE.nom)}, ${esc(SITE.vendeur.adresse.replace(/, France$/, ''))}, <a href=\"mailto:${SITE.email}\">${SITE.email}</a>.</p>\n          <div class=\"sec-list\">\n            <div class=\"fp-ref\"><h3>R\u00E9f\u00E9rence</h3>${refHtml(p, PDP.initColor, PDP.size)}</div>\n            <div><h3>Fabricant</h3><p>${person(p.securite.fabricant)}</p></div>\n            <div><h3>Responsable dans l'UE</h3><p>${person(p.securite.responsableUE)}</p></div>\n            <div><h3>Garantie</h3><p>Garantie l\u00E9gale de conformit\u00E9 de 2 ans.</p></div>\n          </div>`) : ''}\n      <div class=\"fp-after\">\n        ${notYet(p) ? '' : keepBlock(p)}\n        <p class=\"fp-contact\">Une question avant de commander ? \u00C9crivez-nous \u00E0 ${mailLink('')} : la r\u00E9ponse arrive ${reponse()}.</p>\n      </div>\n    </section>\n\n    ${related.length ? `<section class=\"wrap fp-sec panel fp-rel\">\n      <div class=\"rail-head\">\n        <div class=\"fp-rel__head\">\n          <h2 class=\"t-2 fp-h\">${p.collection === 'canapes' ? 'Pour finir le salon' : isSleep(p) ? 'Pour finir la chambre' : 'Pour aller avec'}</h2>\n        </div>\n        <div class=\"rail-ctrl\">\n          <button class=\"round\" type=\"button\" data-action=\"rail\" data-dir=\"-1\" aria-label=\"Pi\u00E8ces pr\u00E9c\u00E9dentes\">${I.chevL}</button>\n          <button class=\"round\" type=\"button\" data-action=\"rail\" data-dir=\"1\" aria-label=\"Pi\u00E8ces suivantes\">${I.chevR}</button>\n        </div>\n      </div>\n      ${salonBlock(p, c0.nom)}\n      <div class=\"rail\" data-rail data-lenis-prevent-wheel tabindex=\"0\" aria-label=\"Pi\u00E8ces qui vont avec\">${related.map((x) => pcard(x, { reveal: false, quick: true, eager: true })).join('')}</div>\n      <div class=\"rail-progress\" aria-hidden=\"true\"><i data-rail-bar></i></div>\n    </section>` : ''}\n    ${footer()}`;\n    let scene;\n    if (tid === 'causeuse-arches') scene = { img: tab('incurve-sel', '960'), soft: true, tint: c0.hex };\n    else if (tid) scene = { img: isMobile() ? tab(tid, 'portrait-1080') : tab(tid, '1920') };\n    else scene = { img: tab(SOFT[slug] || 'incurve-sel', '960'), soft: true, tint: c0.hex };\n    return { title: `${p.nom}, ${p.type.toLowerCase()} \u00B7 Caplia`, html: holdImgs(html), scene, nav: p.collection, after: afterProduct, pdp: true };\n  }\n\n  /* Vitesse au t\u00E9l\u00E9phone : la premi\u00E8re photo de la fiche (fetchpriority=\"high\") part seule ; les autres images de la page\n     (photos suivantes, vignettes, cadeaux, pi\u00E8ces assorties) attendent qu'elle soit affich\u00E9e pour ne pas lui prendre le\n     d\u00E9bit (releaseImgs, appel\u00E9e par afterProduct). Leurs adresses passent dans data-hsrc / data-hsrcset en attendant. */\n  const holdTag = (t) => t.replace(/\\s(srcset|src)=\"/g, ' data-h$1=\"');\n  const holdImgs = (html) => html.replace(/<picture\\b[\\s\\S]*?<\\/picture>|<img\\b[^>]*>/g, (blk) => (/fetchpriority=\"high\"/.test(blk) ? blk : blk.replace(/<(?:img|source)\\b[^>]*>/g, holdTag)));\n  /* rend leurs adresses aux images mises en attente par holdImgs ; une adresse pos\u00E9e entre-temps (changement de couleur de\n     la fiche) n'est jamais \u00E9cras\u00E9e */\n  function unhold(root) {\n    const put = (el, k) => { const v = el.getAttribute('data-h' + k); el.removeAttribute('data-h' + k); if (v && !el.hasAttribute(k)) el.setAttribute(k, v); };\n    $$('source[data-hsrcset]', root).forEach((el) => put(el, 'srcset'));\n    $$('img[data-hsrcset], img[data-hsrc]', root).forEach((el) => { put(el, 'srcset'); put(el, 'src'); });\n  }\n  function releaseImgs(root) {\n    const lead = $('img[fetchpriority=\"high\"]', root);\n    let done = false;\n    const go = () => {\n      if (done) return;\n      done = true;\n      unhold(root);\n    };\n    if (!lead || (lead.complete && lead.naturalWidth)) { requestAnimationFrame(go); return; }\n    lead.addEventListener('load', () => requestAnimationFrame(go), { once: true });\n    lead.addEventListener('error', go, { once: true });\n    setTimeout(go, 3000);\n  }\n\n  /* Aller \u00E0 une image de la galerie (i = num\u00E9ro de diapositive) */\n  function fpGo(i, instant) {\n    const tr = $('[data-fp-track]');\n    if (!tr || !PDP.slides) return;\n    const n = PDP.slides.length;\n    i = ((i % n) + n) % n;\n    PDP.lockTo = i; clearTimeout(PDP.lockT); PDP.lockT = setTimeout(() => { PDP.lockTo = null; }, 1200);\n    tr.scrollTo({ left: i * tr.clientWidth, behavior: instant || reduce ? 'auto' : 'smooth' });\n    fpSync(i);\n  }\n  /* Met \u00E0 jour vignettes, loupe et \u00E9tat quand la diapositive change */\n  function fpSync(i) {\n    if (!PDP.slides || i === PDP.slide && PDP.synced) return;\n    PDP.synced = true;\n    PDP.slide = i;\n    const s = PDP.slides[i];\n    PDP.img = s.kind === 'photo' ? imgIndex(s) : -1;\n    $$('.fp-thumb').forEach((t) => t.setAttribute('aria-selected', String(Number(t.dataset.i) === i)));\n    const act = $(`.fp-thumb[data-i=\"${i}\"]`);\n    if (act) { const box = act.parentElement; const l = act.offsetLeft - (box.clientWidth - act.offsetWidth) / 2; box.scrollTo({ left: Math.max(0, l), behavior: reduce ? 'auto' : 'smooth' }); }\n    const z = $('.fp-zoom'); if (z) z.hidden = !s.zoom;\n    const stg = $('[data-fp-stage]'); if (stg) stg.classList.toggle('on-studio', s.kind === 'studio');\n    fpVideo(i);\n  }\n  /* vid\u00E9o de la galerie : charg\u00E9e seulement quand sa diapositive s'affiche, lue muette en boucle, arr\u00EAt\u00E9e ailleurs.\n     Ordinateur (mosa\u00EFque, toutes les cases visibles) : c'est vidWatch qui la lance quand sa case est \u00E0 l'\u00E9cran. */\n  const DESK = matchMedia('(min-width: 981px)');\n  const vidPlay = (v) => {\n    if (!v.getAttribute('src')) { v.src = v.dataset.src; v.preload = 'auto'; }\n    if (!reduce) { const pr = v.play(); if (pr && pr.catch) pr.catch(() => { v.controls = true; }); }\n  };\n  /* 18/10 (audit 01 Mo1) : sur ordinateur, la vid\u00E9o se lance, muette et en boucle, quand la moiti\u00E9 de sa case est \u00E0 l'\u00E9cran */\n  function vidWatch(root) {\n    if (PDP.vio) { PDP.vio.disconnect(); PDP.vio = null; }\n    const vids = DESK.matches ? $$('[data-fp-track] .fp-video', root) : [];\n    if (!vids.length || !('IntersectionObserver' in window)) return;\n    PDP.vio = new IntersectionObserver((ents) => ents.forEach((en) => {\n      if (en.isIntersecting) vidPlay(en.target); else if (!en.target.paused) en.target.pause();\n    }), { threshold: 0.5 });\n    vids.forEach((v) => PDP.vio.observe(v));\n  }\n  function fpVideo(i) {\n    if (DESK.matches) return;\n    $$('[data-fp-track] .fp-video').forEach((v) => {\n      const on = Number(v.closest('.fp-slide').dataset.i) === i;\n      if (!on) { if (!v.paused) v.pause(); return; }\n      vidPlay(v);\n    });\n  }\n  const imgIndex = (s) => (PDP.p ? PDP.p.images.findIndex((im) => im.id === s.id) : -1);\n  /* Compatibilit\u00E9 : k = num\u00E9ro de photo du catalogue (-1 = studio) */\n  function pdpShow(k) {\n    if (!PDP.slides) return;\n    const im = k >= 0 && PDP.p.images[k];\n    const i = im ? PDP.slides.findIndex((s) => s.id === im.id) : 0;\n    fpGo(i < 0 ? 0 : i);\n  }\n\n  /* Changement de couleur : toute la galerie est remplac\u00E9e (fondu court), en gardant la m\u00EAme vue quand la\n     nouvelle couleur l'a (profil reste profil, plan reste plan) ; l'image principale est charg\u00E9e avant d'appara\u00EEtre. */\n  function setGallery(k, instant) {\n    const p = PDP.p, tr = $('[data-fp-track]'), th = $('.fp-thumbs');\n    if (!tr || !th) return;\n    const seq = ++PDP.galSeq;\n    const cur = PDP.slides && PDP.slides[PDP.slide];\n    const slides = gallerySlides(p, k);\n    const keep = cur ? slides.findIndex((x) => x.key === cur.key) : -1;\n    const i = keep < 0 ? 0 : keep;\n    const box = document.createElement('div');\n    box.innerHTML = fr(slides.map((x, j) => slideHtml(p, x, j)).join(''));\n    /* l'image visible tout de suite : charg\u00E9e sans attendre, et d\u00E9cod\u00E9e avant le fondu d'entr\u00E9e */\n    const target = box.children[i];\n    const main = target && target.querySelector('img');\n    if (main) { main.loading = 'eager'; main.setAttribute('fetchpriority', 'high'); }\n    const ready = main && !instant && !reduce\n      ? Promise.race([main.decode ? main.decode().catch(() => {}) : Promise.resolve(), new Promise((ok) => setTimeout(ok, 450))])\n      : Promise.resolve();\n    const apply = () => {\n      if (seq !== PDP.galSeq || !tr.isConnected) return;\n      tr.replaceChildren(...box.childNodes);\n      stageSet(p, k);\n      th.innerHTML = fr(slides.map((x, j) => thumbHtml(x, j, i)).join(''));\n      fitGallery();\n      th.style.setProperty('--n', slides.length);\n      if (PDP.thumbsMore) PDP.thumbsMore();\n      PDP.slides = slides; PDP.galColor = k; PDP.synced = false;\n      PDP.lockTo = i; clearTimeout(PDP.lockT); PDP.lockT = setTimeout(() => { PDP.lockTo = null; }, 400);\n      tr.scrollLeft = i * tr.clientWidth;\n      PDP.slide = -1; fpSync(i);\n      vidWatch(tr.parentElement);\n      tr.classList.remove('is-swap');\n    };\n    if (instant || reduce) { apply(); return; }\n    tr.classList.add('is-swap');\n    Promise.all([ready, new Promise((ok) => setTimeout(ok, 200))]).then(apply);\n  }\n\n  function pdpPrice() {\n    const p = PDP.p;\n    const size = p.tailles ? p.tailles[PDP.size].nom : '';\n    const v = price(unitPriceOf(p, size));\n    $$('[data-pdp-price]').forEach((el) => { if (el.textContent !== v) el.textContent = v; });\n    const fx = $('.fp__4x[data-pp4x]'); if (fx) { fx.dataset.amount = String(unitPriceOf(p, size)); pp4xRender(fx.parentNode); }\n    const gl = $('[data-pdp-gift]'); if (gl) gl.innerHTML = fr(giftLine(p));\n    const rc = $('[data-pdp-recu]'); if (rc) rc.innerHTML = fr(recuHtml(p));\n  }\n  function pdpSize(k) {\n    const p = PDP.p;\n    if (!p.tailles || !p.tailles[k] || sizeOutFor(p.tailles[k], p.couleurs[PDP.color].nom)) return;\n    PDP.size = k;\n    PDP.done.color = true; pdpSteps();\n    $$('[data-action=\"pdp-size\"]').forEach((b) => b.setAttribute('aria-checked', String(Number(b.dataset.k) === k)));\n    const s = $('[data-pdp-sizename]'); if (s) s.textContent = p.tailles[k].nom;\n    pdpPrice();\n    refSync();\n    /* boutique : les boutons de paiement express suivent la variante choisie (adaptateur Shopify) */\n    if (typeof SHOP_EXPRESS_SYNC === 'function') SHOP_EXPRESS_SYNC();\n  }\n  function pdpColor(k, silent) {\n    const p = PDP.p;\n    PDP.color = k;\n    PDP.done.color = true; pdpSteps();\n    const c = p.couleurs[k];\n    $$('[data-action=\"pdp-color\"]').forEach((b) => b.setAttribute('aria-checked', String(Number(b.dataset.k) === k)));\n    $('[data-pdp-colname]').textContent = c.nom;\n    const ef = $('[data-ens-first]');\n    if (ef && !isOut(c)) ef.innerHTML = fr(pieceFit(p, c.nom, 72));\n    /* la teinte en mots, \u00E9crite devant la vraie photo (catalogue.json > couleurs > teinte) */\n    const te = $('[data-pdp-teinte]'); if (te) te.textContent = c.teinte || '';\n    const out = isOut(c), blocked = out || notYet(p);\n    const soon = $('[data-pdp-soon]'); if (soon) soon.hidden = !out;\n    const add = $('[data-buy] [data-action=\"pdp-add\"]'); if (add) add.hidden = blocked;\n    const ex = $('[data-buy] .fp-express'); if (ex) ex.hidden = blocked;\n    const nf = $('[data-notify]');\n    if (nf) { nf.hidden = !blocked; nf.classList.remove('is-sent'); $('[data-notify-msg]', nf).hidden = true; }\n    const bb = $('#buybar [data-action=\"pdp-add\"] .cta__label'); if (bb) bb.textContent = blocked ? 'Me pr\u00E9venir' : 'Ajouter au panier';\n    /* tailles : celles \u00E9puis\u00E9es dans cette couleur sont barr\u00E9es ; la taille choisie passe \u00E0 la premi\u00E8re en vente */\n    if (p.tailles && p.tailles.length > 1) {\n      $$('[data-action=\"pdp-size\"]').forEach((b) => { const t = p.tailles[Number(b.dataset.k)]; b.outerHTML = sizePill(t, Number(b.dataset.k), Number(b.dataset.k) === PDP.size, c.nom); });\n      if (sizeOutFor(p.tailles[PDP.size], c.nom)) { const k2 = p.tailles.findIndex((t) => !sizeOutFor(t, c.nom)); if (k2 >= 0) pdpSize(k2); }\n    }\n    /* la photo de \u00AB de pr\u00E8s \u00BB et la vignette de la barre d'achat suivent la couleur */\n    const st = $('[data-story-img]'), v = storyPic(p, k);\n    if (st) {\n      if (v && st.getAttribute('src') !== v.src) { st.src = v.src; st.alt = v.alt; }\n      if (!v) { st.removeAttribute('src'); st.alt = ''; }\n      st.parentElement.hidden = !v;\n      $('[data-story]').classList.toggle('fp-story--txt', !v);\n    }\n    /* le gros plan de la mati\u00E8re (volet repli\u00E9) suit la couleur */\n    const mi = $('[data-mat-img]'), mv = matPic(p, k);\n    if (mi) {\n      if (mv && mi.getAttribute('src') !== mv.src) { mi.srcset = mv.srcset; mi.src = mv.src; mi.alt = mv.alt; }\n      if (!mv) { mi.removeAttribute('srcset'); mi.removeAttribute('src'); mi.alt = ''; }\n      mi.parentElement.hidden = !mv;\n    }\n    const bt = $('#buybar .buybar__thumb'); if (bt) bt.innerHTML = fr(tightThumb(p, out ? studioColor(p) : c.nom));\n    /* 18/10 (audit 02 Mi3) : le bloc \u00AB de pr\u00E8s \u00BB (mati\u00E8re, plan, photo en situation) suit la couleur choisie */\n    if (PDP.moColor !== k) {\n      PDP.moColor = k;\n      const mo = $('.mos'), box = document.createElement('div');\n      box.innerHTML = fr(momentsHtml(p, k));\n      const nu = box.firstElementChild, fp = $('.fp');\n      if (mo && nu) mo.replaceWith(nu); else if (mo) mo.remove(); else if (nu && fp) fp.after(nu);\n    }\n    refSync();\n    if (typeof SHOP_EXPRESS_SYNC === 'function') SHOP_EXPRESS_SYNC();\n    /* la galerie ne montre que la couleur choisie */\n    if (PDP.galColor !== k) setGallery(k, silent);\n    /* adresse partageable : la fiche s'ouvrira sur cette couleur */\n    if (!silent) { try { history.replaceState(history.state, '', SHOP_URL(p, c.nom)); } catch (e) { /* rien */ } }\n  }\n  function afterProduct(root) {\n    const p = PDP.p;\n    releaseImgs(root);\n    pp4xRender(root);\n    vidWatch(root);\n    cleanups.push(() => { if (PDP.vio) { PDP.vio.disconnect(); PDP.vio = null; } });\n    /* un toucher sur la photo l'agrandit (comme la loupe) ; un glissement de la galerie, non */\n    const trk = $('[data-fp-track]', root);\n    if (trk) {\n      let sx = 0, sy = 0;\n      trk.addEventListener('pointerdown', (e) => { sx = e.clientX; sy = e.clientY; });\n      trk.addEventListener('click', (e) => {\n        if (Math.hypot(e.clientX - sx, e.clientY - sy) > 8 || !e.target.closest('.fp-slide img')) return;\n        /* 23/10 : la visionneuse s'ouvre sur la photo touch\u00E9e (sur ordinateur, les photos sont en grille et PDP.slide restait \u00E0 0) */\n        const k = [...trk.querySelectorAll('.fp-slide')].indexOf(e.target.closest('.fp-slide'));\n        if (k >= 0) PDP.slide = k;\n        const z = $('.fp-zoom', root);\n        if (z && !z.hidden) z.click();\n      });\n    }\n    PDP.synced = false;\n    const tr = $('[data-fp-track]', root);\n    if (tr) {\n      let raf = 0;\n      const onScroll = () => { if (raf) return; raf = requestAnimationFrame(() => {\n        raf = 0;\n        const i = Math.round(tr.scrollLeft / Math.max(1, tr.clientWidth));\n        if (PDP.lockTo != null) { if (i !== PDP.lockTo) return; PDP.lockTo = null; }\n        fpSync(i);\n      }); };\n      tr.addEventListener('scroll', onScroll, { passive: true });\n      tr.addEventListener('keydown', (e) => { if (e.target !== tr) return; if (e.key === 'ArrowRight') { e.preventDefault(); fpGo(PDP.slide + 1); } else if (e.key === 'ArrowLeft') { e.preventDefault(); fpGo(PDP.slide - 1); } });\n      const onResize = () => fpGo(PDP.slide, true);\n      window.addEventListener('resize', onResize);\n      /* le cadre change de proportion (fen\u00EAtre, t\u00E9l\u00E9phone tourn\u00E9) : chaque photo est recadr\u00E9e sans couper la pi\u00E8ce */\n      fitGallery();\n      const ro = typeof ResizeObserver === 'function' ? new ResizeObserver(() => fitGallery()) : null;\n      if (ro) ro.observe(tr);\n      cleanups.push(() => { window.removeEventListener('resize', onResize); cancelAnimationFrame(raf); if (ro) ro.disconnect(); });\n    }\n    /* actions propres \u00E0 la fiche (galerie, lien vers \u00AB Il passe chez vous \u00BB) */\n    const onClick = (e) => {\n      const b = e.target.closest('[data-fp]');\n      if (!b || !root.contains(b)) return;\n      const a = b.dataset.fp;\n      if (a === 'prev') fpGo(PDP.slide - 1);\n      else if (a === 'next') fpGo(PDP.slide + 1);\n      else if (a === 'go') fpGo(Number(b.dataset.i));\n      else if (a === 'avis') {\n        const sec = $('#fp-avis');\n        if (sec) { if (lenis) lenis.scrollTo(sec, { offset: -80 }); else sec.scrollIntoView({ behavior: reduce ? 'auto' : 'smooth' }); }\n      }\n      else if (a === 'avis-more') {\n        const more = $$('[data-avis-more]');\n        more.forEach((li) => { li.hidden = false; });\n        b.remove();\n        if (more[0]) { more[0].setAttribute('tabindex', '-1'); more[0].focus({ preventScroll: true }); }\n      }\n      else if (a === 'passe') toPasse(true);\n    };\n    root.addEventListener('click', onClick);\n    cleanups.push(() => root.removeEventListener('click', onClick));\n    /* \u00AB Il passe chez vous \u00BB : l'outil de la porte, plus bas sur la fiche ; ?s=passe y m\u00E8ne en arrivant (lien de l'accueil) */\n    function toPasse(smooth) {\n      const sec = $('#fp-passe', root);\n      if (!sec) return;\n      sec.open = true;\n      const y = sec.getBoundingClientRect().top + scrollY - 80;\n      if (lenis) lenis.scrollTo(y, { immediate: !smooth, force: true }); else window.scrollTo({ top: y, behavior: smooth && !reduce ? 'smooth' : 'auto' });\n      setTimeout(() => { const f = $('#door-w', root); if (f) f.focus({ preventScroll: true }); }, smooth && !reduce ? 700 : 0);\n    }\n    /* \u00AB Recevoir cette fiche \u00BB : \u00C9chap referme le panneau et rend la main au bouton */\n    const kf = $('[data-keep-form]', root);\n    if (kf) {\n      const onKey = (e) => { if (e.key !== 'Escape') return; kf.hidden = true; const o = $('[data-action=\"keep-open\"]', root); if (o) { o.setAttribute('aria-expanded', 'false'); o.focus(); } };\n      kf.addEventListener('keydown', onKey);\n      cleanups.push(() => kf.removeEventListener('keydown', onKey));\n    }\n    /* Porte : la r\u00E9ponse arrive d\u00E8s qu'on quitte le champ, sans chercher le bouton (S3) */\n    const dw = $('#door-w', root);\n    if (dw) {\n      const onDoor = () => { if (dw.value && dw.form.requestSubmit) dw.form.requestSubmit(); };\n      dw.addEventListener('change', onDoor);\n      cleanups.push(() => dw.removeEventListener('change', onDoor));\n    }\n    fpSync(0);\n    if (PDP.initColor) pdpColor(PDP.initColor, true);\n    pdpSteps();\n    setupRail(root);\n    const sante = Promise.resolve();\n    /* arriv\u00E9e par ?s=passe : on descend \u00E0 l'outil une fois le confort compl\u00E9t\u00E9 (sa hauteur change ce qui est au-dessus) */\n    if (qsAll().get('s') === 'passe') {\n      sante.then(() => { const t = setTimeout(() => { if (PDP.p === p && root.isConnected) toPasse(false); }, 80); cleanups.push(() => clearTimeout(t)); });\n    }\n    /* t\u00E9l\u00E9phone : la rang\u00E9e de vignettes s'estompe \u00E0 droite tant qu'il en reste \u00E0 voir */\n    const th = $('.fp-thumbs', root);\n    if (th) {\n      const more = () => th.classList.toggle('is-more', th.scrollLeft + th.clientWidth < th.scrollWidth - 4);\n      th.addEventListener('scroll', more, { passive: true });\n      window.addEventListener('resize', more);\n      PDP.thumbsMore = more; more();\n      cleanups.push(() => { window.removeEventListener('resize', more); PDP.thumbsMore = null; });\n    }\n    /* barre d'achat (t\u00E9l\u00E9phone, et ordinateur depuis le 18/10 : une carte \u00E0 la place et \u00E0 la largeur de la colonne d'achat) */\n    const bar = $('#buybar');\n    bar.innerHTML = fr(`<span class=\"buybar__thumb\">${tightThumb(p, studioColor(p))}</span>\n      <span class=\"buybar__info\"><b>${esc(p.nom)} \u00B7 <span data-pdp-price>${price(unitPriceOf(p, p.tailles ? p.tailles[PDP.size].nom : ''))}</span></b><span>${onSale(p) ? deliveryShort(p) : notYet(p) ? 'Livraison offerte' : 'Bient\u00F4t de retour'}</span></span>\n      <button class=\"btn btn--sm\" type=\"button\" data-action=\"pdp-add\"><span class=\"cta__label\">${isOut(p.couleurs[PDP.color]) || notYet(p) ? 'Me pr\u00E9venir' : 'Ajouter au panier'}</span></button>`);\n    bar.hidden = false;\n    const buy = $('.fp__buy', root);\n    const barFit = () => {\n      if (!buy || !DESK.matches) { bar.style.removeProperty('--bb-l'); bar.style.removeProperty('--bb-w'); return; }\n      const r = buy.getBoundingClientRect();\n      bar.style.setProperty('--bb-l', `${Math.round(r.left)}px`);\n      bar.style.setProperty('--bb-w', `${Math.round(r.width)}px`);\n    };\n    barFit();\n    window.addEventListener('resize', barFit);\n    cleanups.push(() => { window.removeEventListener('resize', barFit); bar.style.removeProperty('--bb-l'); bar.style.removeProperty('--bb-w'); });\n    const ctas = $('[data-buy]', root);\n    if ('IntersectionObserver' in window && ctas) {\n      /* la position est relue \u00E0 chaque d\u00E9filement (un saut ne croise pas le bouton) */\n      let raf = 0;\n      const place = () => {\n        raf = 0;\n        /* 08/10 (audit avant la pub, le\u00E7on de dapple) : le prix et le bouton visibles d\u00E8s l'arriv\u00E9e sur t\u00E9l\u00E9phone. La barre\n           se montre d\u00E8s que le bouton principal n'est pas \u00E0 l'\u00E9cran, au-dessus (d\u00E9pass\u00E9) ou en dessous (pas encore atteint) ;\n           jamais deux boutons \u00E0 l'\u00E9cran. */\n        const r = ctas.getBoundingClientRect();\n        bar.classList.toggle('is-on', r.height > 0 && (r.bottom < 0 || r.top > window.innerHeight - bar.offsetHeight));\n      };\n      const onSc = () => { if (!raf) raf = requestAnimationFrame(place); };\n      window.addEventListener('scroll', onSc, { passive: true });\n      place();\n      const io = { disconnect: () => { window.removeEventListener('scroll', onSc); cancelAnimationFrame(raf); } };\n      const ft = $('.foot', root) || $('.foot');\n      const io2 = ft ? new IntersectionObserver((ents) => { ents.forEach((en) => bar.classList.toggle('is-foot', en.isIntersecting)); }, { threshold: 0 }) : null;\n      if (io2) io2.observe(ft);\n      cleanups.push(() => { io.disconnect(); if (io2) io2.disconnect(); });\n    } else bar.classList.add('is-on');\n    cleanups.push(() => { bar.hidden = true; bar.classList.remove('is-on', 'is-foot'); bar.innerHTML = ''; });\n  }\n\n  /* ---------------- Panier ---------------- */\n  /* Barre d\u00E9j\u00E0 commenc\u00E9e : la pi\u00E8ce choisie coche la premi\u00E8re \u00E9tape, puis les 3 paliers,\n     pos\u00E9s \u00E0 intervalles \u00E9gaux (la barre avance par morceaux entre deux paliers) */\n  const gaugePos = (total) => {\n    const S = [0].concat(SITE.paliers.map((pl) => pl.seuil));\n    const n = S.length - 1;\n    if (total >= S[n]) return 1;\n    const i = S.findIndex((s, k) => total >= s && total < S[k + 1]);\n    return (i + (total - S[i]) / (S[i + 1] - S[i])) / n;\n  };\n  /* Jauge sobre (CHARTE) : un filet fin, de petits points, aucun pictogramme */\n  const plural = (g) => /s$/.test(g.split(' ')[0]);\n  /* up : suggestions affich\u00E9es sous la jauge. Quand elles d\u00E9bloquent le cadeau suivant, la jauge ne r\u00E9p\u00E8te\n     plus le montant manquant : elle dit seulement ce qui est d\u00E9j\u00E0 offert. Juste apr\u00E8s un ajout, la confirmation\n     s'affiche au-dessus des suggestions (l\u00E0 o\u00F9 se trouve le regard), ou dans la jauge s'il n'y en a plus. */\n  function gaugeHtml(total, up) {\n    const P = SITE.paliers;\n    const done = giftsFor(total);\n    const next = P.find((pl) => total < pl.seuil);\n    const shortOf = (pl) => GIFT_SHORT[P.indexOf(pl)];\n    const nextG = next ? shortOf(next) : '';\n    const saved = giftsSaved(done);\n    const doneTxt = done.length ? `${cap1(andList(done.map(shortOf)))} offert${done.length > 1 || plural(shortOf(done[0])) ? 's' : ''}${saved ? ` : vous \u00E9conomisez <strong>${price(saved)}</strong>` : ''}.` : '';\n    const flash = UP.flash && !up ? UP.flash : '';\n    const msg = flash\n      ? esc(flash)\n      : !next\n        ? `Vos trois cadeaux sont offerts : ${andList(P.map(shortOf))}${saved ? `. Vous \u00E9conomisez <strong>${price(saved)}</strong>` : ''}.`\n        : up && up.mode !== 'finish'\n          ? doneTxt\n          : `${doneTxt ? doneTxt + ' ' : ''}Encore <strong>${price(next.seuil - total)}</strong> et ${plural(nextG) ? 'les' : 'le'} ${nextG} vous ${plural(nextG) ? 'sont offerts' : 'est offert'}${done.length ? ' aussi' : ''}.`;\n    const marks = [{ on: true, lbl: '', sub: '' }].concat(P.map((pl, i) => ({ on: total >= pl.seuil, lbl: cap1(GIFT_SHORT[i]), sub: price(pl.seuil), pl })));\n    const accIn = cart.some((l) => isAcc(BY[l.slug]));\n    const at = (i) => (i / (marks.length - 1)).toFixed(4);\n    return `<div class=\"gauge\" data-gauge>\n      ${msg ? `<p class=\"gauge__msg${flash ? ' is-new' : ''}\" tabindex=\"-1\">${msg}${GIFTS && GIFTS.paliers ? ' <a class=\"link gauge__see\" href=\"#/cadeaux\">Voir les cadeaux</a>' : ''}</p>` : ''}\n      <div class=\"gauge__track\" role=\"progressbar\" aria-label=\"Progression vers les cadeaux\" aria-valuemin=\"0\" aria-valuemax=\"${P[P.length - 1].seuil}\" aria-valuenow=\"${Math.min(total, P[P.length - 1].seuil)}\" aria-valuetext=\"${price(total)} sur ${price(P[P.length - 1].seuil)}\">\n        <span class=\"gauge__fill\" style=\"--p:${gaugePos(total).toFixed(4)}\"></span>\n        ${marks.map((m, i) => (i ? `<span class=\"gauge__mark ${m.on ? 'is-on' : ''}\" style=\"--at:${at(i)}\"></span>` : '')).join('')}\n      </div>\n      <ol class=\"gauge__labels\">${marks.map((m, i) => (m.lbl ? `<li class=\"${m.on ? 'is-on' : ''}${next && P[i - 1] === next ? ' is-next' : ''}\" style=\"--at:${at(i)}\"><span class=\"gauge__picw\">${giftPic(m.pl, 'gauge__pic')}</span><span>${m.lbl}</span>${m.sub ? `<small>${m.on ? `Offert${plural(GIFT_SHORT[i - 1]) ? 's' : ''}` : `d\u00E8s ${m.sub}`}</small>` : ''}</li>` : '')).join('')}</ol>\n      ${accIn ? '<p class=\"gauge__note\">Seuls les meubles comptent pour les cadeaux : vos coussins, plaids, tapis et poufs achet\u00E9s s\u2019ajoutent en plus.</p>' : ''}\n    </div>`;\n  }\n  /* Suggestions du panier : jusqu'\u00E0 trois pi\u00E8ces qui d\u00E9bloquent le cadeau suivant en un clic, sans quitter le panier.\n     Choix par code : en stock, pas d\u00E9j\u00E0 dans le panier, prix au moins \u00E9gal au manque et au plus pr\u00E8s (la moins ch\u00E8re\n     qui d\u00E9bloque). Avec un canap\u00E9, les pi\u00E8ces qui l'accompagnent passent seules si l'une suffit : jamais un second\n     canap\u00E9 quand une pi\u00E8ce moins ch\u00E8re fait l'affaire. Si aucune ne suffit seule : les trois qui rapprochent le plus.\n     Tous les cadeaux obtenus : une seule pi\u00E8ce qui compl\u00E8te le salon, sans parler d'argent.\n     Aurore (parents) : rien. Pi\u00E8ces secondaires : jamais (plan ma\u00EEtre O2). */\n  const SUGG = {\n    meridienne: ['miroir-onde', '160 \u00D7 50 cm'],\n    capiton: ['galet'], courbe: ['galet'], causeuse: ['galet'], 'petit-incurve': ['galet'], 'petit-mouton': ['galet'],\n    incurve: ['miroir-onde', '160 \u00D7 50 cm'], 'noix-de-cajou': ['miroir-onde', '160 \u00D7 50 cm']\n  };\n  const FINISH = ['galet', 'table-nuage', 'miroir-onde'];\n  const SUGG_SLEEP = { songe: ['dune'], brume: ['sillon'] };\n  const FINISH_SLEEP = ['dune', 'sillon'];\n  /* Ligne de b\u00E9n\u00E9fice : l'accroche du catalogue ; le miroir en 140 cm ne peut pas reprendre \u00AB 160 cm de haut \u00BB */\n  const UP_WHY = { 'miroir-onde': 'Bords ondul\u00E9s, pos\u00E9 au sol sans per\u00E7age.' };\n  const UP = { color: {}, flash: '' };\n  const kindOf = (p) => p.type.split(/\\s(?=\\d|\u00E0 |au |aux |en |avec |sur )/)[0].replace(/,\\s*(lot de|pour)$/, '').replace(/,$/, '');\n  const upSize = (p, need, color) => {\n    if (!p.tailles) return { v: p.prix, size: '' };\n    const t = p.tailles.filter((x) => !sizeOutFor(x, color)).sort((a, b) => a.prix - b.prix);\n    if (!t.length) return { v: null, size: null };\n    const ok = t.find((x) => x.prix >= need) || t[t.length - 1];\n    return { v: ok.prix, size: ok.nom };\n  };\n  /* Couleur par d\u00E9faut : celle du canap\u00E9 du panier si la pi\u00E8ce l'a, sinon la premi\u00E8re en stock */\n  function upColor(p) {\n    const keep = p.couleurs.find((c) => c.nom === UP.color[p.slug] && !c.rupture);\n    if (keep) return keep.nom;\n    const sofa = cart.filter((l) => BY[l.slug].collection === 'canapes' || isBed(BY[l.slug])).sort((a, b) => BY[b.slug].prix - BY[a.slug].prix)[0];\n    const same = sofa && p.couleurs.find((c) => c.nom === sofa.color && !c.rupture);\n    return same ? same.nom : p.couleurs[firstIn(p)].nom;\n  }\n  /* Les trois suggestions restent dans le m\u00EAme studio gris : parmi les quatre mieux plac\u00E9es, celles dont la vignette\n     est une image studio passent devant une photo d'ambiance (une seule place c\u00E9d\u00E9e au plus, l'ordre de prix est gard\u00E9) */\n  const studioFirst = (list) => { const top = list.slice(0, 4); return top.filter((x) => thumbIsStudio(x.p, x.color)).concat(top.filter((x) => !thumbIsStudio(x.p, x.color))).slice(0, 3).sort((a, b) => list.indexOf(a) - list.indexOf(b)); };\n  /* Avec un canap\u00E9 : Perle d'abord (le m\u00EAme cadeau, la meilleure marge), puis Mirage, puis Valse */\n  const UP_ORDER = ['galet', 'miroir-onde', 'berceuse'];\n  const upRank = (p) => { const i = UP_ORDER.indexOf(p.slug); return i < 0 ? UP_ORDER.length : i; };\n  /* Le premier cadeau est-il atteignable dans cet univers, une pi\u00E8ce de chaque en vente ? Caplia Sleep : non (838 \u20AC) */\n  const giftReachable = (sleep) => PRODS.filter((p) => isSleep(p) === sleep && onSale(p) && !isAcc(p))\n    .reduce((s, p) => s + prixMax(p), 0) >= SITE.paliers[0].seuil;\n  /* La jauge et les mots \u00AB cadeau \u00BB : seulement quand le cadeau suivant peut vraiment \u00EAtre atteint (jamais dans une chambre seule) */\n  const giftsShown = (base) => base >= SITE.paliers[0].seuil || !cart.length || !cart.every((l) => isSleep(BY[l.slug])) || giftReachable(true);\n  function upsell(total) {\n    if (!cart.length || cart.some((l) => l.slug === 'veilleuse')) return null;\n    const inCart = new Set(cart.map((l) => l.slug));\n    const sleep = cart.every((l) => isSleep(BY[l.slug]));\n    const pool = PRODS.filter((p) => isSleep(p) === sleep && !inCart.has(p.slug) && !SECONDARY.includes(p.slug) && p.slug !== 'veilleuse' && !isAcc(p) && onSale(p));\n    const next = SITE.paliers.find((pl) => total < pl.seuil);\n    /* Chambre seule, cadeau hors d'atteinte : les bouts de lit, \u00AB Pour finir la chambre \u00BB, sans parler de cadeau */\n    if (!giftsShown(total)) {\n      const items = FINISH_SLEEP.map((k) => BY[k]).filter((x) => x && pool.includes(x)).map((p) => { const color = upColor(p); return { p, ...upSize(p, 0, color), color }; }).filter((x) => x.v != null);\n      return items.length ? { mode: 'room', sleep, items } : null;\n    }\n    if (!next) {\n      const S = sleep ? SUGG_SLEEP : SUGG;\n      const lead = cart.map((l) => BY[l.slug]).filter((p) => S[p.slug]).sort((a, b) => b.prix - a.prix)[0];\n      const [slug, sz] = lead ? S[lead.slug] : [];\n      const p = [slug].concat(sleep ? FINISH_SLEEP : FINISH).map((k) => BY[k]).find((x) => x && pool.includes(x));\n      if (!p) return null;\n      const t = p.tailles ? p.tailles.find((x) => p.slug === slug && x.nom === sz) || p.tailles[p.tailles.length - 1] : null;\n      return { mode: 'finish', sleep, items: [{ p, v: t ? t.prix : p.prix, size: t ? t.nom : '', color: upColor(p) }] };\n    }\n    const need = next.seuil - total;\n    const hasSofa = cart.some((l) => BY[l.slug].collection === 'canapes'), hasBed = cart.some((l) => isBed(BY[l.slug]));\n    const sofa2 = (x) => (hasSofa && x.p.collection === 'canapes') || (hasBed && isBed(x.p));\n    const all = pool.map((p) => { const color = upColor(p); return { p, ...upSize(p, need, color), color }; }).filter((x) => x.v != null);\n    /* Petit panier (un fauteuil : moins de 600 \u20AC, sans canap\u00E9 ni lit) : l'autre fauteuil et le miroir, jamais un canap\u00E9\n       \u00E0 plus de 1 000 \u20AC ; aucun palier n'est franchi, donc aucun mot de cadeau (\u00AB Pour aller avec \u00BB) */\n    if (!hasSofa && !hasBed && total < 600) {\n      const small = all.filter((x) => (x.p.collection === 'fauteuils' || x.p.collection === 'decoration') && x.v < need)\n        .sort((a, b) => upRank(a.p) - upRank(b.p) || a.v - b.v).slice(0, 3);\n      if (small.length) return { mode: 'pair', sleep, next, items: small };\n    }\n    const unlock = all.filter((x) => x.v >= need);\n    const light = unlock.filter((x) => !sofa2(x));\n    /* jamais un second lit : sans pi\u00E8ce l\u00E9g\u00E8re qui suffise, on montre celles qui rapprochent du cadeau */\n    const items = studioFirst((light.length ? light : hasBed ? [] : unlock).sort((a, b) => (hasSofa ? upRank(a.p) - upRank(b.p) : 0) || a.v - b.v));\n    if (items.length) return { mode: 'unlock', sleep, next, items };\n    const closer = studioFirst(all.filter((x) => !sofa2(x)).sort((a, b) => b.v - a.v));\n    return closer.length ? { mode: 'closer', sleep, next, items: closer } : null;\n  }\n  function upCard({ p, v, size, color }) {\n    const cs = p.couleurs.filter((c) => !c.rupture);\n    const cm1 = size ? ` ${size.split(' \u00D7 ')[0]} cm` : '';\n    const sw = cs.length > 1 ? `<div class=\"up__sw\" role=\"radiogroup\" aria-label=\"Couleur de ${esc(p.nom)}\">${cs.map((c) => `<button class=\"swatch\" type=\"button\" role=\"radio\" aria-checked=\"${c.nom === color}\" aria-label=\"${esc(c.nom)}\" title=\"${esc(c.nom)}\" style=\"--c:${c.hex}\" data-action=\"up-color\" data-slug=\"${p.slug}\" data-color=\"${esc(c.nom)}\"></button>`).join('')}<span class=\"up__cn\">${esc(color)}</span></div>` : '';\n    return `<li class=\"up__item\" data-up=\"${p.slug}\">\n      <a class=\"up__img\" href=\"#/p/${p.slug}\" tabindex=\"-1\" aria-hidden=\"true\">${upThumb(p, color, '(max-width: 760px) 80px, 280px')}</a>\n      <div class=\"up__txt\">\n        <p class=\"up__name\"><a href=\"#/p/${p.slug}\">${esc(p.nom)}</a></p>\n        <p class=\"up__why\">${esc(kindOf(p) + cm1)}. ${esc(UP_WHY[p.slug] || p.accroche.join(' '))}</p>\n        ${sw}\n      </div>\n      <div class=\"up__buy\">\n        <p class=\"up__price num\">${price(v)}</p>\n        <button class=\"up__add\" type=\"button\" data-action=\"up-add\" data-slug=\"${p.slug}\" data-color=\"${esc(color)}\"${size ? ` data-size=\"${esc(size)}\"` : ''} aria-label=\"Ajouter ${esc(p.nom)}${cm1}, ${esc(color)}, au panier\">Ajouter</button>\n      </div>\n    </li>`;\n  }\n  /* Le plaid vendu seul (79 \u20AC), propos\u00E9 au panier seulement sous le premier palier (un fauteuil, un banc, une t\u00EAte de lit) :\n     au-dessus, le panier annonce le plaid offert et ne doit jamais le vendre \u00E0 c\u00F4t\u00E9 (supervision du 08/10). S'il devient\n     offert plus tard, plaidSwap() retire la ligne pay\u00E9e. Les accessoires ne comptent pas pour les paliers (giftBase). */\n  const ADDON = 'plaid';\n  const addonItem = (p, color) => ({ p, v: p.prix, size: '', color });\n  function addonHtml(base) {\n    const p = BY[ADDON];\n    if (!p || !onSale(p) || cart.some((l) => l.slug === ADDON) || !cart.some((l) => !isAcc(BY[l.slug]))) return '';\n    if (base >= SITE.paliers[0].seuil) return '';\n    return `<section class=\"up up--addon\" aria-labelledby=\"addon-h\">\n      <h2 class=\"up__head\" id=\"addon-h\">Le plaid qui va avec</h2>\n      <ul class=\"up__list\">${upCard(addonItem(p, upColor(p)))}</ul>\n    </section>`;\n  }\n  function upHtml(u, total) {\n    if (!u) return '';\n    const pl = u.next;\n    const also = giftsFor(total).length ? 'aussi ' : '';\n    const head = u.mode === 'room' ? 'Pour finir la chambre'\n      : u.mode === 'pair' ? 'Pour aller avec'\n      : u.mode === 'finish'\n      ? (u.sleep ? 'Pour compl\u00E9ter votre chambre' : 'Pour compl\u00E9ter votre salon')\n      : u.mode === 'unlock'\n        ? `${u.items.length > 1 ? \"Ajoutez l'une de ces pi\u00E8ces\" : 'Ajoutez cette pi\u00E8ce'} et recevez ${also}${esc(pl.cadeau)}, ${lc1(giftWord(pl))}.`\n        : `Ces pi\u00E8ces vous rapprochent du cadeau suivant, ${esc(lc1(giftLabel(pl)))}.`;\n    return `<section class=\"up up--${u.mode}\" aria-labelledby=\"up-h\">\n      ${UP.flash ? `<p class=\"up__ok\">${esc(UP.flash)}</p>` : ''}\n      <h2 class=\"up__head\" id=\"up-h\" tabindex=\"-1\">${head}</h2>\n      <ul class=\"up__list\">${u.items.map(upCard).join('')}</ul>\n    </section>`;\n  }\n  /* Ajout depuis une suggestion : le panier se met \u00E0 jour sur place, la jauge avance, un message confirme\n     le cadeau, les suggestions passent au palier suivant, la page ne bouge pas et le focus reste dans le bloc. */\n  function upAdd(btn) {\n    const p = BY[btn.dataset.slug];\n    if (!p) return;\n    const size = btn.dataset.size || (p.tailles ? p.tailles[0].nom : '');\n    const before = giftsFor(giftBase()).length;\n    addToCart(p.slug, btn.dataset.color, size, 1, true);\n    const won = giftsFor(giftBase()).slice(before);\n    const g = won.length ? GIFT_SHORT[SITE.paliers.indexOf(won[won.length - 1])] : '';\n    const said = g ? `${plural(g) ? 'Les' : 'Le'} ${g} vous ${plural(g) ? 'sont offerts' : 'est offert'}.` : '';\n    UP.flash = said || `${p.nom} est dans votre panier.`;\n    /* Le bloc des suggestions est sous les lignes : la nouvelle ligne le pousse vers le bas. On garde le bloc \u00E0 la m\u00EAme\n       place \u00E0 l'\u00E9cran, pour que le regard ne perde pas le message de confirmation. */\n    const y = window.scrollY;\n    const up0 = $('.up');\n    const top0 = up0 ? up0.getBoundingClientRect().top + y : null;\n    const key = lineKey({ slug: p.slug, color: colorIn(p, btn.dataset.color), size });\n    refreshCart();\n    UP.flash = '';\n    const up1 = $('.up');\n    const to = top0 != null && up1 ? y + (up1.getBoundingClientRect().top + window.scrollY - top0) : y;\n    if (Math.abs(window.scrollY - to) > 1) { if (lenis) lenis.scrollTo(to, { immediate: true }); else window.scrollTo({ top: to, behavior: 'instant' }); }\n    const live = $('[data-cart-live]');\n    if (live) { live.textContent = ''; setTimeout(() => { live.textContent = `${p.nom} ajout\u00E9 au panier. ${said}`.trim(); }, 60); }\n    const li = $$('.line').find((x) => x.dataset.line === key);\n    if (li && !reduce) li.classList.add('is-new');\n    const f = $('#up-h') || $('.gauge__msg');\n    if (f) f.focus({ preventScroll: true });\n  }\n  function upColorPick(btn) {\n    const p = BY[btn.dataset.slug];\n    const li = btn.closest('.up__item');\n    if (!p || !li) return;\n    UP.color[p.slug] = btn.dataset.color;\n    const u = upsell(giftBase());\n    const x = (u && u.items.find((i) => i.p === p)) || (li.closest('.up--addon') ? addonItem(p, btn.dataset.color) : null);\n    if (!x) return;\n    li.outerHTML = fr(upCard(x));\n    const nb = $$('.up__item').find((n) => n.dataset.up === p.slug);\n    const sw = nb && $$('.swatch', nb).find((s) => s.dataset.color === btn.dataset.color);\n    if (sw) sw.focus({ preventScroll: true });\n  }\n  /* Vignette d'une ligne : la photo studio HD pour la couleur de base, sinon la photo de la couleur */\n  /* vignette en vraie photo dans le studio (toutes les pi\u00E8ces en ont une) */\n  const thumbIsStudio = (p) => !!carteOf(p);\n  /* refonte du 07/10 : la ligne du panier montre la pi\u00E8ce dans sa pi\u00E8ce (photo en situation de la couleur choisie), cadr\u00E9e sur elle */\n  const cartThumb = (p, color) => { const sc = scenesFor(p, color); return sc.length ? sceneImg(p, sc[0], { alt: '', sizes: '160px', eager: true, cls: 'line__scene' }) : tightThumb(p, color); };\n  /* la vraie photo de la couleur choisie, recadr\u00E9e sur la pi\u00E8ce enti\u00E8re (elle prend 80 % de la vignette) */\n  const tightThumb = (p, color) => thumbFor(p, color);\n  /* image d'une suggestion : la m\u00EAme vignette, \u00E0 la taille du cadre (276 px sur ordinateur, 80 px au t\u00E9l\u00E9phone) */\n  const upThumb = (p, color) => (carteOf(p) ? pieceFit(p, color, 276) : thumbFor(p, color));\n  /* D\u00E9lai de r\u00E9tractation, sous le bouton de paiement (le d\u00E9tail des frais est sur la fiche et la page Livraison) */\n  function returnNote() {\n    return `<b>${SITE.retours.delaiJours} jours pour changer d\u2019avis</b>`;\n  }\n  /* Cadeaux obtenus : une petite liste sous les pi\u00E8ces, align\u00E9e sur leurs noms, sans pictogramme (panier et merci).\n     rows : [nom, pr\u00E9cision, valeur \u00E0 droite] */\n  /* rows : [nom, pr\u00E9cision, mot \u00E0 droite, palier] ; la photo du cadeau, sa valeur barr\u00E9e (prix de l'article vendu seul) et,\n     sous la liste, la somme \u00E9conomis\u00E9e */\n  const giftsHtml = (rows) => {\n    if (!rows.length) return '';\n    const saved = giftsSaved(rows.map((r) => r[3]).filter(Boolean));\n    return `<div class=\"gifts\"><p class=\"gifts__h\">Vos cadeaux</p><ul class=\"gifts__list\">${rows.map(([n, d, v, pl]) => `<li class=\"gift\">${pl ? giftPic(pl, 'gift__pic') : ''}<div><p class=\"gift__name\">${esc(n)}</p><p class=\"gift__note\">${esc(d)}</p></div><p class=\"gift__v\">${pl && giftValue(pl) ? strike(giftValue(pl)) + ' ' : ''}${esc(v)}</p></li>`).join('')}</ul>${saved ? `<p class=\"gifts__save\">Vous \u00E9conomisez <b class=\"num\">${price(saved)}</b></p>` : ''}</div>`;\n  };\n  const slowestOf = (items) => items.slice().sort((a, b) => DL(b)[1] - DL(a)[1])[0];\n  /* panier vide, \u00AB Pour commencer \u00BB : les trois pi\u00E8ces les plus cliqu\u00E9es sur Google en 28 jours (18/10, audit 03 : Cumulus,\n     Lierre, Bruy\u00E8re), puis des relais si l'une n'est plus en ligne */\n  const CART_START = ['bulle-294', 'canape-lit-modulable-cotele', 'canape-lit-pliant-cotele', 'noix-de-cajou', 'incurve'];\n  function cartInner() {\n    const total = cartTotal();\n    if (!cart.length && SHOP_EXTRAS().length) { setTimeout(() => location.reload(), 0); return ''; }\n    if (!cart.length) {\n      const all = Object.values(SITE.livraison.delais);\n      const a = Math.min(...all.map((d) => d[0])), b = Math.max(...all.map((d) => d[1]));\n      return `<div class=\"cart-empty cart-empty--img\">\n        <div class=\"cart-empty__txt\"><h1 class=\"t-1\">Votre panier est vide</h1>\n        <p class=\"lead\">Livraison offerte en France m\u00E9tropolitaine, chez vous en ${a} \u00E0 ${b} jours ouvr\u00E9s. Chaque fiche vous donne la date.</p>\n        <a class=\"btn\" href=\"#/canapes\">Voir les canap\u00E9s</a></div>\n      </div>\n      <div class=\"cart-start\">\n        <h2 class=\"t-2\">Pour commencer</h2>\n        <div class=\"grid\">${CART_START.filter((k) => BY[k]).slice(0, 3).map((k) => pcard(BY[k], { reveal: false })).join('')}</div>\n      </div>`;\n    }\n    const base = giftBase();\n    const gifts = giftsFor(base);\n    const up = upsell(base);\n    const items = cart.map((l) => BY[l.slug]);\n    const when = delivery(slowestOf(items));\n    const count = cartCount();\n    /* Plusieurs colis : on l'annonce avant, pour qu'un premier carton arriv\u00E9 seul n'inqui\u00E8te pas */\n    const nPieces = cart.reduce((s, l) => s + (parseInt(BY[l.slug].colis, 10) || NaN) * l.qty, 0);\n    const nColis = nPieces + gifts.length;\n    /* le cadeau le plus lent (coussins depuis la Chine) : s'il arrive apr\u00E8s les pi\u00E8ces, il a sa propre date */\n    const gSlow = gifts.map(giftProd).filter(Boolean).sort((a, b) => DL(b)[1] - DL(a)[1])[0];\n    const giftLater = !!gSlow && DL(gSlow)[1] > DL(slowestOf(items))[1];\n    /* trois rep\u00E8res, une ligne chacun : la date, le retour, le paiement */\n    const whenLine = giftLater\n      ? `<b>Livraison offerte</b>, ${nPieces > 1 ? `${nPieces} colis` : 'chez vous'} ${when} ; ${gifts.length > 1 ? 'vos cadeaux, dans des colis \u00E0 part' : 'votre cadeau, dans un colis \u00E0 part'}, ${delivery(gSlow)}`\n      : `<b>Livraison offerte</b>, ${nColis > 1 ? `${nColis} colis` : 'chez vous'} ${when}`;\n    const giftPl = (pl) => plural(GIFT_SHORT[SITE.paliers.indexOf(pl)]);\n    return `<div class=\"cart-head\">\n        <h1 class=\"t-1\">Votre panier</h1>\n        ${giftsShown(base) ? gaugeHtml(base, up) : ''}\n      </div>\n      <div class=\"cart__grid\">\n        <div class=\"cart__main\">\n          <h2 class=\"sr-only\">Vos pi\u00E8ces</h2>\n          <ul class=\"lines\">\n            ${cart.map((l) => {\n              const p = BY[l.slug];\n              const key = esc(lineKey(l));\n              return `<li class=\"line\" data-line=\"${key}\">\n                <a class=\"line__thumb\" href=\"#/p/${p.slug}\" aria-label=\"${esc(p.nom)}\">${cartThumb(p, l.color)}</a>\n                <div class=\"line__info\"><a class=\"line__name\" href=\"#/p/${p.slug}\">${esc(p.nom)}</a><p class=\"line__var\">${p.couleurs.length > 1 ? esc(l.color) + ' \u00B7 ' : ''}${esc(cardType(p))}${l.size ? ' \u00B7 ' + esc(l.size) : ''}</p></div>\n                <div class=\"qty\" role=\"group\" aria-label=\"Quantit\u00E9 de ${esc(p.nom)}\">\n                  <button type=\"button\" data-action=\"qty\" data-key=\"${key}\" data-d=\"-1\" aria-label=\"Retirer un exemplaire\"${l.qty < 2 ? ' disabled' : ''}>${I.minus}</button>\n                  <output aria-live=\"polite\">${l.qty}</output>\n                  <button type=\"button\" data-action=\"qty\" data-key=\"${key}\" data-d=\"1\" aria-label=\"Ajouter un exemplaire\"${l.qty > 8 ? ' disabled' : ''}>${I.plus}</button>\n                </div>\n                <p class=\"line__total\">${price(lineTotal(l))}</p>\n                <button class=\"line__x\" type=\"button\" data-action=\"remove\" data-key=\"${key}\" aria-label=\"Retirer ${esc(p.nom)} du panier\">Retirer</button>\n              </li>`;\n            }).join('')}${SHOP_EXTRA_HTML()}\n          </ul>\n          ${giftsHtml(gifts.map((pl, i) => [giftLabel(pl), `${pl.produit === PLAID && i === gifts.findIndex((x) => x.produit === PLAID) && plaidPref() ? `${plaidPref()} \u00B7 ` : ''}Livr\u00E9${giftPl(pl) ? 's' : ''} dans un colis \u00E0 part, ${giftWhen(pl)}`, `Offert${giftPl(pl) ? 's' : ''}`, pl]))}\n          ${swapMsg() ? `<p class=\"up__ok cart__swap\" role=\"status\">${esc(swapMsg())}</p>` : ''}\n          <div class=\"cart__save\"><button class=\"link\" type=\"button\" data-action=\"save-cart\">Enregistrer dans ma s\u00E9lection</button></div>\n          ${upHtml(up, base)}\n          ${addonHtml(base)}\n        </div>\n        <aside class=\"sum\" aria-label=\"R\u00E9capitulatif\">\n          <dl>\n            <div><dt>${count} pi\u00E8ce${count > 1 ? 's' : ''}</dt><dd>${price(total)}</dd></div>\n            <div><dt>Livraison</dt><dd>Offerte</dd></div>\n            <div><dt>\u00C9co-participation</dt><dd>${(() => { const e = items.reduce((s, p, i) => { const v = ecoOf(p); return v == null || s == null ? null : s + v * cart[i].qty; }, 0); return e == null ? 'Comprise' : `dont ${price(e)}`; })()}</dd></div>\n            <div class=\"total\"><dt>Total</dt><dd>${price(total)}</dd></div>\n          </dl>\n          ${pp4xSlot('sum__4x', total, 'cart', 'right')}\n          <button class=\"btn btn--block sum__go\" type=\"button\" data-action=\"checkout\"><span class=\"cta__label\">Passer au paiement</span></button>\n          ${expressMock('panier')}\n          <p class=\"sum__when\">${whenLine}.</p>\n          ${trustHtml(retourLePlusCher(items), true)}\n          <p class=\"sum__note\">Apr\u00E8s votre commande, nous pourrons vous \u00E9crire au sujet de pi\u00E8ces assorties. Un clic suffit pour arr\u00EAter.</p>\n        </aside>\n      </div>\n      <div class=\"cartbar\" data-cartbar aria-hidden=\"true\">\n        <p><span>Livraison offerte</span><b>${price(total)}</b></p>\n        <button class=\"btn btn--sm\" type=\"button\" data-action=\"checkout\" tabindex=\"-1\"><span class=\"cta__label\">Passer au paiement</span></button>\n      </div>`;\n  }\n  function renderCart() {\n    if (!cart.length && SHOP_EXTRAS().length) return null;\n    takeShared('panier');\n    const html = `<section class=\"wrap cart\">\n      <div data-cart>${cartInner()}</div>\n      <p class=\"sr-only\" role=\"status\" aria-live=\"polite\" data-cart-live></p>\n    </section>${footer()}`;\n    return { title: 'Panier \u00B7 Caplia', html, scene: { img: tab('petit-incurve-galerie', '960'), soft: true, tint: '#cdb59a' }, after: () => { animateGauge(); cartBar(); pp4xRender(); } };\n  }\n  /* T\u00E9l\u00E9phone : barre \u00AB Total \u00B7 Payer \u00BB toujours en bas, sauf quand le vrai bouton est \u00E0 l'\u00E9cran (un seul bouton noir)\n     et quand le pied de page arrive (comme la barre d'achat des fiches : elle ne cache pas ses liens) */\n  let cartBarIO = null;\n  function cartBar() {\n    if (cartBarIO) { cartBarIO.disconnect(); cartBarIO = null; }\n    const bar = $('[data-cartbar]'), go = $('.sum__go'), foot = $('#app .foot');\n    if (!bar || !go || !('IntersectionObserver' in window)) return;\n    const seen = new Set();\n    cartBarIO = new IntersectionObserver((ents) => {\n      ents.forEach((e) => (e.isIntersecting ? seen.add(e.target) : seen.delete(e.target)));\n      const show = seen.size === 0;\n      bar.classList.toggle('is-on', show);\n      bar.setAttribute('aria-hidden', String(!show));\n      $$('button', bar).forEach((b) => b.setAttribute('tabindex', show ? '0' : '-1'));\n    });\n    cartBarIO.observe(go);\n    if (foot) cartBarIO.observe(foot);\n    cleanups.push(() => { if (cartBarIO) { cartBarIO.disconnect(); cartBarIO = null; } });\n  }\n  function animateGauge() {\n    const f = $('.gauge__fill');\n    if (!f || reduce) return;\n    const v = f.style.getPropertyValue('--p');\n    f.style.setProperty('--p', '0');\n    requestAnimationFrame(() => requestAnimationFrame(() => f.style.setProperty('--p', v)));\n  }\n  function refreshCart() {\n    const host = $('[data-cart]');\n    if (!host) return;\n    const oldP = ($('.gauge__fill') || {}).style ? $('.gauge__fill').style.getPropertyValue('--p') : '0';\n    host.innerHTML = fr(cartInner());\n    pp4xRender(host);\n    /* boutique : les vrais boutons de paiement express reprennent leur place dans le panier refait */\n    if (typeof SLOT_REFILL === 'function') SLOT_REFILL(host);\n    const f = $('.gauge__fill');\n    if (f && !reduce) {\n      const v = f.style.getPropertyValue('--p');\n      f.style.setProperty('--p', oldP || '0');\n      requestAnimationFrame(() => requestAnimationFrame(() => f.style.setProperty('--p', v)));\n    }\n    cartBar();\n    if (ST()) ST().refresh();\n  }\n\n  /* ---------------- Pages texte ---------------- */\n  /* \u00C0 droite des pages texte (grand \u00E9cran) : la personne qui r\u00E9pond, plut\u00F4t qu'un blanc */\n  /* Pages de lecture : titre, phrase d'introduction, sommaire \u00E0 gauche (grand \u00E9cran) ou repli\u00E9 (t\u00E9l\u00E9phone),\n     texte sur 66 caract\u00E8res de large, contact discret \u00E0 droite. Les liens du sommaire d\u00E9filent sans changer\n     l'adresse (le routeur lit le \u00AB # \u00BB). */\n  /* Pages d'aide illustr\u00E9es (refonte du 07/10) : hero = une grande image sous le titre ; strip = les \u00E9tapes en vraies\n     photos ({ src: chemin sans largeur sous site/assets, w, alt, t: l\u00E9gende }) */\n  const pagePic = (src, alt, sizes, eager = false, w = 1280) => `<img src=\"/site/assets/${src}-${w}.webp\" srcset=\"/site/assets/${src}-640.webp 640w, /site/assets/${src}-${w}.webp ${w}w\" sizes=\"${sizes}\" alt=\"${esc(alt)}\" ${eager ? 'fetchpriority=\"high\"' : 'loading=\"lazy\"'} decoding=\"async\" draggable=\"false\">`;\n  function docPage({ title, lead = '', sections, intro = '', media = '', toc, scene, contact = true, hero = '', strip = null }) {\n    const withToc = toc ?? sections.length >= 4;\n    const here = location.pathname;\n    const html = `<section class=\"wrap lp\">\n      <header class=\"lp__head${media ? ' lp__head--media' : ''}\">\n        <div class=\"lp__htext\"><h1 class=\"t-1 lp__title\">${title}</h1>${lead ? `<p class=\"lead lp__lead\">${lead}</p>` : ''}</div>\n        ${media ? `<div class=\"lp__media\">${media}</div>` : ''}\n      </header>\n      ${hero ? `<figure class=\"lp__hero\">${hero}</figure>` : ''}\n      ${strip ? `<ol class=\"lp__strip\" role=\"list\">${strip.map((x) => `<li><figure>${x.html}<figcaption>${esc(x.t)}</figcaption></figure></li>`).join('')}</ol>` : ''}\n      ${intro}\n      <div class=\"lp__body${withToc ? '' : ' lp__body--notoc'}\">\n        ${withToc ? `<nav class=\"lp__toc\" aria-label=\"Sommaire\"><details class=\"lp__tocbox\" open><summary>Sommaire<span class=\"round\" aria-hidden=\"true\">${I.plus}</span></summary>\n          <ol>${sections.map((s) => `<li><a href=\"${here}\" data-toc=\"${s.id}\">${s.toc || s.title}</a></li>`).join('')}</ol></details></nav>` : ''}\n        <article class=\"lp__text\">\n          ${sections.map((s) => (s.fold\n            ? `<section class=\"lp__sec lp__sec--fold\" id=\"${s.id}\"><details class=\"acc lp__fold\"><summary><h2 class=\"lp__h2\">${s.title}</h2><span class=\"round\" aria-hidden=\"true\">${I.plus}</span></summary><div class=\"acc__body\">${s.html}</div></details></section>`\n            : `<section class=\"lp__sec\" id=\"${s.id}\">${s.pic ? `<div class=\"lp__h2row\"><span class=\"lp__pic\" aria-hidden=\"true\">${s.pic}</span><h2 class=\"lp__h2\">${s.title}</h2></div>` : `<h2 class=\"lp__h2\">${s.title}</h2>`}${s.html}</section>`)).join('')}\n        </article>\n        ${contact ? `<aside class=\"lp__contact\" aria-label=\"Nous joindre\">\n          <p class=\"lp__ct\">${typeof contact === 'string' ? contact : 'Une question ?'}</p>\n          <p>\u00C9crivez-nous \u00E0 ${mailLink()} : nous vous r\u00E9pondons ${reponse()}.</p>\n        </aside>` : ''}\n      </div>\n    </section>${footer()}`;\n    const after = (root) => {\n      /* ?s=<section> : on arrive sur la section (liens vers \u00AB des nouvelles \u00E0 chaque \u00E9tape \u00BB, \u00AB Il passe chez vous \u00BB\u2026) */\n      const s = qsAll().get('s');\n      if (s) {\n        const t = setTimeout(() => {\n          const el = document.getElementById(s);\n          if (!el || !el.classList.contains('lp__sec')) return;\n          const fd = el.querySelector('details.lp__fold'); if (fd) fd.open = true;\n          const y = el.getBoundingClientRect().top + scrollY - 96;\n          if (lenis) lenis.scrollTo(y, { immediate: true, force: true }); else window.scrollTo(0, y);\n        }, 80);\n        cleanups.push(() => clearTimeout(t));\n      }\n      const box = $('.lp__tocbox', root);\n      if (!box) return;\n      const wide = matchMedia('(min-width: 1100px)');\n      box.open = wide.matches;\n      const links = $$('[data-toc]', box);\n      const onClick = (e) => {\n        const a = e.target.closest('[data-toc]');\n        if (!a) return;\n        e.preventDefault();\n        const el = document.getElementById(a.dataset.toc);\n        if (!el) return;\n        if (!wide.matches) box.open = false;\n        if (lenis) lenis.scrollTo(el, { offset: -96 });\n        else el.scrollIntoView({ behavior: reduce ? 'auto' : 'smooth', block: 'start' });\n      };\n      box.addEventListener('click', onClick);\n      /* Le sommaire suit la lecture : la section \u00E0 l'\u00E9cran est en noir */\n      const io = new IntersectionObserver((es) => {\n        es.forEach((en) => {\n          if (!en.isIntersecting) return;\n          links.forEach((l) => l.classList.toggle('is-here', l.dataset.toc === en.target.id));\n        });\n      }, { rootMargin: '-20% 0px -70% 0px' });\n      $$('.lp__sec', root).forEach((s) => io.observe(s));\n      cleanups.push(() => { io.disconnect(); box.removeEventListener('click', onClick); });\n    };\n    return { html, after, scene: scene || { img: tab('petit-incurve-galerie', '960'), soft: true } };\n  }\n  const acc = (q, r) => `<details class=\"acc\"><summary>${q}<span class=\"round\" aria-hidden=\"true\">${I.plus}</span></summary><div class=\"acc__body\">${r}</div></details>`;\n\n  /* Carte stylis\u00E9e des entrep\u00F4ts (Livraison) : trois points plac\u00E9s \u00E0 peu pr\u00E8s o\u00F9 ils sont, sans fronti\u00E8res, et leur d\u00E9lai */\n  function depotsMap(d) {\n    const pt = (x, y, t, j, anchor = 'start') => `<circle cx=\"${x}\" cy=\"${y}\" r=\"7\" class=\"dm__pt\"/><text x=\"${x + (anchor === 'end' ? -14 : 14)}\" y=\"${y - 4}\" text-anchor=\"${anchor}\" class=\"dm__t\">${t}</text><text x=\"${x + (anchor === 'end' ? -14 : 14)}\" y=\"${y + 16}\" text-anchor=\"${anchor}\" class=\"dm__j\">${j}</text>`;\n    // 18/10 (audit 03) : la Pologne manquait (Lierre et Hamac en partent) ; dessin \u00E9largi pour son nom\n    return `<figure class=\"dm\" aria-label=\"Nos entrep\u00F4ts en France, en Allemagne, en Espagne et en Pologne\">\n      <svg viewBox=\"0 0 640 300\" role=\"img\" aria-hidden=\"true\"><path class=\"dm__route\" d=\"M150 222 Q 200 200 238 168\"/><path class=\"dm__route\" d=\"M390 100 Q 320 120 250 160\"/><path class=\"dm__route\" d=\"M500 92 Q 400 110 252 162\"/>\n        ${pt(150, 222, 'Espagne', `${d.ES[0]} \u00E0 ${d.ES[1]} jours ouvr\u00E9s`, 'end')}${pt(390, 100, 'Allemagne', `${d.DE[0]} \u00E0 ${d.DE[1]} jours ouvr\u00E9s`, 'end')}${pt(245, 165, 'France', `${d.FR[0]} \u00E0 ${d.FR[1]} jours ouvr\u00E9s`)}${pt(500, 92, 'Pologne', `${d.PL[0]} \u00E0 ${d.PL[1]} jours ouvr\u00E9s`)}\n      </svg></figure>`;\n  }\n  function renderLivraison() {\n    const d = SITE.livraison.delais;\n    const R = SITE.retours.delaiJours;\n    /* 18/10 (audit 09, 3.9) : l'exemple de date est Cumulus, la pi\u00E8ce la plus cliqu\u00E9e (Corolle si elle n'est plus en ligne) */\n    const ex = BY['bulle-294'] || BY.incurve;\n    /* Les pi\u00E8ces regroup\u00E9es par nombre de colis (\u00AB 2 cartons \u00BB = \u00AB 2 colis \u00BB) */\n    /* 18/10 (audit 08 m3) : seulement les pi\u00E8ces en vente (ni Lison, ni une pi\u00E8ce \u00E9puis\u00E9e), et le nombre de colis pris aussi\n       dans la fiche technique (d\u00E9ballage) quand catalogue.json ne le donne pas : une vingtaine de pi\u00E8ces manquaient */\n    const colis = {};\n    PRODS.filter(onSale).forEach((p) => {\n      const c = p.colis || debOf(p, /^Colis$/);\n      if (!c) return;\n      const n = (c.match(/^\\d+/) || [])[0];\n      const k = n ? `${n} colis` : 'Selon la commande';\n      (colis[k] = colis[k] || []).push(esc(p.nom));\n    });\n    const cle = Object.keys(colis).sort((a, b) => (parseInt(a, 10) || 99) - (parseInt(b, 10) || 99));\n    const intro = `<ul class=\"lp__facts\">\n      <li><p class=\"lp__fig\">${d.FR[0]} \u00E0 ${d.FR[1]}</p><p>jours ouvr\u00E9s pour les pi\u00E8ces en stock en France</p></li>\n      <li><p class=\"lp__fig\">${euMin()} \u00E0 ${euMax()}</p><p>jours ouvr\u00E9s pour les pi\u00E8ces en stock ${euEn()}</p></li>\n      <li><p class=\"lp__fig\">0${NB}\u20AC</p><p>de livraison, quel que soit le montant</p></li>\n    </ul>`;\n    const r = docPage({\n      contact: 'Une question avant de choisir ?',\n      title: 'La date avant de payer, la livraison offerte',\n      lead: `Nos pi\u00E8ces attendent dans des entrep\u00F4ts en Europe : chaque fiche donne leur date de livraison avant que vous payiez, puis des nouvelles arrivent \u00E0 chaque \u00E9tape. La livraison est offerte en France m\u00E9tropolitaine, quel que soit le montant.`,\n      strip: ARR && ARR.etapes ? ARR.etapes.filter((e) => e.photo).map((e) => ({ t: e.titre, html: `<img src=\"/site/assets/${e.photo.src}-640.webp\" alt=\"${esc(e.photo.alt)}\" width=\"${e.photo.w}\" height=\"${e.photo.h}\" loading=\"lazy\" decoding=\"async\" draggable=\"false\">` })) : null,\n      sections: [\n        { id: 'delais', title: 'Quand arrive votre pi\u00E8ce', toc: 'D\u00E9lais', html: `${depotsMap(d)}<p>Comptez <strong>${d.FR[0]} \u00E0 ${d.FR[1]} jours ouvr\u00E9s</strong> depuis la France, <strong>${euMin()} \u00E0 ${euMax()} jours ouvr\u00E9s</strong> depuis ${euDe()}, du lundi au vendredi hors jours f\u00E9ri\u00E9s.${accDelay()}</p>\n          <p>Vous connaissez la date avant de payer : chaque fiche la calcule le jour de votre visite. ${esc(ex.nom)}, command\u00E9 aujourd'hui, arrive chez vous <strong>${delivery(ex)}</strong>.</p>` },\n        /* 18/10 (audit 09, 3.9 ; m\u00EAme phrase que Pourquoi Caplia) : seulement les e-mails que Shopify envoie \u00E0 coup s\u00FBr ; plus de\n           promesse d'un e-mail \u00AB \u00E0 l'approche de la livraison \u00BB ni d'avertissement avant un retard (transporteurs des vendeurs) */\n        { fold: true, id: 'nouvelles', title: 'Des nouvelles \u00E0 chaque \u00E9tape', toc: 'Nouvelles', html: `<p>Vous n'avez rien \u00E0 demander : un e-mail confirme votre commande et sa date de livraison, puis un autre part avec le lien de suivi de chaque colis d\u00E8s qu'il quitte l'entrep\u00F4t.</p>\n          <p>Et quand vous nous \u00E9crivez, la r\u00E9ponse arrive ${reponse()}.</p>\n          <p>Le lien de suivi de chaque colis est dans l'e-mail d'exp\u00E9dition. Vous pouvez aussi retrouver votre commande dans <a href=\"/account\">votre compte</a>.</p>` },\n        { id: 'passage', title: 'Il passe chez vous, ou nous le reprenons', toc: 'Passage', html: `<p>La plupart de nos canap\u00E9s voyagent compress\u00E9s ou en modules, dans des cartons plus petits qu'eux.</p>\n          <p>Envoyez-nous la largeur de votre porte la plus \u00E9troite et de votre escalier, et l'\u00E9tage : nous v\u00E9rifions que la pi\u00E8ce passe et vous r\u00E9pondons par \u00E9crit, avant l'achat. <strong>Si nous avons dit oui et qu'elle ne passe pas, nous la reprenons \u00E0 nos frais et vous remboursons.</strong></p>\n          <p>Notre r\u00E9ponse s'appuie sur vos mesures et sur celles du plus grand carton de la pi\u00E8ce ; quand elles ne sont pas encore \u00E9crites sur la fiche, nous les v\u00E9rifions avant de vous r\u00E9pondre. Le d\u00E9tail est dans nos <a href=\"#/conditions-de-vente?s=passage\">conditions de vente</a>.</p>` },\n        { fold: true, id: 'colis', title: 'Colis et d\u00E9ballage', toc: 'Colis', html: `<p>Les colis sont livr\u00E9s \u00E0 votre adresse par un transporteur de colis ; chacun a son num\u00E9ro de suivi. Les cartons d'un canap\u00E9 compress\u00E9 se portent \u00E0 deux. Une fois ouvert, il reprend sa forme dans le temps \u00E9crit sur sa fiche ; les canap\u00E9s en modules se r\u00E9unissent sur place, sans outil. <a href=\"#/arrivee\">Les \u00E9tapes en photos</a>. Le nombre de colis de chaque pi\u00E8ce :</p>\n          <dl class=\"lp__kv\">${cle.map((k) => `<dt>${k}</dt><dd>${andList(colis[k])}</dd>`).join('')}</dl>` },\n        { fold: true, id: 'retractation', title: `Changer d'avis : ${R} jours`, toc: \"Changer d'avis\", html: `<p>Comme la loi le pr\u00E9voit, vous avez <strong>${R} jours apr\u00E8s la r\u00E9ception</strong> pour changer d'avis, sans avoir \u00E0 vous justifier.</p>\n          <h3>Comment se passe un retour</h3>\n          <ol class=\"lp__steps\">\n            <li>Dans les ${R} jours qui suivent la r\u00E9ception, remplissez la page <a href=\"#/renoncer\">Renoncer au contrat ici</a>, ou \u00E9crivez-nous \u00E0 <a href=\"mailto:${SITE.email}\">${SITE.email}</a> avec votre num\u00E9ro de commande.</li>\n            <li>Nous vous indiquons l'adresse de retour et un transporteur adapt\u00E9 \u00E0 la pi\u00E8ce. ${retourCout()}</li>\n            <li>La pi\u00E8ce repart compl\u00E8te, bien prot\u00E9g\u00E9e, dans les ${R} jours qui suivent votre message. Un canap\u00E9 qui a pris sa forme ne rentre plus dans son carton, c'est normal : une housse ou un film \u00E9pais suffit \u00E0 le prot\u00E9ger.</li>\n            <li>Vous \u00EAtes rembours\u00E9 au plus tard ${R} jours apr\u00E8s votre demande, sur le moyen de paiement utilis\u00E9. Nous pouvons attendre d'avoir re\u00E7u la pi\u00E8ce ou la preuve de son envoi.</li>\n          </ol>\n          <p>Le d\u00E9tail est dans nos <a href=\"#/conditions-de-vente\">conditions de vente</a>.</p>` },\n        { fold: true, id: 'conformite', title: 'Un souci \u00E0 l\u2019arriv\u00E9e ? Une photo suffit', toc: 'Un souci \u00E0 l\u2019arriv\u00E9e', html: `<p>Un pied ab\u00EEm\u00E9, une pi\u00E8ce qui manque ? Envoyez une photo par e-mail ou par le <a href=\"#/un-souci\">formulaire</a> : nous nous occupons du reste, sans frais pour vous.</p>\n          <p>Comme la loi le pr\u00E9voit, chaque pi\u00E8ce a la <strong>garantie l\u00E9gale de conformit\u00E9 de 2 ans</strong> : r\u00E9paration, remplacement ou remboursement. Ce qu'elle couvre, avec des exemples : <a href=\"#/garantie\">Garantie l\u00E9gale, en clair</a>.</p>` },\n        { id: 'cadeaux', title: 'Vos cadeaux', html: `<p>Offerts parce qu'un canap\u00E9 se pose rarement seul : de quoi habiller votre salon d\u00E8s le premier soir. Ils s'ajoutent tout seuls au panier, sans code.</p>\n          <ul>${SITE.paliers.map((pl) => `<li><strong>D\u00E8s ${price(pl.seuil)} de meubles</strong> : ${esc(pl.cadeau)}${giftValue(pl) ? ` ${strike(giftValue(pl))}` : ''}, offert${/^\\d|coussins/.test(pl.cadeau) ? 's' : ''}.</li>`).join('')}</ul><p>${GIFT_RULE}</p>\n          <p>Ils voyagent dans un colis \u00E0 part. <a href=\"#/cadeaux\">Les cadeaux en photos</a></p>` }\n      ],\n      scene: { img: tab('petit-mouton-paris', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Livraison offerte et retours \u00B7 Caplia', nav: 'livraison' });\n  }\n\n  /* ---------------- Comment il arrive chez vous (#/arrivee) ----------------\n     Les quatre \u00E9tapes en vraies photos (recadr\u00E9es, sans texte ni personne), puis chaque pi\u00E8ce : colis, contenu du carton,\n     temps de reprise de forme recopi\u00E9 de sa fiche, poids et mesures seulement quand ils sont connus. */\n  function renderArrivee() {\n    if (!ARR || !ARR.etapes) return render404();\n    const E = ARR.etapes;\n    const rows = PRODS.filter((p) => arrOf(p) && !isSleep(p) && !notYet(p)).sort((x, y) => (arrOf(y).compresse - arrOf(x).compresse) || (y.prix - x.prix));\n    const colisCell = (p, a) => (a.colisTxt ? esc(nbUnits(a.colisTxt)) : colisN(p) ? `${colisN(p)} colis` : esc(p.colis));\n    const formeCell = (a) => (a.compresse ? `<strong class=\"num\">${esc(a.forme)}</strong>${a.detail ? `<span>${esc(a.detail)}</span>` : ''}` : '<span>Livr\u00E9 pr\u00EAt, sans compression</span>');\n    const html = `<section class=\"wrap ar\">\n      <header class=\"ar__head\">\n        <h1 class=\"t-1\">Comment il arrive chez vous</h1>\n        <p class=\"lead ar__lead\">Nos canap\u00E9s compress\u00E9s voyagent dans des cartons plus petits qu\u2019eux. Le jour de la livraison, voici ce qui se passe, en vraies photos.</p>\n      </header>\n      <ol class=\"ar__steps\">${E.map((e, i) => `<li class=\"ar__step${i === E.length - 1 ? ' ar__step--wide' : ''}\">\n        <figure class=\"ar__img\">${stepPic(e, i === E.length - 1 ? '(max-width: 760px) calc(100vw - 32px), 1280px' : '(max-width: 760px) calc(100vw - 32px), 31vw')}</figure>\n        <h2 class=\"t-3 ar__t\">${esc(e.titre)}</h2>\n        <p class=\"ar__p\">${esc(e.texte)}</p>\n      </li>`).join('')}</ol>\n      <section class=\"ar__table\" aria-labelledby=\"ar-t\">\n        <h2 class=\"t-2\" id=\"ar-t\">Pi\u00E8ce par pi\u00E8ce</h2>\n        <div class=\"ar__scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Arriv\u00E9e de chaque pi\u00E8ce\">\n          <table class=\"table ar__tbl\">\n            <thead><tr><th scope=\"col\">Pi\u00E8ce</th><th scope=\"col\">Colis</th><th scope=\"col\">Dans le carton</th><th scope=\"col\">Reprise de forme</th></tr></thead>\n            <tbody>${rows.map((p) => { const a = arrOf(p); return `<tr><th scope=\"row\"><a class=\"ar__pn\" href=\"#/p/${p.slug}\">${esc(p.nom)}</a><span>${esc(cardType(p))}</span></th><td data-l=\"Colis\">${colisCell(p, a)}</td><td data-l=\"Dans le carton\">${p.carton ? esc(p.carton.map((t, i) => (i ? lc1(t) : t)).join(', ')) : esc(a.geste)}</td><td data-l=\"Reprise de forme\">${formeCell(a)}</td></tr>`; }).join('')}</tbody>\n          </table>\n        </div>\n      </section>\n      <p class=\"ar__ask\">Une question sur une livraison ? \u00C9crivez-nous \u00E0 ${mailLink()} : r\u00E9ponse ${reponse()}. <a class=\"link\" href=\"#/livraison\">D\u00E9lais, livraison offerte et retours</a></p>\n    </section>${footer()}`;\n    return { title: 'Comment il arrive chez vous : livraison compress\u00E9e \u00B7 Caplia', html, nav: 'livraison', scene: { img: tab('petit-mouton-paris', '960'), soft: true } };\n  }\n\n  /* ---------------- Les cadeaux (#/cadeaux) ----------------\n     Les trois paliers de site.json (seuils, accord \u00AB Offert(s) \u00BB), chacun avec ses vraies photos (cadeaux.json : la pi\u00E8ce\n     dans le studio gris, puis de pr\u00E8s ou en situation) et deux phrases ; aucune valeur en euros des cadeaux. Avec un panier\n     en cours, une ligne dit ce qui est d\u00E9j\u00E0 offert et ce qu'il manque. Puis comment ils s'ajoutent. */\n  function renderCadeaux() {\n    if (!GIFTS || !GIFTS.paliers) return render404();\n    const P = SITE.paliers;\n    const pic = (ph, sizes, first) => {\n      const t = Object.entries(ph.tailles);\n      const set = (ext) => t.map(([k, w]) => `/site/assets/${ph.src}-${k}.${ext} ${w}w`).join(', ');\n      return `<picture>${ph.avif ? `<source type=\"image/avif\" srcset=\"${set('avif')}\" sizes=\"${sizes}\">` : ''}<img src=\"/site/assets/${ph.src}-${t[t.length - 1][0]}.webp\" srcset=\"${set('webp')}\" sizes=\"${sizes}\" width=\"${ph.w}\" height=\"${ph.h}\" alt=\"${esc(ph.alt)}\" ${first ? 'fetchpriority=\"high\"' : 'loading=\"lazy\"'} decoding=\"async\"></picture>`;\n    };\n    /* le panier en cours : \u00AB les coussins n\u0153ud et le plaid sont d\u00E9j\u00E0 offerts. Encore 110 \u20AC et le second plaid\u2026 \u00BB */\n    const total = giftBase();\n    const got = giftsFor(total), next = P.find((pl) => total < pl.seuil);\n    const short = (pl) => GIFT_SHORT[P.indexOf(pl)];\n    const the = (pl) => `${plural(short(pl)) ? 'les' : 'le'} ${short(pl)}`;\n    const many = got.length > 1 || (got.length && plural(short(got[0])));\n    const now = !total ? '' : `<p class=\"cx__now\">${!next\n      ? 'Avec votre panier, vos trois cadeaux sont offerts.'\n      : `${got.length ? `Avec votre panier, ${andList(got.map(the))} ${many ? 'sont' : 'est'} d\u00E9j\u00E0 offert${many ? 's' : ''}. Encore` : 'Encore'} <strong>${price(next.seuil - total)}</strong>${got.length ? '' : ' dans votre panier'} et ${the(next)} vous ${plural(short(next)) ? 'sont offerts' : 'est offert'}${got.length ? ' aussi' : ''}.`} <a class=\"link\" href=\"#/panier\">Voir mon panier</a></p>`;\n    const tiers = P.map((pl, i) => {\n      const g = GIFTS.paliers[i];\n      if (!g) return '';\n      const [main, more0] = g.photos || [];\n      /* refonte du 07/10 : plus la photo du vendeur sur un canap\u00E9 gris qui n'est pas le n\u00F4tre (les cadeaux sur Corolle sont en t\u00EAte de page) */\n      const more = more0 && more0.src === 'cadeaux/coussins-noeud' ? null : more0;\n      return `<li class=\"cx__tier${i % 2 ? ' cx__tier--alt' : ''}\" id=\"palier-${i + 1}\">\n        ${main ? `<figure class=\"cx__main\">${pic(main, '(max-width: 760px) calc(100vw - 32px), (max-width: 1360px) 50vw, 680px', i === 0)}</figure>` : ''}\n        <div class=\"cx__txt\">\n          <h2 class=\"t-2 cx__t\">${esc(g.titre)}</h2>\n          <p class=\"cx__seuil\">${giftWord(pl)} d\u00E8s <span class=\"num\">${price(pl.seuil)}</span> de meubles</p>\n          <p class=\"cx__p\">${esc(nbUnits(g.texte))}</p>\n          ${giftValue(pl) && i < 2 ? `<p class=\"cx__seul\">Aussi vendu${plural(GIFT_SHORT[i]) ? 's' : ''} seul${plural(GIFT_SHORT[i]) ? 's' : ''}, ${price(giftValue(pl))} : <a class=\"link\" href=\"#/p/${pl.produit}\">voir ${plural(GIFT_SHORT[i]) ? 'les' : 'le'} ${esc(BY[pl.produit].nom.toLowerCase())}</a></p>` : ''}\n          ${more ? `<figure class=\"cx__more\" style=\"aspect-ratio: ${more.w} / ${more.h}\">${pic(more, '(max-width: 760px) calc(100vw - 32px), (max-width: 1360px) 36vw, 480px')}</figure>` : ''}\n        </div>\n      </li>`;\n    }).join('');\n    const html = `<section class=\"wrap cx\">\n      <header class=\"cx__head\">\n        <h1 class=\"t-1\">Les cadeaux</h1>\n        <p class=\"lead cx__lead\">Un canap\u00E9 se pose rarement seul. Selon le montant de vos meubles, ces pi\u00E8ces vous sont offertes, et elles s\u2019additionnent.</p>\n        ${now}\n      </header>\n      <figure class=\"lp__hero cx__hero\"><img src=\"/site/assets/cadeaux/salon-cadeaux-1600.webp\" srcset=\"/site/assets/cadeaux/salon-cadeaux-800.webp 800w, /site/assets/cadeaux/salon-cadeaux-1600.webp 1600w\" sizes=\"(max-width: 760px) 100vw, 1360px\" width=\"1600\" height=\"1200\" alt=\"Mise en sc\u00E8ne de Corolle avec les deux coussins n\u0153ud, cr\u00E8me et gris, et le plaid c\u00F4tel\u00E9 gris clair pli\u00E9 sur l\u2019assise\" fetchpriority=\"high\" decoding=\"async\" draggable=\"false\"></figure>\n      <ol class=\"cx__list\">${tiers}</ol>\n      <section class=\"cx__how\" aria-labelledby=\"cx-how\">\n        <h2 class=\"t-2\" id=\"cx-how\">Comment ils s\u2019ajoutent</h2>\n        <ul class=\"cx__steps\">${(GIFTS.ajout || []).map(([t, x]) => `<li><h3 class=\"cx__st\">${esc(t)}</h3><p>${esc(x)}</p></li>`).join('')}</ul>\n        <p class=\"cx__rule\">${GIFT_RULE}</p>\n      </section>\n      <div class=\"cx__end\">\n        <a class=\"btn\" href=\"#/canapes\">Voir les canap\u00E9s</a>\n        <p class=\"cx__ask\">Une question sur un cadeau ? \u00C9crivez-nous \u00E0 ${mailLink()} : r\u00E9ponse ${reponse()}.</p>\n      </div>\n    </section>${footer()}`;\n    const after = () => setDesc(`Les cadeaux Caplia : ${andList(P.map((pl) => `${pl.cadeau} d\u00E8s ${price(pl.seuil)} de meubles`))}. Ajout\u00E9s tout seuls au panier, sans code, livr\u00E9s dans leur propre colis.`);\n    return { title: 'Les cadeaux offerts avec votre commande \u00B7 Caplia', html, after };\n  }\n\n  /* ---------------- Nos mati\u00E8res (#/matieres, ?m=<mati\u00E8re> pour arriver sur l'une d'elles) ----------------\n     Chaque tissu de pr\u00E8s (vraie photo quand elle est nette, sinon la section reste en texte seul, sur une colonne),\n     le toucher, les trois gestes d'entretien et les pi\u00E8ces de salon qui les portent (jamais Caplia Sleep).\n     Donn\u00E9es : site/data/matieres.json. L'introduction ne compte pas les tissus : une photo retir\u00E9e ne la rend pas fausse. */\n  function renderMatieres() {\n    if (!MAT || !MAT.matieres) return render404();\n    const piecesOf = (k) => PRODS.filter((p) => { const x = MAT.pieces[p.slug]; return x && x.matiere === k && !isSleep(p) && !notYet(p); });\n    /* une mati\u00E8re sans pi\u00E8ce en ligne (pi\u00E8ces masqu\u00E9es) n'est pas pr\u00E9sent\u00E9e */\n    const keys = (MAT.ordre || Object.keys(MAT.matieres)).filter((k) => MAT.matieres[k] && piecesOf(k).length);\n    const picOf = (m) => {\n      const ph = m.photo || {};\n      if (ph.src) return { src: asset(ph.src, 640), srcset: `${asset(ph.src, 640)} 640w` };\n      const p = BY[ph.slug];\n      return p ? { src: photo(p, ph.id, 1280), srcset: `${photo(p, ph.id, 640)} 640w, ${photo(p, ph.id, 1280)} 1280w` } : null;\n    };\n    const enOf = (k, m) => (k === 'effet-lin' ? 'tissu effet lin' : lc1(m.nom));\n    const sec = (k, i) => {\n      const m = MAT.matieres[k], ps = piecesOf(k), v = picOf(m);\n      return `<section class=\"mt__sec${!v ? ' mt__sec--txt' : i % 2 ? ' mt__sec--alt' : ''}\" id=\"m-${k}\" aria-labelledby=\"m-${k}-t\">\n        ${v ? `<figure class=\"mt__img\"><img src=\"${v.src}\" srcset=\"${v.srcset}\" sizes=\"(max-width: 980px) calc(100vw - 32px), 44vw\" alt=\"${esc(m.photo.alt)}\" ${i ? 'loading=\"lazy\"' : 'fetchpriority=\"high\"'} decoding=\"async\"></figure>` : ''}\n        <div class=\"mt__txt\">\n          <h2 class=\"t-2\" id=\"m-${k}-t\">${esc(m.nom)}</h2>\n          <p class=\"mt__touch\">${esc(m.toucher)}</p>\n          <h3 class=\"mat-h3\">L\u2019entretien, en trois gestes</h3>\n          ${careHtml(m)}\n          ${ps.length ? `<h3 class=\"mat-h3\">Nos pi\u00E8ces en ${esc(enOf(k, m))}</h3>\n          <ul class=\"mt__pieces\">${ps.map((p) => `<li><a class=\"mt__piece\" href=\"#/p/${p.slug}\"><span class=\"mt__th\" aria-hidden=\"true\">${pieceFit(p, '', 64)}</span><span class=\"mt__pn\">${esc(p.nom)}</span><span class=\"mt__pt\">${esc(cardType(p))}</span></a></li>`).join('')}</ul>` : ''}\n        </div>\n      </section>`;\n    };\n    const html = `<section class=\"wrap mt\">\n      <header class=\"mt__head\">\n        <h1 class=\"t-1\">Nos mati\u00E8res, de pr\u00E8s</h1>\n        <p class=\"lead mt__lead\">Chaque tissu, au plus pr\u00E8s : ce que l\u2019on sent sous la main, et les trois gestes qui le gardent beau.</p>\n        <nav class=\"mt__nav\" aria-label=\"Aller \u00E0 une mati\u00E8re\">${keys.map((k) => `<a class=\"tab\" href=\"#/matieres?m=${k}\" data-mat-go=\"${k}\">${esc(MAT.matieres[k].nom)}</a>`).join('')}</nav>\n      </header>\n      ${keys.map(sec).join('')}\n      <p class=\"mt__ask\">Une question sur un tissu ? \u00C9crivez-nous \u00E0 ${mailLink()} : r\u00E9ponse ${reponse()}.</p>\n    </section>${footer()}`;\n    const after = (root) => {\n      const go = (k, smooth) => {\n        const el = document.getElementById('m-' + k);\n        if (!el) return;\n        if (lenis) lenis.scrollTo(el, { offset: -96, immediate: !smooth });\n        else el.scrollIntoView({ behavior: smooth && !reduce ? 'smooth' : 'auto', block: 'start' });\n      };\n      const onClick = (e) => {\n        const a = e.target.closest('[data-mat-go]');\n        if (!a) return;\n        e.preventDefault();\n        try { history.replaceState(history.state, '', a.getAttribute('href')); } catch (er) { /* rien */ }\n        go(a.dataset.matGo, true);\n      };\n      root.addEventListener('click', onClick);\n      cleanups.push(() => root.removeEventListener('click', onClick));\n      const m = qsAll().get('m');\n      if (m) setTimeout(() => go(m, false), 80);\n    };\n    return { title: `Nos mati\u00E8res : ${andList(keys.slice(0, 3).map((k) => lc1(MAT.matieres[k].nom)))} \u00B7 Caplia`, html, after, nav: 'matieres', scene: { img: tab('petit-incurve-galerie', '960'), soft: true } };\n  }\n\n  /* Qui sommes-nous : texte honn\u00EAte (rapport 04, \u00A74.2), sans rien inventer. \u00AB Ce que nous v\u00E9rifions \u00BB : copy-persona \u00A75.5. */\n  function renderAbout() {\n    const v = SITE.vendeur;\n    const p = BY.incurve;\n    const r = docPage({\n      title: 'Qui sommes-nous',\n      lead: `Caplia est une petite maison fran\u00E7aise. Nous choisissons chaque pi\u00E8ce et r\u00E9pondons \u00E0 chaque message. Que des formes douces : canap\u00E9s arrondis, m\u00E9ridiennes, fauteuils, et quelques objets qui vont avec.`,\n      sections: [\n        { id: 'formes', title: 'Pourquoi des formes douces', html: `<p>Un canap\u00E9 arrondi change un salon. Les angles disparaissent, la pi\u00E8ce para\u00EEt plus calme, et on a envie de s'y laisser tomber en rentrant le soir. Toutes nos pi\u00E8ces partagent cette courbe.</p>` },\n        { id: 'verifie', title: 'Ce que nous v\u00E9rifions avant de proposer une pi\u00E8ce', html: `<ul>\n            <li><strong>Elle est en stock en Europe</strong>, couleur par couleur, avec son pays de d\u00E9part : ${orList(['FR', ...EU_KEYS()].map((k) => PAYS_DE[k]))}.</li>\n            <li><strong>Ses mesures viennent de la fiche du fabricant</strong>, v\u00E9rifi\u00E9es sur ses photos cot\u00E9es : largeur, profondeur, hauteur et profondeur d'assise, nombre de colis.</li>\n            <li><strong>Sa teinte porte un nom</strong>, et ce nom reste le m\u00EAme d'une page \u00E0 l'autre.</li>\n            <li><strong>Son d\u00E9lai est r\u00E9el</strong> : vous voyez une date, avant de payer.</li>\n          </ul>` },\n        { id: 'rapide', title: \"Pourquoi c'est rapide\", html: `<p>Nos pi\u00E8ces partent d'entrep\u00F4ts en France, en Allemagne, en Espagne et en Pologne. Elles arrivent donc chez vous en ${SITE.livraison.delais.FR[0]} \u00E0 ${euMax()} jours ouvr\u00E9s, et pas en plusieurs mois. Sur chaque fiche, vous voyez d'o\u00F9 part votre pi\u00E8ce et le jour o\u00F9 elle arrive.</p>` },\n        { id: 'promesses', title: 'Ce que nous vous promettons', html: `<ul>\n            <li>Tout est \u00E9crit avant de payer : les mesures, la hauteur d'assise, le nombre de colis et la date de livraison.</li>\n            <li>Il passe chez vous : envoyez-nous vos mesures, nous v\u00E9rifions et vous r\u00E9pondons par \u00E9crit. Si nous avons dit oui et qu'il ne passe pas, nous le reprenons \u00E0 nos frais.</li>\n            <li>Un d\u00E9faut dans les 2 ans ? Comme la loi le pr\u00E9voit, la garantie l\u00E9gale s'applique, et nous l'expliquons avec des exemples : <a href=\"#/garantie\">Garantie l\u00E9gale, en clair</a>.</li>\n            <li>Une personne vous r\u00E9pond, pas un robot.</li>\n          </ul>` },\n        { id: 'qui', title: 'Qui vous r\u00E9pond', html: `<p>Nous lisons chaque message nous-m\u00EAmes et nous y r\u00E9pondons ${reponse()} : une mesure, une couleur, la largeur de votre escalier. Une question ? \u00C9crivez-nous \u00E0 ${mailLink()}.</p>\n          <p class=\"lp__legal\">Identit\u00E9 compl\u00E8te du vendeur : <a href=\"#/mentions-legales\">mentions l\u00E9gales</a>.</p>` }\n      ],\n      toc: false,\n      scene: { img: tab('capiton-matin', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Qui sommes-nous \u00B7 Caplia' });\n  }\n\n  /* Trame de l'e-mail d'avis (bouton \u00AB Donner mon avis \u00BB) : la pi\u00E8ce, la note, les trois questions de la page, et l'accord\n     de publication demand\u00E9 avant de publier quoi que ce soit (avis.json > caplia, pr\u00E9nom et initiale seulement).\n     Sauts de ligne en CRLF (RFC 6068), pour les messageries qui ignorent %0A seul. */\n  /* questions et phrase de publication : site.json > avis, les m\u00EAmes que l'e-mail du 10e jour (construire.js) */\n  const avisQ = () => (SITE.avis && SITE.avis.questions) || [];\n  const avisMail = () => ['Ma pi\u00E8ce et sa couleur : ', 'Ma note, de 1 \u00E0 5 : ', '', ...avisQ().map((q, i) => `${i + 1}. ${q} `), '',\n    'J\u2019accepte que cet avis soit publi\u00E9 sur caplia.fr avec mon pr\u00E9nom et l\u2019initiale de mon nom : oui / non'].join('\\r\\n');\n  /* Trois jours apr\u00E8s la livraison : \u00AB Tout s'est bien pass\u00E9 ? \u00BB (e-mail 4). Les deux r\u00E9ponses m\u00E8nent \u00E0 une page, sans filtrer les avis :\n     la demande d'avis du 10e jour part \u00E0 tous les clients.\n     17/10 (table d'experts) : \u00AB Oui \u00BB ne demande plus d'avis (un client content \u00E9tait sollicit\u00E9 deux fois, un client avec un\n     souci plus tard) : l'avis est demand\u00E9 \u00E0 tous, au m\u00EAme moment, par l'e-mail du 10e jour, dont le bouton m\u00E8ne \u00E0 ?avis\n     (les trois questions et l'e-mail pr\u00E9rempli). \u00AB Non \u00BB ne change pas. */\n  function renderWell() {\n    const q = qsAll();\n    const yes = q.has('oui'), ask = q.has('avis');\n    const html = `<section class=\"wrap\">\n      <div class=\"lp-mid\">\n        ${ask ? `<h1 class=\"t-1\">Donner votre avis</h1>\n          <p class=\"lead\">Votre avis aide ceux qui h\u00E9sitent, parce qu'ils ne peuvent pas voir la pi\u00E8ce chez eux avant d'acheter. Trois questions suffisent :</p>\n          <ol class=\"lp-mid__list\">${avisQ().map((q) => `<li>${esc(q)}</li>`).join('')}</ol>\n          <a class=\"btn\" href=\"mailto:${SITE.email}?subject=${encodeURIComponent('Mon avis')}&body=${encodeURIComponent(avisMail())}\">Donner mon avis</a>\n          <p class=\"lp-mid__note\">${esc(SITE.avis ? SITE.avis.publication : '')}</p>`\n        : yes ? `<h1 class=\"t-1\">Merci, \u00E7a nous fait plaisir</h1>\n          <p class=\"lead\">Dans quelques jours, nous vous demanderons votre avis, comme \u00E0 chaque client, que tout se soit bien pass\u00E9 ou non.</p>`\n        : `<h1 class=\"t-1\">Tout s'est bien pass\u00E9 ?</h1>\n          <p class=\"lead\">Votre r\u00E9ponse nous aide \u00E0 mieux faire. Elle prend une seconde.</p>\n          <div class=\"lp-mid__choices\">\n            <a class=\"lp-mid__choice lp-mid__choice--yes\" href=\"#/tout-va-bien?oui\">Oui</a>\n            <a class=\"lp-mid__choice\" href=\"#/un-souci\">Non</a>\n          </div>`}\n      </div>\n    </section>${footer()}`;\n    return { title: 'Tout s\u2019est bien pass\u00E9 ? \u00B7 Caplia', html, scene: { img: tab('meridienne-platre', '960'), soft: true } };\n  }\n\n  function renderIssue() {\n    const html = `<section class=\"wrap lp\">\n      <div class=\"lp-form\">\n        <div class=\"lp-form__side\">\n          <h1 class=\"t-1 lp__title\">Dites-nous ce qui ne va pas</h1>\n          <p class=\"lead\">Nous vous r\u00E9pondons ${reponse()}. Une photo suffit souvent \u00E0 tout comprendre.</p>\n          <dl class=\"lp__kv lp__kv--side\"><dt>E-mail</dt><dd>${mailLink()}</dd></dl>\n          <div class=\"lp-steps\">\n            <h2 class=\"lp-steps__h\">Un colis ab\u00EEm\u00E9 \u00E0 l\u2019arriv\u00E9e</h2>\n            <ol>\n              <li>Si le carton est ab\u00EEm\u00E9, \u00E9crivez-le sur le bon du livreur, par exemple \u00AB carton ab\u00EEm\u00E9 \u00BB.</li>\n              <li>Prenez en photo le carton et la pi\u00E8ce.</li>\n              <li>Envoyez-nous ces photos avec votre num\u00E9ro de commande.</li>\n            </ol>\n            <p>Jusqu\u2019\u00E0 ce que vous receviez votre pi\u00E8ce, le transport est sous notre responsabilit\u00E9, comme la loi le pr\u00E9voit : nous r\u00E9glons le souci avec le transporteur, et nous vous renvoyons la pi\u00E8ce ou la partie ab\u00EEm\u00E9e, ou vous remboursons, sans frais pour vous.</p>\n          </div>\n          <p class=\"lp-form__more\">Un d\u00E9faut apparu apr\u00E8s quelques mois ? Pendant 2 ans, la garantie l\u00E9gale s'applique. <a class=\"link\" href=\"#/garantie\">Voir des exemples</a></p>\n        </div>\n        <div data-caplia-slot=\"caplia-souci\"></div>\n      </div>\n    </section>${footer()}`;\n    return { title: 'Un souci \u00B7 Caplia', html, scene: { img: tab('capiton-matin', '960'), soft: true } };\n  }\n\n  /* Vos questions : chaque question est une vraie h\u00E9sitation d'acheteur (MANQUES-DU-MARCHE, PERSONAS), chaque r\u00E9ponse la l\u00E8ve\n     par un fait. Aucune question n'existe pour annoncer une r\u00E8gle interne. Les deux premiers mots portent l'information (P5). */\n  /* une vignette par th\u00E8me de questions (vraies photos et images de la maison) */\n  const FAQ_PIC = { livraison: '/site/assets/arrivee/cartons-640.webp', confort: '/site/assets/produits/incurve/06-640.webp', retours: '/site/assets/arrivee/en-place-640.webp', prix: '/site/assets/cadeaux/salon-cadeaux-800.webp', pieces: '/site/assets/arrivee/regonflage-640.webp', caplia: '/site/assets/produits/bulle-294/40-640.webp' };   /* 23/10 : plus d'image d'atelier g\u00E9n\u00E9r\u00E9e */\n  function renderFaq() {\n    const d = SITE.livraison.delais;\n    const R = SITE.retours.delaiJours;\n    const names = (keys) => andList(keys.filter((k) => BY[k]).map((k) => esc(BY[k].nom)));\n    const groups = [\n      ['livraison', 'Livraison', [\n        ['Combien co\u00FBte la livraison ?', `<p>Rien : elle est offerte en France m\u00E9tropolitaine, quel que soit le montant de la commande. Le prix affich\u00E9 est le prix pay\u00E9.</p>`],\n        ['Jusqu\u2019o\u00F9 est-il livr\u00E9 ?', `<p>Jusqu\u2019\u00E0 votre adresse, par un transporteur de colis, avec un num\u00E9ro de suivi pour chaque colis. Les cartons d\u2019un canap\u00E9 compress\u00E9 se portent \u00E0 deux, jusque dans la pi\u00E8ce.</p>`],\n        ['Quand serai-je livr\u00E9 ?', `<p>En ${d.FR[0]} \u00E0 ${d.FR[1]} jours ouvr\u00E9s depuis la France, ${euMin()} \u00E0 ${euMax()} jours ouvr\u00E9s depuis ${euDe()}. Chaque fiche affiche la date, calcul\u00E9e le jour de votre visite : vous la connaissez avant de payer. Ensuite, un e-mail confirme votre commande, puis un autre part avec le suivi de chaque colis.</p>`],\n        ['Mon canap\u00E9 passera-t-il ma porte ?', `<p>Envoyez-nous la largeur de votre porte et de votre escalier : nous v\u00E9rifions qu'il passe et vous r\u00E9pondons par \u00E9crit, avant l'achat. La plupart de nos canap\u00E9s voyagent compress\u00E9s ou en modules, dans des cartons plus petits qu'eux. Si nous avons dit oui et que la pi\u00E8ce ne passe pas, nous la reprenons \u00E0 nos frais.</p>`],\n        ['Un canap\u00E9 compress\u00E9, c\u2019est un vrai canap\u00E9 ?', `<p>Oui. Sa mousse haute \u00E9lasticit\u00E9 voyage comprim\u00E9e dans le carton, puis retrouve l'essentiel de sa forme en 48 \u00E0 72 heures, et tout son volume en quelques jours. Ensuite, c'est un canap\u00E9 \u00E0 sa taille r\u00E9elle : ${esc(BY['noix-de-cajou'].nom)} fait ${cm(BY['noix-de-cajou'].dimensions.largeur)} de large, ${esc(BY['petit-incurve'].nom)} ${cm(BY['petit-incurve'].dimensions.largeur)}.</p>`]\n      ]],\n      ['confort', 'Confort', [\n        ['Comment savoir s\u2019il est confortable sans l\u2019essayer ?', `<p>Comparez-le \u00E0 votre canap\u00E9 actuel, un m\u00E8tre ruban \u00E0 la main. Chaque fiche donne la hauteur et la profondeur d'assise, avec un rep\u00E8re connu : ${cm(BY.incurve.dimensions.hauteurAssise)} du sol, c'est un peu plus haut qu'un canap\u00E9 moyen (38 cm) et un peu plus bas qu'une chaise (45 cm). Une h\u00E9sitation ? \u00C9crivez-nous : nous vous r\u00E9pondons par \u00E9crit, avec les mesures.</p>`],\n        ['Mon canap\u00E9 va-t-il s\u2019affaisser ?', `<p>C'est la mousse qui d\u00E9cide. ${BY.causeuse && BY['angle-cotele'] ? `${esc(BY.causeuse.nom)} a une mousse haute densit\u00E9 de 32 kg/m\u00B3 (32D), ${esc(BY['angle-cotele'].nom)} des ressorts ensach\u00E9s sous la mousse` : `${names(['petit-incurve', 'capiton', 'meridienne'])} sont tout en mousse haute densit\u00E9`} : l'assise c\u00E8de sous le poids, puis reprend sa forme. Sur les coussins amovibles, les intervertir chaque mois garde une assise r\u00E9guli\u00E8re. Et la garantie l\u00E9gale de 2 ans vous couvre, comme la loi le pr\u00E9voit.</p>`],\n        ['Avec des enfants ou un chat, quel tissu choisir ?', `<p>Un tissage serr\u00E9 : la chenille ${deN(esc(BY['noix-de-cajou'].nom))} et de ${esc(BY.capiton.nom)}${BY.causeuse ? `, ou le velours c\u00F4tel\u00E9 de ${names(['causeuse'])}` : ''}. Les teintes moyennes, comme le Gris ardoise, restent nettes entre deux coups d'aspirateur. Une tache se tamponne tout de suite avec un chiffon humide, sans frotter.</p>`],\n        ['La couleur sera-t-elle celle de l\u2019\u00E9cran ?', `<p>Chaque teinte a sa propre galerie et garde le m\u00EAme nom sur toutes les pages. Si la teinte re\u00E7ue est nettement diff\u00E9rente de la fiche, c'est couvert par la garantie l\u00E9gale : une photo \u00E0 la lumi\u00E8re du jour suffit, nous le r\u00E9glons.</p>`]\n      ]],\n      ['retours', 'Changer d\u2019avis', [\n        ['Et si je change d\u2019avis ?', `<p>Comme la loi le pr\u00E9voit, vous avez ${R} jours apr\u00E8s la r\u00E9ception pour changer d'avis, sans avoir \u00E0 vous justifier. \u00C9crivez-nous \u00E0 <a href=\"mailto:${SITE.email}\">${SITE.email}</a> avec votre num\u00E9ro de commande. <a href=\"#/livraison\">Comment se passe un retour</a>.</p>`],\n        ['Combien co\u00FBte un retour ?', `<p>${retourCout()} \u00C9crivez-nous avant de renvoyer : nous organisons l'enl\u00E8vement avec vous.</p>`],\n        ['Et si la pi\u00E8ce arrive ab\u00EEm\u00E9e ?', `<p>Une photo par e-mail suffit : nous nous occupons du reste, sans frais pour vous. Comme la loi le pr\u00E9voit, la garantie l\u00E9gale de conformit\u00E9 s'applique pendant 2 ans : r\u00E9paration, remplacement ou remboursement.</p>`],\n        ['Que couvre la garantie l\u00E9gale ?', `<p>Pendant 2 ans apr\u00E8s la livraison, les d\u00E9fauts sont couverts : une assise qui se creuse, une couture qui s'ouvre, une couleur diff\u00E9rente de la fiche. Un d\u00E9faut qui appara\u00EEt pendant ces 2 ans est consid\u00E9r\u00E9 comme pr\u00E9sent d\u00E8s la livraison : vous n'avez pas \u00E0 prouver qu'il existait avant. <a href=\"#/garantie\">Les exemples, en clair</a>.</p>`]\n      ]],\n      ['prix', 'Prix et paiement', [\n        ['Faut-il un code promo pour les cadeaux ?', `<p>Aucun code : vos cadeaux s'ajoutent tout seuls au panier.</p><ul>${SITE.paliers.map((pl) => `<li>D\u00E8s ${price(pl.seuil)} de meubles : ${esc(pl.cadeau)}${giftValue(pl) ? ` ${strike(giftValue(pl))}` : ''}, offert${/^\\d|coussins/.test(pl.cadeau) ? 's' : ''}.</li>`).join('')}</ul><p>${GIFT_RULE}</p><p>Ils voyagent dans un colis \u00E0 part. <a href=\"#/cadeaux\">Les cadeaux en photos</a></p>`],\n        ['Quels moyens de paiement acceptez-vous ?', `<p>${esc(andList(SITE.paiements))}.</p>`],\n        ['Le paiement est-il s\u00E9curis\u00E9 ?', `<p>Oui. Le paiement est trait\u00E9 par Shopify, qui chiffre vos donn\u00E9es : votre num\u00E9ro de carte ne nous est jamais transmis. Avec Apple Pay, Shop Pay ou PayPal, vous ne le tapez m\u00EAme pas. En payant par PayPal, vous profitez aussi de sa protection des achats, selon ses conditions, si un colis n\u2019arrive pas ou ne correspond pas \u00E0 sa description.</p>`],\n        ['La TVA est-elle comprise ?', `<p>Le prix affich\u00E9 est le prix pay\u00E9, livraison comprise. TVA non applicable, article 293 B du CGI.</p>`]\n      ]],\n      ['pieces', 'Montage et entretien', [\n        ['Y a-t-il quelque chose \u00E0 monter ?', `<p>Les canap\u00E9s compress\u00E9s arrivent pr\u00EAts : vous ouvrez le carton, ils prennent leur forme. ${names(['incurve', 'petit-incurve', 'courbe', 'noix-de-cajou'])} arrivent en deux parties${BY['angle-cotele'] || BY['u-cotele'] ? `, ${names(['angle-cotele', 'u-cotele'])} en trois modules` : ''} : on les pose c\u00F4te \u00E0 c\u00F4te, sans outil. Chaque fiche montre ce qu'il y a dans le carton.</p>`],\n        ['Comment entretenir la bouclette, la chenille ou le velours ?', `<p>Un passage d'aspirateur avec la brosse douce, une fois par semaine. Une tache se tamponne tout de suite avec un chiffon humide, sans frotter.</p>`]\n      ]],\n      ['caplia', 'Caplia', [\n        ['Qui \u00EAtes-vous ?', `<p>Caplia est une entreprise fran\u00E7aise. Nous lisons chaque message et vous r\u00E9pondons ${reponse()}, par e-mail \u00E0 ${mailLink('')}. <a href=\"#/a-propos\">Qui sommes-nous</a>.</p>`]\n      ]]\n    ];\n    const r = docPage({\n      title: 'Vos questions',\n      lead: `Les r\u00E9ponses aux questions qu'on nous pose avant d'acheter. La v\u00F4tre n'y est pas ? <a class=\"link nowrap\" href=\"#/contact\">\u00C9crivez-nous</a> : nous vous r\u00E9pondons ${reponse()}.`,\n      sections: groups.map(([id, t, qs]) => ({ id, title: t, pic: FAQ_PIC[id] ? `<img src=\"${FAQ_PIC[id]}\" alt=\"\" loading=\"lazy\" decoding=\"async\" draggable=\"false\">` : '', html: `<div class=\"lp__accs\">${qs.map(([q, a]) => acc(esc(q), a)).join('')}</div>` })),\n      hero: BY.meridienne ? `<img src=\"${photo(BY.meridienne, '01', 1280)}\" srcset=\"${photo(BY.meridienne, '01', 640)} 640w, ${photo(BY.meridienne, '01', 1280)} 1280w\" sizes=\"(max-width: 760px) 100vw, 1360px\" alt=\"Ondine, m\u00E9ridienne en chenille blanc coquillage, dans un salon aux \u00E9tag\u00E8res arrondies\" fetchpriority=\"high\" decoding=\"async\" draggable=\"false\" style=\"object-position:${focusWide(BY.meridienne, '01')}\">` : '',\n      scene: { img: tab('meridienne-platre', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Vos questions \u00B7 Caplia', nav: 'questions' });\n  }\n\n  function renderContact() {\n    const html = `<section class=\"wrap lp\">\n      <div class=\"lp-form\">\n        <div class=\"lp-form__side\">\n          <h1 class=\"t-1 lp__title\">\u00C9crivez-nous</h1>\n          <p class=\"lead\">Nous lisons chaque message et vous r\u00E9pondons ${reponse()}. Une mesure, une couleur, votre escalier : vous avez une r\u00E9ponse \u00E9crite avant de commander.</p>\n          <dl class=\"lp__kv lp__kv--side\">\n            <dt>E-mail</dt><dd><a class=\"link\" href=\"mailto:${SITE.email}\">${SITE.email}</a></dd>\n            <dt>R\u00E9ponse</dt><dd>${reponse().replace(/^./, (c) => c.toUpperCase())}, par e-mail</dd>\n          </dl>\n          <p class=\"lp-form__more\">Une porte \u00E9troite, un escalier tournant ? Donnez-nous leur largeur : nous v\u00E9rifions que la pi\u00E8ce passe et vous r\u00E9pondons par \u00E9crit.</p>\n          <p class=\"lp-form__more\">Un souci avec une commande ? <a class=\"link\" href=\"#/un-souci\">Dites-nous ce qui ne va pas</a></p>\n        </div>\n        <div data-caplia-slot=\"caplia-contact\"></div>\n      </div>\n    </section>${footer()}`;\n    return { title: 'Contact \u00B7 Caplia', html, scene: { img: tab('capiton-matin', '960'), soft: true } };\n  }\n\n\n  /* ---------------- Renoncer au contrat ici (#/renoncer) ----------------\n     Fonction de r\u00E9tractation en ligne (L221-21, D221-5, en vigueur depuis le 19/06/2026) : nom, num\u00E9ro de commande, e-mail\n     pour l'accus\u00E9 de r\u00E9ception, puis \u00AB Confirmer la r\u00E9tractation \u00BB. Sur Shopify, l'envoi et l'accus\u00E9 dat\u00E9 seront r\u00E9els. */\n  function renderRenoncer() {\n    const R = SITE.retours.delaiJours;\n    const html = `<section class=\"wrap lp\">\n      <div class=\"lp-form\">\n        <div class=\"lp-form__side\">\n          <h1 class=\"t-1 lp__title\">Renoncer au contrat ici</h1>\n          <p class=\"lead\">Vous avez ${R} jours apr\u00E8s la r\u00E9ception de votre commande pour y renoncer, sans donner de motif, comme la loi le pr\u00E9voit. Remplissez ce formulaire, puis confirmez.</p>\n          <dl class=\"lp__kv lp__kv--side\">\n            <dt>D\u00E9lai</dt><dd>${R} jours apr\u00E8s la r\u00E9ception ; en plusieurs colis, apr\u00E8s le dernier</dd>\n            <dt>Ensuite</dt><dd>Nous vous \u00E9crivons pour organiser le retour : vous renvoyez la pi\u00E8ce dans les ${R} jours</dd>\n            <dt>Remboursement</dt><dd>Au plus tard ${R} jours apr\u00E8s votre demande, d\u00E8s la pi\u00E8ce re\u00E7ue ou sa preuve d\u2019envoi</dd>\n          </dl>\n          <p class=\"lp-form__more\">Une question avant de d\u00E9cider ? <a class=\"link\" href=\"#/contact\">\u00C9crivez-nous</a></p>\n        </div>\n        <div data-caplia-slot=\"caplia-renonce\"></div>\n      </div>\n    </section>${footer()}`;\n    return { title: 'Renoncer au contrat ici \u00B7 Caplia', html, scene: { img: tab('capiton-matin', '960'), soft: true } };\n  }\n\n  function renderMentions() {\n    const v = SITE.vendeur, h = SITE.hebergeur;\n    const r = docPage({\n      title: 'Mentions l\u00E9gales',\n      sections: [\n        { id: 'editeur', title: '\u00C9diteur du site', toc: '\u00C9diteur', html: `<dl class=\"lp__kv\">\n          <dt>Nom commercial</dt><dd>${esc(v.nomCommercial)}</dd><dt>Statut</dt><dd>${esc(v.statut)}</dd>\n          <dt>Adresse</dt><dd>${esc(v.adresse)}</dd><dt>SIREN</dt><dd>${esc(String(v.siren).replace(/^(\\d{3})(\\d{3})(\\d{3})$/, `$1${NB}$2${NB}$3`))}</dd><dt>SIRET</dt><dd>${siretFmt(v.siret)}</dd>\n          <dt>Immatriculation</dt><dd>${esc(v.immatriculation)}</dd><dt>Code APE</dt><dd>${esc(v.ape)}</dd><dt>TVA</dt><dd>${esc(v.tva)}</dd>\n          <dt>E-mail</dt><dd><a href=\"mailto:${SITE.email}\">${SITE.email}</a></dd></dl>` },\n        { id: 'hebergeur', title: 'H\u00E9bergement', html: `<dl class=\"lp__kv\"><dt>H\u00E9bergeur</dt><dd>${esc(h.nom)}</dd><dt>Adresse</dt><dd>${esc(h.adresse)}</dd>${h.telephone ? `<dt>T\u00E9l\u00E9phone</dt><dd>${esc(h.telephone)}</dd>` : ''}${h.contact ? `<dt>Contact</dt><dd><a href=\"mailto:${esc(h.contact)}\">${esc(h.contact)}</a></dd>` : ''}</dl>` },\n        { id: 'mediation', title: 'M\u00E9diation de la consommation', toc: 'M\u00E9diation', html: `<p>${mediationTxt()}</p>` },\n        { id: 'ecomaison', title: '\u00C9co-participation', html: `<p>Identifiant unique (IDU) Ecomaison pour l'ameublement : ${SITE.ecomaison && !SITE.ecomaison.aConfirmer ? esc(SITE.ecomaison.idu) : '<span class=\"note-soft\">en cours d\\'attribution</span>'}.</p>` },\n        { id: 'propriete', title: 'Propri\u00E9t\u00E9 intellectuelle', html: `<p>Les textes, la mise en page et les visuels de ce site sont prot\u00E9g\u00E9s. Toute reproduction sans autorisation \u00E9crite est interdite.</p>\n          <p class=\"lp__ident\">Entrepreneur individuel et directeur de la publication : ${esc(v.directeurPublication || v.nom)} \u00B7 t\u00E9l\u00E9phone : ${esc(v.telephone)}</p>` }\n      ],\n      scene: { img: tab('meridienne-platre', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Mentions l\u00E9gales \u00B7 Caplia' });\n  }\n\n  /* Conditions de vente : Code de la consommation (L221-5, L221-18 \u00E0 L221-24 pour la r\u00E9tractation, L216-1 \u00E0 L216-7 pour la\n     livraison, L217-3 et suivants pour la conformit\u00E9), Code civil 1641 \u00E0 1649. L'engagement \u00E9crit \u00AB Il passe chez vous \u00BB\n     est une garantie commerciale : contenu, dur\u00E9e et conditions \u00E9crits ici (PLAN-MAITRE O14, M4). */\n  /* M\u00E9diateur : nom, adresse et site affich\u00E9s d\u00E8s l'adh\u00E9sion (site.json > mediateur), obligatoire avant la premi\u00E8re vente */\n  const mediationTxt = () => { const m = SITE.mediateur || {}; return m.nom && !m.aConfirmer\n    ? `En cas de litige, adressez d'abord une r\u00E9clamation \u00E9crite \u00E0 <a href=\"mailto:${SITE.email}\">${SITE.email}</a>. Si elle n'aboutit pas, vous pouvez saisir gratuitement, dans l'ann\u00E9e qui suit votre r\u00E9clamation \u00E9crite, le m\u00E9diateur de la consommation : ${esc(m.nom)}${m.adresse ? ', ' + esc(m.adresse) : ''}${m.site ? `, <a href=\"${esc(m.site)}\" rel=\"noopener\">${esc(m.site.replace(/^https?:\\/\\//, ''))}</a>` : ''}. Ce recours est facultatif : vous gardez le droit de saisir le juge.`\n    : 'En cas de litige, apr\u00E8s une r\u00E9clamation \u00E9crite aupr\u00E8s de nous, vous pouvez saisir gratuitement un m\u00E9diateur de la consommation. <span class=\"note-soft\">Coordonn\u00E9es en cours de d\u00E9signation.</span>'; };\n  function renderCGV() {\n    const v = SITE.vendeur, d = SITE.livraison.delais, R = SITE.retours.delaiJours;\n    const pl1 = (pl) => (/^\\d|coussins/.test(pl.cadeau) ? 's' : '');\n    const r = docPage({\n      title: 'Conditions de vente',\n      lead: 'Ce que vous achetez, comment vous \u00EAtes livr\u00E9, et vos droits, \u00E9crits simplement.',\n      sections: [\n        { id: 'objet', title: 'Objet', html: `<p>Ces conditions s'appliquent aux ventes conclues sur le site Caplia entre le vendeur d\u00E9sign\u00E9 ci-dessous et toute personne qui ach\u00E8te en tant que consommateur.</p>` },\n        { id: 'vendeur', title: 'Vendeur', html: `<p>${esc(v.nomCommercial)}, entreprise individuelle (EI), ${esc(v.adresse)}. SIRET ${esc(v.siret)}. E-mail : <a href=\"mailto:${SITE.email}\">${SITE.email}</a>. L'identit\u00E9 compl\u00E8te de l'entrepreneur et son num\u00E9ro de t\u00E9l\u00E9phone figurent dans les <a href=\"#/mentions-legales\">mentions l\u00E9gales</a>.</p>` },\n        /* 18/10 (audit 08 M14) : la disponibilit\u00E9 des pi\u00E8ces d\u00E9tach\u00E9es (PIECES_DETACHEES, m\u00EAme ligne dans la fiche technique\n           de chaque meuble, techRows) */\n        { id: 'produits', title: 'Produits', html: `<p>Les caract\u00E9ristiques essentielles de chaque produit sont pr\u00E9sent\u00E9es sur sa fiche : dimensions, mati\u00E8re, couleurs, contenu des colis, pays d'exp\u00E9dition. Les photos d'ambiance montrent la pi\u00E8ce mise en sc\u00E8ne ; les dimensions, la mati\u00E8re et la couleur qui font foi sont celles de la fiche.</p>\n          <p>${PIECES_DETACHEES[0]} : ${lc1(PIECES_DETACHEES[1])}.</p>` },\n        /* 18/10 (audit 08 B2) : plus de phrase sur l'\u00E9co-organisme tant que l'adh\u00E9sion Ecomaison n'est pas finalis\u00E9e ; l'IDU\n           s'ajoute tout seul le jour o\u00F9 site.json > ecomaison.aConfirmer passe \u00E0 false */\n        { id: 'prix', title: 'Prix', html: `<p>Les prix sont indiqu\u00E9s en euros, toutes taxes comprises. TVA non applicable, article 293 B du CGI. Ils comprennent la livraison en France m\u00E9tropolitaine et l'\u00E9co-participation mobilier : le prix affich\u00E9 est le prix pay\u00E9.${SITE.ecomaison && !SITE.ecomaison.aConfirmer ? ` Identifiant unique (IDU) Ecomaison, fili\u00E8re \u00E9l\u00E9ments d'ameublement : ${esc(SITE.ecomaison.idu)}.` : ''}</p>` },\n        { id: 'commande', title: 'Commande', html: `<p>Vous choisissez vos produits, v\u00E9rifiez votre panier, indiquez votre adresse puis payez. La vente est conclue \u00E0 la confirmation du paiement ; un e-mail r\u00E9capitule votre commande et sa date de livraison.</p>` },\n        { id: 'paiement', title: 'Paiement', html: `<p>Le prix est pay\u00E9 \u00E0 la commande, par ${esc(andList(SITE.paiements.map((m) => m.replace(/^Carte/, 'carte'))))}. Le paiement est trait\u00E9 par nos prestataires de paiement : vos donn\u00E9es de carte ne nous sont jamais transmises.</p>` },\n        { id: 'livraison', title: 'Livraison', html: `<p>Nous livrons en France m\u00E9tropolitaine, et la livraison est offerte : ${d.FR[0]} \u00E0 ${d.FR[1]} jours ouvr\u00E9s pour un produit exp\u00E9di\u00E9 depuis la France, ${euMin()} \u00E0 ${euMax()} jours ouvr\u00E9s depuis ${euDe()}.${accDelay()} La date la plus tardive affich\u00E9e sur la fiche et dans l'e-mail de confirmation est la date limite de livraison. Une commande peut arriver en plusieurs colis. Les risques vous sont transf\u00E9r\u00E9s quand vous prenez possession du produit.</p>\n          <p>Si le produit n'est pas livr\u00E9 \u00E0 la date limite, vous pouvez nous demander de le livrer dans un d\u00E9lai suppl\u00E9mentaire raisonnable puis, \u00E0 d\u00E9faut, r\u00E9soudre la vente : vous \u00EAtes alors rembours\u00E9 au plus tard 14 jours apr\u00E8s.</p>` },\n        { id: 'passage', title: 'Engagement \u00AB Il passe chez vous \u00BB', toc: 'Il passe chez vous', html: `<p>Avant votre commande, envoyez-nous par e-mail la largeur de votre porte la plus \u00E9troite et de votre escalier, et l'\u00E9tage. Notre confirmation s'appuie sur ces mesures et sur les cotes du plus grand colis de la pi\u00E8ce ; lorsque ces cotes ne sont pas encore connues, nous les v\u00E9rifions aupr\u00E8s de notre fournisseur avant de vous r\u00E9pondre. Si nous vous confirmons par \u00E9crit que la pi\u00E8ce passe et qu'elle ne peut pas entrer chez vous avec les mesures que vous nous avez envoy\u00E9es, nous la reprenons \u00E0 nos frais et vous remboursons la totalit\u00E9 de son prix, au plus tard 14 jours apr\u00E8s votre demande. Cet engagement s'ajoute \u00E0 vos droits l\u00E9gaux.</p>` },\n        { id: 'retractation', title: 'Droit de r\u00E9tractation', toc: 'R\u00E9tractation', html: `<p>Comme la loi le pr\u00E9voit, vous disposez de ${R} jours \u00E0 compter de la r\u00E9ception pour vous r\u00E9tracter, sans motif. Si votre commande arrive en plusieurs colis, ce d\u00E9lai court \u00E0 partir de la r\u00E9ception du dernier. Il suffit d'une d\u00E9claration claire : en ligne, sur la page <a href=\"#/renoncer\">Renoncer au contrat ici</a>, par e-mail \u00E0 <a href=\"mailto:${SITE.email}\">${SITE.email}</a>, ou avec le formulaire ci-dessous. Le produit est renvoy\u00E9 complet dans les ${R} jours qui suivent votre demande. Vous pouvez examiner le produit comme en magasin ; une d\u00E9pr\u00E9ciation due \u00E0 d'autres manipulations peut \u00EAtre d\u00E9duite du remboursement.</p>\n          <p>${retourCout()}</p>\n          <p>Nous vous remboursons au plus tard ${R} jours apr\u00E8s votre demande, sur le moyen de paiement utilis\u00E9. Le remboursement peut attendre la r\u00E9ception du produit ou la preuve de son exp\u00E9dition.</p>\n          <h3>Formulaire de r\u00E9tractation</h3>\n          <p>\u00C0 envoyer \u00E0 ${esc(v.nomCommercial)}, entreprise individuelle, SIRET ${esc(v.siret)}, ${esc(v.adresse)}, <a href=\"mailto:${SITE.email}\">${SITE.email}</a> : \u00AB Je vous notifie par la pr\u00E9sente ma r\u00E9tractation du contrat portant sur la vente du bien ci-dessous. Command\u00E9 le \u2026 , re\u00E7u le \u2026 . Nom du consommateur. Adresse du consommateur. Signature (en cas d'envoi sur papier). Date. \u00BB</p>` },\n        { id: 'garanties', title: 'Garanties l\u00E9gales', html: `<div class=\"lp__box\">${(SITE.encadreGarantie || []).map((t) => `<p>${esc(t)}</p>`).join('')}</div>\n          <p>En clair : comme la loi le pr\u00E9voit, les produits b\u00E9n\u00E9ficient de la garantie l\u00E9gale de conformit\u00E9 (articles L217-3 et suivants du Code de la consommation) pendant 2 ans \u00E0 compter de la d\u00E9livrance. Un d\u00E9faut qui appara\u00EEt pendant ce d\u00E9lai est pr\u00E9sum\u00E9 exister au moment de la d\u00E9livrance (article L217-7).</p>\n          <p>Vous choisissez entre la r\u00E9paration et le remplacement, sauf si l'un co\u00FBte nettement plus que l'autre ; la mise en conformit\u00E9 a lieu dans les 30 jours suivant votre demande, sans frais pour vous. Si elle est impossible, tardive ou cause un inconv\u00E9nient majeur, vous obtenez une r\u00E9duction du prix en gardant le produit, ou le remboursement en le rendant.</p>\n          <p>Les produits b\u00E9n\u00E9ficient aussi de la garantie des vices cach\u00E9s (articles 1641 et suivants du Code civil) : l'action est \u00E0 engager dans les 2 ans suivant la d\u00E9couverte du vice (article 1648). Des exemples sont donn\u00E9s sur la page <a href=\"#/garantie\">Garantie l\u00E9gale, en clair</a>.</p>` },\n        { id: 'cadeaux', title: 'Cadeaux', html: `<ul>${SITE.paliers.map((pl) => `<li>D\u00E8s ${price(pl.seuil)} de meubles : ${esc(pl.cadeau)}, offert${pl1(pl)}, envoy\u00E9${pl1(pl)} dans un colis s\u00E9par\u00E9.</li>`).join('')}</ul><p>Les cadeaux s'ajoutent automatiquement au panier ; le palier s'appr\u00E9cie sur le montant des meubles de la commande (${GIFT_MEUBLES}), sans compter ${GIFT_HORS} achet\u00E9s seuls. La valeur indiqu\u00E9e pour chaque cadeau est le prix de vente du m\u00EAme article, vendu seul sur caplia.fr.</p><p>Si vous vous r\u00E9tractez et que les meubles que vous gardez n'atteignent plus un palier, le cadeau de ce palier est \u00E0 renvoyer avec eux ; son retour est offert.</p>` },\n        /* 18/10 (audit 03) : section \u00AB Parrainage \u00BB retir\u00E9e : ni champ au panier ni question au paiement pour l'indiquer */\n        { id: 'ancien', title: 'Votre ancien meuble', html: `<p>Votre ancien canap\u00E9 peut avoir une seconde vie, gratuitement : d\u00E9posez-le dans un point de collecte de meubles ou une d\u00E9ch\u00E8terie, o\u00F9 il sera r\u00E9utilis\u00E9 ou recycl\u00E9 ; donnez-le \u00E0 une association ou \u00E0 un voisin ; ou revendez-le s'il est en bon \u00E9tat.</p>` },\n        { id: 'donnees', title: 'Donn\u00E9es personnelles', toc: 'Donn\u00E9es', html: `<p>Vos donn\u00E9es servent \u00E0 traiter votre commande. Si vous commandez, nous pourrons vous \u00E9crire au sujet de pi\u00E8ces semblables \u00E0 votre achat ; vous pouvez refuser \u00E0 la commande ou \u00E0 tout moment, d'un clic, dans chaque e-mail. Voir la page <a href=\"#/confidentialite\">Confidentialit\u00E9</a>.</p>` },\n        { id: 'litiges', title: 'M\u00E9diation et droit applicable', toc: 'M\u00E9diation', html: `<p>Les pr\u00E9sentes conditions sont soumises au droit fran\u00E7ais. ${mediationTxt()}</p>` }\n      ],\n      scene: { img: tab('meridienne-platre', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Conditions de vente \u00B7 Caplia' });\n  }\n\n  function renderPrivacy() {\n    const v = SITE.vendeur;\n    const r = docPage({\n      title: 'Confidentialit\u00E9',\n      lead: 'Les donn\u00E9es que nous gardons, pourquoi, et comment les faire effacer.',\n      sections: [\n        { id: 'responsable', title: 'Responsable du traitement', toc: 'Responsable', html: `<p>${esc(v.nomCommercial)}, entreprise individuelle (identit\u00E9 compl\u00E8te dans les <a href=\"#/mentions-legales\">mentions l\u00E9gales</a>), ${esc(v.adresse)}. Contact : <a href=\"mailto:${SITE.email}\">${SITE.email}</a>.</p>` },\n        { id: 'donnees', title: 'Donn\u00E9es collect\u00E9es', html: `<ul><li>Identit\u00E9 et coordonn\u00E9es : nom, e-mail, t\u00E9l\u00E9phone, adresse de livraison.</li><li>Commande : produits, montants, historique.</li><li>Paiement : trait\u00E9 par les prestataires de paiement ; nous ne conservons pas vos num\u00E9ros de carte.</li><li>Messages que vous nous envoyez.</li></ul>` },\n        { id: 'finalites', title: 'Pourquoi', html: `<p>Traiter et livrer votre commande, r\u00E9pondre \u00E0 vos messages, g\u00E9rer les retours et les garanties, respecter nos obligations comptables.</p><p>Base l\u00E9gale : l'ex\u00E9cution de votre commande, nos obligations comptables, votre accord pour les e-mails et la mesure d'audience.</p>` },\n        { id: 'destinataires', title: 'Destinataires', html: `<p>L'h\u00E9bergeur du site (${esc(SITE.hebergeur.nom)}), les prestataires de paiement et les transporteurs, chacun pour ce qui le concerne. Nos fournisseurs re\u00E7oivent vos nom, adresse et t\u00E9l\u00E9phone pour exp\u00E9dier votre commande ; certains sont \u00E9tablis hors de l'Union europ\u00E9enne, notamment en Chine. Vos donn\u00E9es ne sont pas vendues. Certains prestataires (Shopify, Google) peuvent traiter des donn\u00E9es hors de l'Union europ\u00E9enne, avec les garanties pr\u00E9vues par le RGPD.</p>` },\n        { id: 'duree', title: 'Dur\u00E9e de conservation', toc: 'Conservation', html: `<p>Les donn\u00E9es de commande sont conserv\u00E9es le temps de la relation commerciale puis archiv\u00E9es pour la dur\u00E9e l\u00E9gale ; les pi\u00E8ces comptables sont conserv\u00E9es 10 ans.</p>` },\n        { id: 'stockage', title: 'Stockage dans votre navigateur', toc: 'Navigateur', html: `<p>Votre panier est enregistr\u00E9 par Shopify pour le retrouver \u00E0 votre prochaine visite ; votre s\u00E9lection reste dans votre navigateur.</p><p>Si vous cochez la case d'inscription, nous vous \u00E9crivons au sujet de nos pi\u00E8ces, de nos conseils et des pi\u00E8ces que vous avez regard\u00E9es ou mises au panier. Si vous commandez, nous pourrons vous \u00E9crire au sujet de pi\u00E8ces semblables \u00E0 votre achat ; vous pouvez refuser \u00E0 la commande ou \u00E0 tout moment. Chaque e-mail contient un lien pour vous d\u00E9sinscrire.</p><p>\u00AB Recevoir cette fiche par e-mail \u00BB, sur les fiches : sans la case coch\u00E9e, rien n\u2019est enregistr\u00E9, la fiche part depuis votre propre messagerie ou en PDF. Case coch\u00E9e, votre adresse sert \u00E0 vous envoyer la fiche et nos e-mails, avec votre accord, jusqu\u2019\u00E0 votre d\u00E9sinscription et au plus trois ans apr\u00E8s notre dernier \u00E9change.</p>` },\n        { id: 'mesure', title: 'Mesure d\u2019audience et publicit\u00E9', toc: 'Publicit\u00E9', html: `<p>Avec votre accord, donn\u00E9 dans le bandeau des cookies, nous mesurons la fr\u00E9quentation du site et l'efficacit\u00E9 de nos annonces Google. Vous pouvez changer d'avis \u00E0 tout moment avec le lien \u00AB G\u00E9rer les cookies \u00BB, en bas de chaque page.</p><p>Si vous \u00EAtes client ou inscrit, votre adresse e-mail peut \u00EAtre transmise \u00E0 Google sous une forme brouill\u00E9e, pour vous \u00E9viter des publicit\u00E9s inutiles. Vous pouvez vous y opposer \u00E0 tout moment en nous \u00E9crivant.</p>` },\n        { id: 'droits', title: 'Vos droits', html: `<p>Vous pouvez demander l'acc\u00E8s, la rectification, l'effacement, la limitation ou la portabilit\u00E9 de vos donn\u00E9es, et vous opposer \u00E0 leur traitement, en \u00E9crivant \u00E0 <a href=\"mailto:${SITE.email}\">${SITE.email}</a>. Vous pouvez aussi adresser une r\u00E9clamation \u00E0 la CNIL.</p>` }\n      ],\n      scene: { img: tab('petit-incurve-galerie', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Confidentialit\u00E9 \u00B7 Caplia' });\n  }\n\n  /* Garantie l\u00E9gale, en clair : la peur n\u00B0 2 du march\u00E9 (\u00AB usure normale \u00BB, MANQUES-DU-MARCHE.md \u00A72).\n     Droit l\u00E9gal pr\u00E9sent\u00E9 comme tel (art. L121-4), jamais comme un cadeau Caplia. Sources : Code de la consommation\n     L217-3 \u00E0 L217-17, Code civil 1641 \u00E0 1649, fiche service-public.fr F11094 (lue le 04/10/2026). */\n  function renderGarantie() {\n    const cas = [\n      [\"L'assise\", \"Une place qui se creuse nettement plus que les autres, une mousse qui ne reprend plus sa forme apr\u00E8s une nuit.\", 'Une mousse neuve qui s\u2019assouplit un peu les premi\u00E8res semaines, puis se fait \u00E0 vous.'],\n      ['Les coutures', 'Une couture qui s\u2019ouvre ou un fil qui l\u00E2che le long d\u2019une assise, sans choc ni accroc.', 'Un accroc de griffe ou de boucle de ceinture : la vie de tous les jours.'],\n      ['La couleur', 'Une couleur re\u00E7ue diff\u00E9rente de la fiche. La loi le dit : la pi\u00E8ce doit correspondre \u00E0 sa description.', 'Un tissu qui se patine doucement, apr\u00E8s des ann\u00E9es au soleil.'],\n      ['Le tissu', 'Des bouloches qui couvrent l\u2019assise en quelques mois.', 'Quelques bouloches isol\u00E9es, qui partent d\u2019un passage de rasoir \u00E0 tissu.'],\n      ['\u00C0 la livraison', 'Un pied cass\u00E9, une pi\u00E8ce qui manque, un tissu tach\u00E9 \u00E0 l\u2019ouverture du carton.', 'Un carton marqu\u00E9 par le voyage, avec une pi\u00E8ce intacte \u00E0 l\u2019int\u00E9rieur.']\n    ];\n    const r = docPage({\n      title: 'Garantie l\u00E9gale, en clair',\n      lead: 'Deux ans pour signaler un d\u00E9faut. Vous montrez le d\u00E9faut (une photo suffit), sans avoir \u00E0 prouver qu\u2019il existait \u00E0 la livraison, et la r\u00E9paration est pour nous. Voici ce qui est couvert, avec des exemples.',\n      sections: [\n        { id: 'en-bref', title: 'En bref', html: `<p>Comme la loi le pr\u00E9voit, chaque pi\u00E8ce Caplia doit \u00EAtre conforme \u00E0 sa fiche et \u00E0 l'usage qu'on attend d'un canap\u00E9, d'un fauteuil ou d'un objet de d\u00E9coration. C'est la <strong>garantie l\u00E9gale de conformit\u00E9</strong>. Elle dure <strong>2 ans \u00E0 partir de la livraison</strong> et elle est gratuite.</p>\n          <p>Vous montrez le d\u00E9faut, une photo suffit. Vous n'avez pas \u00E0 prouver qu'il existait \u00E0 la livraison : un d\u00E9faut qui appara\u00EEt pendant ces 2 ans est consid\u00E9r\u00E9 comme pr\u00E9sent d\u00E8s la livraison.</p>` },\n        { id: 'exemples', title: 'D\u00E9faut ou usure : des exemples', toc: 'Des exemples', html: `<p>La garantie couvre les d\u00E9fauts. La vie de tous les jours, elle, laisse quelques traces normales, comme sur tout meuble. Voici o\u00F9 passe la limite.</p>\n          <div class=\"gx\">${cas.map(([k, oui, non]) => `<div class=\"gx__row\"><h3 class=\"gx__k\">${k}</h3><dl class=\"gx__d\"><dt>Couvert</dt><dd>${oui}</dd><dt>Usage normal</dt><dd>${non}</dd></dl></div>`).join('')}</div>` },\n        { id: 'droits', title: 'Ce que vous obtenez', html: `<ul>\n            <li><strong>La r\u00E9paration ou le remplacement</strong>, au choix, sauf si l'un co\u00FBte nettement plus cher que l'autre.</li>\n            <li><strong>Dans les 30 jours</strong> qui suivent votre demande.</li>\n            <li><strong>Sans frais</strong> : transport, pi\u00E8ces et main-d'\u0153uvre sont pour nous.</li>\n            <li>Si r\u00E9parer ou remplacer est impossible ou trop long : <strong>une r\u00E9duction du prix</strong> si vous gardez la pi\u00E8ce, ou <strong>le remboursement</strong> si vous la rendez, au plus tard 14 jours apr\u00E8s votre d\u00E9cision.</li>\n          </ul>` },\n        { id: 'demarche', title: 'Comment faire', html: `<ol class=\"lp__steps\">\n            <li><strong>Prenez une photo du d\u00E9faut</strong> et envoyez-la \u00E0 <a href=\"mailto:${SITE.email}\">${SITE.email}</a> avec votre num\u00E9ro de commande.</li>\n            <li><strong>Nous vous r\u00E9pondons ${reponse()}</strong> et nous organisons la r\u00E9paration ou le remplacement, selon votre choix.</li>\n            <li><strong>Nous organisons tout</strong> : l'envoi de la pi\u00E8ce de rechange ou l'enl\u00E8vement, \u00E0 nos frais.</li>\n          </ol>\n          <p class=\"lp__cta\"><a class=\"btn\" href=\"#/un-souci\">Signaler un d\u00E9faut</a></p>` },\n        { id: 'vices', title: 'La garantie des vices cach\u00E9s', toc: 'Vices cach\u00E9s', html: `<p>En plus, comme la loi le pr\u00E9voit, la garantie des vices cach\u00E9s couvre un d\u00E9faut invisible \u00E0 l'achat qui rend la pi\u00E8ce impropre \u00E0 son usage. Vous avez 2 ans \u00E0 partir de la d\u00E9couverte du d\u00E9faut pour la faire jouer.</p>` },\n        { id: 'textes', title: 'Les textes de loi', html: `<ul>\n            <li>Garantie l\u00E9gale de conformit\u00E9 : Code de la consommation, articles L217-3 et suivants.</li>\n            <li>Garantie des vices cach\u00E9s : Code civil, articles 1641 \u00E0 1649.</li>\n          </ul>\n          <p>Cette page explique vos droits avec des mots simples. En cas de doute, ce sont les textes de loi qui comptent.</p>` }\n      ],\n      scene: { img: tab('meridienne-platre', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Garantie l\u00E9gale, en clair \u00B7 Caplia' });\n  }\n\n  /* Paiement et s\u00E9curit\u00E9 (09/10, analyse des cr\u00E9ateurs e-commerce, GROUPE-1 n\u00B0 2) : seulement les moyens vraiment propos\u00E9s\n     par la page de paiement Shopify (relev\u00E9s le 09/10 sur caplia.fr : carte Visa, Mastercard, American Express, CB et Maestro,\n     Shop Pay, PayPal ; Apple Pay sur les appareils Apple ; Google Pay retir\u00E9 le 12/10 : Shopify ne le propose pas aux boutiques \u00E9tablies en France, absent de la page de paiement ;\n     Maestro retir\u00E9 le 18/10 : absent des moyens affich\u00E9s par Shopify sur caplia.fr), dans l'ordre de site.json > paiements (pied de page). */\n  function renderPaiement() {\n    const r = docPage({\n      title: 'Paiement et s\u00E9curit\u00E9',\n      /* 18/10 (audit 09, 3.7) : plus \u00AB en une fois \u00BB (r\u00E8gle interne jamais annonc\u00E9e, et faux le jour du paiement en 4 fois) */\n      lead: 'Vous payez sur la page de paiement s\u00E9curis\u00E9e de Shopify, au moment de la commande. Voici les moyens accept\u00E9s et ce qui prot\u00E8ge votre achat.',\n      sections: [\n        { id: 'moyens', title: 'Les moyens accept\u00E9s', html: `<ul>\n            <li><strong>Carte bancaire</strong> : Visa, Mastercard, American Express et CB.</li>\n            <li><strong>Shop Pay</strong>, le paiement rapide de Shopify.</li>\n            <li><strong>PayPal</strong>, avec votre compte PayPal.</li>\n            <li><strong>Apple Pay</strong>, sur iPhone, iPad et Mac.</li>\n          </ul>\n          <p>Aucuns frais ne s'ajoutent au prix, quel que soit le moyen choisi.</p>` },\n        { id: 'chiffre', title: 'Un paiement chiffr\u00E9', html: `<p>Le paiement est trait\u00E9 par Shopify Payments, le service de paiement de Shopify. La connexion est chiffr\u00E9e et Shopify applique la norme de s\u00E9curit\u00E9 des cartes bancaires (PCI DSS).</p>\n          <p><strong>Votre num\u00E9ro de carte ne nous est jamais transmis</strong> : nous ne voyons ni le num\u00E9ro complet, ni le code de s\u00E9curit\u00E9. Votre banque peut vous demander de confirmer le paiement sur votre t\u00E9l\u00E9phone (3D Secure) : c'est une protection de plus.</p>` },\n        { id: 'paypal', title: 'PayPal et sa protection des achats', toc: 'PayPal', html: `<p>En payant avec PayPal, vous profitez de la Protection des achats PayPal, selon ses conditions : si un colis n'arrive pas ou ne correspond pas \u00E0 sa description, vous pouvez le signaler \u00E0 PayPal.</p>` },\n        { id: 'remboursement', title: 'Si vous changez d\u2019avis', toc: 'Remboursement', html: `<p>Vous avez <strong>${SITE.retours.delaiJours} jours</strong> apr\u00E8s la r\u00E9ception pour vous r\u00E9tracter, sans donner de raison. Nous vous remboursons <strong>au plus tard 14 jours apr\u00E8s votre demande</strong>, sur le moyen de paiement utilis\u00E9. Le remboursement peut attendre la r\u00E9ception de la pi\u00E8ce ou la preuve de son envoi.</p>\n          <p>Les frais de retour, pi\u00E8ce par pi\u00E8ce : <a class=\"u\" href=\"#/livraison?s=retractation\">Livraison et retours</a>. Pour nous pr\u00E9venir : <a class=\"u\" href=\"#/renoncer\">Renoncer au contrat ici</a>.</p>` }\n      ],\n      scene: { img: tab('capiton-matin', '960'), soft: true }\n    });\n    return Object.assign(r, { title: 'Paiement et s\u00E9curit\u00E9 \u00B7 Caplia' });\n  }\n\n  /* =========================================================\n     PAGES D'ENTR\u00C9E, S\u00C9LECTION, MERCI\n     ========================================================= */\n  /* Grande image + carte de verre : le haut de chaque page d'entr\u00E9e */\n  function lhero({ img, imgM, alt, title, line, pos = '50% 50%' }) {\n    return `<section class=\"wrap\">\n      <div class=\"lhero reveal\">\n        <picture class=\"lhero__img\">${imgM ? `<source media=\"(max-width: 760px)\" srcset=\"${imgM}\">` : ''}<img src=\"${img}\" alt=\"${esc(alt)}\" decoding=\"async\" fetchpriority=\"high\" style=\"object-position:${pos}\"></picture>\n        <div class=\"lhero__card glass glass--strong\">\n          <h1 class=\"display\">${title}</h1>\n          ${line ? `<p class=\"lhero__line\">${esc(line)}</p>` : ''}\n        </div>\n      </div>\n    </section>`;\n  }\n\n  const PASSE = { slug: 'petit-mouton' };\n  /* Petits espaces : persona \u00AB 4e sans ascenseur \u00BB (marketing/PERSONAS.md, P4). Affiche Flocon, preuves chiffr\u00E9es,\n     \u00AB Passera-t-il ? \u00BB, les trois pi\u00E8ces qui passent, l'ensemble Flocon + Perle, questions (seo-pages.json : petit-canape). */\n  function renderSmall() {\n    const f = BY['petit-mouton'], o = BY['petit-incurve'], pe = BY.galet;\n    const mid = BY.capiton;   /* au-del\u00E0 de 200 cm : Nacre (211 cm, 3 places), comme sur #/collections/petit-canape */\n    PASSE.slug = f.slug;\n    const ei = ENS.findIndex((e) => e.items[0][0] === 'petit-mouton');\n    const ens = ei >= 0 ? ENS[ei] : null;\n    const tot = ens ? ensTotal(ens) : 0;\n    const gifts = ens ? giftsFor(tot) : [];\n    const SZ3 = '(max-width: 760px) calc(100vw - 32px), 31vw';\n    const piece = (p, line) => `<article class=\"en-piece\">\n        <a class=\"en-piece__link\" href=\"#/p/${p.slug}\" aria-label=\"${esc(p.nom)}, ${esc(lc1(cardType(p)))}, ${price(p.prix)}\"></a>\n        <span class=\"en-piece__img\">${studioImg(p, { alt: `${p.nom}, ${p.type.toLowerCase()}, sur fond clair`, sizes: SZ3, cadres: ['11'] })}</span>\n        <div class=\"en-piece__row\"><h3 class=\"t-3\">${esc(p.nom)}</h3><p class=\"price\">${price(p.prix)}</p></div>\n        <p class=\"en-piece__line\">${line}</p>\n      </article>`;\n    const faq = [\n      ['Quel canap\u00E9 pour un petit espace ?', 'Un canap\u00E9 de 140 \u00E0 190 cm de large, aux accoudoirs arrondis, livr\u00E9 compress\u00E9 si l\u2019acc\u00E8s est \u00E9troit. Flocon (142 cm) et Opaline (188 cm) r\u00E9pondent \u00E0 ces trois points.'],\n      ['Quelles sont les dimensions d\u2019un petit canap\u00E9 2 places ?', 'En g\u00E9n\u00E9ral 130 \u00E0 160 cm de large et 80 \u00E0 90 cm de profondeur. Flocon mesure 142 \u00D7 85 cm, pour 73,5 cm de haut.'],\n      ['Un petit canap\u00E9 peut-il aller dans une chambre ?', 'Oui : avec 142 cm de large, Flocon tient au pied d\u2019un lit double ou sous une fen\u00EAtre. Il devient un coin lecture.'],\n      ['Comment savoir si le canap\u00E9 passera ma porte ?', `Mesurez la porte la plus \u00E9troite et l\u2019escalier, puis envoyez-nous ces mesures \u00E0 <a class=\"u\" href=\"mailto:${SITE.email}\">${SITE.email}</a> : nous v\u00E9rifions que la pi\u00E8ce passe et vous r\u00E9pondons par \u00E9crit sous 24 h, du lundi au samedi. Si nous avons dit oui et qu\u2019elle ne passe pas, nous la reprenons \u00E0 nos frais.`]\n    ];\n    const html = `<section class=\"wrap en-hero\">\n      <div class=\"en-hero__text\">\n        <h1 class=\"t-display en-hero__t\">4<sup>e</sup> sans ascenseur ? Un seul carton.</h1>\n        <p class=\"lead en-hero__lead\">Flocon arrive compress\u00E9 dans un carton plus petit que lui, qui se porte \u00E0 deux. Ouvert, il retrouve sa vraie taille : 142 cm de large, assise \u00E0 42 cm du sol.</p>\n        <div class=\"en-hero__buy\"><a class=\"btn\" href=\"#/p/${f.slug}\">Voir Flocon</a><p class=\"price en-hero__price\">${price(f.prix)}</p></div>\n        <p class=\"en-hero__date\">Livraison offerte, chez vous ${delivery(f)}.</p>\n      </div>\n      <div class=\"en-hero__img\">${studioImg(f, { alt: 'Flocon, canap\u00E9 2 places en tissu effet peau de mouton Cr\u00E8me guimauve, sur fond clair', sizes: '(max-width: 760px) calc(100vw - 32px), (max-width: 980px) 50vw, (min-width: 1440px) 800px, 56vw', eager: true, cadres: [['(max-width: 760px)', '11'], ['(max-width: 980px)', '45'], [null, '54']] })}</div>\n    </section>\n\n    <section class=\"wrap sec\">\n      <h2 class=\"t-2 en-h\">Un vrai canap\u00E9, en format petit.</h2>\n      <dl class=\"en-facts\">\n        <div><dt>142 cm</dt><dd>De large. Sur un mur de 2,20 m, il laisse la place d\u2019une lampe ou d\u2019une petite table.</dd></div>\n        <div><dt>1 carton</dt><dd>Un seul colis \u00E0 monter jusqu\u2019\u00E0 l\u2019\u00E9tage, et un seul num\u00E9ro de suivi.</dd></div>\n        <div><dt>42 cm</dt><dd>Du sol \u00E0 l\u2019assise, plus haut que la moyenne des canap\u00E9s (38 cm) : on se rel\u00E8ve sans effort.</dd></div>\n        <div><dt>72 h</dt><dd>Le temps qu\u2019il reprenne sa forme, une fois le carton ouvert. Aucun outil, rien \u00E0 monter.</dd></div>\n      </dl>\n    </section>\n\n    <section class=\"wrap sec en-passe\" data-passe>\n      <div class=\"en-passe__intro\">\n        <h2 class=\"t-2\"><span class=\"en-nowrap\">Passera-t-il</span> chez vous ?</h2>\n        <p class=\"lead\">Indiquez la largeur de votre porte la plus \u00E9troite, puis envoyez-nous aussi celle de l\u2019escalier : nous v\u00E9rifions que la pi\u00E8ce passe et vous r\u00E9pondons par \u00E9crit sous 24 h, du lundi au samedi. Si nous avons dit oui et qu\u2019elle ne passe pas, nous la reprenons \u00E0 nos frais.</p>\n      </div>\n      <div class=\"en-passe__tool\">\n        <div class=\"en-passe__pick\" role=\"radiogroup\" aria-label=\"Pi\u00E8ce \u00E0 v\u00E9rifier\">\n          ${[f, o, pe].map((p, i) => `<button class=\"pill\" type=\"button\" role=\"radio\" aria-checked=\"${i === 0}\" data-action=\"passe-pick\" data-slug=\"${p.slug}\">${esc(p.nom)}</button>`).join('')}\n        </div>\n        <form class=\"passe__form\" data-passe-form novalidate>\n          <label class=\"passe__lbl\" for=\"passe-w\">Largeur de la porte, en centim\u00E8tres</label>\n          <div class=\"passe__row\">\n            <span class=\"passe__field\"><input id=\"passe-w\" name=\"w\" type=\"number\" inputmode=\"numeric\" min=\"30\" max=\"300\" placeholder=\"80\"><span aria-hidden=\"true\">cm</span></span>\n            <button class=\"btn\" type=\"submit\">V\u00E9rifier</button>\n          </div>\n        </form>\n        <p class=\"passe__a\" data-passe-msg aria-live=\"polite\">${passeHint()}</p>\n      </div>\n    </section>\n\n    <section class=\"wrap sec\">\n      <h2 class=\"t-2 en-h\">Trois pi\u00E8ces pour les petits salons</h2>\n      <div class=\"en-trio\">\n        ${piece(f, '142 cm, deux places. Un seul colis compress\u00E9, rien \u00E0 monter.')}\n        ${piece(o, '188 cm, 2 \u00E0 3 places. Deux parties compress\u00E9es, r\u00E9unies sur place.')}\n        ${piece(pe, '67 \u00D7 67 cm : une place de plus, dans un coin ou pr\u00E8s de la fen\u00EAtre. Il passe une porte de 69 cm.')}\n      </div>\n    </section>\n\n    <section class=\"wrap sec en-split\">\n      <div>\n        <h2 class=\"t-2\">Quelle largeur pour votre pi\u00E8ce ?</h2>\n        <p class=\"en-split__p\">Un rep\u00E8re simple : le canap\u00E9 occupe environ les deux tiers du mur sur lequel il s\u2019appuie.</p>\n      </div>\n      <table class=\"en-table\">\n        <thead><tr><th scope=\"col\">Largeur</th><th scope=\"col\">Pi\u00E8ce</th><th scope=\"col\">Chez Caplia</th></tr></thead>\n        <tbody>\n          <tr><td class=\"num\">140 \u00E0 160 cm</td><td>Studio, chambre, petit salon</td><td><a class=\"u\" href=\"#/p/${f.slug}\">Flocon</a>, 142 cm</td></tr>\n          <tr><td class=\"num\">180 \u00E0 200 cm</td><td>Salon de 12 \u00E0 18 m\u00B2</td><td><a class=\"u\" href=\"#/p/${o.slug}\">Opaline</a>, 188 cm</td></tr>\n          ${mid ? `<tr><td class=\"num\">200 \u00E0 215 cm</td><td>Salon moyen</td><td><a class=\"u\" href=\"#/p/${mid.slug}\">${esc(mid.nom)}</a>, ${cm(mid.dimensions.largeur)}</td></tr>` : ''}\n        </tbody>\n      </table>\n    </section>\n\n    ${ens ? `<section class=\"wrap sec en-ens\">\n      <div class=\"en-ens__img en-ens__img--photo\">${ensPic('petit-mouton', 'Flocon et Perle c\u00F4te \u00E0 c\u00F4te dans le studio Caplia', '(max-width: 980px) calc(100vw - 32px), 58vw')}</div>\n      <div class=\"en-ens__text\">\n        <h2 class=\"t-2\">${esc(ens.nom)}</h2>\n        <p class=\"lead\">Flocon et Perle, dans le m\u00EAme ton cr\u00E8me : un canap\u00E9, un fauteuil, un petit salon complet. ${gifts.length ? `Ensemble, ils d\u00E9passent ${price(gifts[0].seuil)} : ${esc(gifts[0].cadeau)} offerts.` : ''}</p>\n        <div class=\"en-hero__buy\"><button class=\"btn\" type=\"button\" data-action=\"ens-add\" data-i=\"${ei}\">Ajouter l\u2019ensemble</button><p class=\"price en-hero__price\">${price(tot)}</p></div>\n      </div>\n    </section>` : ''}\n\n    <section class=\"wrap sec en-faq\">\n      <h2 class=\"t-2\">Vos questions</h2>\n      <div>${faq.map(([q, r]) => acc(esc(q), r)).join('')}</div>\n    </section>\n    ${footer()}`;\n    return { title: 'Petit canap\u00E9 pour petits espaces, livr\u00E9 compress\u00E9 \u00B7 Caplia', html };\n  }\n  /* Avant la saisie : le fait, selon la pi\u00E8ce (m\u00EAme r\u00E8gle que doorAnswer). Pi\u00E8ce compress\u00E9e : son carton est plus petit\n     qu'elle, et elle ne \u00AB passe \u00BB une porte chiffr\u00E9e que si les cotes du carton sont connues ; les autres passent de profil\n     une porte un peu plus large que leur plus petite mesure. */\n  const passeHint = () => {\n    const p = BY[PASSE.slug];\n    const e = isFem(p), dm = doorMin(p);\n    const parts = (p.carton || []).find((t) => /^\\d+ (modules|parties)/i.test(t));\n    if (isCompressed(p) && dm == null) return `${esc(p.nom)} voyage ${parts ? `en ${esc(parts.toLowerCase())}` : `compress\u00E9${e ? 'e' : ''}`}, dans ${parts || colisN(p) > 1 ? 'des cartons plus petits' : 'un carton plus petit'} ${e ? \"qu'elle\" : 'que lui'}. Indiquez la largeur de votre porte la plus \u00E9troite.`;\n    return `${isCompressed(p) ? `Le plus grand carton ${deN(esc(p.nom))}` : esc(p.nom)} passe de profil une porte de ${cm(Math.ceil(dm + 2))} ou plus. Indiquez la v\u00F4tre pour en \u00EAtre s\u00FBr.`;\n  };\n\n  /* Jeunes parents : persona \u00AB b\u00E9b\u00E9 arrive \u00BB (marketing/PERSONAS.md, P3). Affiche Aurore, ce qui compte la nuit,\n     les rep\u00E8res Aurore / Valse, la liste de naissance, apr\u00E8s b\u00E9b\u00E9, questions (seo-pages.json : fauteuil-allaitement). */\n  function renderParents() {\n    const a = BY.veilleuse, v = BY.berceuse;\n    const SZ2 = '(max-width: 760px) calc(100vw - 32px), 46vw';\n    const piece = (p, line) => `<article class=\"en-piece\">\n        <a class=\"en-piece__link\" href=\"#/p/${p.slug}\" aria-label=\"${esc(p.nom)}, ${esc(lc1(cardType(p)))}, ${price(p.prix)}\"></a>\n        <span class=\"en-piece__img\">${studioImg(p, { alt: `${p.nom}, ${p.type.toLowerCase()}, sur fond clair`, sizes: SZ2, cadres: [['(max-width: 760px)', '11'], [null, '54']] })}</span>\n        <div class=\"en-piece__row\"><h3 class=\"t-3\">${esc(p.nom)}</h3><p class=\"price\">${price(p.prix)}</p></div>\n        <p class=\"en-piece__line\">${line}</p>\n        <div class=\"en-piece__acts\">${birthBtn(p)}</div>\n      </article>`;\n    const rows = [\n      ['Hauteur d\u2019assise', '40 \u00E0 45 cm : les pieds \u00E0 plat, les genoux \u00E0 angle droit', '43 cm', '42 cm'],\n      ['Dossier', 'Haut et enveloppant, pour tenir le dos pendant les t\u00E9t\u00E9es de nuit', '\u00C0 oreilles, 47 cm au-dessus de l\u2019assise', 'Capitonn\u00E9, 49 cm au-dessus de l\u2019assise, coussin d\u2019appui-t\u00EAte'],\n      ['Accoudoirs', 'Rembourr\u00E9s, pour soutenir le bras qui porte b\u00E9b\u00E9', 'Oui', 'Oui'],\n      ['Bascule', 'Un balancement doux, sans \u00E0-coup', 'Bois courb\u00E9', 'Patins en bois'],\n      ['Repose-pieds', 'Pour lever les genoux et rapprocher b\u00E9b\u00E9', 'Livr\u00E9 avec', 'Pieds \u00E0 plat, \u00E0 42 cm'],\n      ['Tissu', 'Doux, qui se nettoie en tamponnant', 'Effet lin', 'Moumoute']\n    ];\n    const faq = [\n      ['Quel fauteuil choisir pour allaiter ?', 'Celui qui garde votre dos droit et soutenu : une assise entre 40 et 45 cm, un dossier haut, des accoudoirs rembourr\u00E9s et un repose-pieds. Une bascule douce aide \u00E0 bercer b\u00E9b\u00E9 apr\u00E8s la t\u00E9t\u00E9e.'],\n      ['Faut-il un repose-pieds ?', 'Il l\u00E8ve les genoux pour rapprocher b\u00E9b\u00E9, et d\u00E9tend les jambes la nuit. Aurore est livr\u00E9 avec le sien, dans le m\u00EAme colis et le m\u00EAme tissu.'],\n      ['Quelle place pr\u00E9voir pour un fauteuil \u00E0 bascule ?', 'Comptez ses 64 \u00D7 89 cm, un peu d\u2019espace devant et derri\u00E8re pour le balancement, et la place du repose-pieds devant. Un coin pr\u00E8s de la fen\u00EAtre suffit.'],\n      ['Quand le commander ?', `Au troisi\u00E8me trimestre, quand vous pr\u00E9parez la chambre. Command\u00E9 aujourd\u2019hui, Aurore arrive ${delivery(a)} : vous avez le temps de lui trouver sa place.`]\n    ];\n    const html = `<section class=\"wrap en-hero\">\n      <div class=\"en-hero__text\">\n        <h1 class=\"t-display en-hero__t\">3 h du matin, enfin bien assise.</h1>\n        <p class=\"lead en-hero__lead\">Aurore berce en douceur, vous enveloppe le dos dans son dossier \u00E0 oreilles et arrive avec son repose-pieds. Quand b\u00E9b\u00E9 fait ses nuits, il descend au salon.</p>\n        <div class=\"en-hero__buy\"><a class=\"btn\" href=\"#/p/${a.slug}\">Voir Aurore</a><p class=\"price en-hero__price\">${price(a.prix)}</p></div>\n        <p class=\"en-hero__date\">Livraison offerte, chez vous ${delivery(a)}.</p>\n      </div>\n      <div class=\"en-hero__img\">${studioImg(a, { alt: 'Aurore, fauteuil d\u2019allaitement \u00E0 bascule en tissu effet lin Blanc petit matin, avec son repose-pieds, sur fond clair', sizes: '(max-width: 760px) calc(100vw - 32px), (max-width: 980px) 50vw, (min-width: 1440px) 800px, 56vw', eager: true, cadres: [['(max-width: 760px)', '11'], ['(max-width: 980px)', '45'], [null, '54']] })}</div>\n    </section>\n\n    <section class=\"wrap sec\">\n      <h2 class=\"t-2 en-h\">Ce qui compte, la nuit</h2>\n      <dl class=\"en-facts\">\n        <div><dt>43 cm</dt><dd>Du sol \u00E0 l\u2019assise, \u00E0 peu pr\u00E8s une chaise : les pieds \u00E0 plat, on se rel\u00E8ve sans s\u2019enfoncer.</dd></div>\n        <div><dt>90 cm</dt><dd>La hauteur du fauteuil, dont un dossier \u00E0 oreilles de 47 cm au-dessus de l\u2019assise : il enveloppe le dos pendant la t\u00E9t\u00E9e.</dd></div>\n        <div><dt>45 \u00D7 37 cm</dt><dd>Le repose-pieds, livr\u00E9 avec, dans le m\u00EAme tissu : les jambes se d\u00E9tendent.</dd></div>\n        <div><dt>1 colis</dt><dd>Fauteuil et repose-pieds ensemble, livr\u00E9s depuis ${PAYS_DE[a.pays]} en ${delayTxt(a)}.</dd></div>\n      </dl>\n    </section>\n\n    <section class=\"wrap sec\">\n      <h2 class=\"t-2 en-h\">Deux fauteuils qui bercent</h2>\n      <div class=\"en-duo\">\n        ${piece(a, `Bascule en bois courb\u00E9, dossier \u00E0 oreilles, repose-pieds assorti, en ${andList(a.couleurs.filter((c) => !isOut(c)).map((c) => c.nom)).replace(/ et ([^,]*)$/, ' ou $1')}.`)}\n        ${piece(v, 'Bascule sur patins en bois, appui-t\u00EAte, poche pour le livre ou le t\u00E9l\u00E9phone.')}\n      </div>\n    </section>\n\n    <section class=\"wrap sec en-split en-split--vs\">\n      <div>\n        <h2 class=\"t-2\">Les six rep\u00E8res</h2>\n        <p class=\"en-split__p\">Ce qu\u2019il faut v\u00E9rifier sur un fauteuil d\u2019allaitement, et ce que font les n\u00F4tres.</p>\n      </div>\n      <table class=\"en-table en-table--4\">\n        <thead><tr><th scope=\"col\">Rep\u00E8re</th><th scope=\"col\">\u00C0 chercher</th><th scope=\"col\">Aurore</th><th scope=\"col\">Valse</th></tr></thead>\n        <tbody>${rows.map(([k, c, x, y]) => `<tr><th scope=\"row\">${k}</th><td>${c}</td><td data-l=\"Aurore\">${x}</td><td data-l=\"Valse\">${y}</td></tr>`).join('')}</tbody>\n      </table>\n    </section>\n\n    <section class=\"wrap sec en-times\">\n      <h2 class=\"t-2 en-h\">Les nuits, puis le salon</h2>\n      <div class=\"en-times__grid\">\n        <div><p class=\"en-times__h\">3 h</p><p>La maison dort, vous bercez. Vous comptez les allers-retours du fauteuil plut\u00F4t que les heures.</p></div>\n        <div><p class=\"en-times__h\">21 h</p><p>B\u00E9b\u00E9 fait ses nuits. Le fauteuil est au salon, le livre ouvert, les pieds sur le repose-pieds.</p></div>\n      </div>\n    </section>\n\n    <section class=\"wrap sec en-faq\">\n      <h2 class=\"t-2\">Vos questions</h2>\n      <div>${faq.map(([q, r]) => acc(esc(q), esc(r))).join('')}</div>\n    </section>\n    ${footer()}`;\n    return { title: 'Fauteuil d\u2019allaitement \u00E0 bascule avec repose-pieds \u00B7 Caplia', html };\n  }\n\n  /* Pourquoi Caplia : le \u00AB pourquoi chez nous \u00BB de l'angle \u00AB la certitude \u00BB (marketing/STRATEGIE-MARKETING.md \u00A71), sans\n     jamais \u00E9crire \u00AB achetez chez nous \u00BB ni comparer \u00E0 d'autres vendeurs. Les deux questions qui font acheter un canap\u00E9\n     (quand arrive-t-il, passera-t-il chez moi ?), chacune avec sa r\u00E9ponse avant de payer, sa preuve sur la page et le lien\n     vers la page qui la montre ; puis la r\u00E9ponse \u00E9crite (reponse()), les faits de chaque fiche et trois canap\u00E9s pour commencer.\n     17/10 (table d'experts) : \u00AB son prix va-t-il baisser ? \u00BB est retir\u00E9e du chapeau, la page n'y r\u00E9pondait pas (une 3e partie\n     n'arrive qu'avec une r\u00E8gle de prix d\u00E9cid\u00E9e, O11). */\n  function renderWhy() {\n    const d = SITE.livraison.delais;\n    /* 17/10 (table d'experts) : la page montre Cumulus, Nu\u00E9e et Anouk, les canap\u00E9s mis en avant dans les annonces (\u00C9clipse,\n       Opaline et Flocon ont un jumeau vendu bien moins cher ailleurs) ; chaque ligne reprend les deux premiers points forts\n       de la fiche (catalogue.json > points) */\n    const j = BY['bulle-294'] || BY['noix-de-cajou'], o = BY['bulle-2-places'] || BY['petit-incurve'], f = BY['arrondi-chocolat'] || BY['petit-mouton'];\n    PASSE.slug = j.slug;   /* l'outil de la porte s'ouvre sur la pi\u00E8ce de l'affiche */\n    const hero = scenesFor(j, '')[0];\n    const line = (p) => esc((p.points || []).length >= 2 ? `${p.points.slice(0, 2).map(noDot).join('. ')}.` : `${cm(p.dimensions.largeur)} en ${lc1(p.matiere)}.`);\n    const SZ3 = '(max-width: 760px) calc(100vw - 32px), 31vw';\n    const piece = (p, line) => `<article class=\"en-piece\">\n        <a class=\"en-piece__link\" href=\"#/p/${p.slug}\" aria-label=\"${esc(p.nom)}, ${esc(lc1(cardType(p)))}, ${price(p.prix)}\"></a>\n        <span class=\"en-piece__img\">${scenesFor(p, '').length ? sceneImg(p, scenesFor(p, '')[0], { alt: `${p.nom}, ${p.type.toLowerCase()}`, sizes: SZ3, eager: false, cls: '' }) : studioImg(p, { alt: `${p.nom}, ${p.type.toLowerCase()}, sur fond clair`, sizes: SZ3, cadres: ['11'] })}</span>\n        <div class=\"en-piece__row\"><h3 class=\"t-3\">${esc(p.nom)}</h3><p class=\"price\">${price(p.prix)}</p></div>\n        <p class=\"en-piece__line\">${line}</p>\n      </article>`;\n    const html = `<section class=\"wrap en-hero\">\n      <div class=\"en-hero__text\">\n        <h1 class=\"t-1 en-hero__t\">Un canap\u00E9 se choisit avec les yeux</h1>\n        <p class=\"lead en-hero__lead\">Il s\u2019ach\u00E8te quand deux questions ont leur r\u00E9ponse : quand <span class=\"en-nowrap\">arrive-t-il</span>, et <span class=\"en-nowrap\">passera-t-il</span> chez moi ? Chez Caplia, chacune a sa r\u00E9ponse avant que vous payiez.</p>\n        <div class=\"en-hero__buy\"><a class=\"btn\" href=\"#/canapes\">Voir les canap\u00E9s</a></div>\n        <p class=\"en-hero__date\">Livraison offerte en ${d.FR[0]} \u00E0 ${euMax()} jours ouvr\u00E9s, depuis ${orList(['FR', ...EU_KEYS()].map((k) => PAYS_DE[k])).replace(/'/g, '\u2019')}.</p>\n      </div>\n      <div class=\"en-hero__img en-hero__img--scene\">${hero ? sceneImg(j, hero, { alt: hero.alt, sizes: '(max-width: 760px) 100vw, 56vw', eager: true, cls: '', wide: true }) : ''}</div>\n    </section>\n\n    <section class=\"wrap sec en-split en-q\" aria-labelledby=\"q-date\">\n      <div>\n        <h2 class=\"t-2\" id=\"q-date\">Quand <span class=\"en-nowrap\">arrive-t-il</span> ?</h2>\n        <p class=\"en-split__p\">La date est sur la fiche, avant de payer.</p>\n      </div>\n      <div class=\"en-q__a\">\n        <p class=\"en-q__proof\"><span>${esc(j.nom)}, command\u00E9 aujourd\u2019hui</span><strong>Chez vous ${delivery(j)}</strong></p>\n        <p>Chaque fiche calcule sa date le jour de votre visite, selon l\u2019entrep\u00F4t d\u2019o\u00F9 part la pi\u00E8ce : ${d.FR[0]} \u00E0 ${d.FR[1]} jours ouvr\u00E9s depuis la France, ${euMin()} \u00E0 ${euMax()} depuis ${euDe('\u2019')}.</p>\n        <p>Ensuite, des nouvelles \u00E0 chaque \u00E9tape : un e-mail \u00E0 la commande, puis un autre avec le suivi de chaque colis.</p>\n        <p class=\"en-q__links\"><a class=\"link\" href=\"#/p/${j.slug}\">Voir la date ${deN(esc(j.nom))}</a><a class=\"link\" href=\"#/livraison?s=nouvelles\">Les nouvelles, \u00E9tape par \u00E9tape</a></p>\n      </div>\n    </section>\n\n    <section class=\"wrap sec en-passe en-q\" data-passe aria-labelledby=\"q-passe\">\n      <div class=\"en-passe__intro\">\n        <h2 class=\"t-2\" id=\"q-passe\"><span class=\"en-nowrap\">Passera-t-il</span> chez moi ?</h2>\n        <p class=\"lead\">Envoyez-nous la largeur de votre porte la plus \u00E9troite et de votre escalier : nous v\u00E9rifions qu\u2019il passe et vous r\u00E9pondons par \u00E9crit, avant l\u2019achat. Si nous avons dit oui et qu\u2019il ne passe pas, nous le reprenons \u00E0 nos frais.</p>\n        <p class=\"en-q__links\"><a class=\"link\" href=\"#/conditions-de-vente?s=passage\">L\u2019engagement, \u00E9crit dans nos conditions</a></p>\n      </div>\n      <div class=\"en-passe__tool\">\n        <div class=\"en-passe__pick\" role=\"radiogroup\" aria-label=\"Pi\u00E8ce \u00E0 v\u00E9rifier\">\n          ${[j, o, f].map((p, i) => `<button class=\"pill\" type=\"button\" role=\"radio\" aria-checked=\"${i === 0}\" data-action=\"passe-pick\" data-slug=\"${p.slug}\">${esc(p.nom)}</button>`).join('')}\n        </div>\n        <form class=\"passe__form\" data-passe-form novalidate>\n          <label class=\"passe__lbl\" for=\"passe-w\">Largeur de la porte, en centim\u00E8tres</label>\n          <div class=\"passe__row\">\n            <span class=\"passe__field\"><input id=\"passe-w\" name=\"w\" type=\"number\" inputmode=\"numeric\" min=\"30\" max=\"300\" placeholder=\"80\"><span aria-hidden=\"true\">cm</span></span>\n            <button class=\"btn\" type=\"submit\">V\u00E9rifier</button>\n          </div>\n        </form>\n        <p class=\"passe__a\" data-passe-msg aria-live=\"polite\">${passeHint()}</p>\n      </div>\n    </section>\n\n    <section class=\"wrap sec en-who en-q\" aria-labelledby=\"q-reponse\">\n      <h2 class=\"t-2\" id=\"q-reponse\">Une r\u00E9ponse ${reponse()}</h2>\n      <div class=\"en-who__text\">\n        <p class=\"lead\">Et quand vous nous \u00E9crivez ? Une question sur une mesure, une couleur, votre escalier : une personne vous r\u00E9pond par \u00E9crit, avant que vous commandiez.</p>\n        <p class=\"en-who__links\">${mailLink()}</p>\n      </div>\n    </section>\n\n    <section class=\"wrap sec\">\n      <h2 class=\"t-2 en-h\">Le reste est \u00E9crit sur chaque fiche</h2>\n      <dl class=\"en-facts\">\n        <div><figure class=\"en-fig en-fig--plan\" aria-hidden=\"true\">${planSVG(j)}</figure><dt>${cm(j.dimensions.hauteurAssise)}</dt><dd>La hauteur d\u2019assise ${deN(esc(j.nom))}, avec la profondeur de son assise et ses mesures au centim\u00E8tre.</dd></div>\n        <div><figure class=\"en-fig\"><img src=\"/site/assets/arrivee/cartons-640.webp\" alt=\"Les cartons d\u2019une pi\u00E8ce compress\u00E9e, ouverts \u00E0 la livraison\" loading=\"lazy\" decoding=\"async\" draggable=\"false\"></figure><dt>Plan cot\u00E9</dt><dd>Chaque mesure de la pi\u00E8ce, le nombre de colis et ce qu\u2019il y a dans le carton.</dd></div>\n        <div><figure class=\"en-fig\"><img src=\"/site/assets/arrivee/en-place-640.webp\" alt=\"Un canap\u00E9 install\u00E9, sorti de ses cartons\" loading=\"lazy\" decoding=\"async\" draggable=\"false\"></figure><dt>0${NB}\u20AC</dt><dd>De livraison, \u00E9co-participation comprise : le prix affich\u00E9 est le prix pay\u00E9.</dd></div>\n        <div><figure class=\"en-fig\"><img src=\"/site/assets/arrivee/ouverture-640.webp\" alt=\"Un canap\u00E9 roul\u00E9 dans son film, sur son carton ouvert\" loading=\"lazy\" decoding=\"async\" draggable=\"false\"></figure><dt>1 photo</dt><dd>${esc(SITE.soutien || 'Un souci \u00E0 la livraison ? Une photo par e-mail suffit : nous nous occupons du reste.')}</dd></div>\n      </dl>\n    </section>\n\n    <section class=\"wrap sec\">\n      <h2 class=\"t-2 en-h\">Trois canap\u00E9s pour commencer</h2>\n      <div class=\"en-trio\">\n        ${[j, o, f].map((p) => piece(p, line(p))).join('')}\n      </div>\n    </section>\n    ${footer()}`;\n    return { title: 'Pourquoi Caplia : la date, le passage et le prix connus avant de payer \u00B7 Caplia', html };\n  }\n\n  function renderSelection() {\n    takeShared('selection');\n    const items = fav.map((s) => BY[s]).filter(Boolean);\n    const sizes = '(max-width: 760px) 100vw, (max-width: 1100px) 50vw, 32vw';\n    /* Une ligne vraie et utile : le total des pi\u00E8ces gard\u00E9es et les cadeaux qu'il d\u00E9bloque, ou ce qu'il manque pour le premier */\n    const sumLine = () => {\n      const list = fav.map((s) => BY[s]).filter(Boolean);\n      const total = list.reduce((s, p) => s + p.prix, 0);\n      const base = list.filter((p) => !isAcc(p)).reduce((s, p) => s + p.prix, 0);\n      const g = giftsFor(base);\n      const next = SITE.paliers.find((pl) => base < pl.seuil);\n      const n = `${list.length}${NB}pi\u00E8ce${list.length > 1 ? 's' : ''}`;\n      if (g.length) return `${n} pour ${price(total)}. ${list.length > 1 ? 'Command\u00E9es ensemble' : 'Avec elle'} : ${esc(andList(g.map((pl) => pl.cadeau)))} offert${g.length > 1 || /^\\d|coussins/.test(g[0].cadeau) ? 's' : ''}.`;\n      return `${n} pour ${price(total)}. ${esc(cap1(next.cadeau))} offerts d\u00E8s ${price(next.seuil)} de meubles.`;\n    };\n    /* cartes de la s\u00E9lection, sans affiche large (la grille se recompose quand on retire une pi\u00E8ce) */\n    const selCards = (list) => { const sz = list.length === 4 ? CG_SIZES_2 : list.length <= 2 ? CG_SIZES_BIG : sizes; return list.map((p, i) => `<div class=\"sel-item\">${pcard(p, { eager: i < 3, sizes: sz })}<button class=\"link sel-item__x\" type=\"button\" data-action=\"fav-remove\" data-slug=\"${p.slug}\" aria-label=\"Retirer ${esc(p.nom)} de ma s\u00E9lection\">Retirer</button></div>`).join(''); };\n    const picks = ['causeuse', 'noix-de-cajou', 'incurve', 'galet'].map((k) => BY[k]).filter(Boolean).slice(0, 3);\n    const html = `<section class=\"wrap cpage spage\">\n      <header class=\"chead\">\n        <h1 class=\"t-display chead__title\">Ma s\u00E9lection</h1>\n        <p class=\"lead chead__intro\" data-sel-sum>${items.length ? sumLine() : 'Gardez ici les pi\u00E8ces qui vous plaisent, pour les comparer au calme ou les montrer \u00E0 la maison. Sur une fiche, choisissez \u00AB Enregistrer dans ma s\u00E9lection \u00BB.'}</p>\n        ${items.length ? `<div class=\"spage__share\">${shareUi('selection', 'Envoyer ma s\u00E9lection')}</div>` : ''}\n      </header>\n      ${items.length ? `<div class=\"${cgClass(items)} sel-grid\">${selCards(items)}</div>\n      <form class=\"selmail\" data-selmail novalidate>\n        <h2 class=\"t-3\">Recevoir ma s\u00E9lection par e-mail</h2>\n        <p class=\"selmail__txt\">Les liens de vos pi\u00E8ces, pour les retrouver sur votre t\u00E9l\u00E9phone ou les montrer \u00E0 la personne avec qui vous choisissez.</p>\n        <div class=\"news__row\">\n          <label class=\"sr-only\" for=\"sel-m\">Votre adresse e-mail</label>\n          <input id=\"sel-m\" name=\"email\" type=\"email\" autocomplete=\"email\" inputmode=\"email\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" placeholder=\"nom@exemple.fr\">\n          <button class=\"btn\" type=\"submit\">Recevoir</button>\n        </div>\n        <label class=\"check\" for=\"sel-c\"><input id=\"sel-c\" name=\"ok\" type=\"checkbox\"><span>Recevoir aussi les nouvelles couleurs et le guide des formes douces</span></label>\n        <p class=\"news__msg\" data-news-msg aria-live=\"polite\" hidden></p>\n      </form>` : `<div class=\"sempty\">\n        <a class=\"btn\" href=\"#/canapes\">Voir les canap\u00E9s</a>\n        <p class=\"sempty__links\"><a class=\"link\" href=\"#/fauteuils\">Fauteuils</a><a class=\"link\" href=\"#/decoration\">D\u00E9coration</a></p>\n      </div>\n      ${picks.length ? `<h2 class=\"t-3 spage__h\">Trois pi\u00E8ces pour commencer</h2><div class=\"cgrid\">${cgCards(picks, 0)}</div>` : ''}`}\n    </section>${footer()}`;\n    return {\n      title: 'Ma s\u00E9lection \u00B7 Caplia',\n      html,\n      scene: {},\n      after: () => {\n        setDesc('Les pi\u00E8ces Caplia que vous avez gard\u00E9es, avec leur total et les cadeaux offerts qu\u2019elles d\u00E9bloquent ensemble.');\n        const grid = $('.sel-grid');\n        const sum = $('[data-sel-sum]');\n        if (grid && sum) grid.addEventListener('click', (e) => { if (e.target.closest('[data-action=\"fav-remove\"]')) setTimeout(() => {\n          if (!fav.length || !document.body.contains(sum)) return;\n          const list = fav.map((s) => BY[s]).filter(Boolean);\n          sum.innerHTML = sumLine();\n          grid.className = `${cgClass(list)} sel-grid`;\n          grid.innerHTML = selCards(list);\n        }, 0); });\n      }\n    };\n  }\n\n  /* Page Merci : la suite en trois \u00E9tapes dat\u00E9es, le r\u00E9capitulatif, une pi\u00E8ce assortie (18/10 : plus de parrainage, retir\u00E9 des CGV) */\n  function renderThanks() {\n    const o = loadOrder();\n    if (!o) {\n      return { title: 'Merci \u00B7 Caplia', html: `<section class=\"wrap\"><div class=\"cart-empty\"><h1 class=\"t-1\">Aucune commande en cours</h1><p class=\"lead\">Votre r\u00E9capitulatif s'affichera ici apr\u00E8s votre commande.</p><a class=\"btn\" href=\"#/canapes\">Voir les canap\u00E9s</a></div></section>${footer()}`, scene: { img: tab('incurve-sel', '960'), soft: true } };\n    }\n    /* une couleur vide vaut la couleur par d\u00E9faut : deux lignes de la m\u00EAme pi\u00E8ce n'en font qu'une */\n    const items = [];\n    o.items.filter((l) => BY[l.slug]).forEach((l) => { const c = colorIn(BY[l.slug], l.color || ''); const x = items.find((y) => y.slug === l.slug && y.color === c && (y.size || '') === (l.size || '')); if (x) x.qty += l.qty; else items.push({ ...l, color: c }); });\n    const prods = items.map((l) => BY[l.slug]);\n    const main = prods.slice().sort((a, b) => b.prix - a.prix)[0];\n    const inOrder = new Set(items.map((l) => l.slug));\n    const ens = main && ensFor(main.slug);\n    const mate = (ens && ens.items.slice(1).map(([s]) => BY[s]).find((p) => p && !inOrder.has(p.slug)))\n      || PRODS.filter((p) => sameWorld(p, main) && p.collection !== 'canapes' && !isBed(p) && !inOrder.has(p.slug) && !p.couleurs.every(isOut) && !notYet(p)).sort((a, b) => a.prix - b.prix)[0];\n    const slowest = slowestOf(prods);\n    const ordered = new Date(o.date);\n    const start = ordered;\n    const [da, db] = DL(slowest);\n    const d1 = addBusiness(start, da), d2 = addBusiness(start, db);\n    const span = `entre le ${dayLbl(d1, d1.getMonth() !== d2.getMonth())} et le ${dayLbl(d2, true)}`;\n    const steps = [['Aujourd\u2019hui', 'Un e-mail r\u00E9capitulatif arrive dans quelques minutes. Gardez-le : votre num\u00E9ro de commande y figure.'],\n         ['Au d\u00E9part du colis', 'Vous recevez le lien de suivi par e-mail, pour voir o\u00F9 en est la livraison.'],\n         ['Livraison chez vous', `Offerte, \u00E0 la date annonc\u00E9e plus haut${giftsFor(o.base != null ? o.base : o.total).length ? '. Les cadeaux arrivent dans un colis s\u00E9par\u00E9' : ''}.`]];\n    const html = `<section class=\"wrap thx\">\n      <header class=\"thx__head\">\n        <h1 class=\"t-1\">Merci, c\u2019est command\u00E9</h1>\n        <p class=\"lead\">Votre commande arrive ${span}.</p>\n      </header>\n      <section class=\"thx__steps\" aria-labelledby=\"thx-suite\">\n        <h2 class=\"sr-only\" id=\"thx-suite\">La suite</h2>\n        <ol class=\"steps\">${steps.map(([t, d]) => `<li><h3 class=\"t-4\">${t}</h3><p>${d}</p></li>`).join('')}</ol>\n      </section>\n      <div class=\"thx__grid\">\n        <section class=\"thx__order\" aria-labelledby=\"thx-cmd\">\n          <h2 class=\"t-3\" id=\"thx-cmd\">Votre commande</h2>\n          <ul class=\"lines\">${items.map((l) => { const p = BY[l.slug]; return `<li class=\"line line--ro\">\n              <a class=\"line__thumb\" href=\"#/p/${p.slug}\" aria-label=\"${esc(p.nom)}\">${cartThumb(p, l.color)}</a>\n              <div class=\"line__info\"><a class=\"line__name\" href=\"#/p/${p.slug}\">${esc(p.nom)}</a><p class=\"line__var\">${p.couleurs.length > 1 ? esc(l.color) + ' \u00B7 ' : ''}${esc(cardType(p))}${l.size ? ' \u00B7 ' + esc(l.size) : ''}${l.qty > 1 ? ' \u00B7 ' + l.qty + ' exemplaires' : ''}</p></div>\n              <p class=\"line__total\">${price(unitPriceOf(p, l.size) * l.qty)}</p>\n            </li>`; }).join('')}\n          </ul>\n          ${giftsHtml(giftsFor(o.base != null ? o.base : o.total).map((pl) => [giftLabel(pl), 'Dans un colis s\u00E9par\u00E9', giftWord(pl), pl]))}\n          <dl class=\"thanks__sum\"><div><dt>Livraison</dt><dd>Offerte</dd></div><div class=\"total\"><dt>Total</dt><dd>${price(o.total)}</dd></div></dl>\n          <p class=\"thanks__demo\">Commande simul\u00E9e : cette maquette n\u2019encaisse rien.</p>\n        </section>\n        ${mate ? `<section class=\"thx__mate\" aria-labelledby=\"thx-mate\">\n          <a class=\"thx__mateimg\" href=\"#/p/${mate.slug}\" aria-label=\"${esc(mate.nom)}\">${studioImg(mate, { sizes: '(max-width: 980px) 92vw, 40vw', cadres: [['(max-width: 760px)', '54'], [null, '43']] })}</a>\n          <h2 class=\"t-3\" id=\"thx-mate\">${esc(mate.nom)}, pour aller avec ${esc(main.nom)}</h2>\n          <p class=\"thx__matep\">${esc(mate.type)} \u00B7 ${fromOf(mate)}${price(mate.prix)}</p>\n          <button class=\"btn\" type=\"button\" data-action=\"quick-add\" data-slug=\"${mate.slug}\">Ajouter au panier</button>\n        </section>` : ''}\n      </div>\n      <section class=\"thx-ask\" data-ask aria-labelledby=\"thx-ask\">\n        <h2 class=\"t-3\" id=\"thx-ask\">Une question, en une seconde</h2>\n        <div class=\"thx-ask__q\" data-ask-step=\"1\">\n          <p>Qu\u2019est-ce qui a failli vous faire renoncer ?</p>\n          <div class=\"thx-ask__opts\">${['La taille ou le passage', 'La couleur', 'Le confort sans l\u2019essayer', 'Le d\u00E9lai', 'Le prix', 'Rien', 'Autre chose'].map((t) => `<button class=\"pill\" type=\"button\" aria-pressed=\"false\">${t}</button>`).join('')}</div>\n        </div>\n        <div class=\"thx-ask__q\" data-ask-step=\"2\" hidden>\n          <p>Et comment nous avez-vous trouv\u00E9s ?</p>\n          <div class=\"thx-ask__opts\">${['Sur Google', 'Par un proche', 'Sur Instagram ou Pinterest', 'Autrement'].map((t) => `<button class=\"pill\" type=\"button\" aria-pressed=\"false\">${t}</button>`).join('')}</div>\n        </div>\n        <p class=\"thx-ask__ok\" data-ask-ok aria-live=\"polite\" hidden>Merci. Vos r\u00E9ponses nous aident \u00E0 mieux expliquer nos pi\u00E8ces \u00E0 ceux qui h\u00E9sitent encore.</p>\n      </section>\n    </section>${footer()}`;\n    /* Deux questions facultatives (PLAN-MAITRE K9) : une r\u00E9ponse par question, puis un merci. Rien n'est envoy\u00E9 dans la maquette. */\n    const after = (root) => {\n      const box = $('[data-ask]', root);\n      if (!box) return;\n      const onClick = (e) => {\n        const b = e.target.closest('.pill');\n        if (!b) return;\n        const q = b.closest('[data-ask-step]');\n        $$('.pill', q).forEach((x) => x.setAttribute('aria-pressed', String(x === b)));\n        const next = q.nextElementSibling;\n        if (next && next.hasAttribute('data-ask-step')) { next.hidden = false; return; }\n        $('[data-ask-ok]', box).hidden = false;\n      };\n      box.addEventListener('click', onClick);\n      cleanups.push(() => box.removeEventListener('click', onClick));\n    };\n    return { title: 'Merci \u00B7 Caplia', html, after, scene: { img: tab('incurve-sel', '960'), soft: true } };\n  }\n\n  /* =========================================================\n     CLASSEMENT (site/data/categories.json, source unique) : menu, pages de cat\u00E9gorie et de sous-cat\u00E9gorie, fil\n     d'Ariane, accueil. Chaque sous-cat\u00E9gorie est une page de site/data/seo-pages.json (h1, intro, questions,\n     \u00AB produits \u00BB) et une campagne Google : la recherche, l'annonce et la page disent les m\u00EAmes mots.\n     Univers \u00AB sleep \u00BB : Caplia Sleep, jamais m\u00EAl\u00E9 au salon (ni accueil, ni grilles, ni suggestions du salon).\n     ========================================================= */\n  let CATS = [];            /* cat\u00E9gories, dans l'ordre du menu */\n  const SUBS = {};          /* sous-cat\u00E9gorie -> { sub, cat } */\n  const PRIM = {};          /* pi\u00E8ce -> { cat, sub } : la premi\u00E8re sous-cat\u00E9gorie o\u00F9 elle appara\u00EEt (sa place principale) */\n  const SEO = {};           /* page de seo-pages.json (collections), par slug */\n  const isSleep = (p) => !!p && p.collection === 'sleep';\n  const sameWorld = (a, b) => isSleep(a) === isSleep(b);\n  const catBy = (slug) => CATS.find((c) => c.slug === slug);\n  function indexCats(cj, sj) {\n    CATS = ((cj && cj.categories) || []).map((c) => ({ ...c, sous: c.sous.map((s) => ({ ...s, produits: s.produits.filter((k) => BY[k]) })) }));\n    CATS.forEach((c) => c.sous.forEach((s) => {\n      SUBS[s.slug] = { sub: s, cat: c };\n      s.produits.forEach((k) => { if (!PRIM[k]) PRIM[k] = { cat: c, sub: s }; });\n    }));\n    ((sj && sj.pages) || []).filter((pg) => /^collection/.test(pg.type || '')).forEach((pg) => { SEO[pg.slug] = pg; });\n  }\n  /* \u00AB minimum \u00BB (categories.json) : une sous-cat\u00E9gorie ne s'affiche qu'avec au moins ce nombre de pi\u00E8ces visibles */\n  const subsOf = (c) => c.sous.filter((s) => s.produits.length >= (s.minimum || 1));\n  const subHref = (s) => `#/collections/${s.slug}`;\n  /* d\u00E9lai d'une liste de pi\u00E8ces, du plus court au plus long */\n  const delaysOf = (list) => { const ds = list.map((p) => DL(p)); return `${Math.min(...ds.map((d) => d[0]))} \u00E0 ${Math.max(...ds.map((d) => d[1]))}${NB}jours ouvr\u00E9s`; };\n  /* phrase d'introduction tir\u00E9e des fiches, quand la page n'a pas encore la sienne (seo-pages.json) */\n  /* une ligne au plus en t\u00EAte de page : la premi\u00E8re phrase, si elle est courte */\n  const subLine = (list) => { const ws = list.map((p) => p.dimensions.largeur); return catLine({ min: Math.min(...ws), max: Math.max(...ws) }, delaysOf(list)); };\n  /* 16/10 (analyse des concurrents) : notre d\u00E9lai (dl, delaysOf) est le plus court du panel (2 \u00E0 13 semaines ailleurs), on le dit */\n  const catLine = (r, dl) => { const fin = `livraison offerte${dl ? ` en ${dl}` : ''}.`; return r.min < r.max ? `De ${numFr(r.min)} \u00E0 ${cm(r.max)} de large, ${fin}` : cap1(fin); };\n  function autoIntro(list, h1) {\n    if (!list.length) return '';\n    const mats = [...new Set(list.map((p) => p.matiere.toLowerCase()))];\n    const en = `en ${mats.join(' ou en ')}`;\n    if (list.length === 1) return `${list[0].nom}, ${lc1(cardType(list[0]))}, ${en}. Livraison offerte, chez vous en ${delaysOf(list)}.`;\n    const sz = list.map((p) => Math.max(p.dimensions.largeur, p.dimensions.hauteur));\n    const range = Math.min(...sz) === Math.max(...sz) ? '' : `, de ${numFr(Math.min(...sz))} \u00E0 ${cm(Math.max(...sz))}`;\n    return `${list.length} ${h1.toLowerCase()}${range}, ${en}. Livraison offerte, chez vous en ${delaysOf(list)}.`;\n  }\n  /* Textes de l'univers Caplia Sleep (chambre calme, rangement cach\u00E9, toucher) : les pages n'en ont pas encore */\n  const SLEEP_COPY = {\n    sleep: 'Une chambre calme, des formes douces. Chaque lit arrive avec son sommier \u00E0 lattes ; sous Songe, un coffre de la taille du lit.',\n    lits: 'Deux lits rembourr\u00E9s, livr\u00E9s avec leur sommier \u00E0 lattes. Songe se rel\u00E8ve sur v\u00E9rins : dessous, un coffre de la taille du lit. Brume a une t\u00EAte de lit capitonn\u00E9e, en trois tailles.',\n    'bouts-de-lit': 'Au pied du lit, un banc pour s\u2019asseoir et un coffre pour le linge. En bouclette cr\u00E8me, ou en velours cannel\u00E9 sur pieds dor\u00E9s.'\n  };\n  /* sans Songe (pi\u00E8ce masqu\u00E9e), la chambre se pr\u00E9sente avec Brume et les bancs coffres */\n  const SLEEP_SANS_SONGE = {\n    sleep: 'Une chambre calme, des formes douces. Le lit arrive avec son sommier \u00E0 lattes ; \u00E0 son pied, un banc coffre pour le linge.',\n    lits: 'Brume, un lit rembourr\u00E9 \u00E0 la t\u00EAte de lit capitonn\u00E9e, livr\u00E9 avec son sommier \u00E0 lattes.'\n  };\n  const sleepCopy = (k) => (!BY.songe && SLEEP_SANS_SONGE[k]) || SLEEP_COPY[k] || '';\n  /* titres : les formes de la cat\u00E9gorie encore en ligne (pi\u00E8ces masqu\u00E9es : la forme dispara\u00EEt du titre avec elles) */\n  const CAT_TITLE = {\n    canapes: (f) => `Canap\u00E9s ${andList([['canape-arrondi', 'arrondis'], ['canape-nuage', 'nuage'], ['canape-angle', 'd\u2019angle'], ['canape-convertible', 'convertibles'], ['meridienne', 'm\u00E9ridiennes']].filter(([k]) => f.subs.includes(k)).map(([, w]) => w))} \u00B7 Caplia`,\n    fauteuils: 'Fauteuils de salon, \u00E0 bascule et d\u2019allaitement \u00B7 Caplia',\n    decoration: (f) => `${f.subs.includes('tables') && f.subs.includes('miroirs') ? 'Miroirs et tables' : f.subs.includes('tables') ? 'Tables' : 'Miroirs'} aux formes douces \u00B7 Caplia`,\n    sleep: 'Caplia Sleep : lits et bouts de lit \u00B7 Caplia'\n  };\n  /* le mot-logo de l'univers : \u00AB Caplia. \u00BB en gras, puis \u00AB Sleep \u00BB */\n  /* 18/10 (audit 04, n\u00B0 13) : en titre de page (h1), le logo dit aussi ce que vend Caplia Sleep, pour Google et les lecteurs\n     d'\u00E9cran (texte cach\u00E9 \u00E0 l'\u0153il) */\n  const SLEEP_QUOI = CAT_TITLE.sleep.replace(/^Caplia Sleep| \u00B7 Caplia$/g, '');   // \u00AB : lits et bouts de lit \u00BB\n  const sleepMark = (tag = 'p', cls = '') => `<${tag} class=\"sleepmark${cls ? ' ' + cls : ''}\"><b>Caplia.</b> <span>Sleep</span>${tag === 'h1' ? `<span class=\"sr-only\"> ${SLEEP_QUOI.trim()}</span>` : ''}</${tag}>`;\n\n  /* Fil d'Ariane : \u00AB Canap\u00E9s / Arrondis / Corolle \u00BB, chaque \u00E9tape cliquable sauf la derni\u00E8re */\n  function crumbHtml(steps, cls = '') {\n    return `<nav class=\"crumb${cls ? ' ' + cls : ''}\" aria-label=\"Fil d\u2019Ariane\"><ol>${steps.map(([href, t], i) => `<li>${i ? '<span class=\"crumb__sep\" aria-hidden=\"true\">/</span>' : ''}${href && i < steps.length - 1 ? `<a href=\"${href}\">${esc(t)}</a>` : `<span aria-current=\"page\">${esc(t)}</span>`}</li>`).join('')}</ol></nav>`;\n  }\n  const crumbOf = (p) => { const r = PRIM[p.slug]; return r ? crumbHtml([[r.cat.route, r.cat.nom], [subHref(r.sub), r.sub.nom], [null, p.nom]], 'fp__crumb') : ''; };\n  /* Pastilles des sous-cat\u00E9gories (chacune a son adresse) ; current : la page ouverte */\n  const subPills = (c, current = '') => `<nav class=\"cpills\" aria-label=\"${esc(c.nom)}, par forme\">${subsOf(c).map((s) => `<a class=\"pill pill--sm${s.slug === current ? ' is-active' : ''}\" href=\"${subHref(s)}\"${s.slug === current ? ' aria-current=\"page\"' : ''}>${esc(s.nom)}</a>`).join('')}</nav>`;\n  /* Bas de page d'une cat\u00E9gorie : les autres cat\u00E9gories du m\u00EAme univers (Sleep : ses sous-cat\u00E9gories) */\n  function catNext(c, current = '') {\n    const others = c.univers === 'sleep'\n      ? subsOf(c).filter((s) => s.slug !== current).map((s) => [subHref(s), s.nom, cfNoun('', s.produits.length)])\n      : CATS.filter((x) => x.univers === c.univers && x.slug !== c.slug).map((x) => [x.route, x.nom, cfNoun(x.slug, new Set(x.sous.flatMap((s) => s.produits)).size)]);\n    if (current && c.univers !== 'sleep') others.unshift([c.route, `Tous les ${c.nom.toLowerCase()}`.replace('Tous les d\u00E9coration', 'Toute la d\u00E9coration'), cfNoun(c.slug, new Set(c.sous.flatMap((s) => s.produits)).size)]);\n    /* refonte du 07/10 : chaque renvoi est une grande image en situation (la premi\u00E8re pi\u00E8ce de l'univers qui en a une),\n       le nom pos\u00E9 dessus */\n    const picOf = (h) => {\n      const cs = CATS.find((x) => x.route === h);\n      const sub = !cs && SUBS[(h.match(/collections\\/([\\w-]+)/) || [])[1]];\n      const keys = cs ? cs.sous.flatMap((s) => s.produits) : sub ? sub.sub.produits : [];\n      const p = keys.map((k) => BY[k]).find((x) => x && scenesFor(x, '').length);\n      if (!p) return '';\n      const sc = scenesFor(p, '');\n      return sceneImg(p, sc[1] || sc[0], { alt: '', sizes: '(max-width: 760px) 100vw, 50vw', eager: false, cls: 'cnext__img', wide: true });\n    };\n    return others.length ? `<nav class=\"cnext cnext--img\" aria-label=\"Continuer\">${others.map(([h, n, k]) => `<a class=\"cnext__a\" href=\"${h}\">${picOf(h)}<span class=\"cnext__txt\"><span class=\"cnext__name\">${esc(n)}</span><span class=\"cnext__n\">${k}</span></span></a>`).join('')}</nav>` : '';\n  }\n\n  /* Page de cat\u00E9gorie : ses sous-cat\u00E9gories en pastilles, puis ses pi\u00E8ces rang\u00E9es par sous-cat\u00E9gorie (chaque pi\u00E8ce une\n     seule fois, \u00E0 sa place principale). Caplia Sleep : son mot-logo, son image, ses chambres assorties. */\n  /* Rang\u00E9es de la page de cat\u00E9gorie (refonte du 07/10) : les grandes sous-cat\u00E9gories d'abord, puis les petites (1 ou 2\n     pi\u00E8ces) c\u00F4te \u00E0 c\u00F4te ; une rang\u00E9e qui ne se remplit pas re\u00E7oit une grande photo en situation d'une de ses pi\u00E8ces,\n     jamais un trou. */\n  function packFlow(groups) {\n    const big = groups.filter((g) => g.list.length > 2), small = groups.filter((g) => g.list.length <= 2);\n    const out = [...big];\n    let row = [], used = 0;\n    /* cadrages du 07/10 : plus d'image d'ambiance en bout de rang\u00E9e (avec son nom pos\u00E9 dessus, elle se lisait comme une\n       carte d'un autre gabarit) ; une rang\u00E9e incompl\u00E8te garde sa place libre */\n    const close = () => { out.push(...row); row = []; used = 0; };\n    small.forEach((g) => { const n = Math.min(g.list.length, 3); if (used + n > 3) close(); row.push(g); used += n; });\n    close();\n    return out;\n  }\n  function renderCategory(slug) {\n    const c = catBy(slug);\n    if (!c) return render404();\n    const sleep = c.univers === 'sleep';\n    const groups = subsOf(c).map((s) => ({ s, list: s.produits.filter((k) => PRIM[k] && PRIM[k].sub.slug === s.slug).map((k) => BY[k]) })).filter((g) => g.list.length);\n    const all = [...new Set(c.sous.flatMap((s) => s.produits))].map((k) => BY[k]);\n    const dl = delaysOf(all);\n    const ws = all.map((p) => p.dimensions.largeur);\n    const cc = COL_COPY[slug];\n    /* faits de la cat\u00E9gorie pour ses textes : largeurs, mati\u00E8res et pi\u00E8ces en ligne (les pi\u00E8ces masqu\u00E9es n'y sont pas) */\n    const facts = { min: Math.min(...ws), max: Math.max(...ws), large: all.reduce((a, b) => (b.dimensions.largeur > a.dimensions.largeur ? b : a)), mats: [...new Set(all.map((p) => p.matiere.toLowerCase()))], slugs: all.map((p) => p.slug), subs: subsOf(c).map((s) => s.slug) };\n    const intro = sleep ? sleepCopy('sleep') : cc && cc.intro ? cc.intro(facts, dl) : '';\n    /* une seule sous-cat\u00E9gorie en ligne : la page en reprend la grille (une pi\u00E8ce seule s'affiche en grand), les conseils\n       et les questions, comme sa page de collection */\n    const one = !sleep && groups.length === 1 ? groups[0] : null;\n    const onePg = one ? SEO[one.s.slug] : null;\n    const oneFaq = onePg ? seoFaq(onePg) : [];\n    const head = sleep\n      ? `<header class=\"sleephero\">\n          ${sleepMark('h1', 'sleepmark--display')}\n          <div class=\"sleephero__row\"><div class=\"sleephero__txt\"><p class=\"lead sleephero__lead\">${esc(intro)}</p><p class=\"sleephero__date\">Livraison offerte, chez vous en ${dl}.</p></div>\n          <div class=\"sleephero__img\">${(BY.songe && ensPic('songe', 'Songe et Dune c\u00F4te \u00E0 c\u00F4te dans le studio Caplia', '(max-width: 980px) calc(100vw - 32px), 50vw')) || (BY.brume && BY.sillon && ensPic('brume', 'Brume et Sillon c\u00F4te \u00E0 c\u00F4te dans le studio Caplia', '(max-width: 980px) calc(100vw - 32px), 50vw')) || pieceImg(all[0], { cadres: ['43'], eager: true })}</div></div>\n        </header>`\n      : CAT_UNI[slug] ? ''\n      : `<header class=\"chead\"><h1 class=\"t-display chead__title\">${esc(c.nom)}</h1><p class=\"lead chead__intro\">${esc(catLine(facts, dl))}</p></header>`;\n    const html = `\n    ${CAT_UNI[slug] ? uniBanner(CAT_UNI[slug], c.nom, '', 'h1', catLine(facts, dl)) : ''}\n    <section class=\"wrap cpage cat${sleep ? ' cat--sleep' : ''}${CAT_UNI[slug] ? ' csubpage--uni' : ''}\">\n      ${head}\n      ${subPills(c)}\n      <div data-caplia-slot=\"caplia-soeurs\"></div>\n      ${one ? `<section class=\"csub csub--one\" aria-labelledby=\"csub-${one.s.slug}\">\n        <div class=\"csub__head\"><h2 class=\"t-2 csub__t\" id=\"csub-${one.s.slug}\">${esc(one.s.nom)}</h2><a class=\"link\" href=\"${subHref(one.s)}\">Tout voir</a></div>\n        <div class=\"${cgClass(one.list)}\">${cgCards(one.list)}</div>\n      </section>\n      ${seoSections(onePg)}\n      ${oneFaq.length ? `<section class=\"cfaq\" aria-labelledby=\"cfaq-t\"><h2 class=\"t-2\" id=\"cfaq-t\">Vos questions</h2><div>${oneFaq.map((x) => acc(esc(x.q), `<p>${esc(nbTxt(x.r))}</p>`)).join('')}</div></section>` : ''}`\n      : `<div class=\"cf cf--tri\"><div class=\"cf__status\"><p class=\"cf__count\">${cfNoun(slug, all.length)}</p>${cfTri('data-cat-tri', false)}</div></div>\n      <div data-cat-flow><div class=\"cflow\">${packFlow(groups).map((g) => typeof g === 'string' ? g : (({ s, list }) => {\n        /* grand \u00E9cran : une sous-cat\u00E9gorie de une ou deux pi\u00E8ces se range \u00E0 c\u00F4t\u00E9 de la suivante (--n colonnes sur trois),\n           les pi\u00E8ces gardent la taille de leurs voisines ; quatre pi\u00E8ces : la premi\u00E8re et la derni\u00E8re en large (cgLayout) */\n        const { big } = cgLayout(list);\n        return `<section class=\"csub\" style=\"--n:${Math.min(list.length, 3)}\" aria-labelledby=\"csub-${s.slug}\">\n        <div class=\"csub__head\"><h2 class=\"t-2 csub__t\" id=\"csub-${s.slug}\">${esc(s.nom)}</h2><a class=\"link\" href=\"${subHref(s)}\">Tout voir</a></div>\n        <div class=\"cgrid\">${list.map((p, i) => pcard(p, { eager: i < 3, sizes: big[i] ? CG_SIZES_BIG : CG_SIZES, cls: big[i] && !/solo/.test(big[i]) ? big[i] : '' })).join('')}</div>\n      </section>`;\n      })(g)).join('')}</div></div>`}\n      ${sleep ? sleepSets() : ''}\n      ${catNext(c)}\n    </section>\n    ${footer()}`;\n    return {\n      title: (typeof CAT_TITLE[slug] === 'function' ? CAT_TITLE[slug](facts) : CAT_TITLE[slug]) || `${c.nom} \u00B7 Caplia`, html, scene: {}, nav: slug,\n      after: () => {\n        if (cc && cc.desc) setDesc(cc.desc(facts, dl)); else if (sleep) setDesc(`${sleepCopy('sleep')} Livraison offerte, chez vous en ${dl}.`);\n        /* 18/10 (audit 03 \u00AB Collections : ni tri ni filtre \u00BB) : \u00AB nos choix \u00BB garde les rang\u00E9es par forme ; un tri par prix\n           range toutes les pi\u00E8ces de la cat\u00E9gorie dans une seule grille */\n        const tri = $('[data-cat-tri]'), flow = $('[data-cat-flow]');\n        if (!tri || !flow) return;\n        const rangs = flow.firstElementChild;   /* les rang\u00E9es gard\u00E9es telles quelles, remises au retour \u00E0 \u00AB nos choix \u00BB */\n        tri.addEventListener('change', () => {\n          if (tri.value === 'choix') flow.replaceChildren(rangs);\n          else flow.innerHTML = fr(`<div class=\"${cgClass(all)}\">${cgCards(cfSort(all, tri.value))}</div>`);\n        });\n      }\n    };\n  }\n\n  /* Page de sous-cat\u00E9gorie (#/collections/<slug>) : exactement les pi\u00E8ces de sa page (seo-pages.json > produits),\n     puis ses sections et ses questions. Une page d'annonce hors du classement (\u00AB canap\u00E9 compress\u00E9 \u00BB\u2026) prend la cat\u00E9gorie\n     de sa premi\u00E8re pi\u00E8ce pour son fil d'Ariane. */\n  /* Banni\u00E8res univers (refonte du 07/10) : une vraie photo de campagne par collection, la pi\u00E8ce rendue dans la sc\u00E8ne\n     (maquettes/_audit/bannieres-univers-v2/METHODE.md), le titre en Unbounded pos\u00E9 dans l'image. ink : couleur du texte\n     lisible sur cette image ; shade : une ombre douce sous le texte (murs terre cuite, nuit). */\n  /* tz : la zone calme de l'image, en fraction de sa largeur (d\u00E9but, fin), o\u00F9 se pose le texte sur ordinateur et tablette ;\n     ty : texte pos\u00E9 en haut \u00E0 cette hauteur (fraction) au lieu d'\u00EAtre centr\u00E9, quand la zone calme est le mur au-dessus du\n     canap\u00E9 (Modulables) ; lw : largeur maximale du texte courant (fraction), pour qu'il s'arr\u00EAte avant le canap\u00E9 ; mr : au t\u00E9l\u00E9phone,\n     marge droite du texte (fraction), pour laisser de l'air \u00E0 un \u00E9l\u00E9ment du d\u00E9cor (la lune des Convertibles) ; va : force du\n     voile sous le texte quand l'image est charg\u00E9e (contraste mesur\u00E9 par maquettes/outils/contraste-bannieres.py). La banni\u00E8re garde le format de son image \u00E0 toutes les largeurs (rien n'est coup\u00E9), donc la zone\n     ne bouge pas par rapport au canap\u00E9. Au t\u00E9l\u00E9phone (image -tel), le texte va dans le ciel ou le mur du haut. Relev\u00E9 sur l'image le 07/10. */\n  const uniVars = (u) => `--uni-ink:${u.ink};--tz0:${u.tz[0]};--tzw:${+(u.tz[1] - u.tz[0]).toFixed(2)}${u.ty != null ? `;--tzy:${u.ty * 100}%;--tzt:0%` : ''}${u.lw ? `;--lw:${u.lw}` : ''}${u.mr ? `;--mr:${u.mr}` : ''}${u.va ? `;--va:${u.va};--vb:${+(u.va * .6).toFixed(2)}` : ''}`;\n  /* 23/10 : plus aucune banni\u00E8re d'univers (d\u00E9cors g\u00E9n\u00E9r\u00E9s : d\u00E9sert, nuages, bulles pastel\u2026), retir\u00E9es \u00E0 la demande du\n     propri\u00E9taire (\u00AB trop IA \u00BB, d\u00E9cor qui ne va pas). Les entr\u00E9es d'avant sont dans l'historique Git. */\n  const UNIVERS = {\n  };\n  const uniImg = (u, eager = true) => `<picture class=\"uni__img\"><source media=\"(max-width: 700px)\" srcset=\"/site/assets/univers/${u.img}-tel.webp\" width=\"780\" height=\"1140\"><img src=\"/site/assets/univers/${u.img}-ordi.webp\" width=\"1680\" height=\"720\" alt=\"${esc(u.alt)}\" style=\"object-position:${u.pos}\" ${eager ? 'fetchpriority=\"high\"' : 'loading=\"lazy\"'} decoding=\"async\" draggable=\"false\"></picture>`;\n  /* cat\u00E9gorie qui ouvre sur la banni\u00E8re d'un de ses univers */\n  const CAT_UNI = {};\n  function uniBanner(slug, h1, crumbs, tag = 'h1', line = '') {\n    const u = UNIVERS[slug];\n    if (!u) return '';\n    return `<section class=\"uni${u.shade ? ' uni--shade' : ''}${u.ty != null ? ' uni--top' : ''}\" style=\"${uniVars(u)}\" aria-labelledby=\"uni-t\">${uniImg(u)}\n      <div class=\"uni__txt\">${crumbs ? `<p class=\"uni__fil\">${crumbs}</p>` : ''}<${tag} class=\"t-1 uni__t\" id=\"uni-t\">${esc(h1)}</${tag}><p class=\"uni__l\">${esc(line || u.line)}</p></div></section>`;\n  }\n  /* textes SEO d'une page de collection : {pieces}, {couleurs} et {largeurs} compt\u00E9s sur les pi\u00E8ces vraiment montr\u00E9es\n     (08/10 : \u00AB 5 couleurs \u00BB annonc\u00E9es pour 4 pi\u00E8ces d'une seule couleur chacune). Repris par donnees-theme.mjs. */\n  const seoFill = (t, list) => { if (!t || !/\\{(pieces|couleurs|largeurs)\\}/.test(t)) return t; const n = new Set(list.flatMap((p) => p.couleurs.filter((c) => !c.retiree).map((c) => c.nom))).size; const w = list.map((p) => (p.dimensions || {}).largeur).filter(Boolean); const lo = Math.min(...w), hi = Math.max(...w); return t.replace(/\\{pieces\\}/g, list.length).replace(/\\{couleurs\\}/g, n).replace(/\\{largeurs\\}/g, !w.length ? '' : lo === hi ? lo : `${lo} \u00E0 ${hi}`).replace(/(^|\\D)1 (canap\u00E9|couleur|pi\u00E8ce)s/g, (m, a, b) => `${a}1 ${b}`); };\n  const seoDeep = (o, list) => (typeof o === 'string' ? seoFill(o, list) : Array.isArray(o) ? o.map((x) => seoDeep(x, list)) : o && typeof o === 'object' ? Object.fromEntries(Object.entries(o).map(([k, v]) => [k, seoDeep(v, list)])) : o);\n  function renderSub(slug) {\n    const pg0 = SEO[slug], ref = SUBS[slug];\n    /* une pi\u00E8ce de la page est masqu\u00E9e : ses textes \u00E9crits pour ce cas (seo-pages.json > sansMasquees) */\n    const alt = pg0 && pg0.sansMasquees;\n    const pg = alt && alt.si.some((k) => !BY[k] && CAT.produits.some((x) => x.slug === k)) ? { ...pg0, ...alt } : pg0;\n    if (!pg && !ref) return render404();\n    const list = ((pg && pg.produits) || ref.sub.produits).filter((k) => BY[k]).map((k) => BY[k]);\n    if (pg && pg !== pg0) Object.assign(pg, seoDeep(alt, list));   /* tous les textes de remplacement : titre, h1, intro, sections, questions */\n    const c = ref ? ref.cat : list[0] && PRIM[list[0].slug] ? PRIM[list[0].slug].cat : null;\n    if (!c || !list.length) return render404();\n    const sleep = c.univers === 'sleep';\n    const name = ref ? ref.sub.nom : (pg.h1 || slug);\n    const h1 = (pg && pg.h1) || ref.sub.h1 || name;\n    const intro = (pg && pg.intro && sansMasque(pg.intro)) || sleepCopy(slug) || autoIntro(list, h1);\n    const faq = seoFaq(pg);\n    /* 18/10 : la couleur montr\u00E9e par carte (seo-pages.json > couleurs, \u00AB Canap\u00E9s verts \u00BB, audit 01 Mo5) ; la barre \u00AB Filtrer et\n       trier \u00BB au-dessus de CF_MIN pi\u00E8ces (audit 03) */\n    const colors = (pg && pg.couleurs) || null;\n    const withBar = list.length > CF_MIN;\n    if (withBar) Object.assign(COLF, COLF0, { slug: c.slug, list, colors });\n    const html = `\n    ${UNIVERS[slug] ? uniBanner(slug, h1, `<a href=\"${c.route}\">${esc(c.nom)}</a><span aria-hidden=\"true\">/</span><span>${esc(name)}</span>`) : ''}\n    <section class=\"wrap cpage csubpage${sleep ? ' cat--sleep' : ''}${UNIVERS[slug] ? ' csubpage--uni' : ''}\">\n      ${UNIVERS[slug] ? '' : crumbHtml([[c.route, c.nom], [null, name]])}\n      ${UNIVERS[slug] ? `<p class=\"lead csub-uni__line\">${esc(subLine(list))}</p>` : `<header class=\"chead\">\n        <div class=\"chead__t\">${sleep ? sleepMark('p', 'sleepmark--small') : ''}<h1 class=\"${h1.length > 22 ? 't-1' : 't-display'} chead__title\">${esc(h1)}</h1></div>\n        <p class=\"lead chead__intro\">${esc(subLine(list))}</p>\n      </header>`}\n      ${subPills(c, ref ? slug : '')}\n      <div data-caplia-slot=\"caplia-soeurs\"></div>\n      ${withBar ? cfBar(c.slug, list) : ''}\n      <div class=\"${cgClass(list)}\"${withBar ? ' data-grid' : ''}>${cgCards(list, 3, colors)}</div>\n      ${seoSections(pg, intro)}\n      ${faq.length ? `<section class=\"cfaq\" aria-labelledby=\"cfaq-t\"><h2 class=\"t-2\" id=\"cfaq-t\">Vos questions</h2><div>${faq.map((x) => acc(esc(x.q), `<p>${esc(nbTxt(x.r))}</p>`)).join('')}</div></section>` : ''}\n      ${catNext(c, slug)}\n    </section>\n    ${footer()}`;\n    return { title: (pg && pg.title) || `${h1} \u00B7 Caplia`, html, scene: {}, nav: c.slug, after: () => { if (pg && pg.metaDescription) setDesc(pg.metaDescription); if (withBar) cfBind(); } };\n  }\n  /* Pi\u00E8ces masqu\u00E9es : aucun texte de page ne les cite. La phrase, l'\u00E9l\u00E9ment de liste, la ligne de tableau ou la question\n     qui en parle est saut\u00E9 ; il revient de lui-m\u00EAme quand la pi\u00E8ce revient (champ \u00AB masque \u00BB retir\u00E9). */\n  const cite = (t) => !!(MASK_RE && MASK_RE.test(String(t)));\n  const sansMasque = (t) => (MASK_RE ? String(t).split(/(?<=[.!?])\\s+(?=[A-Z\u00C0-\u00D6\u00D8-\u00DE\u00AB])/).filter((x) => !cite(x)).join(' ') : String(t));\n  const cellSans = (c) => String(c).split(' ; ').filter((x) => !cite(x)).join(' ; ');\n  const seoFaq = (pg) => ((pg && pg.faq) || []).filter((x) => !cite(x.q)).map((x) => ({ q: x.q, r: sansMasque(x.r) })).filter((x) => x.r);\n  /* sections d'une page (seo-pages.json) : titre, paragraphes, liste, \u00E9tapes, tableau */\n  function seoSections(pg, lead = '') {\n    const secs = ((pg && pg.sections) || []).filter((x) => !cite(x.h2)).map((x) => ({\n      ...x,\n      paragraphes: (x.paragraphes || []).map(sansMasque).filter(Boolean),\n      liste: x.liste ? x.liste.filter((t) => !cite(t)) : x.liste,\n      /* une \u00E9tape garde sa place (\u00AB en 4 \u00E9tapes \u00BB) : seul le membre de phrase qui cite la pi\u00E8ce masqu\u00E9e part */\n      etapes: x.etapes ? x.etapes.map((t) => (cite(t) ? t.split(', ').filter((y, i) => !i || !cite(y)).join(', ').replace(/([^.!?])$/, '$1.') : t)).filter((t) => !cite(t)) : x.etapes,\n      tableau: x.tableau ? { ...x.tableau, lignes: x.tableau.lignes.filter((l) => !cite(l[0])).map((l) => l.map(cellSans)).filter((l) => l.every((c, i) => !i || c)) } : x.tableau\n    })).filter((x) => x.paragraphes.length || (x.liste && x.liste.length) || (x.etapes && x.etapes.length) || (x.tableau && x.tableau.lignes.length));\n    if (!secs.length && !lead) return '';\n    const table = (t) => `<div class=\"cseo__table\"><table class=\"table\"><thead><tr>${t.colonnes.map((x) => `<th scope=\"col\">${esc(x)}</th>`).join('')}</tr></thead><tbody>${t.lignes.map((l) => `<tr>${l.map((x, i) => (i ? `<td>${esc(nbTxt(x))}</td>` : `<th scope=\"row\">${esc(nbTxt(x))}</th>`)).join('')}</tr>`).join('')}</tbody></table></div>`;\n    /* textes de conseil (utiles au r\u00E9f\u00E9rencement et aux ind\u00E9cis) : repli\u00E9s, un volet par section */\n    const intro = lead ? `<p>${esc(nbTxt(lead))}</p>` : '';\n    if (!secs.length) return `<div class=\"cseo cseo--acc\">${acc('<h2 class=\"cseo__h\">En savoir plus</h2>', intro)}</div>`;\n    return `<div class=\"cseo cseo--acc\">${secs.map((s, i) => acc(`<h2 class=\"cseo__h\">${esc(s.h2)}</h2>`, `${i ? '' : intro}\n      ${(s.paragraphes || []).map((t) => `<p>${esc(nbTxt(t))}</p>`).join('')}\n      ${s.liste && s.liste.length ? `<ul>${s.liste.map((t) => `<li>${esc(nbTxt(t))}</li>`).join('')}</ul>` : ''}\n      ${s.etapes && s.etapes.length ? `<ol>${s.etapes.map((t) => `<li>${esc(nbTxt(t))}</li>`).join('')}</ol>` : ''}\n      ${s.tableau && s.tableau.lignes.length ? table(s.tableau) : ''}`)).join('')}</div>`;\n  }\n\n  /* Chambres assorties de Caplia Sleep (lit + bout de lit) : m\u00EAme carte que les salons assortis, prix exact, cadeaux */\n  function sleepSets() {\n    const sets = ENS.map((e, i) => [e, i]).filter(([e]) => e.sleep && ensOk(e));\n    if (!sets.length) return '';\n    return `<section class=\"ens-sec sleep-sets\" aria-labelledby=\"sleep-sets-t\">\n      <div class=\"ens-sec__head\"><h2 class=\"h-big\" id=\"sleep-sets-t\">La chambre assortie</h2>\n        <p class=\"lead\">Le lit et son banc, dans le m\u00EAme ton. Avec votre commande, offerts : ${andList(SITE.paliers.map((pl, k) => `${GIFT_HOME[k] || pl.cadeau} d\u00E8s ${price(pl.seuil)}`))}.</p></div>\n      <div class=\"ens-grid\">${sets.map(([e, i]) => ensCard(e, i)).join('')}</div>\n    </section>`;\n  }\n\n  /* Accueil : une entr\u00E9e par cat\u00E9gorie du salon (Canap\u00E9s, Fauteuils, D\u00E9coration), ses meilleures pi\u00E8ces (une par\n     sous-cat\u00E9gorie, puis la suivante), ses formes en liens, et le lien vers toute la cat\u00E9gorie. Jamais Caplia Sleep. */\n  const CAT_LINK = { canapes: 'Voir les canap\u00E9s', fauteuils: 'Voir les fauteuils', decoration: 'Voir la d\u00E9coration' };\n  function picksOf(c, n = 4) {\n    /* pi\u00E8ces \u00AB pratique \u00BB (convertibles, chauffeuses, petit velours) : dans leurs cat\u00E9gories, jamais sur l'accueil ;\n       cadrages du 07/10 : seulement des pi\u00E8ces qui ont leur photo studio (une rang\u00E9e toute au m\u00EAme gabarit ; Lou, le tapis,\n       n'en a pas) */\n    const out = [], lists = subsOf(c).map((s) => s.produits.filter((k) => BY[k] && !BY[k].pratique && carteOf(BY[k])));\n    for (let r = 0; out.length < n && lists.some((l) => l.length); r++) lists.forEach((l) => { const k = l.shift(); if (k && out.length < n && !out.includes(k)) out.push(k); });\n    return out.map((k) => BY[k]);\n  }\n\n  /* Menu : chaque cat\u00E9gorie ouvre un panneau de ses sous-cat\u00E9gories (une vraie photo par forme), \u00AB Tout voir \u00BB ;\n     au t\u00E9l\u00E9phone, un accord\u00E9on par cat\u00E9gorie. Construit une fois, depuis categories.json. */\n  function buildMenu() {\n    const links = $('.nav__links');\n    if (links && CATS.length) {\n      /* refonte du 07/10 : \u00E0 gauche la liste des formes, \u00E0 droite quatre grandes cartes photo (banni\u00E8re de l'univers,\n         sinon la photo en situation de sa premi\u00E8re pi\u00E8ce) */\n      /* 18/10 (audit 04, constat 4) : les panneaux cach\u00E9s t\u00E9l\u00E9chargeaient 564 Ko d'images d\u00E8s l'arriv\u00E9e ; leurs images\n         attendent le premier survol ou le premier focus du menu (holdImgs, puis la m\u00EAme restauration que releaseImgs) */\n      links.innerHTML = fr(holdImgs(CATS.map((c) => {\n        const subs = subsOf(c);\n        const pick = (MEGA_PICK[c.slug] || []).map((k) => subs.find((s) => s.slug === k)).filter(Boolean);\n        const cards = [...pick, ...subs.filter((s) => !pick.includes(s))].slice(0, 4);\n        return `<li class=\"nav__cat\"><a href=\"${c.route}\" data-nav=\"${c.slug}\">${esc(c.nom)}</a>\n        <div class=\"mega\" role=\"group\" aria-label=\"${esc(c.nom)}\"><div class=\"wrap mega__in mega__in--img\">\n          <div class=\"mega__col\"><p class=\"mega__lead\">${c.univers === 'sleep' ? sleepMark('span', 'sleepmark--menu') : `<span class=\"mega__t\">${esc(c.nom)}</span>`}</p>\n            <ul class=\"mega__list\">${subs.map((s) => `<li><a href=\"${subHref(s)}\">${esc(s.nom)}</a></li>`).join('')}</ul>\n            <a class=\"link mega__all\" href=\"${c.route}\">Tout voir</a></div>\n          <ul class=\"mega__cards\" style=\"--n:${cards.length}\">${cards.map((s) => `<li><a class=\"mega__card\" href=\"${subHref(s)}\"><span class=\"mega__img\">${subPic(s, '(max-width: 1100px) 22vw, 260px')}</span><span class=\"mega__name\">${esc(s.nom)}<span class=\"mega__n\">${cfNoun(c.slug, s.produits.filter((k) => BY[k]).length)}</span></span></a></li>`).join('')}</ul>\n        </div></div></li>`;\n      }).join('')));\n      /* panneau par panneau : survol \u00E0 la souris ou focus de sa rubrique (un toucher change de page sans ouvrir le panneau) */\n      const poserImages = (e) => {\n        if (e.type === 'pointerover' && e.pointerType !== 'mouse') return;\n        const li = e.target.closest('.nav__cat');\n        if (li && !li.dataset.imgs) { li.dataset.imgs = '1'; unhold(li); }\n      };\n      links.addEventListener('pointerover', poserImages);\n      links.addEventListener('focusin', poserImages);\n      /* apr\u00E8s un clic dans un panneau, il se referme m\u00EAme si le pointeur reste dessus */\n      links.addEventListener('click', (e) => { const li = e.target.closest('.nav__cat'); if (li && e.target.closest('a')) { li.classList.add('is-shut'); li.addEventListener('mouseleave', () => li.classList.remove('is-shut'), { once: true }); } });\n    }\n    const main = $('#menu .menu__main');\n    if (main && CATS.length) {\n      main.innerHTML = fr(CATS.map((c) => `<li><details class=\"mcat\"><summary><span class=\"mcat__img\" aria-hidden=\"true\">${subPic(subsOf(c)[0], '64px', true)}</span><span class=\"mcat__name\">${c.univers === 'sleep' ? sleepMark('span', 'sleepmark--mmenu') : esc(c.nom)}</span></summary>\n        <ul>${subsOf(c).map((s) => `<li><a href=\"${subHref(s)}\">${esc(s.nom)}<span>${cfNoun(c.slug, s.produits.length)}</span></a></li>`).join('')}<li><a class=\"mcat__all\" href=\"${c.route}\">Tout voir</a></li></ul>\n      </details></li>`).join(''));\n    }\n  }\n  const MEGA_PICK = { canapes: ['canape-arrondi', 'canape-bulle', 'canape-angle', 'canape-modulable'] };\n  /* photo d'une forme (menu) : sa banni\u00E8re d'univers, sinon la 1re photo en situation de ses pi\u00E8ces */\n  function subPic(s, sizes, small = false) {\n    if (!s) return '';\n    const u = UNIVERS[s.slug];\n    if (u && !small) return `<img src=\"/site/assets/univers/${u.img}-ordi.webp\" alt=\"\" width=\"1680\" height=\"720\" loading=\"lazy\" decoding=\"async\" draggable=\"false\" style=\"object-position:${u.pos}\">`;\n    const p = s.produits.map((k) => BY[k]).find((x) => x && scenesFor(x, '').length);\n    if (!p) { const q = s.produits.map((k) => BY[k]).find(Boolean); return q ? pieceFit(q, '', 64) : ''; }\n    return sceneImg(p, scenesFor(p, '')[0], { alt: '', sizes, eager: false, cls: '' });\n  }\n\n  function render404() {\n    const p = BY['petit-mouton'];\n    // 18/10 (audit 03) : les pi\u00E8ces les plus cliqu\u00E9es sur Google (liste du panier vide), pour ne pas laisser le visiteur sans rien\n    const top = CART_START.map((k) => BY[k]).filter(onSale).slice(0, 3);\n    return {\n      title: 'Page introuvable \u00B7 Caplia',\n      html: `<section class=\"wrap\">\n        <div class=\"lp-mid lp-mid--lost\">\n          ${p ? `<div class=\"lp-mid__img\">${studioImg(p, { alt: `${p.nom}, ${p.type}`, sizes: '(max-width: 760px) 70vw, 340px', eager: true, cadres: ['45'] })}</div>` : ''}\n          <h1 class=\"t-1\">Cette page s'est assoupie</h1>\n          <p class=\"lead\">Le lien est peut-\u00EAtre ancien. Les pi\u00E8ces, elles, sont toujours l\u00E0.</p>\n          <a class=\"btn\" href=\"#/\">Retour \u00E0 l'accueil</a>\n          <p class=\"lp-mid__links\"><a class=\"link\" href=\"#/canapes\">Canap\u00E9s</a><a class=\"link\" href=\"#/fauteuils\">Fauteuils</a><a class=\"link\" href=\"#/questions\">Vos questions</a><a class=\"link\" href=\"/search\">Rechercher</a></p>\n        </div>\n        ${top.length ? `<div class=\"cgrid\">${top.map((x) => pcard(x, { sizes: CG_SIZES })).join('')}</div>` : ''}\n      </section>${footer()}`,\n      scene: { img: tab('incurve-sel', '960'), soft: true }\n    };\n  }\n\n  /* =========================================================\n     ROUTAGE\n     ========================================================= */\n  const ROUTES = [\n    [/^\\/?$/, () => renderHome()],\n    /* cat\u00E9gories et sous-cat\u00E9gories (categories.json) ; sans le classement, l'ancienne page de collection */\n    [/^\\/(canapes|fauteuils|decoration|sleep)\\/?$/, (m) => (catBy(m[1]) ? renderCategory(m[1]) : m[1] === 'sleep' ? render404() : renderCollection(m[1]))],\n    [/^\\/(?:collections|sleep)\\/([\\w-]+)\\/?$/, (m) => renderSub(m[1])],\n    [/^\\/p\\/([\\w-]+)\\/?$/, (m) => renderProduct(m[1])],\n    [/^\\/panier\\/?$/, () => renderCart()],\n    [/^\\/livraison\\/?$/, () => renderLivraison()],\n    [/^\\/matieres\\/?$/, () => renderMatieres()],\n    [/^\\/arrivee\\/?$/, () => renderArrivee()],\n    [/^\\/cadeaux\\/?$/, () => renderCadeaux()],\n    [/^\\/a-propos\\/?$/, () => renderAbout()],\n    [/^\\/questions\\/?$/, () => renderFaq()],\n    [/^\\/contact\\/?$/, () => renderContact()],\n    [/^\\/renoncer\\/?$/, () => renderRenoncer()],\n    [/^\\/mentions-legales\\/?$/, () => renderMentions()],\n    [/^\\/conditions-de-vente\\/?$/, () => renderCGV()],\n    [/^\\/confidentialite\\/?$/, () => renderPrivacy()],\n    [/^\\/garantie\\/?$/, () => renderGarantie()],\n    [/^\\/paiement\\/?$/, () => renderPaiement()],\n    [/^\\/tout-va-bien\\/?$/, () => renderWell()],\n    [/^\\/un-souci\\/?$/, () => renderIssue()],\n    [/^\\/petits-espaces\\/?$/, () => renderSmall()],\n    [/^\\/jeunes-parents\\/?$/, () => renderParents()],\n    [/^\\/pourquoi-caplia\\/?$/, () => renderWhy()],\n    [/^\\/selection\\/?$/, () => renderSelection()],\n    [/^\\/merci\\/?$/, () => renderThanks()],\n    /* ancienne adresse retir\u00E9e : elle m\u00E8ne au panier, sans page d'erreur */\n    [/^\\/reserver-en-3-fois\\/?$/, () => { try { history.replaceState(null, '', '#/panier'); } catch (e) { /* rien */ } return renderCart(); }]\n  ];\n  function resolve() {\n    const path = CAPLIA_PATH();\n    if (path == null) return null;\n    for (const [re, fn] of ROUTES) { const m = path.match(re); if (m) return fn(m); }\n    return render404();\n  }\n\n  function teardown() {\n    cleanups.forEach((fn) => { try { fn(); } catch (e) { /* rien */ } });\n    cleanups = [];\n    const st = ST();\n    if (st) st.getAll().forEach((t) => t.kill(true));\n    const g = G();\n  }\n\n  /* Chaque changement de \u00AB # \u00BB refait la page. Tant que les donn\u00E9es ne sont pas charg\u00E9es, rien ne s'affiche\n     (jamais la page introuvable) : boot() appelle navigate() d\u00E8s qu'elles sont l\u00E0. Un num\u00E9ro de passage \u00E9carte\n     les rendus d\u00E9pass\u00E9s quand le client clique vite ou quand l'onglet est en arri\u00E8re-plan. */\n  let navSeq = 0;\n  function navigate() {\n    if (!CAT || !SITE) return;\n    const seq = ++navSeq;\n    let page;\n    try { page = resolve(); } catch (err) { console.error(err); page = null; }\n    if (!page || (/^Page introuvable/.test(page.title || '') && (CAPLIA.route || {}).gabarit !== '404')) { KEEP_SSR(); return; }\n    const app = $('#app');\n    const run = () => {\n      if (seq !== navSeq) return;\n      teardown();\n      const kept = KEEP_TAKE(app);\n      app.innerHTML = fr(page.html);\n      KEEP_PUT(app, kept);\n      document.documentElement.classList.add('caplia-pret');\n      try { const r = decodeURIComponent((location.hash || '#/').slice(2).split('?')[0]).replace(/\\/$/, ''); if (PAGE_DESC[r]) setDesc(PAGE_DESC[r]()); } catch (e) { /* adresse mal form\u00E9e : description par d\u00E9faut */ }\n      $$('[data-nav]').forEach((a) => a.classList.toggle('is-active', a.dataset.nav === page.nav));\n      closeMenu();\n      if (lenis) lenis.scrollTo(0, { immediate: true, force: true });\n      if (!firstRender) window.scrollTo(0, 0);\n      /* fond uni en pl\u00E2tre chaud sur tout le site : plus de photo floue derri\u00E8re les pages */\n      if (page.after) { try { page.after(app); } catch (err) { console.error(err); } }\n      enhance(app);\n    };\n    if (!firstRender && document.startViewTransition && !reduce && !document.hidden) {\n      const vt = document.startViewTransition(run);\n      [vt.ready, vt.finished, vt.updateCallbackDone].forEach((pr) => pr && pr.catch && pr.catch(() => {}));\n    } else {\n      const g = G();\n      if (!firstRender && g && !reduce && !document.hidden) {\n        g.to(app, { opacity: 0, duration: .25, onComplete: () => { run(); g.fromTo(app, { opacity: 0 }, { opacity: 1, duration: .5 }); } });\n      } else run();\n    }\n    if (!firstRender) setTimeout(() => app.focus({ preventScroll: true }), 60);\n    firstRender = false;\n  }\n\n  /* Entr\u00E9es au d\u00E9filement. 18/10 (audit 04, constat 9) : plus de zoom du fond (#scene est cach\u00E9 partout, .scene__zoom\n     n'existe pas : 17 avertissements GSAP par page), ni de ScrollTrigger, qui ne servait qu'\u00E0 lui */\n  function enhance(root) {\n    const g = G();\n    if (!g || reduce) return;\n    const els = $$('.reveal', root);\n    if (!els.length) return;\n    g.set(els, { opacity: 0, y: 32 });\n    // Ce qui est d\u00E9j\u00E0 \u00E0 l'\u00E9cran entre tout de suite, sans attendre un d\u00E9filement\n    const vus = els.filter((el) => el.getBoundingClientRect().top < innerHeight * .94);\n    if (vus.length) g.to(vus, { opacity: 1, y: 0, duration: .9, ease: 'expo.out', stagger: .07, delay: .05, clearProps: 'transform' });\n    // Le reste entre quand il arrive \u00E0 l'\u00E9cran (IntersectionObserver : fiable m\u00EAme quand le d\u00E9filement est doux ou rapide)\n    const io = new IntersectionObserver((entrees) => {\n      const arrives = entrees.filter((e) => e.isIntersecting).map((e) => e.target);\n      if (!arrives.length) return;\n      arrives.forEach((el) => io.unobserve(el));\n      g.to(arrives, { opacity: 1, y: 0, duration: .9, ease: 'expo.out', stagger: .07, overwrite: true, clearProps: 'transform' });\n    }, { rootMargin: '0px 0px -6% 0px' });\n    els.filter((el) => !vus.includes(el)).forEach((el) => io.observe(el));\n  }\n\n  /* ---------------- Menu mobile ---------------- */\n  /* Le bouton dit \u00AB Menu \u00BB ou \u00AB Fermer \u00BB ; la page derri\u00E8re ne d\u00E9file pas quand le menu est ouvert */\n  function menuState(open) {\n    const b = $('.nav__burger');\n    b.setAttribute('aria-expanded', String(open));\n    b.setAttribute('aria-label', open ? 'Fermer le menu' : 'Ouvrir le menu');\n    const t = $('.nav__burger-t', b); if (t) t.textContent = open ? 'Fermer' : 'Menu';\n    document.documentElement.classList.toggle('menu-open', open);\n  }\n  function closeMenu(refocus) {\n    const m = $('#menu');\n    if (!m || m.hidden) return;\n    m.hidden = true;\n    menuState(false);\n    if (refocus === true) $('.nav__burger').focus();\n  }\n  function toggleMenu() {\n    const m = $('#menu');\n    const open = m.hidden;\n    m.hidden = !open;\n    menuState(open);\n    if (open) { const f = $('summary, a', m); if (f) f.focus(); }\n  }\n  /* Un filet sous la barre d\u00E8s que la page d\u00E9file */\n  const navWrap = $('.nav-wrap');\n  const navLine = () => { if (navWrap) navWrap.classList.toggle('is-scrolled', window.scrollY > 8); };\n  window.addEventListener('scroll', navLine, { passive: true });\n  navLine();\n  /* Changer de page referme le message \u00AB Ajout\u00E9 au panier \u00BB : il ne doit pas couvrir la page suivante */\n  window.addEventListener('hashchange', () => { const t = $('#toast'); if (t) t.classList.remove('is-on'); });\n\n  /* ---------------- Visionneuse ---------------- */\n  /* les images de la galerie en cours (couleur choisie seulement) */\n  const LB = { i: 0 };\n  const lbList = () => (PDP.slides || []).filter((s) => s.zoom);\n  function lbShow(i) {\n    const L = lbList(), n = L.length; if (!n) return;\n    LB.i = (i + n) % n;\n    const s = L[LB.i];\n    $('#lightbox-img').src = s.zoom;\n    $('#lightbox-img').alt = s.label;\n    $('#lightbox-cap').textContent = '';\n  }\n\n  /* ---------------- Photos des cartes (cardGal) ----------------\n     Les photos suivantes re\u00E7oivent leur adresse au premier survol, toucher, focus ou glissement ; les points suivent le\n     d\u00E9filement ; la photo est cadr\u00E9e comme dans la galerie de la fiche (fitOne : la pi\u00E8ce jamais coup\u00E9e). */\n  function cgalWake(g) {\n    if (!g || g.dataset.awake) return;\n    g.dataset.awake = '1';\n    const card = g.closest('[data-piece]'), slug = card ? card.dataset.piece : '';\n    $$('img[data-srcset]', g).forEach((im) => {\n      im.srcset = im.dataset.srcset; im.src = im.dataset.src;\n      im.removeAttribute('data-srcset'); im.removeAttribute('data-src');\n      if (slug) fitOne(im.parentElement, im, slug);\n    });\n  }\n  const cgalAt = (t) => Math.round(t.scrollLeft / Math.max(1, t.clientWidth));\n  function cgalDots(t) {\n    const i = cgalAt(t);\n    $$('.cgal__dots i', t.parentElement).forEach((d, k) => d.classList.toggle('is-on', k === i));\n  }\n  function cgalGo(btn) {\n    const g = btn.closest('.cgal'), t = g && $('.cgal__track', g);\n    if (!t) return;\n    cgalWake(g);\n    const n = t.children.length, j = (cgalAt(t) + Number(btn.dataset.d) + n) % n;\n    t.scrollTo({ left: j * t.clientWidth, behavior: reduce ? 'auto' : 'smooth' });\n  }\n  let cgalRaf = 0;\n  document.addEventListener('scroll', (e) => {\n    const t = e.target;\n    if (!t.classList || !t.classList.contains('cgal__track')) return;\n    cgalWake(t.parentElement);\n    cancelAnimationFrame(cgalRaf); cgalRaf = requestAnimationFrame(() => cgalDots(t));\n  }, { capture: true, passive: true });\n  document.addEventListener('pointerover', (e) => { if (e.pointerType === 'mouse' && e.target.closest) cgalWake(e.target.closest('.pcard') && $('.cgal', e.target.closest('.pcard'))); }, { passive: true });\n  document.addEventListener('touchstart', (e) => { if (e.target.closest) cgalWake(e.target.closest('.cgal')); }, { passive: true });\n  document.addEventListener('focusin', (e) => { if (e.target.closest) cgalWake(e.target.closest('.cgal')); });\n  let cgalT = 0;\n  window.addEventListener('resize', () => { clearTimeout(cgalT); cgalT = setTimeout(() => $$('.cgal[data-awake] .cimg--more').forEach((box) => fitOne(box, $('img', box), box.closest('[data-piece]').dataset.piece)), 150); });\n\n  /* ---------------- Actions (d\u00E9l\u00E9gation) ---------------- */\n  document.addEventListener('click', (e) => {\n    const btn = e.target.closest('[data-action]');\n    if (!btn) return;\n    const a = btn.dataset.action;\n    switch (a) {\n      case 'cookies': if (cookiePrefs(btn)) e.preventDefault(); break;\n      case 'rack-filter': rackFilter(btn); break;\n      case 'up-add': e.preventDefault(); cartFx(null, null); upAdd(btn); break;\n      case 'up-color': e.preventDefault(); upColorPick(btn); break;\n      case 'quick-add': e.preventDefault(); addToCart(btn.dataset.slug, '', btn.dataset.size || ''); refreshCart(); break;\n      case 'ens-add': {\n        e.preventDefault();\n        const pc = btn.dataset.pdp && PDP.p ? PDP.p.couleurs[PDP.color] : null;\n        addEnsemble(Number(btn.dataset.i), pc && !isOut(pc) ? pc.nom : '');\n        cartFx(btn, btn.closest('.fp-ens, .ens') && $('.fp-ens__pics, .ens__media', btn.closest('.fp-ens, .ens')));\n        break;\n      }\n      case 'qa-color': quickColorPick(btn); break;\n      case 'cgal': e.preventDefault(); cgalGo(btn); break;\n      case 'qa-add': {\n        e.preventDefault();\n        const p = BY[btn.dataset.slug];\n        if (!p) break;\n        const ok = addToCart(p.slug, btn.dataset.color, '');\n        if (ok !== false) cartFx(btn, $('.cimg', btn.closest('.pcard')));\n        break;\n      }\n      case 'hero-next': heroStop(); heroGo(H.i + 1, 1); break;\n      case 'hero-prev': heroStop(); heroGo(H.i - 1, -1); break;\n      case 'hero-pick': { heroStop(); const t = Number(btn.dataset.i); heroGo(t, t >= H.i ? 1 : -1); break; }\n      case 'hero-color': heroStop(); heroColor(Number(btn.dataset.k)); break;\n      case 'hero-size': heroStop(); heroSize(Number(btn.dataset.k), btn); break;\n      case 'hero-add': {\n        heroStop();\n        const p = PRODS[H.i];\n        if (isOut(p.couleurs[H.k]) || notYet(p)) break;\n        addToCart(p.slug, p.couleurs[H.k].nom, p.tailles ? p.tailles[H.s].nom : '');\n        btn.classList.add('is-done'); setTimeout(() => btn.classList.remove('is-done'), 1200);\n        break;\n      }\n      case 'video-toggle': {\n        SC.userPaused = !SC.userPaused;\n        if (SC.userPaused) pauseVideo(); else playVideo();\n        $$('.layers-sec video').forEach((v) => { if (SC.userPaused) v.pause(); });\n        syncVideoButtons();\n        break;\n      }\n      case 'rail': {\n        const rail = btn.closest('.panel, .glass').querySelector('[data-rail]');\n        if (rail) { const card = rail.firstElementChild; const w = card ? card.getBoundingClientRect().width + 14 : 300; rail.scrollBy({ left: w * Number(btn.dataset.dir) * (isMobile() ? 1 : 2), behavior: reduce ? 'auto' : 'smooth' }); }\n        break;\n      }\n      case 'filter': applyFilter(btn.dataset.group, btn.dataset.value, btn); break;\n      case 'goto': { const t = $(btn.dataset.to); if (t) t.scrollIntoView({ behavior: reduce ? 'auto' : 'smooth', block: 'start' }); break; }\n      case 'open-retour': e.preventDefault(); openAcc('#fp-retour'); break;\n      case 'open-passe': { e.preventDefault(); if (openAcc('#fp-passe')) { const w = $('#door-w'); if (w) setTimeout(() => w.focus({ preventScroll: true }), 500); } break; }\n      case 'pdp-thumb': pdpShow(Number(btn.dataset.img)); break;\n      case 'pdp-img': {\n        const n = PDP.p.images.length;\n        let k = PDP.img + Number(btn.dataset.dir);\n        if (k < -1) k = n - 1; if (k > n - 1) k = -1;\n        pdpShow(k);\n        break;\n      }\n      case 'pdp-color': pdpColor(Number(btn.dataset.k)); break;\n      case 'pdp-size': pdpSize(Number(btn.dataset.k)); break;\n      case 'pdp-add': {\n        const p = PDP.p;\n        if (isOut(p.couleurs[PDP.color]) || notYet(p)) { const f = $('[data-notify] input[type=\"email\"]'); if (f) { f.scrollIntoView({ block: 'center', behavior: reduce ? 'auto' : 'smooth' }); f.focus({ preventScroll: true }); } break; }\n        if (addToCart(p.slug, p.couleurs[PDP.color].nom, p.tailles ? p.tailles[PDP.size].nom : '') === false) break;\n        /* la vignette qui part vers le panier : la photo de la galerie si elle est \u00E0 l'\u00E9cran, sinon celle de la barre */\n        $$('[data-action=\"pdp-add\"]').forEach((b) => cartFx(b, null));\n        const shown = $$('.fp-track img').find((im) => { const r = im.getBoundingClientRect(); return r.width > 0 && r.left >= -2 && r.left < innerWidth / 2 && r.bottom > 60 && r.top < innerHeight; });\n        cartFx(null, shown || $('#buybar .buybar__thumb'));\n        /* 18/10 (audit 03 \u00AB 4,2 secondes \u00BB) : la barre m\u00E8ne au panier pour le reste de la visite de la fiche (le bouton\n           principal reste \u00AB Ajouter au panier \u00BB) */\n        const bb = $('#buybar [data-action=\"pdp-add\"]');\n        if (bb) bb.outerHTML = fr('<a class=\"btn btn--sm\" href=\"#/panier\"><span class=\"cta__label\">Voir le panier</span></a>');\n        break;\n      }\n      case 'keep-open': {\n        const f = $('[data-keep-form]');\n        if (!f) break;\n        const open = f.hidden;\n        f.hidden = !open;\n        btn.setAttribute('aria-expanded', String(open));\n        if (open) { const m = $('#keep-mail', f); if (m) m.focus(); }\n        break;\n      }\n      case 'keep-pdf': {\n        /* version imprimable : les volets utiles ouverts, le reste de la page masqu\u00E9 (feuille d'impression, fiche.css) */\n        const fermes = $$('.fp-more details.acc').filter((d) => !d.open);\n        fermes.forEach((d) => { d.open = true; });\n        document.documentElement.classList.add('print-fiche');\n        let fait = false;\n        const done = () => { if (fait) return; fait = true; document.documentElement.classList.remove('print-fiche'); fermes.forEach((d) => { d.open = false; }); window.removeEventListener('afterprint', done); };\n        window.addEventListener('afterprint', done);\n        window.print();\n        /* afterprint manque sur certains navigateurs (Safari iOS) : retour \u00E0 la fiche normale de toute fa\u00E7on */\n        setTimeout(done, 1500);\n        break;\n      }\n      case 'pdp-express': {\n        /* aper\u00E7u de la maquette : achat express de la pi\u00E8ce seule, sans passer par le panier (dans la boutique, ce sont\n           les boutons de Shopify qui ouvrent le paiement) */\n        const p = PDP.p;\n        if (isOut(p.couleurs[PDP.color]) || notYet(p)) break;\n        const size = p.tailles ? p.tailles[PDP.size].nom : '';\n        const it = { slug: p.slug, color: p.couleurs[PDP.color].nom, size, qty: 1 };\n        saveOrder({ items: [it], total: unitPriceOf(p, size), base: isAcc(p) ? 0 : unitPriceOf(p, size), mode: 'express', date: Date.now() });\n        location.hash = '#/merci';\n        break;\n      }\n      case 'pdp-zoom': {\n        const d = $('#lightbox');\n        lbShow(Math.max(0, lbList().indexOf(PDP.slides[PDP.slide])));\n        if (d.showModal) d.showModal(); else d.setAttribute('open', '');\n        if (lenis) lenis.stop();\n        break;\n      }\n      case 'lb-prev': lbShow(LB.i - 1); break;\n      case 'lb-next': lbShow(LB.i + 1); break;\n      case 'lb-close': $('#lightbox').close(); break;\n      case 'qty': case 'remove': {\n        const key = btn.dataset.key;\n        const l = cart.find((x) => lineKey(x) === key);\n        if (!l) break;\n        const done = () => { saveCart(); updateBadge(a === 'qty'); refreshCart(); };\n        if (a === 'qty') {\n          l.qty += Number(btn.dataset.d);\n          if (l.qty < 1) l.qty = 1;\n          if (l.qty > 9) l.qty = 9;\n          done();\n        } else {\n          const li = btn.closest('.line');\n          cart = cart.filter((x) => x !== l);\n          if (li && !reduce) { li.classList.add('is-out'); setTimeout(done, 380); } else done();\n        }\n        break;\n      }\n      case 'checkout': {\n        /* Commande simul\u00E9e : on garde le r\u00E9capitulatif pour la page Merci, puis le panier se vide */\n        if (!cart.length) break;\n        SHOP_CHECKOUT(btn);\n        break;\n      }\n      case 'fav': {\n        const s = btn.dataset.slug;\n        toggleFav(s);\n        if (isFav(s)) toast(null, `${BY[s].nom} est dans votre s\u00E9lection.`, true);\n        break;\n      }\n      case 'fav-remove': {\n        toggleFav(btn.dataset.slug, false);\n        const it = btn.closest('.sel-item');\n        if (it && !fav.length) navigate();\n        else if (it) it.remove();\n        break;\n      }\n      case 'save-cart': {\n        [...cart].reverse().forEach((l) => toggleFav(l.slug, true));\n        toast(null, 'Votre s\u00E9lection est enregistr\u00E9e : retrouvez-la dans \u00AB S\u00E9lection \u00BB, en haut.', true);\n        break;\n      }\n      case 'share-open': {\n        const box = btn.closest('[data-share]');\n        if (!box) break;\n        if (touchShare()) {\n          const d = shareData(box.dataset.share);\n          navigator.share({ title: d.title, text: d.line, url: d.url }).catch((err) => { if (!err || err.name !== 'AbortError') shareMenu(box, true); });\n          break;\n        }\n        shareMenu(box, $('.share__menu', box).hidden);\n        break;\n      }\n      case 'share-copy': {\n        const box = btn.closest('[data-share]');\n        const d = shareData(box.dataset.share), msg = $('.share__msg', box);\n        copyText(d.url).then((ok) => { msg.textContent = ok ? 'Lien copi\u00E9 : collez-le dans un e-mail ou un message.' : d.url; });\n        break;\n      }\n      case 'birth': {\n        const box = btn.closest('[data-birth]');\n        const inp = $('.birth__url', box);\n        const url = pageUrl(`#/p/${btn.dataset.slug}`);\n        inp.value = url;\n        $('.birth__help', box).hidden = false;\n        copyText(url, inp).then((ok) => { const b = $('.birth__help b', box); if (b) b.textContent = ok ? 'Lien copi\u00E9.' : 'Copiez ce lien.'; });\n        break;\n      }\n      case 'share': {\n        const msg = $('[data-share-msg]');\n        const url = pageUrl('#/');\n        copyText(url).then((ok) => { msg.hidden = false; msg.textContent = ok ? 'Lien copi\u00E9 : il ne reste qu\u2019\u00E0 l\u2019envoyer.' : `Le lien \u00E0 envoyer : ${url}`; });\n        break;\n      }\n      case 'passe-pick': {\n        PASSE.slug = btn.dataset.slug;\n        $$('[data-action=\"passe-pick\"]').forEach((b) => b.setAttribute('aria-checked', String(b === btn)));\n        const f = $('[data-passe-form]');\n        const msg = $('[data-passe-msg]');\n        const w = f && Number(String(f.w.value).replace(',', '.'));\n        if (msg) { msg.classList.remove('is-ok', 'is-warn'); msg.innerHTML = fr(w ? doorAnswer(BY[PASSE.slug], w).html : passeHint()); }\n        break;\n      }\n      case 'toc': {\n        const el = document.getElementById(btn.dataset.target);\n        if (!el) break;\n        $$('[data-action=\"toc\"]').forEach((b) => b.classList.toggle('is-active', b === btn));\n        if (lenis) lenis.scrollTo(el, { offset: -110 }); else el.scrollIntoView({ behavior: reduce ? 'auto' : 'smooth' });\n        break;\n      }\n      default: break;\n    }\n  });\n\n  document.addEventListener('submit', (e) => {\n    // 18/10 (revue de l'audit) : un formulaire du site sans \u00AB action \u00BB ne part jamais tout seul ; sinon, si son gestionnaire\n    // manquait (comme du 07 au 18/10), ses champs, e-mail compris, finiraient dans l'adresse de la page\n    if (!e.target.getAttribute('action')) e.preventDefault();\n    const nt = e.target.closest('[data-notify]');\n    if (nt) {\n      e.preventDefault();\n      const m = $('[data-notify-msg]', nt);\n      const mail = nt.email.value.trim();\n      m.hidden = false;\n      if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(mail)) { m.textContent = 'Indiquez une adresse e-mail valide.'; m.classList.add('is-warn'); nt.email.focus(); return; }\n      if (!nt.ok.checked) { m.textContent = 'Cochez la case pour que nous puissions vous \u00E9crire.'; m.classList.add('is-warn'); return; }\n      const p = PDP.p, c = p.couleurs[PDP.color];\n      m.classList.remove('is-warn');\n      m.textContent = notYet(p) ? `C'est not\u00E9 : nous vous \u00E9crivons \u00E0 ${mail} le jour de la mise en vente ${/^[aeiouy\u00E9\u00E8\u00EAh]/i.test(p.nom) ? \"d'\" : 'de '}${p.nom}.` : `C'est not\u00E9 : nous vous \u00E9crivons \u00E0 ${mail} d\u00E8s le retour ${/^[aeiouy\u00E9\u00E8\u00EAh]/i.test(p.nom) ? \"d'\" : 'de '}${p.nom} en ${c.nom}.`;\n      SHOP_SUBSCRIBE(mail, ['prevenir', 'piece-' + p.slug, notYet(p) ? 'mise-en-vente' : 'couleur-' + colorSlug(c.nom)]);\n      nt.classList.add('is-sent');\n      return;\n    }\n    /* \u00AB Recevoir cette fiche \u00BB : ses champs n'ont pas de \u00AB name \u00BB (18/10, audit 02 B1) : m\u00EAme si ce code manquait, le\n       navigateur n'enverrait jamais l'adresse e-mail dans l'adresse de la page */\n    const kf = e.target.closest('[data-keep-form]');\n    if (kf) {\n      e.preventDefault();\n      const field = $('#keep-mail', kf), ok = $('#keep-ok', kf);\n      const p = PDP.p, mail = field.value.trim(), msg = $('[data-keep-msg]', kf);\n      msg.hidden = false;\n      if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(mail)) { msg.innerHTML = fr('<p class=\"is-warn\">Cette adresse ne semble pas compl\u00E8te : v\u00E9rifiez-la.</p>'); field.focus(); return; }\n      const ways = `<div class=\"fp-keep__ways\"><button class=\"pill pill--sm\" type=\"button\" data-action=\"keep-pdf\">Enregistrer la fiche en PDF</button><a class=\"pill pill--sm\" href=\"${esc(keepMailto(p, mail))}\">M\u2019envoyer la fiche</a></div>`;\n      if (ok.checked) {\n        /* consentement donn\u00E9 : client Shopify \u00E9tiquet\u00E9 fiche-demandee et fiche:<handle> (adaptateur), abonn\u00E9 */\n        if (typeof SHOP_SUBSCRIBE === 'function') SHOP_SUBSCRIBE(mail, ['fiche-demandee', `fiche:${p._h || p.slug}`, 'newsletter']);\n        msg.innerHTML = fr(FICHE_MAIL_AUTO ? '<p>C\u2019est envoy\u00E9. V\u00E9rifiez votre bo\u00EEte de r\u00E9ception (et le dossier ind\u00E9sirables) dans quelques minutes.</p>'\n          : `<p>C\u2019est not\u00E9 : vous recevrez nos e-mails. Votre fiche, tout de suite :</p>${ways}`);\n      } else {\n        msg.innerHTML = fr(`<p>Voici votre fiche. Vous ne recevrez aucun autre e-mail de notre part.</p>${ways}`);\n      }\n      return;\n    }\n    const door = e.target.closest('[data-door]');\n    if (door) {\n      e.preventDefault();\n      const num = (f) => (f && f.value ? Number(String(f.value).replace(',', '.')) : 0);\n      const a = doorAnswer(PDP.p, num(door.w), { esc: num(door.s), etage: door.etage ? door.etage.value : '' });\n      const msg = $('[data-door-msg]');\n      msg.hidden = false;\n      msg.innerHTML = fr(a.html);\n      msg.classList.toggle('is-warn', a.ok === false);\n      if (a.done) { PDP.done.door = true; pdpSteps(); }\n      return;\n    }\n    const pf = e.target.closest('[data-passe-form]');\n    if (pf) {\n      e.preventDefault();\n      const a = doorAnswer(BY[PASSE.slug], Number(String(pf.w.value).replace(',', '.')));\n      const msg = $('[data-passe-msg]');\n      msg.innerHTML = fr(a.html);\n      /* ok : true = elle passe, false = c'est juste, null = cotes du carton \u00E0 v\u00E9rifier (ton neutre) */\n      msg.classList.toggle('is-warn', a.done && a.ok === false);\n      msg.classList.toggle('is-ok', a.done && a.ok === true);\n      return;\n    }\n    /* Inscription e-mail (pied de page, s\u00E9lection) : aucun envoi r\u00E9el dans la maquette */\n    const nf = e.target.closest('[data-news], [data-selmail]');\n    if (nf) { SHOP_NEWS(e, nf); return; }\n    const f = e.target.closest('[data-form]');\n    if (!f) return;\n    e.preventDefault();\n    const msg = $('[data-form-msg]', f);\n    const nom = f.nom.value.trim(), mail = f.email.value.trim(), txt = f.message.value.trim();\n    if (!nom || !/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(mail) || !txt) {\n      msg.hidden = false;\n      msg.textContent = fr('Merci d\u2019indiquer votre nom, une adresse e-mail valide et votre message.');\n      return;\n    }\n    const issue = f.hasAttribute('data-issue');\n    const cmd = issue && f.commande.value.trim() ? `Commande ${f.commande.value.trim()}\\n\\n` : '';\n    const body = `${cmd}${txt}\\n\\n${nom}\\n${mail}`;\n    const hasPhoto = issue && f.photo.files && f.photo.files.length;\n    msg.hidden = false;\n    msg.textContent = fr(hasPhoto ? 'Votre messagerie va s\u2019ouvrir avec le message pr\u00EAt : joignez-y la photo avant d\u2019envoyer.' : 'Votre logiciel de messagerie va s\u2019ouvrir avec le message pr\u00EAt \u00E0 envoyer.');\n    window.location.href = `mailto:${SITE.email}?subject=${encodeURIComponent((issue ? 'Un souci \u00B7 ' : 'Caplia \u00B7 ') + f.sujet.value)}&body=${encodeURIComponent(body)}`;\n  });\n\n  document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeMenu(true); });\n  $('.nav__burger').addEventListener('click', toggleMenu);\n  $('#lightbox').addEventListener('close', () => { if (lenis) lenis.start(); });\n  $('#lightbox').addEventListener('click', (e) => { if (e.target.id === 'lightbox') e.target.close(); });\n  document.addEventListener('visibilitychange', () => { if (document.hidden) pauseVideo(); else if ($('[data-hero]')) playVideo(); });\n  window.addEventListener('hashchange', () => { if (/^#\\/./.test(location.hash)) location.replace(TO_URL(location.hash)); });\n  window.addEventListener('storage', (e) => {\n    if (e.key === KEY) { loadCart(); updateBadge(); refreshCart(); }\n    if (e.key === FAV_KEY) { loadFav(); favBadge(); favBtnSync(); }\n  });\n\n  /* ---------------- D\u00E9marrage ---------------- */\n  function initMotion() {\n    const g = G(), st = ST();\n    if (g && st) { g.registerPlugin(st); st.config({ ignoreMobileResize: true }); }\n    if (!reduce && window.Lenis) {\n      try {\n        lenis = new window.Lenis({ duration: 1.15, smoothWheel: true, prevent: (node) => !!(node && node.hasAttribute && node.hasAttribute('data-rail')) });\n        if (g && st) {\n          lenis.on('scroll', st.update);\n          g.ticker.add((t) => lenis.raf(t * 1000));\n          g.ticker.lagSmoothing(0);\n        } else {\n          const raf = (t) => { lenis.raf(t); requestAnimationFrame(raf); };\n          requestAnimationFrame(raf);\n        }\n      } catch (err) { lenis = null; }\n    }\n    /* 18/10 (audit 04, constat 9) : plus de parallaxe du fond \u00E0 la souris (.scene__mouse n'existe pas) */\n  }\n\n  async function boot() {\n    try {\n      /* deux nouvelles tentatives si le r\u00E9seau hoquette */\n      const getJSON = async (u, n = 2) => { try { const r = await fetch(u); if (!r.ok) throw new Error(u); return await r.json(); } catch (e) { if (n > 0) { await new Promise((ok) => setTimeout(ok, 600)); return getJSON(u, n - 1); } throw e; } };\n      /* studio.json est facultatif : sans lui, studioImg() montre les d\u00E9tour\u00E9s */\n      /* galeries, vues et mod\u00E8les 3D : facultatifs ; pr\u00E9charg\u00E9s par index.html (le serveur demande de toujours revalider) */\n      const opt = (u) => fetch(u).then((r) => (r.ok ? r.json() : null)).catch(() => null);\n      const D0 = await getJSON(CAPLIA.donnees);\n      HANDLES = D0.handles || {};\n      SEO_ACCUEIL = (D0.seo && D0.seo.accueil) || {};\n      IMGV = D0.imgv || \"\";\n      MEDIAS_IMPORT = D0.mediasImport || {};\n      (D0.photosTheme || []).forEach((u) => THEME_PHOTOS.add(u));\n      delete D0.photosTheme;\n      const D = MAP_DATA(D0);\n      const [c, s, st, ca, ga, vu, mo, cj, sj, mt, lv, cx, av, cp, nt, ft] = [D.catalogue, D.site, D.studio, D.cartes, D.galeries, null, null, D.categories, D.seo, D.matieres, D.livraison, D.cadeaux, D.avis, D.cadrage, D.notices || null, D.fiches || null];\n      CAT = c; SITE = s;\n      GALERIES = ga || {}; VUES = vu || {}; MODELES = (mo && mo.modeles) || {}; CADRAGE = cp || {}; NOTICES = nt || {};\n      MAT = mt; ARR = lv; GIFTS = cx; AVIS = av; FT = (ft && ft.pieces) || {};\n      kScenes();\n      if (st) { (st.pieces || []).forEach((x) => { STUDIO[x.slug] = x; }); DETOURE = st.detoures || {}; }\n      if (ca && ca.cartes) CARTES = { cartes: ca.cartes, large: ca.large || null, ensembles: ca.ensembles || {} };\n      if (ca && ca.photo && ca.photo.pieces && ca.photo.largeurs) PHOTO = ca.photo;\n      // Les pi\u00E8ces les plus ch\u00E8res d'abord : elles servent de rep\u00E8re, les autres paraissent ensuite raisonnables\n      /* une pi\u00E8ce masqu\u00E9e n'existe pas pour le site : ni grille, ni suggestion, ni ensemble ; #/p/<slug> m\u00E8ne \u00E0 la page introuvable */\n      /* leurs noms, et les couleurs (en deux mots au moins) qu'aucune pi\u00E8ce en ligne ne porte : \u00AB Vert sous-bois \u00BB, \u00AB Kaki garrigue \u00BB\u2026 */\n      const vues = new Set(CAT.produits.filter((p) => !p.masque).flatMap((p) => p.couleurs.filter((c) => !c.retiree).map((c) => c.nom)));\n      const caches = [...new Set(CAT.produits.filter((p) => p.masque).flatMap((p) => [p.nom, ...p.couleurs.map((c) => c.nom).filter((n) => /\\s/.test(n) && !vues.has(n))]))]\n        .map((n) => n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n      MASK_RE = caches.length ? new RegExp(`(^|[^\\\\p{L}])(${caches.join('|')})(?![\\\\p{L}])`, 'u') : null;\n      PRODS = CAT.produits.filter((p) => !p.masque && SHOP_KEEP(p)).map((p) => prepare(SHOP_MERGE(p))).sort((x, y) => y.prix - x.prix);\n      PRODS.forEach((p) => { BY[p.slug] = p; });\n      indexCats(cj, sj);\n      INDEX_VARIANTS();\n      const cur = PRODS.find((p) => (CAPLIA.route || {}).gabarit === 'product' && p._h && p._h === CAPLIA.route.handle);\n      if (cur) LINK_MEDIA(cur);\n    } catch (err) {\n      console.error(err);\n      KEEP_SSR();\n      return;\n    }\n    if (/^#\\/./.test(location.hash)) { location.replace(TO_URL(location.hash)); return; }\n    loadCart();\n    updateBadge();\n    loadFav();\n    favBadge();\n    initMotion();\n    buildMenu();\n    FIX_LINKS($('.nav-wrap'));\n    navigate();\n    SHOP_CART_RELOAD();\n    if (location.hash.length > 1) { const t = document.getElementById(decodeURIComponent(location.hash.slice(1))); if (t) setTimeout(() => t.scrollIntoView({ block: 'center' }), 120); }\n    window.addEventListener('load', () => { if (ST()) ST().refresh(); });\n  }\n\n  const bootApresAffichage = () => requestAnimationFrame(() => setTimeout(boot, 0));\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', bootApresAffichage);\n  else bootApresAffichage();\n})();\n"],
  "mappings": "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",
  "names": ["w", "R", "hash", "m", "studio", "s", "h", "x0", "y0", "h2", "w2", "H", "fr0", "e", "acc", "im", "items", "p", "keys", "q", "line", "mail", "msg", "f", "c"]
}
