{
  "version": 3,
  "sources": ["/cdn/shop/t/17/assets/leni-configurator-engine.js?nocache=1790196456231"],
  "sourcesContent": ["/**\n * LENIDESIGN \u2014 Moteur de personnalisation g\u00E9n\u00E9rique (refonte, Lot 7 + tour de corrections du 16/09)\n * ------------------------------------------------------------\n * Un c\u0153ur commun (variantes, prix, polices, \u00E9tapes accord\u00E9on/bottom sheet, galerie, r\u00E9cap, barre sticky,\n * options, panier, mode ?edit=, GA4) + un module par produit (\u00AB kind \u00BB) :\n *   texte    : Largeur (variante) \u2192 Votre texte (1 \u00E0 4 lignes, police par ligne, hi\u00E9rarchie) \u2192 Couleur (variante) \u2192 Police\n *   logo     : Votre logo (upload, contour 1 couleur, contr\u00F4le d'exploitabilit\u00E9, reprise +15 \u20AC auto) \u2192 Largeur (variante) \u2192 Couleur (variante)\n *   plaque   : Mod\u00E8le Leniva TOP / CLASSIC / BASIC (variante) \u2192 Votre texte (1 ligne) \u2192 Police (3 styles) \u2192 Couleur des lettres (variante)\n *   prenom   : Taille (variante) \u2192 Pr\u00E9nom \u2192 Police (variante \u00AB Polices d'\u00E9criture \u00BB) \u2192 Couleur (variante, 24 teintes)\n *   horaires : m1 titre + 2 blocs de 2 lignes \u00B7 m2 Nos Horaires \u00B7 m3 Bienvenue + picto \u00B7 m4 tableau (gabarits SVG)\n *   social   : sticker r\u00E9seaux sociaux \u2014 Pseudo(s) \u2192 R\u00E9seau (logo) \u2192 Police (TTF) \u2192 Finition (palette) \u2192 Hauteur (variante)\n *   duo      : pr\u00E9nom deux couches \u2014 Longueur (variante) \u2192 Pr\u00E9nom(s) \u2192 Police (r\u00E9glage) \u2192 Couleurs lettres + contour (vinyle)\n *              ou lettres + socle d'une seule pi\u00E8ce (bois, variante \u00AB Peinture \u00BB d\u00E9duite, option adh\u00E9sif) ; une ligne par pr\u00E9nom\n * Config : <script type=\"application/json\" id=\"leniPersoConfig\"> rendu par leni-section-product-perso.\n * Panier : JSON /cart/add.js (items) ou multipart FormData quand un fichier est joint (logo) + lignes d'options en JSON.\n */\n(function () {\n  'use strict';\n\n  var cfgEl = document.getElementById('leniPersoConfig');\n  var root = document.getElementById('leniHpdp');\n  if (!cfgEl || !root) return;\n\n  var cfg;\n  try { cfg = JSON.parse(cfgEl.textContent); } catch (e) { console.error('[Lenidesign] config personnalisateur invalide', e); return; }\n  var KIND = cfg.kind || 'texte';\n  var REG = cfg.register === 'pro' ? 'pro' : 'maison'; // registre visuel : maison (cr\u00E8me, pastilles) ou pro (\u00E9tabli, plan cot\u00E9)\n\n  /* \u2500\u2500 Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var MSG = {\n    add: 'Ajouter au panier', update: 'Mettre \u00E0 jour le panier', added: 'Ajout\u00E9 \u2713', updated: 'Panier mis \u00E0 jour \u2713',\n    adding: 'Ajout en cours\u2026', unavailable: 'Indisponible', complete: 'Compl\u00E9tez votre personnalisation',\n    tooLong: 'Texte trop long.', textRequired: 'Indiquez au moins une ligne de texte.', line1Required: 'Indiquez votre texte.',\n    fileRequired: 'Ajoutez votre logo.', fileType: 'Format non pris en charge : utilisez un PNG, JPG, SVG ou PDF.',\n    fileSize: 'Fichier trop lourd (10 Mo maximum).', fileRead: 'Impossible de lire ce fichier.',\n    blur: 'Image de faible r\u00E9solution pour cette largeur : le contour de d\u00E9coupe peut manquer de pr\u00E9cision. Un fichier vectoriel (SVG, PDF) est recommand\u00E9.',\n    pdf: 'PDF re\u00E7u : l\u2019aper\u00E7u n\u2019est pas disponible, nous v\u00E9rifions le fichier \u00E0 l\u2019atelier.',\n    uploadErr: 'L\u2019envoi du fichier a \u00E9chou\u00E9. R\u00E9essayez ou envoyez votre logo \u00E0 contact@lenidesign.fr en pr\u00E9cisant votre commande.'\n  };\n\n  /* \u2500\u2500 Helpers DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function $(sel, ctx) { return (ctx || root).querySelector(sel); }\n  function $$(sel, ctx) { return Array.prototype.slice.call((ctx || root).querySelectorAll(sel)); }\n  function el(tag, attrs, children) {\n    var e = document.createElement(tag);\n    if (attrs) Object.keys(attrs).forEach(function (k) {\n      if (k === 'class') e.className = attrs[k];\n      else if (k === 'text') e.textContent = attrs[k];\n      else if (k === 'html') e.innerHTML = attrs[k];\n      else if (k.indexOf('on') === 0) e.addEventListener(k.slice(2), attrs[k]);\n      else if (attrs[k] !== null && attrs[k] !== undefined && attrs[k] !== false) e.setAttribute(k, attrs[k] === true ? '' : attrs[k]);\n    });\n    (children || []).forEach(function (c) { if (c) e.appendChild(typeof c === 'string' ? document.createTextNode(c) : c); });\n    return e;\n  }\n  function isMobile() { return window.matchMedia('(max-width: 749px)').matches; }\n  if (cfg.ctaLabel) MSG.add = cfg.ctaLabel;\n  function esc(s) { return String(s).replace(/[&<>\"']/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]; }); }\n  function stripEmoji(s) { return String(s).replace(/[\\u{1F000}-\\u{1FAFF}\\u{2600}-\\u{27BF}\\u{FE0F}]/gu, ''); }\n  function fmtCm(n) { return (Math.round(n * 10) / 10).toString().replace('.', ','); }\n  function parseCm(v) { var n = parseFloat(String(v || '').replace(',', '.')); return isNaN(n) ? 0 : n; }\n\n  /* \u2500\u2500 Argent \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function formatMoney(cents) {\n    var fmt = (cfg.money && cfg.money.format) || '{{amount_with_comma_separator}} \u20AC';\n    var val = cents / 100, amount = val.toFixed(2);\n    return fmt\n      .replace(/\\{\\{\\s*amount_with_comma_separator\\s*\\}\\}/g, amount.replace('.', ','))\n      .replace(/\\{\\{\\s*amount_no_decimals_with_comma_separator\\s*\\}\\}/g, Math.round(val).toString())\n      .replace(/\\{\\{\\s*amount_no_decimals\\s*\\}\\}/g, Math.round(val).toString())\n      .replace(/\\{\\{\\s*amount\\s*\\}\\}/g, amount)\n      .replace(/<[^>]+>/g, '');\n  }\n\n  /* \u2500\u2500 Options de variante : r\u00F4les d\u00E9tect\u00E9s par nom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var ROLE_RX = {\n    size: /taille|format|dimension|longueur|largeur|hauteur/i,\n    bg: /fond|contour|socle/i,               // 2e couleur (duo) : contour vinyle ou socle bois\n    layers: /peinture|nombre de couleur/i,   // duo bois : variante d\u00E9duite du nombre de couches peintes\n    toggle: /adh[\u00E9e]sif|accroche/i,          // option oui/non port\u00E9e par une variante\n    color: /couleur|color/i,\n    material: /mati[e\u00E8]re|support/i,\n    print: /impression|finition/i,\n    model: /mod[e\u00E8]le/i,\n    fontopt: /police/i,\n    textopt: /^texte/i,                      // QR : option \u00AB Texte \u00BB (QR seul / Avec texte), synchronis\u00E9e par le kind qr\n    lines: /^lignes?$/i,                     // texte pro : tarif par nombre de lignes (1 ligne / 2 lignes / 3 \u00E0 4 lignes), synchronis\u00E9 par le kind texte\n    version: /^version/i,                    // kits vitrine : blanc seul / couleurs (change la composition)\n    pose: /^pose/i                           // kits vitrine : ext\u00E9rieure / int\u00E9rieure (d\u00E9coupe en miroir)\n  };\n  var optionNames = cfg.optionNames || [];\n  var roleIdx = {};\n  optionNames.forEach(function (n, i) {\n    Object.keys(ROLE_RX).forEach(function (r) { if (roleIdx[r] === undefined && ROLE_RX[r].test(n) && Object.keys(roleIdx).every(function (k) { return roleIdx[k] !== i; })) roleIdx[r] = i; });\n  });\n  function hasRole(r) { return roleIdx[r] !== undefined; }\n  function roleLabel(r) { return (cfg.labels && cfg.labels[r]) || (hasRole(r) ? optionNames[roleIdx[r]] : r); }\n  function optionMeta(value) { return (cfg.optionMeta && cfg.optionMeta[value]) || {}; }\n  function roleValues(r) {\n    var seen = {}, out = [], i = roleIdx[r];\n    if (i === undefined) return out;\n    cfg.variants.forEach(function (v) { var s = v.options[i]; if (!seen[s]) { seen[s] = 1; out.push(s); } });\n    return out;\n  }\n  function firstValue(r) {\n    if (!hasRole(r)) return '';\n    for (var i = 0; i < cfg.variants.length; i++) if (cfg.variants[i].available) return cfg.variants[i].options[roleIdx[r]];\n    return cfg.variants[0] ? cfg.variants[0].options[roleIdx[r]] : '';\n  }\n  function findVariant(sel) {\n    for (var i = 0; i < cfg.variants.length; i++) {\n      var v = cfg.variants[i], ok = true;\n      Object.keys(roleIdx).forEach(function (r) { if (sel[r] !== undefined && v.options[roleIdx[r]] !== sel[r]) ok = false; });\n      if (ok) return v;\n    }\n    return null;\n  }\n  function currentVariant() { return findVariant(state.opt); }\n  function selWith(r, val) { var s = {}; Object.keys(state.opt).forEach(function (k) { s[k] = state.opt[k]; }); s[r] = val; return s; }\n\n  /* \u2500\u2500 \u00C9tat partag\u00E9 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var state = { opt: {}, qty: 1, font: cfg.defaultFont || '', extras: {} };\n  Object.keys(roleIdx).forEach(function (r) { state.opt[r] = (cfg.defaults && cfg.defaults[r]) || firstValue(r); });\n  (cfg.extras || []).forEach(function (x) { state.extras[x.key] = false; });\n\n  var editKey = null;\n  try { editKey = new URLSearchParams(window.location.search).get('edit') || null; } catch (e) { /* noop */ }\n  var editQty = 1, editProps = null;\n  var interacted = false, completeSent = false, submitAttempted = false, previewShown = false;\n  var errors = {};\n  var previewWarn = '';\n  var touchedKeys = {};\n  function touch(k) { touchedKeys[k] = true; }\n\n  function extraActive(x) { return x.auto ? !!state.extras[x.key] : !!state.extras[x.key]; }\n  /* \u2500\u2500 Offres par quantit\u00E9 (r\u00E9glage \u00AB offers \u00BB, une par ligne : \u00AB 2 | -10% \u00BB ou \u00AB 2 | 15,45 \u00BB = prix unitaire TTC) \u2500\u2500\n     Ce sont des remises automatiques Shopify (appliqu\u00E9es au panier) : le moteur ne fait que les anticiper \u00E0 l'\u00E9cran. */\n  var OFFERS = String(cfg.offers || '').split(/\\r?\\n/).map(function (l) {\n    var m = /^\\s*(\\d+)\\s*[|:;]\\s*(.+?)\\s*$/.exec(l); if (!m) return null;\n    var q = parseInt(m[1], 10), val = m[2].replace(',', '.');\n    if (/%/.test(val)) { var pct = Math.abs(parseFloat(val.replace(/[^\\d.\\-]/g, ''))); return pct > 0 && q > 1 ? { qty: q, pct: pct } : null; }\n    var unit = Math.round(parseFloat(val.replace(/[^\\d.]/g, '')) * 100); return unit > 0 && q > 1 ? { qty: q, unit: unit } : null;\n  }).filter(Boolean).sort(function (a, b) { return a.qty - b.qty; });\n  function orderQty() { return editKey ? editQty : state.qty; }\n  function unitCount() { return (K.unitCount ? K.unitCount() : 1) * orderQty(); } // articles r\u00E9ellement ajout\u00E9s (ex. pseudos \u00D7 quantit\u00E9)\n  function tierFor(n) { var t = null; OFFERS.forEach(function (o) { if (n >= o.qty) t = o; }); return t; }\n  function setPrice() { var v = currentVariant(); return K.totalPrice ? K.totalPrice() : (v ? v.price : 0); } // le produit seul, pour une quantit\u00E9 de 1\n  function extrasPrice() { var p = 0; (cfg.extras || []).forEach(function (x) { if (extraActive(x) && x.price && !(editKey && x.variantId)) p += x.price; }); return p; }\n  function offerTotal(t) { var q = orderQty(), base = setPrice() * q; if (!t) return base; return t.unit != null ? t.unit * unitCount() : Math.round(base * (1 - t.pct / 100)); }\n  function totalPrice() { return offerTotal(tierFor(unitCount())) + extrasPrice() * orderQty(); }\n  function offerLabel(o) { return o.unit != null ? formatMoney(o.unit) + ' l\u2019unit\u00E9' : '\u2212' + o.pct + ' %'; }\n  function renderOffers() {\n    var host = $('#leniOffers'); if (!host) return;\n    host.innerHTML = '';\n    if (!OFFERS.length && !cfg.offersNote) { host.hidden = true; return; }\n    host.hidden = false;\n    if (OFFERS.length) {\n      var n = unitCount(), cur = tierFor(n), per = K.unitCount ? K.unitCount() : 1;\n      var chips = el('div', { class: 'leni-offers__chips', role: 'group', 'aria-label': 'Offres par quantit\u00E9' });\n      OFFERS.forEach(function (o) {\n        chips.appendChild(el('button', { type: 'button', class: 'leni-offer' + (cur === o ? ' is-active' : ''), 'aria-pressed': cur === o ? 'true' : 'false', text: 'D\u00E8s ' + o.qty + ' : ' + offerLabel(o),\n          onclick: function () { state.qty = Math.max(1, Math.ceil(o.qty / per)); markInteracted(); renderPriceAndCta(); } }));\n      });\n      host.appendChild(chips);\n      var note;\n      if (cur) note = n + ' articles : ' + formatMoney(offerTotal(cur)) + ' au lieu de ' + formatMoney(offerTotal(null)) + ', remise appliqu\u00E9e au panier.';\n      else { var k = OFFERS[0].qty - n; note = 'Encore ' + k + (k > 1 ? ' articles' : ' article') + ' pour ' + offerLabel(OFFERS[0]) + '.'; }\n      host.appendChild(el('p', { class: 'leni-offers__note', text: note }));\n    }\n    if (cfg.offersNote) host.appendChild(el('p', { class: 'leni-offers__note leni-offers__note--pack', text: cfg.offersNote }));\n  }\n\n  /* \u2500\u2500 GA4 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function ga(event, params) {\n    window.dataLayer = window.dataLayer || [];\n    var v = currentVariant();\n    var base = { event: event, item_id: v ? String(v.id) : '', item_name: cfg.product.title, item_variant: v ? v.title : '', value: v ? v.price / 100 : 0, currency: (cfg.money && cfg.money.currency) || 'EUR', kind: KIND };\n    Object.keys(params || {}).forEach(function (k) { base[k] = params[k]; });\n    window.dataLayer.push(base);\n  }\n  function markInteracted() {\n    if (!interacted) { interacted = true; ga('customize_start'); }\n    if (!previewShown) showPreview();\n  }\n  function markComplete() { if (!completeSent && K.isComplete()) { completeSent = true; ga('customize_complete'); } }\n\n  /* \u2500\u2500 Polices \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var loadedFonts = {};\n  var SYSTEM_FONTS = { 'Arial': true, 'Helvetica': true, 'Georgia': true };\n  var LOCAL_FONTS = { 'Breath of the River': true }; // @font-face d\u00E9clar\u00E9e par la section\n  (cfg.localFonts || []).forEach(function (f) { LOCAL_FONTS[f] = true; });\n  function loadFonts(list) {\n    var need = list.filter(function (f) { return f && f.family && !loadedFonts[f.family] && !LOCAL_FONTS[f.family] && !SYSTEM_FONTS[f.family]; });\n    var localLoads = list.filter(function (f) { return f && LOCAL_FONTS[f.family]; })\n      .map(function (f) { return document.fonts && document.fonts.load ? document.fonts.load('20px \"' + f.family + '\"').catch(function () {}) : Promise.resolve(); });\n    if (!need.length) return Promise.all(localLoads);\n    var seen = {};\n    need = need.filter(function (f) { if (seen[f.family]) return false; seen[f.family] = 1; return true; });\n    var link = document.createElement('link');\n    link.rel = 'stylesheet';\n    link.href = 'https://fonts.googleapis.com/css2?' + need.map(function (f) {\n      return 'family=' + encodeURIComponent(f.family).replace(/%20/g, '+') + (f.weight && f.weight !== 400 ? ':wght@' + f.weight : '');\n    }).join('&') + '&display=swap';\n    document.head.appendChild(link);\n    need.forEach(function (f) { loadedFonts[f.family] = true; });\n    return new Promise(function (res) { link.onload = res; link.onerror = res; setTimeout(res, 3000); })\n      .then(function () {\n        if (!document.fonts || !document.fonts.load) return null;\n        return Promise.all(need.map(function (f) { return document.fonts.load((f.weight || 400) + ' 20px \"' + f.family + '\"').catch(function () {}); }).concat(localLoads));\n      });\n  }\n  var mctx = document.createElement('canvas').getContext('2d');\n  function measure(txt, family, weight, size) {\n    mctx.font = (weight || 400) + ' ' + size + 'px \"' + family + '\", sans-serif';\n    return mctx.measureText(txt).width;\n  }\n  function fitSize(txt, family, weight, size, maxW) {\n    if (!txt || !maxW) return size;\n    var w = measure(txt, family, weight, size);\n    return w > maxW ? size * maxW / w : size;\n  }\n  /* Google Fonts : la plupart des familles \u00AB display \u00BB n'existent qu'en 400 ; Big Shoulders demande la 700 */\n  function fontWeightFor(family) { return /Big Shoulders|Montserrat|^Outfit$/i.test(family) ? 700 : (/^Barlow Condensed$/i.test(family) ? 600 : 400); } // Outfit 700 et Barlow Condensed 600 : kits vitrine (font-outfit.bin / font-barlow-condensed.bin dans Contenu > Fichiers)\n  function pickerFonts() { return (cfg.fonts || []).map(function (f) { return { family: f, weight: fontWeightFor(f) }; }); }\n\n  /* \u2500\u2500 D\u00E9mo avant saisie : l'aper\u00E7u s'anime (exemples qui s'\u00E9crivent lettre \u00E0 lettre, tenue, fondu) tant que le client\n     n'a rien tap\u00E9 ; arr\u00EAt\u00E9e \u00E0 la premi\u00E8re frappe, jamais en mode ?edit=, image fixe si l'utilisateur refuse les animations.\n     o = { list: exemples (cha\u00EEnes), idle: fn \u2192 true tant que rien n'est saisi, set: fn(n) \u2192 param\u00E8tres du cycle n } \u2500\u2500 */\n  var REDUCE_MOTION = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);\n  function makeDemo(o) {\n    var d = { on: false, n: 0, i: 0, typed: 0, alpha: 1, phase: 'typing', timer: null };\n    d.full = function () { return o.list[d.i] || ''; };\n    d.text = function () { return d.full().slice(0, Math.max(1, d.typed)); };\n    d.active = function () { return d.on && o.idle(); };\n    d.stop = function () { d.on = false; if (d.timer) clearTimeout(d.timer); d.timer = null; };\n    d.set = function (n) { d.n = n; d.i = n % o.list.length; if (o.set) o.set(n); };\n    d.step = function () {\n      if (!d.active()) { d.stop(); renderPreview(); updateLight(); return; }\n      var len = d.full().length, delay;\n      if (d.phase === 'typing') { d.typed++; if (d.typed >= len) { d.phase = 'hold'; delay = 2600; } else delay = 150; }\n      else if (d.phase === 'hold') { d.phase = 'fade'; d.alpha = 0.7; delay = 80; }\n      else { d.alpha -= 0.25; if (d.alpha <= 0.05) { d.set(d.n + 1); d.typed = 0; d.alpha = 1; d.phase = 'typing'; delay = 320; } else delay = 80; }\n      renderPreview(); updateLight();\n      d.timer = setTimeout(d.step, delay);\n    };\n    d.start = function () {\n      if (REDUCE_MOTION || d.on || !o.idle() || editKey) return;\n      d.on = true; d.set(Math.floor(Math.random() * 97)); d.typed = 0; d.alpha = 1; d.phase = 'typing';\n      d.timer = setTimeout(d.step, 900);\n    };\n    return d;\n  }\n\n  /* \u2500\u2500 Couleurs d'aper\u00E7u \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function isGold(v) { return /^or\\b|dor[\u00E9e]|gold/i.test(String(v)); }\n  function isSilver(v) { return /argent|silver|alu/i.test(String(v)); }\n  function isHolo(v) { return /holo/i.test(String(v)); }\n  function isDark(hex) {\n    var m = /^#?([0-9a-f]{6})$/i.exec(String(hex || '')); if (!m) return false;\n    var n = parseInt(m[1], 16), r = n >> 16, g = (n >> 8) & 255, b = n & 255;\n    return (0.299 * r + 0.587 * g + 0.114 * b) < 110;\n  }\n  function hexFor(value, fallback) { var m = optionMeta(value); if (m.hex) return m.hex; var p = paletteItem(value); return p ? p.hex : (fallback || '#F5F1EA'); }\n  function paletteItem(name) { return (cfg.palette || []).filter(function (p) { return p.name === name; })[0]; }\n  function svgFill(value) {\n    if (isHolo(value)) return 'url(#leniHolo)';\n    if (isGold(value)) return 'url(#leniGold)';\n    if (isSilver(value)) return 'url(#leniSilver)';\n    return hexFor(value);\n  }\n  function swatchBg(value) {\n    if (isHolo(value)) return 'linear-gradient(135deg,#ff6ec7,#a78bfa,#38bdf8,#34d399,#fbbf24)';\n    if (isGold(value)) return 'linear-gradient(145deg,#F1D486,#B8862B)';\n    if (isSilver(value)) return 'linear-gradient(145deg,#F2F2F2,#9A9A9A)';\n    return hexFor(value);\n  }\n  function defs() {\n    return '<defs><linearGradient id=\"leniGold\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#F1D486\"/><stop offset=\"0.5\" stop-color=\"#C4923A\"/><stop offset=\"1\" stop-color=\"#E9C46A\"/></linearGradient>' +\n      '<linearGradient id=\"leniSilver\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#F2F2F2\"/><stop offset=\"0.5\" stop-color=\"#A9A9A9\"/><stop offset=\"1\" stop-color=\"#E0E0E0\"/></linearGradient>' +\n      '<linearGradient id=\"leniHolo\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#ff6ec7\"/><stop offset=\"0.25\" stop-color=\"#a78bfa\"/><stop offset=\"0.5\" stop-color=\"#38bdf8\"/><stop offset=\"0.75\" stop-color=\"#34d399\"/><stop offset=\"1\" stop-color=\"#fbbf24\"/></linearGradient>' +\n      '<linearGradient id=\"leniPlexi\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#2B2B2B\"/><stop offset=\"0.45\" stop-color=\"#0E0E0E\"/><stop offset=\"1\" stop-color=\"#1F1F1F\"/></linearGradient>' +\n      '<linearGradient id=\"leniWood\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#D9B77F\"/><stop offset=\"0.45\" stop-color=\"#C39B62\"/><stop offset=\"1\" stop-color=\"#A67C48\"/></linearGradient>' +\n      '<linearGradient id=\"leniWhite\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#FFFFFF\"/><stop offset=\"0.6\" stop-color=\"#F2F2F2\"/><stop offset=\"1\" stop-color=\"#DDDDDD\"/></linearGradient>' +\n      '<linearGradient id=\"leniWoodRaw\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0.3\"><stop offset=\"0\" stop-color=\"#F1E6CF\"/><stop offset=\"0.5\" stop-color=\"#E6D5B3\"/><stop offset=\"1\" stop-color=\"#EEDFC2\"/></linearGradient>' +\n      '<filter id=\"leniShadow\" x=\"-10%\" y=\"-10%\" width=\"120%\" height=\"130%\"><feDropShadow dx=\"0\" dy=\"6\" stdDeviation=\"6\" flood-color=\"#000\" flood-opacity=\"0.25\"/></filter>' +\n      '<filter id=\"leniShadowSoft\" x=\"-10%\" y=\"-10%\" width=\"120%\" height=\"130%\"><feDropShadow dx=\"0\" dy=\"3\" stdDeviation=\"3\" flood-color=\"#000\" flood-opacity=\"0.35\"/></filter></defs>';\n  }\n  function T(o) {\n    // o: {x, y, text, family, weight, size, anchor, fill, maxW, opacity}\n    if (!o.text) return '';\n    var size = fitSize(o.text, o.family, o.weight, o.size, o.maxW);\n    return '<text x=\"' + o.x.toFixed(1) + '\" y=\"' + o.y.toFixed(1) + '\" text-anchor=\"' + (o.anchor || 'start') + '\" font-family=\"\\'' + esc(o.family) + '\\', sans-serif\" font-weight=\"' + (o.weight || 400) + '\" font-size=\"' + size.toFixed(2) + '\" fill=\"' + o.fill + '\"' + (o.opacity ? ' fill-opacity=\"' + o.opacity + '\"' : '') + (o.extra || '') + '>' + esc(o.text) + '</text>';\n  }\n\n  /* \u2500\u2500 Cotes : largeur sous la pi\u00E8ce, hauteur \u00E0 droite. Style plan (traits laiton, valeurs en mm, mono) ou\n     pastilles (traits encre, valeurs en cm). o: {x, y, w, h, wcm, hcm, ink, bg, plan, fs} \u2500\u2500 */\n  function fmtMm(cm) { return (Math.round(cm * 100) / 10).toFixed(1).replace('.', ',') + ' mm'; }\n  function dimLines(o) {\n    var plan = !!o.plan, ink = o.ink || '#1A1A1A', col = plan ? '#C4923A' : ink, op = plan ? 1 : 0.6, gap = o.gap || 26, tick = 8, fs = o.fs || 22;\n    var x0 = o.x, x1 = o.x + o.w, yl = o.y + o.h + gap, xv = x1 + gap, y0 = o.y, y1 = o.y + o.h, s = [];\n    var F = function (v) { return (+v).toFixed(1); };\n    s.push('<g stroke=\"' + col + '\" stroke-opacity=\"' + op + '\" stroke-width=\"1.5\" fill=\"none\">');\n    s.push('<line x1=\"' + F(x0) + '\" y1=\"' + F(yl) + '\" x2=\"' + F(x1) + '\" y2=\"' + F(yl) + '\"/><line x1=\"' + F(x0) + '\" y1=\"' + F(yl - tick) + '\" x2=\"' + F(x0) + '\" y2=\"' + F(yl + tick) + '\"/><line x1=\"' + F(x1) + '\" y1=\"' + F(yl - tick) + '\" x2=\"' + F(x1) + '\" y2=\"' + F(yl + tick) + '\"/>');\n    if (o.hcm) s.push('<line x1=\"' + F(xv) + '\" y1=\"' + F(y0) + '\" x2=\"' + F(xv) + '\" y2=\"' + F(y1) + '\"/><line x1=\"' + F(xv - tick) + '\" y1=\"' + F(y0) + '\" x2=\"' + F(xv + tick) + '\" y2=\"' + F(y0) + '\"/><line x1=\"' + F(xv - tick) + '\" y1=\"' + F(y1) + '\" x2=\"' + F(xv + tick) + '\" y2=\"' + F(y1) + '\"/>');\n    s.push('</g>');\n    var wl = plan ? fmtMm(o.wcm) : fmtCm(o.wcm) + ' cm', hl = o.hcm ? (plan ? fmtMm(o.hcm) : fmtCm(o.hcm) + ' cm') : '';\n    var fam = plan ? \"'IBM Plex Mono', ui-monospace, Menlo, monospace\" : 'Inter, sans-serif';\n    function label(x, y, t, rot) {\n      if (plan) return '<text x=\"' + F(x) + '\" y=\"' + F(y) + '\" text-anchor=\"middle\" font-family=\"' + fam + '\" font-size=\"' + fs + '\" font-weight=\"600\" fill=\"' + col + '\"' + (rot ? ' transform=\"rotate(90 ' + F(x) + ' ' + F(y) + ')\"' : '') + '>' + esc(t) + '</text>';\n      var wpx = t.length * fs * 0.6 + 22;\n      return '<g' + (rot ? ' transform=\"rotate(90 ' + F(x) + ' ' + F(y) + ')\"' : '') + '><rect x=\"' + F(x - wpx / 2) + '\" y=\"' + F(y - fs * 0.75) + '\" width=\"' + F(wpx) + '\" height=\"' + F(fs * 1.5) + '\" rx=\"' + F(fs * 0.75) + '\" fill=\"' + (o.bg || '#F7F5F1') + '\"/><text x=\"' + F(x) + '\" y=\"' + F(y + fs * 0.36) + '\" text-anchor=\"middle\" font-family=\"' + fam + '\" font-size=\"' + fs + '\" font-weight=\"600\" fill=\"' + ink + '\">' + esc(t) + '</text></g>';\n    }\n    s.push(label((x0 + x1) / 2, plan ? yl + fs * 1.25 : yl, wl, false));\n    if (hl) s.push(label(plan ? xv + fs * 0.45 : xv, (y0 + y1) / 2, hl, true));\n    return s.join('');\n  }\n\n  /* \u2500\u2500 \u00C9tapes : DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var STEPS = [], LABELS = {};\n  function buildSteps() {\n    var host = $('#leniCfg'); if (!host) return;\n    host.innerHTML = '';\n    STEPS.forEach(function (key, i) {\n      var n = i + 1;\n      host.appendChild(el('div', { class: 'leni-cfg__step', 'data-step': n, 'data-key': key }, [\n        el('button', { type: 'button', class: 'leni-cfg__head', 'aria-expanded': 'false', onclick: function () { toggleStep(n); } }, [\n          el('span', { class: 'leni-cfg__num', 'aria-hidden': 'true', text: String(n) }),\n          el('span', { class: 'leni-cfg__name', text: LABELS[key] || key }),\n          el('span', { class: 'leni-cfg__value' }),\n          el('span', { class: 'leni-cfg__chev-wrap', html: '<svg class=\"leni-cfg__chev\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"/></svg>' })\n        ]),\n        el('div', { class: 'leni-cfg__body', 'data-step-body': n })\n      ]));\n    });\n  }\n  function stepIndex(key) { return STEPS.indexOf(key) + 1; }\n  function bodyOf(key) { return $('[data-step-body=\"' + stepIndex(key) + '\"]', document); }\n\n  /* \u2500\u2500 Rendus partag\u00E9s : option de variante, couleur, police \u2500 */\n  var RENDER = {};\n  function renderRoleList(role, opts) {\n    var body = bodyOf(role); if (!body) return;\n    body.innerHTML = '';\n    var list = el('div', { class: 'leni-choice-list', role: 'radiogroup', 'aria-label': roleLabel(role) });\n    roleValues(role).forEach(function (val) {\n      var m = optionMeta(val), v = findVariant(selWith(role, val));\n      var unavailable = v && !v.available;\n      var ex = opts && opts.extra ? opts.extra(val) : '', exObj = ex && typeof ex === 'object' ? ex : null, extraLabel = exObj ? '' : (ex || '');\n      var meta = exObj ? '<span class=\"leni-choice__meta\">' + (exObj.h ? '<span class=\"leni-choice__h\">' + esc(exObj.h) + '</span>' : '') + (exObj.tag ? '<span class=\"leni-choice__tag is-' + esc(exObj.state || 'none') + '\">' + esc(exObj.tag) + '</span>' : '') + '</span>' : '';\n      list.appendChild(el('label', { class: 'leni-choice' + (state.opt[role] === val ? ' is-selected' : '') + (unavailable ? ' is-unavailable' : '') + (exObj ? ' has-meta' : '') }, [\n        el('input', { type: 'radio', name: 'leni-' + role, value: val, checked: state.opt[role] === val ? true : null, onchange: function () { state.opt[role] = val; markInteracted(); if (opts && opts.onchange) opts.onchange(val); update(); } }),\n        el('span', { class: 'leni-choice__radio', 'aria-hidden': 'true' }),\n        el('span', { class: 'leni-choice__label', html: esc(val) + (m.label ? ' \u00B7 ' + esc(m.label) : '') + (m.sub || extraLabel ? '<small>' + esc(m.sub || '') + (m.sub && extraLabel ? ' \u00B7 ' : '') + esc(extraLabel) + '</small>' : '') + meta }),\n        el('span', { class: 'leni-choice__price', text: unavailable ? MSG.unavailable : (v ? formatMoney(v.price) : '') })\n      ]));\n    });\n    body.appendChild(list);\n    if (opts && opts.after) opts.after(body);\n    if (opts && opts.hint) body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:10px', text: opts.hint }));\n    if (opts && opts.guide && cfg.guideKey) body.appendChild(el('button', { type: 'button', class: 'leni-cfg__link', text: opts.guide, onclick: function () { openAccordion(cfg.guideKey); closeSheet(); } }));\n  }\n  function renderSwatches(host, values, current, onPick, ariaLabel) {\n    var wrap = el('div', { class: 'leni-swatches', role: 'radiogroup', 'aria-label': ariaLabel || 'Couleur' });\n    values.forEach(function (item) {\n      var val = typeof item === 'string' ? item : item.name;\n      var extra = typeof item === 'string' ? '' : (item.extra || '');\n      wrap.appendChild(el('button', {\n        type: 'button', class: 'leni-swatch' + (current === val ? ' is-selected' : ''), role: 'radio', 'aria-checked': current === val ? 'true' : 'false',\n        onclick: function () { onPick(val); }\n      }, [el('span', { class: 'leni-swatch__dot', style: 'background:' + swatchBg(val) }), el('span', { html: esc(val) + (extra ? '<small>' + esc(extra) + '</small>' : '') })]));\n    });\n    host.appendChild(wrap);\n  }\n  function chips(host, values, current, onPick, ariaLabel) {\n    var grp = el('div', { class: 'leni-chips', role: 'radiogroup', 'aria-label': ariaLabel || '' });\n    values.forEach(function (val) {\n      grp.appendChild(el('button', { type: 'button', class: 'leni-chip' + (current === val ? ' is-selected' : ''), role: 'radio', 'aria-checked': current === val ? 'true' : 'false', text: val, onclick: function () { onPick(val); } }));\n    });\n    host.appendChild(grp);\n    return grp;\n  }\n  RENDER.color = function () {\n    var body = bodyOf('color'); if (!body) return;\n    body.innerHTML = '';\n    if (hasRole('color')) {\n      var base = findVariant(selWith('color', roleValues('color')[0]));\n      renderSwatches(body, roleValues('color').map(function (val) {\n        var v = findVariant(selWith('color', val));\n        return { name: val, extra: v && base && v.price > base.price ? ' +' + formatMoney(v.price - base.price) : '' };\n      }), state.opt.color, function (val) { state.opt.color = val; markInteracted(); update(); }, roleLabel('color'));\n    } else {\n      renderSwatches(body, (cfg.palette || []).map(function (p) { return p.name; }), state.color, function (val) { state.color = val; if (K.onColor) K.onColor(val); markInteracted(); update(); }, LABELS.color);\n    }\n    if (cfg.colorHint) body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:12px', text: cfg.colorHint }));\n  };\n  RENDER.size = function () { renderRoleList('size', { hint: cfg.sizeHint || '', guide: cfg.sizeGuide || '', extra: K.sizeExtra, onchange: K.onSizeChange, after: K.afterSize }); };\n  RENDER.material = function () { renderRoleList('material', { hint: cfg.materialHint || '' }); };\n  RENDER.model = function () { renderRoleList('model', { hint: cfg.materialHint || '', after: K.afterModel }); };\n  RENDER.print = function () { renderRoleList('print'); };\n  RENDER.font = function () {\n    var body = bodyOf('font'); if (!body) return;\n    body.innerHTML = '';\n    if (K.renderFontTarget) K.renderFontTarget(body);\n    var list = pickerFonts();\n    var current = K.fontCurrent ? K.fontCurrent() : state.font;\n    if (current && !list.some(function (f) { return f.family === current; })) list.unshift({ family: current, weight: fontWeightFor(current) });\n    var grid = el('div', { class: 'leni-fonts', role: 'radiogroup', 'aria-label': 'Police' });\n    var sample = (K.fontSample && K.fontSample()) || 'Votre texte';\n    list.forEach(function (f) {\n      grid.appendChild(el('button', {\n        type: 'button', class: 'leni-font-card' + (current === f.family ? ' is-selected' : ''), role: 'radio', 'aria-checked': current === f.family ? 'true' : 'false',\n        onclick: function () { if (K.pickFont) K.pickFont(f.family); else state.font = f.family; markInteracted(); loadFonts([f]).then(renderPreview); update(); }\n      }, [\n        el('span', { class: 'leni-font-card__sample', style: 'font-family:\"' + f.family + '\", sans-serif; font-weight:' + f.weight, text: sample }),\n        el('span', { class: 'leni-font-card__name', text: (cfg.fontLabels && cfg.fontLabels[f.family]) || f.family })\n      ]));\n    });\n    body.appendChild(grid);\n    body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:10px', text: K.fontHint ? K.fontHint() : 'La police s\u2019applique \u00E0 tout le texte.' }));\n  };\n\n  /* \u2500\u2500 Champ texte g\u00E9n\u00E9rique \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function textField(o) {\n    // o: {key, label, placeholder, max, value, err, required, onInput, onBlur, hint, type, auto}\n    var inp = el('input', {\n      type: o.type || 'text', id: 'leniField-' + o.key, maxlength: String(o.max), placeholder: o.placeholder || '', value: o.value || '', autocomplete: o.auto || 'off', class: o.err ? 'is-invalid' : '',\n      'aria-required': o.required ? 'true' : null,\n      oninput: function () { o.onInput(stripEmoji(this.value)); },\n      onblur: function () { if (o.onBlur) o.onBlur(); }\n    });\n    return el('div', { class: 'leni-cfg__fieldrow', 'data-field': o.key }, [\n      el('label', { for: 'leniField-' + o.key, class: 'leni-cfg__fieldlabel', text: o.label }),\n      inp,\n      el('small', { text: o.err ? '\u26A0 ' + o.err : (o.hint || (o.max + ' caract\u00E8res max.')) })\n    ]);\n  }\n  function patchField(key, err, hint) {\n    var row = $('[data-field=\"' + key + '\"]'); if (!row) return;\n    var inp = row.querySelector('input'), small = row.querySelector('small');\n    inp.classList.toggle('is-invalid', !!err);\n    if (small) small.textContent = err ? '\u26A0 ' + err : hint;\n  }\n  var fieldTimers = {};\n  function debounced(key, fn) { clearTimeout(fieldTimers[key]); fieldTimers[key] = setTimeout(fn, 250); }\n\n  /* \u2500\u2500 Options (r\u00E9cap) : raclette, miroir, reprise auto\u2026 \u2500\u2500\u2500\u2500 */\n  function renderOptions() {\n    var host = $('#leniOptions'); if (!host) return;\n    host.innerHTML = '';\n    (cfg.extras || []).forEach(function (x) {\n      if (x.variantId && editKey) return;\n      if (x.auto) {\n        if (!state.extras[x.key]) return;\n        var sub = (K.extraSub && K.extraSub(x.key)) || x.sub || '';\n        host.appendChild(el('div', { class: 'leni-opt leni-opt--auto' }, [\n          el('span', { class: 'leni-opt__mark', 'aria-hidden': 'true', html: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M9 15l2 2 4-4\"/></svg>' }),\n          el('span', { class: 'leni-opt__text', html: esc(x.label) + (x.price ? ' <strong>+ ' + esc(formatMoney(x.price)) + '</strong>' : '') + (sub ? '<small>' + esc(sub) + '</small>' : '') })\n        ]));\n        return;\n      }\n      host.appendChild(el('label', { class: 'leni-opt' }, [\n        el('input', { type: 'checkbox', checked: state.extras[x.key] ? true : null, onchange: function () { state.extras[x.key] = this.checked; markInteracted(); renderRecap(); renderPriceAndCta(); } }),\n        el('span', { class: 'leni-opt__text', html: esc(x.label) + (x.price ? ' <strong>+ ' + esc(formatMoney(x.price)) + '</strong>' : '') + (x.sub ? '<small>' + esc(x.sub) + '</small>' : '') })\n      ]));\n    });\n    if (K.renderOptions) K.renderOptions(host);\n  }\n\n  /* \u2500\u2500 Bandeau de mesures par d\u00E9faut (registre Pro) : dimensions, mati\u00E8re, couleur, police \u2500\u2500 */\n  function defaultReadout() {\n    if (REG !== 'pro') return [];\n    var out = [], d = K.dims ? K.dims() : '', m = d && /^(.+?) \u00D7 (.+?) cm$/.exec(d);\n    if (hasRole('model') && state.opt.model) out.push({ label: roleLabel('model'), value: state.opt.model });\n    if (m) { out.push({ label: 'Largeur', value: m[1] + ' cm' }); out.push({ label: 'Hauteur', value: m[2] + ' cm' }); }\n    else if (hasRole('size') && state.opt.size) out.push({ label: roleLabel('size'), value: state.opt.size });\n    if (hasRole('material') && state.opt.material) out.push({ label: roleLabel('material'), value: state.opt.material });\n    var col = hasRole('color') ? state.opt.color : state.color; if (col) out.push({ label: 'Couleur', value: col });\n    var f = K.fontValue ? K.fontValue() : state.font; if (f && !hasRole('fontopt')) out.push({ label: 'Police', value: f });\n    return out.slice(0, 4);\n  }\n\n  /* \u2500\u2500 Aper\u00E7u + galerie \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function renderPreview() {\n    var wrap = $('#leniPreview'); if (!wrap) return;\n    previewWarn = '';\n    wrap.innerHTML = K.preview();\n    if (K.afterPreview) K.afterPreview(wrap); // rendu canvas (photo + motif courb\u00E9 du mug) apr\u00E8s insertion\n    var stage = $('#leniStage');\n    if (stage) stage.classList.toggle('is-light-bg', !!K.lightBg());\n    var warn = $('#leniPreviewWarn');\n    if (warn) { warn.textContent = previewWarn; warn.classList.toggle('is-visible', !!previewWarn); }\n    var ro = $('#leniReadout');\n    if (ro) {\n      ro.innerHTML = ''; var items = K.readout ? K.readout() : defaultReadout(); ro.classList.toggle('is-empty', !items.length);\n      items.forEach(function (it) { ro.appendChild(el('div', { class: 'leni-readout__cell' }, [el('span', { class: 'leni-readout__label', text: it.label }), el('span', { class: 'leni-readout__value', text: it.value })])); });\n    }\n    var vw = $('#leniViews');\n    if (vw) {\n      vw.innerHTML = ''; var views = K.views ? K.views() : []; vw.classList.toggle('is-empty', views.length < 2);\n      if (views.length > 1) views.forEach(function (v) { vw.appendChild(el('button', { type: 'button', class: 'leni-views__btn' + (state.view === v.key ? ' is-selected' : ''), 'aria-pressed': state.view === v.key ? 'true' : 'false', text: v.label, onclick: function () { state.view = v.key; renderPreview(); } })); });\n    }\n  }\n  var gallery = { items: [], index: 0 };\n  function showPreview() { gallery.go(0); }\n  gallery.go = function (i) {\n    var n = gallery.items.length; if (!n) return;\n    i = ((i % n) + n) % n;\n    gallery.index = i;\n    var stage = $('#leniStage'), img = $('#leniStageImg');\n    var it = gallery.items[i];\n    if (it.preview) { previewShown = true; stage.classList.add('is-preview'); renderPreview(); }\n    else { stage.classList.remove('is-preview'); if (img && it.src && img.getAttribute('src') !== it.src) { img.src = it.src; img.removeAttribute('srcset'); } }\n    $$('.leni-hpdp__thumb').forEach(function (t, k) { t.classList.toggle('is-active', k === i); });\n    var cnt = $('#leniGalleryCount'); if (cnt) cnt.textContent = (i + 1) + ' / ' + n;\n    var thumb = $$('.leni-hpdp__thumb')[i]; if (thumb && thumb.scrollIntoView) { try { thumb.scrollIntoView({ block: 'nearest', inline: 'center', behavior: 'smooth' }); } catch (e) { /* noop */ } }\n  };\n  function bindGallery() {\n    var stage = $('#leniStage'); if (!stage) return;\n    gallery.items = $$('.leni-hpdp__thumb').map(function (t) { return { preview: t.classList.contains('leni-hpdp__thumb--preview'), src: t.dataset.src || '' }; });\n    $$('.leni-hpdp__thumb').forEach(function (t, k) { t.addEventListener('click', function () { gallery.go(k); }); });\n    if (gallery.items.length > 1) {\n      var prev = el('button', { type: 'button', class: 'leni-gal__nav leni-gal__nav--prev', 'aria-label': 'Image pr\u00E9c\u00E9dente', html: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>', onclick: function () { gallery.go(gallery.index - 1); } });\n      var next = el('button', { type: 'button', class: 'leni-gal__nav leni-gal__nav--next', 'aria-label': 'Image suivante', html: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"/></svg>', onclick: function () { gallery.go(gallery.index + 1); } });\n      stage.appendChild(prev); stage.appendChild(next);\n      stage.appendChild(el('span', { class: 'leni-gal__count', id: 'leniGalleryCount', text: '1 / ' + gallery.items.length }));\n      var x0 = null, y0 = null;\n      stage.addEventListener('touchstart', function (e) { if (e.touches.length === 1) { x0 = e.touches[0].clientX; y0 = e.touches[0].clientY; } }, { passive: true });\n      stage.addEventListener('touchend', function (e) {\n        if (x0 === null) return;\n        var dx = e.changedTouches[0].clientX - x0, dy = e.changedTouches[0].clientY - y0; x0 = null;\n        if (Math.abs(dx) > 40 && Math.abs(dx) > Math.abs(dy) * 1.5) gallery.go(gallery.index + (dx < 0 ? 1 : -1));\n      }, { passive: true });\n      stage.addEventListener('keydown', function (e) { if (e.key === 'ArrowLeft') gallery.go(gallery.index - 1); if (e.key === 'ArrowRight') gallery.go(gallery.index + 1); });\n      stage.setAttribute('tabindex', '0');\n    }\n  }\n\n  /* \u2500\u2500 En-t\u00EAtes, r\u00E9cap, prix, CTA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function optLabel(role, val) { return K.optLabel ? K.optLabel(role, val) : val; }\n  function firstRoleStep() { return STEPS.filter(function (k) { return roleIdx[k] !== undefined; })[0]; } // premi\u00E8re \u00E9tape de variante (le prix s'affiche dans son en-t\u00EAte, m\u00EAme si la saisie la pr\u00E9c\u00E8de)\n  function roleValue(role) {\n    var val = state.opt[role] || '', m = optionMeta(val), v = currentVariant();\n    if (role === 'size' || role === 'material' || role === 'model') return optLabel(role, val) + (m.label ? ' \u00B7 ' + m.label : '') + (v && role === firstRoleStep() ? ' \u00B7 ' + formatMoney(v.price) : '');\n    return optLabel(role, val);\n  }\n  function stepValue(key) {\n    if (key === 'font') return K.fontValue ? K.fontValue() : (state.font || '\u2014');\n    if (key === 'color') return K.colorValue ? K.colorValue() : (hasRole('color') ? state.opt.color : (state.color || '\u2014'));\n    if (roleIdx[key] !== undefined) return roleValue(key);\n    return K.stepValue(key);\n  }\n  function renderHeaders() {\n    STEPS.forEach(function (key, i) {\n      var step = $('[data-step=\"' + (i + 1) + '\"]'); if (!step) return;\n      var val = $('.leni-cfg__value', step); if (val) val.textContent = stepValue(key);\n      step.classList.toggle('is-invalid', !!(errors[key] && (submitAttempted || K.touched(key))));\n      step.classList.toggle('is-done', !errors[key] && (K.stepDone ? K.stepDone(key) : !!stepValue(key)));\n    });\n  }\n  function renderRecap() {\n    var lines = $('#leniRecapLines'); if (!lines) return;\n    lines.innerHTML = '';\n    var l1 = [];\n    STEPS.forEach(function (key) {\n      if (roleIdx[key] === undefined && key !== 'font' && key !== 'color') return;\n      var txt = key === 'font' ? (K.fontValue ? K.fontValue() : state.font) : (key === 'color' ? (K.colorValue ? K.colorValue() : (!hasRole('color') ? state.color : optLabel(key, state.opt[key] || ''))) : optLabel(key, state.opt[key] || ''));\n      if (!txt) return;\n      if (l1.length) l1.push(' \u00B7 ');\n      l1.push(el('button', { type: 'button', text: txt, onclick: function () { openStep(stepIndex(key)); } }));\n    });\n    if (l1.length) lines.appendChild(el('div', {}, l1));\n    K.recapLines().forEach(function (r) { lines.appendChild(el('div', {}, [el('button', { type: 'button', text: r.text, onclick: function () { openStep(stepIndex(r.step)); } })])); });\n    (cfg.extras || []).forEach(function (x) { if (state.extras[x.key] && x.note) lines.appendChild(el('div', { class: 'leni-cfg__recap-note', text: x.note })); });\n  }\n  function ctaLabel(valid, v) {\n    var price = v ? formatMoney(totalPrice()) : '';\n    if (v && !v.available) return MSG.unavailable;\n    if (!valid) return K.incompleteLabel ? K.incompleteLabel() : MSG.complete;\n    return (editKey ? MSG.update : MSG.add) + (price ? ' \u2192 ' + price : '');\n  }\n  function renderPriceAndCta() {\n    var v = currentVariant(), valid = K.isValid();\n    var priceEl = $('#leniPrice'); if (priceEl) priceEl.textContent = v ? formatMoney(v.price) : '';\n    var label = ctaLabel(valid, v), labelShort = label.replace(/\\s*\u2192.*$/, ''); // barre collante et volet mobile : le prix est d\u00E9j\u00E0 affich\u00E9 \u00E0 c\u00F4t\u00E9\n    $$('[data-leni-atc]').forEach(function (b) {\n      if (b.dataset.busy) return;\n      b.textContent = b.closest('#leniStickyBar, .leni-sheet') ? labelShort : label;\n      b.classList.toggle('is-invalid', !valid || (v && !v.available));\n      b.setAttribute('aria-disabled', (!valid || (v && !v.available)) ? 'true' : 'false');\n    });\n    var sp = $('#leniStickyPrice'); if (sp) sp.textContent = v ? formatMoney(totalPrice()) : '';\n    var ss = $('#leniStickySub'); if (ss) ss.textContent = K.stickySub();\n    var sb = $('#leniStickyBar'); if (sb) sb.classList.toggle('is-invalid', !valid);\n    var qo = $('#leniQtyOut'); if (qo) qo.textContent = state.qty;\n    renderOffers();\n    var ge = $('#leniGlobalError'); if (ge && !ge.dataset.sticky) { ge.textContent = ''; ge.classList.remove('is-visible'); }\n  }\n  function updateLight() { renderHeaders(); renderRecap(); renderPriceAndCta(); renderPreview(); }\n  function update() {\n    K.validate();\n    STEPS.forEach(function (key) { if (K.render[key]) K.render[key](); else if (RENDER[key]) RENDER[key](); });\n    renderOptions();\n    updateLight();\n    if (sheetStep) syncSheet();\n  }\n\n  /* \u2500\u2500 Accord\u00E9on desktop / bottom sheet mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var sheetStep = 0;\n  function afterOpen(key) { if (key === 'font') loadFonts(pickerFonts()).then(renderPreview); if (K.onOpen) K.onOpen(key); }\n  // Accord\u00E9on exclusif : une seule \u00E9tape ouverte \u00E0 la fois. \u00C0 l'arriv\u00E9e, la saisie (\u00E9tape 1) est ouverte et les autres\n  // ferm\u00E9es ; ouvrir une \u00E9tape referme toutes les autres, y compris la saisie. Cliquer l'en-t\u00EAte de l'\u00E9tape ouverte la referme.\n  function closeOtherSteps(i) { $$('.leni-cfg__step').forEach(function (s) { if (s.getAttribute('data-step') !== String(i)) s.classList.remove('is-open'); }); }\n  function openStep(i) {\n    if (!i) return;\n    if (isMobile() && !(K.inlineFirst && i === 1)) { openSheet(i); return; }\n    var step = $('[data-step=\"' + i + '\"]'); if (!step) return;\n    closeOtherSteps(i);\n    step.classList.add('is-open');\n    afterOpen(STEPS[i - 1]);\n    var top = step.getBoundingClientRect().top;\n    if (top < 90 || top > window.innerHeight - 120) step.scrollIntoView({ behavior: 'smooth', block: 'center' });\n  }\n  function toggleStep(i) {\n    if (isMobile() && !(K.inlineFirst && i === 1)) { openSheet(i); return; }\n    var step = $('[data-step=\"' + i + '\"]'); if (!step) return;\n    if (step.classList.contains('is-open')) { step.classList.remove('is-open'); return; }\n    closeOtherSteps(i);\n    step.classList.add('is-open');\n    afterOpen(STEPS[i - 1]);\n    var top = step.getBoundingClientRect().top;\n    if (top < 90) step.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  }\n  function openSheet(i) {\n    var sheet = $('#leniSheet'), overlay = $('#leniSheetOverlay'); if (!sheet) return;\n    if (sheetStep && sheetStep !== i) returnBody(sheetStep);\n    sheetStep = i;\n    var body = $('[data-step-body=\"' + i + '\"]', document), host = $('.leni-sheet__body', sheet);\n    host.innerHTML = ''; if (body) host.appendChild(body);\n    $('.leni-sheet__title', sheet).textContent = i + '. ' + (LABELS[STEPS[i - 1]] || '');\n    syncSheet();\n    sheet.classList.add('is-mounted'); overlay.classList.add('is-open');\n    requestAnimationFrame(function () { sheet.classList.add('is-open'); });\n    afterOpen(STEPS[i - 1]);\n    var stage = $('#leniStage');\n    if (stage) {\n      if (!previewShown) showPreview();\n      var headerH = (document.querySelector('.leni-header') || {}).offsetHeight || 64;\n      window.scrollTo({ top: Math.max(0, stage.getBoundingClientRect().top + window.scrollY - headerH), behavior: 'smooth' });\n    }\n    var sb = $('#leniStickyBar'); if (sb) sb.classList.remove('leni-sticky-bar--visible');\n    host.scrollTop = 0;\n  }\n  function syncSheet() {\n    var sheet = $('#leniSheet'); if (!sheet || !sheetStep) return;\n    var dots = $('.leni-sheet__steps', sheet);\n    if (dots && dots.children.length !== STEPS.length) { dots.innerHTML = ''; STEPS.forEach(function () { dots.appendChild(el('span', { class: 'leni-sheet__stepdot' })); }); }\n    $$('.leni-sheet__stepdot', sheet).forEach(function (d, idx) { d.classList.toggle('is-current', idx + 1 === sheetStep); d.classList.toggle('is-done', idx + 1 < sheetStep); });\n    var next = $('#leniSheetNext'); if (next) next.style.display = sheetStep < STEPS.length ? '' : 'none';\n  }\n  function returnBody(i) {\n    var body = $('[data-step-body=\"' + i + '\"]', document), step = $('[data-step=\"' + i + '\"]');\n    if (body && step && body.parentElement !== step) step.appendChild(body);\n  }\n  function closeSheet() {\n    var sheet = $('#leniSheet'), overlay = $('#leniSheetOverlay'); if (!sheet || !sheetStep) return;\n    sheet.classList.remove('is-open'); overlay.classList.remove('is-open');\n    var s = sheetStep;\n    setTimeout(function () { returnBody(s); if (!sheetStep) sheet.classList.remove('is-mounted'); }, 260);\n    sheetStep = 0;\n    updateSticky();\n  }\n  function sheetNext() {\n    var key = STEPS[sheetStep - 1];\n    if (errors[key]) { submitAttempted = true; update(); return; }\n    if (sheetStep < STEPS.length) openSheet(sheetStep + 1);\n  }\n\n  /* \u2500\u2500 Accord\u00E9ons contenu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function openAccordion(key) {\n    var item = $('.leni-acc__item[data-key=\"' + key + '\"]'); if (!item) return;\n    $$('.leni-acc__item', item.parentElement).forEach(function (it) { it.classList.remove('is-open'); });\n    item.classList.add('is-open');\n    item.classList.remove('is-flash'); void item.offsetWidth; item.classList.add('is-flash');\n    setTimeout(function () { item.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 50);\n  }\n  function bindAccordions() {\n    $$('.leni-acc__btn').forEach(function (btn) {\n      btn.addEventListener('click', function () {\n        var item = btn.closest('.leni-acc__item'), open = item.classList.contains('is-open');\n        $$('.leni-acc__item', item.parentElement).forEach(function (it) { it.classList.remove('is-open'); it.querySelector('.leni-acc__btn').setAttribute('aria-expanded', 'false'); });\n        if (!open) { item.classList.add('is-open'); btn.setAttribute('aria-expanded', 'true'); }\n      });\n    });\n  }\n\n  /* \u2500\u2500 Barre sticky mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var ctaVisible = true;\n  function updateSticky() {\n    var sb = $('#leniStickyBar'); if (!sb) return;\n    sb.classList.toggle('leni-sticky-bar--visible', !ctaVisible && !sheetStep && isMobile());\n  }\n  function bindSticky() {\n    var cta = $('#leniAddBtn'); if (!cta || !('IntersectionObserver' in window)) return;\n    new IntersectionObserver(function (entries) { ctaVisible = entries[0].isIntersecting; updateSticky(); }, { threshold: 0.2 }).observe(cta);\n  }\n\n  /* \u2500\u2500 Panier \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function refreshDrawer() {\n    var rootUrl = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || cfg.routes.root || '/';\n    return fetch(rootUrl + '?section_id=cart-drawer').then(function (r) { return r.text(); }).then(function (html) {\n      var doc = new DOMParser().parseFromString(html, 'text/html');\n      var fresh = doc.querySelector('#CartDrawer'), current = document.querySelector('#CartDrawer');\n      if (fresh && current) { current.innerHTML = fresh.innerHTML; current.className = fresh.className; }\n      /* synchroniser aussi l'\u00E9tat \u00AB vide \u00BB de <cart-drawer> (comme renderContents de Dawn) : sinon open() cherche .drawer__inner-empty, absent, et trapFocus(null) l\u00E8ve une erreur */\n      var fd = doc.querySelector('cart-drawer'), cd = document.querySelector('cart-drawer');\n      if (fd && cd) cd.classList.toggle('is-empty', fd.classList.contains('is-empty'));\n      var nb = doc.querySelector('.cart-count-bubble'), cb = document.querySelector('.cart-count-bubble');\n      if (nb && cb) cb.innerHTML = nb.innerHTML;\n      return fetch(cfg.routes.cart).then(function (r) { return r.json(); });\n    }).then(function (cart) {\n      var c = document.querySelector('.leni-header__cart-count');\n      if (c) { c.textContent = cart.item_count; c.style.display = cart.item_count > 0 ? 'flex' : 'none'; }\n    });\n  }\n  function openDrawer() {\n    var d = document.querySelector('cart-drawer');\n    if (d && typeof d.open === 'function') d.open(document.querySelector('#cart-icon-bubble'));\n  }\n  function extraProps(props) {\n    (cfg.extras || []).forEach(function (x) { if (state.extras[x.key] && x.prop) props[x.prop] = x.propValue || 'Oui'; });\n    return props;\n  }\n  function extraItems(qty) {\n    var items = [];\n    if (!editKey) (cfg.extras || []).forEach(function (x) { if (state.extras[x.key] && x.variantId) items.push({ id: x.variantId, quantity: qty }); });\n    return items;\n  }\n  function showError(msg) {\n    var ge = $('#leniGlobalError'); if (ge) { ge.textContent = msg; ge.classList.add('is-visible'); ge.dataset.sticky = '1'; setTimeout(function () { delete ge.dataset.sticky; }, 6000); }\n  }\n  function parseCartResponse(r) {\n    return r.text().then(function (txt) {\n      var j = {}; try { j = JSON.parse(txt); } catch (e) { if (!r.ok) throw new Error('Erreur panier'); }\n      if (!r.ok) throw new Error(j.description || j.message || 'Erreur panier');\n      return j;\n    });\n  }\n  var JSON_HEADERS = { 'Content-Type': 'application/json', 'Accept': 'application/json' };\n  function postItem(it) {\n    // ligne avec fichier(s) : multipart ; sinon JSON. Retourne la promesse de la r\u00E9ponse panier.\n    if (it.files && it.files.length) {\n      var fd = new FormData();\n      fd.append('id', String(it.id)); fd.append('quantity', String(it.quantity));\n      Object.keys(it.properties || {}).forEach(function (k) { fd.append('properties[' + k + ']', it.properties[k]); });\n      it.files.forEach(function (f) { fd.append('properties[' + f.prop + ']', f.blob, f.name); });\n      return fetch(cfg.routes.cartAdd, { method: 'POST', headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: fd })\n        .then(function (r) { return parseCartResponse(r).catch(function () { throw new Error(MSG.uploadErr); }); });\n    }\n    return fetch(cfg.routes.cartAdd, { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify({ items: [{ id: it.id, quantity: it.quantity, properties: it.properties }] }) }).then(parseCartResponse);\n  }\n  function postCart(v, qty) {\n    var props = extraProps(K.properties());\n    props._config = JSON.stringify(K.compact());\n    var items = K.cartItems ? K.cartItems(qty) : [{ id: v.id, quantity: qty, properties: props, files: K.files ? K.files() : null }];\n    var extra = extraItems(qty);\n    if (!items.some(function (it) { return it.files && it.files.length; })) {\n      var all = items.map(function (it) { return { id: it.id, quantity: it.quantity, properties: it.properties }; }).concat(extra);\n      return fetch(cfg.routes.cartAdd, { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify({ items: all }) }).then(parseCartResponse);\n    }\n    // fichiers joints : lignes envoy\u00E9es une par une (multipart), puis les options en JSON\n    var chain = Promise.resolve(null);\n    items.forEach(function (it) { chain = chain.then(function () { return postItem(it); }); });\n    if (extra.length) chain = chain.then(function () { return fetch(cfg.routes.cartAdd, { method: 'POST', headers: JSON_HEADERS, body: JSON.stringify({ items: extra }) }).then(parseCartResponse); });\n    return chain;\n  }\n  function addToCart(btn) {\n    submitAttempted = true;\n    if (!K.validate()) { update(); openStep(stepIndex(K.firstInvalidStep())); return; }\n    var v = currentVariant();\n    if (!v || !v.available || btn.dataset.busy) return;\n    var buttons = $$('[data-leni-atc]');\n    buttons.forEach(function (b) { b.dataset.busy = '1'; b.textContent = MSG.adding; });\n    var qty = editKey ? editQty : state.qty, wasEdit = editKey;\n    Promise.resolve(K.beforeAdd ? K.beforeAdd() : null)\n      .then(function () { return K.vectorFonts ? OT.ready(K.vectorFonts()) : null; }) // polices du fichier de d\u00E9coupe (4 s max)\n      .then(function () { return postCart(v, qty); })\n      .then(function () {\n        if (!wasEdit) return null;\n        return fetch(cfg.routes.cartChange, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ id: wasEdit, quantity: 0 }) });\n      })\n      .then(function () {\n        var gaP = { quantity: qty, value: totalPrice() / 100 }, gx = K.gaExtra ? K.gaExtra() : null; if (gx) Object.keys(gx).forEach(function (k) { gaP[k] = gx[k]; });\n        ga('add_to_cart', gaP);\n        if (wasEdit) {\n          editKey = null; editProps = null;\n          (cfg.extras || []).forEach(function (x) { if (x.variantId && !x.auto) state.extras[x.key] = false; });\n          try { var u = new URL(window.location.href); u.searchParams.delete('edit'); history.replaceState(null, '', u.toString()); } catch (e) { /* noop */ }\n          renderOptions();\n        }\n        return refreshDrawer();\n      })\n      .then(function () {\n        buttons.forEach(function (b) { b.textContent = wasEdit ? MSG.updated : MSG.added; b.classList.add('is-success'); });\n        if (sheetStep) closeSheet();\n        openDrawer();\n        setTimeout(function () { buttons.forEach(function (b) { delete b.dataset.busy; b.classList.remove('is-success'); }); renderPriceAndCta(); }, 1500);\n      })\n      .catch(function (err) {\n        buttons.forEach(function (b) { delete b.dataset.busy; });\n        renderPriceAndCta();\n        showError(err.message || 'Erreur lors de l\u2019ajout au panier.');\n      });\n  }\n  function loadEditLine() {\n    if (!editKey) return Promise.resolve();\n    return fetch(cfg.routes.cart).then(function (r) { return r.json(); }).then(function (cart) {\n      var item = (cart.items || []).filter(function (it) { return it.key === editKey; })[0];\n      if (!item) { editKey = null; return; }\n      editQty = item.quantity || 1;\n      editProps = item.properties || {};\n      var raw = editProps._config;\n      if (raw) { try { K.apply(JSON.parse(raw), editProps); } catch (e) { /* config illisible */ } }\n      interacted = true;\n    }).catch(function () { editKey = null; });\n  }\n\n  /* \u2500\u2500 Toast \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var toastTimer = null;\n  function toast(msg) {\n    var t = $('#leniToast'); if (!t) return;\n    t.textContent = msg; t.classList.add('is-visible');\n    clearTimeout(toastTimer); toastTimer = setTimeout(function () { t.classList.remove('is-visible'); }, 2600);\n  }\n\n  /* \u2500\u2500 Liaison des \u00E9l\u00E9ments statiques \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function bindStatic() {\n    $$('[data-leni-atc]').forEach(function (b) { b.addEventListener('click', function (e) { e.preventDefault(); addToCart(b); }); });\n    var edit = $('#leniRecapEdit'); if (edit) edit.addEventListener('click', function () { openStep(stepIndex(K.mainStep)); });\n    var minus = $('#leniQtyMinus'), plus = $('#leniQtyPlus');\n    if (minus) minus.addEventListener('click', function () { if (state.qty > 1) { state.qty--; renderPriceAndCta(); } });\n    if (plus) plus.addEventListener('click', function () { if (state.qty < 99) { state.qty++; renderPriceAndCta(); } });\n    var close = $('#leniSheetClose'); if (close) close.addEventListener('click', closeSheet);\n    var ov = $('#leniSheetOverlay'); if (ov) ov.addEventListener('click', closeSheet);\n    var next = $('#leniSheetNext'); if (next) next.addEventListener('click', sheetNext);\n    $$('[data-open-accordion]').forEach(function (b) { b.addEventListener('click', function () { openAccordion(b.dataset.openAccordion); }); });\n    bindGallery();\n    window.matchMedia('(max-width: 749px)').addEventListener('change', function (e) {\n      if (!e.matches && sheetStep) closeSheet();\n      if (e.matches) $$('.leni-cfg__step').forEach(function (s) { if (!s.classList.contains('is-inline')) s.classList.remove('is-open'); });\n      else { var s1 = $('[data-step=\"1\"]'); if (s1) s1.classList.add('is-open'); }\n      updateSticky();\n    });\n    document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && sheetStep) closeSheet(); });\n  }\n\n  /* Placeholders d'aper\u00E7u (texte gris\u00E9 tant que le champ est vide) */\n  var PH = { phone: '03 88 00 00 00', email: 'contact@votre-boutique.fr', site: 'www.votre-boutique.fr', name: 'Votre boutique' };\n  function orPh(key) { var v = (state[key] || '').trim(); return v ? { text: v, ph: false } : { text: PH[key] || '', ph: true }; }\n  function applyOpts(role) { Object.keys(role || {}).forEach(function (r) { if (roleIdx[r] !== undefined && roleValues(r).indexOf(role[r]) >= 0) state.opt[r] = role[r]; }); }\n\n  /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     MODULES PRODUIT\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n\n  /* \u2500\u2500 Outils de trame partag\u00E9s (logo, socle bois) : distance chamfer 3-4, suivi de contour, simplification, courbes \u2500\u2500 */\n  function chamfer(inside, w, h) {\n    var INF = 1 << 29, d = new Int32Array(w * h), x, y, p, v;\n    for (p = 0; p < w * h; p++) d[p] = inside[p] ? INF : 0;\n    for (y = 0; y < h; y++) for (x = 0; x < w; x++) {\n      p = y * w + x; if (!d[p]) continue; v = d[p];\n      if (x > 0 && d[p - 1] + 3 < v) v = d[p - 1] + 3;\n      if (y > 0) { if (d[p - w] + 3 < v) v = d[p - w] + 3; if (x > 0 && d[p - w - 1] + 4 < v) v = d[p - w - 1] + 4; if (x < w - 1 && d[p - w + 1] + 4 < v) v = d[p - w + 1] + 4; }\n      d[p] = v;\n    }\n    for (y = h - 1; y >= 0; y--) for (x = w - 1; x >= 0; x--) {\n      p = y * w + x; if (!d[p]) continue; v = d[p];\n      if (x < w - 1 && d[p + 1] + 3 < v) v = d[p + 1] + 3;\n      if (y < h - 1) { if (d[p + w] + 3 < v) v = d[p + w] + 3; if (x < w - 1 && d[p + w + 1] + 4 < v) v = d[p + w + 1] + 4; if (x > 0 && d[p + w - 1] + 4 < v) v = d[p + w - 1] + 4; }\n      d[p] = v;\n    }\n    return d;\n  }\n  /* \u2500\u2500 Trac\u00E9 vectoriel : contours du masque suivis le long des bords de pixels (logo \u00E0 droite), r\u00E9gions d\u00E9j\u00E0\n     trac\u00E9es invers\u00E9es (les trous ressortent comme contours, remplissage pair-impair), simplification de\n     Douglas-Peucker \u00E0 0,8 px, angles vrais d\u00E9tect\u00E9s (segments longs ou virages marqu\u00E9s), courbes de B\u00E9zier\n     cubiques par tangentes de Catmull-Rom entre deux angles. Sortie en unit\u00E9s du masque, mise \u00E0 l'\u00E9chelle en mm. */\n  function traceBits(bits, w, h) {\n    var bm = new Uint8Array(bits), paths = [], y, x, p;\n    function at(px, py) { return px >= 0 && py >= 0 && px < w && py < h ? bm[py * w + px] : 0; }\n    var DX = [1, 0, -1, 0], DY = [0, 1, 0, -1];\n    for (p = 0; p < w * h; p++) {\n      if (!bm[p]) continue;\n      var sx = p % w, sy = (p / w) | 0, cx = sx, cy = sy, k = 0, pts = [], guard = 4 * (w + h) * 8, cross = {};\n      // au sommet (cx,cy) allant dans la direction k : pixels devant \u00E0 droite / \u00E0 gauche du sens de marche\n      do {\n        var ar, al;\n        if (k === 0) { ar = at(cx, cy); al = at(cx, cy - 1); }\n        else if (k === 1) { ar = at(cx - 1, cy); al = at(cx, cy); }\n        else if (k === 2) { ar = at(cx - 1, cy - 1); al = at(cx - 1, cy); }\n        else { ar = at(cx, cy - 1); al = at(cx - 1, cy - 1); }\n        if (!ar) k = (k + 1) & 3; else if (al) k = (k + 3) & 3;\n        pts.push(cx, cy);\n        if (k === 1) { (cross[cy] = cross[cy] || []).push(cx); }\n        else if (k === 3) { (cross[cy - 1] = cross[cy - 1] || []).push(cx); }\n        cx += DX[k]; cy += DY[k];\n      } while ((cx !== sx || cy !== sy) && --guard > 0);\n      // inversion de la r\u00E9gion entour\u00E9e : entre chaque paire de croisements verticaux sur la ligne\n      for (var row in cross) {\n        var xs = cross[row].sort(function (a, b) { return a - b; }), ry = +row;\n        for (var i = 0; i + 1 < xs.length; i += 2) for (x = xs[i]; x < xs[i + 1]; x++) bm[ry * w + x] ^= 1;\n      }\n      paths.push(pts);\n    }\n    return paths;\n  }\n  function simplify(pts, eps) {\n    // polygone ferm\u00E9 : coup\u00E9 en deux au point le plus \u00E9loign\u00E9 du premier, Douglas-Peucker sur chaque moiti\u00E9\n    var n = pts.length / 2; if (n < 4) return pts;\n    var far = 0, best = -1, i;\n    for (i = 1; i < n; i++) { var dx = pts[2 * i] - pts[0], dy = pts[2 * i + 1] - pts[1], d = dx * dx + dy * dy; if (d > best) { best = d; far = i; } }\n    var keep = new Uint8Array(n); keep[0] = 1; keep[far] = 1;\n    var stack = [[0, far], [far, n]];\n    while (stack.length) {\n      var seg = stack.pop(), a = seg[0], b = seg[1], bx = b % n;\n      var ax = pts[2 * a], ay = pts[2 * a + 1], cx = pts[2 * bx], cy = pts[2 * bx + 1], vx = cx - ax, vy = cy - ay, len = Math.sqrt(vx * vx + vy * vy) || 1;\n      var maxD = -1, idx = -1;\n      for (i = a + 1; i < b; i++) { var px = pts[2 * i], py = pts[2 * i + 1], dd = Math.abs((px - ax) * vy - (py - ay) * vx) / len; if (dd > maxD) { maxD = dd; idx = i; } }\n      if (maxD > eps && idx > 0) { keep[idx] = 1; stack.push([a, idx], [idx, b]); }\n    }\n    var out = [];\n    for (i = 0; i < n; i++) if (keep[i]) out.push(pts[2 * i], pts[2 * i + 1]);\n    return out;\n  }\n  function curvePath(pts, eps, sx, sy, ox, oy, dec) {\n    var n = pts.length / 2; if (n < 2) return '';\n    function P(i) { i = ((i % n) + n) % n; return [pts[2 * i], pts[2 * i + 1]]; }\n    var fmt = function (v) { return (+v.toFixed(dec)).toString(); };\n    var X = function (v) { return fmt(ox + v * sx); }, Y = function (v) { return fmt(oy + v * sy); };\n    // angle vrai si le virage est marqu\u00E9 \u00E0 l'\u00E9chelle des segments voisins (bulge d'une courbe > 5 \u00D7 tol\u00E9rance)\n    var corner = new Uint8Array(n), i;\n    for (i = 0; i < n; i++) {\n      var a = P(i - 1), b = P(i), c = P(i + 1);\n      var ux = b[0] - a[0], uy = b[1] - a[1], vx = c[0] - b[0], vy = c[1] - b[1], lu = Math.hypot(ux, uy) || 1, lv = Math.hypot(vx, vy) || 1;\n      var cos = (ux * vx + uy * vy) / (lu * lv), theta = Math.acos(Math.max(-1, Math.min(1, cos)));\n      corner[i] = (Math.min(lu, lv) * Math.sin(theta / 2) > 5 * eps || theta > 1.2) ? 1 : 0;\n    }\n    var d = 'M' + X(pts[0]) + ' ' + Y(pts[1]);\n    for (i = 0; i < n; i++) {\n      var p0 = P(i - 1), p1 = P(i), p2 = P(i + 1), p3 = P(i + 2);\n      var l12 = Math.hypot(p2[0] - p1[0], p2[1] - p1[1]);\n      if (corner[i] && corner[(i + 1) % n]) { d += 'L' + X(p2[0]) + ' ' + Y(p2[1]); continue; }\n      var c1, c2;\n      if (corner[i]) c1 = [p1[0] + (p2[0] - p1[0]) / 3, p1[1] + (p2[1] - p1[1]) / 3];\n      else { var t1x = p2[0] - p0[0], t1y = p2[1] - p0[1], lt1 = Math.hypot(t1x, t1y) || 1, m1 = Math.min(l12, Math.hypot(p1[0] - p0[0], p1[1] - p0[1])) / 3; c1 = [p1[0] + t1x / lt1 * m1, p1[1] + t1y / lt1 * m1]; }\n      if (corner[(i + 1) % n]) c2 = [p2[0] - (p2[0] - p1[0]) / 3, p2[1] - (p2[1] - p1[1]) / 3];\n      else { var t2x = p3[0] - p1[0], t2y = p3[1] - p1[1], lt2 = Math.hypot(t2x, t2y) || 1, m2 = Math.min(l12, Math.hypot(p3[0] - p2[0], p3[1] - p2[1])) / 3; c2 = [p2[0] - t2x / lt2 * m2, p2[1] - t2y / lt2 * m2]; }\n      d += 'C' + X(c1[0]) + ' ' + Y(c1[1]) + ' ' + X(c2[0]) + ' ' + Y(c2[1]) + ' ' + X(p2[0]) + ' ' + Y(p2[1]);\n    }\n    return d + 'Z';\n  }\n  function polyArea(pts) { var a = 0, n = pts.length / 2; for (var i = 0; i < n; i++) { var j = (i + 1) % n; a += pts[2 * i] * pts[2 * j + 1] - pts[2 * j] * pts[2 * i + 1]; } return Math.abs(a) / 2; }\n\n  function edt2(inside, w, h) {\n    // distance euclidienne exacte au carr\u00E9 (Felzenszwalb-Huttenlocher, deux passes 1D) : pour chaque pixel \u00AB inside \u00BB,\n    // distance\u00B2 au plus proche pixel hors de la r\u00E9gion, 0 ailleurs. Isotrope, contrairement au chamfer 3-4.\n    var INF = 1e20, n = w * h, d = new Float32Array(n), len = Math.max(w, h), v = new Int32Array(len), z = new Float64Array(len + 1), g = new Float64Array(len), o = new Float64Array(len), x, y, p;\n    for (p = 0; p < n; p++) d[p] = inside[p] ? INF : 0;\n    function dt1(m) {\n      var k = 0, q, s; v[0] = 0; z[0] = -INF; z[1] = INF;\n      for (q = 1; q < m; q++) {\n        s = ((g[q] + q * q) - (g[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        while (s <= z[k]) { k--; s = ((g[q] + q * q) - (g[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); }\n        k++; v[k] = q; z[k] = s; z[k + 1] = INF;\n      }\n      k = 0;\n      for (q = 0; q < m; q++) { while (z[k + 1] < q) k++; o[q] = (q - v[k]) * (q - v[k]) + g[v[k]]; }\n    }\n    for (x = 0; x < w; x++) { for (y = 0; y < h; y++) g[y] = d[y * w + x]; dt1(h); for (y = 0; y < h; y++) d[y * w + x] = o[y]; }\n    for (y = 0; y < h; y++) { for (x = 0; x < w; x++) g[x] = d[y * w + x]; dt1(w); for (x = 0; x < w; x++) d[y * w + x] = o[x]; }\n    return d;\n  }\n\n  /* \u2500\u2500 Contours vectoriels exacts (partag\u00E9) : opentype.js + fichiers TTF du th\u00E8me charg\u00E9s \u00E0 la demande, Clipper pour\n     l'union des trac\u00E9s. `OT.onChange` est pos\u00E9 par le module actif pour se redessiner quand une police arrive. \u2500\u2500 */\n  var OT = { fonts: {}, failed: {}, loading: {}, scripts: {}, onChange: null };\n  OT.loadScript = function (url, globalName) {\n    if (window[globalName]) return Promise.resolve();\n    if (!OT.scripts[url]) OT.scripts[url] = new Promise(function (res, rej) { var sc = document.createElement('script'); sc.src = url; sc.onload = res; sc.onerror = rej; document.head.appendChild(sc); });\n    return OT.scripts[url];\n  };\n  OT.ensureClipper = function () { if (!cfg.clipperUrl) return Promise.resolve(); return OT.loadScript(cfg.clipperUrl, 'ClipperLib').catch(function (e) { if (window.console) console.warn('[Lenidesign] union des trac\u00E9s indisponible', e); }); };\n  OT.ensureFont = function (family) {\n    if (!family || OT.fonts[family] || OT.failed[family] || OT.loading[family]) return;\n    var url = cfg.fontFiles && cfg.fontFiles[family];\n    if (!url || !cfg.opentypeUrl || typeof Path2D === 'undefined') { OT.failed[family] = true; return; }\n    OT.loading[family] = true;\n    OT.loadScript(cfg.opentypeUrl, 'opentype')\n      .then(function () { return fetch(url).then(function (r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.arrayBuffer(); }); })\n      .then(function (buf) { OT.fonts[family] = window.opentype.parse(buf); })\n      .catch(function (e) { OT.failed[family] = true; if (window.console) console.warn('[Lenidesign] police vectorielle indisponible :', family, e); })\n      .then(function () { delete OT.loading[family]; if (OT.onChange) OT.onChange(); });\n  };\n  OT.font = function (family) { OT.ensureFont(family); return OT.fonts[family] || null; };\n  OT.pathData = function (font, txt, x, y, size, dec, track) { return font.getPath(txt, x, y, size, { kerning: true, letterSpacing: track || 0 }).toPathData(dec); }; // track : interlettrage en em\n  OT.united = function (font, txt, ox, oy, size) {\n    // contours exacts de la police, aplatis finement (\u2248 0,2 mm), fusionn\u00E9s par union bool\u00E9enne (Clipper, \u00B5m entiers),\n    // puis reliss\u00E9s en B\u00E9zier \u00E0 0,03 mm pr\u00E8s : un seul trac\u00E9 par lettre ou groupe de lettres li\u00E9es, sans chevauchement\n    var CL = window.ClipperLib; if (!CL) return null;\n    var p = font.getPath(txt, ox, oy, size, { kerning: true }), S = 1000, polys = [], cur = null, x0 = 0, y0 = 0;\n    function pt(x, y) { cur.push({ X: Math.round(x * S), Y: Math.round(y * S) }); }\n    function segs(ax, ay, bx, by, cx, cy) { var d = Math.hypot(bx - ax, by - ay) + Math.hypot(cx - bx, cy - by); return Math.max(6, Math.min(64, Math.ceil(d / 0.2))); }\n    p.commands.forEach(function (c) {\n      if (c.type === 'M') { if (cur && cur.length > 2) polys.push(cur); cur = []; pt(c.x, c.y); x0 = c.x; y0 = c.y; }\n      else if (c.type === 'L') { if (!cur) cur = []; pt(c.x, c.y); x0 = c.x; y0 = c.y; }\n      else if (c.type === 'Q') { if (!cur) cur = []; var n = segs(x0, y0, c.x1, c.y1, c.x, c.y); for (var i = 1; i <= n; i++) { var t = i / n, m = 1 - t; pt(m * m * x0 + 2 * m * t * c.x1 + t * t * c.x, m * m * y0 + 2 * m * t * c.y1 + t * t * c.y); } x0 = c.x; y0 = c.y; }\n      else if (c.type === 'C') { if (!cur) cur = []; var n2 = segs(x0, y0, c.x1, c.y1, c.x, c.y); for (var j = 1; j <= n2; j++) { var u = j / n2, v = 1 - u; pt(v * v * v * x0 + 3 * v * v * u * c.x1 + 3 * v * u * u * c.x2 + u * u * u * c.x, v * v * v * y0 + 3 * v * v * u * c.y1 + 3 * v * u * u * c.y2 + u * u * u * c.y); } x0 = c.x; y0 = c.y; }\n      else if (c.type === 'Z') { if (cur && cur.length > 2) polys.push(cur); cur = null; }\n    });\n    if (cur && cur.length > 2) polys.push(cur);\n    var cpr = new CL.Clipper(), sol = new CL.Paths();\n    cpr.AddPaths(polys, CL.PolyType.ptSubject, true);\n    if (!cpr.Execute(CL.ClipType.ctUnion, sol, CL.PolyFillType.pftNonZero, CL.PolyFillType.pftNonZero)) return null;\n    sol = CL.Clipper.CleanPolygons(sol, 2); // retire les micro-segments (< 2 \u00B5m)\n    var out = [];\n    sol.forEach(function (poly) {\n      if (poly.length < 3) return;\n      var pts = []; poly.forEach(function (q) { pts.push(q.X / S, q.Y / S); });\n      pts = simplify(pts, 0.03);\n      if (pts.length >= 6) out.push(curvePath(pts, 0.03, 1, 1, 0, 0, 3));\n    });\n    return out.join(' ');\n  };\n  OT.ready = function (families, ms) {\n    // attend (au plus ms) les polices vectorielles demand\u00E9es et Clipper : appel\u00E9 avant l'ajout au panier pour que le\n    // fichier de d\u00E9coupe parte en contours exacts quand la police est h\u00E9berg\u00E9e (sinon trac\u00E9 du rendu, voir VEC)\n    var fams = (families || []).filter(Boolean), t0 = Date.now(), limit = ms || 4000;\n    fams.forEach(OT.ensureFont);\n    var fonts = new Promise(function (res) { (function tick() { var pending = fams.some(function (f) { return OT.loading[f]; }); if (!pending || Date.now() - t0 > limit) return res(); setTimeout(tick, 100); })(); });\n    return Promise.all([OT.ensureClipper(), fonts]).catch(function () { /* noop */ });\n  };\n  function bakePath(d, s, tx, ty, dec) {\n    // applique translate(tx, ty) scale(s) aux coordonn\u00E9es du trac\u00E9 (M L H V C S Q T Z, absolus et relatifs) ; null si arcs\n    if (/[Aa]/.test(d)) return null;\n    var F = function (v) { return (+v.toFixed(dec)).toString(); }, out = '';\n    var re = /([MLHVCSQTZmlhvcsqtz])([^MLHVCSQTZmlhvcsqtz]*)/g, m;\n    while ((m = re.exec(d))) {\n      var c = m[1], nums = (m[2].match(/-?\\d*\\.?\\d+(?:e[-+]?\\d+)?/gi) || []).map(Number), abs = c === c.toUpperCase(), o = [], i;\n      if (c === 'Z' || c === 'z') { out += 'Z'; continue; }\n      if (c === 'H' || c === 'h') { for (i = 0; i < nums.length; i++) o.push(F(nums[i] * s + (abs ? tx : 0))); }\n      else if (c === 'V' || c === 'v') { for (i = 0; i < nums.length; i++) o.push(F(nums[i] * s + (abs ? ty : 0))); }\n      else { for (i = 0; i + 1 < nums.length; i += 2) { o.push(F(nums[i] * s + (abs ? tx : 0))); o.push(F(nums[i + 1] * s + (abs ? ty : 0))); } }\n      out += c + o.join(' ');\n    }\n    return out;\n  }\n\n  /* \u2500\u2500 Texte vectoriel partag\u00E9 (fichiers de d\u00E9coupe pr\u00E9nom, texte, horaires) : contours exacts de la police (opentype.js,\n     fusion Clipper) quand son TTF est h\u00E9berg\u00E9, sinon trac\u00E9 liss\u00E9 du rendu canvas du navigateur (m\u00EAme cha\u00EEne que le socle du\n     pr\u00E9nom 2 couleurs : suivi de contour, Douglas-Peucker, B\u00E9zier). Sortie en unit\u00E9s du SVG (mm), coordonn\u00E9es cuites. \u2500\u2500 */\n  var VEC = { cache: {} };\n  VEC.fontReady = function (family, weight) {\n    // police r\u00E9ellement disponible dans le navigateur ? (largeurs compar\u00E9es \u00E0 deux polices de secours, cf. duo)\n    if (SYSTEM_FONTS[family]) return true;\n    var t = 'Pr\u00E9nom Wxyz 0123', w = weight || 400;\n    mctx.font = w + ' 100px \"' + family + '\", monospace'; var a = mctx.measureText(t).width;\n    mctx.font = w + ' 100px monospace'; var b = mctx.measureText(t).width;\n    mctx.font = w + ' 100px \"' + family + '\", serif'; var c = mctx.measureText(t).width;\n    mctx.font = w + ' 100px serif'; var d = mctx.measureText(t).width;\n    return !(a === b && c === d);\n  };\n  VEC.raster = function (txt, family, weight) {\n    // trace le texte rendu par le navigateur : { polys (px du canevas), ox, oy (origine ligne de base), FS, eps, adv } ou null\n    var key = txt + '|' + family + '|' + (weight || 400);\n    if (VEC.cache[key]) return VEC.cache[key];\n    var FS = 1000, M = 8, spec, m, left, right, asc, desc, w, h, area;\n    for (var pass = 0; pass < 2; pass++) {\n      spec = (weight || 400) + ' ' + FS + 'px \"' + family + '\", sans-serif';\n      mctx.font = spec; m = mctx.measureText(txt);\n      left = Math.max(0, m.actualBoundingBoxLeft || 0); right = Math.max(m.actualBoundingBoxRight || m.width, 1);\n      asc = m.actualBoundingBoxAscent >= 0 ? m.actualBoundingBoxAscent : FS * 0.8; desc = m.actualBoundingBoxDescent >= 0 ? m.actualBoundingBoxDescent : FS * 0.25;\n      w = Math.ceil(left + right + 2 * M); h = Math.ceil(asc + desc + 2 * M); area = w * h;\n      if (area <= 3.5e6 || pass) break;\n      FS = Math.max(200, Math.floor(FS * Math.sqrt(3.5e6 / area))); // longs textes : canevas plafonn\u00E9, pr\u00E9cision \u2265 0,25 mm \u00E0 120 cm\n    }\n    if (!(w > 0 && h > 0) || area > 6e6) return null;\n    var out = null;\n    try {\n      var c = document.createElement('canvas'); c.width = w; c.height = h;\n      var ctx = c.getContext('2d'); ctx.font = spec; ctx.textBaseline = 'alphabetic'; ctx.fillStyle = '#000';\n      var ox = M + left, oy = M + asc;\n      ctx.fillText(txt, ox, oy);\n      var data = ctx.getImageData(0, 0, w, h).data, n = w * h, bits = new Uint8Array(n), p;\n      for (p = 0; p < n; p++) bits[p] = data[p * 4 + 3] > 127 ? 1 : 0;\n      var eps = 1.2;\n      var polys = traceBits(bits, w, h).filter(function (pts) { return polyArea(pts) >= 3; }).map(function (pts) { return simplify(pts, eps); }).filter(function (pts) { return pts.length >= 6; });\n      out = { polys: polys, ox: ox, oy: oy, FS: FS, eps: eps, adv: Math.max(m.width, 1), loaded: VEC.fontReady(family, weight) };\n    } catch (e) { out = null; }\n    if (out && out.loaded) VEC.cache[key] = out; // jamais de cache sur un rendu en police de secours\n    return out;\n  };\n  VEC.metrics = function (txt, family, weight, size, key) {\n    // chasse et bo\u00EEte d'encre du texte ancr\u00E9 en (0, 0), en unit\u00E9s de sortie : { adv, x1, y1, x2, y2, exact }\n    // key : cl\u00E9 de cfg.fontFiles quand elle diff\u00E8re de la famille CSS (graisse h\u00E9berg\u00E9e \u00E0 part, ex. \u00AB Montserrat 500 \u00BB)\n    var font = OT.font(key || family);\n    if (font) {\n      var b = font.getPath(txt, 0, 0, size, { kerning: true }).getBoundingBox();\n      return { adv: font.getAdvanceWidth(txt, size, { kerning: true }), x1: b.x1, y1: b.y1, x2: b.x2, y2: b.y2, exact: true };\n    }\n    var r = VEC.raster(txt, family, weight); if (!r) return null;\n    var s = size / r.FS, x1 = Infinity, y1 = Infinity, x2 = -Infinity, y2 = -Infinity;\n    r.polys.forEach(function (pts) { for (var i = 0; i < pts.length; i += 2) { if (pts[i] < x1) x1 = pts[i]; if (pts[i] > x2) x2 = pts[i]; if (pts[i + 1] < y1) y1 = pts[i + 1]; if (pts[i + 1] > y2) y2 = pts[i + 1]; } });\n    if (x1 === Infinity) return null;\n    return { adv: r.adv * s, x1: (x1 - r.ox) * s, y1: (y1 - r.oy) * s, x2: (x2 - r.ox) * s, y2: (y2 - r.oy) * s, exact: false, loaded: r.loaded };\n  };\n  VEC.text = function (o) {\n    // o: { text, family, weight, x, y (ligne de base), size, anchor start|middle|end, key (cfg.fontFiles) } \u2192 { d, rule, exact, loaded } ou null\n    if (!o.text) return null;\n    var font = OT.font(o.key || o.family), anchor = o.anchor || 'start';\n    if (font) {\n      var adv = font.getAdvanceWidth(o.text, o.size, { kerning: true }), x0 = anchor === 'middle' ? o.x - adv / 2 : (anchor === 'end' ? o.x - adv : o.x);\n      var d = OT.united(font, o.text, x0, o.y, o.size), rule = 'evenodd';\n      if (!d) { d = OT.pathData(font, o.text, x0, o.y, o.size, 3); rule = 'nonzero'; }\n      return d ? { d: d, rule: rule, exact: true, loaded: true } : null;\n    }\n    var r = VEC.raster(o.text, o.family, o.weight); if (!r || !r.polys.length) return null;\n    var s = o.size / r.FS, advR = r.adv * s, xs = anchor === 'middle' ? o.x - advR / 2 : (anchor === 'end' ? o.x - advR : o.x);\n    var parts = r.polys.map(function (pts) { return curvePath(pts, r.eps, s, s, xs - r.ox * s, o.y - r.oy * s, 3); });\n    return { d: parts.join(' '), rule: 'evenodd', exact: false, loaded: r.loaded };\n  };\n  VEC.hex = function (v) { if (isHolo(v)) return '#B5B5B5'; return hexFor(v, '#1A1A1A'); };\n  VEC.F = function (v) { return (Math.round(v * 100) / 100).toString(); };\n  VEC.slug = function (t, fb) { return String(t || '').normalize('NFD').replace(/[\u0300-\u036F]/g, '').replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '').toLowerCase() || (fb || 'sticker'); };\n  VEC.wrap = function (body, Wmm) { return state.extras && state.extras.mirror ? '<g id=\"miroir\" transform=\"translate(' + VEC.F(Wmm) + ' 0) scale(-1 1)\">' + body + '</g>' : body; };\n  VEC.svg = function (Wmm, Hmm, body, meta) {\n    // meta: { title, fonts: [famille\u2026], exact: bool, loaded: bool }\n    var notes = ['Lenidesign \u00B7 ' + ((meta && meta.label) || 'fichier de d\u00E9coupe') + ' \u00B7 ' + VEC.F(Wmm) + ' \u00D7 ' + VEC.F(Hmm) + ' mm'];\n    var hasFonts = !!(meta && meta.fonts && meta.fonts.length);\n    if (hasFonts) notes.push('police' + (meta.fonts.length > 1 ? 's' : '') + ' : ' + meta.fonts.join(', '));\n    if (hasFonts) notes.push(meta.exact ? 'contours exacts de la police' : 'trac\u00E9 du rendu \u00E0 l\u2019\u00E9cran (police non h\u00E9berg\u00E9e en TTF)');\n    if (hasFonts && meta.loaded === false) notes.push('ATTENTION : police non charg\u00E9e dans le navigateur du client, rendu en police de secours \u2014 \u00E0 v\u00E9rifier');\n    if (meta && meta.note) notes.push(meta.note);\n    if (state.extras && state.extras.mirror) notes.push('d\u00E9coupe en miroir (pose int\u00E9rieure)');\n    return '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + VEC.F(Wmm) + ' ' + VEC.F(Hmm) + '\" width=\"' + VEC.F(Wmm) + 'mm\" height=\"' + VEC.F(Hmm) + 'mm\">' +\n      '<title>' + esc((meta && meta.title) || 'Sticker') + '</title><desc>' + esc(notes.join(' \u00B7 ')) + '</desc>' + body + '</svg>';\n  };\n  VEC.file = function (svg, name) { return svg ? [{ prop: '_Fichier de d\u00E9coupe', blob: new Blob([svg], { type: 'image/svg+xml' }), name: name }] : []; }; // \u00AB _ \u00BB : masqu\u00E9 c\u00F4t\u00E9 client, visible dans l'admin\n\n  /* \u2500\u2500 QR : encodeur int\u00E9gr\u00E9 au th\u00E8me (ISO/IEC 18004) : versions 1 \u00E0 15, modes num\u00E9rique / alphanum\u00E9rique / octets UTF-8,\n     correction L M Q H, 8 masques \u00E9valu\u00E9s. Aucun service externe : le code ne contient que la saisie du client.\n     QR.encode(text, { level, minVersion, maxVersion }) \u2192 { version, size, level, mask, mode, bits: Uint8Array(size\u00B2) } ou null\n     QR.loops(bits, size) \u2192 contours fusionn\u00E9s des modules sombres, en unit\u00E9s module (ext\u00E9rieurs horaires, trous en sens\n     inverse : remplissage pair-impair), pour l'aper\u00E7u et le fichier de d\u00E9coupe \u2500\u2500 */\n  var QR = (function () {\n    // par version : [codewords totaux, { niveau: [codewords de correction par bloc, [[nombre de blocs, codewords de donn\u00E9es par bloc]\u2026]] }]\n    var TABLE = [null,\n      [26, { L: [7, [[1, 19]]], M: [10, [[1, 16]]], Q: [13, [[1, 13]]], H: [17, [[1, 9]]] }],\n      [44, { L: [10, [[1, 34]]], M: [16, [[1, 28]]], Q: [22, [[1, 22]]], H: [28, [[1, 16]]] }],\n      [70, { L: [15, [[1, 55]]], M: [26, [[1, 44]]], Q: [18, [[2, 17]]], H: [22, [[2, 13]]] }],\n      [100, { L: [20, [[1, 80]]], M: [18, [[2, 32]]], Q: [26, [[2, 24]]], H: [16, [[4, 9]]] }],\n      [134, { L: [26, [[1, 108]]], M: [24, [[2, 43]]], Q: [18, [[2, 15], [2, 16]]], H: [22, [[2, 11], [2, 12]]] }],\n      [172, { L: [18, [[2, 68]]], M: [16, [[4, 27]]], Q: [24, [[4, 19]]], H: [28, [[4, 15]]] }],\n      [196, { L: [20, [[2, 78]]], M: [18, [[4, 31]]], Q: [18, [[2, 14], [4, 15]]], H: [26, [[4, 13], [1, 14]]] }],\n      [242, { L: [24, [[2, 97]]], M: [22, [[2, 38], [2, 39]]], Q: [22, [[4, 18], [2, 19]]], H: [26, [[4, 14], [2, 15]]] }],\n      [292, { L: [30, [[2, 116]]], M: [22, [[3, 36], [2, 37]]], Q: [20, [[4, 16], [4, 17]]], H: [24, [[4, 12], [4, 13]]] }],\n      [346, { L: [18, [[2, 68], [2, 69]]], M: [26, [[4, 43], [1, 44]]], Q: [24, [[6, 19], [2, 20]]], H: [28, [[6, 15], [2, 16]]] }],\n      [404, { L: [20, [[4, 81]]], M: [30, [[1, 50], [4, 51]]], Q: [28, [[4, 22], [4, 23]]], H: [24, [[3, 12], [8, 13]]] }],\n      [466, { L: [24, [[2, 92], [2, 93]]], M: [22, [[6, 36], [2, 37]]], Q: [26, [[4, 20], [6, 21]]], H: [28, [[7, 14], [4, 15]]] }],\n      [532, { L: [26, [[4, 107]]], M: [22, [[8, 37], [1, 38]]], Q: [24, [[8, 20], [4, 21]]], H: [22, [[12, 11], [4, 12]]] }],\n      [581, { L: [30, [[3, 115], [1, 116]]], M: [24, [[4, 40], [5, 41]]], Q: [20, [[11, 16], [5, 17]]], H: [24, [[11, 12], [5, 13]]] }],\n      [655, { L: [22, [[5, 87], [1, 88]]], M: [24, [[5, 41], [5, 42]]], Q: [30, [[5, 24], [7, 25]]], H: [24, [[11, 12], [7, 13]]] }]\n    ];\n    var ALIGN = [null, [], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70]];\n    var FMT = { L: 1, M: 0, Q: 3, H: 2 };\n    var ALNUM = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';\n    /* GF(256), polyn\u00F4me 0x11D ; g\u00E9n\u00E9rateurs de Reed-Solomon */\n    var EXP = [], LOG = [];\n    (function () { var x = 1, i; for (i = 0; i < 255; i++) { EXP[i] = x; LOG[x] = i; x <<= 1; if (x & 256) x ^= 0x11D; } for (i = 255; i < 512; i++) EXP[i] = EXP[i - 255]; })();\n    function gmul(a, b) { return a && b ? EXP[LOG[a] + LOG[b]] : 0; }\n    function rsPoly(n) { var g = [1], i, j; for (i = 0; i < n; i++) { var ng = []; for (j = 0; j <= g.length; j++) ng.push(0); for (j = 0; j < g.length; j++) { ng[j] ^= g[j]; ng[j + 1] ^= gmul(g[j], EXP[i]); } g = ng; } return g; }\n    function rsEc(data, n) { var g = rsPoly(n), res = [], i, j; for (i = 0; i < n; i++) res.push(0); for (i = 0; i < data.length; i++) { var f = data[i] ^ res.shift(); res.push(0); if (f) for (j = 0; j < n; j++) res[j] ^= gmul(g[j + 1], f); } return res; }\n    function utf8(s) {\n      var out = [], i, c;\n      for (i = 0; i < s.length; i++) {\n        c = s.charCodeAt(i);\n        if (c >= 0xD800 && c < 0xDC00 && i + 1 < s.length) c = 0x10000 + ((c - 0xD800) << 10) + (s.charCodeAt(++i) - 0xDC00);\n        if (c < 128) out.push(c); else if (c < 2048) out.push(192 | (c >> 6), 128 | (c & 63));\n        else if (c < 65536) out.push(224 | (c >> 12), 128 | ((c >> 6) & 63), 128 | (c & 63));\n        else out.push(240 | (c >> 18), 128 | ((c >> 12) & 63), 128 | ((c >> 6) & 63), 128 | (c & 63));\n      }\n      return out;\n    }\n    function modeFor(s) { if (/^[0-9]+$/.test(s)) return 'num'; for (var i = 0; i < s.length; i++) if (ALNUM.indexOf(s.charAt(i)) < 0) return 'byte'; return 'alnum'; }\n    function ccBits(mode, v) { var r = v <= 9 ? 0 : (v <= 26 ? 1 : 2); return mode === 'num' ? [10, 12, 14][r] : (mode === 'alnum' ? [9, 11, 13][r] : [8, 16, 16][r]); }\n    function dataBits(mode, s, bytes) {\n      if (mode === 'num') return 10 * Math.floor(s.length / 3) + [0, 4, 7][s.length % 3];\n      if (mode === 'alnum') return 11 * Math.floor(s.length / 2) + 6 * (s.length % 2);\n      return 8 * bytes.length;\n    }\n    function dataCw(v, lvl) { var n = 0; TABLE[v][1][lvl][1].forEach(function (g) { n += g[0] * g[1]; }); return n; }\n    function segment(mode, s, bytes, v) {\n      var bits = [], i;\n      function put(val, len) { for (var k = len - 1; k >= 0; k--) bits.push((val >>> k) & 1); }\n      put(mode === 'num' ? 1 : (mode === 'alnum' ? 2 : 4), 4);\n      put(mode === 'byte' ? bytes.length : s.length, ccBits(mode, v));\n      if (mode === 'num') { for (i = 0; i < s.length; i += 3) { var ch = s.substr(i, 3); put(parseInt(ch, 10), ch.length === 3 ? 10 : (ch.length === 2 ? 7 : 4)); } }\n      else if (mode === 'alnum') { for (i = 0; i + 1 < s.length; i += 2) put(ALNUM.indexOf(s.charAt(i)) * 45 + ALNUM.indexOf(s.charAt(i + 1)), 11); if (i < s.length) put(ALNUM.indexOf(s.charAt(i)), 6); }\n      else for (i = 0; i < bytes.length; i++) put(bytes[i], 8);\n      return bits;\n    }\n    function penalty(mat, size) {\n      var score = 0, x, y, run, prev, dark = 0, c;\n      function at(x, y) { return mat[y * size + x]; }\n      for (y = 0; y < size; y++) { run = 0; prev = -1; for (x = 0; x < size; x++) { c = at(x, y); dark += c; if (c === prev) { run++; if (run === 5) score += 3; else if (run > 5) score++; } else { prev = c; run = 1; } } }\n      for (x = 0; x < size; x++) { run = 0; prev = -1; for (y = 0; y < size; y++) { c = at(x, y); if (c === prev) { run++; if (run === 5) score += 3; else if (run > 5) score++; } else { prev = c; run = 1; } } }\n      for (y = 0; y + 1 < size; y++) for (x = 0; x + 1 < size; x++) { c = at(x, y); if (c === at(x + 1, y) && c === at(x, y + 1) && c === at(x + 1, y + 1)) score += 3; }\n      var P = [1, 0, 1, 1, 1, 0, 1];\n      function finderLike(get) {\n        var i, k, ok, before, after;\n        for (i = 0; i + 6 < size; i++) {\n          ok = true; for (k = 0; k < 7; k++) if (get(i + k) !== P[k]) { ok = false; break; }\n          if (!ok) continue;\n          before = true; after = true;\n          for (k = 1; k <= 4; k++) { if (i - k >= 0 && get(i - k) !== 0) before = false; if (i + 6 + k < size && get(i + 6 + k) !== 0) after = false; }\n          if (before || after) score += 40;\n        }\n      }\n      for (y = 0; y < size; y++) (function (yy) { finderLike(function (i) { return at(i, yy); }); })(y);\n      for (x = 0; x < size; x++) (function (xx) { finderLike(function (i) { return at(xx, i); }); })(x);\n      var total = size * size, k4 = Math.floor((Math.abs(dark * 20 - total * 10) + total - 1) / total) - 1;\n      return score + Math.max(0, k4) * 10;\n    }\n    function place(cw, v, lvl, mode) {\n      var size = 17 + 4 * v, mat = new Uint8Array(size * size), fn = new Uint8Array(size * size), i, j, x, y;\n      function set(x, y, d) { mat[y * size + x] = d ? 1 : 0; fn[y * size + x] = 1; }\n      function finder(cx, cy) { for (var dy = -4; dy <= 4; dy++) for (var dx = -4; dx <= 4; dx++) { var xx = cx + dx, yy = cy + dy; if (xx >= 0 && yy >= 0 && xx < size && yy < size) { var d = Math.max(Math.abs(dx), Math.abs(dy)); set(xx, yy, d !== 2 && d !== 4); } } }\n      function align(cx, cy) { for (var dy = -2; dy <= 2; dy++) for (var dx = -2; dx <= 2; dx++) set(cx + dx, cy + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1); }\n      for (i = 0; i < size; i++) { set(6, i, i % 2 === 0); set(i, 6, i % 2 === 0); }\n      finder(3, 3); finder(size - 4, 3); finder(3, size - 4);\n      var al = ALIGN[v], n = al.length;\n      for (i = 0; i < n; i++) for (j = 0; j < n; j++) { if ((i === 0 && j === 0) || (i === 0 && j === n - 1) || (i === n - 1 && j === 0)) continue; align(al[i], al[j]); }\n      function format(mask) {\n        var data = (FMT[lvl] << 3) | mask, rem = data, b;\n        for (b = 0; b < 10; b++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n        var bits = ((data << 10) | rem) ^ 0x5412;\n        function bit(k) { return (bits >>> k) & 1; }\n        for (b = 0; b <= 5; b++) set(8, b, bit(b));\n        set(8, 7, bit(6)); set(8, 8, bit(7)); set(7, 8, bit(8));\n        for (b = 9; b < 15; b++) set(14 - b, 8, bit(b));\n        for (b = 0; b < 8; b++) set(size - 1 - b, 8, bit(b));\n        for (b = 8; b < 15; b++) set(8, size - 15 + b, bit(b));\n        set(8, size - 8, 1);\n      }\n      format(0);\n      if (v >= 7) {\n        var vr = v, b2; for (b2 = 0; b2 < 12; b2++) vr = (vr << 1) ^ ((vr >>> 11) * 0x1F25);\n        var vb = (v << 12) | vr;\n        for (i = 0; i < 18; i++) { var bt = (vb >>> i) & 1, a = size - 11 + i % 3, c = Math.floor(i / 3); set(a, c, bt); set(c, a, bt); }\n      }\n      var bi = 0, total = cw.length * 8;\n      for (var right = size - 1; right >= 1; right -= 2) {\n        if (right === 6) right = 5;\n        for (var vert = 0; vert < size; vert++) for (j = 0; j < 2; j++) {\n          x = right - j; y = ((right + 1) & 2) === 0 ? size - 1 - vert : vert;\n          if (!fn[y * size + x] && bi < total) { mat[y * size + x] = (cw[bi >>> 3] >>> (7 - (bi & 7))) & 1; bi++; }\n        }\n      }\n      var MASKS = [\n        function (x, y) { return (x + y) % 2 === 0; }, function (x, y) { return y % 2 === 0; }, function (x, y) { return x % 3 === 0; }, function (x, y) { return (x + y) % 3 === 0; },\n        function (x, y) { return (Math.floor(y / 2) + Math.floor(x / 3)) % 2 === 0; }, function (x, y) { return (x * y) % 2 + (x * y) % 3 === 0; },\n        function (x, y) { return ((x * y) % 2 + (x * y) % 3) % 2 === 0; }, function (x, y) { return ((x + y) % 2 + (x * y) % 3) % 2 === 0; }\n      ];\n      function applyMask(m) { for (y = 0; y < size; y++) for (x = 0; x < size; x++) if (!fn[y * size + x] && MASKS[m](x, y)) mat[y * size + x] ^= 1; }\n      var best = 0, bestScore = Infinity, m, sc;\n      for (m = 0; m < 8; m++) { applyMask(m); format(m); sc = penalty(mat, size); if (sc < bestScore) { bestScore = sc; best = m; } applyMask(m); }\n      applyMask(best); format(best);\n      return { version: v, size: size, level: lvl, mask: best, mode: mode, bits: mat };\n    }\n    function encode(text, o) {\n      o = o || {};\n      var s = String(text || ''), lvl = FMT[o.level] !== undefined ? o.level : 'M', mode = modeFor(s), bytes = mode === 'byte' ? utf8(s) : null;\n      var vmax = Math.min(o.maxVersion || 15, TABLE.length - 1), v;\n      if (!s) return null;\n      for (v = Math.max(1, o.minVersion || 1); v <= vmax; v++) if (4 + ccBits(mode, v) + dataBits(mode, s, bytes) <= dataCw(v, lvl) * 8) break;\n      if (v > vmax) return null;\n      var cap = dataCw(v, lvl) * 8, bits = segment(mode, s, bytes, v), i, j, k;\n      for (i = 0; i < 4 && bits.length < cap; i++) bits.push(0);\n      while (bits.length % 8) bits.push(0);\n      var cw = [];\n      for (i = 0; i < bits.length; i += 8) { k = 0; for (j = 0; j < 8; j++) k = (k << 1) | bits[i + j]; cw.push(k); }\n      for (i = 0; cw.length < cap / 8; i++) cw.push(i & 1 ? 0x11 : 0xEC);\n      var t = TABLE[v][1][lvl], ecn = t[0], blocks = [], ecs = [], pos = 0, maxD = 0, all = [];\n      t[1].forEach(function (g) { for (var b = 0; b < g[0]; b++) { var d = cw.slice(pos, pos + g[1]); pos += g[1]; blocks.push(d); ecs.push(rsEc(d, ecn)); if (d.length > maxD) maxD = d.length; } });\n      for (i = 0; i < maxD; i++) blocks.forEach(function (b) { if (i < b.length) all.push(b[i]); });\n      for (i = 0; i < ecn; i++) ecs.forEach(function (e) { all.push(e[i]); });\n      return place(all, v, lvl, mode);\n    }\n    function loops(bits, size) {\n      // ar\u00EAtes orient\u00E9es (sens horaire autour de chaque module sombre, y vers le bas) : les ar\u00EAtes partag\u00E9es par deux modules\n      // s'annulent, le reste forme les contours ; aux sommets ambigus (damier) on tourne \u00E0 droite pour rester sur la m\u00EAme pi\u00E8ce\n      var edges = {}, x, y;\n      function key(a, b, c, d) { return a + ',' + b + ',' + c + ',' + d; }\n      function add(a, b, c, d) { var rk = key(c, d, a, b); if (edges[rk]) delete edges[rk]; else edges[key(a, b, c, d)] = [a, b, c, d]; }\n      for (y = 0; y < size; y++) for (x = 0; x < size; x++) if (bits[y * size + x]) { add(x, y, x + 1, y); add(x + 1, y, x + 1, y + 1); add(x + 1, y + 1, x, y + 1); add(x, y + 1, x, y); }\n      var out = {};\n      Object.keys(edges).forEach(function (k) { var e = edges[k], sk = e[0] + ',' + e[1]; (out[sk] = out[sk] || []).push(e); });\n      function take(sk, pdx, pdy) {\n        var list = out[sk]; if (!list || !list.length) return null;\n        var best = null, bestRank = 9;\n        list.forEach(function (e) { var dx = e[2] - e[0], dy = e[3] - e[1], rank = pdx === undefined ? 0 : ((dx === -pdy && dy === pdx) ? 0 : ((dx === pdx && dy === pdy) ? 1 : 2)); if (rank < bestRank) { bestRank = rank; best = e; } });\n        list.splice(list.indexOf(best), 1);\n        return best;\n      }\n      var starts = Object.keys(out).sort(function (a, b) { return out[a].length - out[b].length; }), result = [];\n      starts.forEach(function (sk) {\n        while (out[sk] && out[sk].length) {\n          var e = take(sk), pts = [[e[0], e[1]]], cur = e, guard = 200000, nk, nx;\n          while (guard-- > 0) { nk = cur[2] + ',' + cur[3]; if (nk === sk) break; pts.push([cur[2], cur[3]]); nx = take(nk, cur[2] - cur[0], cur[3] - cur[1]); if (!nx) break; cur = nx; }\n          var clean = [], i, a, b, c;\n          for (i = 0; i < pts.length; i++) { a = pts[(i + pts.length - 1) % pts.length]; b = pts[i]; c = pts[(i + 1) % pts.length]; if ((b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0]) !== 0) clean.push(b); }\n          if (clean.length >= 4) result.push(clean);\n        }\n      });\n      return result;\n    }\n    function path(loops, s, ox, oy, dec) {\n      // trac\u00E9 SVG des boucles (M L Z), mis \u00E0 l'\u00E9chelle s et d\u00E9cal\u00E9 de (ox, oy)\n      var F = function (v) { return (+v.toFixed(dec === undefined ? 2 : dec)).toString(); };\n      return loops.map(function (pts) { return pts.map(function (p, i) { return (i ? 'L' : 'M') + F(ox + p[0] * s) + ' ' + F(oy + p[1] * s); }).join('') + 'Z'; }).join('');\n    }\n    function expanded(bits, size) {\n      // fichier de d\u00E9coupe : modules dilat\u00E9s de \u03B4 par c\u00F4t\u00E9 (voisins en recouvrement, voisins en diagonale reli\u00E9s par un pont de\n      // 2\u03B4 \u00D7 2\u03B4) et union exacte, calcul\u00E9e sur une grille fine (2n + 1)\u00B2 o\u00F9 chaque module couvre 3 \u00D7 3 cellules (bord, c\u0153ur, bord) ;\n      // pathFine replace les fronti\u00E8res en mm : fronti\u00E8re 2k \u21A6 k\u00B7m \u2212 \u03B4, fronti\u00E8re 2k + 1 \u21A6 k\u00B7m + \u03B4\n      var n = size, f = 2 * n + 1, fine = new Uint8Array(f * f), x, y, dx, dy;\n      for (y = 0; y < n; y++) for (x = 0; x < n; x++) if (bits[y * n + x]) for (dy = 0; dy < 3; dy++) for (dx = 0; dx < 3; dx++) fine[(2 * y + dy) * f + 2 * x + dx] = 1;\n      return loops(fine, f);\n    }\n    function pathFine(loops, m, delta, ox, oy, dec) {\n      var F = function (v) { return (+v.toFixed(dec === undefined ? 3 : dec)).toString(); };\n      function P(b) { return Math.floor(b / 2) * m + (b % 2 === 0 ? -delta : delta); }\n      return loops.map(function (pts) { return pts.map(function (p, i) { return (i ? 'L' : 'M') + F(ox + P(p[0])) + ' ' + F(oy + P(p[1])); }).join('') + 'Z'; }).join('');\n    }\n    return { encode: encode, loops: loops, path: path, expanded: expanded, pathFine: pathFine, capacity: dataCw, maxVersion: TABLE.length - 1 };\n  })();\n\n  var KINDS = {};\n\n  /* \u2500\u2500 TEXTE : sticker texte 1 \u00E0 4 lignes, police par ligne, hi\u00E9rarchie \u2500\u2500 */\n  KINDS.texte = (function () {\n    var LINES = 4, MAXC = (cfg.texte && cfg.texte.maxChars) || 30;\n    var SAMPLE = (cfg.texte && cfg.texte.sample && cfg.texte.sample.length) ? cfg.texte.sample : ['MON ENTREPRISE', 'Mon activit\u00E9', 'T\u00E9l. 06 00 00 00 00', 'www.monsiteweb.com'];\n    var RATIO_H = [1, 0.62, 0.45, 0.45], RATIO_F = [1, 1, 1, 1];\n    /* d\u00E9mo avant saisie : enseignes fictives (jamais de vrai client), police et couleur qui tournent */\n    var DEMO_SETS = [['BOULANGERIE MARTIN', 'Artisan depuis 1987', '03 88 00 00 00'], ['CABINET DUPONT', 'Kin\u00E9sith\u00E9rapeute', 'Sur rendez-vous'], ['LE PETIT CAF\u00C9', 'Ouvert 7j/7', 'www.lepetitcafe.fr'], ['GARAGE DU PONT', 'M\u00E9canique \u00B7 Carrosserie', '06 00 00 00 00'], ['STUDIO PHOTO', 'Portraits \u00B7 Mariages', 'Sur rendez-vous'], ['SALON DE COIFFURE', 'Avec ou sans rendez-vous', '03 88 00 00 00']];\n    var DEMO_COLORS = ['Noir', 'Blanc', 'Or m\u00E9tallis\u00E9', 'Argent m\u00E9tallis\u00E9'];\n    var demo = makeDemo({ list: DEMO_SETS.map(function (s) { return s.join('\\n'); }), idle: function () { return !entries().length; }, set: function (n) {\n      var fonts = (cfg.fonts || []).slice(0, 6), cols = DEMO_COLORS.filter(function (c) { return roleValues('color').indexOf(c) >= 0; });\n      demo.font = fonts.length ? fonts[n % fonts.length] : state.font; demo.color = cols.length ? cols[n % cols.length] : state.opt.color;\n      loadFonts([{ family: demo.font, weight: fontWeightFor(demo.font) }]);\n    } });\n    function colorNow() { return demo.active() && demo.color ? demo.color : state.opt.color; }\n    var mod = {\n      steps: ['text', 'size', 'color', 'font'].filter(function (k) { return k !== 'size' || hasRole('size'); }), // la saisie d'abord, ouverte \u00E0 l'arriv\u00E9e\n      labels: { size: (cfg.labels && cfg.labels.size) || 'Largeur', text: 'Votre texte', color: roleLabel('color'), font: 'Police' },\n      mainStep: 'text',\n      inlineFirst: true, // le texte est l'\u00E9tape 1, ouverte (aussi sur mobile)\n      render: {},\n      init: function () {\n        if (!state.font) state.font = 'Source Sans 3';\n        state.lines = ['', '', '', '']; state.fonts = [state.font, state.font, state.font, state.font];\n        state.hier = true; state.fontTarget = 'all';\n        OT.ensureFont(state.font); OT.ensureClipper(); // contours exacts du fichier de d\u00E9coupe (si la police est h\u00E9berg\u00E9e)\n        setTimeout(demo.start, 400);\n      }\n    };\n    function ratios() { return state.hier ? RATIO_H : RATIO_F; }\n    function fontAt(i) { return state.fonts[i] || state.font || 'Source Sans 3'; }\n    function entries(src) {\n      var out = [], r = ratios();\n      var dm = !!src && demo.active() && !!demo.font; // lignes de d\u00E9mo : police de la d\u00E9mo\n      (src || state.lines).forEach(function (l, i) { var t = String(l || '').trim(), fam = dm ? demo.font : fontAt(i); if (t) out.push({ i: i, text: t, fam: fam, wt: fontWeightFor(fam), ratio: r[i] }); });\n      return out;\n    }\n    /* Option \u00AB Lignes \u00BB (tarif par nombre de lignes) : valeur d\u00E9duite des lignes remplies, jamais choisie \u00E0 la main */\n    function linesValue(n) {\n      var vals = roleValues('lines'); if (!vals.length) return '';\n      var hit = vals.filter(function (v) { var m = /^(\\d+)\\s*(?:\u00E0|-|\u2013)\\s*(\\d+)/.exec(v); return m && n >= +m[1] && n <= +m[2]; })[0]\n        || vals.filter(function (v) { var m = /^(\\d+)/.exec(v); return m && +m[1] === n; })[0];\n      return hit || vals[vals.length - 1];\n    }\n    function syncLines() { if (!hasRole('lines')) return; var want = linesValue(Math.max(1, entries().length)); if (want && state.opt.lines !== want) state.opt.lines = want; }\n    function widthCm() { var m = optionMeta(state.opt.size); if (m.w) return m.w; return parseCm(state.opt.size) || 30; }\n    function glyphBox(txt, family, weight, size) {\n      // w = largeur d'encre (la largeur command\u00E9e est celle du lettrage, comme le fichier de d\u00E9coupe), chasse en secours\n      mctx.font = (weight || 400) + ' ' + size + 'px \"' + family + '\", sans-serif';\n      var m = mctx.measureText(txt);\n      var asc = m.actualBoundingBoxAscent, desc = m.actualBoundingBoxDescent;\n      if (!(asc >= 0)) asc = size * 0.72; if (!(desc >= 0)) desc = size * 0.22;\n      var ink = (m.actualBoundingBoxLeft >= 0 && m.actualBoundingBoxRight > 0) ? m.actualBoundingBoxLeft + m.actualBoundingBoxRight : m.width;\n      return { w: ink || m.width, asc: asc, desc: desc };\n    }\n    function block(src) {\n      var es = entries(src); if (!es.length) return null;\n      var S = 100, lh = 1.14, bw = 0, bh = 0, y = 0;\n      es.forEach(function (e, i) {\n        e.size = S * e.ratio; var g = glyphBox(e.text, e.fam, e.wt, e.size);\n        e.w = g.w; e.asc = g.asc; e.desc = g.desc; bw = Math.max(bw, e.w);\n        e.baseline = y + e.size * 0.86; y += e.size * lh;\n        bh += e.size * lh;\n      });\n      // hauteur r\u00E9elle du lettrage : du sommet des lettres de la 1re ligne au bas des lettres de la derni\u00E8re\n      var top = es[0].baseline - es[0].asc, bottom = es[es.length - 1].baseline + es[es.length - 1].desc;\n      es.forEach(function (e) { top = Math.min(top, e.baseline - e.asc); bottom = Math.max(bottom, e.baseline + e.desc); });\n      return { es: es, bw: bw, bh: bh, lh: lh, top: top, real: bottom - top };\n    }\n    function heightCm(w) { var b = block(); if (!b) return 0; return (w || widthCm()) * b.real / b.bw; }\n    function dims() { var h = heightCm(); return h ? fmtCm(widthCm()) + ' \u00D7 ' + fmtCm(h) + ' cm' : ''; }\n    function refreshDims() {\n      var d = dims(), p = $('#leniTextDims'); if (p) p.textContent = d ? 'Dimensions finales ' + d : '';\n      if (hasRole('size')) RENDER.size();\n      if (STEPS.indexOf('font') >= 0) RENDER.font(); // cibles \u00AB Ligne n \u00BB selon les lignes remplies\n    }\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: '1 \u00E0 4 lignes, centr\u00E9es. Une ligne vide ne s\u2019imprime pas. La hauteur s\u2019ajuste \u00E0 votre texte.' }));\n      if (hasRole('lines')) { // grille de prix par nombre de lignes, pour la largeur et la couleur en cours\n        var lp = roleValues('lines').map(function (v) { var pv = findVariant(selWith('lines', v)); return pv ? v + ' ' + formatMoney(pv.price) : ''; }).filter(Boolean);\n        if (lp.length) body.appendChild(el('p', { class: 'leni-cfg__hint leni-cfg__hint--price', text: 'Prix selon le nombre de lignes : ' + lp.join(' \u00B7 ') }));\n      }\n      for (var i = 0; i < LINES; i++) (function (i) {\n        var err = i === 0 && errors.text && (submitAttempted || touchedKeys.text) ? errors.text : (state.lines[i].length > MAXC ? MSG.tooLong : '');\n        body.appendChild(textField({\n          key: 'line' + i, label: 'Ligne ' + (i + 1) + (i === 0 ? '' : ' (facultative)'), placeholder: SAMPLE[i] || '', max: MAXC, value: state.lines[i], err: err, required: i === 0,\n          hint: MAXC + ' caract\u00E8res max.' + (state.fonts[i] !== state.font ? ' \u00B7 ' + state.fonts[i] : ''),\n          onInput: function (v) { state.lines[i] = v; touch('text'); if (v.trim()) demo.stop(); debounced('line' + i, function () { markInteracted(); mod.validate(); markComplete(); patchField('line' + i, i === 0 ? errors.text : '', MAXC + ' caract\u00E8res max.'); refreshDims(); updateLight(); }); },\n          onBlur: function () { mod.validate(); patchField('line' + i, i === 0 && (submitAttempted || touchedKeys.text) ? errors.text : '', MAXC + ' caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); }\n        }));\n      })(i);\n      body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:8px', text: 'Mise en page' }));\n      chips(body, ['Ligne 1 en titre', 'Toutes les lignes \u00E0 la m\u00EAme taille'], state.hier ? 'Ligne 1 en titre' : 'Toutes les lignes \u00E0 la m\u00EAme taille', function (val) { state.hier = val === 'Ligne 1 en titre'; markInteracted(); update(); }, 'Mise en page');\n      var d = dims();\n      body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniTextDims', text: d ? 'Dimensions finales ' + d : '' }));\n    };\n    mod.renderFontTarget = function (body) {\n      var targets = [{ key: 'all', label: 'Toutes les lignes' }];\n      state.lines.forEach(function (l, i) { if (l.trim()) targets.push({ key: String(i), label: 'Ligne ' + (i + 1) }); });\n      if (targets.length < 2) return;\n      body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', text: 'Appliquer \u00E0' }));\n      var cur = targets.some(function (t) { return t.key === state.fontTarget; }) ? state.fontTarget : 'all';\n      state.fontTarget = cur;\n      var grp = el('div', { class: 'leni-chips', style: 'margin-bottom:12px', role: 'radiogroup', 'aria-label': 'Appliquer la police \u00E0' });\n      targets.forEach(function (t) { grp.appendChild(el('button', { type: 'button', class: 'leni-chip' + (cur === t.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': cur === t.key ? 'true' : 'false', text: t.label, onclick: function () { state.fontTarget = t.key; RENDER.font(); } })); });\n      body.appendChild(grp);\n    };\n    mod.fontCurrent = function () { return state.fontTarget === 'all' ? (allSame() ? state.fonts[0] : '') : state.fonts[parseInt(state.fontTarget, 10)]; };\n    mod.pickFont = function (fam) {\n      if (state.fontTarget === 'all') { state.font = fam; state.fonts = [fam, fam, fam, fam]; }\n      else state.fonts[parseInt(state.fontTarget, 10)] = fam;\n      OT.ensureFont(fam);\n    };\n    function allSame() { return state.fonts.every(function (f) { return f === state.fonts[0]; }); }\n    function usedFonts() { var seen = {}, out = []; entries().forEach(function (e) { if (!seen[e.fam]) { seen[e.fam] = 1; out.push(e.fam); } }); if (!out.length) out.push(state.font); return out; }\n    mod.fontValue = function () { var u = usedFonts(); return u.length === 1 ? u[0] : 'Mixte \u00B7 ' + u.join(', '); };\n    mod.fontHint = function () { return state.fontTarget === 'all' ? 'La police s\u2019applique \u00E0 toutes les lignes. Choisissez une ligne ci-dessus pour lui donner sa propre police.' : 'Police de la ligne ' + (parseInt(state.fontTarget, 10) + 1) + ' seulement.'; };\n    mod.fontSample = function () { return state.fontTarget === 'all' ? (state.lines[0].trim() || 'Votre texte') : (state.lines[parseInt(state.fontTarget, 10)].trim() || 'Votre texte'); };\n    mod.validate = function () {\n      errors = {};\n      syncLines();\n      if (!entries().length) errors.text = MSG.textRequired;\n      else if (state.lines.some(function (l) { return l.length > MAXC; })) errors.text = MSG.tooLong;\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.text; };\n    mod.isComplete = mod.isValid;\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return 'text'; };\n    mod.incompleteLabel = function () { return !entries().length ? 'Saisissez votre texte' : 'Raccourcissez votre texte'; };\n    mod.stepValue = function (key) { if (key === 'text') { var es = entries(); return es.length ? es.map(function (e) { return e.text; }).join(' / ') : '\u00C0 saisir'; } return ''; };\n    mod.recapLines = function () {\n      var out = entries().map(function (e) { return { text: e.text, step: 'text' }; });\n      var d = dims(); if (d) out.push({ text: 'Dimensions exactes ' + d, step: 'size' });\n      return out;\n    };\n    mod.stickySub = function () { return (state.opt.size || '') + (state.opt.color ? ' \u00B7 ' + state.opt.color : ''); };\n    mod.dims = dims;\n    mod.sizeExtra = function (val) { var b = block(); if (!b) return ''; var m = optionMeta(val); var w = m.w || parseCm(val); return w ? 'hauteur ' + fmtCm(w * b.real / b.bw) + ' cm' : ''; };\n    mod.lightBg = function () { var c = colorNow(); return isDark(hexFor(c, '#F5F1EA')) && !isGold(c) && !isSilver(c); };\n    mod.preview = function () {\n      var dm = demo.active(), fill = svgFill(colorNow()), real = !!entries().length, b;\n      if (real) b = block();\n      else if (dm) { // g\u00E9om\u00E9trie sur l'enseigne compl\u00E8te (pas de saut de hauteur), texte limit\u00E9 \u00E0 ce qui est \u00AB tap\u00E9 \u00BB\n        var typedL = demo.text().split('\\n'); b = block(demo.full().split('\\n'));\n        if (b) b.es.forEach(function (e) { e.text = typedL[e.i] || ''; });\n      } else b = block(SAMPLE);\n      var W = 1000, pad = 60;\n      if (!b) return '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1000 500\" width=\"100%\" height=\"100%\"></svg>';\n      var right = real ? 90 : 0, k = (W - pad * 2 - right) / b.bw, H = b.bh * k + pad * 2 + 70, y = pad, cx = pad + b.bw * k / 2;\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre sticker texte\">', defs()];\n      b.es.forEach(function (e) {\n        var S = e.size * k;\n        if (e.text) out.push('<text x=\"' + cx.toFixed(1) + '\" y=\"' + (y + S * 0.86).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"\\'' + esc(e.fam) + '\\', sans-serif\" font-weight=\"' + e.wt + '\" font-size=\"' + S.toFixed(1) + '\" fill=\"' + fill + '\"' + (real ? '' : (dm ? ' fill-opacity=\"' + demo.alpha.toFixed(2) + '\"' : ' fill-opacity=\"0.55\"')) + '>' + esc(e.text) + '</text>');\n        y += S * b.lh;\n      });\n      var lc = mod.lightBg() ? '#1A1A1A' : '#F5F1EA', dimY = H - 22;\n      if (real) {\n        out.push(dimLines({ x: pad, y: pad + b.top * k, w: b.bw * k, h: b.real * k, wcm: widthCm(), hcm: heightCm(), ink: lc, bg: mod.lightBg() ? '#F7F5F1' : '#1A1A1A', plan: REG === 'pro', fs: 22 }));\n      } else {\n        out.push('<text x=\"' + (W / 2) + '\" y=\"' + (dimY + 8) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.6\">Exemple \u2014 saisissez votre texte pour voir votre sticker</text>');\n      }\n      out.push('</svg>');\n      return out.join('');\n    };\n    mod.properties = function () {\n      var p = { 'Texte': entries().map(function (e) { return e.text; }).join('\\n') };\n      var u = usedFonts();\n      if (u.length === 1) p['Police'] = u[0];\n      else entries().forEach(function (e) { p['Police ligne ' + (e.i + 1)] = e.fam; });\n      p['Mise en page'] = state.hier ? 'Ligne 1 en titre' : 'Lignes de m\u00EAme taille';\n      var d = dims(); if (d) p['Dimensions'] = d;\n      return p;\n    };\n    mod.compact = function () { return { v: 2, k: 'texte', o: state.opt, l: state.lines, f: state.font, fl: state.fonts, hi: state.hier ? 1 : 0, x: state.extras }; };\n    mod.apply = function (c) {\n      applyOpts(c.o);\n      if (Array.isArray(c.l)) state.lines = c.l.concat(['', '', '', '']).slice(0, 4).map(function (s) { return String(s || ''); });\n      if (c.f) { state.font = c.f; state.fonts = [c.f, c.f, c.f, c.f]; }\n      if (Array.isArray(c.fl) && c.fl.length === 4) state.fonts = c.fl.map(function (f, i) { return f || state.font; });\n      if (c.hi !== undefined) state.hier = !!c.hi;\n      if (c.x) Object.keys(c.x).forEach(function (k) { if (k in state.extras) state.extras[k] = !!c.x[k]; });\n    };\n    mod.fontsToLoad = function () { var seen = {}; return state.fonts.concat([state.font]).filter(function (f) { if (!f || seen[f]) return false; seen[f] = 1; return true; }).map(function (f) { return { family: f, weight: fontWeightFor(f) }; }); };\n    /* \u2500\u2500 Fichier de d\u00E9coupe : un trac\u00E9 par ligne, m\u00EAme g\u00E9om\u00E9trie que l'aper\u00E7u (lignes centr\u00E9es, hi\u00E9rarchie, interligne),\n       la ligne la plus longue = largeur command\u00E9e ; feuille = bo\u00EEte d'encre de l'ensemble \u2500\u2500 */\n    mod.vectorFonts = function () { return usedFonts(); };\n    mod.files = function () {\n      var b = block(); if (!b) return [];\n      var Wmm = widthCm() * 10, cx = Wmm / 2, exact = true, loaded = true;\n      function layoutAt(k) {\n        var L = { lines: [], x1: Infinity, y1: Infinity, x2: -Infinity, y2: -Infinity };\n        b.es.forEach(function (e) {\n          var size = e.size * k, m = VEC.metrics(e.text, e.fam, e.wt, size); if (!m) return;\n          var x0 = cx - m.adv / 2, base = e.baseline * k; // centrage sur la chasse r\u00E9elle de la ligne\n          L.x1 = Math.min(L.x1, x0 + m.x1); L.x2 = Math.max(L.x2, x0 + m.x2); L.y1 = Math.min(L.y1, base + m.y1); L.y2 = Math.max(L.y2, base + m.y2);\n          L.lines.push({ e: e, size: size, base: base });\n        });\n        return L;\n      }\n      var L = layoutAt(Wmm / b.bw); if (!L.lines.length || L.x1 === Infinity) return [];\n      var kk = Wmm / (L.x2 - L.x1); if (Math.abs(kk - 1) > 0.002) L = layoutAt(Wmm / b.bw * kk); // largeur d'encre r\u00E9elle = largeur command\u00E9e\n      if (!L.lines.length || L.x1 === Infinity) return [];\n      var x1 = L.x1, y1 = L.y1, W = L.x2 - L.x1, H = L.y2 - L.y1, hex = VEC.hex(state.opt.color), parts = [], lines = L.lines;\n      lines.forEach(function (l) {\n        var v = VEC.text({ text: l.e.text, family: l.e.fam, weight: l.e.wt, x: cx - x1, y: l.base - y1, size: l.size, anchor: 'middle' }); if (!v) return;\n        exact = exact && v.exact; loaded = loaded && v.loaded !== false;\n        parts.push('<path id=\"ligne-' + (l.e.i + 1) + '\" fill=\"' + hex + '\" fill-rule=\"' + v.rule + '\" d=\"' + v.d + '\"/>');\n      });\n      if (!parts.length) return [];\n      var svg = VEC.svg(W, H, VEC.wrap(parts.join(''), W), { title: 'Sticker texte \u00B7 ' + lines[0].e.text + ' \u00B7 ' + (state.opt.color || ''), fonts: usedFonts(), exact: exact, loaded: loaded });\n      return VEC.file(svg, 'texte-' + VEC.slug(lines[0].e.text, 'texte') + '-' + VEC.slug(state.opt.size, 'largeur') + '.svg');\n    };\n    return mod;\n  })();\n\n  /* \u2500\u2500 LOGO : d\u00E9p\u00F4t du fichier \u2192 analyse automatique \u2192 aper\u00E7u du r\u00E9sultat livr\u00E9 \u00E0 la largeur choisie \u2500\u2500\n     Modes (cfg.logo.mode) : cut = d\u00E9coupe 1 couleur (PVC / Dibond frais\u00E9s), print = impression couleur HD\n     d\u00E9coup\u00E9e \u00E0 la forme, creation = cr\u00E9ation graphique \u00E0 partir d'un fichier de base.\n     Pas de r\u00E9glage ni d'alerte. Le fichier est jug\u00E9 : vectoriel, exploitable (net, ou net mais \u00E0 agrandir),\n     trop petit (refus\u00E9, renvoi vers la cr\u00E9ation graphique), en couleurs / d\u00E9grad\u00E9s (retraitement atelier en\n     option ou version imprim\u00E9e). Les d\u00E9tails plus fins que MIN_MM et les creux plus \u00E9troits que la fraise\n     (BIT_MM) sont retir\u00E9s / combl\u00E9s dans l'aper\u00E7u et le trac\u00E9 \u00E0 la largeur choisie ; la plus petite largeur\n     fid\u00E8le est s\u00E9lectionn\u00E9e d'office ; en dessous, le retraitement est propos\u00E9 en option.\n     Le contour est trac\u00E9 en courbes dans le navigateur (SVG \u00E0 l'\u00E9chelle en mm joint \u00E0 la commande) : les\n     trac\u00E9s superpos\u00E9s d'un fichier vectoriel sont ainsi fusionn\u00E9s, l'original reste joint pour l'atelier. */\n  KINDS.logo = (function () {\n    var L = cfg.logo || {};\n    var MODE = L.mode || 'cut', CUT = MODE === 'cut', PRINT = MODE === 'print', CREATION = MODE === 'creation';\n    var MAX_MB = L.maxMb || 10, PX = 1600, MIN_MM = L.minMm || 3, BIT_MM = L.bitMm || 0, MIN_PX = L.minPx || 300;\n    var MIN_PX_CM = 12, PRINT_PX_CM = 20, HANDOFF_MS = 2 * 3600 * 1000;\n    var REPRISE = (cfg.extras || []).filter(function (x) { return x.key === 'reprise'; })[0] || null;\n    var PDFJS = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/';\n    var mod = {\n      steps: CREATION ? ['upload', 'brief'] : ['upload', 'size', 'material', 'color', 'print'].filter(function (k) { return k === 'upload' || hasRole(k); }),\n      labels: { upload: CREATION ? 'Votre fichier de base' : 'Votre logo', brief: 'Vos indications', size: (cfg.labels && cfg.labels.size) || 'Largeur', material: roleLabel('material') || 'Mati\u00E8re', color: roleLabel('color') || 'Couleur', print: 'Impression' },\n      mainStep: 'upload',\n      render: {},\n      init: function () {\n        resetAnalysis();\n        state.file = null; state.fileName = ''; state.fileUrl = ''; state.busy = false; state.fileErr = ''; state.sizePicked = false; state.rework = false; state.brief = ''; state.restored = false;\n        state.cut = (cfg.palette && cfg.palette[0] && cfg.palette[0].name) || '';\n        state.view = REG === 'pro' ? 'plan' : 'wall';\n        if (!editKey) setTimeout(restoreHandoff, 0);\n      }\n    };\n    function resetAnalysis() {\n      state.isPdf = false; state.isVector = false; state.liveText = false; state.img = null; state.srcW = 0; state.srcH = 0; state.gray = null; state.thr = 128; state.inverted = false;\n      state.mask = null; state.bbox = null; state.dBg = null; state.dFg = null; state.stats = null; state.grade = ''; state.why = ''; state.thinBy = {}; state.svgBy = {}; state.minW = 0;\n      state.maskUrl = ''; state.maskKey = ''; state.origUrl = ''; state.origKey = ''; state.printUrl = ''; state.printKey = '';\n    }\n    function mmLabel(v) { return String(v === undefined ? MIN_MM : v).replace('.', ','); }\n    function withPrint() { return PRINT || (hasRole('print') && /avec|quadri/i.test(state.opt.print || '') && !/sans/i.test(state.opt.print || '')); }\n    function widthCm() { var m = optionMeta(state.opt.size); if (m.w) return m.w; return parseCm(state.opt.size) || 30; }\n    function widths() {\n      return roleValues('size').map(function (v) { var m = optionMeta(v); return { val: v, w: m.w || parseCm(v) || 0 }; })\n        .filter(function (s) { return s.w > 0; }).sort(function (a, b) { return a.w - b.w; });\n    }\n    function loaded() { return !!(state.file || state.fileUrl); }\n    function usable() { return !!state.bbox && (state.grade === 'vector' || state.grade === 'clean'); }\n    function srcPxPerCm(w) { return state.bbox && state.img ? (state.bbox.w * (state.srcW / state.img.width)) / (w || widthCm()) : 0; }\n    function lowRes(w) { return state.grade === 'clean' && !PRINT && srcPxPerCm(w) > 0 && srcPxPerCm(w) < MIN_PX_CM; }\n    function defOk(w) { return !PRINT || state.isVector || !state.bbox || srcPxPerCm(w) >= PRINT_PX_CM; }\n    function simplifiedAt(w) { return usable() && !!thinFor(w).count; }\n    function simplified() { return !state.rework && simplifiedAt(widthCm()); }\n    function widthOk(w) { return usable() && !thinFor(w).count && defOk(w); }\n    function effBbox() { if (!state.bbox) return null; return usable() && !state.rework ? thinFor(widthCm()).ebbox : state.bbox; }\n    function ratio() { var b = effBbox(); return b ? b.h / b.w : 0; }\n    function heightCm(w) { var r = ratio(); return r ? (w || widthCm()) * r : 0; }\n    function heightCmAt(w) { if (!state.bbox) return 0; var b = usable() && !state.rework ? thinFor(w).ebbox : state.bbox; return w * b.h / b.w; }\n    function dims() { if (CREATION || !hasRole('size')) return ''; var h = heightCm(); return h ? fmtCm(widthCm()) + ' \u00D7 ' + fmtCm(h) + ' cm' : fmtCm(widthCm()) + ' cm de large, hauteur selon votre fichier'; }\n    function cutColor() { return hasRole('color') ? state.opt.color : state.cut; }\n    function cutHex() { return hexFor(cutColor(), '#1A1A1A'); }\n\n    /* \u2500\u2500 Fichier gard\u00E9 en m\u00E9moire (IndexedDB, 2 h) pour le reprendre sur un autre produit logo \u2500\u2500 */\n    function idb() {\n      return new Promise(function (res, rej) {\n        if (!window.indexedDB) return rej(new Error('idb'));\n        var r = indexedDB.open('leni-perso', 1);\n        r.onupgradeneeded = function () { r.result.createObjectStore('files'); };\n        r.onsuccess = function () { res(r.result); }; r.onerror = function () { rej(r.error); };\n      });\n    }\n    function saveHandoff(file) {\n      idb().then(function (db) { db.transaction('files', 'readwrite').objectStore('files').put({ name: file.name, type: file.type, blob: file, at: Date.now() }, 'logo'); }).catch(function () { /* noop */ });\n    }\n    function loadHandoff() {\n      return idb().then(function (db) { return new Promise(function (res) { var r = db.transaction('files').objectStore('files').get('logo'); r.onsuccess = function () { res(r.result || null); }; r.onerror = function () { res(null); }; }); }).catch(function () { return null; });\n    }\n    function restoreHandoff() {\n      if (loaded()) return;\n      loadHandoff().then(function (rec) {\n        if (!rec || !rec.blob || loaded() || Date.now() - rec.at > HANDOFF_MS) return;\n        var f; try { f = new File([rec.blob], rec.name, { type: rec.type }); } catch (e) { return; }\n        state.restored = true;\n        onFile(f, true);\n      });\n    }\n\n    /* \u2500\u2500 Lecture du fichier : image \u2192 canvas ; PDF rendu par pdf.js (charg\u00E9 \u00E0 la demande), sinon v\u00E9rification atelier \u2500\u2500 */\n    function loadImage(file) {\n      return new Promise(function (res, rej) {\n        var url = URL.createObjectURL(file), img = new Image();\n        img.onload = function () { URL.revokeObjectURL(url); res(img); };\n        img.onerror = function () { URL.revokeObjectURL(url); rej(new Error(MSG.fileRead)); };\n        img.src = url;\n      }).then(function (img) {\n        var w = img.naturalWidth || img.width || 1000, h = img.naturalHeight || img.height || 1000;\n        // toujours ramen\u00E9 \u00E0 PX : une petite image est agrandie avec interpolation, ses marches de pixels deviennent\n        // des rampes et le seuil donne un contour lisse (pr\u00E9cision sous-pixel) au lieu d'un escalier\n        var k = PX / Math.max(w, h);\n        var c = document.createElement('canvas'); c.width = Math.max(1, Math.round(w * k)); c.height = Math.max(1, Math.round(h * k));\n        var ctx = c.getContext('2d'); ctx.imageSmoothingEnabled = true; try { ctx.imageSmoothingQuality = 'high'; } catch (e) { /* noop */ }\n        ctx.drawImage(img, 0, 0, c.width, c.height);\n        return { c: c, w: state.isVector ? c.width : w, h: state.isVector ? c.height : h };\n      });\n    }\n    function loadPdfJs() {\n      if (window.pdfjsLib) return Promise.resolve(window.pdfjsLib);\n      if (loadPdfJs.p) return loadPdfJs.p;\n      loadPdfJs.p = new Promise(function (res, rej) {\n        var s = document.createElement('script'); s.src = PDFJS + 'pdf.min.js'; s.async = true;\n        s.onload = function () { if (window.pdfjsLib) { window.pdfjsLib.GlobalWorkerOptions.workerSrc = PDFJS + 'pdf.worker.min.js'; res(window.pdfjsLib); } else rej(new Error('pdfjs')); };\n        s.onerror = function () { loadPdfJs.p = null; rej(new Error('pdfjs')); };\n        document.head.appendChild(s);\n      });\n      return loadPdfJs.p;\n    }\n    function loadPdf(file) {\n      return loadPdfJs().then(function (lib) { return file.arrayBuffer().then(function (buf) { return lib.getDocument({ data: buf }).promise; }); })\n        .then(function (doc) { return doc.getPage(1); })\n        .then(function (page) {\n          var v0 = page.getViewport({ scale: 1 }), k = PX / Math.max(v0.width, v0.height), vp = page.getViewport({ scale: k });\n          var c = document.createElement('canvas'); c.width = Math.max(1, Math.round(vp.width)); c.height = Math.max(1, Math.round(vp.height));\n          var ctx = c.getContext('2d'); ctx.fillStyle = '#fff'; ctx.fillRect(0, 0, c.width, c.height);\n          return page.render({ canvasContext: ctx, viewport: vp }).promise.then(function () { return { c: c, w: c.width, h: c.height }; });\n        });\n    }\n    function detectLiveText(file) {\n      // texte non vectoris\u00E9 : SVG avec <text> sans police embarqu\u00E9e, PDF qui r\u00E9f\u00E9rence des polices sans les inclure\n      if (!state.isVector && !state.isPdf) return Promise.resolve(false);\n      return file.slice(0, 4 * 1024 * 1024).text().then(function (t) {\n        if (state.isPdf) return /\\/Font\\b/.test(t) && !/\\/FontFile/.test(t);\n        return /<text[\\s>]/i.test(t) && !/@font-face/i.test(t);\n      }).catch(function () { return false; });\n    }\n    function processFile(file) {\n      state.fileErr = ''; resetAnalysis();\n      state.isPdf = /pdf$/i.test(file.type) || /\\.pdf$/i.test(file.name); state.isVector = /svg/i.test(file.type) || /\\.svg$/i.test(file.name);\n      state.file = file; state.fileName = file.name; state.fileUrl = ''; state.busy = true; state.rework = false; // nouveau fichier : le retraitement se redemande\n      var p = state.isPdf ? loadPdf(file).then(function (r) { state.isVector = true; return r; }) : loadImage(file);\n      return Promise.all([p, detectLiveText(file)]).then(function (rs) { state.liveText = rs[1]; analyzeCanvas(rs[0].c, rs[0].w, rs[0].h); autoSize(); state.busy = false; })\n        .catch(function (e) {\n          state.busy = false;\n          if (state.isPdf) { state.grade = 'pending'; return; } // PDF non rendu dans ce navigateur : v\u00E9rification \u00E0 l'atelier\n          state.fileErr = (e && e.message) || MSG.fileRead; state.file = null; state.fileName = ''; resetAnalysis();\n        });\n    }\n\n    /* \u2500\u2500 Analyse : niveaux de gris, fond sombre invers\u00E9, seuil d'Otsu (ou silhouette pour l'impression), masque, verdict, zones fines par largeur \u2500\u2500 */\n    function analyzeCanvas(c, srcW, srcH) {\n      var w = c.width, h = c.height, n = w * h, data = c.getContext('2d').getImageData(0, 0, w, h).data;\n      state.img = c; state.srcW = srcW; state.srcH = srcH;\n      var gray = new Uint8ClampedArray(n), hist = new Uint32Array(256), opaque = 0, mid = 0, sat = 0, colorHist = {}, i, p;\n      var alpha = new Uint8Array(n), satMask = new Uint8Array(n);\n      for (i = 0, p = 0; i < data.length; i += 4, p++) {\n        var a = data[i + 3] / 255, r = data[i], g = data[i + 1], b = data[i + 2];\n        var gr = Math.round((0.299 * r + 0.587 * g + 0.114 * b) * a + 255 * (1 - a)); // transparent = blanc\n        gray[p] = gr; hist[gr]++; alpha[p] = a > 0.5 ? 1 : 0;\n        if (a > 0.5 && gr < 245) {\n          opaque++;\n          var mx = Math.max(r, g, b), mn = Math.min(r, g, b);\n          if (mx - mn > 60) { sat++; satMask[p] = 1; }\n          else if (gr > 70 && gr < 185) mid++; // gris interm\u00E9diaires hors zones color\u00E9es = flou / d\u00E9grad\u00E9\n          var key = (r >> 6) + '-' + (g >> 6) + '-' + (b >> 6);\n          colorHist[key] = (colorHist[key] || 0) + 1;\n        }\n      }\n      var thr, lost = 0;\n      if (PRINT || CREATION) {\n        // silhouette imprim\u00E9e : tout ce qui n'est ni transparent ni blanc\n        thr = 240; state.inverted = false;\n        for (p = 0; p < n; p++) if (!alpha[p]) gray[p] = 255;\n      } else {\n        thr = otsu(hist, n);\n        // fond sombre ? on regarde le cadre de l'image : si la majorit\u00E9 est sous le seuil, c'est la partie claire qui forme le logo\n        var fr = Math.max(1, Math.round(Math.min(w, h) * 0.02)), border = 0, dark = 0, x, y;\n        for (y = 0; y < h; y++) for (x = 0; x < w; x++) {\n          if (x >= fr && y >= fr && x < w - fr && y < h - fr) { x = w - fr - 1; continue; }\n          border++; if (gray[y * w + x] < thr) dark++;\n        }\n        state.inverted = border > 0 && dark / border > 0.5;\n        if (state.inverted) { hist = new Uint32Array(256); for (p = 0; p < n; p++) { gray[p] = 255 - gray[p]; hist[gray[p]]++; } thr = otsu(hist, n); }\n        for (p = 0; p < n; p++) if (satMask[p] && gray[p] >= thr) lost++; // couleurs claires que le seuil ferait dispara\u00EEtre\n      }\n      state.gray = gray; state.thr = thr;\n      var shares = Object.keys(colorHist).map(function (k) { return colorHist[k]; }).sort(function (a, b) { return b - a; }), acc = 0, colors = 0;\n      for (i = 0; i < shares.length && acc < 0.85 * opaque; i++) { acc += shares[i]; colors++; } // teintes n\u00E9cessaires pour couvrir 85 % : un d\u00E9grad\u00E9 en demande beaucoup\n      state.stats = { midFrac: opaque ? mid / opaque : 0, satFrac: opaque ? sat / opaque : 0, lostFrac: opaque ? lost / opaque : 0, colors: colors };\n      buildMask();\n      var grade = '', why = '';\n      if (!state.bbox) { grade = 'small'; why = 'aucun trac\u00E9 d\u00E9tect\u00E9'; }\n      else if (CREATION) grade = 'clean';\n      else {\n        var srcBw = state.bbox.w * (srcW / w), minPx = PRINT ? Math.max(MIN_PX, PRINT_PX_CM * (widths()[0] ? widths()[0].w : 40)) : MIN_PX;\n        if (!state.isVector && srcBw < minPx) { grade = 'small'; why = Math.round(srcBw) + ' px de large'; }\n        else if (CUT && !state.isVector && state.stats.midFrac > 0.14) { grade = 'color'; why = 'd\u00E9grad\u00E9s ou contours flous'; }\n        else if (CUT && !state.isVector && state.stats.lostFrac > 0.12) { grade = 'color'; why = 'couleurs claires qui dispara\u00EEtraient en une couleur'; }\n        else if (CUT && !state.isVector && colors >= 4 && state.stats.satFrac > 0.2) { grade = 'color'; why = colors >= 6 ? 'd\u00E9grad\u00E9s de couleurs' : 'plusieurs couleurs'; }\n        else grade = state.isVector ? 'vector' : 'clean';\n      }\n      state.grade = grade; state.why = why;\n      state.thinBy = {}; state.svgBy = {};\n      if (usable() && !CREATION) {\n        state.dBg = distTo(true); if (BIT_MM > 0) state.dFg = distTo(false);\n        widths().forEach(function (s) { thinFor(s.w); });\n      }\n      state.minW = minWidth();\n    }\n    function otsu(hist, total) {\n      var sum = 0; for (var i = 0; i < 256; i++) sum += i * hist[i];\n      var sumB = 0, wB = 0, best = 0, thr = 128;\n      for (var t = 0; t < 256; t++) {\n        wB += hist[t]; if (!wB) continue;\n        var wF = total - wB; if (!wF) break;\n        sumB += t * hist[t];\n        var mB = sumB / wB, mF = (sum - sumB) / wF, v = wB * wF * (mB - mF) * (mB - mF);\n        if (v > best) { best = v; thr = t; }\n      }\n      return Math.min(240, Math.max(15, thr));\n    }\n    function buildMask() {\n      var c = state.img; if (!c || !state.gray) return;\n      var w = c.width, h = c.height, m = document.createElement('canvas'); m.width = w; m.height = h;\n      var ctx = m.getContext('2d'), out = ctx.createImageData(w, h), d = out.data;\n      var minX = w, minY = h, maxX = -1, maxY = -1;\n      for (var p = 0; p < w * h; p++) {\n        var dark = state.gray[p] < state.thr;\n        d[p * 4] = 0; d[p * 4 + 1] = 0; d[p * 4 + 2] = 0; d[p * 4 + 3] = dark ? 255 : 0;\n        if (dark) { var x = p % w, y = (p / w) | 0; if (x < minX) minX = x; if (x > maxX) maxX = x; if (y < minY) minY = y; if (y > maxY) maxY = y; }\n      }\n      ctx.putImageData(out, 0, 0);\n      state.mask = m;\n      state.bbox = maxX >= 0 ? { x: minX, y: minY, w: maxX - minX + 1, h: maxY - minY + 1 } : null;\n      state.maskUrl = '';\n    }\n\n    /* \u2500\u2500 Zones fines et creux \u00E9troits : ouverture morphologique \u00E0 l'\u00E9chelle r\u00E9elle, une fois par largeur propos\u00E9e \u2500\u2500\n       pxPerMm = largeur du logo en px / largeur choisie en mm. Mati\u00E8re : rayon = MIN_MM / 2 sur le logo ; creux :\n       rayon = BIT_MM / 2 sur le fond (ce que la fraise ne peut pas usiner est combl\u00E9). \u00C9rosion (distance > r) puis\n       dilatation (distance \u00E0 l'\u00E9rod\u00E9 \u2264 r) ; ce qui dispara\u00EEt = traits, empattements, \u00EElots, fentes et contre-formes\n       plus \u00E9troits que le seuil. Distances par chamfer 3-4 en tiers de pixel, mesur\u00E9es au bord du pixel\n       (lim = 3r + 1,5). Les distances au fond et au logo ne d\u00E9pendent pas de la largeur : calcul\u00E9es une fois. */\n    function distTo(fgSide) {\n      // fgSide = true : distance au fond pour les pixels du logo (> 0 \u21D4 logo) ; false : distance au logo pour les pixels du fond\n      var w = state.mask.width, h = state.mask.height, n = w * h, ins = new Uint8Array(n);\n      for (var p = 0; p < n; p++) ins[p] = (state.gray[p] < state.thr) === fgSide ? 1 : 0;\n      return chamfer(ins, w, h);\n    }\n    function residue(dIn, r, w, h, wedge) {\n      // ce que l'ouverture de rayon r retire de la r\u00E9gion \u00AB dIn > 0 \u00BB ; composantes filtr\u00E9es : un r\u00E9sidu rattach\u00E9\n      // plus petit que r\u00B2, aussi \u00E9pais que le seuil (pointe qui s'effile) ou plus court que le seuil (angle arrondi)\n      // n'est pas un d\u00E9tail fin ; un \u00EElot d\u00E9tach\u00E9 l'est toujours. C\u00F4t\u00E9 fond (wedge) : un r\u00E9sidu triangulaire est un\n      // angle rentrant que la fraise arrondit (normal), seul un r\u00E9sidu rectangulaire est une vraie fente \u00E0 combler\n      var n = w * h, p, lim = 3 * r + 1.5, notE = new Uint8Array(n);\n      for (p = 0; p < n; p++) notE[p] = dIn[p] >= lim ? 0 : 1; // \u00E9paisseur exactement au seuil : accept\u00E9e\n      var dE = chamfer(notE, w, h), thin = new Uint8Array(n), thinPx = 0;\n      for (p = 0; p < n; p++) if (dIn[p] && dE[p] > lim) { thin[p] = 1; thinPx++; }\n      var minArea = Math.max(6, Math.round(r * r)), seen = new Uint8Array(n), stack = new Int32Array(n), count = 0, kept = 0;\n      for (p = 0; p < n; p++) {\n        if (!thin[p] || seen[p]) continue;\n        var top = 0, size = 0, attached = false, maxD = 0, x0 = w, x1 = 0, y0 = h, y1 = 0, members = []; stack[top++] = p; seen[p] = 1;\n        while (top) {\n          var q = stack[--top]; size++; members.push(q);\n          if (dIn[q] > maxD) maxD = dIn[q];\n          var qx = q % w, qy = (q / w) | 0, nb;\n          if (qx < x0) x0 = qx; if (qx > x1) x1 = qx; if (qy < y0) y0 = qy; if (qy > y1) y1 = qy;\n          nb = q - 1; if (qx > 0) { if (thin[nb]) { if (!seen[nb]) { seen[nb] = 1; stack[top++] = nb; } } else if (dIn[nb]) attached = true; }\n          nb = q + 1; if (qx < w - 1) { if (thin[nb]) { if (!seen[nb]) { seen[nb] = 1; stack[top++] = nb; } } else if (dIn[nb]) attached = true; }\n          nb = q - w; if (qy > 0) { if (thin[nb]) { if (!seen[nb]) { seen[nb] = 1; stack[top++] = nb; } } else if (dIn[nb]) attached = true; }\n          nb = q + w; if (qy < h - 1) { if (thin[nb]) { if (!seen[nb]) { seen[nb] = 1; stack[top++] = nb; } } else if (dIn[nb]) attached = true; }\n        }\n        var extent = Math.max(x1 - x0, y1 - y0) + 1, i;\n        var keep = attached ? (size >= minArea && (wedge || maxD < 0.7 * lim) && extent >= 2 * r) : size >= 2, counted = keep;\n        if (keep && attached && wedge) {\n          // diam\u00E8tre (deux passes) et taux de remplissage du rectangle longueur \u00D7 largeur : fente \u2248 1, coin \u2248 0,5\n          var a = members[0], ax = a % w, ay = (a / w) | 0, far = a, best = -1, m, mx, my, dd;\n          for (i = 0; i < members.length; i++) { m = members[i]; mx = m % w - ax; my = ((m / w) | 0) - ay; dd = mx * mx + my * my; if (dd > best) { best = dd; far = m; } }\n          ax = far % w; ay = (far / w) | 0; best = -1;\n          for (i = 0; i < members.length; i++) { m = members[i]; mx = m % w - ax; my = ((m / w) | 0) - ay; dd = mx * mx + my * my; if (dd > best) best = dd; }\n          // le coin rentrant est combl\u00E9 (la fraise l'arrondit, c'est la r\u00E9alit\u00E9) mais seule une vraie fente,\n          // longue d'au moins 6 rayons et de largeur r\u00E9guli\u00E8re, compte comme d\u00E9tail simplifi\u00E9\n          var diam = Math.sqrt(best) + 1, width = Math.max(1, 2 * maxD / 3);\n          counted = diam >= 6 * r && size / (diam * width) >= 0.72;\n        }\n        if (!keep) { for (i = 0; i < members.length; i++) thin[members[i]] = 0; thinPx -= size; }\n        else { kept++; if (counted) count++; }\n      }\n      return { count: count, px: Math.max(0, thinPx), map: kept ? thin : null };\n    }\n    function thinFor(wcm) {\n      var key = String(wcm); if (state.thinBy[key]) return state.thinBy[key];\n      var b = state.bbox, res = { count: 0, thin: 0, gaps: 0, thinMap: null, gapMap: null, ebbox: b };\n      if (!b || !state.dBg) { state.thinBy[key] = res; return res; }\n      var w = state.mask.width, h = state.mask.height, n = w * h, p, pxPerMm = b.w / (wcm * 10);\n      var rT = (MIN_MM / 2) * pxPerMm, rG = (BIT_MM / 2) * pxPerMm; // rayons r\u00E9els en px, non arrondis\n      var t = rT >= 0.75 ? residue(state.dBg, rT, w, h) : { count: 0, map: null };\n      var g = (state.dFg && rG >= 1.5) ? residue(state.dFg, rG, w, h, true) : { count: 0, map: null };\n      // creux \u00E0 combler : seulement ceux qui touchent le logo (une poussi\u00E8re blanche isol\u00E9e loin du logo n'est pas un creux)\n      if (g.map) {\n        // embouchure d'une fente combl\u00E9e : un pixel de fond coll\u00E9 \u00E0 la fente et pris en sandwich entre logo/fente\n        // \u00E0 moins d'un diam\u00E8tre de fraise (\u00E0 gauche et \u00E0 droite, ou en haut et en bas) est combl\u00E9 aussi, pas d'encoche\n        var k = Math.ceil(2 * rG), pass, i;\n        function solid(q) { return state.dBg[q] > 0 || g.map[q]; }\n        function sandwiched(q) {\n          var qx = q % w, qy = (q / w) | 0, d, l = 0, r2 = 0, u = 0, dn = 0;\n          for (d = 1; d <= k && qx - d >= 0; d++) if (solid(q - d)) { l = 1; break; }\n          for (d = 1; d <= k && qx + d < w; d++) if (solid(q + d)) { r2 = 1; break; }\n          if (l && r2) return true;\n          for (d = 1; d <= k && qy - d >= 0; d++) if (solid(q - d * w)) { u = 1; break; }\n          for (d = 1; d <= k && qy + d < h; d++) if (solid(q + d * w)) { dn = 1; break; }\n          return !!(u && dn);\n        }\n        for (pass = 0; pass <= k; pass++) {\n          var add = [];\n          for (p = 0; p < n; p++) if (!g.map[p] && state.dBg[p] === 0) { var px2 = p % w, py2 = (p / w) | 0; if (((px2 > 0 && g.map[p - 1]) || (px2 < w - 1 && g.map[p + 1]) || (py2 > 0 && g.map[p - w]) || (py2 < h - 1 && g.map[p + w])) && sandwiched(p)) add.push(p); }\n          if (!add.length) break;\n          for (i = 0; i < add.length; i++) g.map[add[i]] = 1;\n        }\n      }\n      res.thin = t.count; res.gaps = g.count; res.count = t.count + g.count; res.thinMap = t.map; res.gapMap = g.map;\n      if (t.map || g.map) {\n        var minX = w, minY = h, maxX = -1, maxY = -1;\n        for (p = 0; p < n; p++) {\n          var on = (state.dBg[p] > 0 && !(t.map && t.map[p])) || (g.map && g.map[p]);\n          if (on) { var px = p % w, py = (p / w) | 0; if (px < minX) minX = px; if (px > maxX) maxX = px; if (py < minY) minY = py; if (py > maxY) maxY = py; }\n        }\n        if (maxX >= 0) res.ebbox = { x: minX, y: minY, w: maxX - minX + 1, h: maxY - minY + 1 };\n      }\n      state.thinBy[key] = res;\n      return res;\n    }\n    function minWidth() {\n      if (!usable() || CREATION) return 0;\n      var ws = widths();\n      for (var i = 0; i < ws.length; i++) if (widthOk(ws[i].w)) return ws[i].w;\n      return 0; // aucune largeur propos\u00E9e n'est fid\u00E8le\n    }\n    function autoSize() {\n      // plus petite largeur o\u00F9 tout le logo est r\u00E9alisable : s\u00E9lectionn\u00E9e d'office, sauf si le client a d\u00E9j\u00E0 choisi plus grand et que \u00E7a reste r\u00E9alisable\n      if (!hasRole('size') || !state.minW) return;\n      if (state.sizePicked && widthCm() >= state.minW && widthOk(widthCm())) return;\n      var target = widths().filter(function (s) { return s.w === state.minW; })[0];\n      if (target && state.opt.size !== target.val) { state.opt.size = target.val; state.maskUrl = ''; }\n    }\n\n    /* \u2500\u2500 Masques \u2500\u2500 */\n    function mapCanvas(map, b) {\n      if (!map) return null;\n      var w = state.mask.width, c = document.createElement('canvas'); c.width = b.w; c.height = b.h;\n      var ctx = c.getContext('2d'), out = ctx.createImageData(b.w, b.h), d = out.data;\n      for (var y = 0; y < b.h; y++) for (var x = 0; x < b.w; x++) { var p = (b.y + y) * w + (b.x + x), o = (y * b.w + x) * 4; if (map[p]) { d[o + 3] = 255; } }\n      ctx.putImageData(out, 0, 0);\n      return c;\n    }\n    function cleanedMaskAt(wcm) {\n      // masque du contour r\u00E9ellement d\u00E9coup\u00E9 \u00E0 cette largeur : zones fines retir\u00E9es, creux \u00E9troits combl\u00E9s (sauf retraitement)\n      // creux \u00E9troits et angles rentrants : toujours combl\u00E9s (la fraise ne peut pas y passer) ; zones fines : retir\u00E9es sauf retraitement\n      var raw = state.bbox, t = usable() ? thinFor(wcm) : null, b = t && !state.rework ? t.ebbox : raw;\n      var c = document.createElement('canvas'); c.width = b.w; c.height = b.h;\n      var ctx = c.getContext('2d');\n      ctx.drawImage(state.mask, b.x, b.y, b.w, b.h, 0, 0, b.w, b.h);\n      if (t) {\n        var tc = !state.rework ? mapCanvas(t.thinMap, raw) : null; if (tc) { ctx.globalCompositeOperation = 'destination-out'; ctx.drawImage(tc, raw.x - b.x, raw.y - b.y); ctx.globalCompositeOperation = 'source-over'; }\n        var gc = mapCanvas(t.gapMap, raw); if (gc) ctx.drawImage(gc, raw.x - b.x, raw.y - b.y);\n      }\n      return c;\n    }\n    function cleanedMask() { return cleanedMaskAt(widthCm()); }\n    function maskUrl(color) {\n      if (!state.mask || !state.bbox) return '';\n      var key = color + '|' + state.thr + '|' + (state.rework ? 'rw' : 'cl') + '|' + widthCm() + '|' + state.fileName;\n      if (state.maskKey === key && state.maskUrl) return state.maskUrl;\n      var c = cleanedMask(), ctx = c.getContext('2d');\n      ctx.globalCompositeOperation = 'source-in';\n      ctx.fillStyle = color; ctx.fillRect(0, 0, c.width, c.height);\n      state.maskUrl = c.toDataURL('image/png'); state.maskKey = key;\n      return state.maskUrl;\n    }\n    function originalUrl() {\n      if (!state.img || !state.bbox) return '';\n      if (state.origKey === state.bbox.x + '/' + state.bbox.y && state.origUrl) return state.origUrl;\n      var b = state.bbox, c = document.createElement('canvas'); c.width = b.w; c.height = b.h;\n      c.getContext('2d').drawImage(state.img, b.x, b.y, b.w, b.h, 0, 0, b.w, b.h);\n      state.origUrl = c.toDataURL('image/png'); state.origKey = b.x + '/' + b.y;\n      return state.origUrl;\n    }\n    function printUrl() {\n      // impression : l'original d\u00E9coup\u00E9 \u00E0 sa silhouette (zones fines / creux comme le contour livr\u00E9)\n      if (!state.img || !state.bbox) return '';\n      var key = state.thr + '|' + (state.rework ? 'rw' : 'cl') + '|' + widthCm() + '|' + state.fileName;\n      if (state.printKey === key && state.printUrl) return state.printUrl;\n      var m = cleanedMask(), b = effBbox(), c = document.createElement('canvas'); c.width = b.w; c.height = b.h;\n      var ctx = c.getContext('2d'); ctx.drawImage(m, 0, 0);\n      ctx.globalCompositeOperation = 'source-in'; ctx.fillStyle = '#fff'; ctx.fillRect(0, 0, b.w, b.h);\n      ctx.globalCompositeOperation = 'source-atop'; ctx.drawImage(state.img, b.x, b.y, b.w, b.h, 0, 0, b.w, b.h);\n      state.printUrl = c.toDataURL('image/png'); state.printKey = key;\n      return state.printUrl;\n    }\n    function maskBlob() {\n      return new Promise(function (res) {\n        if (!state.mask || !state.bbox || CREATION) return res(null);\n        var m = cleanedMask(), c = document.createElement('canvas'); c.width = m.width; c.height = m.height;\n        var ctx = c.getContext('2d'); ctx.fillStyle = '#fff'; ctx.fillRect(0, 0, c.width, c.height);\n        ctx.drawImage(m, 0, 0);\n        c.toBlob(function (blob) { res(blob); }, 'image/png');\n      });\n    }\n\n    function traceEps() { return Math.max(1.1, 0.6 * (state.img && state.srcW ? state.img.width / state.srcW : 1)); } // tol\u00E9rance = bruit du pixel source\n    function traceCanvas(c) {\n      var w = c.width, h = c.height, data = c.getContext('2d').getImageData(0, 0, w, h).data, bits = new Uint8Array(w * h), eps = traceEps();\n      for (var p = 0; p < w * h; p++) bits[p] = data[p * 4 + 3] > 127 ? 1 : 0;\n      return traceBits(bits, w, h).filter(function (pts) { return polyArea(pts) >= 4; }).map(function (pts) { return simplify(pts, eps); }).filter(function (pts) { return pts.length >= 6; });\n    }\n    function svgFor(wcm) {\n      // trac\u00E9 du contour livr\u00E9 \u00E0 cette largeur, en unit\u00E9s du masque (origine = coin de la bo\u00EEte englobante effective)\n      var key = String(wcm) + '|' + (state.rework ? 'raw' : 'clean'); if (state.svgBy[key]) return state.svgBy[key];\n      if (!usable()) return null;\n      var c = cleanedMaskAt(wcm), polys = traceCanvas(c), eps = traceEps();\n      var res = { w: c.width, h: c.height, polys: polys, d: polys.map(function (pts) { return curvePath(pts, eps, 1, 1, 0, 0, 2); }).join('') };\n      state.svgBy[key] = res;\n      return res;\n    }\n    function svgText(wcm) {\n      var t = svgFor(wcm); if (!t) return '';\n      var s = (wcm * 10) / t.w, Wmm = wcm * 10, Hmm = t.h * s, ppm = 1 / s;\n      var d = t.polys.map(function (pts) { return curvePath(pts, traceEps(), s, s, 0, 0, 3); }).join('');\n      return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + Wmm.toFixed(2) + 'mm\" height=\"' + Hmm.toFixed(2) + 'mm\" viewBox=\"0 0 ' + Wmm.toFixed(2) + ' ' + Hmm.toFixed(2) + '\">\\n' +\n        '<title>' + esc(state.fileName || 'logo') + ' \u2014 ' + fmtCm(wcm) + ' \u00D7 ' + fmtCm(Hmm / 10) + ' cm</title>\\n' +\n        '<desc>Contour de d\u00E9coupe g\u00E9n\u00E9r\u00E9 par le configurateur Lenidesign. Unit\u00E9s : millim\u00E8tres. ' + (PRINT ? 'Impression couleur HD puis d\u00E9coupe \u00E0 la forme.' : 'D\u00E9coupe 1 couleur.') + ' D\u00E9tails de moins de ' + mmLabel() + ' mm' + (BIT_MM ? ' et creux de moins de ' + mmLabel(BIT_MM) + ' mm' : '') + (state.rework ? ' : \u00E0 retraiter par l\u2019atelier (option choisie).' : ' : retir\u00E9s / combl\u00E9s.') + ' ' + ppm.toFixed(3) + ' px du masque par mm.</desc>\\n' +\n        '<path d=\"' + d + '\" fill=\"#000\" fill-rule=\"evenodd\"/>\\n</svg>\\n';\n    }\n\n    /* \u2500\u2500 Reprise : retraitement en option (d\u00E9tails fins, fichiers en couleurs) \u2500\u2500 */\n    function syncReprise() {\n      if (!REPRISE) return;\n      state.extras.reprise = loaded() && state.rework && (state.grade === 'color' || !state.bbox || simplifiedAt(widthCm()));\n    }\n    mod.onSizeChange = function () { state.sizePicked = true; state.maskUrl = ''; syncReprise(); };\n    mod.extraSub = function (key) {\n      if (key !== 'reprise') return '';\n      return state.grade === 'color' ? 'Votre fichier est ramen\u00E9 en une couleur par l\u2019atelier, trac\u00E9 envoy\u00E9 par email pour accord. Tarif de base ; devis avant travail si le fichier demande davantage.' : 'D\u00E9tails fins redessin\u00E9s par l\u2019atelier pour la largeur choisie, trac\u00E9 envoy\u00E9 par email pour accord.';\n    };\n    function onFile(file, restored) {\n      if (!file) return;\n      var okType = /^(image\\/(png|jpeg|jpg|svg\\+xml|webp)|application\\/pdf)$/i.test(file.type) || /\\.(png|jpe?g|svg|webp|pdf)$/i.test(file.name);\n      if (!okType) { state.fileErr = MSG.fileType; update(); return; }\n      if (file.size > MAX_MB * 1024 * 1024) { state.fileErr = MSG.fileSize; update(); return; }\n      if (!restored) { state.restored = false; touch('upload'); markInteracted(); }\n      state.busy = true; update();\n      processFile(file).then(function () { if (loaded() && !restored) saveHandoff(file); mod.validate(); markComplete(); syncReprise(); update(); });\n    }\n\n    /* \u2500\u2500 Verdict et renvois \u2500\u2500 */\n    function verdictText() {\n      var g = state.grade, extra = state.liveText ? ' Le fichier contient du texte non vectoris\u00E9 : la police est v\u00E9rifi\u00E9e \u00E0 l\u2019atelier avant la d\u00E9coupe.' : '';\n      if (g === 'pending') return { cls: 'pending', title: 'PDF re\u00E7u', sub: 'Aper\u00E7u indisponible dans ce navigateur : nous v\u00E9rifions le fichier \u00E0 l\u2019atelier et vous envoyons l\u2019aper\u00E7u par email pour accord.' };\n      if (CREATION) return { cls: 'ok', title: 'Fichier de base re\u00E7u', sub: 'Notre graphiste s\u2019en inspire pour recr\u00E9er votre logo en vectoriel. Vous recevez une proposition par email et validez avant la livraison des fichiers.' };\n      if (g === 'small') return { cls: 'rework', title: 'Image trop petite pour une d\u00E9coupe propre' + (state.why ? ' (' + state.why + ')' : ''), sub: 'Un logo net demande au moins ' + (PRINT ? Math.max(MIN_PX, PRINT_PX_CM * (widths()[0] ? widths()[0].w : 40)) : MIN_PX) + ' px de large. D\u00E9posez un fichier plus grand, id\u00E9alement vectoriel (SVG, PDF), ou faites recr\u00E9er votre logo par notre graphiste.' };\n      if (g === 'color') return { cls: 'rework', title: 'Fichier en couleurs : ' + state.why, sub: 'Il ne peut pas \u00EAtre d\u00E9coup\u00E9 tel quel en une seule couleur. Deux solutions :' };\n      var sub = state.inverted ? 'Fond sombre : c\u2019est la partie claire qui est d\u00E9coup\u00E9e. ' : '';\n      if (PRINT) return { cls: 'ok', title: g === 'vector' ? 'Fichier vectoriel : impression et d\u00E9coupe fid\u00E8les' : 'Fichier exploitable : impression HD', sub: sub + 'L\u2019aper\u00E7u montre le r\u00E9sultat imprim\u00E9 et la silhouette qui sera d\u00E9coup\u00E9e.' + extra };\n      if (g === 'vector') return { cls: 'ok', title: 'Fichier vectoriel : d\u00E9coupe fid\u00E8le \u00E0 votre trac\u00E9', sub: sub + 'L\u2019aper\u00E7u montre exactement ce qui sera d\u00E9coup\u00E9.' + extra };\n      if (lowRes(widthCm())) return { cls: 'ok', title: 'Fichier exploitable : agrandi et vectoris\u00E9', sub: sub + 'Le contour est trac\u00E9 en courbes lisses \u00E0 partir de votre image : l\u2019aper\u00E7u montre ce qui sera d\u00E9coup\u00E9.' };\n      return { cls: 'ok', title: 'Fichier exploitable : vectoris\u00E9', sub: sub + 'L\u2019aper\u00E7u montre exactement ce qui sera d\u00E9coup\u00E9.' };\n    }\n    function ctaLink(url, label) { return el('a', { class: 'leni-redirect__cta', href: url, text: label }); }\n    function verdict() {\n      if (!loaded() || state.busy || !state.grade) return null;\n      var v = verdictText(), box = el('div', { class: 'leni-verdict leni-verdict--' + v.cls }, [el('strong', { text: v.title }), el('span', { text: v.sub })]);\n      if (state.restored) box.appendChild(el('span', { class: 'leni-verdict__note', text: 'Fichier repris de votre d\u00E9p\u00F4t pr\u00E9c\u00E9dent. D\u00E9posez-en un autre pour le remplacer.' }));\n      if (state.grade === 'small' && L.creation && L.creation.url) {\n        box.appendChild(el('div', { class: 'leni-redirect' }, [\n          el('strong', { text: 'Cr\u00E9ation graphique de votre logo ou pictogramme' + (L.creation.price ? ' \u00B7 ' + formatMoney(L.creation.price) : '') }),\n          el('span', { text: 'Notre graphiste le recr\u00E9e en vectoriel \u00E0 partir de ce fichier. Vous validez la proposition, puis vous commandez la d\u00E9coupe avec le nouveau fichier.' }),\n          ctaLink(L.creation.url, 'Faire cr\u00E9er mon logo')\n        ]));\n      }\n      if (state.grade === 'color') {\n        if (REPRISE) box.appendChild(el('label', { class: 'leni-opt leni-rework' + (state.rework ? ' is-on' : '') }, [\n          el('input', { type: 'checkbox', checked: state.rework ? true : null, onchange: function () { state.rework = this.checked; state.maskUrl = ''; markInteracted(); syncReprise(); mod.validate(); update(); } }),\n          el('span', { class: 'leni-opt__text', html: 'Retraitement du fichier par l\u2019atelier <strong>\u00E0 partir de ' + esc(formatMoney(REPRISE.price)) + '</strong><small>Nous ramenons votre logo en une couleur et redessinons les contours ; trac\u00E9 envoy\u00E9 par email pour accord. Si le fichier demande davantage de travail, nous vous proposons un devis avant de commencer.</small>' })\n        ]));\n        if (L.print && L.print.url) box.appendChild(el('div', { class: 'leni-redirect' }, [\n          el('strong', { text: 'Version imprim\u00E9e couleur HD, d\u00E9coup\u00E9e \u00E0 la forme' }),\n          el('span', { text: 'Votre logo tel quel, couleurs et d\u00E9grad\u00E9s compris, imprim\u00E9 sur PVC blanc 5, 10 ou 19 mm ou Dibond blanc 2 mm. Votre fichier est repris automatiquement.' }),\n          ctaLink(L.print.url, 'Voir la version imprim\u00E9e')\n        ]));\n      }\n      return box;\n    }\n    function detailNote(w) {\n      if (!usable() || !simplifiedAt(w)) return '';\n      var t = thinFor(w), parts = [];\n      if (state.rework) return 'D\u00E9tails fins redessin\u00E9s par l\u2019atelier, trac\u00E9 d\u00E9finitif envoy\u00E9 pour accord.';\n      if (t.thin) parts.push('d\u00E9tails de moins de ' + mmLabel() + ' mm non d\u00E9coup\u00E9s');\n      if (t.gaps) parts.push('creux de moins de ' + mmLabel(BIT_MM) + ' mm combl\u00E9s');\n      var s = parts.join(', ') + ' \u00E0 cette largeur' + (state.minW ? ' \u00B7 fid\u00E8le d\u00E8s ' + fmtCm(state.minW) + ' cm' : '') + '.';\n      return s.charAt(0).toUpperCase() + s.slice(1);\n    }\n    mod.afterSize = function (body) {\n      if (!usable()) return;\n      var w = widthCm();\n      if (PRINT && !defOk(w)) body.appendChild(el('p', { class: 'leni-cfg__error is-visible', text: '\u26A0 D\u00E9finition insuffisante pour ' + fmtCm(w) + ' cm (' + Math.round(srcPxPerCm(w)) + ' px/cm, il en faut ' + PRINT_PX_CM + '). Choisissez une largeur plus petite ou d\u00E9posez un fichier plus d\u00E9fini.' }));\n      if (!REPRISE || !simplifiedAt(w)) return;\n      var t = thinFor(w), what = [];\n      if (t.thin) what.push('les d\u00E9tails de moins de ' + mmLabel() + ' mm sont retir\u00E9s de la d\u00E9coupe');\n      if (t.gaps) what.push('les creux de moins de ' + mmLabel(BIT_MM) + ' mm sont combl\u00E9s');\n      body.appendChild(el('label', { class: 'leni-opt leni-rework' + (state.rework ? ' is-on' : '') }, [\n        el('input', { type: 'checkbox', checked: state.rework ? true : null, onchange: function () { state.rework = this.checked; state.maskUrl = ''; markInteracted(); syncReprise(); update(); } }),\n        el('span', { class: 'leni-opt__text', html: esc(REPRISE.label) + ' <strong>+ ' + esc(formatMoney(REPRISE.price)) + '</strong><small>' + esc('\u00C0 ' + fmtCm(w) + ' cm, ' + what.join(' et ') + (state.minW ? ' (fid\u00E8le d\u00E8s ' + fmtCm(state.minW) + ' cm)' : '') + '. Avec le retraitement, l\u2019atelier les redessine pour qu\u2019ils soient r\u00E9alisables \u00E0 cette largeur, trac\u00E9 envoy\u00E9 par email pour accord.') + '</small>' })\n      ]));\n    };\n    mod.render.upload = function () {\n      var body = bodyOf('upload'); if (!body) return;\n      body.innerHTML = '';\n      var err = state.fileErr || (errors.upload && submitAttempted ? errors.upload : '');\n      var input = el('input', { type: 'file', id: 'leniLogoFile', accept: '.png,.jpg,.jpeg,.svg,.webp,.pdf,image/png,image/jpeg,image/svg+xml,image/webp,application/pdf', class: 'leni-upload__input', onchange: function () { onFile(this.files && this.files[0]); } });\n      var zone = el('label', { class: 'leni-upload' + (err ? ' is-invalid' : '') + (loaded() ? ' has-file' : ''), for: 'leniLogoFile',\n        ondragover: function (e) { e.preventDefault(); this.classList.add('is-drag'); },\n        ondragleave: function () { this.classList.remove('is-drag'); },\n        ondrop: function (e) { e.preventDefault(); this.classList.remove('is-drag'); onFile(e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files[0]); }\n      }, [\n        input,\n        el('span', { class: 'leni-upload__icon', 'aria-hidden': 'true', html: state.busy ? '<span class=\"leni-upload__spin\"></span>' : '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/></svg>' }),\n        el('span', { class: 'leni-upload__text' }, [\n          el('strong', { text: state.busy ? 'Analyse du fichier\u2026' : (loaded() ? (state.fileName || 'Fichier transmis') : (CREATION ? 'D\u00E9posez votre fichier de base ici' : 'D\u00E9posez votre logo ici')) }),\n          el('span', { text: loaded() ? 'Cliquez pour remplacer le fichier' : 'ou parcourez \u00B7 SVG, PDF, PNG, JPG, WEBP \u00B7 ' + MAX_MB + ' Mo max' })\n        ])\n      ]);\n      body.appendChild(zone);\n      if (err) body.appendChild(el('p', { class: 'leni-cfg__error is-visible', text: '\u26A0 ' + err }));\n      var v = verdict(); if (v) body.appendChild(v);\n      if (state.fileUrl && !state.file) body.appendChild(el('p', { class: 'leni-cfg__hint', html: 'Fichier d\u00E9j\u00E0 transmis : <a href=\"' + esc(state.fileUrl) + '\" target=\"_blank\" rel=\"noopener\">' + esc(state.fileName || 'voir le fichier') + '</a>. D\u00E9posez un nouveau fichier pour le remplacer.' }));\n      if (!CREATION && !hasRole('color') && (cfg.palette || []).length) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:14px', text: 'Couleur de la mati\u00E8re' }));\n        renderSwatches(body, (cfg.palette || []).map(function (p) { return p.name; }), state.cut, function (val) { state.cut = val; state.maskUrl = ''; markInteracted(); update(); }, 'Couleur de la mati\u00E8re');\n      }\n    };\n    mod.render.brief = function () {\n      var body = bodyOf('brief'); if (!body) return;\n      body.innerHTML = '';\n      var ta = el('textarea', { id: 'leniField-brief', maxlength: '600', rows: '4', placeholder: 'Nom exact, couleurs souhait\u00E9es, style (moderne, classique, manuscrit\u2026), \u00E9l\u00E9ments \u00E0 garder ou \u00E0 retirer, usage pr\u00E9vu.', oninput: function () { state.brief = stripEmoji(this.value); debounced('brief', function () { markInteracted(); renderRecap(); }); } });\n      ta.value = state.brief || '';\n      body.appendChild(el('div', { class: 'leni-cfg__fieldrow', 'data-field': 'brief' }, [\n        el('label', { for: 'leniField-brief', class: 'leni-cfg__fieldlabel', text: L.briefLabel || 'Vos indications pour le graphiste (facultatif)' }),\n        ta,\n        el('small', { text: '600 caract\u00E8res max. Vous pourrez aussi r\u00E9pondre \u00E0 nos questions par email.' })\n      ]));\n    };\n    mod.validate = function () {\n      errors = {};\n      if (!loaded()) errors.upload = MSG.fileRequired;\n      else if (state.grade === 'small') errors.upload = 'Ce fichier est trop petit : d\u00E9posez un fichier plus grand ou faites cr\u00E9er votre logo.';\n      else if (state.grade === 'color' && !state.rework) errors.upload = 'Choisissez le retraitement par l\u2019atelier ou la version imprim\u00E9e.';\n      else if (PRINT && usable() && !defOk(widthCm())) errors.size = 'D\u00E9finition insuffisante pour cette largeur.';\n      syncReprise();\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.upload && !errors.size && !state.busy; };\n    mod.isComplete = function () { return loaded() && state.grade !== 'small' && (state.grade !== 'color' || state.rework) && (!PRINT || !usable() || defOk(widthCm())); };\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return errors.size ? 'size' : 'upload'; };\n    mod.incompleteLabel = function () {\n      if (state.busy) return 'Analyse du fichier\u2026';\n      if (!loaded()) return CREATION ? 'Ajoutez votre fichier de base' : 'Ajoutez votre logo';\n      if (state.grade === 'small') return 'Fichier trop petit';\n      if (state.grade === 'color') return 'Choisissez retraitement ou impression';\n      if (errors.size) return 'Choisissez une largeur adapt\u00E9e';\n      return 'Ajoutez votre logo';\n    };\n    function shortStatus() {\n      if (state.grade === 'small') return 'trop petit';\n      if (state.grade === 'color') return state.rework ? 'retraitement atelier' : 'en couleurs';\n      if (state.grade === 'pending') return 'v\u00E9rification atelier';\n      if (usable() && simplifiedAt(widthCm())) return state.rework ? 'retraitement atelier' : 'd\u00E9tails simplifi\u00E9s';\n      return state.grade ? (CREATION ? 're\u00E7u' : 'fid\u00E8le') : '';\n    }\n    mod.stepValue = function (key) {\n      if (key === 'upload') { if (!loaded()) return '\u00C0 d\u00E9poser'; var s = shortStatus(); return (state.fileName || 'Fichier transmis') + (s ? ' \u00B7 ' + s : ''); }\n      if (key === 'brief') return state.brief.trim() ? state.brief.trim().slice(0, 40) + (state.brief.trim().length > 40 ? '\u2026' : '') : 'Facultatif';\n      return '';\n    };\n    mod.recapLines = function () {\n      var out = [];\n      out.push({ text: loaded() ? (CREATION ? 'Fichier de base : ' : 'Logo : ') + (state.fileName || 'fichier transmis') : (CREATION ? 'Fichier de base \u00E0 d\u00E9poser' : 'Logo \u00E0 d\u00E9poser'), step: 'upload' });\n      if (CREATION) { if (state.brief.trim()) out.push({ text: 'Indications : ' + state.brief.trim().slice(0, 60) + (state.brief.trim().length > 60 ? '\u2026' : ''), step: 'brief' }); return out; }\n      var d = dims(); if (d) out.push({ text: (ratio() ? 'Dimensions exactes ' : 'Dimensions ') + d, step: 'size' });\n      var n = detailNote(widthCm()); if (n) out.push({ text: n.replace(/\\.$/, ''), step: 'size' });\n      if (L.fixation) out.push({ text: 'Fixation : ' + L.fixation, step: 'size' });\n      return out;\n    };\n    mod.stickySub = function () { return CREATION ? (state.fileName || '') : (state.opt.size || '') + (state.opt.material ? ' \u00B7 ' + state.opt.material : '') + (state.opt.color ? ' \u00B7 ' + state.opt.color : ''); };\n    mod.sizeExtra = function (val) {\n      var m = optionMeta(val), w = m.w || parseCm(val); if (!w || !state.bbox) return '';\n      var h = heightCmAt(w), tag = '', st = 'none';\n      if (usable()) {\n        if (PRINT && !defOk(w)) { tag = 'd\u00E9finition insuffisante'; st = 'warn'; }\n        else if (simplifiedAt(w)) { tag = state.rework ? 'd\u00E9tails retrait\u00E9s' : 'd\u00E9tails < ' + mmLabel(Math.min(MIN_MM, BIT_MM || MIN_MM)) + ' mm simplifi\u00E9s'; st = state.rework ? 'ok' : 'simplified'; }\n        else { tag = 'fid\u00E8le'; st = 'ok'; }\n      }\n      return { h: 'hauteur ' + fmtCm(h) + ' cm', tag: tag, state: st };\n    };\n    mod.stepDone = function (key) { if (key === 'upload') return mod.isComplete(); if (key === 'brief') return !!state.brief.trim(); return !!state.opt[key]; };\n    mod.views = function () { return REG === 'pro' && !CREATION ? [{ key: 'plan', label: 'Plan cot\u00E9' }, { key: 'wall', label: 'Sur un mur' }] : []; };\n    function matName() { var t = (cfg.product && cfg.product.title) || ''; var m = t.match(/(PVC(?:\\s+expans\\S*)?\\s+\\d+\\s*mm|Dibond\\s+\\d+\\s*mm)/i); return m ? m[1].replace(/\\s+/g, ' ') : ''; }\n    mod.readout = function () {\n      if (REG !== 'pro' || CREATION) return [];\n      var out = [{ label: 'Largeur', value: fmtCm(widthCm()) + ' cm' }, { label: 'Hauteur', value: state.bbox && ratio() ? fmtCm(heightCm()) + ' cm' : '\u2014' }];\n      var mat = PRINT ? (state.opt.material || '') : matName(); if (mat) out.push({ label: 'Mati\u00E8re', value: mat });\n      if (BIT_MM) out.push({ label: 'Fraise', value: '\u00D8 ' + mmLabel(BIT_MM) + ' mm' });\n      return out;\n    };\n    function isLightHex(hex) { var m = /^#?([0-9a-f]{6})$/i.exec(hex || ''); if (!m) return true; var n = parseInt(m[1], 16), r = n >> 16, g = (n >> 8) & 255, b = n & 255; return (0.299 * r + 0.587 * g + 0.114 * b) > 150; }\n    mod.lightBg = function () { return true; };\n    mod.preview = function () {\n      var W = 1200, H = 800, wallCm = L.wallCm || 100, lc = '#1A1A1A';\n      var plan = REG === 'pro' && !CREATION && state.view !== 'wall';\n      var slate = plan && (PRINT || isLightHex(cutHex())), stageBg = slate ? '#2F3E4E' : '#E9E6E0', gridCol = slate ? 'rgba(255,255,255,0.07)' : 'rgba(26,26,26,0.07)';\n      if (plan) lc = slate ? '#F5F1EA' : '#1A1A1A';\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"' + (plan ? 'Plan cot\u00E9 de votre logo' : 'Aper\u00E7u de votre logo sur un mur') + '\">', defs()];\n      if (plan) {\n        out.push('<defs><pattern id=\"leniGrid\" width=\"40\" height=\"40\" patternUnits=\"userSpaceOnUse\"><path d=\"M40 0H0V40\" fill=\"none\" stroke=\"' + gridCol + '\" stroke-width=\"1\"/></pattern></defs>');\n        out.push('<rect width=\"' + W + '\" height=\"' + H + '\" fill=\"' + stageBg + '\"/><rect width=\"' + W + '\" height=\"' + H + '\" fill=\"url(#leniGrid)\"/>');\n      } else {\n        out.push('<defs><linearGradient id=\"leniWall\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#DDD6C9\"/><stop offset=\"1\" stop-color=\"#C6BCAC\"/></linearGradient></defs>',\n          '<rect width=\"' + W + '\" height=\"' + H + '\" fill=\"url(#leniWall)\"/>',\n          '<rect x=\"0\" y=\"' + (H - 70) + '\" width=\"' + W + '\" height=\"70\" fill=\"#A69C8C\"/>');\n      }\n      var floor = plan ? 0 : 70;\n      var wcm = CREATION || !hasRole('size') ? 40 : widthCm(), lw = Math.min(W * (plan ? 0.72 : 0.86), W * wcm / wallCm), r = ratio();\n      var traced = usable() && !CREATION && !PRINT ? svgFor(wcm) : null;\n      var href = !state.bbox ? '' : (traced ? '' : (PRINT && usable() ? printUrl() : originalUrl()));\n      if ((href || traced) && r) {\n        var lh = lw * r; if (lh > H * (plan ? 0.62 : 0.7)) { lh = H * (plan ? 0.62 : 0.7); lw = lh / r; }\n        var x = (W - lw) / 2 - (plan ? 30 : 0), y = (H - floor - lh) / 2 - (plan ? 20 : 0);\n        if (traced) out.push('<path d=\"' + traced.d + '\" fill=\"' + cutHex() + '\" fill-rule=\"evenodd\" transform=\"translate(' + x.toFixed(1) + ' ' + y.toFixed(1) + ') scale(' + (lw / traced.w).toFixed(5) + ')\"' + (plan ? '' : ' filter=\"url(#leniShadow)\"') + '/>');\n        else out.push('<image href=\"' + href + '\" x=\"' + x.toFixed(1) + '\" y=\"' + y.toFixed(1) + '\" width=\"' + lw.toFixed(1) + '\" height=\"' + lh.toFixed(1) + '\" preserveAspectRatio=\"xMidYMid meet\"' + (plan ? '' : ' filter=\"url(#leniShadow)\"') + '/>');\n        if (!CREATION && hasRole('size')) {\n          if (ratio()) out.push(dimLines({ x: x, y: y, w: lw, h: lh, wcm: wcm, hcm: heightCm(), ink: lc, bg: plan ? stageBg : '#F7F5F1', plan: plan, fs: plan ? 24 : 22 }));\n          else out.push('<text x=\"' + (W / 2) + '\" y=\"' + (y + lh + 56).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"26\" fill=\"' + lc + '\" fill-opacity=\"0.8\">' + esc(dims()) + '</text>');\n          if (plan && traced) out.push('<g transform=\"translate(28 28)\"><rect width=\"214\" height=\"40\" rx=\"8\" fill=\"#2C5F5A\"/><text x=\"107\" y=\"27\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"18\" font-weight=\"700\" letter-spacing=\"0.06\" fill=\"#fff\">CONTOUR EXACT</text></g>');\n          var note = '';\n          if (state.grade === 'color') note = state.rework ? 'Retraitement par l\u2019atelier \u00B7 trac\u00E9 d\u00E9finitif envoy\u00E9 pour accord' : 'Aper\u00E7u de votre fichier \u00B7 non d\u00E9coupable tel quel en une couleur';\n          else if (state.grade === 'small') note = 'Fichier trop petit pour une d\u00E9coupe propre';\n          else if (PRINT && !defOk(wcm)) note = 'D\u00E9finition insuffisante \u00E0 cette largeur';\n          else note = detailNote(wcm).replace(/\\.$/, '') || (lowRes(wcm) ? 'Contour trac\u00E9 en courbes lisses \u00E0 partir de votre image' : '');\n          if (note) out.push('<text x=\"' + (W / 2) + '\" y=\"' + (y + lh + (plan ? 100 : 88)).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"21\" fill=\"' + lc + '\" fill-opacity=\"0.6\">' + esc(note) + '</text>');\n        } else if (CREATION) {\n          out.push('<text x=\"' + (W / 2) + '\" y=\"' + (y + lh + 56).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.7\">Votre fichier de base \u00B7 le logo est recr\u00E9\u00E9 en vectoriel par notre graphiste</text>');\n        }\n      } else {\n        out.push('<rect x=\"' + ((W - lw) / 2).toFixed(1) + '\" y=\"' + (H / 2 - lw * 0.25).toFixed(1) + '\" width=\"' + lw.toFixed(1) + '\" height=\"' + (lw * 0.5).toFixed(1) + '\" rx=\"10\" fill=\"none\" stroke=\"' + lc + '\" stroke-opacity=\"0.35\" stroke-dasharray=\"14 10\" stroke-width=\"3\"/>');\n        out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H / 2 + 8) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"28\" fill=\"' + lc + '\" fill-opacity=\"0.6\">' + esc(state.grade === 'pending' ? 'PDF re\u00E7u \u00B7 v\u00E9rification \u00E0 l\u2019atelier' : (state.busy ? 'Analyse du fichier\u2026' : (CREATION ? 'Votre fichier de base appara\u00EEtra ici' : 'Votre logo appara\u00EEtra ici \u00B7 ' + fmtCm(wcm) + ' cm de large'))) + '</text>');\n      }\n      out.push('</svg>');\n      return out.join('');\n    };\n    function fileStatus() {\n      if (state.grade === 'pending') return 'PDF, v\u00E9rification atelier';\n      if (state.grade === 'small') return 'Trop petit (' + (state.why || '') + ')';\n      if (state.grade === 'color') return 'En couleurs (' + (state.why || '') + ')' + (state.rework ? ', retraitement atelier' : '');\n      var s = '';\n      if (state.grade === 'vector') s = 'Vectoriel, fid\u00E8le';\n      else if (state.grade === 'clean') s = CREATION ? 'Fichier de base' : (lowRes(widthCm()) ? 'Image agrandie, contour trac\u00E9' : 'Image, contour trac\u00E9');\n      if (state.liveText) s += ', texte non vectoris\u00E9 \u00E0 v\u00E9rifier';\n      return s;\n    }\n    mod.properties = function () {\n      var p = {};\n      if (CREATION) { if (state.brief.trim()) p['Indications'] = state.brief.trim(); var f0 = fileStatus(); if (f0) p['Fichier'] = f0; if (!state.file && state.fileUrl) p['Fichier de base'] = state.fileUrl; return p; }\n      if (!hasRole('color') && state.cut) p['Couleur de la mati\u00E8re'] = state.cut;\n      if (L.fixation) p['Fixation'] = L.fixation;\n      var d = dims(); if (d) p['Dimensions'] = d;\n      var fs = fileStatus(); if (fs) p['Fichier'] = fs;\n      if (usable() && simplifiedAt(widthCm())) {\n        var t = thinFor(widthCm()), what = [];\n        if (t.thin) what.push(t.thin + ' d\u00E9tail' + (t.thin > 1 ? 's' : '') + ' < ' + mmLabel() + ' mm');\n        if (t.gaps) what.push(t.gaps + ' creux < ' + mmLabel(BIT_MM) + ' mm');\n        p['D\u00E9tails fins'] = what.join(', ') + ' \u00E0 ' + fmtCm(widthCm()) + ' cm : ' + (state.rework ? '\u00E0 redessiner par l\u2019atelier (retraitement)' : 'retir\u00E9s / combl\u00E9s dans le trac\u00E9') + (state.minW ? ' (fid\u00E8le d\u00E8s ' + fmtCm(state.minW) + ' cm)' : '');\n      }\n      if (state.inverted) p['Fond'] = 'Fond sombre : partie claire d\u00E9coup\u00E9e';\n      if (!state.file && state.fileUrl) p['Logo'] = state.fileUrl;\n      // Fichiers de production (pr\u00E9fixe \u00AB _ \u00BB : masqu\u00E9s c\u00F4t\u00E9 client dans le panier, au checkout et dans les emails, visibles dans l'admin).\n      // En modification sans nouveau d\u00E9p\u00F4t, on reprend les fichiers d\u00E9j\u00E0 joints \u00E0 la ligne (anciennes cl\u00E9s sans \u00AB _ \u00BB accept\u00E9es).\n      if (!state.file && editProps) {\n        var prevMask = editProps['_Logo 1 couleur'] || editProps['Logo 1 couleur'], prevCut = editProps['_Logo d\u00E9coupe'] || editProps['Logo d\u00E9coupe'];\n        if (prevMask) p['_Logo 1 couleur'] = prevMask;\n        if (prevCut) p['_Logo d\u00E9coupe'] = prevCut;\n      }\n      return p;\n    };\n    mod.files = function () {\n      var out = [];\n      if (state.file) out.push({ prop: CREATION ? 'Fichier de base' : 'Logo', blob: state.file, name: state.fileName });\n      if (state.maskFile) out.push({ prop: '_Logo 1 couleur', blob: state.maskFile, name: 'logo-1-couleur.png' });\n      if (state.svgFile) out.push({ prop: '_Logo d\u00E9coupe', blob: state.svgFile, name: 'logo-decoupe-' + String(widthCm()).replace('.', ',') + 'cm.svg' });\n      return out;\n    };\n    mod.beforeAdd = function () {\n      state.maskFile = null; state.svgFile = null;\n      if (!state.file || CREATION) return null;\n      if (usable()) { var s = svgText(widthCm()); if (s) state.svgFile = new Blob([s], { type: 'image/svg+xml' }); }\n      return maskBlob().then(function (b) { if (b) state.maskFile = b; });\n    };\n    mod.compact = function () { return { v: 5, k: 'logo', o: state.opt, cu: state.cut, n: state.fileName, d: dims(), r: ratio() ? Math.round(ratio() * 1000) / 1000 : 0, g: state.grade, y: state.why, rw: state.rework ? 1 : 0, mw: state.minW, lt: state.liveText ? 1 : 0, b: state.brief || '' }; };\n    mod.apply = function (c, props) {\n      applyOpts(c.o);\n      if (c.cu) state.cut = c.cu;\n      state.rework = !!c.rw; state.sizePicked = true; state.brief = c.b || ''; state.liveText = !!c.lt;\n      var fileProp = props && (props['Logo'] || props['Fichier de base']);\n      if (fileProp && /^https?:/.test(fileProp)) { state.fileUrl = fileProp; state.fileName = c.n || fileProp.split('/').pop(); }\n      if (c.r) state.bbox = { x: 0, y: 0, w: 1000, h: Math.round(1000 * c.r) };\n      state.grade = c.g || (c.q === 0 ? 'color' : 'clean'); state.why = c.y || ''; state.minW = c.mw || 0;\n    };\n    mod.fontsToLoad = function () { return []; };\n    if (/^(localhost|127\\.0\\.0\\.1)$/.test(location.hostname)) window.leniLogoDebug = function () { return { state: state, thinFor: thinFor, widths: widths, cleanedMaskAt: cleanedMaskAt, svgText: svgText }; };\n    return mod;\n  })();\n\n  /* \u2500\u2500 PLAQUE LENIVA : mod\u00E8le TOP / CLASSIC / BASIC, 1 ligne, 3 styles, lettres Or ou Argent \u2500\u2500 */\n  KINDS.plaque = (function () {\n    var P = cfg.plaque || {};\n    var FONTS = (P.fonts && P.fonts.length) ? P.fonts : [\n      { key: 'script', label: 'Script', family: 'Yellowtail', weight: 400 },\n      { key: 'sans', label: 'Moderne', family: 'Montserrat', weight: 700 },\n      { key: 'serif', label: 'Classique', family: 'Playfair Display', weight: 600 }\n    ];\n    var SPACERS = P.spacers && P.spacers.length ? P.spacers : ['Argent satin\u00E9', 'Noir', 'Blanc'];\n    var FINISHES = P.finishes && P.finishes.length ? P.finishes : ['Brillant', 'Mat'];\n    var MAX = P.max1 || 18, WCM = P.w || 28, HCM = P.h || 8;\n    /* d\u00E9mo avant saisie : textes d'exemple, style et couleur des lettres qui tournent (aper\u00E7u seulement, les choix du client restent) */\n    var DEMO_TEXTS = ['Bienvenue', 'Salle de r\u00E9union', 'Dr Martin', 'Studio 4', 'Accueil', 'Cabinet Dupont', 'Bureau 12', 'Lenidesign'];\n    var demo = makeDemo({ list: DEMO_TEXTS, idle: function () { return !state.text.trim(); }, set: function (n) {\n      demo.fontKey = FONTS[n % FONTS.length].key;\n      var cols = hasRole('color') ? roleValues('color') : (cfg.palette || []).map(function (p) { return p.name; });\n      demo.color = cols.length ? cols[n % cols.length] : '';\n    } });\n    var mod = {\n      inlineFirst: true, // le champ texte est l'\u00E9tape 1, ouverte (aussi sur mobile)\n      steps: ['text', 'model', 'font', 'color'].filter(function (k) { return (k !== 'model' || hasRole('model')) && (k !== 'color' || hasRole('color') || (cfg.palette || []).length); }),\n      labels: { model: roleLabel('model') || 'Mod\u00E8le', text: 'Votre texte', font: 'Style d\u2019\u00E9criture', color: hasRole('color') ? roleLabel('color') : 'Couleur des lettres' },\n      mainStep: 'text',\n      render: {},\n      init: function () { state.text = ''; state.fontKey = FONTS[0].key; state.spacer = SPACERS[0]; state.finish = FINISHES[0]; state.color = (cfg.palette && cfg.palette[0] && cfg.palette[0].name) || ''; setTimeout(demo.start, 400); }\n    };\n    function modelKey() { var m = String(state.opt.model || '').toUpperCase(); return /TOP/.test(m) ? 'top' : (/BASIC/.test(m) ? 'basic' : 'classic'); }\n    function fontByKey(key) { return FONTS.filter(function (f) { return f.key === key; })[0] || FONTS[0]; }\n    function font() { return fontByKey(state.fontKey); }\n    function lettersColor() { return hasRole('color') ? state.opt.color : state.color; }\n    mod.afterModel = function (body) {\n      var mk = modelKey();\n      if (mk !== 'basic' && FINISHES.length > 1) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:14px', text: 'Finition du plexiglas' }));\n        chips(body, FINISHES, state.finish, function (v) { state.finish = v; markInteracted(); update(); }, 'Finition du plexiglas');\n      }\n      if (mk === 'top' && SPACERS.length) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:14px', text: 'Coloris des entretoises' }));\n        chips(body, SPACERS, state.spacer, function (v) { state.spacer = v; markInteracted(); update(); }, 'Coloris des entretoises');\n      }\n    };\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Un pr\u00E9nom, un nom, une pi\u00E8ce : une seule ligne. La taille des lettres est adapt\u00E9e par nos designers pour un rendu optimal.' }));\n      var e1 = errors.text && (submitAttempted || touchedKeys.text) ? errors.text : (state.text.length > MAX ? MSG.tooLong : '');\n      body.appendChild(textField({ key: 'ptext', label: 'Votre texte', placeholder: 'Ex. Lenidesign, Bienvenue, Salle de r\u00E9union', max: MAX, value: state.text, err: e1, required: true,\n        onInput: function (v) { state.text = v; touch('text'); if (v.trim()) demo.stop(); debounced('ptext', function () { markInteracted(); mod.validate(); markComplete(); patchField('ptext', errors.text, MAX + ' caract\u00E8res max.'); updateLight(); }); },\n        onBlur: function () { mod.validate(); patchField('ptext', (submitAttempted || touchedKeys.text) ? errors.text : '', MAX + ' caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); } }));\n    };\n    mod.render.font = function () {\n      var body = bodyOf('font'); if (!body) return;\n      body.innerHTML = '';\n      var grid = el('div', { class: 'leni-fonts leni-fonts--styles', role: 'radiogroup', 'aria-label': 'Style d\u2019\u00E9criture' });\n      FONTS.forEach(function (f) {\n        grid.appendChild(el('button', { type: 'button', class: 'leni-font-card' + (state.fontKey === f.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.fontKey === f.key ? 'true' : 'false', onclick: function () { state.fontKey = f.key; markInteracted(); loadFonts([f]).then(renderPreview); update(); } }, [\n          el('span', { class: 'leni-font-card__sample', style: 'font-family:\"' + f.family + '\", serif; font-weight:' + f.weight, text: state.text.trim() || 'Lenidesign' }),\n          el('span', { class: 'leni-font-card__name', text: f.label })\n        ]));\n      });\n      body.appendChild(grid);\n    };\n    mod.render.color = function () {\n      var body = bodyOf('color'); if (!body) return;\n      body.innerHTML = '';\n      if (hasRole('color')) renderSwatches(body, roleValues('color'), state.opt.color, function (val) { state.opt.color = val; markInteracted(); update(); }, roleLabel('color'));\n      else renderSwatches(body, (cfg.palette || []).map(function (p) { return p.name; }), state.color, function (val) { state.color = val; markInteracted(); update(); }, 'Couleur des lettres');\n      body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:12px', text: cfg.colorHint || 'Lettres en bois 5 mm d\u00E9coup\u00E9es au laser, peinture m\u00E9tallis\u00E9e.' }));\n    };\n    mod.validate = function () {\n      errors = {};\n      if (!state.text.trim()) errors.text = MSG.line1Required;\n      else if (state.text.length > MAX) errors.text = MSG.tooLong;\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.text; };\n    mod.isComplete = mod.isValid;\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return 'text'; };\n    mod.incompleteLabel = function () { return !state.text.trim() ? 'Indiquez votre texte' : 'Raccourcissez votre texte'; };\n    mod.stepValue = function (key) {\n      if (key === 'text') return state.text.trim() || '\u00C0 saisir';\n      if (key === 'font') return font().label;\n      return '';\n    };\n    mod.fontValue = function () { return font().label; };\n    mod.recapLines = function () {\n      var out = [], mk = modelKey();\n      if (state.text.trim()) out.push({ text: state.text.trim() + ' \u00B7 ' + font().label, step: 'text' });\n      if (mk !== 'basic') out.push({ text: 'Plexiglas noir ' + state.finish.toLowerCase() + (mk === 'top' ? ' \u00B7 entretoises ' + state.spacer.toLowerCase() : ' \u00B7 double face pro'), step: 'model' });\n      else out.push({ text: 'Lettres seules \u00B7 double face pro + gabarit de pose', step: 'model' });\n      out.push({ text: 'Dimensions ' + fmtCm(WCM) + ' \u00D7 ' + fmtCm(HCM) + ' cm', step: 'model' });\n      return out;\n    };\n    mod.stickySub = function () { return (state.opt.model || '') + ' \u00B7 ' + (lettersColor() || ''); };\n    mod.lightBg = function () { return true; };\n    mod.preview = function () {\n      var dm = demo.active(), mk = modelKey(), f = dm && demo.fontKey ? fontByKey(demo.fontKey) : font(), txt = state.text.trim() || (dm ? demo.text() : 'Lenidesign'), W = 1000, pad = 70;\n      var pw = W - pad * 2, ph = pw * HCM / WCM, H = ph + pad * 2;\n      var fill = svgFill((dm && demo.color) || lettersColor() || 'Argent');\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre plaque de porte\">', defs()];\n      if (mk !== 'basic') {\n        out.push('<rect x=\"' + pad + '\" y=\"' + pad + '\" width=\"' + pw + '\" height=\"' + ph.toFixed(1) + '\" rx=\"10\" fill=\"url(#leniPlexi)\" filter=\"url(#leniShadow)\"/>');\n        if (state.finish === 'Brillant') out.push('<path d=\"M' + pad + ' ' + pad + ' L' + (pad + pw * 0.55) + ' ' + pad + ' L' + (pad + pw * 0.15) + ' ' + (pad + ph) + ' L' + pad + ' ' + (pad + ph) + ' Z\" fill=\"#fff\" fill-opacity=\"0.06\"/>');\n      }\n      var maxW = mk === 'top' ? pw * 0.7 : pw * 0.82;\n      var S = Math.min(ph * 0.64, fitSize(txt, f.family, f.weight, 200, maxW));\n      out.push('<text x=\"' + (W / 2) + '\" y=\"' + (pad + ph / 2 + S * 0.34).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"\\'' + esc(f.family) + '\\', serif\" font-weight=\"' + f.weight + '\" font-size=\"' + S.toFixed(1) + '\" fill=\"' + fill + '\" filter=\"url(#leniShadowSoft)\"' + (state.text.trim() ? '' : (dm ? ' fill-opacity=\"' + demo.alpha.toFixed(2) + '\"' : ' fill-opacity=\"0.6\"')) + '>' + esc(txt) + '</text>');\n      if (mk === 'top') {\n        var sc = /noir/i.test(state.spacer) ? '#1A1A1A' : (/blanc/i.test(state.spacer) ? '#F2F2F2' : 'url(#leniSilver)');\n        [pad + pw * 0.06, pad + pw * 0.94].forEach(function (cx) { out.push('<circle cx=\"' + cx.toFixed(1) + '\" cy=\"' + (pad + ph / 2).toFixed(1) + '\" r=\"' + (ph * 0.11).toFixed(1) + '\" fill=\"' + sc + '\" stroke=\"rgba(0,0,0,0.35)\" stroke-width=\"1.5\"/>'); });\n      }\n      out.push('</svg>');\n      return out.join('');\n    };\n    mod.properties = function () {\n      var mk = modelKey();\n      var p = { 'Texte': state.text.trim(), 'Style': font().label + ' (' + font().family + ')' };\n      if (!hasRole('color') && state.color) p['Couleur des lettres'] = state.color;\n      if (mk !== 'basic') p['Finition plexiglas'] = state.finish;\n      if (mk === 'top') p['Entretoises'] = state.spacer;\n      p['Dimensions'] = fmtCm(WCM) + ' \u00D7 ' + fmtCm(HCM) + ' cm';\n      return p;\n    };\n    mod.compact = function () { return { v: 2, k: 'plaque', o: state.opt, a: state.text, fk: state.fontKey, sp: state.spacer, fi: state.finish, c: state.color }; };\n    mod.apply = function (c) {\n      applyOpts(c.o);\n      if (typeof c.a === 'string') state.text = c.a;\n      if (c.fk && FONTS.some(function (f) { return f.key === c.fk; })) state.fontKey = c.fk;\n      if (c.sp) state.spacer = c.sp; if (c.fi) state.finish = c.fi; if (c.c) state.color = c.c;\n    };\n    mod.fontsToLoad = function () { return FONTS.map(function (f) { return { family: f.family, weight: f.weight }; }); };\n    return mod;\n  })();\n\n  /* \u2500\u2500 PR\u00C9NOM : pr\u00E9nom (\u00E9tape 1 ouverte), taille (variante), police (r\u00E9glage font_list comme le pr\u00E9nom 2 couleurs, ou variante\n     \u00AB Polices d'\u00E9criture \u00BB si le produit en a encore une), couleur (variante). D\u00E9mo avant saisie. \u2500\u2500 */\n  KINDS.prenom = (function () {\n    var N = cfg.prenom || {}, MAX = N.maxChars || 20;\n    var FONT_STEP = !hasRole('fontopt') && (cfg.fonts || []).length > 0;\n    var DEMO_NAMES = ['L\u00E9a', 'Th\u00E9o', 'Louis', 'Manon', 'Gabin', '\u00C9lo\u00EFse', 'Arthur', 'Ambre', 'No\u00E9', 'Jade', 'Paul', 'Lina', 'Augustin', 'Chlo\u00E9', 'Na\u00EBl', 'Margaux'];\n    var DEMO_COLORS = ['Noir', 'Bleu roi', 'Rouge', 'Vert for\u00EAt', 'Rose', 'Or m\u00E9tallis\u00E9', 'Turquoise', 'Violet', 'Blanc', 'Orange'];\n    var demo = makeDemo({ list: DEMO_NAMES, idle: function () { return !state.name.trim(); }, set: function (n) {\n      var fonts = FONT_STEP ? (cfg.fonts || []).slice(0, 8) : roleValues('fontopt'), all = roleValues('color'), cols = DEMO_COLORS.filter(function (c) { return all.indexOf(c) >= 0; });\n      if (!cols.length) cols = all;\n      demo.font = fonts.length ? fonts[n % fonts.length] : ''; demo.color = cols.length ? cols[n % cols.length] : state.opt.color;\n      if (demo.font) loadFonts([fontFor(demo.font)]);\n    } });\n    var mod = {\n      inlineFirst: true, // le champ pr\u00E9nom est l'\u00E9tape 1, ouverte (aussi sur mobile)\n      steps: ['text', 'size', FONT_STEP ? 'font' : 'fontopt', 'color'].filter(function (k) { return k === 'text' || k === 'font' || hasRole(k); }),\n      labels: { size: (cfg.labels && cfg.labels.size) || 'Longueur', text: 'Votre pr\u00E9nom', fontopt: 'Police d\u2019\u00E9criture', font: 'Police d\u2019\u00E9criture', color: roleLabel('color') || 'Couleur' },\n      mainStep: 'text',\n      render: {},\n      init: function () {\n        state.name = '';\n        if (FONT_STEP && (!state.font || (cfg.fonts || []).indexOf(state.font) < 0)) state.font = cfg.defaultFont || cfg.fonts[0];\n        OT.ensureFont(fontUser().family); OT.ensureClipper(); // contours exacts du fichier de d\u00E9coupe\n        setTimeout(demo.start, 400);\n      }\n    };\n    function fontNow() { return demo.active() && demo.font ? demo.font : (FONT_STEP ? state.font : state.opt.fontopt); }\n    function colorNow() { return demo.active() && demo.color ? demo.color : state.opt.color; }\n    function fontFor(val) {\n      var v = val || fontNow();\n      if (FONT_STEP) return { family: v, weight: fontWeightFor(v) };\n      var m = optionMeta(v), fam = m.font || 'Courgette', parts = fam.split(':'); return { family: parts[0].trim(), weight: parseInt(parts[1], 10) || 400 };\n    }\n    function fontUser() { return FONT_STEP ? { family: state.font, weight: fontWeightFor(state.font) } : fontFor(state.opt.fontopt); } // police choisie, hors d\u00E9mo\n    function cleanLabel(val) { return String(val || '').replace(/^\\s*num[\u00E9e]ro\\s*\\d+\\s*[_\u2013-]\\s*/i, '').trim(); }\n    function fontName() { return FONT_STEP ? state.font : cleanLabel(state.opt.fontopt); }\n    function widthCm() { var m = optionMeta(state.opt.size); if (m.w) return m.w; return parseCm(state.opt.size) || 20; }\n    function heightCm(w) {\n      // largeur command\u00E9e = largeur d'encre du pr\u00E9nom (comme le pr\u00E9nom 2 couleurs et le fichier de d\u00E9coupe), pas la chasse\n      var t = state.name.trim() || 'Pr\u00E9nom', f = fontUser();\n      mctx.font = f.weight + ' 100px \"' + f.family + '\", cursive';\n      var m = mctx.measureText(t), asc = m.actualBoundingBoxAscent, desc = m.actualBoundingBoxDescent;\n      if (!(asc >= 0)) asc = 72; if (!(desc >= 0)) desc = 22;\n      var ink = (m.actualBoundingBoxLeft >= 0 && m.actualBoundingBoxRight > 0) ? m.actualBoundingBoxLeft + m.actualBoundingBoxRight : m.width;\n      return ink ? (w || widthCm()) * (asc + desc) / ink : 0;\n    }\n    function dims() { var h = heightCm(); return h ? fmtCm(widthCm()) + ' \u00D7 ' + fmtCm(h) + ' cm' : ''; }\n    mod.optLabel = function (role, val) { return role === 'fontopt' ? cleanLabel(val) : val; };\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Le texte est reproduit exactement tel que vous l\u2019\u00E9crivez : v\u00E9rifiez les majuscules et les accents.' }));\n      var e1 = errors.text && (submitAttempted || touchedKeys.text) ? errors.text : (state.name.length > MAX ? MSG.tooLong : '');\n      body.appendChild(textField({ key: 'pname', label: 'Pr\u00E9nom ou mot', placeholder: 'Ex. L\u00E9a', max: MAX, value: state.name, err: e1, required: true,\n        onInput: function (v) { state.name = v; touch('text'); if (v.trim()) demo.stop(); debounced('pname', function () { markInteracted(); mod.validate(); markComplete(); patchField('pname', errors.text, MAX + ' caract\u00E8res max.'); if (hasRole('size')) RENDER.size(); if (FONT_STEP) RENDER.font(); updateLight(); }); },\n        onBlur: function () { mod.validate(); patchField('pname', (submitAttempted || touchedKeys.text) ? errors.text : '', MAX + ' caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); } }));\n      var d = dims(); body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniTextDims', text: d ? 'Dimensions finales ' + d : '' }));\n    };\n    mod.render.fontopt = function () {\n      var body = bodyOf('fontopt'); if (!body) return;\n      body.innerHTML = '';\n      var grid = el('div', { class: 'leni-fonts', role: 'radiogroup', 'aria-label': 'Police d\u2019\u00E9criture' });\n      roleValues('fontopt').forEach(function (val) {\n        var f = fontFor(val);\n        grid.appendChild(el('button', { type: 'button', class: 'leni-font-card' + (state.opt.fontopt === val ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.opt.fontopt === val ? 'true' : 'false', onclick: function () { state.opt.fontopt = val; markInteracted(); loadFonts([f]).then(renderPreview); update(); } }, [\n          el('span', { class: 'leni-font-card__sample', style: 'font-family:\"' + f.family + '\", cursive; font-weight:' + f.weight, text: state.name.trim() || 'Pr\u00E9nom' }),\n          el('span', { class: 'leni-font-card__name', text: cleanLabel(val) })\n        ]));\n      });\n      body.appendChild(grid);\n    };\n    /* \u00E9tape Police partag\u00E9e (font_list) */\n    mod.pickFont = function (fam) { state.font = fam; OT.ensureFont(fam); };\n    mod.fontCurrent = function () { return state.font; };\n    mod.fontSample = function () { return state.name.trim() || 'Pr\u00E9nom'; };\n    mod.fontValue = function () { return state.font; };\n    mod.fontHint = function () { return 'La police du pr\u00E9nom.'; };\n    mod.validate = function () {\n      errors = {};\n      if (!state.name.trim()) errors.text = 'Indiquez le pr\u00E9nom.';\n      else if (state.name.length > MAX) errors.text = MSG.tooLong;\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.text; };\n    mod.isComplete = mod.isValid;\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return 'text'; };\n    mod.incompleteLabel = function () { return !state.name.trim() ? 'Indiquez le pr\u00E9nom' : 'Raccourcissez le texte'; };\n    mod.stepValue = function (key) { if (key === 'text') return state.name.trim() || '\u00C0 saisir'; if (key === 'font') return state.font; return ''; };\n    mod.recapLines = function () { var out = []; if (state.name.trim()) out.push({ text: state.name.trim() + ' \u00B7 ' + fontName(), step: 'text' }); var d = dims(); if (d) out.push({ text: 'Dimensions exactes ' + d, step: 'size' }); return out; };\n    mod.stickySub = function () { return (state.opt.size || '') + (state.opt.color ? ' \u00B7 ' + state.opt.color : ''); };\n    mod.sizeExtra = function (val) { var m = optionMeta(val); var w = m.w || parseCm(val); var h = heightCm(w); return h && state.name.trim() ? 'hauteur ' + fmtCm(h) + ' cm' : ''; };\n    mod.lightBg = function () { var c = colorNow() || ''; return isDark(hexFor(c, '#F5F1EA')) && !isGold(c) && !isSilver(c) && !isHolo(c); };\n    mod.preview = function () {\n      var dm = demo.active(), f = fontFor(), real = !!state.name.trim(), txt = real ? state.name.trim() : (dm ? demo.text() : 'Pr\u00E9nom'), W = 1000, pad = 70;\n      var right = real ? 80 : 0, bw = measure(txt, f.family, f.weight, 100), k = (W - pad * 2 - right) / Math.max(bw, 1), S = Math.min(100 * k, 420), H = S * 1.3 + pad * 2 + 60;\n      var lc = mod.lightBg() ? '#1A1A1A' : '#F5F1EA', cx = pad + bw * k / 2;\n      mctx.font = f.weight + ' 100px \"' + f.family + '\", cursive'; var mm = mctx.measureText(txt), asc = mm.actualBoundingBoxAscent >= 0 ? mm.actualBoundingBoxAscent : 72, desc = mm.actualBoundingBoxDescent >= 0 ? mm.actualBoundingBoxDescent : 22;\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre sticker pr\u00E9nom\">', defs()];\n      out.push('<text x=\"' + cx.toFixed(1) + '\" y=\"' + (pad + S * 0.95).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"\\'' + esc(f.family) + '\\', cursive\" font-weight=\"' + f.weight + '\" font-size=\"' + S.toFixed(1) + '\" fill=\"' + svgFill(colorNow()) + '\"' + (real ? '' : (dm ? ' fill-opacity=\"' + demo.alpha.toFixed(2) + '\"' : ' fill-opacity=\"0.55\"')) + '>' + esc(txt) + '</text>');\n      if (real) { var base = pad + S * 0.95, sc = S / 100; out.push(dimLines({ x: pad, y: base - asc * sc, w: bw * k, h: (asc + desc) * sc, wcm: widthCm(), hcm: heightCm(), ink: lc, bg: mod.lightBg() ? '#F7F5F1' : '#1A1A1A', plan: REG === 'pro', fs: 22 })); }\n      else out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 16) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.7\">Exemple \u2014 saisissez votre pr\u00E9nom</text>');\n      out.push('</svg>');\n      return out.join('');\n    };\n    mod.properties = function () { var p = { 'Pr\u00E9nom': state.name.trim(), 'Police': fontName() }; var d = dims(); if (d) p['Dimensions'] = d; return p; };\n    mod.compact = function () { var c = { v: 1, k: 'prenom', o: state.opt, n: state.name }; if (FONT_STEP) c.f = state.font; return c; };\n    mod.apply = function (c) { applyOpts(c.o); if (typeof c.n === 'string') state.name = c.n; if (FONT_STEP && c.f && (cfg.fonts || []).indexOf(c.f) >= 0) state.font = c.f; };\n    mod.fontsToLoad = function () { return FONT_STEP ? [fontUser()] : roleValues('fontopt').map(fontFor); };\n    /* \u2500\u2500 Fichier de d\u00E9coupe : le pr\u00E9nom en un trac\u00E9, largeur d'encre = largeur command\u00E9e, feuille = bo\u00EEte d'encre \u2500\u2500 */\n    mod.vectorFonts = function () { return [fontUser().family]; };\n    mod.files = function () {\n      var t = state.name.trim(); if (!t) return [];\n      var f = fontUser(), Wmm = widthCm() * 10, m0 = VEC.metrics(t, f.family, f.weight, 100); if (!m0 || !(m0.x2 - m0.x1 > 0)) return [];\n      var size = 100 * Wmm / (m0.x2 - m0.x1), m = VEC.metrics(t, f.family, f.weight, size); if (!m) return [];\n      var v = VEC.text({ text: t, family: f.family, weight: f.weight, x: -m.x1, y: -m.y1, size: size, anchor: 'start' }); if (!v) return [];\n      var W = m.x2 - m.x1, H = m.y2 - m.y1;\n      var body = '<path id=\"prenom\" fill=\"' + VEC.hex(state.opt.color) + '\" fill-rule=\"' + v.rule + '\" d=\"' + v.d + '\"/>';\n      var svg = VEC.svg(W, H, VEC.wrap(body, W), { title: 'Pr\u00E9nom ' + t + ' \u00B7 ' + fontName() + ' \u00B7 ' + (state.opt.color || ''), fonts: [f.family], exact: v.exact, loaded: v.loaded });\n      return VEC.file(svg, 'prenom-' + VEC.slug(t, 'prenom') + '-' + VEC.slug(state.opt.size, 'taille') + '.svg');\n    };\n    return mod;\n  })();\n\n  /* \u2500\u2500 CHIEN \u00C0 BORD : silhouette de la race (SVG du th\u00E8me) au-dessus du pr\u00E9nom et de \u00AB \u00E0 bord ! \u00BB, centr\u00E9s, une couleur.\n     \u00C9tapes : pr\u00E9nom (ouverte) \u2192 race \u2192 police (font_list) \u2192 hauteur (variante) \u2192 couleur (variante). La hauteur command\u00E9e\n     est celle de la composition enti\u00E8re, la largeur en d\u00E9coule (pr\u00E9nom \u2248 largeur de la silhouette, plafonn\u00E9). D\u00E9mo avant\n     saisie (pr\u00E9noms, races et polices qui tournent). Fichier de d\u00E9coupe : silhouette cuite en mm + textes en contours\n     exacts (opentype) quand la police est h\u00E9berg\u00E9e. \u2500\u2500 */\n  KINDS.chien = (function () {\n    var C = cfg.chien || {}, BREEDS = C.breeds || [], MAX = +C.maxChars || 16, LINE2 = C.line2 === undefined ? '\u00E0 bord !' : String(C.line2), DOG_PCT = Math.min(0.7, Math.max(0.25, (+C.dogPct || 46) / 100));\n    var GAP1 = 0.05, GAP2 = 0.02, NAME_MAX = 0.26, L2 = 0.62; // \u00E9carts et plafond du pr\u00E9nom en fraction de la hauteur totale ; ligne 2 = 62 % du corps du pr\u00E9nom\n    // libell\u00E9s : par d\u00E9faut ceux du chien \u00E0 bord ; la section les remplace pour une autre biblioth\u00E8que de silhouettes (Halloween\u2026)\n    var LBL = C.labels || {}, TXT = { text: LBL.text || 'Son pr\u00E9nom', breed: LBL.breed || 'Sa race', field: LBL.field || 'Pr\u00E9nom du chien', placeholder: LBL.placeholder || 'Ex. Nougat',\n      breedAria: LBL.breedAria || 'Race du chien', missing: LBL.missing || 'Indiquez le pr\u00E9nom du chien.', prop: LBL.prop || 'Race', title: LBL.title || 'Chien \u00E0 bord', slug: LBL.slug || 'chien-a-bord',\n      label: LBL.label || 'sticker chien \u00E0 bord', aria: LBL.aria || 'Aper\u00E7u de votre sticker chien \u00E0 bord', demoHint: LBL.demoHint || 'Exemple \u2014 saisissez le pr\u00E9nom de votre chien', hint: LBL.hint || 'La silhouette est d\u00E9coup\u00E9e avec le pr\u00E9nom, dans la m\u00EAme couleur.' };\n    var L2S = LINE2 ? ' ' + LINE2 : ''; // suffixe \u00AB \u00E0 bord ! \u00BB (vide quand la ligne 2 est d\u00E9sactiv\u00E9e)\n    var DEMO_NAMES = C.demoNames && C.demoNames.length ? C.demoNames : ['Nougat', 'Lucette', 'Maya', 'Oslo', 'Nala', 'Rio', 'Pixel', 'C\u00E2line', 'Jazz', 'Roxy', 'Simba', 'Guizmo'];\n    var demo = makeDemo({ list: DEMO_NAMES, idle: function () { return !state.name.trim(); }, set: function (n) {\n      var fonts = cfg.fonts || []; demo.font = fonts.length ? fonts[n % fonts.length] : state.font; demo.breed = BREEDS.length ? BREEDS[n % BREEDS.length].key : state.breed;\n      if (demo.font) loadFonts([{ family: demo.font, weight: fontWeightFor(demo.font) }]);\n    } });\n    function breedOf(key) { return BREEDS.filter(function (b) { return b.key === key; })[0] || BREEDS[0] || { key: '', label: '' }; }\n    var mod = {\n      inlineFirst: true,\n      steps: ['text', 'breed', 'font', 'size', 'color'].filter(function (k) { return k === 'text' || k === 'breed' || (k === 'font' ? (cfg.fonts || []).length > 0 : hasRole(k)); }),\n      labels: { text: TXT.text, breed: TXT.breed, font: 'Police d\u2019\u00E9criture', size: (cfg.labels && cfg.labels.size) || 'Hauteur', color: roleLabel('color') || 'Couleur' },\n      mainStep: 'text',\n      render: {},\n      init: function () {\n        state.name = '';\n        state.breed = BREEDS.some(function (b) { return b.key === C.defaultBreed; }) ? C.defaultBreed : (BREEDS[0] ? BREEDS[0].key : '');\n        if (!state.font || (cfg.fonts || []).indexOf(state.font) < 0) state.font = cfg.defaultFont || (cfg.fonts || [])[0] || '';\n        OT.onChange = function () { refreshDims(); updateLight(); };\n        OT.ensureFont(state.font); OT.ensureClipper();\n        BREEDS.forEach(function (b) { loadIcon(b.key); });\n        setTimeout(demo.start, 400);\n      }\n    };\n    /* \u2500\u2500 Silhouettes : SVG du th\u00E8me \u2192 trac\u00E9 + bo\u00EEte r\u00E9elle (m\u00EAme m\u00E9canique que les logos des r\u00E9seaux) \u2500\u2500 */\n    var icons = {};\n    function loadIcon(key) {\n      var b = breedOf(key); if (!b.url || icons[key] !== undefined) return;\n      icons[key] = null;\n      fetch(b.url).then(function (r) { if (!r.ok) throw new Error(r.status); return r.text(); }).then(function (txt) {\n        var doc = new DOMParser().parseFromString(txt, 'image/svg+xml');\n        var d = Array.prototype.map.call(doc.querySelectorAll('path'), function (p) { return p.getAttribute('d') || ''; }).join(' ');\n        var NS = 'http://www.w3.org/2000/svg', tmp = document.createElementNS(NS, 'svg'), pe = document.createElementNS(NS, 'path');\n        tmp.setAttribute('width', '10'); tmp.setAttribute('height', '10'); tmp.style.cssText = 'position:absolute;left:-9999px;top:0';\n        pe.setAttribute('d', d); tmp.appendChild(pe); document.body.appendChild(tmp);\n        var bb = pe.getBBox(); document.body.removeChild(tmp);\n        icons[key] = { d: d, x: bb.x, y: bb.y, w: Math.max(bb.width, 1), h: Math.max(bb.height, 1) };\n        if (mod.render.breed) mod.render.breed();\n        refreshDims(); updateLight();\n      }).catch(function () { icons[key] = false; });\n    }\n    function iconSvg(key, w, h) { var ic = icons[key]; if (!ic) return ''; return '<svg viewBox=\"' + ic.x + ' ' + ic.y + ' ' + ic.w + ' ' + ic.h + '\" width=\"' + w + '\" height=\"' + h + '\" aria-hidden=\"true\"><path d=\"' + ic.d + '\" fill=\"currentColor\"/></svg>'; }\n    function fontNow() { return demo.active() && demo.font ? demo.font : state.font; }\n    function fontObj(fam) { var f = fam || fontNow(); return { family: f, weight: fontWeightFor(f) }; }\n    function breedNow() { return demo.active() && demo.breed ? demo.breed : state.breed; }\n    function colorNow() { return state.opt.color || state.color || ''; }\n    function heightMm(val) { var m = optionMeta(val || state.opt.size); if (m.h) return m.h * 10; var v = parseCm(val || state.opt.size); return v > 0 ? v * 10 : 120; }\n    function ink(txt, f) {\n      mctx.font = f.weight + ' 100px \"' + f.family + '\", cursive'; var m = mctx.measureText(txt);\n      var asc = m.actualBoundingBoxAscent, desc = m.actualBoundingBoxDescent; if (!(asc >= 0)) asc = 72; if (!(desc >= 0)) desc = 22;\n      var l = m.actualBoundingBoxLeft, r = m.actualBoundingBoxRight; if (!(l > -1e9)) l = 0; if (!(r > -1e9)) r = m.width;\n      return { w: Math.max(l + r, 1), asc: asc, desc: desc, adv: Math.max(m.width, 1) };\n    }\n    function layout(hVal, fam) {\n      // toutes les cotes en mm ; L.ic est null tant que la silhouette n'est pas charg\u00E9e (r\u00E9serve de m\u00EAme hauteur)\n      var H = heightMm(hVal), ic = icons[breedNow()] || null, f = fontObj(fam), dm = demo.active(), real = !!state.name.trim(), t = real ? state.name.trim() : (dm ? demo.text() : 'Nougat');\n      var g1 = ink(t, f), g2 = LINE2 ? ink(LINE2, f) : null;\n      var dogH = H * DOG_PCT, dogW = ic ? dogH * ic.w / ic.h : dogH * 1.3;\n      var s1 = Math.min(100 * dogW * 1.05 / g1.w, 100 * H * NAME_MAX / (g1.asc + g1.desc)), s2 = g2 ? s1 * L2 : 0;\n      var h1 = (g1.asc + g1.desc) * s1 / 100, h2 = g2 ? (g2.asc + g2.desc) * s2 / 100 : 0;\n      var k = H / (dogH + H * GAP1 + h1 + (g2 ? H * GAP2 + h2 : 0)); // la hauteur command\u00E9e est celle de l'ensemble\n      dogH *= k; dogW *= k; s1 *= k; s2 *= k; h1 *= k; h2 *= k;\n      var w1 = g1.w * s1 / 100, w2 = g2 ? g2.w * s2 / 100 : 0, W = Math.max(dogW, w1, w2), cx = W / 2, y = 0;\n      var L = { H: H, W: W, cx: cx, ic: ic, f: f, t: t, real: real, dog: { x: cx - dogW / 2, y: 0, w: dogW, h: dogH, s: ic ? dogH / ic.h : 0 } };\n      y += dogH + H * GAP1 * k;\n      L.name = { size: s1, base: y + g1.asc * s1 / 100, w: w1 }; y += h1;\n      if (g2) { y += H * GAP2 * k; L.line2 = { size: s2, base: y + g2.asc * s2 / 100, w: w2, t: LINE2 }; }\n      return L;\n    }\n    function dims(hVal) { var L = layout(hVal); return fmtCm(L.W / 10) + ' \u00D7 ' + fmtCm(L.H / 10) + ' cm'; }\n    function refreshDims() { var p = $('#leniChienDims'); if (p) p.textContent = state.name.trim() ? 'Dimensions finales ' + dims() : ''; if (hasRole('size')) RENDER.size(); }\n    /* \u2500\u2500 \u00C9tapes \u2500\u2500 */\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Le pr\u00E9nom est reproduit tel que vous l\u2019\u00E9crivez, majuscules et accents compris.' + (LINE2 ? ' \u00AB ' + LINE2 + ' \u00BB est ajout\u00E9 dessous.' : '') }));\n      var e1 = errors.text && (submitAttempted || touchedKeys.text) ? errors.text : (state.name.length > MAX ? MSG.tooLong : '');\n      body.appendChild(textField({ key: 'pname', label: TXT.field, placeholder: TXT.placeholder, max: MAX, value: state.name, err: e1, required: true,\n        onInput: function (v) { state.name = v; touch('text'); if (v.trim()) demo.stop(); debounced('pname', function () { markInteracted(); mod.validate(); markComplete(); patchField('pname', errors.text, MAX + ' caract\u00E8res max.'); refreshDims(); RENDER.font(); updateLight(); }); },\n        onBlur: function () { mod.validate(); patchField('pname', (submitAttempted || touchedKeys.text) ? errors.text : '', MAX + ' caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); } }));\n      body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniChienDims', text: state.name.trim() ? 'Dimensions finales ' + dims() : '' }));\n    };\n    mod.render.breed = function () {\n      var body = bodyOf('breed'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: TXT.hint }));\n      var grid = el('div', { class: 'leni-nets leni-nets--breed', role: 'radiogroup', 'aria-label': TXT.breedAria });\n      BREEDS.forEach(function (b) {\n        grid.appendChild(el('button', { type: 'button', class: 'leni-net leni-net--breed' + (state.breed === b.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.breed === b.key ? 'true' : 'false',\n          html: '<span class=\"leni-net__icon\">' + iconSvg(b.key, 84, 60) + '</span><span class=\"leni-net__label\">' + esc(b.label) + '</span>',\n          onclick: function () { state.breed = b.key; demo.stop(); markInteracted(); update(); } }));\n      });\n      body.appendChild(grid);\n    };\n    mod.pickFont = function (fam) { state.font = fam; OT.ensureFont(fam); };\n    mod.fontCurrent = function () { return state.font; };\n    mod.fontSample = function () { return (state.name.trim() || DEMO_NAMES[0]) + L2S; };\n    mod.fontValue = function () { return (cfg.fontLabels && cfg.fontLabels[state.font]) || state.font; };\n    mod.fontHint = function () { return LINE2 ? 'La m\u00EAme police pour le pr\u00E9nom et \u00AB ' + LINE2 + ' \u00BB.' : 'La police du pr\u00E9nom, d\u00E9coup\u00E9e avec la silhouette.'; };\n    mod.validate = function () { errors = {}; if (!state.name.trim()) errors.text = TXT.missing; else if (state.name.length > MAX) errors.text = MSG.tooLong; return mod.isValid(); };\n    mod.isValid = function () { return !errors.text; };\n    mod.isComplete = mod.isValid;\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return 'text'; };\n    mod.incompleteLabel = function () { return !state.name.trim() ? 'Indiquez le pr\u00E9nom' : 'Raccourcissez le pr\u00E9nom'; };\n    mod.stepValue = function (key) { if (key === 'text') return state.name.trim() || '\u00C0 saisir'; if (key === 'breed') return breedOf(state.breed).label; if (key === 'font') return mod.fontValue(); return ''; };\n    mod.recapLines = function () { var out = [], t = state.name.trim(); if (t) { out.push({ text: t + L2S + ' \u2014 ' + breedOf(state.breed).label, step: 'breed' }); out.push({ text: 'Dimensions exactes ' + dims(), step: 'size' }); } return out; };\n    mod.stickySub = function () { return (state.opt.size || '') + (state.opt.color ? ' \u00B7 ' + state.opt.color : '') + ' \u00B7 ' + breedOf(state.breed).label; };\n    mod.sizeExtra = function (val) { return state.name.trim() ? 'largeur ' + fmtCm(layout(val).W / 10) + ' cm' : ''; };\n    mod.lightBg = function () { var c = colorNow(); return isDark(hexFor(c, '#F5F1EA')) && !isGold(c) && !isSilver(c) && !isHolo(c); };\n    /* \u2500\u2500 Aper\u00E7u \u2500\u2500 */\n    mod.preview = function () {\n      var L = layout(), W = 1000, pad = 70, right = L.real ? 90 : 0, ppm = Math.min((W - pad * 2 - right) / L.W, 520 / L.H), H = L.H * ppm + pad * 2 + (L.real ? 40 : 60);\n      var x0 = pad + ((W - pad * 2 - right) - L.W * ppm) / 2, y0 = pad, fill = svgFill(colorNow()), lc = mod.lightBg() ? '#1A1A1A' : '#F5F1EA', lbg = mod.lightBg() ? '#F7F5F1' : '#1A1A1A';\n      var op = L.real ? '' : (demo.active() ? ' opacity=\"' + demo.alpha.toFixed(2) + '\"' : ' opacity=\"0.55\"');\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"' + esc(TXT.aria) + '\">', defs(), '<g fill=\"' + fill + '\"' + op + '>'];\n      if (L.ic) {\n        var s = L.dog.s * ppm, tx = x0 + L.dog.x * ppm - L.ic.x * s, ty = y0 + L.dog.y * ppm - L.ic.y * s, baked = bakePath(L.ic.d, s, tx, ty, 2);\n        out.push(baked ? '<path d=\"' + baked + '\"/>' : '<path d=\"' + L.ic.d + '\" transform=\"translate(' + tx.toFixed(2) + ' ' + ty.toFixed(2) + ') scale(' + s.toFixed(5) + ')\"/>');\n      }\n      var ff = '\\'' + esc(L.f.family) + '\\', cursive', cx = x0 + L.cx * ppm;\n      out.push('<text x=\"' + cx.toFixed(1) + '\" y=\"' + (y0 + L.name.base * ppm).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"' + ff + '\" font-weight=\"' + L.f.weight + '\" font-size=\"' + (L.name.size * ppm).toFixed(1) + '\">' + esc(L.t) + '</text>');\n      if (L.line2) out.push('<text x=\"' + cx.toFixed(1) + '\" y=\"' + (y0 + L.line2.base * ppm).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"' + ff + '\" font-weight=\"' + L.f.weight + '\" font-size=\"' + (L.line2.size * ppm).toFixed(1) + '\">' + esc(L.line2.t) + '</text>');\n      out.push('</g>');\n      if (L.real) out.push(dimLines({ x: x0, y: y0, w: L.W * ppm, h: L.H * ppm, wcm: L.W / 10, hcm: L.H / 10, ink: lc, bg: lbg, plan: false, fs: 22 }));\n      else out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 16) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.7\">' + esc(TXT.demoHint) + '</text>');\n      out.push('</svg>');\n      return out.join('');\n    };\n    /* \u2500\u2500 Panier, reprise, fichier de d\u00E9coupe \u2500\u2500 */\n    mod.properties = function () { var t = state.name.trim(), p = {}; p[TXT.prop] = breedOf(state.breed).label; p['Pr\u00E9nom'] = t; p['Texte'] = t + L2S; p['Police'] = mod.fontValue(); if (t) p['Dimensions'] = dims(); return p; };\n    mod.compact = function () { return { v: 1, k: 'chien', o: state.opt, n: state.name, b: state.breed, f: state.font }; };\n    mod.apply = function (c) { applyOpts(c.o); if (typeof c.n === 'string') state.name = c.n; if (c.b && BREEDS.some(function (b) { return b.key === c.b; })) state.breed = c.b; if (c.f && (cfg.fonts || []).indexOf(c.f) >= 0) state.font = c.f; };\n    mod.fontsToLoad = function () { return [fontObj(state.font)]; };\n    mod.vectorFonts = function () { return [state.font]; };\n    mod.files = function () {\n      var t = state.name.trim(); if (!t) return [];\n      var L = layout(undefined, state.font); if (!L.ic) return [];\n      var f = L.f, hex = VEC.hex(colorNow()), s = L.dog.s, race = breedOf(state.breed).label;\n      var dog = bakePath(L.ic.d, s, L.dog.x - L.ic.x * s, L.dog.y - L.ic.y * s, 3); if (!dog) return [];\n      var v1 = VEC.text({ text: t, family: f.family, weight: f.weight, x: L.cx, y: L.name.base, size: L.name.size, anchor: 'middle' }); if (!v1) return [];\n      var body = '<path id=\"race\" fill=\"' + hex + '\" d=\"' + dog + '\"/><path id=\"prenom\" fill=\"' + hex + '\" fill-rule=\"' + v1.rule + '\" d=\"' + v1.d + '\"/>', exact = v1.exact, loaded = v1.loaded;\n      if (L.line2) {\n        var v2 = VEC.text({ text: L.line2.t, family: f.family, weight: f.weight, x: L.cx, y: L.line2.base, size: L.line2.size, anchor: 'middle' });\n        if (v2) { body += '<path id=\"ligne2\" fill=\"' + hex + '\" fill-rule=\"' + v2.rule + '\" d=\"' + v2.d + '\"/>'; exact = exact && v2.exact; loaded = loaded && v2.loaded; }\n      }\n      var svg = VEC.svg(L.W, L.H, VEC.wrap(body, L.W), { title: TXT.title + ' ' + t + ' \u00B7 ' + race + ' \u00B7 ' + mod.fontValue() + ' \u00B7 ' + colorNow(), label: TXT.label, fonts: [f.family], exact: exact, loaded: loaded, note: 'silhouette ' + race + ' : trac\u00E9 vectoriel du th\u00E8me' });\n      return VEC.file(svg, TXT.slug + '-' + VEC.slug(race, 'motif') + '-' + VEC.slug(t, 'prenom') + '-' + VEC.slug(state.opt.size, 'taille') + '.svg');\n    };\n    return mod;\n  })();\n\n  /* \u2500\u2500 QR : sticker QR code d\u00E9coup\u00E9 sans fond (lien, Wi-Fi ou carte de contact), textes en option au-dessus et en dessous.\n     \u00C9tapes : Contenu \u2192 Taille (variante : c\u00F4t\u00E9 du QR, marge de lecture de 4 modules comprise) \u2192 Couleur (variante) \u2192\n     Textes (option ; variante \u00AB Texte \u00BB QR seul / Avec texte synchronis\u00E9e d\u00E8s qu'une ligne est remplie ; police partag\u00E9e\n     de la fiche). Encodeur QR int\u00E9gr\u00E9 (niveau M) : la version est la plus petite qui contient le contenu, le module doit\n     faire au moins cfg.qr.minMm (3 mm) sinon alerte et taille sup\u00E9rieure propos\u00E9e. Le mot de passe Wi-Fi n'existe que\n     dans le QR et dans _config (jamais dans les propri\u00E9t\u00E9s visibles). Fichier de d\u00E9coupe : modules fusionn\u00E9s (pair-impair)\n     + textes en contours exacts, m\u00EAmes cotes que l'aper\u00E7u ; pas de miroir (un QR en miroir ne se lit pas). \u2500\u2500 */\n  KINDS.qr = (function () {\n    var Q = cfg.qr || {}, MIN_MM = +Q.minMm || 3, QUIET = 4, MAXC = +Q.maxChars || 30, TEXT_PCT = (+Q.textPct || 8.5) / 100;\n    var BLEED_PT = Q.bleedPt === undefined || Q.bleedPt === '' ? 1 : Math.max(0, +Q.bleedPt || 0), BLEED = BLEED_PT * 25.4 / 72; // dilatation des modules dans le fichier, par c\u00F4t\u00E9 (1 pt = 0,35 mm)\n    var TYPES = [\n      { key: 'link', label: 'Lien', sub: 'Site, avis Google, menu, r\u00E9seau social, prise de rendez-vous' },\n      { key: 'wifi', label: 'Wi-Fi', sub: 'Le t\u00E9l\u00E9phone se connecte au r\u00E9seau en un scan' },\n      { key: 'vcard', label: 'Coordonn\u00E9es', sub: 'Carte de contact \u00E0 enregistrer d\u2019un geste' }\n    ];\n    var SECS = [{ key: 'WPA', label: 'WPA / WPA2' }, { key: 'WEP', label: 'WEP' }, { key: 'nopass', label: 'Sans mot de passe' }];\n    var FIELDS = {\n      link: [{ key: 'url', label: 'Adresse du lien', ph: 'https://www.votre-site.fr', max: 250, hint: 'Un lien court se lit de plus loin. Le \u00AB https:// \u00BB est ajout\u00E9 si besoin.', type: 'url', auto: 'url' }],\n      wifi: [\n        { key: 'ssid', label: 'Nom du r\u00E9seau Wi-Fi', ph: 'Ex. Maison Martin', max: 32, hint: 'Exactement comme il appara\u00EEt sur vos appareils, majuscules comprises.' },\n        { key: 'pass', label: 'Mot de passe', ph: '', max: 63, hint: 'Pr\u00E9sent uniquement dans le QR code : il n\u2019appara\u00EEt ni au panier, ni dans les emails.', secret: true }\n      ],\n      vcard: [\n        { key: 'name', label: 'Nom ou enseigne', ph: 'Ex. Cabinet Dupont', max: 40, hint: 'Le nom enregistr\u00E9 dans le t\u00E9l\u00E9phone.' },\n        { key: 'org', label: 'Activit\u00E9 ou entreprise (facultatif)', ph: 'Ex. Kin\u00E9sith\u00E9rapeute', max: 40 },\n        { key: 'tel', label: 'T\u00E9l\u00E9phone', ph: '03 88 00 00 00', max: 20, type: 'tel', auto: 'tel' },\n        { key: 'email', label: 'Email', ph: 'contact@votre-boutique.fr', max: 60, type: 'email', auto: 'email' },\n        { key: 'web', label: 'Site web', ph: 'www.votre-boutique.fr', max: 80, auto: 'url' },\n        { key: 'addr', label: 'Adresse', ph: '12 rue des Vosges, 67000 Strasbourg', max: 80 }\n      ]\n    };\n    function list(v, fb) { var out = String(v || '').split(',').map(function (s) { return s.trim(); }).filter(Boolean); return out.length ? out : fb; }\n    var TOP_DEFAULT = Q.topDefault || 'Scannez-moi';\n    var TOP_SUGG = list(Q.topSuggestions, ['Scannez-moi', 'Flashez-moi', 'Wi-Fi gratuit', 'Notre carte', 'Laissez un avis']);\n    var BOT_SUGG = list(Q.botSuggestions, ['Prenez rendez-vous', 'Notre carte', 'Laissez un avis', 'Suivez-nous', 'Wi-Fi gratuit', 'Commandez en ligne']);\n    var DEMO_URL = Q.demoUrl || 'https://lenidesign.fr', DEMO_COLORS = ['Blanc', 'Noir', 'Or', 'Argent'];\n    var demoCode = null, errField = '';\n    var demo = makeDemo({ list: BOT_SUGG, idle: function () { return !payload(); }, set: function (n) {\n      var fonts = (cfg.fonts || []).slice(0, 4), all = roleValues('color');\n      var cols = DEMO_COLORS.map(function (c) { return all.filter(function (a) { return a === c || a.indexOf(c + ' ') === 0; })[0]; }).filter(Boolean);\n      demo.font = fonts.length ? fonts[n % fonts.length] : state.font; demo.color = cols.length ? cols[n % cols.length] : state.opt.color;\n      if (demo.font) loadFonts([{ family: demo.font, weight: fontWeightFor(demo.font) }]);\n    } });\n    function colorNow() { return demo.active() && demo.color ? demo.color : state.opt.color; }\n    function fontNow() { return demo.active() && demo.font ? demo.font : state.font; }\n    var mod = {\n      inlineFirst: true, // le contenu est l'\u00E9tape 1, ouverte (aussi sur mobile)\n      steps: ['content', 'size', 'color', 'lines'].filter(function (k) { return k === 'content' || k === 'lines' || hasRole(k); }),\n      labels: { content: 'Votre contenu', size: (cfg.labels && cfg.labels.size) || 'Taille', color: roleLabel('color') || 'Couleur', lines: 'Textes (en option)' },\n      mainStep: 'content',\n      render: {},\n      init: function () {\n        state.qr = { type: 'link', url: '', ssid: '', pass: '', sec: 'WPA', name: '', org: '', tel: '', email: '', web: '', addr: '' };\n        state.showPass = false;\n        state.lines = { top: { on: false, text: TOP_DEFAULT }, bot: { on: false, text: '' } };\n        if (!state.font || (cfg.fonts || []).indexOf(state.font) < 0) state.font = cfg.defaultFont || (cfg.fonts || [])[0] || 'Source Sans 3';\n        syncTextOpt();\n        OT.ensureFont(state.font); OT.ensureClipper(); // contours exacts des textes du fichier de d\u00E9coupe\n        demoCode = QR.encode(DEMO_URL, { level: 'M' });\n        setTimeout(demo.start, 400);\n      }\n    };\n    /* \u2500\u2500 Contenu encod\u00E9 \u2500\u2500 */\n    function wifiEsc(s) { return String(s).replace(/([\\\\;,:\"])/g, '\\\\$1'); }\n    function vEsc(s) { return String(s).replace(/\\\\/g, '\\\\\\\\').replace(/\\r?\\n/g, '\\\\n').replace(/([,;])/g, '\\\\$1'); }\n    function normUrl(u) { u = String(u || '').trim(); if (!u) return ''; return /^[a-z][a-z0-9+.-]*:/i.test(u) ? u : 'https://' + u; }\n    function payload() {\n      var q = state.qr;\n      if (q.type === 'link') return normUrl(q.url);\n      if (q.type === 'wifi') { var s = q.ssid.trim(); if (!s) return ''; return 'WIFI:T:' + (q.sec === 'nopass' ? 'nopass' : q.sec) + ';S:' + wifiEsc(s) + ';' + (q.sec === 'nopass' ? '' : 'P:' + wifiEsc(q.pass) + ';') + ';'; }\n      var n = q.name.trim(); if (!n) return '';\n      var L = ['BEGIN:VCARD', 'VERSION:3.0', 'N:' + vEsc(n) + ';;;;', 'FN:' + vEsc(n)];\n      if (q.org.trim()) L.push('ORG:' + vEsc(q.org.trim()));\n      if (q.tel.trim()) L.push('TEL;TYPE=WORK,VOICE:' + q.tel.trim().replace(/[^+0-9]/g, ''));\n      if (q.email.trim()) L.push('EMAIL:' + q.email.trim());\n      if (q.web.trim()) L.push('URL:' + normUrl(q.web));\n      if (q.addr.trim()) L.push('ADR;TYPE=WORK:;;' + vEsc(q.addr.trim()) + ';;;;');\n      L.push('END:VCARD');\n      return L.join('\\r\\n');\n    }\n    function typeOf() { return TYPES.filter(function (t) { return t.key === state.qr.type; })[0] || TYPES[0]; }\n    function secLabel() { return (SECS.filter(function (s) { return s.key === state.qr.sec; })[0] || SECS[0]).label; }\n    function summary() { var q = state.qr; if (q.type === 'link') return normUrl(q.url); if (q.type === 'wifi') return q.ssid.trim(); return q.name.trim(); } // affich\u00E9 derri\u00E8re le type (Lien \u00B7 \u2026 / Wi-Fi \u00B7 \u2026 / Coordonn\u00E9es \u00B7 \u2026)\n    /* Niveau de correction adaptatif : M (15 %) d\u00E8s qu'il tient dans la taille choisie, sinon L (7 %, moins de modules :\n       une carte de contact compl\u00E8te passe ainsi en 15 ou 20 cm). Sur un sticker d\u00E9coup\u00E9, la perte d'un module isol\u00E9 n'ab\u00EEme\n       qu'un mot de code : L reste tr\u00E8s s\u00FBr. */\n    var encCache = { key: '', M: null, L: null };\n    function encodings() { var p = payload(); if (!p) return null; if (encCache.key !== p) { encCache.key = p; encCache.M = QR.encode(p, { level: 'M' }); encCache.L = QR.encode(p, { level: 'L' }); } return encCache; }\n    function codeFor(val) { var e = encodings(); if (!e) return null; if (e.M && fitsAt(e.M, val)) return e.M; if (e.L && fitsAt(e.L, val)) return e.L; return e.M || e.L; }\n    function code() { return codeFor(state.opt.size); }\n    /* \u2500\u2500 G\u00E9om\u00E9trie (mm) : c\u00F4t\u00E9 command\u00E9 = c\u00F4t\u00E9 du QR marge comprise ; module = c\u00F4t\u00E9 \u00F7 (modules + 8) \u2500\u2500 */\n    function sideCm(val) { var v = val || state.opt.size, m = optionMeta(v); if (m.w) return m.w; return parseCm(v) || 15; }\n    function moduleMm(c, val) { return c ? sideCm(val) * 10 / (c.size + 2 * QUIET) : 0; }\n    function fitsAt(c, val) { return !c || moduleMm(c, val) >= MIN_MM - 1e-9; }\n    function fits(c, val) { return fitsAt(val ? codeFor(val) : c, val); }\n    function nextFit() { var best = '', bw = Infinity, cur = sideCm(); roleValues('size').forEach(function (v) { var w = sideCm(v); if (w > cur && w < bw && fitsAt(codeFor(v), v)) { best = v; bw = w; } }); return best; }\n    function fmtMm1(mm) { return (Math.round(mm * 10) / 10).toString().replace('.', ',') + ' mm'; }\n    function readDist(val) { return (Math.round(sideCm(val)) / 10).toString().replace('.', ',') + ' m'; }\n    function lineText(k) { var ln = state.lines[k]; return ln.on ? ln.text.trim() : ''; }\n    function anyLine() { return !!(lineText('top') || lineText('bot')); }\n    function textVals() { var vals = roleValues('textopt'), w = vals.filter(function (v) { return /avec|oui/i.test(v) && !/seul|sans/i.test(v); })[0] || vals[1] || '', wo = vals.filter(function (v) { return v !== w; })[0] || ''; return { w: w, wo: wo }; }\n    function syncTextOpt() { if (!hasRole('textopt')) return; var t = textVals(), want = anyLine() ? t.w : t.wo; if (want && state.opt.textopt !== want) state.opt.textopt = want; }\n    function textExtra() { if (!hasRole('textopt')) return 0; var t = textVals(), a = findVariant(selWith('textopt', t.w)), b = findVariant(selWith('textopt', t.wo)); return a && b ? Math.max(0, a.price - b.price) : 0; }\n    function layout(src) {\n      // src: { code, top, bot, font } \u2192 cotes en mm : S c\u00F4t\u00E9 command\u00E9, m module, W \u00D7 H feuille, (qx, qy) origine des modules,\n      // top / bot : lignes { text, size, w, asc, desc, base } ; hauteur de capitale \u2248 TEXT_PCT \u00D7 S, ligne r\u00E9duite si plus large que S\n      var S = sideCm() * 10, c = src.code, n = c ? c.size : 25, m = S / (n + 2 * QUIET), f = src.font || state.font, wt = fontWeightFor(f);\n      mctx.font = wt + ' 100px \"' + f + '\", sans-serif'; var cap = mctx.measureText('H').actualBoundingBoxAscent; if (!(cap > 0)) cap = 72;\n      var size = TEXT_PCT * S * 100 / cap;\n      function line(t) {\n        if (!t) return null;\n        var s = size, mm, w;\n        function meas() { mctx.font = wt + ' ' + s + 'px \"' + f + '\", sans-serif'; mm = mctx.measureText(t); w = (mm.actualBoundingBoxLeft >= 0 && mm.actualBoundingBoxRight > 0) ? mm.actualBoundingBoxLeft + mm.actualBoundingBoxRight : mm.width; }\n        meas(); if (w > S) { s = s * S / w; meas(); }\n        var asc = mm.actualBoundingBoxAscent >= 0 ? mm.actualBoundingBoxAscent : s * 0.72, desc = mm.actualBoundingBoxDescent >= 0 ? mm.actualBoundingBoxDescent : s * 0.06;\n        return { text: t, size: s, w: w, asc: asc, desc: desc };\n      }\n      var top = line(src.top), bot = line(src.bot), gap = m; // un module d'air entre le texte et le carr\u00E9 command\u00E9\n      var topH = top ? top.asc + top.desc + gap : 0, botH = bot ? bot.asc + bot.desc + gap : 0;\n      if (top) top.base = top.asc;\n      if (bot) bot.base = topH + S + gap + bot.asc;\n      return { S: S, m: m, n: n, W: S, H: topH + S + botH, qx: QUIET * m, qy: topH + QUIET * m, top: top, bot: bot, topH: topH, botH: botH };\n    }\n    function realLayout() { var c = code(); return c ? layout({ code: c, top: lineText('top'), bot: lineText('bot'), font: state.font }) : null; }\n    function dims() { var L = realLayout(); return L ? fmtCm(L.W / 10) + ' \u00D7 ' + fmtCm(L.H / 10) + ' cm' : ''; }\n    /* \u2500\u2500 \u00C9tape Contenu \u2500\u2500 */\n    function fieldHint(f) { return f.hint || (f.max + ' caract\u00E8res max.'); }\n    function patchAll() { var show = submitAttempted || touchedKeys.content; (FIELDS[state.qr.type] || []).forEach(function (f) { patchField(f.key, show && errField === f.key ? errors.content : '', fieldHint(f)); }); }\n    function renderAlert(host) {\n      host.innerHTML = '';\n      if (!errors.size) return;\n      var c = code(), nf = nextFit(c);\n      host.appendChild(el('p', { class: 'leni-cfg__error is-visible', text: '\u26A0 ' + errors.size }));\n      if (nf) host.appendChild(el('button', { type: 'button', class: 'leni-cfg__link', style: 'margin-top:4px', text: 'Passer en ' + nf, onclick: function () { state.opt.size = nf; markInteracted(); update(); } }));\n    }\n    function refresh() {\n      patchAll();\n      var p = $('#leniQrDims'); if (p) { var d = dims(); p.textContent = d ? 'Dimensions finales ' + d : ''; }\n      var al = $('#leniQrAlert'); if (al) renderAlert(al);\n      if (hasRole('size')) RENDER.size();\n      updateLight();\n    }\n    function onField(f, v) { state.qr[f.key] = v; touch('content'); if (v.trim()) demo.stop(); debounced('qr-' + f.key, function () { markInteracted(); mod.validate(); markComplete(); refresh(); }); }\n    mod.render.content = function () {\n      var body = bodyOf('content'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', text: 'Que doit ouvrir le scan ?' }));\n      var listEl = el('div', { class: 'leni-choice-list', role: 'radiogroup', 'aria-label': 'Type de contenu' });\n      TYPES.forEach(function (t) {\n        listEl.appendChild(el('label', { class: 'leni-choice' + (state.qr.type === t.key ? ' is-selected' : '') }, [\n          el('input', { type: 'radio', name: 'leni-qrtype', value: t.key, checked: state.qr.type === t.key ? true : null, onchange: function () { state.qr.type = t.key; touch('content'); markInteracted(); mod.validate(); update(); } }),\n          el('span', { class: 'leni-choice__radio', 'aria-hidden': 'true' }),\n          el('span', { class: 'leni-choice__label', html: esc(t.label) + '<small>' + esc(t.sub) + '</small>' })\n        ]));\n      });\n      body.appendChild(listEl);\n      var show = submitAttempted || touchedKeys.content, fields = el('div', { class: 'leni-qr__fields' });\n      (FIELDS[state.qr.type] || []).forEach(function (f) {\n        var err = show && errField === f.key ? errors.content : '';\n        if (f.secret) {\n          var inp = el('input', { type: state.showPass ? 'text' : 'password', id: 'leniField-' + f.key, maxlength: String(f.max), value: state.qr[f.key], autocomplete: 'off', autocapitalize: 'off', spellcheck: 'false', class: err ? 'is-invalid' : '', oninput: function () { onField(f, this.value); } , onblur: function () { mod.validate(); patchAll(); renderHeaders(); renderPriceAndCta(); } });\n          fields.appendChild(el('div', { class: 'leni-cfg__fieldrow leni-qr__pw', 'data-field': f.key }, [\n            el('label', { for: 'leniField-' + f.key, class: 'leni-cfg__fieldlabel', text: f.label }),\n            inp,\n            el('button', { type: 'button', class: 'leni-qr__eye', 'aria-label': state.showPass ? 'Masquer le mot de passe' : 'Afficher le mot de passe', 'aria-pressed': state.showPass ? 'true' : 'false', html: state.showPass ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M17.9 17.9A10 10 0 0 1 2 12s3-7 10-7a9.7 9.7 0 0 1 5.9 1.9M22 12s-1 2.3-3 4.2M9.9 9.9a3 3 0 0 0 4.2 4.2M2 2l20 20\"/></svg>' : '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>', onclick: function () { state.showPass = !state.showPass; inp.type = state.showPass ? 'text' : 'password'; this.setAttribute('aria-pressed', state.showPass ? 'true' : 'false'); this.setAttribute('aria-label', state.showPass ? 'Masquer le mot de passe' : 'Afficher le mot de passe'); this.innerHTML = state.showPass ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M17.9 17.9A10 10 0 0 1 2 12s3-7 10-7a9.7 9.7 0 0 1 5.9 1.9M22 12s-1 2.3-3 4.2M9.9 9.9a3 3 0 0 0 4.2 4.2M2 2l20 20\"/></svg>' : '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>'; } }),\n            el('small', { text: err ? '\u26A0 ' + err : fieldHint(f) })\n          ]));\n          return;\n        }\n        fields.appendChild(textField({ key: f.key, label: f.label, placeholder: f.ph, max: f.max, value: state.qr[f.key], err: err, required: f.key === 'url' || f.key === 'ssid' || f.key === 'name', hint: fieldHint(f), type: f.type, auto: f.auto,\n          onInput: function (v) { onField(f, v); }, onBlur: function () { mod.validate(); patchAll(); renderHeaders(); renderPriceAndCta(); } }));\n        if (f.key === 'ssid') {\n          fields.appendChild(el('p', { class: 'leni-cfg__fieldlabel', text: 'S\u00E9curit\u00E9 du r\u00E9seau' }));\n          chips(fields, SECS.map(function (s) { return s.label; }), secLabel(), function (val) { state.qr.sec = (SECS.filter(function (s) { return s.label === val; })[0] || SECS[0]).key; touch('content'); markInteracted(); mod.validate(); update(); }, 'S\u00E9curit\u00E9 du r\u00E9seau');\n        }\n      });\n      body.appendChild(fields);\n      var alert = el('div', { id: 'leniQrAlert' }); renderAlert(alert); body.appendChild(alert);\n      body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:12px', text: state.qr.type === 'link' ? 'Un QR code est fig\u00E9 : si votre lien risque de changer, utilisez une adresse courte que vous pourrez rediriger.' : (state.qr.type === 'wifi' ? 'V\u00E9rifiez le nom et le mot de passe : scannez l\u2019aper\u00E7u avec votre t\u00E9l\u00E9phone, il doit proposer la connexion.' : 'Scannez l\u2019aper\u00E7u avec votre t\u00E9l\u00E9phone : il doit proposer d\u2019enregistrer le contact.') }));\n      var d = dims(); body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniQrDims', text: d ? 'Dimensions finales ' + d : '' }));\n    };\n    /* \u2500\u2500 \u00C9tape Textes \u2500\u2500 */\n    function refreshLines() { syncTextOpt(); mod.validate(); renderHeaders(); renderRecap(); renderPriceAndCta(); renderPreview(); if (hasRole('size')) RENDER.size(); var p = $('#leniQrDims2'); if (p) { var d = dims(); p.textContent = d ? 'Dimensions finales ' + d : ''; } }\n    mod.render.lines = function () {\n      var body = bodyOf('lines'); if (!body) return;\n      body.innerHTML = '';\n      var extra = textExtra();\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Une ligne au-dessus du QR code, une ligne en dessous, dans la m\u00EAme couleur. ' + (extra ? 'Suppl\u00E9ment ' + formatMoney(extra) + ' d\u00E8s qu\u2019une ligne est remplie, une ou deux lignes au m\u00EAme prix.' : 'Sans suppl\u00E9ment.') }));\n      [['top', 'Ligne au-dessus', TOP_SUGG, 'Scannez-moi'], ['bot', 'Ligne en dessous', BOT_SUGG, 'Prenez rendez-vous']].forEach(function (row) {\n        var k = row[0], ln = state.lines[k], wrap = el('div', { class: 'leni-qr__line' + (ln.on ? ' is-on' : '') });\n        wrap.appendChild(el('label', { class: 'leni-opt' }, [\n          el('input', { type: 'checkbox', checked: ln.on ? true : null, onchange: function () { ln.on = this.checked; touch('lines'); markInteracted(); syncTextOpt(); mod.validate(); if (ln.on) loadFonts(pickerFonts()).then(renderPreview); update(); if (ln.on) { var inp = $('#leniField-' + k); if (inp && !isMobile()) inp.focus(); } } }),\n          el('span', { class: 'leni-opt__text', html: esc(row[1]) + (ln.on ? '' : '<small>Ex. ' + esc(row[3]) + '</small>') })\n        ]));\n        if (ln.on) {\n          wrap.appendChild(textField({ key: k, label: row[1], placeholder: row[3], max: MAXC, value: ln.text, err: ln.text.length > MAXC ? MSG.tooLong : '', hint: MAXC + ' caract\u00E8res max.',\n            onInput: function (v) { ln.text = v; touch('lines'); debounced('qr-' + k, function () { markInteracted(); patchField(k, ln.text.length > MAXC ? MSG.tooLong : '', MAXC + ' caract\u00E8res max.'); refreshLines(); }); },\n            onBlur: function () { mod.validate(); renderHeaders(); renderPriceAndCta(); } }));\n          var sug = el('div', { class: 'leni-chips leni-qr__sugg', role: 'group', 'aria-label': 'Suggestions' });\n          row[2].forEach(function (t) { sug.appendChild(el('button', { type: 'button', class: 'leni-chip' + (ln.text.trim() === t ? ' is-selected' : ''), text: t, onclick: function () { ln.text = t; touch('lines'); markInteracted(); syncTextOpt(); mod.validate(); update(); } })); });\n          wrap.appendChild(sug);\n        }\n        body.appendChild(wrap);\n      });\n      if (state.lines.top.on || state.lines.bot.on) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:14px', text: 'Police des textes' }));\n        var grid = el('div', { class: 'leni-fonts', role: 'radiogroup', 'aria-label': 'Police' }), sample = lineText('top') || lineText('bot') || TOP_DEFAULT;\n        pickerFonts().forEach(function (f) {\n          grid.appendChild(el('button', { type: 'button', class: 'leni-font-card' + (state.font === f.family ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.font === f.family ? 'true' : 'false', onclick: function () { state.font = f.family; OT.ensureFont(f.family); markInteracted(); loadFonts([f]).then(renderPreview); update(); } }, [\n            el('span', { class: 'leni-font-card__sample', style: 'font-family:\"' + f.family + '\", sans-serif; font-weight:' + f.weight, text: sample }),\n            el('span', { class: 'leni-font-card__name', text: (cfg.fontLabels && cfg.fontLabels[f.family]) || f.family })\n          ]));\n        });\n        body.appendChild(grid);\n        body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:10px', text: 'La m\u00EAme police pour les deux lignes, hauteur de capitale \u2248 ' + Math.round(TEXT_PCT * 100) + ' % du c\u00F4t\u00E9 du QR code.' }));\n      }\n      var d = dims(); body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniQrDims2', text: d ? 'Dimensions finales ' + d : '' }));\n    };\n    mod.onOpen = function (key) { if (key === 'lines' && (state.lines.top.on || state.lines.bot.on)) loadFonts(pickerFonts()).then(renderPreview); };\n    /* \u2500\u2500 Validation \u2500\u2500 */\n    mod.validate = function () {\n      errors = {}; errField = '';\n      var q = state.qr, c, p;\n      if (q.type === 'link') {\n        var u = q.url.trim();\n        if (!u) { errors.content = 'Indiquez le lien.'; errField = 'url'; }\n        else if (/\\s/.test(u)) { errors.content = 'Le lien ne doit pas contenir d\u2019espace.'; errField = 'url'; }\n        else if (!/^(https?:\\/\\/[^\\s\\/]+\\.[^\\s]{2,}|mailto:[^\\s@]+@[^\\s@]+\\.[^\\s]+|tel:\\+?[0-9]{6,})$/i.test(normUrl(u))) { errors.content = 'V\u00E9rifiez le lien (ex. https://www.votre-site.fr).'; errField = 'url'; }\n      } else if (q.type === 'wifi') {\n        if (!q.ssid.trim()) { errors.content = 'Indiquez le nom du r\u00E9seau Wi-Fi.'; errField = 'ssid'; }\n        else if (q.sec !== 'nopass' && !q.pass) { errors.content = 'Indiquez le mot de passe, ou choisissez \u00AB Sans mot de passe \u00BB.'; errField = 'pass'; }\n        else if (q.sec === 'WPA' && q.pass.length < 8) { errors.content = 'Un mot de passe WPA fait au moins 8 caract\u00E8res.'; errField = 'pass'; }\n      } else if (!q.name.trim()) { errors.content = 'Indiquez le nom ou l\u2019enseigne.'; errField = 'name'; }\n      else if (q.email.trim() && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(q.email.trim())) { errors.content = 'V\u00E9rifiez l\u2019adresse email.'; errField = 'email'; }\n      p = payload(); c = errors.content ? null : code();\n      if (!errors.content && p && !c) { errors.content = 'Contenu trop long pour un QR code : raccourcissez-le.'; errField = q.type === 'link' ? 'url' : (q.type === 'wifi' ? 'pass' : 'addr'); }\n      if (!errors.content && c && !fits(c)) { var nf = nextFit(c); errors.size = 'Contenu trop long pour ' + (state.opt.size || 'cette taille') + ' : ' + (nf ? 'raccourcissez-le ou passez en ' + nf + '.' : 'raccourcissez-le.'); }\n      if ((state.lines.top.on && state.lines.top.text.length > MAXC) || (state.lines.bot.on && state.lines.bot.text.length > MAXC)) errors.lines = MSG.tooLong;\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.content && !errors.size && !errors.lines; };\n    mod.isComplete = mod.isValid;\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return errors.content ? 'content' : (errors.size ? 'size' : 'lines'); };\n    mod.incompleteLabel = function () { return errors.content ? 'Compl\u00E9tez votre contenu' : (errors.size ? 'Choisissez une taille plus grande' : 'Raccourcissez le texte'); };\n    mod.stepValue = function (key) {\n      if (key === 'content') { var s = summary(); return s ? typeOf().label + ' \u00B7 ' + s.replace(/^https?:\\/\\//, '') : '\u00C0 saisir'; }\n      if (key === 'lines') { var t = [lineText('top'), lineText('bot')].filter(Boolean); return t.length ? t.join(' \u00B7 ') : 'Sans texte'; }\n      return '';\n    };\n    mod.stepDone = function (key) { if (key === 'lines') return true; return !!mod.stepValue(key) && mod.stepValue(key) !== '\u00C0 saisir' || !!state.opt[key]; };\n    mod.recapLines = function () {\n      var out = [], s = summary(), c = code(), d = dims();\n      if (s) out.push({ text: typeOf().label + ' \u00B7 ' + s, step: 'content' });\n      if (lineText('top')) out.push({ text: 'Au-dessus : ' + lineText('top'), step: 'lines' });\n      if (lineText('bot')) out.push({ text: 'En dessous : ' + lineText('bot'), step: 'lines' });\n      if (anyLine()) out.push({ text: 'Police ' + state.font, step: 'lines' });\n      if (d) out.push({ text: 'Dimensions exactes ' + d + ' (marge de lecture comprise)', step: 'size' });\n      if (c) out.push({ text: 'QR version ' + c.version + ' \u00B7 ' + c.size + ' \u00D7 ' + c.size + ' modules de ' + fmtMm1(moduleMm(c)), step: 'size' });\n      return out;\n    };\n    mod.stickySub = function () { return (state.opt.size || '') + (state.opt.color ? ' \u00B7 ' + state.opt.color : ''); };\n    mod.sizeExtra = function (val) { var real = codeFor(val), c = real || demoCode, mm = moduleMm(c, val), ok = mm >= MIN_MM - 1e-9; return { h: 'lecture \u2248 ' + readDist(val), tag: real ? (ok ? 'modules ' + fmtMm1(mm) : 'contenu trop long') : '', state: ok ? 'ok' : 'warn' }; }; // niveau M ou L selon ce qui tient dans cette taille\n    mod.fontValue = function () { return anyLine() ? state.font : ''; };\n    mod.dims = dims;\n    mod.readout = function () {\n      if (REG !== 'pro') return [];\n      var c = code(), d = dims(), m = d && /^(.+?) \u00D7 (.+?) cm$/.exec(d), out = [];\n      if (!c || !m) return [];\n      out.push({ label: 'Largeur', value: m[1] + ' cm' }); out.push({ label: 'Hauteur', value: m[2] + ' cm' });\n      out.push({ label: 'Module', value: fmtMm1(moduleMm(c)) });\n      if (state.opt.color) out.push({ label: 'Couleur', value: state.opt.color });\n      return out;\n    };\n    mod.lightBg = function () { var c = colorNow() || ''; return isDark(hexFor(c, '#F5F1EA')) && !isGold(c) && !isSilver(c); };\n    /* \u2500\u2500 Aper\u00E7u : carr\u00E9 command\u00E9 en pointill\u00E9, modules fusionn\u00E9s, textes, cotes ; d\u00E9mo = QR r\u00E9el vers DEMO_URL qui se dessine \u2500\u2500 */\n    mod.preview = function () {\n      var dm = demo.active(), real = !!code(), c = dm ? demoCode : code(), f = fontNow();\n      var top = dm ? TOP_DEFAULT : lineText('top'), botFull = dm ? demo.full() : lineText('bot'), bot = dm ? demo.text() : botFull;\n      var L = layout({ code: c, top: top, bot: botFull, font: f });\n      var W = 1000, pad = 70, right = real ? 90 : 0, k = (W - pad * 2 - right) / L.W, H = L.H * k + pad * 2 + 70, ox = pad, oy = pad;\n      var fill = svgFill(colorNow()), lc = mod.lightBg() ? '#1A1A1A' : '#F5F1EA', lbg = mod.lightBg() ? '#F7F5F1' : '#1A1A1A', op = real ? '' : (dm ? ' fill-opacity=\"' + demo.alpha.toFixed(2) + '\"' : ' fill-opacity=\"0.55\"');\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre sticker QR code\">', defs()];\n      out.push('<rect x=\"' + ox.toFixed(1) + '\" y=\"' + (oy + L.topH * k).toFixed(1) + '\" width=\"' + (L.S * k).toFixed(1) + '\" height=\"' + (L.S * k).toFixed(1) + '\" fill=\"none\" stroke=\"' + lc + '\" stroke-opacity=\"0.28\" stroke-width=\"1.5\" stroke-dasharray=\"7 7\"/>');\n      if (c) {\n        var bits = c.bits, sz = c.size;\n        if (dm && demo.phase === 'typing') { // les modules apparaissent en diagonale au rythme de la frappe de la ligne du bas\n          var lim = Math.floor((demo.full().length ? demo.typed / demo.full().length : 1) * (2 * sz - 2)), x, y; bits = new Uint8Array(sz * sz);\n          for (y = 0; y < sz; y++) for (x = 0; x < sz; x++) if (x + y <= lim) bits[y * sz + x] = c.bits[y * sz + x];\n        }\n        out.push('<path fill=\"' + fill + '\" fill-rule=\"evenodd\"' + op + ' d=\"' + QR.path(QR.loops(bits, sz), L.m * k, ox + L.qx * k, oy + L.qy * k, 2) + '\"/>');\n      }\n      function txt(ln, t) { if (!ln || !t) return ''; return '<text x=\"' + (ox + L.S * k / 2).toFixed(1) + '\" y=\"' + (oy + ln.base * k).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"\\'' + esc(f) + '\\', sans-serif\" font-weight=\"' + fontWeightFor(f) + '\" font-size=\"' + (ln.size * k).toFixed(1) + '\" fill=\"' + fill + '\"' + op + '>' + esc(t) + '</text>'; }\n      out.push(txt(L.top, top)); out.push(txt(L.bot, bot));\n      if (real) out.push(dimLines({ x: ox, y: oy, w: L.W * k, h: L.H * k, wcm: L.W / 10, hcm: L.H / 10, ink: lc, bg: lbg, plan: REG === 'pro', fs: 22 }));\n      else out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 16) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.7\">' + (dm ? 'Exemple \u2014 scannez-le, il ouvre lenidesign.fr' : 'Exemple \u2014 saisissez votre contenu') + '</text>');\n      out.push('</svg>');\n      return out.join('');\n    };\n    /* \u2500\u2500 Propri\u00E9t\u00E9s de ligne (jamais le mot de passe Wi-Fi), _config, reprise \u2500\u2500 */\n    mod.properties = function () {\n      var q = state.qr, c = code(), p = { 'Contenu': typeOf().label };\n      if (q.type === 'link') p['Lien'] = normUrl(q.url);\n      else if (q.type === 'wifi') { p['R\u00E9seau Wi-Fi'] = q.ssid.trim(); p['S\u00E9curit\u00E9'] = secLabel(); }\n      else { p['Contact'] = q.name.trim(); if (q.org.trim()) p['Activit\u00E9'] = q.org.trim(); if (q.tel.trim()) p['T\u00E9l\u00E9phone'] = q.tel.trim(); if (q.email.trim()) p['Email'] = q.email.trim(); if (q.web.trim()) p['Site web'] = normUrl(q.web); if (q.addr.trim()) p['Adresse'] = q.addr.trim(); }\n      if (lineText('top')) p['Texte au-dessus'] = lineText('top');\n      if (lineText('bot')) p['Texte en dessous'] = lineText('bot');\n      if (anyLine()) p['Police'] = state.font;\n      var d = dims(); if (d) p['Dimensions'] = d + ' (marge de lecture comprise)';\n      if (c) p['_QR'] = 'version ' + c.version + ' \u00B7 ' + c.size + ' \u00D7 ' + c.size + ' modules \u00B7 module ' + fmtMm1(moduleMm(c)) + ' \u00B7 correction ' + c.level + ' \u00B7 masque ' + c.mask + (BLEED > 0 ? ' \u00B7 dilatation ' + BLEED_PT + ' pt par c\u00F4t\u00E9' : '');\n      return p;\n    };\n    mod.compact = function () { return { v: 1, k: 'qr', o: state.opt, q: state.qr, l: { t: [state.lines.top.on ? 1 : 0, state.lines.top.text], b: [state.lines.bot.on ? 1 : 0, state.lines.bot.text] }, f: state.font, x: state.extras }; };\n    mod.apply = function (c) {\n      applyOpts(c.o);\n      if (c.q) { Object.keys(state.qr).forEach(function (k) { if (typeof c.q[k] === 'string') state.qr[k] = c.q[k]; }); if (!TYPES.some(function (t) { return t.key === state.qr.type; })) state.qr.type = 'link'; if (!SECS.some(function (s) { return s.key === state.qr.sec; })) state.qr.sec = 'WPA'; }\n      if (c.l) { if (c.l.t) { state.lines.top.on = !!c.l.t[0]; state.lines.top.text = String(c.l.t[1] || ''); } if (c.l.b) { state.lines.bot.on = !!c.l.b[0]; state.lines.bot.text = String(c.l.b[1] || ''); } }\n      if (c.f && (cfg.fonts || []).indexOf(c.f) >= 0) state.font = c.f;\n      if (c.x) Object.keys(c.x).forEach(function (k) { if (k in state.extras) state.extras[k] = !!c.x[k]; });\n      syncTextOpt();\n    };\n    mod.fontsToLoad = function () { var out = [{ family: state.font, weight: fontWeightFor(state.font) }]; (cfg.fonts || []).slice(0, 4).forEach(function (f) { if (f !== state.font) out.push({ family: f, weight: fontWeightFor(f) }); }); return out; };\n    /* \u2500\u2500 Fichier de d\u00E9coupe : modules fusionn\u00E9s en mm + textes en contours exacts, m\u00EAme g\u00E9om\u00E9trie que l'aper\u00E7u \u2500\u2500 */\n    mod.vectorFonts = function () { return anyLine() ? [state.font] : []; };\n    mod.files = function () {\n      var c = code(); if (!c) return [];\n      var L = realLayout(), S = L.S, m = L.m, f = state.font, wt = fontWeightFor(f), hex = VEC.hex(state.opt.color), exact = true, loaded = true;\n      function vline(ln) {\n        if (!ln) return null;\n        var sz = ln.size, mm = VEC.metrics(ln.text, f, wt, sz); if (!mm) return null;\n        if (mm.x2 - mm.x1 > S) { sz = sz * S / (mm.x2 - mm.x1); mm = VEC.metrics(ln.text, f, wt, sz); if (!mm) return null; }\n        return { text: ln.text, size: sz, m: mm, h: mm.y2 - mm.y1, x0: S / 2 - (mm.x1 + mm.x2) / 2 };\n      }\n      var vt = vline(L.top), vb = vline(L.bot), topH = vt ? vt.h + m : 0, botH = vb ? vb.h + m : 0, H = topH + S + botH, qy = topH + QUIET * m, parts = [];\n      // modules dilat\u00E9s de BLEED par c\u00F4t\u00E9 (pt \u2192 mm, comme un d\u00E9calage de trac\u00E9) : les voisins se recouvrent, ceux qui ne se touchent\n      // que par un angle sont reli\u00E9s par un pont, l'union est d\u00E9j\u00E0 faite : une seule pi\u00E8ce \u00E0 la coupe, \u00E0 l'\u00E9chenillage et \u00E0 la pose\n      var qrD = BLEED > 0 ? QR.pathFine(QR.expanded(c.bits, c.size), m, BLEED, QUIET * m, qy, 3) : QR.path(QR.loops(c.bits, c.size), m, QUIET * m, qy, 2);\n      parts.push('<path id=\"qr\" fill=\"' + hex + '\" fill-rule=\"evenodd\" d=\"' + qrD + '\"/>');\n      function put(id, v, base) { if (!v) return; var r = VEC.text({ text: v.text, family: f, weight: wt, x: v.x0, y: base, size: v.size, anchor: 'start' }); if (!r) return; exact = exact && r.exact; loaded = loaded && r.loaded !== false; parts.push('<path id=\"' + id + '\" fill=\"' + hex + '\" fill-rule=\"' + r.rule + '\" d=\"' + r.d + '\"/>'); }\n      put('texte-haut', vt, vt ? -vt.m.y1 : 0);\n      put('texte-bas', vb, vb ? topH + S + m - vb.m.y1 : 0);\n      var s = summary(), svg = VEC.svg(S, H, parts.join(''), { title: 'QR code \u00B7 ' + typeOf().label + ' \u00B7 ' + s + ' \u00B7 ' + (state.opt.color || ''), fonts: anyLine() ? [f] : [], exact: exact, loaded: loaded,\n        note: 'QR version ' + c.version + ', ' + c.size + ' \u00D7 ' + c.size + ' modules de ' + fmtMm1(moduleMm(c)) + ', marge de lecture 4 modules comprise dans le carr\u00E9 de ' + VEC.F(S) + ' mm, correction ' + c.level + (BLEED > 0 ? ', modules dilat\u00E9s de ' + BLEED_PT + ' pt (' + fmtMm1(BLEED) + ') par c\u00F4t\u00E9 : voisins en recouvrement, ponts aux angles, union faite' : ', modules exacts') });\n      return VEC.file(svg, 'qr-' + state.qr.type + '-' + VEC.slug(s.replace(/^https?:\\/\\//, '').slice(0, 40), 'qr') + '-' + VEC.slug(state.opt.size, 'taille') + '.svg');\n    };\n    return mod;\n  })();\n\n  /* \u2500\u2500 MUG : mug blanc 330 ml, pr\u00E9nom dans un style Lenidesign pr\u00E9d\u00E9fini (6 styles, polices Google OFL h\u00E9berg\u00E9es en .bin),\n     couleur d'encre (palette, pas de variante), petite phrase en option (20 suggestions par cat\u00E9gorie, texte libre 30 car.,\n     ann\u00E9e pour les suggestions \u00AB [ann\u00E9e] \u00BB), aper\u00E7u sur le mug + vue \u00AB motif \u00E0 plat \u00BB cot\u00E9e, case de v\u00E9rification de\n     l'orthographe avant l'ajout. Fichiers : SVG vectoriel de la zone d'impression (contours exacts) en priv\u00E9, PNG 300 dpi\n     visible au panier (propri\u00E9t\u00E9 \u00AB Aper\u00E7u \u00BB). Une seule variante Shopify : toute la personnalisation est en propri\u00E9t\u00E9s. \u2500\u2500 */\n  /* \u2500\u2500 Fabrique commune aux deux mugs : `mug` (pr\u00E9nom signature) et `mugphoto` (photo import\u00E9e sur la face visible + texte mis en\n     forme sur l'autre face). En mode photo : lecture du fichier avec l'orientation EXIF, cadrage automatique \u00AB cover \u00BB recentrable\n     (glisser) et zoomable, forme (carr\u00E9, arrondi, rond, c\u0153ur), optimisation automatique (niveaux + l\u00E9g\u00E8re saturation, compens\u00E9e pour\n     la sublimation) d\u00E9brayable, contr\u00F4le qualit\u00E9 (dpi effectifs \u00E0 la taille imprim\u00E9e, nettet\u00E9, exposition) qui bloque sous le seuil ;\n     fichiers : PNG 300 dpi de toute la zone (photo + texte) + aper\u00E7u JPEG visible au panier + photo d'origine (\u2264 8 Mo) pour l'atelier. \u2500\u2500 */\n  function makeMug(PHOTO) {\n    var M = cfg.mug || {};\n    var ZONE = { w: +M.zoneW || 210, h: +M.zoneH || 90, mt: +M.marginTop || 8, mb: +M.marginBottom || 8, ml: +M.marginLeft || 10, mr: +M.marginRight || 10 };\n    var DESIGN_W = +M.designW || 72, PLACE = M.place || 'droite', MAXN = +M.maxChars || 22, MAXP = +M.phraseMax || 30, DPI = +M.dpi || 300;\n    var P = cfg.mugphoto || {};\n    var PH = { w: +P.panelMm || 74, r: +P.radiusMm || 5, minDpi: +P.minDpi || 100, goodDpi: +P.goodDpi || 150, greatDpi: +P.greatDpi || 250, place: P.place || PLACE, shapes: P.shapes || ['carre', 'arrondi', 'rond', 'coeur'], maxMb: +P.maxMb || 20, keepOriginalMb: +P.keepOriginalMb || 8 };\n    var SHAPES = { carre: 'Carr\u00E9', arrondi: 'Carr\u00E9 arrondi', rond: 'Rond', coeur: 'C\u0153ur' };\n    var TEXT_PLACE = PHOTO ? (PH.place === 'droite' ? 'gauche' : 'droite') : PLACE; // en mode photo, le texte prend l'autre face\n    var NAME_MM = +M.nameMm || 26, PHRASE_MM = +M.phraseMm || 5, PHRASE_LS = M.phraseLs === undefined ? 0.18 : +M.phraseLs, PHRASE_UPPER = M.phraseUpper !== false;\n    var INITIAL_SCALE = +M.initialScale || 2.3, INITIAL_TINT = +M.initialTint || 0.35;\n    var STYLES = [\n      { key: 'monogram', label: 'Monogramme', font: 'Allura', wt: 400, vec: 'Allura', initial: { font: 'Cormorant Garamond', wt: 600, vec: 'Cormorant Garamond 600' }, em: 1 },\n      { key: 'signature', label: 'Signature', font: 'Allura', wt: 400, vec: 'Allura', em: 1 },\n      { key: 'signature-moderne', label: 'Signature moderne', font: 'Sacramento', wt: 400, vec: 'Sacramento', em: 1.05 },\n      { key: 'moderne', label: 'Moderne', font: 'Montserrat', wt: 600, vec: 'Montserrat 600', upper: true, ls: 0.12, em: 0.6 },\n      { key: 'ecriture', label: '\u00C9criture', font: 'Caveat', wt: 600, vec: 'Caveat 600', em: 0.92 },\n      { key: 'calligraphie', label: 'Calligraphie', font: 'Great Vibes', wt: 400, vec: 'Great Vibes', em: 1.02 }\n    ];\n    var PHRASE_FONT = { font: 'Montserrat', wt: 500, vec: 'Montserrat 500' };\n    var PRESETS_DEFAULT = 'Populaires|\u00C9dition originale\\nPopulaires|Pi\u00E8ce unique\\nPopulaires|100 % authentique\\nPopulaires|Toujours au top\\nPopulaires|Toujours plus loin\\nAnniversaire|Depuis [ann\u00E9e]\\nAnniversaire|Mill\u00E9sime [ann\u00E9e]\\nAnniversaire|Une l\u00E9gende depuis [ann\u00E9e]\\nAnniversaire|Vieilli(e) \u00E0 la perfection\\nCaf\u00E9|Jamais sans mon caf\u00E9\\nCaf\u00E9|Toujours un caf\u00E9 d\u2019avance\\nCaf\u00E9|Fonctionne au caf\u00E9\\nFamille|Super Maman\\nFamille|Super Papa\\nFamille|Mamie en or\\nFamille|Papy en or\\nCouple|Mon humain pr\u00E9f\u00E9r\u00E9\\nCouple|Ensemble depuis [ann\u00E9e]\\nTravail|Coll\u00E8gue en or\\nTravail|Fait avec passion';\n    var PRESETS = String(M.presets || PRESETS_DEFAULT).split(/\\r?\\n/).map(function (l) { return l.trim(); }).filter(Boolean).map(function (l) { var p = l.split('|'); return p.length > 1 ? { cat: p[0].trim(), text: p.slice(1).join('|').trim() } : { cat: 'Populaires', text: l }; });\n    var CATS = []; PRESETS.forEach(function (p) { if (CATS.indexOf(p.cat) < 0) CATS.push(p.cat); });\n    var YEAR_RX = /\\[ann[\u00E9e]e\\]/i;\n    var DEMO_NAMES = ['Nicolas', 'L\u00E9a', 'Anne-Sophie', 'Ma\u00EBlys', 'Jean-Luc', 'Camille', 'Th\u00E9o', '\u00C9lo\u00EFse', 'Gabin', 'Margaux'];\n    var DEMO_PHRASES = ['Depuis 1984', '', 'Jamais sans mon caf\u00E9', 'Super Maman', '', 'Pi\u00E8ce unique', '\u00C9dition originale', '', 'Coll\u00E8gue en or', 'Ensemble depuis 2012'];\n    var pngBlob = null, pngKey = '';\n    var demo = makeDemo({ list: DEMO_NAMES, idle: function () { return !state.name.trim(); }, set: function (n) {\n      demo.style = STYLES[n % STYLES.length].key; demo.color = (cfg.palette || [])[n % Math.max(1, (cfg.palette || []).length)]; demo.phrase = DEMO_PHRASES[n % DEMO_PHRASES.length];\n    } });\n    function styleOf(k) { return STYLES.filter(function (s) { return s.key === (k || state.style); })[0] || STYLES[0]; }\n    function styleNow() { return demo.active() && demo.style ? demo.style : state.style; }\n    function colorNow() { return demo.active() && demo.color ? demo.color.name : state.color; }\n    function hexNow() { return hexFor(colorNow(), '#161616'); }\n    function initialOf(t) { t = String(t || '').trim(); return t ? t.charAt(0).toUpperCase() : ''; } // Anne-Sophie \u2192 A, Jean Luc \u2192 J, D'Angelo \u2192 D\n    function tint(hex) {\n      // teinte att\u00E9nu\u00E9e de la couleur (m\u00E9lange INITIAL_TINT couleur / blanc) : une couleur pleine, imprimable telle quelle\n      var m = /^#?([0-9a-f]{6})$/i.exec(hex || ''); if (!m) return '#D9D9D9';\n      var n = parseInt(m[1], 16), r = n >> 16, g = (n >> 8) & 255, b = n & 255;\n      function c(v) { return ('0' + Math.round(255 - (255 - v) * INITIAL_TINT).toString(16)).slice(-2); }\n      return '#' + c(r) + c(g) + c(b);\n    }\n    function phraseFinal() {\n      var p = state.phrase, t = '';\n      if (p.mode === 'preset') t = (p.preset || '').replace(YEAR_RX, p.year || '');\n      else if (p.mode === 'custom') t = p.text;\n      t = t.replace(/\\s+/g, ' ').trim();\n      return t;\n    }\n    function phraseShown(t) { return PHRASE_UPPER ? String(t || '').toUpperCase() : String(t || ''); }\n    function needsYear() { return state.phrase.mode === 'preset' && YEAR_RX.test(state.phrase.preset || ''); }\n    var mod = {\n      inlineFirst: true,\n      steps: PHOTO ? ['photo', 'name', 'style', 'color', 'phrase'] : ['name', 'style', 'color', 'phrase'],\n      labels: PHOTO ? { photo: 'Votre photo', name: 'Votre texte, sur l\u2019autre face', style: 'Style du texte', color: 'Couleur du texte', phrase: 'Ajoutez une petite phrase' }\n        : { name: 'Votre pr\u00E9nom', style: 'Choisissez votre style', color: 'Choisissez votre couleur', phrase: 'Ajoutez une petite phrase' },\n      mainStep: PHOTO ? 'photo' : 'name',\n      render: {},\n      init: function () {\n        state.name = ''; state.style = STYLES.some(function (s) { return s.key === M.defaultStyle; }) ? M.defaultStyle : (PHOTO ? 'signature' : 'monogram');\n        state.phrase = { mode: 'none', text: '', preset: '', year: '', cat: CATS[0] || 'Populaires' };\n        state.confirm = false; state.view = 'mug';\n        if (!state.color && (cfg.palette || []).length) state.color = cfg.palette[0].name;\n        STYLES.forEach(function (s) { OT.ensureFont(s.vec); if (s.initial) OT.ensureFont(s.initial.vec); }); OT.ensureFont(PHRASE_FONT.vec); OT.ensureClipper();\n        if (PHOTO) { photo.shape = SHAPES[P.defaultShape] ? P.defaultShape : (PH.shapes[0] || 'carre'); photo.enhance = P.enhance !== false; setTimeout(restorePhotoHandoff, 300); }\n        else setTimeout(demo.start, 400);\n      }\n    };\n    function hasPhoto() { return PHOTO && !!photo.bmp; }\n    function isReal() { return PHOTO ? hasPhoto() : !!state.name.trim(); } // \u00AB vrai \u00BB aper\u00E7u : photo pos\u00E9e (mode photo) ou pr\u00E9nom saisi\n    /* \u2500\u2500 Mesures (canvas, en mm : mesure \u00E0 \u00D710 pour la pr\u00E9cision) \u2500\u2500 */\n    function measureLine(t, font, wt, size, ls) {\n      var S = size * 10; mctx.font = wt + ' ' + S + 'px \"' + font + '\", sans-serif';\n      var mm = mctx.measureText(t), extra = ls ? ls * S * Math.max(0, t.length - 1) : 0;\n      var asc = mm.actualBoundingBoxAscent >= 0 ? mm.actualBoundingBoxAscent : S * 0.75, desc = mm.actualBoundingBoxDescent >= 0 ? mm.actualBoundingBoxDescent : S * 0.25;\n      var ink = (mm.actualBoundingBoxLeft >= 0 && mm.actualBoundingBoxRight > 0) ? mm.actualBoundingBoxLeft + mm.actualBoundingBoxRight : mm.width;\n      var cap = mctx.measureText('H').actualBoundingBoxAscent; if (!(cap > 0)) cap = S * 0.7;\n      return { w: (ink + extra) / 10, adv: (mm.width + extra) / 10, asc: asc / 10, desc: desc / 10, capH: cap / 10 };\n    }\n    function nameSizeMm(t, st) { var n = t.length, f = n <= 8 ? 1 : (n <= 13 ? 0.85 : (n <= 18 ? 0.72 : 0.6)); return NAME_MM * (st.em || 1) * f; }\n    function placeX(place) {\n      // centre du motif dans le gabarit : le gabarit s'enroule depuis l'anse, la face visible est \u00E0 un quart de tour \u2192 le motif se centre\n      // sur le quart droit (anse \u00E0 droite, comme sur les photos) ou le quart gauche ; \u00AB centre \u00BB = face oppos\u00E9e \u00E0 l'anse\n      var usable = ZONE.w - ZONE.ml - ZONE.mr, pl = place || TEXT_PLACE;\n      if (pl === 'gauche') return ZONE.ml + usable / 4;\n      if (pl === 'droite') return ZONE.w - ZONE.mr - usable / 4;\n      return ZONE.w / 2;\n    }\n    function zoneCy() { return ZONE.mt + (ZONE.h - ZONE.mt - ZONE.mb) / 2; }\n    /* \u2500\u2500 Panneau photo (mode photo) : carr\u00E9 de PH.w mm centr\u00E9 sur sa face, forme d\u00E9coup\u00E9e \u2500\u2500 */\n    function panel() { var w = Math.min(PH.w, ZONE.h - ZONE.mt - ZONE.mb); return { cx: placeX(PH.place), cy: zoneCy(), w: w, h: w }; }\n    function shapePath(ctx, x, y, w, h, shape, k) {\n      // trac\u00E9 de la forme en px ; k = px/mm pour le rayon des angles arrondis\n      var r = Math.min(w, h) * 0.06 + (PH.r || 0) * (k || 1) * 0;\n      ctx.beginPath();\n      if (shape === 'rond') { ctx.ellipse(x + w / 2, y + h / 2, w / 2, h / 2, 0, 0, Math.PI * 2); }\n      else if (shape === 'coeur') {\n        // c\u0153ur sym\u00E9trique inscrit dans le carr\u00E9 (deux arcs + pointe), l\u00E9g\u00E8rement plus large que haut\n        var cx = x + w / 2, top = y + h * 0.28, bottom = y + h * 0.98, half = w / 2;\n        ctx.moveTo(cx, bottom);\n        ctx.bezierCurveTo(x - w * 0.06, y + h * 0.62, x - w * 0.02, y + h * 0.02, cx, top);\n        ctx.bezierCurveTo(x + w * 1.02, y + h * 0.02, x + w * 1.06, y + h * 0.62, cx, bottom);\n        ctx.closePath(); if (half) { /* noop */ }\n      }\n      else if (shape === 'arrondi') {\n        var rr = (PH.r || 5) * (k || 1);\n        ctx.moveTo(x + rr, y); ctx.lineTo(x + w - rr, y); ctx.quadraticCurveTo(x + w, y, x + w, y + rr); ctx.lineTo(x + w, y + h - rr); ctx.quadraticCurveTo(x + w, y + h, x + w - rr, y + h);\n        ctx.lineTo(x + rr, y + h); ctx.quadraticCurveTo(x, y + h, x, y + h - rr); ctx.lineTo(x, y + rr); ctx.quadraticCurveTo(x, y, x + rr, y); ctx.closePath();\n      }\n      else { ctx.rect(x, y, w, h); }\n      if (r) { /* r\u00E9serv\u00E9 */ }\n    }\n    function shapeSvgPath(x, y, w, h, shape, k) {\n      // m\u00EAme forme en chemin SVG (aper\u00E7u \u00E0 plat)\n      var F = function (v) { return (Math.round(v * 100) / 100).toString(); };\n      if (shape === 'rond') return 'M' + F(x + w / 2) + ' ' + F(y) + ' a' + F(w / 2) + ' ' + F(h / 2) + ' 0 1 0 0.01 0 z';\n      if (shape === 'coeur') { var cx = x + w / 2, top = y + h * 0.28, bottom = y + h * 0.98; return 'M' + F(cx) + ' ' + F(bottom) + ' C' + F(x - w * 0.06) + ' ' + F(y + h * 0.62) + ' ' + F(x - w * 0.02) + ' ' + F(y + h * 0.02) + ' ' + F(cx) + ' ' + F(top) + ' C' + F(x + w * 1.02) + ' ' + F(y + h * 0.02) + ' ' + F(x + w * 1.06) + ' ' + F(y + h * 0.62) + ' ' + F(cx) + ' ' + F(bottom) + ' z'; }\n      if (shape === 'arrondi') { var rr = (PH.r || 5) * (k || 1); return 'M' + F(x + rr) + ' ' + F(y) + ' H' + F(x + w - rr) + ' Q' + F(x + w) + ' ' + F(y) + ' ' + F(x + w) + ' ' + F(y + rr) + ' V' + F(y + h - rr) + ' Q' + F(x + w) + ' ' + F(y + h) + ' ' + F(x + w - rr) + ' ' + F(y + h) + ' H' + F(x + rr) + ' Q' + F(x) + ' ' + F(y + h) + ' ' + F(x) + ' ' + F(y + h - rr) + ' V' + F(y + rr) + ' Q' + F(x) + ' ' + F(y) + ' ' + F(x + rr) + ' ' + F(y) + ' z'; }\n      return 'M' + F(x) + ' ' + F(y) + ' h' + F(w) + ' v' + F(h) + ' h' + F(-w) + ' z';\n    }\n    /* \u2500\u2500 Photo : lecture (orientation EXIF respect\u00E9e), canvas de travail, analyse qualit\u00E9, optimisation \u2500\u2500 */\n    var photo = { file: null, name: '', bmp: null, w: 0, h: 0, work: null, workEnh: null, workK: 1, zoom: 1, dx: 0, dy: 0, dx0: 0, dy0: 0, shape: 'carre', enhance: true, q: null, busy: false, err: '', lut: null, dataUrl: '', dataUrlKey: '' };\n    function autoFrame(c) {\n      // cadrage automatique : par d\u00E9faut la photo est centr\u00E9e ; en portrait, la fen\u00EAtre remonte (centre \u00E0 40 % de la hauteur, l\u00E0 o\u00F9\n      // sont les visages) ; si le navigateur sait d\u00E9tecter les visages (FaceDetector, Chrome / Android), le plus grand visage est\n      // plac\u00E9 un peu au-dessus du centre du carr\u00E9 ; rend { dx, dy } en fraction du panneau (born\u00E9s au dessin par photoBox)\n      var pn = panel(), sw = c.width, sh = c.height, cover = Math.max(pn.w / sw, pn.h / sh), dw = sw * cover, dh = sh * cover;\n      var base = { dx: 0, dy: sh > sw * 1.15 ? 0.1 * dh / pn.h : 0 };\n      if (typeof window.FaceDetector !== 'function') return Promise.resolve(base);\n      var p; try { p = new window.FaceDetector({ fastMode: true, maxDetectedFaces: 5 }).detect(c); } catch (e) { return Promise.resolve(base); }\n      return p.then(function (faces) {\n        if (!faces || !faces.length) return base;\n        var f = faces.reduce(function (a, b) { return b.boundingBox.width * b.boundingBox.height > a.boundingBox.width * a.boundingBox.height ? b : a; }).boundingBox;\n        var fx = (f.x + f.width / 2) / sw, fy = (f.y + f.height / 2) / sh;\n        return { dx: dw * (0.5 - fx) / pn.w, dy: (dh * (0.5 - fy) - 0.08 * pn.h) / pn.h };\n      }).catch(function () { return base; });\n    }\n    function loadPhotoBitmap(file) {\n      if (window.createImageBitmap) {\n        return createImageBitmap(file, { imageOrientation: 'from-image' }).catch(function () { return createImageBitmap(file); });\n      }\n      return new Promise(function (res, rej) { var url = URL.createObjectURL(file), img = new Image(); img.onload = function () { URL.revokeObjectURL(url); res(img); }; img.onerror = function () { URL.revokeObjectURL(url); rej(new Error('lecture')); }; img.src = url; });\n    }\n    function bmpW(b) { return b.width || b.naturalWidth || 0; }\n    function bmpH(b) { return b.height || b.naturalHeight || 0; }\n    function buildLut(c) {\n      // niveaux automatiques : \u00E9tirement entre les percentiles 0,5 % et 99,5 % de la luminance, puis courbe douce ; la sublimation\n      // assombrit l\u00E9g\u00E8rement les demi-teintes \u2192 gamma 0,94 ; saturation +8 % appliqu\u00E9e \u00E0 part (enhancePixels)\n      var ctx = c.getContext('2d'), d = ctx.getImageData(0, 0, c.width, c.height).data, hist = new Uint32Array(256), n = d.length / 4, i, l;\n      for (i = 0; i < d.length; i += 4) { l = (d[i] * 299 + d[i + 1] * 587 + d[i + 2] * 114) / 1000 | 0; hist[l]++; }\n      var lo = 0, hi = 255, acc = 0, cut = n * 0.005;\n      for (i = 0; i < 256; i++) { acc += hist[i]; if (acc > cut) { lo = i; break; } }\n      acc = 0; for (i = 255; i >= 0; i--) { acc += hist[i]; if (acc > cut) { hi = i; break; } }\n      if (hi - lo < 40) { lo = Math.max(0, lo - 20); hi = Math.min(255, hi + 20); }\n      var lut = new Uint8ClampedArray(256), span = Math.max(1, hi - lo);\n      for (i = 0; i < 256; i++) { var v = Math.min(1, Math.max(0, (i - lo) / span)); lut[i] = Math.round(Math.pow(v, 0.94) * 255); }\n      return lut;\n    }\n    function enhancePixels(imgData, lut) {\n      var d = imgData.data, i, r, g, b, l, sat = 1.08;\n      for (i = 0; i < d.length; i += 4) {\n        r = lut[d[i]]; g = lut[d[i + 1]]; b = lut[d[i + 2]];\n        l = (r * 299 + g * 587 + b * 114) / 1000;\n        d[i] = Math.max(0, Math.min(255, l + (r - l) * sat)); d[i + 1] = Math.max(0, Math.min(255, l + (g - l) * sat)); d[i + 2] = Math.max(0, Math.min(255, l + (b - l) * sat));\n      }\n      return imgData;\n    }\n    function analyzePhoto(c) {\n      // nettet\u00E9 : variance du laplacien sur une copie 400 px en niveaux de gris ; exposition : luminance moyenne\n      var s = 400 / Math.max(c.width, c.height), w = Math.max(8, Math.round(c.width * s)), h = Math.max(8, Math.round(c.height * s));\n      var t = document.createElement('canvas'); t.width = w; t.height = h; var ctx = t.getContext('2d'); ctx.drawImage(c, 0, 0, w, h);\n      var d = ctx.getImageData(0, 0, w, h).data, g = new Float32Array(w * h), i, x, y, sum = 0;\n      for (i = 0; i < w * h; i++) { g[i] = (d[i * 4] * 299 + d[i * 4 + 1] * 587 + d[i * 4 + 2] * 114) / 1000; sum += g[i]; }\n      var mean = sum / (w * h), lap = 0, lap2 = 0, cnt = 0;\n      for (y = 1; y < h - 1; y++) for (x = 1; x < w - 1; x++) { i = y * w + x; var v = 4 * g[i] - g[i - 1] - g[i + 1] - g[i - w] - g[i + w]; lap += v; lap2 += v * v; cnt++; }\n      var varLap = cnt ? lap2 / cnt - (lap / cnt) * (lap / cnt) : 0;\n      return { sharp: Math.sqrt(varLap), mean: mean };\n    }\n    function photoDpi() {\n      // dpi effectifs de la photo \u00E0 la taille imprim\u00E9e : pixels de la photo r\u00E9ellement couverts par le panneau (zoom compris)\n      if (!photo.bmp) return 0;\n      var pn = panel(), cover = Math.max(pn.w / photo.w, pn.h / photo.h) * photo.zoom; // mm par px source\n      return 25.4 / cover;\n    }\n    function photoGrade() {\n      var dpi = photoDpi(); if (!dpi) return null;\n      var q = photo.q || { sharp: 99, mean: 128 }, g = dpi >= PH.greatDpi ? 'great' : (dpi >= PH.goodDpi ? 'good' : (dpi >= PH.minDpi ? 'fair' : 'low'));\n      var notes = [];\n      if (q.sharp < 6) notes.push('photo peut-\u00EAtre floue');\n      if (q.mean < 60) notes.push('photo sombre');\n      if (q.mean > 215) notes.push('photo tr\u00E8s claire');\n      return { dpi: Math.round(dpi), grade: g, label: g === 'great' ? 'Excellente' : (g === 'good' ? 'Bonne' : (g === 'fair' ? 'Correcte' : 'Insuffisante')), notes: notes };\n    }\n    function setPhotoFile(file) {\n      photo.err = ''; photo.busy = true; photo.file = file; photo.name = file.name; photo.q = null; photo.dataUrl = ''; photo.dataUrlKey = '';\n      if (file.size > PH.maxMb * 1024 * 1024) { photo.busy = false; photo.file = null; photo.err = 'Fichier trop lourd (' + PH.maxMb + ' Mo max.).'; return Promise.resolve(); }\n      if (!/^image\\/(jpeg|png|webp|heic|heif|gif|bmp|tiff)/i.test(file.type) && !/\\.(jpe?g|png|webp|heic|heif|gif|bmp|tiff?)$/i.test(file.name)) { photo.busy = false; photo.file = null; photo.err = 'Format non reconnu : d\u00E9posez une photo JPEG, PNG ou WebP.'; return Promise.resolve(); }\n      return loadPhotoBitmap(file).then(function (b) {\n        photo.bmp = b; photo.w = bmpW(b); photo.h = bmpH(b);\n        if (!photo.w || !photo.h) throw new Error('vide');\n        var k = Math.min(1, 1600 / Math.max(photo.w, photo.h)), c = document.createElement('canvas'); c.width = Math.max(1, Math.round(photo.w * k)); c.height = Math.max(1, Math.round(photo.h * k));\n        var ctx = c.getContext('2d'); ctx.imageSmoothingEnabled = true; try { ctx.imageSmoothingQuality = 'high'; } catch (e) { /* noop */ } ctx.drawImage(b, 0, 0, c.width, c.height);\n        photo.work = c; photo.workK = k; photo.q = analyzePhoto(c); photo.lut = buildLut(c);\n        var e = document.createElement('canvas'); e.width = c.width; e.height = c.height; var ectx = e.getContext('2d'); ectx.drawImage(c, 0, 0); ectx.putImageData(enhancePixels(ectx.getImageData(0, 0, e.width, e.height), photo.lut), 0, 0);\n        photo.workEnh = e; photo.zoom = 1; photo.dx = 0; photo.dy = 0;\n        return autoFrame(c).then(function (af) {\n          if (photo.work !== c) return; // une autre photo a \u00E9t\u00E9 d\u00E9pos\u00E9e entre-temps\n          photo.dx = photo.dx0 = Math.round(af.dx * 1000) / 1000; photo.dy = photo.dy0 = Math.round(af.dy * 1000) / 1000; photo.busy = false;\n          savePhotoHandoff(file);\n          ga('mugphoto_uploaded', { px: photo.w + 'x' + photo.h });\n        });\n      }).catch(function () {\n        photo.busy = false; photo.file = null; photo.bmp = null; photo.work = null; photo.workEnh = null;\n        photo.err = /heic|heif/i.test(file.name + file.type) ? 'Ce navigateur ne lit pas les photos HEIC : exportez-la en JPEG (Partager \u2192 Enregistrer l\u2019image, ou r\u00E9glez l\u2019iPhone sur \u00AB Le plus compatible \u00BB).' : 'Photo illisible : essayez un autre fichier JPEG ou PNG.';\n      });\n    }\n    function photoSrc() { return photo.enhance && photo.workEnh ? photo.workEnh : photo.work; }\n    function photoBox(pn, k) {\n      // rectangle source\u2192destination : la photo couvre le panneau (\u00AB cover \u00BB), zoom \u2265 1, d\u00E9calage (dx, dy) en fraction du panneau\n      var src = photoSrc(), sw = src.width, sh = src.height, cover = Math.max(pn.w / sw, pn.h / sh) * photo.zoom; // mm par px de travail\n      var dw = sw * cover, dh = sh * cover, maxX = Math.max(0, (dw - pn.w) / 2), maxY = Math.max(0, (dh - pn.h) / 2);\n      var ox = Math.max(-maxX, Math.min(maxX, photo.dx * pn.w)), oy = Math.max(-maxY, Math.min(maxY, photo.dy * pn.h));\n      return { x: (pn.cx - dw / 2 + ox) * k, y: (pn.cy - dh / 2 + oy) * k, w: dw * k, h: dh * k, src: src };\n    }\n    function drawPhoto(ctx, k, ox, oy, alpha, full) {\n      // photo d\u00E9coup\u00E9e \u00E0 la forme, dans le panneau ; full = dessiner depuis le bitmap plein format (fichier de production)\n      var pn = panel(), x = ox + (pn.cx - pn.w / 2) * k, y = oy + (pn.cy - pn.h / 2) * k, w = pn.w * k, h = pn.h * k;\n      ctx.save(); if (alpha !== undefined) ctx.globalAlpha = alpha;\n      shapePath(ctx, x, y, w, h, photo.shape, k); ctx.clip();\n      if (photo.bmp && photo.work) {\n        var b = photoBox(pn, k);\n        if (full) {\n          // plein format : m\u00EAmes proportions, source = bitmap d'origine (photoBox est cal\u00E9 sur le canvas de travail)\n          ctx.imageSmoothingEnabled = true; try { ctx.imageSmoothingQuality = 'high'; } catch (e) { /* noop */ }\n          ctx.drawImage(photo.bmp, 0, 0, photo.w, photo.h, ox + b.x, oy + b.y, b.w, b.h);\n        } else ctx.drawImage(b.src, ox + b.x, oy + b.y, b.w, b.h);\n      } else {\n        // pas encore de photo : r\u00E9serve claire avec un pictogramme, pour situer la photo dans l'aper\u00E7u\n        ctx.fillStyle = '#EDE9E2'; ctx.fillRect(x, y, w, h);\n        ctx.fillStyle = '#9A948A'; ctx.font = '600 ' + (h * 0.09).toFixed(1) + 'px Inter, sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\n        ctx.fillText('Votre photo', x + w / 2, y + h * 0.56);\n        ctx.strokeStyle = '#9A948A'; ctx.lineWidth = Math.max(1, h * 0.012);\n        var iw = w * 0.22, ih = iw * 0.72, ix = x + w / 2 - iw / 2, iy = y + h * 0.36 - ih / 2; // appareil photo\n        ctx.strokeRect(ix, iy, iw, ih); ctx.beginPath(); ctx.arc(ix + iw / 2, iy + ih / 2, ih * 0.28, 0, Math.PI * 2); ctx.stroke();\n      }\n      ctx.restore();\n    }\n    function photoDataUrl() {\n      // photo cadr\u00E9e, \u00E0 la forme, pour la vue \u00E0 plat (SVG <image>) ; mise en cache par cadrage\n      var key = [photo.name, photo.zoom, photo.dx, photo.dy, photo.shape, photo.enhance ? 1 : 0].join('|');\n      if (photo.dataUrl && photo.dataUrlKey === key) return photo.dataUrl;\n      var pn = panel(), k = 4, c = document.createElement('canvas'); c.width = Math.round(pn.w * k); c.height = Math.round(pn.h * k);\n      drawPhoto(c.getContext('2d'), k, -(pn.cx - pn.w / 2) * k, -(pn.cy - pn.h / 2) * k);\n      photo.dataUrl = c.toDataURL('image/jpeg', 0.82); photo.dataUrlKey = key; return photo.dataUrl;\n    }\n    /* reprise : la photo est gard\u00E9e quelques heures dans IndexedDB (comme le logo) pour le bouton \u00AB Modifier \u00BB du panier */\n    var HANDOFF_MS = 6 * 3600 * 1000;\n    function idbPhoto() { return new Promise(function (res, rej) { if (!window.indexedDB) return rej(new Error('idb')); var r = indexedDB.open('leni-cfg', 1); r.onupgradeneeded = function () { r.result.createObjectStore('files'); }; r.onsuccess = function () { res(r.result); }; r.onerror = function () { rej(r.error); }; }); }\n    function savePhotoHandoff(file) { idbPhoto().then(function (db) { db.transaction('files', 'readwrite').objectStore('files').put({ name: file.name, type: file.type, blob: file, at: Date.now() }, 'mugphoto'); }).catch(function () { /* noop */ }); }\n    function restorePhotoHandoff() {\n      if (photo.file) return;\n      idbPhoto().then(function (db) { return new Promise(function (res) { var r = db.transaction('files').objectStore('files').get('mugphoto'); r.onsuccess = function () { res(r.result || null); }; r.onerror = function () { res(null); }; }); })\n        .then(function (rec) { if (!rec || !rec.blob || photo.file || Date.now() - rec.at > HANDOFF_MS) return; var f; try { f = new File([rec.blob], rec.name, { type: rec.type }); } catch (e) { return; } setPhotoFile(f).then(function () { if (mod.onPhotoRestored) { mod.onPhotoRestored(); mod.onPhotoRestored = null; } mod.validate(); update(); loadFonts(mod.fontsToLoad()).then(renderPreview); }); })\n        .catch(function () { /* noop */ });\n    }\n    function layout(src) {\n      // src: { name, style, phrase (texte final), color } \u2192 cotes en mm dans la zone d'impression\n      var st = styleOf(src.style), t = String(src.name || '').trim(), up = st.upper ? t.toUpperCase() : t, size = nameSizeMm(t, st), ls = st.ls || 0;\n      var m = measureLine(up, st.font, st.wt, size, ls);\n      if (m.w > DESIGN_W) { size = size * DESIGN_W / m.w; m = measureLine(up, st.font, st.wt, size, ls); }\n      var ph = null, pt = phraseShown(src.phrase);\n      if (pt) {\n        // la phrase prend \u00E0 peu pr\u00E8s la largeur du pr\u00E9nom (jamais plus large que la zone utile), corps \u2265 PHRASE_MM et \u2264 40 % du pr\u00E9nom\n        var ps = 10, pm = measureLine(pt, PHRASE_FONT.font, PHRASE_FONT.wt, ps, PHRASE_LS), target = Math.min(DESIGN_W, Math.max(m.w * (+M.phraseRatio || 1), 30));\n        ps = ps * target / Math.max(pm.w, 1); ps = Math.min(ps, size * 0.42); ps = Math.max(ps, PHRASE_MM);\n        pm = measureLine(pt, PHRASE_FONT.font, PHRASE_FONT.wt, ps, PHRASE_LS);\n        if (pm.w > DESIGN_W) { ps = ps * DESIGN_W / pm.w; pm = measureLine(pt, PHRASE_FONT.font, PHRASE_FONT.wt, ps, PHRASE_LS); }\n        ph = { text: pt, size: ps, m: pm, ls: PHRASE_LS };\n      }\n      var gap = size * 0.16, totalH = m.asc + m.desc + (ph ? gap + ph.m.asc + ph.m.desc : 0);\n      var cx = placeX(), cy = ZONE.mt + (ZONE.h - ZONE.mt - ZONE.mb) / 2, top = cy - totalH / 2, base = top + m.asc;\n      var ini = null;\n      if (st.initial && t) {\n        // l'initiale garde une taille fixe (INITIAL_SCALE \u00D7 le corps maximal du pr\u00E9nom), quelle que soit la longueur du pr\u00E9nom (d\u00E9cision Nico)\n        var isz = NAME_MM * (st.em || 1) * INITIAL_SCALE, im = measureLine(initialOf(t), st.initial.font, st.initial.wt, isz, 0);\n        var centre = base - (m.asc - m.desc) / 2; ini = { text: initialOf(t), font: st.initial.font, wt: st.initial.wt, vec: st.initial.vec, size: isz, m: im, base: centre + im.capH / 2 };\n      }\n      if (ph) ph.base = base + m.desc + gap + ph.m.asc;\n      return { st: st, cx: cx, name: { text: up, font: st.font, wt: st.wt, vec: st.vec, size: size, base: base, m: m, ls: ls }, phrase: ph, initial: ini, top: top, bottom: top + totalH, empty: !t };\n    }\n    function current() { var dm = demo.active(); return { name: dm ? demo.text() : state.name, style: styleNow(), phrase: dm ? demo.phrase : phraseFinal(), color: colorNow() }; }\n    function inks(color, styleKey) {\n      // main = couleur choisie ; initial = teinte att\u00E9nu\u00E9e (Monogramme) ; phrase = couleur secondaire de la palette hors Monogramme\n      var main = hexFor(color, '#161616'), p = paletteItem(color), st = styleOf(styleKey), sec = p && /^#[0-9a-f]{6}$/i.test(p.hex2 || '') ? p.hex2 : '';\n      return { main: main, initial: tint(main), phrase: (!st.initial && sec) ? sec : main };\n    }\n    /* \u2500\u2500 Photo d'ambiance par style (cfg.mug.bgs) : { url, cal: 'cx, cy, largeur, hauteur' en px de la photo } \u2500\u2500 */\n    var BG_CACHE = {};\n    function bgFor(styleKey) {\n      var b = M.bgs && M.bgs[styleKey]; if (!b || !b.url) return null;\n      var c = String(b.cal || '').split(/[,\\s;]+/).map(parseFloat).filter(function (v) { return !isNaN(v); });\n      return { url: b.url, cal: c.length >= 4 ? { cx: c[0], cy: c[1], w: c[2], h: c[3] } : null };\n    }\n    function loadBg(url) {\n      if (!BG_CACHE[url]) { BG_CACHE[url] = new Promise(function (res, rej) { var im = new Image(); im.onload = function () { res(im); }; im.onerror = rej; im.src = url; }); BG_CACHE[url].catch(function () { delete BG_CACHE[url]; }); }\n      return BG_CACHE[url];\n    }\n    function drawDesign(ctx, L, ink, s, ox, oy, alpha, full) {\n      // dessine le motif (initiale, pr\u00E9nom, phrase) sur un canvas : L en mm, s = px/mm, (ox, oy) = point (0, 0) de la zone d'impression ;\n      // en mode photo, la photo (ou sa r\u00E9serve) est dessin\u00E9e d'abord sur sa face ; full = photo depuis le bitmap plein format,\n      // full === 'text' = texte seul (la photo a d\u00E9j\u00E0 \u00E9t\u00E9 pos\u00E9e par l'appelant)\n      if (PHOTO && full !== 'text') drawPhoto(ctx, s, ox, oy, alpha, full);\n      ctx.save(); if (alpha !== undefined) ctx.globalAlpha = alpha; ctx.textBaseline = 'alphabetic';\n      function spaced(t, font, wt, size, ls, cx, y) {\n        ctx.font = wt + ' ' + (size * s) + 'px \"' + font + '\", sans-serif';\n        if (!ls) { ctx.textAlign = 'center'; ctx.fillText(t, ox + cx * s, oy + y * s); return; }\n        ctx.textAlign = 'left'; var chars = t.split(''), ws = chars.map(function (ch) { return ctx.measureText(ch).width; }), adv = ws.reduce(function (a, b) { return a + b; }, 0) + ls * size * s * Math.max(0, chars.length - 1), x = ox + cx * s - adv / 2;\n        chars.forEach(function (ch, i) { if (ch !== ' ') ctx.fillText(ch, x, oy + y * s); x += ws[i] + ls * size * s; });\n      }\n      if (L.initial) { ctx.fillStyle = ink.initial; spaced(L.initial.text, L.initial.font, L.initial.wt, L.initial.size, 0, L.cx, L.initial.base); }\n      if (L.name.text) { ctx.fillStyle = ink.main; spaced(L.name.text, L.name.font, L.name.wt, L.name.size, L.name.ls, L.cx, L.name.base); }\n      if (L.phrase) { ctx.fillStyle = ink.phrase; spaced(L.phrase.text, PHRASE_FONT.font, PHRASE_FONT.wt, L.phrase.size, L.phrase.ls, L.cx, L.phrase.base); }\n      ctx.restore();\n    }\n    function drawShot(c, img, cal, L, ink, alpha) {\n      // photo + motif courb\u00E9 sur le cylindre (rayon = diam\u00E8tre/2, projection orthographique : x = cx + R\u00B7sin(s/R)), fondu \u00AB multiplier \u00BB\n      // pour garder les reflets et les ombres de la c\u00E9ramique\n      var W = img.naturalWidth, H = img.naturalHeight; if (c.width !== W || c.height !== H) { c.width = W; c.height = H; }\n      var ctx = c.getContext('2d'); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.globalCompositeOperation = 'source-over'; ctx.globalAlpha = 1; ctx.clearRect(0, 0, W, H); ctx.drawImage(img, 0, 0, W, H);\n      if (!cal || (!PHOTO && L.empty && !L.name.text)) return;\n      var diam = +M.diamMm || 82, k = cal.w / diam, Rpx = cal.w / 2, Rmm = diam / 2;\n      var off = document.createElement('canvas'), ow = Math.ceil(ZONE.w * k), oh = Math.ceil(ZONE.h * k); off.width = ow; off.height = oh;\n      drawDesign(off.getContext('2d'), L, ink, k, 0, 0);\n      // face montr\u00E9e : le texte (mug pr\u00E9nom, ou vue \u00AB face texte \u00BB du mug photo) ou la photo ; tout le demi-cylindre visible est projet\u00E9\n      var faceCx = PHOTO && state.view !== 'mug-text' ? panel().cx : L.cx;\n      var half = PHOTO ? ZONE.w : Math.max(L.name.m.w, L.phrase ? L.phrase.m.w : 0, L.initial ? L.initial.m.w : 0) / 2 + 3, x0 = Math.max(0, Math.floor((faceCx - half) * k)), x1 = Math.min(ow, Math.ceil((faceCx + half) * k));\n      var top = cal.cy - zoneCy() * k, i;\n      // les colonnes sont d'abord compos\u00E9es dans un calque opaque (recouvrement d'un demi-pixel : ni jour ni moir\u00E9, une photo\n      // comme un texte), puis ce calque est fondu en une seule fois en \u00AB multiplier \u00BB ; au-del\u00E0 de 80\u00B0 la surface n'est plus\n      // visible et les colonnes s'empileraient sur le bord (trait sombre), on s'arr\u00EAte avant\n      var proj = document.createElement('canvas'); proj.width = W; proj.height = H; var pctx = proj.getContext('2d');\n      pctx.imageSmoothingEnabled = true;\n      // vue l\u00E9g\u00E8rement plongeante (photo d'ambiance) : le bord du mug est une ellipse de rapport TILT ; un point de la surface\n      // \u00E0 l'angle \u03B8 remonte de R\u00B7TILT\u00B7(1 \u2212 cos \u03B8) par rapport au point de face \u2192 les lignes horizontales du motif (bords de la\n      // photo, ligne de base du texte) se courbent comme sur un vrai mug ; la hauteur se contracte de cos(\u00E9l\u00E9vation)\n      var TILT = M.tilt === undefined ? 0.14 : Math.max(0, +M.tilt), vsc = Math.sqrt(Math.max(0, 1 - TILT * TILT));\n      for (i = x0; i < x1; i++) {\n        var smm = (i + 0.5) / k - faceCx, ang = smm / Rmm; if (Math.abs(ang) >= 1.396) continue;\n        var sx = cal.cx + Rpx * Math.sin(ang), wsc = Math.max(0.35, Math.cos(ang)), dy = -Rpx * TILT * (1 - Math.cos(ang));\n        pctx.drawImage(off, i, 0, 1, oh, sx - wsc / 2 - 0.25, top + dy + oh * (1 - vsc) / 2, wsc + 0.5, oh * vsc);\n      }\n      ctx.globalCompositeOperation = 'multiply'; ctx.globalAlpha = alpha === undefined ? 1 : alpha;\n      ctx.drawImage(proj, 0, 0);\n      ctx.globalCompositeOperation = 'source-over'; ctx.globalAlpha = 1;\n    }\n    function flatSvg(L, ink, opts) {\n      // motif \u00E0 plat dans la zone d'impression : miniature (sans cotes) ou vue compl\u00E8te cot\u00E9e (opts.dims)\n      var W = 1000, k = 900 / ZONE.w, ox = 50, H = opts && opts.dims ? 820 : Math.round(ZONE.h * k + 60), oy = opts && opts.dims ? (H - ZONE.h * k) / 2 - 20 : 30, out = [];\n      out.push('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Le motif \u00E0 plat dans la zone d\u2019impression\">');\n      out.push('<rect x=\"' + ox + '\" y=\"' + oy.toFixed(1) + '\" width=\"' + (ZONE.w * k).toFixed(1) + '\" height=\"' + (ZONE.h * k).toFixed(1) + '\" fill=\"#FFFFFF\" stroke=\"#1A1A1A\" stroke-opacity=\"0.25\"/>');\n      out.push('<rect x=\"' + (ox + ZONE.ml * k).toFixed(1) + '\" y=\"' + (oy + ZONE.mt * k).toFixed(1) + '\" width=\"' + ((ZONE.w - ZONE.ml - ZONE.mr) * k).toFixed(1) + '\" height=\"' + ((ZONE.h - ZONE.mt - ZONE.mb) * k).toFixed(1) + '\" fill=\"none\" stroke=\"#1A1A1A\" stroke-opacity=\"0.22\" stroke-dasharray=\"6 6\"/>');\n      if (opts && opts.dims) out.push('<rect x=\"' + (ox + (L.cx - DESIGN_W / 2) * k).toFixed(1) + '\" y=\"' + (oy + ZONE.mt * k).toFixed(1) + '\" width=\"' + (DESIGN_W * k).toFixed(1) + '\" height=\"' + ((ZONE.h - ZONE.mt - ZONE.mb) * k).toFixed(1) + '\" fill=\"none\" stroke=\"#C4923A\" stroke-opacity=\"0.6\" stroke-dasharray=\"4 5\"/>');\n      if (PHOTO) {\n        // la photo cadr\u00E9e (ou sa r\u00E9serve) d\u00E9coup\u00E9e \u00E0 la forme sur sa face, et les rep\u00E8res des deux faces\n        var pn = panel(), px = ox + (pn.cx - pn.w / 2) * k, py = oy + (pn.cy - pn.h / 2) * k, pw = pn.w * k, phh = pn.h * k, cid = 'leniPhotoClip' + (opts && opts.dims ? 'D' : 'M');\n        out.push('<defs><clipPath id=\"' + cid + '\"><path d=\"' + shapeSvgPath(px, py, pw, phh, photo.shape, k) + '\"/></clipPath></defs>');\n        if (hasPhoto()) out.push('<image href=\"' + photoDataUrl() + '\" x=\"' + px.toFixed(1) + '\" y=\"' + py.toFixed(1) + '\" width=\"' + pw.toFixed(1) + '\" height=\"' + phh.toFixed(1) + '\" preserveAspectRatio=\"none\" clip-path=\"url(#' + cid + ')\"/>');\n        else out.push('<path d=\"' + shapeSvgPath(px, py, pw, phh, photo.shape, k) + '\" fill=\"#EDE9E2\"/><text x=\"' + (px + pw / 2).toFixed(1) + '\" y=\"' + (py + phh / 2 + 6).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"' + (phh * 0.09).toFixed(1) + '\" font-weight=\"600\" fill=\"#9A948A\">Votre photo</text>');\n        if (opts && opts.dims) {\n          var fy = oy + ZONE.h * k + 26;\n          out.push('<text x=\"' + (ox + pn.cx * k).toFixed(1) + '\" y=\"' + fy.toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"20\" font-weight=\"600\" fill=\"#1A1A1A\" fill-opacity=\"0.7\">Face photo</text>');\n          out.push('<text x=\"' + (ox + L.cx * k).toFixed(1) + '\" y=\"' + fy.toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"20\" font-weight=\"600\" fill=\"#1A1A1A\" fill-opacity=\"0.7\">Face texte</text>');\n        }\n      }\n      out.push(design(L, k, ox, oy, ink, ''));\n      if (opts && opts.dims) {\n        out.push(dimLines({ x: ox, y: oy, w: ZONE.w * k, h: ZONE.h * k, wcm: ZONE.w / 10, hcm: ZONE.h / 10, ink: '#1A1A1A', bg: '#F7F5F1', plan: false, fs: 22 }));\n        out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 14) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"22\" fill=\"#1A1A1A\" fill-opacity=\"0.65\">' + (PHOTO ? 'Zone d\u2019impression ' + fmtCm(ZONE.w / 10) + ' \u00D7 ' + fmtCm(ZONE.h / 10) + ' cm \u00B7 la photo sur une face, le texte sur l\u2019autre \u00B7 l\u2019anse entre les deux' : 'Zone d\u2019impression ' + fmtCm(ZONE.w / 10) + ' \u00D7 ' + fmtCm(ZONE.h / 10) + ' cm \u00B7 motif centr\u00E9 sur la face visible \u00B7 phrase \u00E0 la largeur du pr\u00E9nom') + '</text>');\n      }\n      out.push('</svg>');\n      return out.join('');\n    }\n    /* \u2500\u2500 Aper\u00E7u : mug (sc\u00E8ne cr\u00E8me, 5 px/mm sur la face visible) ou motif \u00E0 plat (zone d'impression cot\u00E9e) \u2500\u2500 */\n    function svgText(o) {\n      // o: { text, font, wt, size, x, y, fill, ls, opacity }\n      return '<text x=\"' + o.x.toFixed(2) + '\" y=\"' + o.y.toFixed(2) + '\" text-anchor=\"middle\" font-family=\"\\'' + esc(o.font) + '\\', sans-serif\" font-weight=\"' + o.wt + '\" font-size=\"' + o.size.toFixed(2) + '\"' + (o.ls ? ' letter-spacing=\"' + (o.ls * o.size).toFixed(2) + '\"' : '') + ' fill=\"' + o.fill + '\"' + (o.opacity ? ' fill-opacity=\"' + o.opacity + '\"' : '') + '>' + esc(o.text) + '</text>';\n    }\n    function design(L, k, ox, oy, ink, opacity) {\n      // le motif (initiale, pr\u00E9nom, phrase) en px : (ox, oy) = position du point (0, 0) de la zone d'impression, k = px/mm ; ink = { main, initial, phrase }\n      var s = [], cx = ox + L.cx * k;\n      if (L.initial) s.push(svgText({ text: L.initial.text, font: L.initial.font, wt: L.initial.wt, size: L.initial.size * k, x: cx, y: oy + L.initial.base * k, fill: ink.initial, opacity: opacity }));\n      if (L.name.text) s.push(svgText({ text: L.name.text, font: L.name.font, wt: L.name.wt, size: L.name.size * k, x: cx + (L.name.ls ? L.name.ls * L.name.size * k / 2 : 0), y: oy + L.name.base * k, fill: ink.main, ls: L.name.ls, opacity: opacity }));\n      if (L.phrase) s.push(svgText({ text: L.phrase.text, font: PHRASE_FONT.font, wt: PHRASE_FONT.wt, size: L.phrase.size * k, x: cx + L.phrase.ls * L.phrase.size * k / 2, y: oy + L.phrase.base * k, fill: ink.phrase, ls: L.phrase.ls, opacity: opacity }));\n      return s.join('');\n    }\n    /* \u2500\u2500 Vue 3D : three.js charg\u00E9 \u00E0 la demande (au premier clic sur \u00AB En 3D \u00BB), mug aux cotes r\u00E9elles (\u00D8 diamMm \u00D7 95 mm) textur\u00E9\n       avec la zone d'impression pos\u00E9e sur un tour complet, anse \u00E0 droite, c\u00E9ramique brillante, rotation au doigt ou \u00E0 la souris \u2500\u2500 */\n    var THREE_URL = 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js', MUG_H = +M.heightMm || 95, threeP = null, v3 = null;\n    function loadThree() {\n      if (window.THREE) return Promise.resolve(window.THREE);\n      if (threeP) return threeP;\n      threeP = new Promise(function (res, rej) {\n        var s = document.createElement('script'); s.src = THREE_URL; s.async = true;\n        s.onload = function () { if (window.THREE) res(window.THREE); else { threeP = null; rej(new Error('three')); } };\n        s.onerror = function () { threeP = null; rej(new Error('three')); };\n        document.head.appendChild(s);\n      });\n      return threeP;\n    }\n    function wrapTexture(T) {\n      // toute la circonf\u00E9rence \u00E0 6 px/mm : blanc, puis la zone d'impression centr\u00E9e \u00E0 l'oppos\u00E9 de l'anse (u = 0 devant, anse \u00E0 u = 0,25)\n      var R = (+M.diamMm || 82) / 2, circ = 2 * Math.PI * R, s = 6, W = Math.round(circ * s), H = Math.round(MUG_H * s);\n      var c = document.createElement('canvas'); c.width = W; c.height = H; var ctx = c.getContext('2d'); ctx.fillStyle = '#FFFFFF'; ctx.fillRect(0, 0, W, H);\n      var src = current(), L = layout(src), ink = inks(src.color, src.style), zw = Math.round(ZONE.w * s), zh = Math.round(ZONE.h * s), x0 = 0.75 * W - zw / 2, y0 = (H - zh) / 2;\n      var off = document.createElement('canvas'); off.width = zw; off.height = zh;\n      drawDesign(off.getContext('2d'), L, ink, s, 0, 0);\n      [x0 - W, x0, x0 + W].forEach(function (x) { ctx.drawImage(off, x, y0); });\n      var t = new T.CanvasTexture(c); t.encoding = T.sRGBEncoding; t.anisotropy = 8; return t;\n    }\n    function faceAngle() {\n      // rotation qui am\u00E8ne la face principale (photo, ou centre du motif) devant la cam\u00E9ra, l'anse un peu visible \u00E0 droite\n      var src = current(), L = layout(src), cx = PHOTO ? panel().cx : L.cx, circ = Math.PI * (+M.diamMm || 82);\n      return -2 * Math.PI * (0.75 + (cx - ZONE.w / 2) / circ) - 0.3;\n    }\n    function build3d(T, canvas) {\n      var R = (+M.diamMm || 82) / 2, Hm = MUG_H;\n      var renderer = new T.WebGLRenderer({ canvas: canvas, antialias: true, alpha: true });\n      renderer.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)); renderer.outputEncoding = T.sRGBEncoding; renderer.shadowMap.enabled = true; renderer.shadowMap.type = T.PCFSoftShadowMap;\n      var scene = new T.Scene(), camera = new T.PerspectiveCamera(28, 1, 10, 2000); camera.position.set(0, 70, 330); camera.lookAt(0, -2, 0);\n      scene.add(new T.HemisphereLight(0xFFFFFF, 0xC9BFB2, 0.85));\n      var sun = new T.DirectionalLight(0xFFF6EA, 0.9); sun.position.set(-120, 220, 160); sun.castShadow = true; sun.shadow.mapSize.set(1024, 1024);\n      sun.shadow.camera.left = -120; sun.shadow.camera.right = 120; sun.shadow.camera.top = 120; sun.shadow.camera.bottom = -120; sun.shadow.radius = 4; scene.add(sun);\n      var fill = new T.DirectionalLight(0xEAF0FF, 0.35); fill.position.set(160, 60, -80); scene.add(fill);\n      var group = new T.Group(); scene.add(group);\n      var ceramic = { roughness: 0.28, metalness: 0, clearcoat: 0.55, clearcoatRoughness: 0.25 };\n      function white() { return new T.MeshPhysicalMaterial(Object.assign({ color: 0xFFFFFF }, ceramic)); }\n      var bodyMat = white(), body = new T.Mesh(new T.CylinderGeometry(R, R, Hm, 128, 1, true), bodyMat); body.castShadow = true; group.add(body);\n      group.add(new T.Mesh(new T.CylinderGeometry(R - 1.6, R - 1.6, Hm - 1, 96, 1, true), new T.MeshStandardMaterial({ color: 0xF2EEE8, roughness: 0.4, side: T.BackSide })));\n      var rim = new T.Mesh(new T.RingGeometry(R - 1.6, R, 128), white()); rim.rotation.x = -Math.PI / 2; rim.position.y = Hm / 2; group.add(rim);\n      var bin = new T.Mesh(new T.CircleGeometry(R - 1.6, 96), new T.MeshStandardMaterial({ color: 0xE8E2DA, roughness: 0.5 })); bin.rotation.x = -Math.PI / 2; bin.position.y = -Hm / 2 + 4; group.add(bin);\n      var bot = new T.Mesh(new T.CircleGeometry(R, 96), white()); bot.rotation.x = Math.PI / 2; bot.position.y = -Hm / 2; group.add(bot);\n      var handle = new T.Mesh(new T.TorusGeometry(24, 5.2, 24, 64, Math.PI), white()); handle.rotation.z = -Math.PI / 2; handle.position.set(R - 5, 2, 0); handle.scale.set(1, 1.08, 0.72); handle.castShadow = true; group.add(handle);\n      var floor = new T.Mesh(new T.PlaneGeometry(600, 600), new T.ShadowMaterial({ opacity: 0.16 })); floor.rotation.x = -Math.PI / 2; floor.position.y = -Hm / 2; floor.receiveShadow = true; scene.add(floor);\n      var v = { canvas: canvas, group: group, bodyMat: bodyMat, drag: null, vel: 0, raf: 0, key: '' };\n      function frame() { v.raf = 0; if (!canvas.isConnected) return; if (!v.drag && Math.abs(v.vel) > 0.0005) { group.rotation.y += v.vel; v.vel *= 0.94; } renderer.render(scene, camera); if (v.drag || Math.abs(v.vel) > 0.0005) v.raf = requestAnimationFrame(frame); }\n      v.render = function () { if (!v.raf) v.raf = requestAnimationFrame(frame); };\n      v.resize = function () { var w = canvas.clientWidth || 600, h = canvas.clientHeight || 600; renderer.setSize(w, h, false); camera.aspect = w / h; camera.updateProjectionMatrix(); v.render(); };\n      canvas.addEventListener('pointerdown', function (e) { v.drag = { x: e.clientX, rot: group.rotation.y }; v.vel = 0; try { canvas.setPointerCapture(e.pointerId); } catch (err) { /* noop */ } canvas.classList.add('is-dragging'); v.render(); });\n      canvas.addEventListener('pointermove', function (e) { if (!v.drag) return; var r = v.drag.rot + (e.clientX - v.drag.x) * 0.012; v.vel = r - group.rotation.y; group.rotation.y = r; v.render(); });\n      function up() { v.drag = null; canvas.classList.remove('is-dragging'); v.render(); }\n      canvas.addEventListener('pointerup', up); canvas.addEventListener('pointercancel', up);\n      window.addEventListener('resize', function () { if (canvas.isConnected) v.resize(); });\n      return v;\n    }\n    function show3d(wrap, c3) {\n      loadThree().then(function (T) {\n        if (!c3.isConnected) return;\n        if (!v3) v3 = build3d(T, c3); else c3.replaceWith(v3.canvas); // un seul contexte WebGL, r\u00E9utilis\u00E9 \u00E0 chaque rendu\n        var key = JSON.stringify(mod.compact());\n        if (v3.key !== key) { var old = v3.bodyMat.map; v3.bodyMat.map = wrapTexture(T); v3.bodyMat.needsUpdate = true; if (old) old.dispose(); v3.key = key; v3.group.rotation.y = faceAngle(); v3.vel = 0; }\n        var ld = wrap.querySelector('.leni-mug-3d__loading'); if (ld) ld.remove();\n        v3.resize();\n        ga('mug_3d_viewed');\n      }).catch(function () { var ld = wrap.querySelector('.leni-mug-3d__loading'); if (ld) ld.textContent = 'La vue 3D n\u2019a pas pu se charger : les autres vues restent disponibles.'; });\n    }\n    mod.views = function () {\n      var v3d = { key: '3d', label: 'En 3D' };\n      if (PHOTO) return hasPhoto() ? [{ key: 'mug', label: 'Face photo' }, { key: 'mug-text', label: 'Face texte' }, { key: 'flat', label: '\u00C0 plat' }, v3d] : [];\n      return state.name.trim() ? [{ key: 'mug', label: 'Sur le mug' }, { key: 'flat', label: '\u00C0 plat' }, v3d] : [];\n    };\n    mod.lightBg = function () { return true; };\n    mod.afterPreview = function (wrap) {\n      // vue 3D : viewer three.js ; vue photo : charge la photo d'ambiance du style puis dessine le motif courb\u00E9 (le canvas garde la taille de la photo)\n      var c3 = wrap.querySelector('.leni-mug-3d__c'); if (c3) { show3d(wrap, c3); return; }\n      var c = wrap.querySelector('.leni-mug-shot__c'); if (!c) return;\n      var src = current(), bg = bgFor(src.style); if (!bg) return;\n      var L = layout(src), ink = inks(src.color, src.style), dm = demo.active(), alpha = isReal() ? 1 : (dm ? demo.alpha : 0.55);\n      loadBg(bg.url).then(function (img) { if (c.isConnected) drawShot(c, img, bg.cal, L, ink, alpha); }).catch(function () { /* photo indisponible : la vue SVG prendra le relais au prochain rendu */ });\n    }; // la miniature \u00AB \u00E0 plat \u00BB est une simple incrustation (non cliquable) ; la vue cot\u00E9e reste accessible par \u00AB Le motif \u00E0 plat \u00BB\n    mod.preview = function () {\n      var dm = demo.active(), src = current(), L = layout(src), ink = inks(src.color, src.style), real = isReal();\n      var op = real ? '' : (dm ? demo.alpha.toFixed(2) : '0.5');\n      if (state.view === 'flat' && real) return flatSvg(L, ink, { dims: true });\n      if (state.view === '3d' && real) return '<div class=\"leni-mug-3d\"><canvas class=\"leni-mug-3d__c\" role=\"img\" aria-label=\"Votre mug en 3D : faites-le tourner\"></canvas><p class=\"leni-mug-3d__hint\">Faites tourner le mug avec le doigt ou la souris</p><p class=\"leni-mug-3d__loading\">Chargement de la vue 3D\u2026</p></div>';\n      var bg = bgFor(src.style);\n      if (bg && bg.cal) {\n        // photo d'ambiance du style + motif courb\u00E9 (dessin\u00E9 par afterPreview) ; miniature du motif \u00E0 plat en incrustation\n        var hint = PHOTO ? 'D\u00E9posez votre photo pour voir votre mug' : (dm ? 'Exemple \u2014 saisissez votre pr\u00E9nom' : 'Exemple \u2014 saisissez votre pr\u00E9nom pour voir votre mug');\n        return '<div class=\"leni-mug-shot\"><canvas class=\"leni-mug-shot__c\" width=\"1200\" height=\"1200\" role=\"img\" aria-label=\"Aper\u00E7u de votre mug personnalis\u00E9, sur photo\"></canvas>' +\n          (real ? '<div class=\"leni-mug-flat\" aria-hidden=\"true\">' + flatSvg(L, ink, {}) + '<span>' + (PHOTO ? 'Les deux faces \u00E0 plat' : 'Le motif \u00E0 plat') + '</span></div>' : '') +\n          (!real ? '<p class=\"leni-mug-shot__hint\">' + hint + '</p>' : '') + '</div>';\n      }\n      var hex = ink.main;\n      var W = 1000, H = 820, out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre mug personnalis\u00E9\">', defs()];\n      // mug : corps 460 \u00D7 470 px (\u2248 92 \u00D7 94 mm), anse \u00E0 droite, ombre au sol ; la face visible montre \u2248 92 mm de la zone\n      var k2 = 5, bx = 240, by = 160, bw = 460, bh = 470, r = 26;\n      out.push('<defs><linearGradient id=\"leniMugBody\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"><stop offset=\"0\" stop-color=\"#E4E1DB\"/><stop offset=\"0.12\" stop-color=\"#FFFFFF\"/><stop offset=\"0.7\" stop-color=\"#FFFFFF\"/><stop offset=\"1\" stop-color=\"#DCD8D1\"/></linearGradient><linearGradient id=\"leniMugHandle\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"><stop offset=\"0\" stop-color=\"#FFFFFF\"/><stop offset=\"1\" stop-color=\"#D8D4CD\"/></linearGradient><radialGradient id=\"leniMugShadow\" cx=\"0.5\" cy=\"0.5\" r=\"0.5\"><stop offset=\"0\" stop-color=\"#000\" stop-opacity=\"0.22\"/><stop offset=\"1\" stop-color=\"#000\" stop-opacity=\"0\"/></radialGradient></defs>');\n      out.push('<ellipse cx=\"' + (bx + bw / 2 + 30) + '\" cy=\"' + (by + bh + 22) + '\" rx=\"' + (bw * 0.62) + '\" ry=\"26\" fill=\"url(#leniMugShadow)\"/>');\n      out.push('<path d=\"M' + (bx + bw - 6) + ' ' + (by + 120) + ' c 150 -10 160 210 0 210\" fill=\"none\" stroke=\"url(#leniMugHandle)\" stroke-width=\"58\" stroke-linecap=\"round\"/>');\n      out.push('<path d=\"M' + (bx + bw - 6) + ' ' + (by + 120) + ' c 150 -10 160 210 0 210\" fill=\"none\" stroke=\"#C9C4BC\" stroke-width=\"60\" stroke-linecap=\"round\" stroke-opacity=\"0.35\"/>');\n      out.push('<path d=\"M' + (bx + bw - 6) + ' ' + (by + 120) + ' c 150 -10 160 210 0 210\" fill=\"none\" stroke=\"url(#leniMugHandle)\" stroke-width=\"54\" stroke-linecap=\"round\"/>');\n      out.push('<rect x=\"' + bx + '\" y=\"' + by + '\" width=\"' + bw + '\" height=\"' + bh + '\" rx=\"' + r + '\" fill=\"url(#leniMugBody)\" stroke=\"#CFCBC3\" stroke-width=\"1.5\"/>');\n      out.push('<ellipse cx=\"' + (bx + bw / 2) + '\" cy=\"' + by + '\" rx=\"' + (bw / 2) + '\" ry=\"22\" fill=\"#F4F2EE\" stroke=\"#CFCBC3\" stroke-width=\"1.5\"/>');\n      out.push('<ellipse cx=\"' + (bx + bw / 2) + '\" cy=\"' + by + '\" rx=\"' + (bw / 2 - 14) + '\" ry=\"14\" fill=\"#E8E5E0\"/>');\n      // zone d'impression pos\u00E9e sur le corps : son centre (placement) sur le centre de la face, m\u00EAme \u00E9chelle 5 px/mm\n      var faceCx2 = PHOTO && state.view !== 'mug-text' ? panel().cx : L.cx;\n      var ox2 = bx + bw / 2 - faceCx2 * k2, oy2 = by + 12 + (bh - 24 - ZONE.h * k2) / 2;\n      if (PHOTO && faceCx2 !== L.cx) {\n        var pn2 = panel(), px2 = ox2 + (pn2.cx - pn2.w / 2) * k2, py2 = oy2 + (pn2.cy - pn2.h / 2) * k2, pw2 = pn2.w * k2;\n        out.push('<defs><clipPath id=\"leniPhotoClipS\"><path d=\"' + shapeSvgPath(px2, py2, pw2, pw2, photo.shape, k2) + '\"/></clipPath></defs>');\n        out.push(hasPhoto() ? '<image href=\"' + photoDataUrl() + '\" x=\"' + px2.toFixed(1) + '\" y=\"' + py2.toFixed(1) + '\" width=\"' + pw2.toFixed(1) + '\" height=\"' + pw2.toFixed(1) + '\" preserveAspectRatio=\"none\" clip-path=\"url(#leniPhotoClipS)\"' + (op ? ' opacity=\"' + op + '\"' : '') + '/>' : '<path d=\"' + shapeSvgPath(px2, py2, pw2, pw2, photo.shape, k2) + '\" fill=\"#EDE9E2\"/>');\n      } else out.push('<g clip-path=\"inset(0)\">' + design(L, k2, ox2, oy2, ink, op) + '</g>');\n      if (!real) out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 14) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"#1A1A1A\" fill-opacity=\"0.65\">' + (PHOTO ? 'D\u00E9posez votre photo pour voir votre mug' : (dm ? 'Exemple \u2014 saisissez votre pr\u00E9nom' : 'Exemple \u2014 saisissez votre pr\u00E9nom pour voir votre mug')) + '</text>');\n      out.push('</svg>');\n      return out.join('');\n    };\n    /* \u2500\u2500 \u00C9tapes \u2500\u2500 */\n    function refreshName() { RENDER.style(); renderOptions(); updateLight(); } // cartes de style avec le pr\u00E9nom, bouton \u00AB Voir mon mug en grand \u00BB d\u00E8s la saisie\n    /* \u00C9tape photo (mode photo) : d\u00E9p\u00F4t du fichier, puis \u00E9diteur de cadrage (glisser pour recentrer, zoom), forme, optimisation, carte qualit\u00E9 */\n    var editorRaf = 0;\n    function drawEditor(c) {\n      var pn = panel(), k = c.width / pn.w, ctx = c.getContext('2d');\n      ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, c.width, c.height); ctx.fillStyle = '#FFFFFF'; ctx.fillRect(0, 0, c.width, c.height);\n      drawPhoto(ctx, k, -(pn.cx - pn.w / 2) * k, -(pn.cy - pn.h / 2) * k);\n      ctx.save(); shapePath(ctx, 0, 0, c.width, c.height, photo.shape, k); ctx.strokeStyle = 'rgba(26,26,26,0.35)'; ctx.lineWidth = 2; ctx.stroke(); ctx.restore();\n    }\n    function qualityCard() {\n      var g = photoGrade(), pn = panel(); if (!g) return null;\n      var box = el('div', { class: 'leni-photo-quality is-' + g.grade, role: 'status' });\n      box.appendChild(el('strong', { text: 'Qualit\u00E9 d\u2019impression : ' + g.label }));\n      box.appendChild(el('small', { text: photo.w + ' \u00D7 ' + photo.h + ' px \u00B7 ' + g.dpi + ' dpi \u00E0 la taille imprim\u00E9e (' + fmtCm(pn.w / 10) + ' \u00D7 ' + fmtCm(pn.h / 10) + ' cm)' + (g.notes.length ? ' \u00B7 ' + g.notes.join(' \u00B7 ') : '') }));\n      if (g.grade === 'low') box.appendChild(el('p', { text: 'Trop petite pour une impression nette : elle serait pixelis\u00E9e. Choisissez une photo plus grande (celle d\u2019origine, pas une capture ou une image re\u00E7ue par messagerie) ou r\u00E9duisez le zoom.' }));\n      else if (g.grade === 'fair') box.appendChild(el('p', { text: 'Impression correcte mais un peu douce : si vous avez la photo d\u2019origine en plus grand, pr\u00E9f\u00E9rez-la.' }));\n      else if (g.notes.length) box.appendChild(el('p', { text: g.notes.indexOf('photo peut-\u00EAtre floue') >= 0 ? 'La photo semble peu nette : v\u00E9rifiez-la en grand avant de valider.' : 'L\u2019optimisation automatique corrige l\u2019exposition ; v\u00E9rifiez le rendu dans l\u2019aper\u00E7u.' }));\n      return box;\n    }\n    mod.render.photo = function () {\n      var body = bodyOf('photo'); if (!body) return;\n      body.innerHTML = '';\n      var err = errors.photo && (submitAttempted || touchedKeys.photo) ? errors.photo : '';\n      if (!hasPhoto()) {\n        body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'JPEG, PNG ou WebP, ' + PH.maxMb + ' Mo max. Une photo prise avec votre t\u00E9l\u00E9phone suffit largement : choisissez-la nette et bien \u00E9clair\u00E9e. Elle est cadr\u00E9e automatiquement, vous pourrez la recentrer.' }));\n        var input = el('input', { type: 'file', id: 'leniPhotoFile', accept: 'image/jpeg,image/png,image/webp,image/heic,image/heif,.jpg,.jpeg,.png,.webp,.heic', class: 'leni-upload__input', onchange: function () { var f = this.files && this.files[0]; if (f) onPhoto(f); } });\n        var drop = el('label', { class: 'leni-photo-drop' + (photo.busy ? ' is-busy' : '') + (err ? ' is-invalid' : ''), for: 'leniPhotoFile' }, [\n          input,\n          el('span', { class: 'leni-photo-drop__icon', 'aria-hidden': 'true', html: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"13\" rx=\"2\"/><circle cx=\"12\" cy=\"12.5\" r=\"3.4\"/><path d=\"M8 6l1.2-2h5.6L16 6\"/></svg>' }),\n          el('span', { class: 'leni-photo-drop__title', text: photo.busy ? 'Lecture de la photo\u2026' : 'Choisir ma photo' }),\n          el('span', { class: 'leni-photo-drop__sub', text: photo.busy ? 'Quelques secondes' : 'depuis votre t\u00E9l\u00E9phone ou votre ordinateur, ou d\u00E9posez-la ici' })\n        ]);\n        ['dragenter', 'dragover'].forEach(function (evn) { drop.addEventListener(evn, function (e) { e.preventDefault(); drop.classList.add('is-over'); }); });\n        ['dragleave', 'drop'].forEach(function (evn) { drop.addEventListener(evn, function (e) { e.preventDefault(); drop.classList.remove('is-over'); if (evn === 'drop' && e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files[0]) onPhoto(e.dataTransfer.files[0]); }); });\n        body.appendChild(drop);\n        if (photo.err || err) body.appendChild(el('p', { class: 'leni-cfg__error is-visible', text: '\u26A0 ' + (photo.err || err) }));\n        return;\n      }\n      var pn = panel(), c = el('canvas', { class: 'leni-photo-editor__c', width: 720, height: 720, role: 'img', 'aria-label': 'Cadrage de votre photo : glissez pour recentrer' });\n      var wrap = el('div', { class: 'leni-photo-editor' }, [c, el('span', { class: 'leni-photo-editor__hint', text: 'Glissez la photo pour la recentrer' })]);\n      var drag = null;\n      c.addEventListener('pointerdown', function (e) { drag = { x: e.clientX, y: e.clientY, dx: photo.dx, dy: photo.dy }; c.setPointerCapture(e.pointerId); c.classList.add('is-dragging'); });\n      c.addEventListener('pointermove', function (e) {\n        if (!drag) return; var r = c.getBoundingClientRect(), f = 1 / r.width; // fraction du panneau par px \u00E9cran\n        photo.dx = drag.dx + (e.clientX - drag.x) * f; photo.dy = drag.dy + (e.clientY - drag.y) * f;\n        if (!editorRaf) editorRaf = requestAnimationFrame(function () { editorRaf = 0; drawEditor(c); renderPreview(); });\n      });\n      ['pointerup', 'pointercancel'].forEach(function (evn) { c.addEventListener(evn, function () { if (!drag) return; drag = null; c.classList.remove('is-dragging'); touch('photo'); markInteracted(); photo.dataUrl = ''; updateLight(); }); });\n      body.appendChild(wrap);\n      var zoomRow = el('div', { class: 'leni-photo-zoom' }, [\n        el('label', { for: 'leniPhotoZoom', text: 'Zoom' }),\n        el('input', { type: 'range', id: 'leniPhotoZoom', min: '1', max: '3', step: '0.02', value: String(photo.zoom), oninput: function () { photo.zoom = +this.value; photo.dataUrl = ''; if (!editorRaf) editorRaf = requestAnimationFrame(function () { editorRaf = 0; drawEditor(c); renderPreview(); }); },\n          onchange: function () { touch('photo'); markInteracted(); mod.validate(); update(); } }),\n        el('button', { type: 'button', class: 'leni-cfg__link', text: 'Recentrer', onclick: function () { photo.zoom = 1; photo.dx = photo.dx0; photo.dy = photo.dy0; photo.dataUrl = ''; touch('photo'); mod.validate(); update(); } })\n      ]);\n      body.appendChild(zoomRow);\n      body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:14px', text: 'Forme de la photo' }));\n      var shapeKeys = PH.shapes.filter(function (s) { return SHAPES[s]; }), shapeLabels = shapeKeys.map(function (s) { return SHAPES[s]; });\n      chips(body, shapeLabels, SHAPES[photo.shape] || shapeLabels[0], function (val) { photo.shape = shapeKeys[shapeLabels.indexOf(val)] || 'carre'; photo.dataUrl = ''; touch('photo'); markInteracted(); ga('mugphoto_shape', { shape: photo.shape }); update(); }, 'Forme de la photo');\n      var enh = el('label', { class: 'leni-opt leni-photo-enhance' }, [\n        el('input', { type: 'checkbox', checked: photo.enhance ? true : null, onchange: function () { photo.enhance = this.checked; photo.dataUrl = ''; touch('photo'); markInteracted(); update(); } }),\n        el('span', { class: 'leni-opt__text', html: '<strong>Optimisation automatique</strong><small>Niveaux et couleurs ajust\u00E9s pour l\u2019impression par sublimation, qui assombrit l\u00E9g\u00E8rement. D\u00E9cochez pour imprimer la photo telle quelle.</small>' })\n      ]);\n      body.appendChild(enh);\n      var q = qualityCard(); if (q) body.appendChild(q);\n      if (err) body.appendChild(el('p', { class: 'leni-cfg__error is-visible', text: '\u26A0 ' + err }));\n      body.appendChild(el('button', { type: 'button', class: 'leni-cfg__link leni-photo-change', text: 'Changer de photo', onclick: function () { photo.file = null; photo.bmp = null; photo.work = null; photo.workEnh = null; photo.q = null; photo.err = ''; photo.dataUrl = ''; touch('photo'); mod.validate(); update(); } }));\n      drawEditor(c);\n    };\n    function onPhoto(file) {\n      touch('photo'); markInteracted();\n      setPhotoFile(file).then(function () { mod.validate(); markComplete(); update(); if (hasPhoto()) { loadFonts(mod.fontsToLoad()).then(renderPreview); } });\n      mod.render.photo(); // \u00E9tat \u00AB lecture en cours \u00BB\n    }\n    mod.render.name = function () {\n      var body = bodyOf('name'); if (!body) return;\n      body.innerHTML = '';\n      var err = errors.name && (submitAttempted || touchedKeys.name) ? errors.name : '';\n      var hintTxt = PHOTO ? MAXN + ' caract\u00E8res max. Facultatif : pr\u00E9nom, surnom, date ou petit message.' : MAXN + ' caract\u00E8res max. Accents, tirets et apostrophes accept\u00E9s.';\n      body.appendChild(textField({ key: 'mugname', label: PHOTO ? 'Votre texte' : 'Votre pr\u00E9nom', placeholder: PHOTO ? 'Ex. Mamie Josette, Papa, 2024\u2026' : 'Ex. Nicolas', max: MAXN, value: state.name, err: err, required: !PHOTO, auto: PHOTO ? 'off' : 'given-name', hint: hintTxt,\n        onInput: function (v) { state.name = v; touch('name'); if (v.trim()) demo.stop(); debounced('mugname', function () { markInteracted(); mod.validate(); markComplete(); patchField('mugname', (submitAttempted || touchedKeys.name) ? errors.name : '', hintTxt); refreshName(); }); },\n        onBlur: function () { mod.validate(); patchField('mugname', (submitAttempted || touchedKeys.name) ? errors.name : '', hintTxt); renderHeaders(); renderPriceAndCta(); } }));\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: PHOTO ? 'Imprim\u00E9 sur l\u2019autre face du mug, dans le style et la couleur choisis plus bas. Reproduit tel que vous l\u2019\u00E9crivez, majuscules et accents compris. Laissez vide pour un mug photo seule.' : 'Le pr\u00E9nom est reproduit exactement tel que vous l\u2019\u00E9crivez, majuscules et accents compris. Dans le style Monogramme, la grande initiale est ajout\u00E9e automatiquement.' }));\n    };\n    RENDER.style = mod.render.style = function () {\n      var body = bodyOf('style'); if (!body) return;\n      body.innerHTML = '';\n      var t = state.name.trim() || 'Nicolas', hex = hexFor(state.color, '#161616'), grid = el('div', { class: 'leni-mug-styles', role: 'radiogroup', 'aria-label': 'Style' });\n      STYLES.forEach(function (s) {\n        var sample = s.upper ? t.toUpperCase() : t, size = s.upper ? 22 : 34, spec = 'font-family:\\'' + s.font + '\\', sans-serif; font-weight:' + s.wt + '; font-size:' + Math.round(size * (s.em || 1)) + 'px; color:' + hex + (s.ls ? '; letter-spacing:' + s.ls + 'em' : '');\n        var card = el('button', { type: 'button', class: 'leni-mug-style' + (state.style === s.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.style === s.key ? 'true' : 'false', onclick: function () { state.style = s.key; touch('style'); markInteracted(); ga('mug_style_selected', { style: s.key }); update(); } }, [\n          el('span', { class: 'leni-mug-style__sample' + (s.initial ? ' has-initial' : '') }, [\n            s.initial ? el('span', { class: 'leni-mug-style__initial', style: 'font-family:\\'' + s.initial.font + '\\', serif; font-weight:' + s.initial.wt + '; color:' + tint(hex), text: initialOf(t) }) : null,\n            el('span', { class: 'leni-mug-style__name', style: spec, text: sample })\n          ]),\n          el('span', { class: 'leni-mug-style__label', text: s.label })\n        ]);\n        grid.appendChild(card);\n      });\n      body.appendChild(grid);\n      body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:10px', text: 'Chaque style est un design Lenidesign pr\u00EAt \u00E0 l\u2019emploi : vous n\u2019avez rien \u00E0 r\u00E9gler.' }));\n    };\n    mod.render.phrase = function () {\n      var body = bodyOf('phrase'); if (!body) return;\n      body.innerHTML = '';\n      var p = state.phrase;\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Facultatif. Une seule ligne sous le pr\u00E9nom, \u00E0 sa largeur, dans la couleur assortie du style (la m\u00EAme que le pr\u00E9nom pour le Monogramme).' }));\n      chips(body, ['Aucun texte', 'Choisir une suggestion', '\u00C9crire mon propre texte'], p.mode === 'preset' ? 'Choisir une suggestion' : (p.mode === 'custom' ? '\u00C9crire mon propre texte' : 'Aucun texte'), function (val) {\n        p.mode = val === 'Choisir une suggestion' ? 'preset' : (val === '\u00C9crire mon propre texte' ? 'custom' : 'none'); touch('phrase'); markInteracted(); ga('mug_secondary_text_selected', { mode: p.mode }); mod.validate(); update();\n        if (p.mode === 'custom' && !isMobile()) { var inp = $('#leniField-mugphrase'); if (inp) inp.focus(); }\n      }, 'Petite phrase');\n      if (p.mode === 'preset') {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:14px', text: 'Suggestions' }));\n        var cats = el('div', { class: 'leni-chips leni-mug-cats', role: 'tablist', 'aria-label': 'Cat\u00E9gories' });\n        CATS.forEach(function (c) { cats.appendChild(el('button', { type: 'button', class: 'leni-chip' + (p.cat === c ? ' is-selected' : ''), role: 'tab', 'aria-selected': p.cat === c ? 'true' : 'false', text: c, onclick: function () { p.cat = c; mod.render.phrase(); } })); });\n        body.appendChild(cats);\n        var list = el('div', { class: 'leni-mug-presets', role: 'radiogroup', 'aria-label': 'Suggestions' });\n        PRESETS.filter(function (x) { return x.cat === p.cat; }).forEach(function (x) {\n          list.appendChild(el('button', { type: 'button', class: 'leni-mug-preset' + (p.preset === x.text ? ' is-selected' : ''), role: 'radio', 'aria-checked': p.preset === x.text ? 'true' : 'false', text: x.text.replace(YEAR_RX, p.year || 'ann\u00E9e'), onclick: function () { p.preset = x.text; touch('phrase'); markInteracted(); mod.validate(); update(); if (needsYear() && !p.year && !isMobile()) { var y = $('#leniField-mugyear'); if (y) y.focus(); } } }));\n        });\n        body.appendChild(list);\n        if (needsYear()) {\n          body.appendChild(textField({ key: 'mugyear', label: 'Ann\u00E9e', placeholder: 'Ex. 1984', max: 4, value: p.year, type: 'tel', auto: 'off', err: errors.phrase && (submitAttempted || touchedKeys.phrase) ? errors.phrase : '', hint: '4 chiffres, remplace \u00AB [ann\u00E9e] \u00BB dans la phrase.',\n            onInput: function (v) { p.year = v.replace(/[^0-9]/g, '').slice(0, 4); this && null; touch('phrase'); debounced('mugyear', function () { markInteracted(); mod.validate(); patchField('mugyear', (submitAttempted || touchedKeys.phrase) ? errors.phrase : '', '4 chiffres, remplace \u00AB [ann\u00E9e] \u00BB dans la phrase.'); updateLight(); }); },\n            onBlur: function () { mod.validate(); patchField('mugyear', (submitAttempted || touchedKeys.phrase) ? errors.phrase : '', '4 chiffres.'); renderHeaders(); renderPriceAndCta(); } }));\n        }\n      } else if (p.mode === 'custom') {\n        body.appendChild(textField({ key: 'mugphrase', label: 'Votre petite phrase', placeholder: 'Ex. Depuis 1984', max: MAXP, value: p.text, err: errors.phrase && (submitAttempted || touchedKeys.phrase) ? errors.phrase : '', hint: p.text.length + ' / ' + MAXP,\n          onInput: function (v) { p.text = v.replace(/[\\r\\n]+/g, ' '); touch('phrase'); patchField('mugphrase', '', p.text.length + ' / ' + MAXP); debounced('mugphrase', function () { markInteracted(); mod.validate(); patchField('mugphrase', (submitAttempted || touchedKeys.phrase) ? errors.phrase : '', p.text.length + ' / ' + MAXP); updateLight(); }); },\n          onBlur: function () { mod.validate(); patchField('mugphrase', (submitAttempted || touchedKeys.phrase) ? errors.phrase : '', p.text.length + ' / ' + MAXP); renderHeaders(); renderPriceAndCta(); } }));\n        body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Une seule ligne, en capitales espac\u00E9es sous le pr\u00E9nom.' }));\n      }\n    };\n    mod.renderOptions = function (host) {\n      // case de v\u00E9rification obligatoire (les vues du mug, dont la 3D, sont sur l'image)\n      var wrap = el('div', { class: 'leni-mug-confirm' + (errors.confirm && submitAttempted ? ' is-invalid' : '') });\n      wrap.appendChild(el('label', { class: 'leni-opt' }, [\n        el('input', { type: 'checkbox', checked: state.confirm ? true : null, onchange: function () { state.confirm = this.checked; if (state.confirm) { delete errors.confirm; } mod.validate(); renderOptions(); renderPriceAndCta(); } }),\n        el('span', { class: 'leni-opt__text', html: PHOTO ? '<strong>J\u2019ai v\u00E9rifi\u00E9 le cadrage de ma photo et mon texte.</strong><small>Votre mug est fabriqu\u00E9 exactement comme l\u2019aper\u00E7u : cadrage, forme, orthographe et accents compris.</small>' : '<strong>J\u2019ai v\u00E9rifi\u00E9 l\u2019orthographe de ma personnalisation.</strong><small>Votre mug sera fabriqu\u00E9 exactement avec le texte indiqu\u00E9 ci-dessus. Pensez \u00E0 v\u00E9rifier l\u2019orthographe, les accents et les dates.</small>' })\n      ]));\n      if (errors.confirm && submitAttempted) wrap.appendChild(el('p', { class: 'leni-cfg__error is-visible', text: '\u26A0 ' + errors.confirm }));\n      host.appendChild(wrap);\n    };\n    /* \u2500\u2500 Validation \u2500\u2500 */\n    var NAME_RX = /^[A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0152\u0153\u00C7\u00E7' \\-]+$/, TEXT_RX = /^[A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0152\u0153\u00C7\u00E70-9'\u2019 .,!?&\u00B0#\u2116\\-]+$/;\n    mod.validate = function () {\n      errors = {};\n      var t = state.name.trim(), p = state.phrase;\n      if (PHOTO) {\n        if (photo.busy) errors.photo = 'Lecture de la photo en cours\u2026';\n        else if (!hasPhoto()) errors.photo = photo.err || 'Ajoutez votre photo.';\n        else { var g = photoGrade(); if (g && g.grade === 'low') errors.photo = 'Photo trop petite pour une impression nette (' + g.dpi + ' dpi) : choisissez une photo plus grande ou r\u00E9duisez le zoom.'; }\n        if (t.length > MAXN) errors.name = 'Texte trop long (' + MAXN + ' caract\u00E8res max.).';\n        else if (t && !TEXT_RX.test(t)) errors.name = 'Utilisez des lettres, chiffres, espaces et la ponctuation courante.';\n      } else {\n        if (!t) errors.name = 'Indiquez le pr\u00E9nom.';\n        else if (t.length > MAXN) errors.name = 'Pr\u00E9nom trop long (' + MAXN + ' caract\u00E8res max.).';\n        else if (/[0-9]/.test(t)) errors.name = 'Les chiffres ne sont pas accept\u00E9s dans le pr\u00E9nom.';\n        else if (!NAME_RX.test(t)) errors.name = 'Utilisez uniquement des lettres, espaces, tirets et apostrophes.';\n      }\n      if (p.mode === 'preset') { if (!p.preset) errors.phrase = 'Choisissez une suggestion, ou \u00AB Aucun texte \u00BB.'; else if (needsYear() && !/^[0-9]{4}$/.test(p.year)) errors.phrase = 'Indiquez l\u2019ann\u00E9e sur 4 chiffres.'; }\n      else if (p.mode === 'custom') { if (!p.text.trim()) errors.phrase = '\u00C9crivez votre phrase, ou choisissez \u00AB Aucun texte \u00BB.'; else if (p.text.length > MAXP) errors.phrase = 'Phrase trop longue (' + MAXP + ' caract\u00E8res max.).'; }\n      if (!state.confirm) errors.confirm = PHOTO ? 'Cochez la case de v\u00E9rification du cadrage et du texte avant d\u2019ajouter au panier.' : 'Cochez la case de v\u00E9rification de l\u2019orthographe avant d\u2019ajouter au panier.';\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.photo && !errors.name && !errors.phrase && !errors.confirm; };\n    mod.isComplete = function () { return !errors.photo && !errors.name && !errors.phrase; };\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return errors.photo ? 'photo' : (errors.name ? 'name' : (errors.phrase ? 'phrase' : 'confirm')); };\n    mod.incompleteLabel = function () { return errors.photo ? (hasPhoto() ? 'Photo trop petite' : 'Ajoutez votre photo') : (errors.name ? (PHOTO ? 'Corrigez votre texte' : 'Indiquez votre pr\u00E9nom') : (errors.phrase ? 'Compl\u00E9tez la petite phrase' : 'Cochez la v\u00E9rification')); };\n    mod.stepValue = function (key) {\n      if (key === 'photo') { if (!hasPhoto()) return photo.busy ? 'Lecture\u2026' : '\u00C0 ajouter'; var g = photoGrade(); return (SHAPES[photo.shape] || 'Carr\u00E9') + (g ? ' \u00B7 ' + g.label : ''); }\n      if (key === 'name') return state.name.trim() || (PHOTO ? 'Sans texte' : '\u00C0 saisir');\n      if (key === 'style') return styleOf().label;\n      if (key === 'phrase') { var f = phraseFinal(); return f ? phraseShown(f) : 'Aucun texte'; }\n      return '';\n    };\n    mod.stepDone = function (key) { if (key === 'photo') return hasPhoto() && !errors.photo; if (key === 'phrase') return !errors.phrase; if (key === 'name' && PHOTO) return !errors.name && touchedKeys.name; return !!mod.stepValue(key) && mod.stepValue(key) !== '\u00C0 saisir'; };\n    mod.recapLines = function () {\n      var out = [], f = phraseFinal();\n      if (PHOTO && hasPhoto()) { var g = photoGrade(); out.push({ text: 'Photo : ' + photo.name + ' \u00B7 ' + (SHAPES[photo.shape] || 'Carr\u00E9') + (g ? ' \u00B7 qualit\u00E9 ' + g.label.toLowerCase() + ' (' + g.dpi + ' dpi)' : ''), step: 'photo' }); }\n      if (state.name.trim()) out.push({ text: state.name.trim() + ' \u00B7 ' + styleOf().label, step: 'name' });\n      else if (PHOTO) out.push({ text: 'Sans texte sur l\u2019autre face', step: 'name' });\n      if (f) out.push({ text: 'Petite phrase : ' + phraseShown(f), step: 'phrase' });\n      return out;\n    };\n    mod.stickySub = function () { return PHOTO ? ((SHAPES[photo.shape] || 'Carr\u00E9') + (state.name.trim() ? ' \u00B7 ' + state.name.trim() : ' \u00B7 photo seule')) : (styleOf().label + (state.color ? ' \u00B7 ' + state.color : '')); };\n    mod.fontValue = function () { return ''; };\n    mod.onColor = function (val) { ga('mug_color_selected', { color: val }); };\n    mod.gaExtra = function () { return { style: state.style, color: state.color, secondary_text: state.phrase.mode, photo: PHOTO ? (hasPhoto() ? photo.shape : 'none') : undefined }; }; // analytics du CDC (\u00A723)\n    mod.onOpen = function (key) { if (key === 'style') loadFonts(mod.fontsToLoad()).then(renderPreview); };\n    /* \u2500\u2500 Propri\u00E9t\u00E9s, _config, reprise \u2500\u2500 */\n    function renderId() { var s = JSON.stringify(mod.compact()), h = 5381, i; for (i = 0; i < s.length; i++) h = ((h << 5) + h + s.charCodeAt(i)) | 0; return ((PHOTO ? 'mugphoto-' : 'mug-') + (h >>> 0).toString(36)).toUpperCase(); }\n    mod.properties = function () {\n      var st = styleOf(), f = phraseFinal(), t = state.name.trim(), p = {};\n      if (PHOTO) {\n        var g = photoGrade();\n        p['Photo'] = photo.name || ''; p['Forme'] = SHAPES[photo.shape] || 'Carr\u00E9';\n        p['Cadrage'] = 'zoom \u00D7' + photo.zoom.toFixed(2) + (photo.dx !== photo.dx0 || photo.dy !== photo.dy0 ? ' \u00B7 recadr\u00E9' : ' \u00B7 automatique');\n        p['Qualit\u00E9 photo'] = g ? g.label + ' (' + g.dpi + ' dpi)' : '';\n        p['Optimisation'] = photo.enhance ? 'Automatique' : 'Aucune';\n        if (t) { p['Texte'] = t; p['Style'] = st.label; p['Couleur'] = state.color || ''; } else p['Texte'] = 'Aucun (photo seule)';\n      } else { p['Pr\u00E9nom'] = t; p['Style'] = st.label; p['Couleur'] = state.color || ''; }\n      if (f) p['Petite phrase'] = phraseShown(f);\n      if (needsYear() && state.phrase.year) p['Ann\u00E9e'] = state.phrase.year;\n      if (t || f) {\n        p['_Police'] = st.font + ' ' + st.wt + (st.initial ? ' \u00B7 initiale ' + st.initial.font + ' ' + st.initial.wt : '') + (f ? ' \u00B7 phrase ' + PHRASE_FONT.font + ' ' + PHRASE_FONT.wt : '');\n        var ink = inks(state.color, state.style);\n        p['_HEX'] = ink.main + (st.initial ? ' \u00B7 initiale ' + ink.initial : '') + (f && ink.phrase !== ink.main ? ' \u00B7 phrase ' + ink.phrase : '');\n      }\n      p['_ID rendu'] = renderId();\n      return p;\n    };\n    mod.compact = function () {\n      var p = state.phrase, c = { v: 1, k: PHOTO ? 'mugphoto' : 'mug', n: state.name, s: state.style, c: state.color, p: { m: p.mode, t: p.text, pr: p.preset, y: p.year }, x: state.extras };\n      if (PHOTO) c.ph = { n: photo.name, z: Math.round(photo.zoom * 100) / 100, x: Math.round(photo.dx * 1000) / 1000, y: Math.round(photo.dy * 1000) / 1000, s: photo.shape, e: photo.enhance ? 1 : 0 };\n      return c;\n    };\n    mod.apply = function (c) {\n      if (typeof c.n === 'string') state.name = c.n;\n      if (c.s && STYLES.some(function (s) { return s.key === c.s; })) state.style = c.s;\n      if (c.c && paletteItem(c.c)) state.color = c.c;\n      if (c.p) { state.phrase.mode = ['none', 'preset', 'custom'].indexOf(c.p.m) >= 0 ? c.p.m : 'none'; state.phrase.text = String(c.p.t || ''); state.phrase.preset = String(c.p.pr || ''); state.phrase.year = String(c.p.y || ''); var pp = PRESETS.filter(function (x) { return x.text === state.phrase.preset; })[0]; if (pp) state.phrase.cat = pp.cat; }\n      if (c.x) Object.keys(c.x).forEach(function (k) { if (k in state.extras) state.extras[k] = !!c.x[k]; });\n      if (PHOTO && c.ph) {\n        // cadrage repris ; la photo elle-m\u00EAme revient de la r\u00E9serve locale (restorePhotoHandoff) si elle est encore l\u00E0\n        if (SHAPES[c.ph.s]) photo.shape = c.ph.s; photo.enhance = c.ph.e !== 0;\n        var restoreCrop = function () { photo.zoom = Math.max(1, Math.min(3, +c.ph.z || 1)); photo.dx = +c.ph.x || 0; photo.dy = +c.ph.y || 0; photo.dataUrl = ''; };\n        restoreCrop(); mod.onPhotoRestored = restoreCrop;\n      }\n      state.confirm = true; // reprise d'une ligne d\u00E9j\u00E0 v\u00E9rifi\u00E9e\n    };\n    mod.fontsToLoad = function () { var out = [], seen = {}; STYLES.forEach(function (s) { [[s.font, s.wt], s.initial ? [s.initial.font, s.initial.wt] : null].forEach(function (f) { if (f && !seen[f[0] + f[1]]) { seen[f[0] + f[1]] = 1; out.push({ family: f[0], weight: f[1] }); } }); }); out.push({ family: PHRASE_FONT.font, weight: PHRASE_FONT.wt }); return out; };\n    /* \u2500\u2500 Fichiers : SVG vectoriel (contours exacts) de la zone d'impression + PNG 300 dpi (aper\u00E7u visible au panier) \u2500\u2500 */\n    function vecSpaced(o) {\n      // texte lettre \u00E0 lettre avec interlettrage (o.ls en em), centr\u00E9 sur o.cx : { d, exact, loaded } ou null\n      var d = [], exact = true, loaded = true, adv = 0, i, ch, m, x;\n      var chars = String(o.text).split(''), widths = [];\n      for (i = 0; i < chars.length; i++) { m = VEC.metrics(chars[i], o.font, o.wt, o.size, o.vec); widths.push(m ? m.adv : o.size * 0.6); adv += widths[i]; }\n      adv += o.ls * o.size * Math.max(0, chars.length - 1);\n      x = o.cx - adv / 2;\n      for (i = 0; i < chars.length; i++) { ch = chars[i]; if (ch !== ' ') { var r = VEC.text({ text: ch, family: o.font, weight: o.wt, key: o.vec, x: x, y: o.y, size: o.size, anchor: 'start' }); if (r) { d.push(r.d); exact = exact && r.exact; loaded = loaded && r.loaded !== false; } } x += widths[i] + o.ls * o.size; }\n      return d.length ? { d: d.join(' '), exact: exact, loaded: loaded } : null;\n    }\n    function productionSvg() {\n      var L = layout({ name: state.name, style: state.style, phrase: phraseFinal(), color: state.color }), ink = inks(state.color, state.style), parts = [], exact = true, loaded = true;\n      function put(id, r, fill) { if (!r) return; exact = exact && r.exact; loaded = loaded && r.loaded !== false; parts.push('<path id=\"' + id + '\" fill=\"' + fill + '\" fill-rule=\"' + (r.rule || 'evenodd') + '\" d=\"' + r.d + '\"/>'); }\n      if (L.initial) put('initiale', VEC.text({ text: L.initial.text, family: L.initial.font, weight: L.initial.wt, key: L.initial.vec, x: L.cx, y: L.initial.base, size: L.initial.size, anchor: 'middle' }), ink.initial);\n      put('prenom', L.name.ls ? vecSpaced({ text: L.name.text, font: L.name.font, wt: L.name.wt, vec: L.name.vec, size: L.name.size, ls: L.name.ls, cx: L.cx, y: L.name.base }) : VEC.text({ text: L.name.text, family: L.name.font, weight: L.name.wt, key: L.name.vec, x: L.cx, y: L.name.base, size: L.name.size, anchor: 'middle' }), ink.main);\n      if (L.phrase) put('phrase', vecSpaced({ text: L.phrase.text, font: PHRASE_FONT.font, wt: PHRASE_FONT.wt, vec: PHRASE_FONT.vec, size: L.phrase.size, ls: L.phrase.ls, cx: L.cx, y: L.phrase.base }), ink.phrase);\n      if (!parts.length) return '';\n      var fonts = [L.name.vec].concat(L.initial ? [L.initial.vec] : []).concat(L.phrase ? [PHRASE_FONT.vec] : []);\n      return VEC.svg(ZONE.w, ZONE.h, '<rect id=\"zone\" x=\"0\" y=\"0\" width=\"' + VEC.F(ZONE.w) + '\" height=\"' + VEC.F(ZONE.h) + '\" fill=\"none\" stroke=\"none\"/>' + parts.join(''), { label: 'fichier d\u2019impression (sublimation)', title: 'Mug \u00B7 ' + state.name.trim() + ' \u00B7 ' + L.st.label + ' \u00B7 ' + (state.color || ''), fonts: fonts, exact: exact, loaded: loaded, note: 'zone d\u2019impression ' + ZONE.w + ' \u00D7 ' + ZONE.h + ' mm, motif centr\u00E9 en x = ' + VEC.F(L.cx) + ' mm, largeur utile ' + DESIGN_W + ' mm, ' + renderId() });\n    }\n    function renderPng() {\n      // PNG de la zone d'impression \u00E0 DPI (fond transparent), rendu par le navigateur avec les polices web charg\u00E9es ;\n      // en mode photo, la photo vient du bitmap plein format, puis l'optimisation est appliqu\u00E9e pixel \u00E0 pixel sur le panneau\n      var L = layout({ name: state.name, style: state.style, phrase: phraseFinal(), color: state.color }), ink = inks(state.color, state.style), s = DPI / 25.4;\n      var c = document.createElement('canvas'); c.width = Math.round(ZONE.w * s); c.height = Math.round(ZONE.h * s);\n      var fam = mod.fontsToLoad().map(function (f) { return document.fonts && document.fonts.load ? document.fonts.load(f.weight + ' 20px \"' + f.family + '\"').catch(function () {}) : Promise.resolve(); });\n      return Promise.all(fam).then(function () {\n        var ctx = c.getContext('2d');\n        if (PHOTO && hasPhoto()) {\n          drawPhoto(ctx, s, 0, 0, undefined, true);\n          if (photo.enhance && photo.lut) {\n            var pn = panel(), x = Math.max(0, Math.floor((pn.cx - pn.w / 2) * s)), y = Math.max(0, Math.floor((pn.cy - pn.h / 2) * s)), w = Math.min(c.width - x, Math.ceil(pn.w * s)), h = Math.min(c.height - y, Math.ceil(pn.h * s));\n            ctx.putImageData(enhancePixels(ctx.getImageData(x, y, w, h), photo.lut), x, y);\n          }\n          drawDesign(ctx, L, ink, s, 0, 0, undefined, 'text'); // texte seul par-dessus (la photo est d\u00E9j\u00E0 pos\u00E9e)\n        } else drawDesign(ctx, L, ink, s, 0, 0);\n        return new Promise(function (res) { c.toBlob(function (b) { res(b); }, 'image/png'); });\n      });\n    }\n    function renderPreviewJpeg() {\n      // aper\u00E7u l\u00E9ger des deux faces \u00E0 plat (vignette du panier) : 4 px/mm, fond blanc\n      var L = layout({ name: state.name, style: state.style, phrase: phraseFinal(), color: state.color }), ink = inks(state.color, state.style), s = 4;\n      var c = document.createElement('canvas'); c.width = Math.round(ZONE.w * s); c.height = Math.round(ZONE.h * s);\n      var ctx = c.getContext('2d'); ctx.fillStyle = '#FFFFFF'; ctx.fillRect(0, 0, c.width, c.height);\n      drawDesign(ctx, L, ink, s, 0, 0);\n      return new Promise(function (res) { c.toBlob(function (b) { res(b); }, 'image/jpeg', 0.86); });\n    }\n    var jpgBlob = null;\n    mod.beforeAdd = function () {\n      var key = JSON.stringify(mod.compact()); if (pngBlob && pngKey === key) return null;\n      var jobs = [renderPng().then(function (b) { pngBlob = b; })];\n      if (PHOTO) jobs.push(renderPreviewJpeg().then(function (b) { jpgBlob = b; }));\n      return Promise.all(jobs).then(function () { pngKey = key; }).catch(function () { pngBlob = null; jpgBlob = null; pngKey = ''; });\n    };\n    mod.vectorFonts = function () { var st = styleOf(); return [st.vec].concat(st.initial ? [st.initial.vec] : []).concat(phraseFinal() ? [PHRASE_FONT.vec] : []); };\n    mod.files = function () {\n      var out = [];\n      if (PHOTO) {\n        var baseP = 'mug-photo-' + VEC.slug(state.name.trim() || photo.name.replace(/\\.[^.]+$/, ''), 'photo') + '-' + photo.shape;\n        if (pngBlob) out.push({ prop: '_Fichier production', blob: pngBlob, name: baseP + '-' + DPI + 'dpi.png' }); // \u00AB _ \u00BB : masqu\u00E9 c\u00F4t\u00E9 client, PNG 300 dpi de toute la zone\n        if (jpgBlob) out.push({ prop: 'Aper\u00E7u', blob: jpgBlob, name: baseP + '-apercu.jpg' }); // visible : vignette au panier\n        if (photo.file && photo.file.size <= PH.keepOriginalMb * 1024 * 1024) out.push({ prop: '_Photo originale', blob: photo.file, name: photo.name }); // pour retravailler le cadrage \u00E0 l'atelier si besoin\n        return out;\n      }\n      var svg = productionSvg(), base = 'mug-' + VEC.slug(state.name.trim(), 'prenom') + '-' + styleOf().key;\n      if (svg) out.push({ prop: '_Fichier production', blob: new Blob([svg], { type: 'image/svg+xml' }), name: base + '.svg' }); // \u00AB _ \u00BB : masqu\u00E9 c\u00F4t\u00E9 client\n      if (pngBlob) out.push({ prop: 'Aper\u00E7u', blob: pngBlob, name: base + '-' + DPI + 'dpi.png' }); // visible : vignette au panier, fichier de secours \u00E0 l'atelier\n      return out;\n    };\n    if (PHOTO && /^(localhost|127\\.0\\.0\\.1)$/.test(location.hostname)) window.leniMugPhotoDebug = function () { return { photo: photo, grade: photoGrade(), panel: panel(), files: mod.files, beforeAdd: mod.beforeAdd, properties: mod.properties, compact: mod.compact }; }; // banc uniquement\n    return mod;\n  }\n  KINDS.mug = makeMug(false);\n  KINDS.mugphoto = makeMug(true);\n\n  /* \u2500\u2500 HORAIRES : m1 titre + 2 blocs de 2 lignes \u00B7 m2 \u00B7 m3 \u00B7 m4 \u2500 */\n  KINDS.horaires = (function () {\n    var SHAPES = window.LENI_HORAIRES_SHAPES || {};\n    var MODEL = cfg.model || 'm1';\n    var DAYS = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'];\n    var DAYS_SHORT = ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'];\n    var HM = {\n      noDay: 'Indiquez au moins un jour d\u2019ouverture.', noRange: 'Indiquez au moins une plage horaire pour ce jour.',\n      order: 'L\u2019heure de fin doit \u00EAtre apr\u00E8s l\u2019heure de d\u00E9but.', overlap: 'Les horaires se chevauchent.',\n      name: 'Indiquez le nom de votre boutique.', complete: 'Compl\u00E9tez vos horaires', info: 'Compl\u00E9tez vos informations',\n      copyMonday: 'Horaires du lundi appliqu\u00E9s du mardi au samedi', titleRequired: 'Indiquez le titre.', blockRequired: 'Indiquez au moins la premi\u00E8re ligne.'\n    };\n    var FIELD_DEFS = {\n      name: { label: 'Nom de votre boutique', placeholder: 'Boulangerie Martin', max: 30, prop: 'Nom de la boutique', auto: 'organization' },\n      phone: { label: 'T\u00E9l\u00E9phone', placeholder: '03 88 00 00 00', max: 20, prop: 'T\u00E9l\u00E9phone', auto: 'tel', type: 'tel' },\n      email: { label: 'Email', placeholder: 'contact@votre-boutique.fr', max: 40, prop: 'Email', auto: 'email', type: 'email' },\n      site: { label: 'Site web', placeholder: 'www.votre-boutique.fr', max: 40, prop: 'Site web', auto: 'url' }\n    };\n    var PICTOS = [\n      { key: 'none', label: 'Aucun' }, { key: 'lunettes', label: 'Lunettes' }, { key: 'toque', label: 'Toque' },\n      { key: 'viande', label: 'Boucherie' }, { key: 'ciseaux', label: 'Ciseaux' }, { key: 'text', label: 'Nom de la boutique' }\n    ];\n    var MODELS = {\n      m1: { steps: ['text', 'size', 'color', 'font'], mode: 'free', fontChoice: true, defaultFont: 'Big Shoulders Display', fields: [], baseFonts: [{ family: 'Big Shoulders Display', weight: 700 }] },\n      m2: { steps: ['hours', 'color', 'contact'], mode: 'rows', fontChoice: false, fields: ['phone', 'email'], baseFonts: [{ family: 'Cookie', weight: 400 }, { family: 'Breath of the River', weight: 400 }] },\n      m3: { steps: ['hours', 'color', 'picto', 'contact'], mode: 'grouped', fontChoice: false, fields: ['phone', 'email', 'site'], baseFonts: [{ family: 'Contrail One', weight: 400 }, { family: 'Cookie', weight: 400 }] },\n      m4: { steps: ['hours', 'color', 'identity', 'font'], mode: 'rows', fontChoice: true, defaultFont: 'Source Sans 3', fields: ['name', 'site', 'phone'], baseFonts: [{ family: 'Source Sans 3', weight: 400 }] }\n    };\n    var M = MODELS[MODEL] || MODELS.m1;\n    var fieldStep = M.steps.indexOf('contact') >= 0 ? 'contact' : 'identity';\n    var M1_DEFAULT = (cfg.m1 && cfg.m1.lines && cfg.m1.lines.length === 4) ? cfg.m1.lines : ['Lun - Ven', '9h00 - 12h30 / 14h00 - 19h00', 'Sam', '9h00 - 12h30'];\n    var mod = {\n      steps: M.steps.filter(function (k) { return k !== 'size' || hasRole('size'); }),\n      labels: { size: (cfg.labels && cfg.labels.size) || roleLabel('size'), text: 'Votre texte', hours: 'Vos horaires', color: roleLabel('color') || 'Couleur', font: 'Police', contact: 'Coordonn\u00E9es', picto: 'Picto ou nom', identity: 'Votre boutique' },\n      mainStep: M.mode === 'free' ? 'text' : 'hours',\n      inlineFirst: M.mode === 'free', // mod\u00E8le compact : le texte est l'\u00E9tape 1, ouverte (aussi sur mobile)\n      render: {},\n      init: function () {\n        state.days = defaultDays(); state.continuous = false;\n        state.picto = MODEL === 'm3' ? (cfg.defaultPicto || 'none') : 'none';\n        state.name = ''; state.phone = ''; state.email = ''; state.site = '';\n        state.title = (cfg.m1 && cfg.m1.title) || 'HORAIRES'; state.free = M1_DEFAULT.slice();\n        if (!state.font) state.font = M.defaultFont || '';\n        OT.ensureClipper(); mod.vectorFonts().forEach(OT.ensureFont); // contours exacts du fichier de d\u00E9coupe (polices h\u00E9berg\u00E9es)\n      }\n    };\n    var dayErrors = [], globalErr = '', nameErr = '', fieldErrs = {}, freeErr = '';\n\n    function defaultDays() {\n      var d = [];\n      for (var i = 0; i < 7; i++) {\n        if (i < 5) d.push({ closed: false, m1: '09:00', m2: '12:30', a1: '14:00', a2: '19:00', prev: null });\n        else if (i === 5) d.push({ closed: false, m1: '09:00', m2: '12:30', a1: '', a2: '', prev: null });\n        else d.push({ closed: true, m1: '', m2: '', a1: '', a2: '', prev: { m1: '09:00', m2: '12:30', a1: '', a2: '' } });\n      }\n      return d;\n    }\n    function fmtTime(t) { if (!t) return ''; var p = t.split(':'); return String(parseInt(p[0], 10)) + 'h' + (p[1] || '00'); }\n    function fmtRange(a, b) { return fmtTime(a) + ' - ' + fmtTime(b); }\n    function dayString(d, sep) {\n      if (d.closed) return 'Ferm\u00E9';\n      var parts = [];\n      if (d.m1 && d.m2) parts.push(fmtRange(d.m1, d.m2));\n      if (!state.continuous && d.a1 && d.a2) parts.push(fmtRange(d.a1, d.a2));\n      return parts.join(sep || ' | ');\n    }\n    function groups(sep) {\n      var strs = state.days.map(function (d) { return dayString(d, sep); }), out = [];\n      for (var i = 0; i < 7; i++) {\n        var last = out[out.length - 1];\n        if (last && last.str === strs[i]) last.end = i;\n        else out.push({ start: i, end: i, str: strs[i], closed: state.days[i].closed });\n      }\n      return out;\n    }\n    function groupLabel(g, full) { var names = full ? DAYS : DAYS_SHORT; return g.start === g.end ? names[g.start] : names[g.start] + ' - ' + names[g.end]; }\n    function recapHours() {\n      var lines = [];\n      groups(' / ').forEach(function (g) {\n        var txt = groupLabel(g, false) + ' ' + (g.closed ? 'ferm\u00E9' : g.str.replace(/ - /g, '\u2013'));\n        if (g.closed && lines.length) lines[lines.length - 1] += ' \u00B7 ' + txt;\n        else lines.push(txt);\n      });\n      return lines;\n    }\n    function hoursText() { return state.days.map(function (d, i) { return DAYS[i] + ' : ' + (dayString(d, ' | ') || '\u2014'); }).join('\\n'); }\n    function toMin(t) { if (!t) return null; var p = t.split(':'); return parseInt(p[0], 10) * 60 + parseInt(p[1], 10); }\n    function hoursValid() { return M.mode === 'free' ? !freeErr : (!globalErr && dayErrors.every(function (e) { return !e; })); }\n    function showNameError() { return !!nameErr && (submitAttempted || touchedKeys.picto); }\n    function freeBlocks() { var f = state.free.map(function (s) { return String(s || '').trim(); }); var out = []; if (f[0] || f[1]) out.push([f[0], f[1]]); if (f[2] || f[3]) out.push([f[2], f[3]]); return out; }\n\n    mod.validate = function () {\n      errors = {}; dayErrors = []; globalErr = ''; nameErr = ''; fieldErrs = {}; freeErr = '';\n      if (M.mode === 'free') {\n        if (!state.title.trim() && !state.free.some(function (s) { return String(s).trim(); })) freeErr = HM.blockRequired;\n        else if (!String(state.free[0] || '').trim()) freeErr = HM.blockRequired;\n        if (freeErr) errors.text = freeErr;\n      } else {\n        var openDays = 0;\n        state.days.forEach(function (d, i) {\n          dayErrors[i] = '';\n          if (d.closed) return;\n          openDays++;\n          var hasM = d.m1 && d.m2, hasA = !state.continuous && d.a1 && d.a2;\n          var partialM = (d.m1 && !d.m2) || (!d.m1 && d.m2);\n          var partialA = !state.continuous && ((d.a1 && !d.a2) || (!d.a1 && d.a2));\n          if ((!hasM && !hasA) || partialM || partialA) { dayErrors[i] = HM.noRange; return; }\n          if (hasM && toMin(d.m2) <= toMin(d.m1)) { dayErrors[i] = HM.order; return; }\n          if (hasA && toMin(d.a2) <= toMin(d.a1)) { dayErrors[i] = HM.order; return; }\n          if (hasM && hasA && toMin(d.m2) > toMin(d.a1)) { dayErrors[i] = HM.overlap; return; }\n        });\n        if (openDays === 0) globalErr = HM.noDay;\n        if (!hoursValid()) errors.hours = globalErr || HM.complete;\n      }\n      if (MODEL === 'm3' && state.picto === 'text' && !state.name.trim()) nameErr = HM.name;\n      ['name', 'phone', 'email', 'site'].forEach(function (k) { if (state[k].trim().length > FIELD_DEFS[k].max) fieldErrs[k] = MSG.tooLong; });\n      if (nameErr) errors.picto = nameErr;\n      if (Object.keys(fieldErrs).length) errors[fieldStep] = MSG.tooLong;\n      return mod.isValid();\n    };\n    mod.isValid = function () { return hoursValid() && !nameErr && !Object.keys(fieldErrs).length; };\n    mod.isComplete = function () { return hoursValid(); };\n    mod.touched = function (k) { return k === 'picto' ? !!touchedKeys.picto : (k === 'text' ? !!touchedKeys.text : true); };\n    mod.firstInvalidStep = function () { return !hoursValid() ? (M.mode === 'free' ? 'text' : 'hours') : (nameErr ? 'picto' : fieldStep); };\n    mod.incompleteLabel = function () { return hoursValid() ? HM.info : (M.mode === 'free' ? 'Compl\u00E9tez votre texte' : HM.complete); };\n    mod.fontSample = function () { return M.mode === 'free' ? (state.title.trim() || 'Horaires') : 'Horaires 8h00'; };\n\n    /* m1 : titre + 2 blocs de 2 lignes */\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Un titre et deux blocs de deux lignes : jours puis horaires. Une ligne vide ne s\u2019imprime pas.' }));\n      body.appendChild(textField({ key: 'title', label: 'Titre', placeholder: 'HORAIRES, BIENVENUE, nom de votre commerce\u2026', max: 18, value: state.title,\n        onInput: function (v) { state.title = v; touch('text'); debounced('title', function () { markInteracted(); mod.validate(); updateLight(); }); } }));\n      [['Bloc 1', 0], ['Bloc 2', 1]].forEach(function (blk) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:10px', text: blk[0] }));\n        [0, 1].forEach(function (j) {\n          var i = blk[1] * 2 + j, isFirst = i === 0;\n          var err = isFirst && freeErr && (submitAttempted || touchedKeys.text) ? freeErr : '';\n          body.appendChild(textField({ key: 'free' + i, label: j === 0 ? 'Jours' : 'Horaires', placeholder: M1_DEFAULT[i], max: 32, value: state.free[i], err: err, required: isFirst,\n            onInput: function (v) { state.free[i] = v; touch('text'); debounced('free' + i, function () { markInteracted(); mod.validate(); markComplete(); patchField('free' + i, isFirst ? freeErr : '', '32 caract\u00E8res max.'); updateLight(); }); },\n            onBlur: function () { mod.validate(); patchField('free' + i, isFirst && (submitAttempted || touchedKeys.text) ? freeErr : '', '32 caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); } }));\n        });\n      });\n    };\n\n    /* \u00C9tape horaires (m2\u2013m4) */\n    function iconCopy() { return '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>'; }\n    function iconSun() { return '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg>'; }\n    function iconMoon() { return '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\"/></svg>'; }\n    function onHoursChanged() { markInteracted(); mod.validate(); markComplete(); update(); }\n    function timePair(i, k1, k2, d, pm) {\n      var pair = el('span', { class: 'leni-hours__pair' + (pm ? ' leni-hours__pair--pm' : '') });\n      [k1, k2].forEach(function (k, idx) {\n        pair.appendChild(el('input', {\n          type: 'time', class: 'leni-hours__time', value: d[k] || '', disabled: d.closed ? true : null, step: '300',\n          'aria-label': DAYS[i] + ' ' + (pm ? 'apr\u00E8s-midi' : 'matin') + (idx ? ' fin' : ' d\u00E9but'),\n          onchange: function () { state.days[i][k] = this.value; onHoursChanged(); },\n          oninput: function () { state.days[i][k] = this.value; }\n        }));\n        if (idx === 0) pair.appendChild(el('span', { text: '\u2013' }));\n      });\n      return pair;\n    }\n    function toggleClosed(i, closed) {\n      var d = state.days[i];\n      if (closed) { d.prev = { m1: d.m1, m2: d.m2, a1: d.a1, a2: d.a2 }; d.closed = true; d.m1 = d.m2 = d.a1 = d.a2 = ''; }\n      else {\n        d.closed = false;\n        if (d.prev) { d.m1 = d.prev.m1; d.m2 = d.prev.m2; d.a1 = d.prev.a1; d.a2 = d.prev.a2; }\n        if (!d.m1 && !d.m2 && !d.a1 && !d.a2) { d.m1 = '09:00'; d.m2 = state.continuous ? '19:00' : '12:30'; d.a1 = state.continuous ? '' : '14:00'; d.a2 = state.continuous ? '' : '19:00'; }\n      }\n      onHoursChanged();\n    }\n    function presetCopyMonday() {\n      var m = state.days[0];\n      for (var i = 1; i <= 5; i++) { var d = state.days[i]; d.closed = m.closed; d.m1 = m.m1; d.m2 = m.m2; d.a1 = m.a1; d.a2 = m.a2; }\n      toast(HM.copyMonday);\n      onHoursChanged();\n    }\n    function presetContinuous() {\n      state.continuous = !state.continuous;\n      state.days.forEach(function (d) {\n        if (d.closed) return;\n        if (state.continuous) { d.prevC = { m2: d.m2, a1: d.a1, a2: d.a2 }; if (d.m1 && (d.a2 || d.m2)) d.m2 = d.a2 || d.m2; d.a1 = ''; d.a2 = ''; }\n        else if (d.prevC) { d.m2 = d.prevC.m2; d.a1 = d.prevC.a1; d.a2 = d.prevC.a2; d.prevC = null; }\n      });\n      onHoursChanged();\n    }\n    mod.render.hours = function () {\n      var body = bodyOf('hours'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: M.mode === 'grouped' ? 'Les jours aux m\u00EAmes horaires sont regroup\u00E9s (Lundi - Vendredi).' : 'Renseignez au moins une plage horaire par jour ouvert.' }));\n      body.appendChild(el('div', { class: 'leni-hours__presets' }, [\n        el('button', { type: 'button', class: 'leni-hours__preset', html: iconCopy() + ' Copier lundi sur la semaine', onclick: presetCopyMonday }),\n        el('button', { type: 'button', class: 'leni-hours__preset' + (state.continuous ? ' is-active' : ''), 'data-preset': 'continuous', html: iconSun() + ' Journ\u00E9e continue', onclick: presetContinuous }),\n        el('button', { type: 'button', class: 'leni-hours__preset' + (state.days[6].closed ? ' is-active' : ''), 'data-preset': 'sunday', html: iconMoon() + ' Ferm\u00E9 le dimanche', onclick: function () { toggleClosed(6, !state.days[6].closed); } })\n      ]));\n      var table = el('table', { class: 'leni-hours__table' + (state.continuous ? ' leni-hours__continuous' : '') });\n      table.appendChild(el('thead', {}, [el('tr', {}, [el('th', { text: 'Jour' }), el('th', { text: state.continuous ? 'Horaires' : 'Matin' }), el('th', { text: 'Apr\u00E8s-midi', class: 'leni-hours__th-pm' }), el('th', { text: 'Ferm\u00E9' })])]));\n      var tbody = el('tbody');\n      state.days.forEach(function (d, i) {\n        var row = el('tr', { class: 'leni-hours__row' + (d.closed ? ' is-closed' : '') + (dayErrors[i] ? ' is-invalid' : ''), 'data-day': i });\n        row.appendChild(el('td', { text: DAYS[i] }));\n        row.appendChild(el('td', {}, [timePair(i, 'm1', 'm2', d)]));\n        row.appendChild(el('td', { class: 'leni-hours__td-pm' }, [timePair(i, 'a1', 'a2', d, true)]));\n        row.appendChild(el('td', {}, [el('label', { class: 'leni-hours__closed' }, [el('input', { type: 'checkbox', checked: d.closed ? true : null, 'aria-label': 'Ferm\u00E9 le ' + DAYS[i].toLowerCase(), onchange: function () { toggleClosed(i, this.checked); } })])]));\n        tbody.appendChild(row);\n        if (dayErrors[i]) tbody.appendChild(el('tr', { class: 'leni-hours__row-error' }, [el('td', { colspan: '4', text: '\u26A0 ' + dayErrors[i] })]));\n      });\n      table.appendChild(tbody);\n      body.appendChild(table);\n      body.appendChild(el('p', { class: 'leni-cfg__error' + (globalErr ? ' is-visible' : ''), text: globalErr ? '\u26A0 ' + globalErr : '' }));\n    };\n\n    /* Champs coordonn\u00E9es / boutique */\n    function fieldRow(k, err) {\n      var def = FIELD_DEFS[k];\n      return textField({\n        key: k, label: def.label, placeholder: def.placeholder, max: def.max, value: state[k], err: err, type: def.type, auto: def.auto, required: k === 'name' && MODEL === 'm3',\n        onInput: function (v) { state[k] = v; if (k === 'name') touch('picto'); debounced(k, function () { markInteracted(); mod.validate(); patchField(k, fieldErr(k), def.max + ' caract\u00E8res max.'); updateLight(); }); },\n        onBlur: function () { if (k === 'name') touch('picto'); mod.validate(); patchField(k, fieldErr(k), def.max + ' caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); }\n      });\n    }\n    function fieldErr(k) { return k === 'name' && MODEL === 'm3' ? (showNameError() ? nameErr : '') : (fieldErrs[k] || ''); }\n    function renderFields(stepKey) {\n      var body = bodyOf(stepKey); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Facultatif : l\u2019aper\u00E7u montre un exemple gris\u00E9 tant que le champ est vide ; une ligne vide ne s\u2019imprime pas.' }));\n      M.fields.forEach(function (k) { body.appendChild(fieldRow(k, fieldErrs[k] || '')); });\n    }\n    mod.render.contact = function () { renderFields('contact'); };\n    mod.render.identity = function () { renderFields('identity'); };\n\n    /* Picto ou nom (m3) */\n    function paths(list, fill) { return (list || []).map(function (d) { return '<path d=\"' + d + '\" fill=\"' + fill + '\"/>'; }).join(''); }\n    function polys(list, fill) { return (list || []).map(function (p) { return '<polygon points=\"' + p + '\" fill=\"' + fill + '\"/>'; }).join(''); }\n    mod.render.picto = function () {\n      var body = bodyOf('picto'); if (!body) return;\n      body.innerHTML = '';\n      var grid = el('div', { class: 'leni-pictos', role: 'radiogroup', 'aria-label': 'Picto ou nom' });\n      PICTOS.forEach(function (p) {\n        var inner;\n        if (p.key === 'none') inner = el('span', { class: 'leni-picto__glyph leni-picto__glyph--none', text: '\u2014' });\n        else if (p.key === 'text') inner = el('span', { class: 'leni-picto__glyph leni-picto__glyph--text', text: 'Abc' });\n        else {\n          var sh = SHAPES.m3_pictos && SHAPES.m3_pictos[p.key], bb = sh && sh.bb ? sh.bb : [0, 0, 100, 100];\n          inner = el('span', { class: 'leni-picto__glyph', html: '<svg viewBox=\"' + (bb[0] - 8) + ' ' + (bb[1] - 8) + ' ' + (bb[2] - bb[0] + 16) + ' ' + (bb[3] - bb[1] + 16) + '\" aria-hidden=\"true\">' + paths(sh ? sh.paths : [], 'currentColor') + '</svg>' });\n        }\n        grid.appendChild(el('button', {\n          type: 'button', class: 'leni-picto' + (state.picto === p.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.picto === p.key ? 'true' : 'false',\n          onclick: function () { state.picto = p.key; markInteracted(); update(); if (p.key === 'text') { var inp = $('#leniField-name'); if (inp) inp.focus(); } }\n        }, [inner, el('span', { class: 'leni-picto__label', text: p.label })]));\n      });\n      body.appendChild(grid);\n      if (state.picto === 'text') body.appendChild(fieldRow('name', showNameError() ? nameErr : ''));\n      body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:10px', text: 'Le picto ou le nom se place entre \u00AB BIENVENUE \u00BB et \u00AB NOS HORAIRES \u00BB.' }));\n    };\n\n    /* Valeurs d'\u00E9tape, r\u00E9cap */\n    function pictoLabel() { if (state.picto === 'text') return state.name.trim() || 'Nom de la boutique'; var p = PICTOS.filter(function (x) { return x.key === state.picto; })[0]; return p ? p.label : 'Aucun'; }\n    function fieldsText() { var cl = M.fields.map(function (k) { return state[k].trim(); }).filter(Boolean); return cl.length ? cl.join(' \u00B7 ') : 'Aucune'; }\n    mod.stepValue = function (key) {\n      if (key === 'text') { var b = freeBlocks(); return (state.title.trim() ? state.title.trim() + ' \u00B7 ' : '') + (b.length ? b.map(function (x) { return x.filter(Boolean).join(' '); }).join(' / ') : '\u00C0 saisir'); }\n      if (key === 'hours') return recapHours().join(' \u00B7 ');\n      if (key === 'picto') return pictoLabel();\n      if (key === 'contact' || key === 'identity') return fieldsText();\n      return '';\n    };\n    mod.recapLines = function () {\n      var out = [];\n      if (M.mode === 'free') {\n        if (state.title.trim()) out.push({ text: state.title.trim(), step: 'text' });\n        freeBlocks().forEach(function (b) { out.push({ text: b.filter(Boolean).join(' \u00B7 '), step: 'text' }); });\n      } else out = recapHours().map(function (t) { return { text: t, step: 'hours' }; });\n      if (mod.steps.indexOf('picto') >= 0) out.push({ text: (state.picto === 'text' ? 'Nom : ' : 'Picto : ') + pictoLabel(), step: 'picto' });\n      if (M.fields.length) out.push({ text: (fieldStep === 'contact' ? 'Coordonn\u00E9es : ' : 'Boutique : ') + fieldsText(), step: fieldStep });\n      return out;\n    };\n    mod.stickySub = function () { return (hasRole('size') ? state.opt.size + ' \u00B7 ' : '') + (state.opt.color || ''); };\n    mod.lightBg = function () { return /noir|black/i.test(state.opt.color || ''); };\n\n    /* Aper\u00E7u et fichier de d\u00E9coupe : les 4 gabarits (coordonn\u00E9es des plans de travail source, 1 unit\u00E9 = 1 pt) dessin\u00E9s\n       par un \u00AB rendu \u00BB R : previewR (texte SVG, placeholders gris\u00E9s pour les coordonn\u00E9es vides) ou vectorR (trac\u00E9s\n       en mm, sans placeholder, crochets/arc/pictos \u00E0 l'\u00E9chelle, filets en rectangles, miroir si pose int\u00E9rieure). */\n    function contactLines(keys) { return keys.map(function (k) { return orPh(k); }); }\n    function previewR() {\n      var fill = svgFill(state.opt.color), out = [];\n      return {\n        open: function (X0, Y0, W, H, label) { out.push('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"' + X0 + ' ' + Y0 + ' ' + W + ' ' + H + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"' + label + '\">', defs()); },\n        T: function (o) { o.fill = fill; out.push(T(o)); },\n        polys: function (l) { out.push(polys(l, fill)); },\n        paths: function (l) { out.push(paths(l, fill)); },\n        rule: function (x1, x2, y) { out.push('<line x1=\"' + x1 + '\" y1=\"' + y + '\" x2=\"' + x2 + '\" y2=\"' + y + '\" stroke=\"' + fill + '\" stroke-width=\"5\"/>'); },\n        close: function () { out.push('</svg>'); return out.join(''); }\n      };\n    }\n    function sheetWidthMm() {\n      if (MODEL === 'm1') { var m = optionMeta(state.opt.size), w = m.w || parseCm(state.opt.size); return w ? w * 10 : 210; } // taille choisie (20 ou 28 cm)\n      return 280; // m2, m3, m4 : un seul format, 28 cm de large (hauteur proportionnelle au gabarit)\n    }\n    function vectorR(title) {\n      var hex = VEC.hex(state.opt.color), out = [], s = 1, ox = 0, oy = 0, Wmm = 0, Hmm = 0, exact = true, loaded = true, fams = {}, F = VEC.F;\n      return {\n        open: function (X0, Y0, W, H) { Wmm = sheetWidthMm(); s = Wmm / W; Hmm = H * s; ox = -X0 * s; oy = -Y0 * s; },\n        T: function (o) {\n          if (!o.text || o.opacity) return; // placeholders gris\u00E9s : jamais dans le fichier\n          var size = fitSize(o.text, o.family, o.weight, o.size, o.maxW) * s;\n          var v = VEC.text({ text: o.text, family: o.family, weight: o.weight, x: o.x * s + ox, y: o.y * s + oy, size: size, anchor: o.anchor }); if (!v) return;\n          exact = exact && v.exact; loaded = loaded && v.loaded !== false; fams[o.family] = 1;\n          out.push('<path fill=\"' + hex + '\" fill-rule=\"' + v.rule + '\" d=\"' + v.d + '\"/>');\n        },\n        polys: function (l) { (l || []).forEach(function (p) { var n = String(p).trim().split(/[\\s,]+/).map(Number), pts = []; for (var i = 0; i + 1 < n.length; i += 2) pts.push(F(n[i] * s + ox) + ',' + F(n[i + 1] * s + oy)); out.push('<polygon fill=\"' + hex + '\" points=\"' + pts.join(' ') + '\"/>'); }); },\n        paths: function (l) { (l || []).forEach(function (d) { var b = bakePath(d, s, ox, oy, 3); out.push(b ? '<path fill=\"' + hex + '\" d=\"' + b + '\"/>' : '<path fill=\"' + hex + '\" d=\"' + d + '\" transform=\"translate(' + F(ox) + ' ' + F(oy) + ') scale(' + s.toFixed(6) + ')\"/>'); }); },\n        rule: function (x1, x2, y) { out.push('<rect fill=\"' + hex + '\" x=\"' + F(x1 * s + ox) + '\" y=\"' + F((y - 2.5) * s + oy) + '\" width=\"' + F((x2 - x1) * s) + '\" height=\"' + F(5 * s) + '\"/>'); },\n        close: function () { return VEC.svg(Wmm, Hmm, VEC.wrap(out.join(''), Wmm), { title: title, fonts: Object.keys(fams), exact: exact, loaded: loaded }); }\n      };\n    }\n    var LAYOUTS = {\n      m1: function (R) {\n        var W = 595.28, H = 453.54, cx = W / 2, fam = state.font || 'Big Shoulders Display', wt = fontWeightFor(fam);\n        R.open(0, 0, W, H, 'Aper\u00E7u de votre sticker horaires');\n        R.polys(SHAPES.m1_brackets);\n        var title = state.title.trim();\n        if (title) R.T({ x: cx, y: 97.7, text: title, family: fam, weight: wt, size: 77.43, anchor: 'middle', maxW: 430 });\n        var blocks = freeBlocks();\n        blocks.forEach(function (b, i) {\n          var labelY = 150 + 39.7 + 150.7 * i;\n          if (b[0]) R.T({ x: cx, y: labelY, text: b[0], family: fam, weight: wt, size: 55, anchor: 'middle', maxW: 420 });\n          if (b[1]) R.T({ x: cx, y: labelY + 55.4, text: b[1], family: fam, weight: wt, size: 45, anchor: 'middle', maxW: 420 });\n        });\n        return R.close();\n      },\n      m2: function (R) {\n        var W = 826.42, H = 1102.57, cx = W / 2;\n        R.open(0, 0, W, H, 'Aper\u00E7u de votre sticker Nos Horaires');\n        R.T({ x: 165.5, y: 137.2, text: 'Nos', family: 'Breath of the River', weight: 400, size: 147.45 });\n        R.T({ x: 302.9, y: 226.0, text: 'Horaires', family: 'Breath of the River', weight: 400, size: 147.45 });\n        var ys = [331.2, 423.0, 514.7, 606.2, 702.1, 793.5, 885.0];\n        state.days.forEach(function (d, i) {\n          R.T({ x: 34.1, y: ys[i], text: DAYS[i], family: 'Cookie', weight: 400, size: 75.48 });\n          R.T({ x: 292.5, y: ys[i], text: dayString(d, ' | '), family: 'Cookie', weight: 400, size: 52, maxW: 515 });\n        });\n        var cl = contactLines(['phone', 'email']), cys = [1009.0, 1073.4];\n        cl.forEach(function (c, i) { R.T({ x: cx, y: cys[i], text: c.text, family: 'Cookie', weight: 400, size: 75.48, anchor: 'middle', maxW: 780, opacity: c.ph ? 0.4 : 0 }); });\n        return R.close();\n      },\n      m3: function (R) {\n        var X0 = 311.8, Y0 = 106, W = 793.7, H = 1190.6, cx = X0 + W / 2;\n        R.open(X0, Y0, W, H, 'Aper\u00E7u de votre sticker Bienvenue');\n        R.paths(SHAPES.m3_bienvenue);\n        var textMode = state.picto === 'text';\n        R.rule(418.4, 571.2, 361.5); R.rule(851.8, 1004.6, 361.5);\n        R.rule(418.4, 571.2, 512.2); R.rule(851.8, 1004.6, 512.2);\n        if (textMode) { var nm = orPh('name'); R.T({ x: cx, y: 335, text: nm.text, family: 'Contrail One', weight: 400, size: 62, anchor: 'middle', maxW: 260, opacity: nm.ph ? 0.4 : 0 }); }\n        else if (state.picto !== 'none' && SHAPES.m3_pictos && SHAPES.m3_pictos[state.picto]) R.paths(SHAPES.m3_pictos[state.picto].paths);\n        R.T({ x: cx, y: 479.2, text: 'NOS HORAIRES', family: 'Contrail One', weight: 400, size: 114.77, anchor: 'middle', maxW: 700 });\n        var gs = groups(' | '), n = gs.length, s = n > 3 ? Math.max(0.45, 3 / n) : 1;\n        gs.forEach(function (g, i) {\n          var labelY = 624.1 - (1 - s) * 30 + s * 176.8 * i;\n          R.T({ x: cx, y: labelY, text: groupLabel(g, true), family: 'Cookie', weight: 400, size: 99.2 * s, anchor: 'middle', maxW: 700 });\n          R.T({ x: cx, y: labelY + 67.2 * s, text: g.str, family: 'Contrail One', weight: 400, size: 55.1 * s, anchor: 'middle', maxW: 700 });\n        });\n        var cl = contactLines(['phone', 'email', 'site']), cys = [1172.5, 1228.7, 1295.7];\n        cl.forEach(function (c, i) { R.T({ x: cx, y: cys[i], text: c.text, family: 'Contrail One', weight: 400, size: 51.24, anchor: 'middle', maxW: 700, opacity: c.ph ? 0.4 : 0 }); });\n        return R.close();\n      },\n      m4: function (R) {\n        var X0 = 311.8, Y0 = 201.9, W = 793.7, H = 1013.5, cx = X0 + W / 2, fam = state.font || 'Source Sans 3', wt = fontWeightFor(fam);\n        R.open(X0, Y0, W, H, 'Aper\u00E7u de votre sticker horaires tableau');\n        R.polys(SHAPES.m4b_brackets);\n        var nm = orPh('name');\n        R.T({ x: cx, y: 278.5, text: nm.text, family: fam, weight: wt, size: 38.76, anchor: 'middle', maxW: 600, opacity: nm.ph ? 0.4 : 0 });\n        R.T({ x: cx, y: 357.7, text: 'HORAIRES', family: fam, weight: wt, size: 77.52, anchor: 'middle', maxW: 600 });\n        var ys = [498.8, 572.3, 645.9, 719.4, 792.9, 866.9, 940.8];\n        state.days.forEach(function (d, i) {\n          R.T({ x: 395.0, y: ys[i], text: DAYS[i], family: fam, weight: wt, size: 38.76 });\n          R.T({ x: 1022, y: ys[i], text: dayString(d, ' | '), family: fam, weight: wt, size: 38.76, anchor: 'end', maxW: 470 });\n        });\n        var cl = contactLines(['site', 'phone']), cys = [1092.7, 1158.8];\n        cl.forEach(function (c, i) { R.T({ x: cx, y: cys[i], text: c.text, family: fam, weight: wt, size: 38.76, anchor: 'middle', maxW: 600, opacity: c.ph ? 0.4 : 0 }); });\n        return R.close();\n      }\n    };\n    mod.preview = function () { return (LAYOUTS[MODEL] || LAYOUTS.m1)(previewR()); };\n    /* \u2500\u2500 Fichier de d\u00E9coupe : m\u00EAme gabarit, en trac\u00E9s \u00E0 l'\u00E9chelle r\u00E9elle \u2500\u2500 */\n    mod.vectorFonts = function () { var f = (M.baseFonts || []).map(function (x) { return x.family; }); if (M.fontChoice && state.font) f.push(state.font); return f; };\n    mod.files = function () {\n      if (!mod.isValid()) return [];\n      var who = MODEL === 'm1' ? state.title.trim() : state.name.trim(), label = 'Sticker horaires ' + MODEL.toUpperCase() + (who ? ' \u00B7 ' + who : '') + ' \u00B7 ' + (state.opt.color || '');\n      var svg = (LAYOUTS[MODEL] || LAYOUTS.m1)(vectorR(label));\n      return VEC.file(svg, 'horaires-' + MODEL + '-' + VEC.slug(who || (MODEL === 'm1' ? state.opt.size : 'vitrine'), 'sticker') + '.svg');\n    };\n\n    /* Propri\u00E9t\u00E9s de ligne, _config */\n    mod.properties = function () {\n      var p = {};\n      if (M.mode === 'free') {\n        if (state.title.trim()) p['Titre'] = state.title.trim();\n        p['Horaires'] = freeBlocks().map(function (b) { return b.filter(Boolean).join(' : '); }).join('\\n');\n      } else p['Horaires'] = hoursText();\n      if (M.fontChoice && state.font) p['Police'] = state.font;\n      if (MODEL === 'm3') {\n        if (state.picto === 'text') p['Nom de la boutique'] = state.name.trim();\n        else p['Picto'] = (PICTOS.filter(function (x) { return x.key === state.picto; })[0] || {}).label || 'Aucun';\n      }\n      M.fields.forEach(function (k) { if (state[k].trim()) p[FIELD_DEFS[k].prop] = state[k].trim(); });\n      return p;\n    };\n    mod.compact = function () {\n      var c = {\n        v: 3, m: MODEL, s: state.opt.size || '', c: state.opt.color || '', f: state.font,\n        j: state.continuous ? 1 : 0,\n        h: state.days.map(function (d) { return [d.closed ? 1 : 0, d.m1, d.m2, d.a1, d.a2]; }),\n        p: state.picto, n: state.name, t: state.phone, e: state.email, w: state.site,\n        r: state.extras.raclette ? 1 : 0, mi: state.extras.mirror ? 1 : 0\n      };\n      if (M.mode === 'free') { c.ti = state.title; c.l = state.free; }\n      return c;\n    };\n    mod.apply = function (c) {\n      var size = c.s || (c.v < 2 ? c.f : ''), color = c.c;\n      if (size && hasRole('size') && roleValues('size').indexOf(size) >= 0) state.opt.size = size;\n      if (color && hasRole('color') && roleValues('color').indexOf(color) >= 0) state.opt.color = color;\n      if (c.v >= 2 && typeof c.f === 'string' && c.f) state.font = c.f;\n      state.continuous = !!c.j;\n      if (Array.isArray(c.h) && c.h.length === 7) state.days = c.h.map(function (h) { return { closed: !!h[0], m1: h[1] || '', m2: h[2] || '', a1: h[3] || '', a2: h[4] || '', prev: null }; });\n      if (c.p) state.picto = c.p;\n      ['n', 't', 'e', 'w'].forEach(function (k, i) { var key = ['name', 'phone', 'email', 'site'][i]; if (typeof c[k] === 'string') state[key] = c[k]; });\n      if (c.v < 2 && c.t === 'custom' && c.n) state.name = c.n;\n      if (typeof c.ti === 'string') state.title = c.ti;\n      if (Array.isArray(c.l) && c.l.length === 4) state.free = c.l.map(function (s) { return String(s || ''); });\n      if ('mirror' in state.extras) state.extras.mirror = !!c.mi;\n      if ('raclette' in state.extras) state.extras.raclette = !!c.r;\n    };\n    mod.fontsToLoad = function () {\n      var fonts = (M.baseFonts || []).slice();\n      if (M.fontChoice && state.font) fonts.push({ family: state.font, weight: fontWeightFor(state.font) });\n      return fonts;\n    };\n    return mod;\n  })();\n\n  /* \u2500\u2500 DUO : pr\u00E9nom en deux couches \u2014 lettres + contour (vinyle) ou lettres + socle d'une seule pi\u00E8ce (bois) \u2500\u2500\n     Longueur (variante) \u2192 Pr\u00E9nom(s) (jusqu'\u00E0 N, m\u00EAme hauteur de lettres) \u2192 Police (liste du r\u00E9glage) \u2192 Couleurs\n     (lettres + contour/socle, par pr\u00E9nom). Vinyle : lettres = variante \u00AB Couleur des lettres \u00BB, contour = palette \u2192\n     propri\u00E9t\u00E9. Bois : lettres et socle = palette (\u00AB Bois brut \u00BB = couche non peinte), variante \u00AB Peinture \u00BB d\u00E9duite\n     du nombre de couches peintes et m\u00E9tallis\u00E9es, option \u00AB Adh\u00E9sif au dos \u00BB = variante \u00E0 bascule. Une ligne de\n     panier par pr\u00E9nom. Le socle bois est trac\u00E9 d'une seule pi\u00E8ce : contre-formes combl\u00E9es, accents et points\n     rattach\u00E9s par un pont, contour suivi et liss\u00E9 (m\u00EAmes outils que le logo). */\n  /* \u2500\u2500 KIT VITRINE : composition livr\u00E9e en SVG (un groupe par vinyle : blanc, rouge, or) dont les deux textes de la maquette,\n     \u00AB VOTRE BOUTIQUE \u00BB et \u00AB DU 24 AU 30 NOVEMBRE \u00BB, sont remplac\u00E9s par la saisie du client (facultative : sans nom, la ligne\n     est retir\u00E9e ; sans dates, les dates par d\u00E9faut). Variantes : \u00AB Version \u00BB (blanc seul / couleurs = composition diff\u00E9rente),\n     \u00AB Largeur \u00BB (cm), \u00AB Pose \u00BB (ext\u00E9rieure / int\u00E9rieure = d\u00E9coupe en miroir, m\u00EAme prix). Aper\u00E7u : la composition sur une vitre\n     sombre, textes r\u00E9duits pour tenir dans la bo\u00EEte de la maquette, contours exacts d\u00E8s que la police h\u00E9berg\u00E9e est charg\u00E9e.\n     Fichier de d\u00E9coupe : viewBox en mm, un groupe par vinyle, textes en contours, lettres en d\u00E9fonce dans la pi\u00E8ce porteuse\n     (sous-trac\u00E9s en pair/impair), miroir si pose int\u00E9rieure. \u2500\u2500 */\n  KINDS.kit = (function () {\n    var C = cfg.kit || {}, NAME_MAX = +C.nameMax || 30, DATES_MAX = +C.datesMax || 24, DATES_DEF = C.datesDefault || 'DU 24 AU 30 NOVEMBRE', NAME_PH = C.namePlaceholder || 'VOTRE BOUTIQUE', GLASS = C.glass || '#2A2D31';\n    var VHEX = { blanc: '#FFFFFF', rouge: '#CC1617', or: '#D4A843', noir: '#161616' };\n    var assets = {}, loading = {};\n    function versions() { return roleValues('version'); }\n    function assetUrl(ver) { var i = versions().indexOf(ver); return (C.assets || [])[i >= 0 ? i : 0] || ''; }\n    function parseAsset(txt) {\n      var doc = new DOMParser().parseFromString(txt, 'image/svg+xml'), svg = doc.documentElement;\n      var vb = (svg.getAttribute('viewBox') || '0 0 1000 600').split(/[\\s,]+/).map(Number), groups = [], texts = {};\n      Array.prototype.forEach.call(svg.querySelectorAll('g[data-vinyl]'), function (g) {\n        groups.push({ vinyl: g.getAttribute('data-vinyl'), paths: Array.prototype.map.call(g.querySelectorAll('path'), function (p) { return { d: p.getAttribute('d') || '', rule: p.getAttribute('fill-rule') || 'nonzero', with: p.getAttribute('data-with') || '' }; }) }); // with = 'boutique' : trait d\u00E9coratif du nom, retir\u00E9 avec lui\n      });\n      Array.prototype.forEach.call(svg.querySelectorAll('text[id]'), function (t) {\n        texts[t.id] = { x: +t.getAttribute('x'), y: +t.getAttribute('y'), size: +t.getAttribute('data-size') || 60, w: +t.getAttribute('data-w') || 600, font: t.getAttribute('data-font') || (cfg.fonts || [])[0] || 'Outfit', knock: t.getAttribute('data-knockout') === '1' };\n      });\n      return { x: vb[0], y: vb[1], w: vb[2], h: vb[3], groups: groups, texts: texts };\n    }\n    function asset(ver) {\n      var url = assetUrl(ver); if (!url) return null;\n      if (assets[url]) return assets[url];\n      if (!loading[url]) {\n        loading[url] = true;\n        fetch(url).then(function (r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.text(); }).then(function (t) { assets[url] = parseAsset(t); updateLight(); })\n          .catch(function (e) { loading[url] = false; if (window.console) console.warn('[Lenidesign] composition du kit indisponible', url, e); });\n      }\n      return null;\n    }\n    function cur() { return asset(state.opt.version); }\n    function widthCm() { var m = optionMeta(state.opt.size); if (m.w) return m.w; return parseCm(state.opt.size) || 100; }\n    function heightCm(w, a) { a = a || cur(); if (!a) return 0; return (w || widthCm()) * a.h / a.w; }\n    function dims() { var h = heightCm(); return h ? fmtCm(widthCm()) + ' \u00D7 ' + fmtCm(h) + ' cm' : ''; }\n    function clean(v, max) { return String(v || '').toUpperCase().replace(/\\s+/g, ' ').trim().slice(0, max); }\n    function nameText() { return clean(state.kitName, NAME_MAX); }\n    function datesText() { return clean(state.kitDates, DATES_MAX) || DATES_DEF; }\n    function mirror() { return hasRole('pose') && /int[\u00E9e]rieur|miroir/i.test(state.opt.pose || ''); }\n    function fitSize(txt, t) {\n      // corps r\u00E9duit pour tenir dans la bo\u00EEte de la maquette, jamais agrandi\n      var m = VEC.metrics(txt, t.font, fontWeightFor(t.font), t.size); if (!m) return t.size;\n      var ink = Math.max(m.x2 - m.x1, 1); return ink > t.w ? t.size * t.w / ink : t.size;\n    }\n    function textPath(txt, t) {\n      var size = fitSize(txt, t), v = VEC.text({ text: txt, family: t.font, weight: fontWeightFor(t.font), x: t.x, y: t.y, size: size, anchor: 'middle' });\n      return v ? { d: v.d, rule: v.rule, exact: v.exact, loaded: v.loaded, size: size } : null;\n    }\n    function pathContains(d, x, y) { try { return mctx.isPointInPath(new Path2D(d), x, y, 'nonzero'); } catch (e) { return false; } }\n    var mod = {\n      steps: ['version', 'size', 'text', 'pose'].filter(function (k) { return k === 'text' || hasRole(k); }),\n      labels: { version: roleLabel('version'), size: (cfg.labels && cfg.labels.size) || roleLabel('size'), text: 'Nom et dates', pose: roleLabel('pose') },\n      mainStep: 'text',\n      render: {},\n      init: function () {\n        state.kitName = ''; state.kitDates = DATES_DEF; // dates pr\u00E9-remplies, modifiables ; nom vide = ligne et traits retir\u00E9s\n        (cfg.fonts || []).forEach(OT.ensureFont); OT.ensureClipper();\n        versions().forEach(asset);\n      }\n    };\n    function dropped(p) { return p.with === 'boutique' && !nameText(); } // pi\u00E8ce d\u00E9corative du nom quand il n'y a pas de nom\n    mod.render.version = function () { renderRoleList('version', { hint: C.versionHint || 'Blanc seul : un vinyle, lisible sur toute vitrine. Couleurs : vinyles pos\u00E9s l\u2019un apr\u00E8s l\u2019autre, rep\u00E8res sur le plan de pose.' }); };\n    mod.render.pose = function () { renderRoleList('pose', { hint: C.poseHint || 'Ext\u00E9rieure : coll\u00E9 sur la face ext\u00E9rieure de la vitre. Int\u00E9rieure : coll\u00E9 derri\u00E8re la vitre, kit d\u00E9coup\u00E9 en miroir pour se lire depuis la rue. M\u00EAme prix.' }); };\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Les deux champs sont facultatifs. Majuscules automatiques, comme sur la maquette ; un texte long est r\u00E9duit pour tenir dans sa ligne.' }));\n      var hn = 'Vide : la ligne et ses traits sont retir\u00E9s du kit. ' + NAME_MAX + ' caract\u00E8res max.', hd = 'Dates du Black Friday 2026 par d\u00E9faut, modifiables (vide = \u00AB ' + DATES_DEF + ' \u00BB). ' + DATES_MAX + ' caract\u00E8res max.';\n      body.appendChild(textField({ key: 'kitname', label: 'Nom de la boutique (facultatif)', placeholder: NAME_PH, max: NAME_MAX, value: state.kitName, err: '', required: false, hint: hn,\n        onInput: function (v) { state.kitName = v; touch('text'); debounced('kitname', function () { markInteracted(); mod.validate(); markComplete(); patchField('kitname', '', hn); updateLight(); }); },\n        onBlur: function () { renderHeaders(); renderPreview(); } }));\n      body.appendChild(textField({ key: 'kitdates', label: 'Dates ou mention (facultatif)', placeholder: DATES_DEF, max: DATES_MAX, value: state.kitDates, err: '', required: false, hint: hd,\n        onInput: function (v) { state.kitDates = v; touch('text'); debounced('kitdates', function () { markInteracted(); mod.validate(); patchField('kitdates', '', hd); updateLight(); }); },\n        onBlur: function () { renderHeaders(); renderPreview(); } }));\n      var d = dims(); body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniKitDims', text: d ? 'Composition ' + d : '' }));\n    };\n    mod.validate = function () { errors = {}; return true; };\n    mod.isValid = function () { return true; };\n    mod.isComplete = function () { return true; };\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return 'text'; };\n    mod.incompleteLabel = function () { return MSG.complete; };\n    mod.stepValue = function (key) { if (key === 'text') return (nameText() || 'Sans nom de boutique') + ' \u00B7 ' + datesText(); return ''; };\n    mod.recapLines = function () {\n      var out = [{ text: nameText() ? 'Nom : ' + nameText() : 'Sans nom de boutique', step: 'text' }, { text: 'Dates : ' + datesText(), step: 'text' }];\n      var d = dims(); if (d) out.push({ text: 'Composition ' + d, step: 'size' });\n      return out;\n    };\n    mod.stickySub = function () { return fmtCm(widthCm()) + ' cm \u00B7 ' + (state.opt.version || '') + (mirror() ? ' \u00B7 miroir' : ''); };\n    mod.dims = dims;\n    mod.sizeExtra = function (val) { var m = optionMeta(val), w = m.w || parseCm(val), a = cur(); return w && a ? 'hauteur ' + fmtCm(heightCm(w, a)) + ' cm' : ''; };\n    mod.lightBg = function () { return false; };\n    mod.readout = function () { return [{ label: 'Largeur', value: fmtCm(widthCm()) + ' cm' }, { label: 'Hauteur', value: fmtCm(heightCm()) + ' cm' }, { label: 'Version', value: state.opt.version || '' }]; }; // sous l'aper\u00E7u : pas de ligne \u00AB Police \u00BB, la police est celle de la maquette\n    mod.fontsToLoad = function () { return (cfg.fonts || []).map(function (f) { return { family: f, weight: fontWeightFor(f) }; }); };\n    mod.vectorFonts = function () { return cfg.fonts || []; };\n    mod.preview = function () {\n      var a = cur(), W = 1000, pad = 44;\n      if (!a) return '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1000 560\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre kit vitrine\"><rect width=\"1000\" height=\"560\" fill=\"' + GLASS + '\"/><text x=\"500\" y=\"290\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"26\" fill=\"#fff\" fill-opacity=\"0.6\">Chargement de la composition\u2026</text></svg>';\n      var k = (W - 2 * pad) / a.w, H = Math.round(a.h * k + 2 * pad + 52), ox = pad - a.x * k, oy = pad - a.y * k;\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre kit vitrine\">',\n        '<defs><linearGradient id=\"leniGlass\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#3A3D42\"/><stop offset=\"1\" stop-color=\"#17191C\"/></linearGradient>',\n        '<linearGradient id=\"leniGoldK\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#F6E27A\"/><stop offset=\"0.45\" stop-color=\"#C9961A\"/><stop offset=\"1\" stop-color=\"#F2DC8E\"/></linearGradient>',\n        '<filter id=\"leniKitShadow\" x=\"-5%\" y=\"-5%\" width=\"110%\" height=\"110%\"><feDropShadow dx=\"0\" dy=\"1.2\" stdDeviation=\"1.2\" flood-color=\"#000\" flood-opacity=\"0.35\"/></filter></defs>',\n        '<rect width=\"' + W + '\" height=\"' + H + '\" fill=\"url(#leniGlass)\"/>',\n        '<g transform=\"translate(' + ox.toFixed(2) + ' ' + oy.toFixed(2) + ') scale(' + k.toFixed(5) + ')\" filter=\"url(#leniKitShadow)\">'];\n      a.groups.forEach(function (g) {\n        out.push('<g fill=\"' + (g.vinyl === 'or' ? 'url(#leniGoldK)' : (VHEX[g.vinyl] || '#FFFFFF')) + '\">');\n        g.paths.forEach(function (p) { out.push('<path fill-rule=\"' + p.rule + '\" d=\"' + p.d + '\"' + (dropped(p) ? ' fill-opacity=\"0.45\"' : '') + '/>'); }); // traits du nom estomp\u00E9s avec l'exemple tant que le nom est vide\n        out.push('</g>');\n      });\n      [['boutique', nameText() || NAME_PH, !nameText()], ['dates', datesText(), false]].forEach(function (it) {\n        var t = a.texts[it[0]]; if (!t) return;\n        var txt = it[1], fill = t.knock ? GLASS : '#FFFFFF', op = it[2] ? ' fill-opacity=\"0.45\"' : '';\n        var v = OT.font(t.font) ? textPath(txt, t) : null;\n        if (v) out.push('<path d=\"' + v.d + '\" fill-rule=\"' + v.rule + '\" fill=\"' + fill + '\"' + op + '/>');\n        else out.push('<text x=\"' + t.x + '\" y=\"' + t.y + '\" text-anchor=\"middle\" font-family=\"\\'' + esc(t.font) + '\\', sans-serif\" font-weight=\"' + fontWeightFor(t.font) + '\" font-size=\"' + fitSize(txt, t).toFixed(1) + '\" fill=\"' + fill + '\"' + op + '>' + esc(txt) + '</text>');\n      });\n      out.push('</g>');\n      out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 18) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"22\" fill=\"#FFFFFF\" fill-opacity=\"0.75\">' + esc(dims() + ' \u00B7 vue depuis la rue' + (mirror() ? ' \u00B7 d\u00E9coup\u00E9 en miroir pour une pose int\u00E9rieure' : '')) + '</text>');\n      out.push('</svg>');\n      return out.join('');\n    };\n    mod.properties = function () {\n      var p = {};\n      p['Nom de la boutique'] = nameText() || 'Sans nom';\n      p['Dates'] = datesText();\n      p['Composition'] = dims();\n      return p;\n    };\n    mod.compact = function () { return { v: 1, k: 'kit', o: state.opt, n: state.kitName, d: state.kitDates, x: state.extras }; };\n    mod.apply = function (c) { applyOpts(c.o); state.kitName = String(c.n || ''); state.kitDates = String(c.d || ''); };\n    mod.files = function () {\n      var a = cur(); if (!a) return [];\n      var Wmm = widthCm() * 10, s = Wmm / a.w, Hmm = a.h * s, exact = true, loaded = true, parts = [], plain = [], knocks = [];\n      [['boutique', nameText()], ['dates', datesText()]].forEach(function (it) {\n        var t = a.texts[it[0]]; if (!t || !it[1]) return;\n        var v = textPath(it[1], t); if (!v) return;\n        exact = exact && v.exact; loaded = loaded && v.loaded !== false;\n        if (t.knock) knocks.push({ id: it[0], d: v.d, x: t.x, y: t.y - v.size * 0.35, done: false }); else plain.push({ id: it[0], d: v.d, rule: v.rule });\n      });\n      a.groups.forEach(function (g) {\n        var body = [];\n        g.paths.forEach(function (p, i) {\n          if (dropped(p)) return; // sans nom de boutique, ses traits ne sont pas d\u00E9coup\u00E9s\n          var d = p.d, rule = p.rule;\n          knocks.forEach(function (kn) { if (!kn.done && pathContains(p.d, kn.x, kn.y)) { d += ' ' + kn.d; rule = 'evenodd'; kn.done = true; } }); // d\u00E9fonce : lettres soustraites de la pi\u00E8ce porteuse\n          body.push('<path id=\"' + g.vinyl + '-' + (i + 1) + '\" fill-rule=\"' + rule + '\" d=\"' + d + '\"/>');\n        });\n        if (g.vinyl === 'blanc') plain.forEach(function (t) { body.push('<path id=\"' + t.id + '\" fill-rule=\"' + t.rule + '\" d=\"' + t.d + '\"/>'); });\n        parts.push('<g id=\"vinyle-' + g.vinyl + '\" fill=\"' + (VHEX[g.vinyl] || '#FFFFFF') + '\">' + body.join('') + '</g>');\n      });\n      knocks.forEach(function (kn) { if (!kn.done) parts.push('<g id=\"vinyle-blanc-texte\" fill=\"#FFFFFF\"><path id=\"' + kn.id + '\" fill-rule=\"evenodd\" d=\"' + kn.d + '\"/></g>'); }); // porteuse introuvable : texte livr\u00E9 en pi\u00E8ce blanche\n      var inner = '<g transform=\"translate(' + VEC.F(-a.x * s) + ' ' + VEC.F(-a.y * s) + ') scale(' + s.toFixed(6) + ')\">' + parts.join('') + '</g>';\n      if (mirror()) inner = '<g id=\"miroir\" transform=\"translate(' + VEC.F(Wmm) + ' 0) scale(-1 1)\">' + inner + '</g>';\n      var title = 'Kit vitrine ' + (C.model || '') + ' \u00B7 ' + (state.opt.version || '') + ' \u00B7 ' + fmtCm(widthCm()) + ' cm' + (nameText() ? ' \u00B7 ' + nameText() : '');\n      var svg = VEC.svg(Wmm, Hmm, inner, { title: title, label: 'kit vitrine', fonts: cfg.fonts || [], exact: exact, loaded: loaded, note: 'un groupe par vinyle (vinyle-blanc, vinyle-rouge, vinyle-or), textes : ' + (nameText() || 'sans nom') + ' / ' + datesText() + (mirror() ? ' \u00B7 d\u00E9coupe en miroir (pose int\u00E9rieure)' : ' \u00B7 pose ext\u00E9rieure') });\n      return VEC.file(svg, 'kit-' + VEC.slug(C.model, 'kit') + '-' + VEC.slug(state.opt.version, 'version') + '-' + fmtCm(widthCm()).replace(',', '-') + 'cm' + (nameText() ? '-' + VEC.slug(nameText(), 'boutique') : '') + (mirror() ? '-miroir' : '') + '.svg');\n    };\n    return mod;\n  })();\n\n  KINDS.duo = (function () {\n    var D = cfg.duo || {}, BOULE = D.mode === 'boule', WOOD = D.mode === 'wood' || BOULE, OFF = +D.offsetMm || 3, MAXN = Math.max(1, +D.maxNames || 4);\n    var MAX = (cfg.prenom && cfg.prenom.maxChars) || 16, PCT = +D.offsetPct || 0.13; // mm de contour par cm de largeur\n    var BG_LABEL = D.bgLabel || (BOULE ? 'Fond' : WOOD ? 'Socle' : 'Contour'), FG_LABEL = BOULE ? 'Couleur du bois' : 'Lettres';\n    // Boule de sapin (mode \u00AB boule \u00BB) : une seule pi\u00E8ce de peuplier teint\u00E9, anneau de ringMm + capuchon \u00E0 trou (contour d'un seul\n    // trac\u00E9, rien sous l'accroche). Style \u00AB bande \u00BB : bandeau horizontal de bandMm dans lequel le pr\u00E9nom est d\u00E9coup\u00E9 en d\u00E9fonce, le\n    // jour passe \u00E0 travers les lettres ; style \u00AB flottant \u00BB : pr\u00E9nom en plein, reli\u00E9 \u00E0 l'anneau des deux c\u00F4t\u00E9s (pos\u00E9 sur une tige si\n    // la hauteur le plafonne). Contre-formes et accents reli\u00E9s par des ponts de bridgeMm, traits plus fins que minMm refus\u00E9s.\n    // Option fond : deuxi\u00E8me couche pleine en peuplier naturel coll\u00E9e derri\u00E8re. Ligne 2 grav\u00E9e dans le bandeau (style bande).\n    var BO = D.boule || {}, nb = function (v, d) { v = +v; return isFinite(v) && v >= 0 ? v : d; };\n    var B_D = nb(BO.diamMm, 80), B_RING = nb(BO.ringMm, 7), B_BAND = nb(BO.bandMm, 24), B_CAP = nb(BO.capMm, 8), B_HOLE = nb(BO.holeMm, 3);\n    var B_BOLD = nb(BO.boldMm, 0), B_MIN = nb(BO.minMm, 1), B_BRIDGE = nb(BO.bridgeMm, 1.6), B_MARGIN = nb(BO.marginMm, 3), B_MAXH = nb(BO.maxHmm, 17);\n    var B_FLOAT = BO.style === 'flottant', B_FOND = !!BO.fond, B_L2 = !!BO.line2 && !B_FLOAT, B_L2MAX = +BO.line2Max || 12, B_L2LABEL = BO.line2Label || 'Ann\u00E9e ou mention (optionnel)';\n    var B_TRACK = nb(BO.track, 8) / 100; // interlettrage ajout\u00E9 aux \u00E9critures \u00E0 lettres s\u00E9par\u00E9es (d\u00E9fonce : garde un barreau de bois entre deux lettres), en em\n    var B_PAD = 3.2, B_L2H = 5.5, B_L2SZ = 4.2; // bande : marge haut/bas des lettres dans le bandeau, hauteur r\u00E9serv\u00E9e \u00E0 la ligne grav\u00E9e, corps de la gravure (mm)\n    var scriptCache = {};\n    function scriptFont() {\n      // \u00E9criture li\u00E9e (Pacifico, Lobster\u2026) ou lettres s\u00E9par\u00E9es ? Comptage des morceaux d'un mot t\u00E9moin \u00E0 100 px : \u2264 4 = li\u00E9e\n      var fam = famNow(), font = otFont(), key = fam + (font ? '|ot' : ''); if (key in scriptCache) return scriptCache[key];\n      var f = fontObj(); if (!font && !fontLoaded(f)) return false; // police pas encore l\u00E0 : pas de verdict mis en cache\n      var w = 420, h = 160, c = document.createElement('canvas'); c.width = w; c.height = h;\n      var ctx = c.getContext('2d'); ctx.fillStyle = '#000'; ctx.font = f.weight + ' 100px \"' + fam + '\"'; ctx.textBaseline = 'alphabetic';\n      if (font) ctx.fill(new Path2D(OT.pathData(font, 'Pr\u00E9nom', 20, 110, 100, 1))); else ctx.fillText('Pr\u00E9nom', 20, 110);\n      var d = ctx.getImageData(0, 0, w, h).data, bits = new Uint8Array(w * h), i; for (i = 0; i < w * h; i++) bits[i] = d[i * 4 + 3] > 127 ? 1 : 0;\n      var n = components(bits, w, h).filter(function (cp) { return cp.length > 30; }).length;\n      scriptCache[key] = n <= 4; return scriptCache[key];\n    }\n    var PAL = (cfg.palette || []).map(function (p) { return p.name; });\n    function isRaw(v) { return /brut|naturel/i.test(String(v || '')); }\n    function isMetal(v) { return isGold(v) || isSilver(v); }\n    function metalExtra() {\n      // suppl\u00E9ment d'une couche m\u00E9tallis\u00E9e, lu dans les variantes (1 couleur m\u00E9tallis\u00E9e \u2212 1 couleur)\n      if (!hasRole('layers')) return '';\n      var a = findVariant(selWith('layers', layersValue('or', 'brut'))), b = findVariant(selWith('layers', layersValue('x', 'brut')));\n      return a && b && a.price > b.price ? ' +' + formatMoney(a.price - b.price) : '';\n    }\n    function fgValues() { return hasRole('color') ? roleValues('color') : PAL; }\n    function bgValues() { return PAL; }\n    var mod = {\n      inlineFirst: true, // le champ pr\u00E9nom est l'\u00E9tape 1, ouverte (aussi sur mobile)\n      steps: ['text', 'size', 'font', 'color'].filter(function (k) { return k !== 'size' || (hasRole('size') && !BOULE); }),\n      labels: { size: (cfg.labels && cfg.labels.size) || (WOOD ? 'Largeur' : 'Longueur'), text: BOULE ? 'Le pr\u00E9nom' : 'Votre pr\u00E9nom', font: 'Police', color: BOULE ? 'Couleur du bois' : 'Couleurs' },\n      mainStep: 'text',\n      render: {},\n      init: function () {\n        if (!state.font || (cfg.fonts || []).indexOf(state.font) < 0) state.font = cfg.defaultFont || (cfg.fonts || [])[0] || 'Pacifico';\n        var fg = hasRole('color') ? state.opt.color : ((cfg.defaults && cfg.defaults.color && PAL.indexOf(cfg.defaults.color) >= 0) ? cfg.defaults.color : PAL[0] || '');\n        var bg = (cfg.defaults && cfg.defaults.bg && PAL.indexOf(cfg.defaults.bg) >= 0) ? cfg.defaults.bg : (PAL[1] || PAL[0] || '');\n        if (BOULE) bg = PAL.filter(isRaw)[0] || bg; // fond toujours en peuplier naturel\n        state.names = [{ t: '', t2: '', fg: fg, bg: bg }];\n        state.sameH = true; state.target = 'all';\n        syncOpt();\n        OT.onChange = function () { gboxCache = {}; baseCache = {}; refreshDims(); updateLight(); };\n        OT.ensureFont(state.font);\n        OT.ensureClipper();\n        setTimeout(demoStart, 400);\n      }\n    };\n    /* \u2500\u2500 Variante par pr\u00E9nom \u2500\u2500 */\n    function layersValue(fg, bg) {\n      var n = (isRaw(fg) ? 0 : 1) + (isRaw(bg) ? 0 : 1), m = (!isRaw(fg) && isMetal(fg) ? 1 : 0) + (!isRaw(bg) && isMetal(bg) ? 1 : 0);\n      var vals = roleValues('layers');\n      return vals.filter(function (v) {\n        var s = v.toLowerCase(), cnt = /^2|deux/.test(s) ? 2 : /^1|une |un /.test(s) ? 1 : 0;\n        if (cnt !== n) return false;\n        var mm = /m[\u00E9e]tallis[\u00E9e]es\\b/.test(s) && cnt === 2 ? 2 : (/m[\u00E9e]tal/.test(s) ? 1 : 0);\n        return mm === m;\n      })[0] || vals[0] || '';\n    }\n    function selFor(nm) {\n      var s = selWith('size', state.opt.size);\n      if (hasRole('color')) s.color = nm.fg;\n      if (hasRole('layers')) s.layers = layersValue(nm.fg, nm.bg);\n      return s;\n    }\n    function variantFor(nm) { return findVariant(selFor(nm)); }\n    function syncOpt() { var nm = state.names[0]; if (hasRole('color')) state.opt.color = nm.fg; if (hasRole('layers')) state.opt.layers = layersValue(nm.fg, nm.bg); }\n    function live() { return state.names.filter(function (nm, i) { return i === 0 || nm.t.trim(); }); }\n    function famNow() { return demoActive() && demo.font ? demo.font : state.font; }\n    function fontObj() { var f = famNow(); return { family: f, weight: fontWeightFor(f) }; }\n    /* \u2500\u2500 M\u00E9triques : bo\u00EEte des lettres \u00E0 100 px, cotes r\u00E9elles (contour compris) \u2500\u2500 */\n    /* Police r\u00E9ellement charg\u00E9e ? Comparaison des largeurs avec deux polices de secours : si la famille demand\u00E9e\n       n'est pas disponible, le navigateur mesure exactement comme la police de secours (Safari r\u00E9pond \u00AB pr\u00EAte \u00BB\n       \u00E0 tort avec document.fonts.check). */\n    function fontLoaded(f) {\n      var t = 'Pr\u00E9nom Wxyz 0123';\n      mctx.font = f.weight + ' 100px \"' + f.family + '\", monospace'; var a = mctx.measureText(t).width;\n      mctx.font = f.weight + ' 100px monospace'; var b = mctx.measureText(t).width;\n      mctx.font = f.weight + ' 100px \"' + f.family + '\", serif'; var c = mctx.measureText(t).width;\n      mctx.font = f.weight + ' 100px serif'; var d = mctx.measureText(t).width;\n      return !(a === b && c === d);\n    }\n    function otFont() { return OT.font(famNow()); }\n    var gboxCache = {};\n    function gbox(txt, track) {\n      var font = otFont(); track = track || 0;\n      if (font) {\n        var okey = txt + '|' + famNow() + '|ot|' + track; if (gboxCache[okey]) return gboxCache[okey];\n        var b = font.getPath(txt, 0, 0, 100, { kerning: true, letterSpacing: track }).getBoundingBox();\n        var og = { adv: Math.max(font.getAdvanceWidth(txt, 100, { kerning: true, letterSpacing: track }), 1), left: -b.x1, right: b.x2, w: Math.max(b.x2 - b.x1, 1), asc: -b.y1, desc: b.y2, ot: true };\n        gboxCache[okey] = og; return og;\n      }\n      // bo\u00EEte d'encre \u00E0 100 px mesur\u00E9e sur les pixels (fiable dans tous les navigateurs) : left/right = d\u00E9bords autour\n      // de l'origine, w = largeur d'encre, asc/desc autour de la ligne de base, adv = chasse\n      var f = fontObj(), loaded = fontLoaded(f), key = txt + '|' + f.family + '|' + (loaded ? 1 : 0);\n      if (gboxCache[key]) return gboxCache[key];\n      mctx.font = f.weight + ' 100px \"' + f.family + '\", cursive';\n      var adv = Math.max(mctx.measureText(txt).width, 1), g = null;\n      try {\n        var ox = 120, oy = 175, W = Math.ceil(adv + 260), H = 270, c = document.createElement('canvas'); c.width = W; c.height = H;\n        var ctx = c.getContext('2d'); ctx.font = mctx.font; ctx.textBaseline = 'alphabetic'; ctx.fillStyle = '#000';\n        ctx.fillText(txt, ox, oy);\n        var d = ctx.getImageData(0, 0, W, H).data, minX = W, maxX = -1, minY = H, maxY = -1, x, y;\n        for (y = 0; y < H; y++) for (x = 0; x < W; x++) if (d[(y * W + x) * 4 + 3] > 127) { if (x < minX) minX = x; if (x > maxX) maxX = x; if (y < minY) minY = y; if (y > maxY) maxY = y; }\n        if (maxX >= 0) g = { adv: adv, left: ox - minX, right: maxX + 1 - ox, w: maxX + 1 - minX, asc: oy - minY, desc: maxY + 1 - oy };\n      } catch (e) { g = null; }\n      if (!g) g = { adv: adv, left: 0, right: adv, w: adv, asc: 72, desc: 22 };\n      if (loaded) gboxCache[key] = g;\n      return g;\n    }\n    function widthCm() { var m = optionMeta(state.opt.size); if (m.w) return m.w; return parseCm(state.opt.size) || 20; }\n    function offCm(W) { var mm = Math.max(OFF, (W || widthCm()) * PCT); if (!WOOD) mm = Math.min(mm, 5); return mm / 10; } // adh\u00E9sif : 5 mm max // contour : minimum du r\u00E9glage, puis proportionnel \u00E0 la largeur\n    function layout(wTot) {\n      // k = cm par unit\u00E9 de police \u00E0 100 px, par pr\u00E9nom (m\u00EAme hauteur : le plus long fixe l'\u00E9chelle) ; cotes contour compris\n      var W = wTot || widthCm(), off = offCm(W), inner = Math.max(W - 2 * off, 1);\n      var dm = demoActive();\n      var ns = live().map(function (nm) { var real = !!nm.t.trim(), t = real ? nm.t.trim() : (dm ? demoText() : 'Pr\u00E9nom'); var g = gbox(t); return { nm: nm, t: t, t2: real ? String(nm.t2 || '').trim() : '', g: g, real: real, off: off, fg: real || !dm ? nm.fg : demo.fg, bg: real || !dm ? nm.bg : demo.bg }; });\n      if (BOULE) {\n        // chaque boule a sa propre \u00E9chelle. Bande : le pr\u00E9nom tient dans le bandeau entre les anneaux (marges comprises), sous la\n        // hauteur maximale, en laissant la place de la ligne grav\u00E9e. Flottant : largeur impos\u00E9e pour traverser l'anneau des deux\n        // c\u00F4t\u00E9s ; si la hauteur d\u00E9passe la moiti\u00E9 du disque, elle est plafonn\u00E9e et le pr\u00E9nom est pos\u00E9 sur une tige.\n        var base = baseTrack();\n        ns.forEach(function (n) {\n          var tk = trackCache[n.t + '|' + famNow()]; n.track = tk != null ? tk : base; if (n.track) n.g = gbox(n.t, n.track);\n          bouleFit(n); n.wcm = B_D / 10; n.hcm = (B_D + B_CAP) / 10; n.off = B_BOLD / 10;\n        });\n        return ns;\n      }\n      var bwMax = ns.reduce(function (a, n) { return Math.max(a, n.g.w); }, 1);\n      ns.forEach(function (n) { n.k = state.sameH ? inner / bwMax : inner / n.g.w; n.wcm = n.g.w * n.k + 2 * off; n.hcm = (n.g.asc + n.g.desc) * n.k + 2 * off; });\n      return ns;\n    }\n    var trackCache = {}; // interlettrage retenu par pr\u00E9nom et police quand le r\u00E9glage de base laissait des barreaux trop fins\n    function baseTrack() { return !B_FLOAT && B_TRACK > 0 && !scriptFont() ? B_TRACK : 0; }\n    function bouleFit(n) {\n      // \u00E9chelle k (cm par unit\u00E9 de police \u00E0 100 px) d'une boule \u00E0 partir de sa bo\u00EEte de lettres n.g\n      var ri = B_D / 2 - B_RING, H = n.g.asc + n.g.desc, k;\n      if (B_FLOAT) {\n        var span = (2 * ri + 2 * B_RING * 0.6) / 10, maxF = B_D * 0.5 / 10; k = span / n.g.w; n.rod = false;\n        if (H * k > maxF) { k = maxF / H; n.rod = true; }\n      } else {\n        var availCm = Math.max(2 * ri - 2 * B_MARGIN, 10) / 10, maxHcm = Math.max(Math.min(B_MAXH, B_BAND - 2 * B_PAD - (B_L2 && n.t2 ? B_L2H : 0)), 6) / 10;\n        k = Math.min(availCm / n.g.w, maxHcm / H); n.rod = false;\n      }\n      n.k = k; return n;\n    }\n    function dimsOf(n) { if (BOULE) return '\u00D8 ' + fmtCm(B_D / 10) + ' cm'; return fmtCm(n.wcm) + ' \u00D7 ' + fmtCm(n.hcm) + ' cm'; }\n    function dimsText() { return layout().filter(function (n) { return n.real; }).map(function (n, i, arr) { return (arr.length > 1 ? n.t + ' : ' : '') + dimsOf(n); }); }\n    function refreshDims() {\n      var host = $('#leniDuoDims'); if (host) host.textContent = dimsText().length ? 'Dimensions finales ' + dimsText().join(' \u00B7 ') : '';\n      if (hasRole('size')) RENDER.size();\n    }\n    /* \u2500\u2500 D\u00E9mo avant saisie : des pr\u00E9noms s'\u00E9crivent \u00E0 la vol\u00E9e, police et duo de couleurs tournent \u2500\u2500 */\n    var DEMO_NAMES = ['L\u00E9a', 'Th\u00E9o', 'Louis', 'Manon', 'Gabin', '\u00C9lo\u00EFse', 'Arthur', 'Ambre', 'No\u00E9', 'Jade', 'Paul', 'Lina', 'Augustin', 'Chlo\u00E9', 'Na\u00EBl', 'Margaux'];\n    var demo = { on: false, n: 0, i: 0, typed: 0, alpha: 1, phase: 'typing', font: '', fg: '', bg: '', timer: null };\n    var reduceMotion = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);\n    function demoPairs() {\n      var fgs = fgValues(), bgs = bgValues();\n      if (BOULE) { var raw = bgs.filter(isRaw)[0] || bgs[0] || ''; return fgs.length ? fgs.map(function (c) { return [c, raw]; }) : [['', raw]]; }\n      var want = WOOD ? [['Bleu', 'Blanc'], ['Rose', 'Bois brut'], ['Vert', 'Blanc'], ['Or m\u00E9tallis\u00E9', 'Bois brut'], ['Noir', 'Blanc'], ['Orange', 'Bois brut'], ['Bois brut', 'Blanc']]\n                      : [['Noir', 'Or'], ['Blanc', 'Bleu roi'], ['Rose fonc\u00E9', 'Blanc'], ['Bleu clair', 'Blanc'], ['Vert for\u00EAt', 'Beige'], ['Violet', 'Rose clair'], ['Holographique', 'Rose fonc\u00E9']];\n      var out = want.filter(function (p) { return fgs.indexOf(p[0]) >= 0 && bgs.indexOf(p[1]) >= 0; });\n      return out.length ? out : [[fgs[0] || '', bgs[0] || '']];\n    }\n    function demoFonts() { return (cfg.fonts || []).slice(0, 6); }\n    function demoSet(n) { var fonts = demoFonts(), pairs = demoPairs(); demo.i = n % DEMO_NAMES.length; demo.font = fonts.length ? fonts[n % fonts.length] : state.font; var p = pairs[n % pairs.length]; demo.fg = p[0]; demo.bg = p[1]; OT.ensureFont(demo.font); }\n    function demoActive() { return demo.on && !state.names[0].t.trim(); }\n    function demoText() { return DEMO_NAMES[demo.i].slice(0, Math.max(1, demo.typed)); }\n    function demoStop() { demo.on = false; if (demo.timer) clearTimeout(demo.timer); demo.timer = null; }\n    function demoStep() {\n      if (!demoActive()) { demoStop(); renderPreview(); return; }\n      var name = DEMO_NAMES[demo.i], delay;\n      if (demo.phase === 'typing') { demo.typed++; if (demo.typed >= name.length) { demo.phase = 'hold'; delay = 2600; } else delay = 150; }\n      else if (demo.phase === 'hold') { demo.phase = 'fade'; demo.alpha = 0.7; delay = 80; }\n      else { demo.alpha -= 0.25; if (demo.alpha <= 0.05) { demo.n++; demoSet(demo.n); demo.typed = 0; demo.alpha = 1; demo.phase = 'typing'; delay = 320; } else delay = 80; }\n      renderPreview();\n      demo.timer = setTimeout(demoStep, delay);\n    }\n    function demoStart() {\n      if (reduceMotion || demo.on || state.names[0].t.trim() || editKey) return;\n      demo.on = true; demo.n = Math.floor(Math.random() * 97); demoSet(demo.n); demo.typed = 0; demo.alpha = 1; demo.phase = 'typing';\n      demoFonts().forEach(OT.ensureFont);\n      loadFonts(demoFonts().map(function (f) { return { family: f, weight: fontWeightFor(f) }; }));\n      demo.timer = setTimeout(demoStep, 900);\n    }\n\n    /* \u2500\u2500 \u00C9tape pr\u00E9noms \u2500\u2500 */\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Le pr\u00E9nom est reproduit exactement tel que vous l\u2019\u00E9crivez : v\u00E9rifiez les majuscules et les accents.' }));\n      state.names.forEach(function (nm, i) {\n        var e1 = i === 0 && errors.text && (submitAttempted || touchedKeys.text) ? errors.text : (nm.t.length > MAX ? MSG.tooLong : '');\n        var row = el('div', { class: 'leni-duo__row' + (i ? ' leni-duo__row--extra' : '') });\n        row.appendChild(textField({ key: 'name' + i, label: state.names.length > 1 ? 'Pr\u00E9nom ' + (i + 1) : 'Pr\u00E9nom ou mot', placeholder: i ? 'Ex. Th\u00E9o' : 'Ex. L\u00E9a', max: MAX, value: nm.t, err: e1, required: i === 0,\n          onInput: function (v) { nm.t = v; touch('text'); if (i === 0 && v.trim()) demoStop(); debounced('name' + i, function () { markInteracted(); mod.validate(); markComplete(); patchField('name' + i, i === 0 ? errors.text : '', MAX + ' caract\u00E8res max.'); refreshDims(); updateLight(); if (state.names.length > 1) mod.render.color(); }); },\n          onBlur: function () { mod.validate(); patchField('name' + i, i === 0 && (submitAttempted || touchedKeys.text) ? errors.text : '', MAX + ' caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); } }));\n        if (i) row.appendChild(el('button', { type: 'button', class: 'leni-duo__remove', 'aria-label': 'Retirer ce pr\u00E9nom', text: '\u2715', onclick: function () { state.names.splice(i, 1); if (state.target !== 'all' && +state.target >= state.names.length) state.target = 'all'; markInteracted(); update(); } }));\n        body.appendChild(row);\n        if (BOULE && B_L2) {\n          // ligne 2 grav\u00E9e dans le bandeau, sous le pr\u00E9nom : ann\u00E9e, \u00AB 1er No\u00EBl \u00BB\u2026 (jamais obligatoire)\n          body.appendChild(textField({ key: 'line2' + i, label: B_L2LABEL, placeholder: 'Ex. 2026 ou 1er No\u00EBl', max: B_L2MAX, value: nm.t2 || '', err: '', required: false,\n            onInput: function (v) { nm.t2 = v; debounced('line2' + i, function () { markInteracted(); patchField('line2' + i, '', 'Grav\u00E9 dans le bandeau, sous le pr\u00E9nom. ' + B_L2MAX + ' caract\u00E8res max.'); refreshDims(); updateLight(); }); },\n            onBlur: function () { renderHeaders(); renderPreview(); } }));\n        }\n      });\n      if (state.names.length < MAXN) body.appendChild(el('button', { type: 'button', class: 'leni-cfg__link leni-duo__add', text: BOULE ? '+ Ajouter une boule (un autre pr\u00E9nom)' : '+ Ajouter un pr\u00E9nom', onclick: function () { var f = state.names[0]; state.names.push({ t: '', t2: '', fg: f.fg, bg: f.bg }); markInteracted(); update(); var inp = $('#leniField-name' + (state.names.length - 1)); if (inp) inp.focus(); } }));\n      if (state.names.length > 1 && BOULE) body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Une boule par pr\u00E9nom, chacune avec sa couleur de bois. Une ligne de panier par boule.' }));\n      if (state.names.length > 1 && !BOULE) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:12px', text: 'Hauteur des lettres' }));\n        chips(body, ['M\u00EAme hauteur pour tous', 'Chacun \u00E0 la largeur choisie'], state.sameH ? 'M\u00EAme hauteur pour tous' : 'Chacun \u00E0 la largeur choisie', function (val) { state.sameH = val === 'M\u00EAme hauteur pour tous'; markInteracted(); update(); }, 'Hauteur des lettres');\n        body.appendChild(el('p', { class: 'leni-cfg__hint', text: state.sameH ? 'Le pr\u00E9nom le plus long fait la largeur choisie, les autres ont la m\u00EAme hauteur de lettres. Une ligne de panier par pr\u00E9nom.' : 'Chaque pr\u00E9nom fait la largeur choisie, les hauteurs varient. Une ligne de panier par pr\u00E9nom.' }));\n      }\n      var d = dimsText(); body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniDuoDims', text: d.length ? 'Dimensions finales ' + d.join(' \u00B7 ') : '' }));\n    };\n    /* \u2500\u2500 Police (\u00E9tape partag\u00E9e) \u2500\u2500 */\n    mod.pickFont = function (fam) { state.font = fam; baseCache = {}; OT.ensureFont(fam); };\n    mod.fontCurrent = function () { return state.font; };\n    mod.fontSample = function () { return state.names[0].t.trim() || 'Pr\u00E9nom'; };\n    mod.fontValue = function () { return state.font; };\n    mod.fontHint = function () { return 'La police s\u2019applique \u00E0 tous les pr\u00E9noms.'; };\n    /* \u2500\u2500 Couleurs : lettres + contour/socle, par pr\u00E9nom \u2500\u2500 */\n    function targets() { return state.target === 'all' ? live() : [state.names[+state.target]].filter(Boolean); }\n    function pick(key, val) { targets().forEach(function (nm) { nm[key] = val; }); if (state.target === 'all' || +state.target === 0) syncOpt(); markInteracted(); update(); }\n    mod.render.color = function () {\n      var body = bodyOf('color'); if (!body) return;\n      body.innerHTML = '';\n      var ns = live();\n      if (ns.length > 1) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', text: 'Appliquer \u00E0' }));\n        var tg = [{ key: 'all', label: 'Tous les pr\u00E9noms' }].concat(ns.map(function (nm) { return { key: String(state.names.indexOf(nm)), label: nm.t.trim() }; }));\n        if (!tg.some(function (t) { return t.key === state.target; })) state.target = 'all';\n        var grp = el('div', { class: 'leni-chips', style: 'margin-bottom:12px', role: 'radiogroup', 'aria-label': 'Appliquer les couleurs \u00E0' });\n        tg.forEach(function (t) { grp.appendChild(el('button', { type: 'button', class: 'leni-chip' + (state.target === t.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.target === t.key ? 'true' : 'false', text: t.label, onclick: function () { state.target = t.key; mod.render.color(); } })); });\n        body.appendChild(grp);\n      }\n      var ref = state.target === 'all' ? state.names[0] : (state.names[+state.target] || state.names[0]);\n      var wrapFg = el('div', { class: 'leni-duo__group' + (WOOD ? ' leni-swatches-sq' : '') });\n      wrapFg.appendChild(el('p', { class: 'leni-cfg__fieldlabel', text: FG_LABEL }));\n      var fgList = fgValues().map(function (val) {\n        var extra = '';\n        if (hasRole('color')) { var base = findVariant(selWith('color', fgValues()[0])), v = findVariant(selWith('color', val)); if (v && base && v.price > base.price) extra = ' +' + formatMoney(v.price - base.price); }\n        else if (WOOD && isMetal(val)) extra = metalExtra();\n        return { name: val, extra: extra };\n      });\n      renderSwatches(wrapFg, fgList, ref.fg, function (val) { pick('fg', val); }, FG_LABEL);\n      body.appendChild(wrapFg);\n      if (BOULE) {\n        body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:12px', text: 'Peuplier 3 mm teint\u00E9 \u00E0 l\u2019atelier, d\u2019une seule pi\u00E8ce : anneau, capuchon et ' + (B_FLOAT ? 'pr\u00E9nom en plein, reli\u00E9 \u00E0 l\u2019anneau des deux c\u00F4t\u00E9s' : 'bandeau central dans lequel le pr\u00E9nom est d\u00E9coup\u00E9, le jour passe \u00E0 travers les lettres') + '. Accents et contre-formes restent reli\u00E9s par de petits ponts.' + (B_FOND ? ' Un fond plein en peuplier naturel est coll\u00E9 derri\u00E8re.' : '') }));\n        if (cfg.colorHint) body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:8px', text: cfg.colorHint }));\n        return;\n      }\n      var wrapBg = el('div', { class: 'leni-duo__group' + (WOOD ? ' leni-swatches-sq' : '') });\n      wrapBg.appendChild(el('p', { class: 'leni-cfg__fieldlabel', style: 'margin-top:14px', text: BG_LABEL + ' (' + fmtCm(offCm() * 10) + ' mm autour des lettres)' }));\n      renderSwatches(wrapBg, bgValues().map(function (val) { return { name: val, extra: WOOD && isMetal(val) ? (metalExtra()) : '' }; }), ref.bg, function (val) { pick('bg', val); }, BG_LABEL);\n      body.appendChild(wrapBg);\n      if (WOOD && hasRole('layers')) {\n        var lv = layersValue(ref.fg, ref.bg), v0 = findVariant(selFor({ fg: 'Bois brut', bg: 'Bois brut' })), v1 = findVariant(selFor(ref));\n        body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:12px', text: 'Peinture : ' + lv + (v0 && v1 && v1.price > v0.price ? ' (+ ' + formatMoney(v1.price - v0.price) + ')' : '') + '. Peuplier 3 mm, peinture \u00E0 l\u2019eau appliqu\u00E9e \u00E0 l\u2019atelier.' }));\n      }\n      if (cfg.colorHint) body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:12px', text: cfg.colorHint }));\n    };\n    mod.colorValue = function () {\n      var ns = live(), f = ns[0];\n      var same = ns.every(function (nm) { return nm.fg === f.fg && nm.bg === f.bg; });\n      if (!same) return BOULE ? 'Par boule' : 'Par pr\u00E9nom';\n      if (BOULE) return B_FOND ? f.fg + ' sur peuplier naturel' : f.fg;\n      return f.fg + ' \u00B7 ' + BG_LABEL.toLowerCase() + ' ' + f.bg;\n    };\n    /* \u2500\u2500 Option \u00E0 bascule (variante \u00AB Adh\u00E9sif au dos \u00BB) \u2500\u2500 */\n    function toggleOn() { var vals = roleValues('toggle'); return vals.filter(function (v) { return /avec|oui/i.test(v); })[0] || vals[1] || ''; }\n    function toggleOff() { var vals = roleValues('toggle'), on = toggleOn(); return vals.filter(function (v) { return v !== on; })[0] || vals[0] || ''; }\n    mod.renderOptions = function (host) {\n      if (!hasRole('toggle')) return;\n      var on = toggleOn(), off = toggleOff(), nm = state.names[0];\n      var vOn = findVariant(selWith('toggle', on)), vOff = findVariant(selWith('toggle', off)), delta = vOn && vOff ? vOn.price - vOff.price : 0;\n      host.appendChild(el('label', { class: 'leni-opt' }, [\n        el('input', { type: 'checkbox', checked: state.opt.toggle === on ? true : null, onchange: function () { state.opt.toggle = this.checked ? on : off; markInteracted(); renderRecap(); renderPriceAndCta(); renderPreview(); } }),\n        el('span', { class: 'leni-opt__text', html: esc(D.toggleLabel || roleLabel('toggle')) + (delta > 0 ? ' <strong>+ ' + esc(formatMoney(delta)) + '</strong>' : '') + (D.toggleSub ? '<small>' + esc(D.toggleSub) + '</small>' : '') })\n      ]));\n    };\n    /* \u2500\u2500 Validation, en-t\u00EAtes, r\u00E9cap \u2500\u2500 */\n    mod.validate = function () {\n      errors = {};\n      if (!state.names[0].t.trim()) errors.text = 'Indiquez le pr\u00E9nom.';\n      else if (state.names.some(function (nm) { return nm.t.length > MAX; })) errors.text = MSG.tooLong;\n      else if (BOULE) {\n        // contr\u00F4le de d\u00E9coupe : traits \u00E9vid\u00E9s ou barreaux de bois plus fins que B_MIN \u2192 illisible ou cassant au laser\n        var thin = live().filter(function (nm) { return nm.t.trim(); }).map(function (nm) { var n = layout().filter(function (x) { return x.nm === nm; })[0]; return n ? { t: n.t, pct: bouleThinPct(n) } : null; }).filter(function (x) { return x && x.pct > 2; });\n        if (thin.length) errors.text = '\u00AB ' + thin[0].t + ' \u00BB a des traits trop fins ou trop serr\u00E9s pour le bois avec cette police : choisissez une police plus \u00E9paisse (Fredoka, Alfa Slab, Bangers\u2026) ou un pr\u00E9nom plus court.';\n      }\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.text; };\n    mod.isComplete = mod.isValid;\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return 'text'; };\n    mod.incompleteLabel = function () { return !state.names[0].t.trim() ? 'Indiquez le pr\u00E9nom' : 'Raccourcissez le pr\u00E9nom'; };\n    mod.stepValue = function (key) { if (key === 'text') { var ns = live().filter(function (nm) { return nm.t.trim(); }); return ns.length ? ns.map(function (nm) { return nm.t.trim(); }).join(' \u00B7 ') : '\u00C0 saisir'; } return ''; };\n    mod.recapLines = function () {\n      var out = [];\n      if (BOULE) { layout().forEach(function (n) { if (n.real) out.push({ text: n.t + (n.t2 ? ' \u00B7 ' + n.t2 : '') + ' \u2014 ' + dimsOf(n) + ' \u00B7 ' + n.nm.fg, step: 'text' }); }); return out; }\n      layout().forEach(function (n) { if (n.real) out.push({ text: n.t + ' \u2014 ' + dimsOf(n) + (live().length > 1 && (n.nm.fg !== state.names[0].fg || n.nm.bg !== state.names[0].bg) ? ' \u00B7 ' + n.nm.fg + ' / ' + n.nm.bg : ''), step: 'text' }); });\n      if (hasRole('toggle') && state.opt.toggle === toggleOn()) out.push({ text: D.toggleLabel || roleLabel('toggle'), step: 'color' });\n      return out;\n    };\n    mod.stickySub = function () { var n = live().filter(function (nm) { return nm.t.trim(); }).length; if (BOULE) return '\u00D8 ' + fmtCm(B_D / 10) + ' cm' + (n > 1 ? ' \u00B7 ' + n + ' boules' : ''); return (state.opt.size || '') + (n > 1 ? ' \u00B7 ' + n + ' pr\u00E9noms' : ''); };\n    mod.sizeExtra = function (val) { var m = optionMeta(val), w = m.w || parseCm(val); if (!w || !state.names[0].t.trim()) return ''; var n = layout(w)[0]; return n ? 'hauteur ' + fmtCm(n.hcm) + ' cm' : ''; };\n    mod.totalPrice = function () { return live().reduce(function (s, nm) { var v = variantFor(nm); return s + (v ? v.price : 0); }, 0); };\n    mod.lightBg = function () {\n      if (WOOD) return true;\n      var f = demoActive() ? { fg: demo.fg, bg: demo.bg } : state.names[0];\n      return (isDark(hexFor(f.fg, '#F5F1EA')) && !isMetal(f.fg) && !isHolo(f.fg)) || (isDark(hexFor(f.bg, '#F5F1EA')) && !isMetal(f.bg));\n    };\n    /* \u2500\u2500 Socle bois d'une seule pi\u00E8ce : rendu du texte en trame, dilatation, trous combl\u00E9s, ponts, contour liss\u00E9 \u2500\u2500 */\n    var baseCache = {};\n    function fillHoles(bits, w, h) {\n      var seen = new Uint8Array(w * h), stack = [], p, x, y;\n      for (x = 0; x < w; x++) { stack.push(x, (h - 1) * w + x); }\n      for (y = 0; y < h; y++) { stack.push(y * w, y * w + w - 1); }\n      while (stack.length) {\n        p = stack.pop(); if (seen[p] || bits[p]) continue; seen[p] = 1;\n        x = p % w; y = (p / w) | 0;\n        if (x > 0) stack.push(p - 1); if (x < w - 1) stack.push(p + 1); if (y > 0) stack.push(p - w); if (y < h - 1) stack.push(p + w);\n      }\n      for (p = 0; p < w * h; p++) if (!bits[p] && !seen[p]) bits[p] = 1;\n    }\n    function components(bits, w, h) {\n      var lab = new Int32Array(w * h), comps = [], p, x, y, q, n = 0;\n      for (p = 0; p < w * h; p++) {\n        if (!bits[p] || lab[p]) continue;\n        n++; var stack = [p], pts = []; lab[p] = n;\n        while (stack.length) {\n          q = stack.pop(); pts.push(q); x = q % w; y = (q / w) | 0;\n          if (x > 0 && bits[q - 1] && !lab[q - 1]) { lab[q - 1] = n; stack.push(q - 1); }\n          if (x < w - 1 && bits[q + 1] && !lab[q + 1]) { lab[q + 1] = n; stack.push(q + 1); }\n          if (y > 0 && bits[q - w] && !lab[q - w]) { lab[q - w] = n; stack.push(q - w); }\n          if (y < h - 1 && bits[q + w] && !lab[q + w]) { lab[q + w] = n; stack.push(q + w); }\n        }\n        comps.push(pts);\n      }\n      return comps;\n    }\n    function capsule(bits, w, h, x0, y0, x1, y1, r) {\n      var minX = Math.max(0, Math.floor(Math.min(x0, x1) - r)), maxX = Math.min(w - 1, Math.ceil(Math.max(x0, x1) + r));\n      var minY = Math.max(0, Math.floor(Math.min(y0, y1) - r)), maxY = Math.min(h - 1, Math.ceil(Math.max(y0, y1) + r));\n      var dx = x1 - x0, dy = y1 - y0, L2 = dx * dx + dy * dy || 1, r2 = r * r;\n      for (var y = minY; y <= maxY; y++) for (var x = minX; x <= maxX; x++) {\n        var t = Math.max(0, Math.min(1, ((x - x0) * dx + (y - y0) * dy) / L2)), px = x0 + t * dx - x, py = y0 + t * dy - y;\n        if (px * px + py * py <= r2) bits[y * w + x] = 1;\n      }\n    }\n    function basePaths(txt, offPx, FS, withGlyphs, eps) {\n      // eps = tol\u00E9rance de simplification en px du canevas (les escaliers de trame plus petits disparaissent) ; lettres : 0,6 \u00D7 eps\n      FS = FS || 200; var k2 = FS / 100, epsB = eps || 1.6, epsG = epsB * 0.6;\n      // retourne { paths, M, left, asc } en unit\u00E9s du canevas (police \u00E0 200 px), ou null si trop grand.\n      // Contour = offset autour des lettres, contre-formes combl\u00E9es, creux entre lettres ferm\u00E9s (dilatation\n      // offset + 2\u00B7offset, trous combl\u00E9s, \u00E9rosion 2\u00B7offset), \u00EElots (accents, points) reli\u00E9s par un pont large.\n      var f = fontObj(), font = otFont(), loaded = font ? true : fontLoaded(f), key = txt + '|' + f.family + '|' + offPx.toFixed(1) + '|' + FS + (withGlyphs ? '|g' : '') + '|' + epsB.toFixed(2) + '|' + (font ? 'ot' : (loaded ? 1 : 0));\n      if (baseCache[key]) return baseCache[key];\n      var spec = f.weight + ' ' + FS + 'px \"' + f.family + '\"';\n      var g = gbox(txt), closeR = (WOOD ? 2 : 1) * offPx, R1 = offPx + closeR, M = Math.ceil(R1) + 12;\n      var w = Math.ceil(g.w * k2 + 2 * M), h = Math.ceil((g.asc + g.desc) * k2 + 2 * M);\n      if (w * h > 4.2e6) return null;\n      var c = document.createElement('canvas'); c.width = w; c.height = h;\n      var ctx = c.getContext('2d'); ctx.font = spec; ctx.textBaseline = 'alphabetic'; ctx.fillStyle = '#000';\n      if (font) ctx.fill(new Path2D(OT.pathData(font, txt, M + g.left * k2, M + g.asc * k2, FS, 2))); else ctx.fillText(txt, M + g.left * k2, M + g.asc * k2);\n      var data = ctx.getImageData(0, 0, w, h).data, n = w * h, text = new Uint8Array(n), bg = new Uint8Array(n), p;\n      for (p = 0; p < n; p++) { text[p] = data[p * 4 + 3] > 127 ? 1 : 0; bg[p] = text[p] ? 0 : 1; }\n      var d = edt2(bg, w, h), lim1 = (R1 + 0.5) * (R1 + 0.5), limOff = (offPx + 0.5) * (offPx + 0.5), D1 = new Uint8Array(n);\n      for (p = 0; p < n; p++) D1[p] = (text[p] || d[p] <= lim1) ? 1 : 0;\n      fillHoles(D1, w, h);\n      var dIn = edt2(D1, w, h), lim2 = (closeR + 0.5) * (closeR + 0.5), bits = new Uint8Array(n);\n      for (p = 0; p < n; p++) bits[p] = ((D1[p] && dIn[p] > lim2) || text[p] || d[p] <= limOff) ? 1 : 0;\n      fillHoles(bits, w, h);\n      // lissage l\u00E9ger : ouverture (\u00E9rosion puis dilatation) de rayon \u2248 offset / 3, gomme les dentelures des polices manuscrites\n      var sr = Math.max(1.5, offPx * 0.35), limS = (sr + 0.5) * (sr + 0.5), dS = edt2(bits, w, h), er = new Uint8Array(n), notEr = new Uint8Array(n);\n      for (p = 0; p < n; p++) { er[p] = (bits[p] && dS[p] > limS) ? 1 : 0; notEr[p] = er[p] ? 0 : 1; }\n      var dE = edt2(notEr, w, h);\n      for (p = 0; p < n; p++) bits[p] = (er[p] || dE[p] <= limS || text[p]) ? 1 : 0;\n      fillHoles(bits, w, h);\n      var comps = components(bits, w, h), rb = Math.max(2 * offPx, 6);\n      if (comps.length > 1) {\n        comps.sort(function (a, b) { return b.length - a.length; });\n        var main = new Uint8Array(n); comps[0].forEach(function (q) { main[q] = 1; });\n        var notMain = new Uint8Array(n); for (p = 0; p < n; p++) notMain[p] = main[p] ? 0 : 1;\n        var dm = edt2(notMain, w, h); // distance\u00B2 de chaque pixel hors socle principal au socle principal\n        comps.slice(1).forEach(function (cp) {\n          var best = cp[0], bd = 1 << 30; cp.forEach(function (q) { if (dm[q] < bd) { bd = dm[q]; best = q; } });\n          var q = best, guard = w + h, x, y;\n          while (dm[q] > 0 && guard-- > 0) {\n            x = q % w; y = (q / w) | 0; var nq = q, nv = dm[q];\n            [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [-1, 1], [1, -1], [-1, -1]].forEach(function (o) { var xx = x + o[0], yy = y + o[1]; if (xx >= 0 && yy >= 0 && xx < w && yy < h && dm[yy * w + xx] < nv) { nv = dm[yy * w + xx]; nq = yy * w + xx; } });\n            if (nq === q) break; q = nq;\n          }\n          // pont : capsule large, prolong\u00E9e de part et d'autre pour ancrer franchement dans les deux pi\u00E8ces\n          var ax = best % w, ay = (best / w) | 0, bx = q % w, by = (q / w) | 0, vx = bx - ax, vy = by - ay, L = Math.hypot(vx, vy) || 1, ex = vx / L * rb, ey = vy / L * rb;\n          capsule(bits, w, h, ax - ex, ay - ey, bx + ex, by + ey, rb);\n        });\n        fillHoles(bits, w, h);\n      }\n      var paths = traceBits(bits, w, h).filter(function (pts) { return polyArea(pts) >= 4; }).map(function (pts) { return simplify(pts, epsB); }).filter(function (pts) { return pts.length >= 6; });\n      var out = { paths: paths, M: M, left: g.left, asc: g.asc, FS: FS, epsB: epsB, epsG: epsG, ot: !!font };\n      if (withGlyphs && !font) out.glyphs = traceBits(text, w, h).filter(function (pts) { return polyArea(pts) >= 2; }).map(function (pts) { return simplify(pts, epsG); }).filter(function (pts) { return pts.length >= 6; });\n      if (loaded) baseCache[key] = out; // jamais de cache sur un rendu en police de secours\n      return out;\n    }\n    /* \u2500\u2500 Boule de sapin : une pi\u00E8ce (anneau + capuchon + bandeau en d\u00E9fonce, ou pr\u00E9nom flottant), ponts, contr\u00F4le des traits \u2500\u2500 */\n    var bouleCache = {}, PREV_MMPX = 0.14, PROD_MMPX = 0.05; // mm par pixel de trame : aper\u00E7u et contr\u00F4les / fichier de d\u00E9coupe\n    function bouleOuter(cx, cy, D, cap, hole) {\n      // contour ext\u00E9rieur = disque \u222A capuchon arrondi en un seul trac\u00E9 (pas de recouvrement, donc pas de faux trou sous\n      // l'accroche) + trou du ruban ; unit\u00E9s = mm, parcours horaire\n      var F = function (v) { return (Math.round(v * 100) / 100).toString(); }, r = D / 2, cw = Math.min(cap * 1.4, D * 0.22), top = cy - r - cap, rad = cw * 0.32;\n      var yj = cy - Math.sqrt(Math.max(r * r - cw * cw / 4, 0)); // jonction des flancs du capuchon avec le cercle\n      var outer = 'M' + F(cx - cw / 2) + ' ' + F(yj) + ' V' + F(top + rad) + ' Q' + F(cx - cw / 2) + ' ' + F(top) + ' ' + F(cx - cw / 2 + rad) + ' ' + F(top) +\n        ' H' + F(cx + cw / 2 - rad) + ' Q' + F(cx + cw / 2) + ' ' + F(top) + ' ' + F(cx + cw / 2) + ' ' + F(top + rad) + ' V' + F(yj) +\n        ' A' + F(r) + ' ' + F(r) + ' 0 1 1 ' + F(cx - cw / 2) + ' ' + F(yj) + ' Z';\n      var hy = top + cap * 0.5, hr = hole / 2;\n      var holeP = 'M' + F(cx - hr) + ' ' + F(hy) + ' A' + F(hr) + ' ' + F(hr) + ' 0 1 1 ' + F(cx + hr) + ' ' + F(hy) + ' A' + F(hr) + ' ' + F(hr) + ' 0 1 1 ' + F(cx - hr) + ' ' + F(hy) + ' Z';\n      return { outer: outer, hole: holeP, holeY: hy, capW: cw, top: top };\n    }\n    function bouleGeom(n, mmPx) {\n      // canevas en px (1 px = mmPx mm) couvrant la pi\u00E8ce avec 1 px de marge ; police trac\u00E9e \u00E0 FS px ; centre du disque (cx, cy)\n      var g = n.g, FS = n.k * 1000 / mmPx, P = function (mm) { return mm / mmPx; };\n      var w = Math.ceil(P(B_D)) + 2, h = Math.ceil(P(B_D + B_CAP)) + 2, cx = 1 + P(B_D / 2), cy = 1 + P(B_CAP + B_D / 2), ro = P(B_D / 2), ri = ro - P(B_RING);\n      var bandMid = cy + P(B_D * 0.02), bandTop = bandMid - P(B_BAND / 2), bandBot = bandMid + P(B_BAND / 2); // bandeau un soup\u00E7on sous le centre (le capuchon p\u00E8se en haut)\n      var midY = B_FLOAT ? cy : (bandTop + bandBot - (B_L2 && n.t2 ? P(B_L2H) : 0)) / 2; // centre vertical de la bo\u00EEte des lettres\n      var base = midY + (g.asc - g.desc) * FS / 200, tx = cx - (g.w * FS / 100) / 2 + g.left * FS / 100;\n      return { mmPx: mmPx, FS: FS, P: P, w: w, h: h, cx: cx, cy: cy, ro: ro, ri: ri, bandTop: bandTop, bandBot: bandBot, base: base, tx: tx };\n    }\n    function bouleBits(n, mmPx) {\n      // trame de la mati\u00E8re : anneau + bandeau \u00E9vid\u00E9 du pr\u00E9nom (bande) ou anneau + pr\u00E9nom en plein (flottant) ; \u00EElots pont\u00E9s,\n      // micro-vides combl\u00E9s, contr\u00F4le des traits (pr\u00E9noms saisis), puis contours des vides int\u00E9rieurs trac\u00E9s et liss\u00E9s\n      var f = fontObj(), font = otFont(), loaded = font ? true : fontLoaded(f);\n      var key = [n.t, B_L2 && n.t2 ? 1 : 0, f.family, mmPx, n.k.toFixed(5), n.track || 0, n.rod ? 1 : 0, n.real ? 1 : 0, font ? 'ot' : (loaded ? 1 : 0)].join('|');\n      if (bouleCache[key]) return bouleCache[key];\n      var G = bouleGeom(n, mmPx), w = G.w, h = G.h, N = w * h, P = G.P, p, x, y, q;\n      if (N > 4.5e6) return null;\n      // 1. lettres (contours exacts si la police vectorielle est l\u00E0), \u00E9paissies de B_BOLD\n      var c = document.createElement('canvas'); c.width = w; c.height = h;\n      var ctx = c.getContext('2d'); ctx.fillStyle = '#000'; ctx.font = f.weight + ' ' + G.FS + 'px \"' + f.family + '\"'; ctx.textBaseline = 'alphabetic';\n      if (font) ctx.fill(new Path2D(OT.pathData(font, n.t, G.tx, G.base, G.FS, 2, n.track))); else ctx.fillText(n.t, G.tx, G.base);\n      var data = ctx.getImageData(0, 0, w, h).data, L = new Uint8Array(N), bg = new Uint8Array(N);\n      for (p = 0; p < N; p++) { L[p] = data[p * 4 + 3] > 127 ? 1 : 0; bg[p] = L[p] ? 0 : 1; }\n      if (B_BOLD > 0) { var dd = edt2(bg, w, h), lim = (P(B_BOLD) + 0.5) * (P(B_BOLD) + 0.5); for (p = 0; p < N; p++) if (dd[p] <= lim) L[p] = 1; }\n      // 2. mati\u00E8re : anneau (ro \u2192 ri), puis bandeau coup\u00E9 au disque int\u00E9rieur moins les lettres, ou lettres en plein\n      var mat = new Uint8Array(N), inner = new Uint8Array(N), zone = new Uint8Array(N), ro2 = G.ro * G.ro, ri2 = G.ri * G.ri, roIn2 = (G.ro - P(1.5)) * (G.ro - P(1.5));\n      for (y = 0; y < h; y++) for (x = 0; x < w; x++) {\n        p = y * w + x; var dx = x + 0.5 - G.cx, dy = y + 0.5 - G.cy, d2 = dx * dx + dy * dy;\n        if (d2 > ro2) continue;\n        if (d2 > ri2) mat[p] = 1; else inner[p] = 1;\n        if (B_FLOAT) { if (L[p] && d2 <= roIn2) mat[p] = 1; zone[p] = inner[p]; }\n        else if (inner[p] && y >= G.bandTop && y <= G.bandBot) { mat[p] = L[p] ? 0 : 1; zone[p] = 1; }\n      }\n      if (B_FLOAT && n.rod) { var t2 = P(B_BRIDGE * 1.25) / 2; for (y = Math.max(0, Math.floor(G.base - t2)); y <= Math.min(h - 1, Math.ceil(G.base + t2)); y++) for (x = 0; x < w; x++) { p = y * w + x; if (inner[p]) mat[p] = 1; } }\n      // 3. une seule pi\u00E8ce : l'\u00EElot le plus proche de la pi\u00E8ce principale est reli\u00E9 par un pont (capsule de B_BRIDGE), et on\n      //    recommence, les lettres se cha\u00EEnant de proche en proche ; les \u00EElots plus petits que le pont sont abandonn\u00E9s\n      var rb = Math.max(P(B_BRIDGE) / 2, 1.5), minIsl = P(B_BRIDGE + 0.4) * P(B_BRIDGE + 0.4), guardIter = 40;\n      while (guardIter-- > 0) {\n        var comps = components(mat, w, h); if (comps.length < 2) break;\n        comps.sort(function (a, b) { return b.length - a.length; });\n        var main = new Uint8Array(N); comps[0].forEach(function (i) { main[i] = 1; });\n        var notMain = new Uint8Array(N); for (p = 0; p < N; p++) notMain[p] = main[p] ? 0 : 1;\n        var dm = edt2(notMain, w, h), cp = null, cd = 1 << 30;\n        comps.slice(1).forEach(function (cc) {\n          if (cc.length < minIsl) { cc.forEach(function (i) { mat[i] = 0; }); return; }\n          var m = 1 << 30; cc.forEach(function (i) { if (dm[i] < m) m = dm[i]; }); if (m < cd) { cd = m; cp = cc; }\n        });\n        if (!cp) break;\n        // pont droit (comme un pochoir) : depuis le pixel de l'\u00EElot le plus proche de son centre, rayon horizontal ou vertical\n        // le plus court \u00E0 travers le vide jusqu'\u00E0 la pi\u00E8ce principale ; \u00E0 d\u00E9faut (rayon bloqu\u00E9 par un autre \u00EElot), plus court chemin\n        var sx = 0, sy = 0; cp.forEach(function (i) { sx += i % w; sy += (i / w) | 0; }); sx /= cp.length; sy /= cp.length;\n        var c0 = cp[0], cq = 1 << 30; cp.forEach(function (i) { var ex0 = i % w - sx, ey0 = ((i / w) | 0) - sy, dq = ex0 * ex0 + ey0 * ey0; if (dq < cq) { cq = dq; c0 = i; } });\n        var own = new Uint8Array(N); cp.forEach(function (i) { own[i] = 1; });\n        var ray = null, rayLen = P(25), x0 = c0 % w, y0 = (c0 / w) | 0;\n        [[1, 0], [-1, 0], [0, 1], [0, -1]].forEach(function (o) {\n          var xx = x0, yy = y0, phase = 0, len = 0, i, s;\n          for (s = 0; s < w + h; s++) {\n            xx += o[0]; yy += o[1]; if (xx < 0 || yy < 0 || xx >= w || yy >= h) return;\n            i = yy * w + xx;\n            if (phase === 0) { if (own[i]) continue; phase = 1; }\n            if (main[i]) { if (len < rayLen) { rayLen = len; ray = { x1: xx, y1: yy, dx: o[0], dy: o[1] }; } return; }\n            if (mat[i]) return;\n            len++;\n          }\n        });\n        if (ray) { capsule(mat, w, h, x0, y0, ray.x1 + ray.dx * rb, ray.y1 + ray.dy * rb, rb); continue; }\n        var best = cp[0], bd = 1 << 30; cp.forEach(function (i) { if (dm[i] < bd) { bd = dm[i]; best = i; } });\n        q = best; var guard = w + h;\n        while (dm[q] > 0 && guard-- > 0) {\n          var qx = q % w, qy = (q / w) | 0, nq = q, nv = dm[q];\n          [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [-1, 1], [1, -1], [-1, -1]].forEach(function (o) { var xx = qx + o[0], yy = qy + o[1]; if (xx >= 0 && yy >= 0 && xx < w && yy < h && dm[yy * w + xx] < nv) { nv = dm[yy * w + xx]; nq = yy * w + xx; } });\n          if (nq === q) break; q = nq;\n        }\n        var ax = best % w, ay = (best / w) | 0, bx = q % w, by = (q / w) | 0, vx = bx - ax, vy = by - ay, Lv = Math.hypot(vx, vy) || 1, ex = vx / Lv * rb, ey = vy / Lv * rb;\n        capsule(mat, w, h, ax - ex, ay - ey, bx + ex, by + ey, rb);\n      }\n      // 4. micro-vides (contre-formes plus petites qu'1 mm, poches entre un pont et une lettre) combl\u00E9s\n      var voids = new Uint8Array(N); for (p = 0; p < N; p++) voids[p] = inner[p] && !mat[p] ? 1 : 0;\n      var minVoid = P(1) * P(1);\n      components(voids, w, h).forEach(function (cc) { if (cc.length < minVoid) cc.forEach(function (i) { mat[i] = 1; voids[i] = 0; }); });\n      // 5. contr\u00F4le (pr\u00E9noms saisis seulement) : surface en mm\u00B2 des morceaux qui disparaissent sous une ouverture de rayon\n      //    B_MIN/2 (seuls les morceaux d'au moins 1,5 mm\u00B2 comptent : un vrai trait fin, pas la pointe d'un angle vif), sur les\n      //    traits \u00E9vid\u00E9s, puis sur les barreaux de bois entre les lettres (\u00D7 0,8 : tenus en haut et en bas) ; en flottant sur la\n      //    mati\u00E8re des lettres (\u00D7 1,5 : elles portent)\n      function lossMm2(mask, rPx) {\n        var lim = (rPx + 0.5) * (rPx + 0.5), dIn = edt2(mask, w, h), er = new Uint8Array(N), notEr = new Uint8Array(N), i;\n        for (i = 0; i < N; i++) { er[i] = (mask[i] && dIn[i] > lim) ? 1 : 0; notEr[i] = er[i] ? 0 : 1; }\n        var dE = edt2(notEr, w, h), lost = new Uint8Array(N); for (i = 0; i < N; i++) lost[i] = (mask[i] && !er[i] && dE[i] > lim) ? 1 : 0;\n        var minPiece = P(1) * P(1.5), tot = 0;\n        components(lost, w, h).forEach(function (cp) {\n          if (cp.length < minPiece) return; tot += cp.length;\n          var x0 = w, y0 = h, x1 = 0, y1 = 0; cp.forEach(function (i) { var xx = i % w, yy = (i / w) | 0; if (xx < x0) x0 = xx; if (xx > x1) x1 = xx; if (yy < y0) y0 = yy; if (yy > y1) y1 = yy; });\n          thinDetail.push({ x: +((x0 - 1) * mmPx).toFixed(1), y: +((y0 - 1) * mmPx).toFixed(1), w: +((x1 - x0 + 1) * mmPx).toFixed(1), h: +((y1 - y0 + 1) * mmPx).toFixed(1), mm2: +(cp.length * mmPx * mmPx).toFixed(2), what: lossWhat });\n        });\n        return tot * mmPx * mmPx;\n      }\n      var thinPct = 0, thinDetail = [], lossWhat = ''; // thinPct en mm\u00B2 malgr\u00E9 le nom : surface de traits trop fins (0 = rien \u00E0 signaler)\n      if (n.real) {\n        var mz = new Uint8Array(N), vz = new Uint8Array(N); for (p = 0; p < N; p++) { mz[p] = zone[p] && mat[p] ? 1 : 0; vz[p] = zone[p] && !mat[p] ? 1 : 0; }\n        if (B_FLOAT) { lossWhat = 'lettre'; thinPct = lossMm2(mz, P(B_MIN * 1.5) / 2); }\n        else { lossWhat = 'trait \u00E9vid\u00E9'; thinPct = lossMm2(vz, P(B_MIN) / 2); lossWhat = 'barreau'; thinPct += lossMm2(mz, P(B_MIN * 0.8) / 2); }\n      }\n      // 6. contours des vides int\u00E9rieurs (le contour ext\u00E9rieur et le trou du ruban sont trac\u00E9s en vectoriel pur)\n      var out = { G: G, thinPct: thinPct, thinDetail: thinDetail, ot: !!font };\n      out.paths = traceBits(voids, w, h).filter(function (pts) { return polyArea(pts) >= 4; }).map(function (pts) { return simplify(pts, 1.2); }).filter(function (pts) { return pts.length >= 6; });\n      if (loaded) bouleCache[key] = out;\n      return out;\n    }\n    function bouleThinPct(n) {\n      // interlettrage adaptatif : si seuls des barreaux de bois trop fins sont en cause (police \u00E0 lettres s\u00E9par\u00E9es), on \u00E9carte\n      // les lettres par pas de 0,04 em, deux essais ; l'\u00E9cart retenu est m\u00E9moris\u00E9 pour l'aper\u00E7u et le fichier de d\u00E9coupe\n      var b = bouleBits(n, PREV_MMPX); if (!b) return 0;\n      if (b.thinPct > 2 && !B_FLOAT && b.ot && !scriptFont() && b.thinDetail.length && b.thinDetail.every(function (d) { return d.what === 'barreau'; })) {\n        for (var step = 1; step <= 2; step++) {\n          var m = {}; for (var kk in n) m[kk] = n[kk];\n          m.track = (n.track || 0) + 0.04 * step; m.g = gbox(n.t, m.track); bouleFit(m);\n          var b2 = bouleBits(m, PREV_MMPX);\n          if (b2 && b2.thinPct <= 2) { trackCache[n.t + '|' + famNow()] = m.track; return b2.thinPct; }\n        }\n      }\n      return b.thinPct;\n    }\n    function bouleGravure(n, G, font, dec) {\n      // ligne 2 grav\u00E9e : centr\u00E9e, ligne de base 1,7 mm au-dessus du bas du bandeau, dans la police du pr\u00E9nom (mm, rep\u00E8re de la pi\u00E8ce)\n      var gw = font.getAdvanceWidth(n.t2, B_L2SZ, { kerning: true });\n      return OT.pathData(font, n.t2, B_D / 2 - gw / 2, (G.bandBot - 1) * G.mmPx - 1.7, B_L2SZ, dec);\n    }\n    function boulePreview() {\n      var ns = layout(), W = 1000, pad = 50, cols = Math.min(ns.length, 3), rows = Math.ceil(ns.length / cols), cell = (W - 2 * pad) / cols, mm = (cell * 0.86) / (B_D + B_CAP);\n      var rowH = (B_D + B_CAP) * mm * 1.18, H = pad * 2 + rows * rowH + 40, f = fontObj(), font = otFont();\n      var lc = '#1A1A1A', lbg = '#F7F5F1', O = bouleOuter(B_D / 2, B_CAP + B_D / 2, B_D, B_CAP, B_HOLE);\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre boule de sapin\">', defs()];\n      ns.forEach(function (n, i) {\n        var col = i % cols, row = Math.floor(i / cols), ox = pad + col * cell + (cell - B_D * mm) / 2, oy = pad + 34 + row * rowH;\n        var cx = ox + B_D / 2 * mm, hy = oy + O.holeY * mm, alpha = n.real ? '1' : (demoActive() ? demo.alpha.toFixed(2) : '0.55');\n        var hex = hexFor(n.fg, '#1F4D3A'), dark = isDark(hex) && !isMetal(n.fg), fill = fillOf(n.fg, true);\n        out.push('<g opacity=\"' + alpha + '\">');\n        // ficelle de jute : passe dans le trou (visible \u00E0 travers) et remonte hors de la case\n        out.push('<path d=\"M' + cx.toFixed(1) + ' ' + (hy + 2).toFixed(1) + ' C' + (cx + 5).toFixed(1) + ' ' + (hy - 30).toFixed(1) + ' ' + (cx - 4).toFixed(1) + ' ' + (hy - 60).toFixed(1) + ' ' + (cx + 1).toFixed(1) + ' ' + (oy - 44).toFixed(1) + '\" fill=\"none\" stroke=\"#C4B392\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>');\n        var b = bouleBits(n, PREV_MMPX), g0 = '<g transform=\"translate(' + ox.toFixed(2) + ' ' + oy.toFixed(2) + ') scale(' + mm.toFixed(4) + ')\">';\n        var voidsD = b ? b.paths.map(function (pts) { return curvePath(pts, 1.2, b.G.mmPx, b.G.mmPx, -b.G.mmPx, -b.G.mmPx, 2); }).join(' ') : '';\n        if (B_FOND) out.push(g0 + '<path d=\"' + O.outer + ' ' + O.hole + '\" fill-rule=\"evenodd\" fill=\"url(#leniWoodRaw)\" filter=\"url(#leniShadowSoft)\"/></g>');\n        out.push(g0 + '<path d=\"' + O.outer + ' ' + O.hole + ' ' + voidsD + '\" fill-rule=\"evenodd\" fill=\"' + fill + '\" stroke=\"' + (dark ? '#000' : '#4A3419') + '\" stroke-opacity=\"0.28\" stroke-width=\"0.35\" stroke-linejoin=\"round\" filter=\"url(#leniShadowSoft)\"/>');\n        if (B_L2 && n.t2 && b) {\n          var gfill = dark ? '#FFFFFF' : '#000000';\n          if (font) out.push('<path d=\"' + bouleGravure(n, b.G, font, 2) + '\" fill=\"' + gfill + '\" fill-opacity=\"0.5\"/>');\n          else out.push('<text x=\"' + (B_D / 2) + '\" y=\"' + ((b.G.bandBot - 1) * b.G.mmPx - 1.7).toFixed(2) + '\" text-anchor=\"middle\" font-family=\"\\'' + esc(f.family) + '\\', cursive\" font-weight=\"' + f.weight + '\" font-size=\"' + B_L2SZ + '\" fill=\"' + gfill + '\" fill-opacity=\"0.5\">' + esc(n.t2) + '</text>');\n        }\n        out.push('</g></g>');\n        if (n.real && ns.length > 1) out.push(pill(cx, oy + (B_D + B_CAP) * mm + 16, n.t, lc, lbg, 18));\n      });\n      if (ns.length === 1 && ns[0].real) out.push(pill(W / 2, H - 22, '\u00D8 ' + fmtCm(B_D / 10) + ' cm \u00B7 peuplier 3 mm' + (B_FOND ? ', deux couches' : ', une pi\u00E8ce'), lc, lbg, 18));\n      else if (!ns[0].real) out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 16) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.7\">Exemple \u2014 saisissez le pr\u00E9nom</text>');\n      out.push('</svg>');\n      return out.join('');\n    }\n    function bouleSvg(n) {\n      // SVG de production en mm : \u00AB piece \u00BB (contour ext\u00E9rieur, trou du ruban, vides int\u00E9rieurs, pair/impair), \u00AB gravure \u00BB\n      // (ligne 2, rouge), \u00AB fond \u00BB (deuxi\u00E8me couche pleine si l'option est active)\n      var b = bouleBits(n, PROD_MMPX); if (!b) return '';\n      var G = b.G, mmPx = G.mmPx, o = -mmPx, F = function (v) { return (Math.round(v * 100) / 100).toString() }, O = bouleOuter(B_D / 2, B_CAP + B_D / 2, B_D, B_CAP, B_HOLE);\n      var voids = b.paths.map(function (pts) { return curvePath(pts, 1.2, mmPx, mmPx, o, o, 3); }).join(' ');\n      var font = otFont(), grav = B_L2 && n.t2 && font ? '<path id=\"gravure\" fill=\"#FF0000\" d=\"' + bouleGravure(n, G, font, 3) + '\"/>' : '';\n      return '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + F(B_D) + ' ' + F(B_D + B_CAP) + '\" width=\"' + F(B_D) + 'mm\" height=\"' + F(B_D + B_CAP) + 'mm\">' +\n        '<title>Boule de sapin ' + esc(n.t) + (B_L2 && n.t2 ? ' \u00B7 ' + esc(n.t2) : '') + ' \u00B7 ' + esc(state.font) + ' \u00B7 ' + (B_FLOAT ? 'flottant' : 'bandeau') + ' \u00B7 ' + esc(n.nm.fg) + '</title>' +\n        (B_FOND ? '<path id=\"fond\" fill=\"#E6D5B3\" fill-rule=\"evenodd\" d=\"' + O.outer + ' ' + O.hole + '\"/>' : '') +\n        '<path id=\"piece\" fill=\"' + svgHex(n.nm.fg) + '\" fill-rule=\"evenodd\" d=\"' + O.outer + ' ' + O.hole + ' ' + voids + '\"/>' + grav + '</svg>';\n    }\n    /* \u2500\u2500 Aper\u00E7u \u2500\u2500 */\n    function pill(x, y, t, ink, bg, fs) {\n      var wpx = t.length * fs * 0.6 + 22;\n      return '<g><rect x=\"' + (x - wpx / 2).toFixed(1) + '\" y=\"' + (y - fs * 0.75).toFixed(1) + '\" width=\"' + wpx.toFixed(1) + '\" height=\"' + (fs * 1.5).toFixed(1) + '\" rx=\"' + (fs * 0.75).toFixed(1) + '\" fill=\"' + bg + '\"/><text x=\"' + x.toFixed(1) + '\" y=\"' + (y + fs * 0.36).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"' + fs + '\" font-weight=\"600\" fill=\"' + ink + '\">' + esc(t) + '</text></g>';\n    }\n    function fillOf(v, wood) { if (wood && isRaw(v)) return 'url(#leniWoodRaw)'; return svgFill(v); }\n    mod.preview = function () {\n      if (BOULE) return boulePreview();\n      var f = fontObj(), ns = layout(), W = 1000, pad = 60, right = ns.length === 1 && ns[0].real ? 90 : 0, avail = W - 2 * pad - right;\n      var Wcm = widthCm(), pxPerCm = avail / Wcm, off = ns.length ? ns[0].off : offCm(Wcm), offPx = off * pxPerCm, gap = 30, y = pad, rows = [];\n      ns.forEach(function (n) {\n        var S = 100 * n.k * pxPerCm, ink = n.g.w * S / 100, rowH = (n.g.asc + n.g.desc) * S / 100 + 2 * offPx;\n        rows.push({ n: n, S: S, top: y, base: y + offPx + n.g.asc * S / 100, h: rowH, w: ink + 2 * offPx, ink: ink });\n        y += rowH + gap;\n      });\n      var H = y - gap + pad + (ns.length > 1 ? 34 : 60), cx = pad + avail / 2;\n      var lc = mod.lightBg() ? '#1A1A1A' : '#F5F1EA', lbg = mod.lightBg() ? '#F7F5F1' : '#1A1A1A';\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre pr\u00E9nom\">', defs()];\n      rows.forEach(function (r) {\n        var nm = r.n.nm, x0 = cx - r.ink / 2, tx = x0 + r.n.g.left * r.S / 100, PFS = 400, sx = r.S / PFS;\n        var bp = basePaths(r.n.t, offPx / sx, PFS, true, 1.4);\n        var ox = x0 - (bp ? bp.M : 0) * sx, oy = r.base - (bp ? (bp.M + bp.asc * PFS / 100) : 0) * sx;\n        var baseFill = fillOf(r.n.bg, WOOD), textFill = fillOf(r.n.fg, WOOD), shadow = WOOD ? ' filter=\"url(#leniShadowSoft)\"' : '';\n        var textAttrs = ' x=\"' + tx.toFixed(1) + '\" y=\"' + r.base.toFixed(1) + '\" font-family=\"\\'' + esc(f.family) + '\\', cursive\" font-weight=\"' + f.weight + '\" font-size=\"' + r.S.toFixed(1) + '\"';\n        out.push('<g' + (r.n.real ? '' : ' opacity=\"' + (demoActive() ? demo.alpha.toFixed(2) : '0.55') + '\"') + '>');\n        if (bp && bp.paths.length) {\n          var d = bp.paths.map(function (pts) { return curvePath(pts, bp.epsB, sx, sx, ox, oy, 1); }).join(' ');\n          out.push('<path d=\"' + d + '\" fill-rule=\"nonzero\" fill=\"' + baseFill + '\"' + shadow + '/>'); // socle sans trou : contours tous ext\u00E9rieurs\n        } else {\n          out.push('<text' + textAttrs + ' fill=\"' + baseFill + '\" stroke=\"' + baseFill + '\" stroke-width=\"' + (2 * offPx).toFixed(1) + '\" stroke-linejoin=\"round\" stroke-linecap=\"round\" paint-order=\"stroke\"' + shadow + '>' + esc(r.n.t) + '</text>');\n        }\n        var font = otFont();\n        if (font) out.push('<path d=\"' + OT.pathData(font, r.n.t, tx, r.base, r.S, 2) + '\" fill=\"' + textFill + '\"' + shadow + '/>');\n        else if (bp && bp.glyphs && bp.glyphs.length) out.push('<path d=\"' + bp.glyphs.map(function (pts) { return curvePath(pts, bp.epsG, sx, sx, ox, oy, 1); }).join(' ') + '\" fill-rule=\"evenodd\" fill=\"' + textFill + '\"' + shadow + '/>');\n        else out.push('<text' + textAttrs + ' fill=\"' + textFill + '\"' + shadow + '>' + esc(r.n.t) + '</text>');\n        out.push('</g>');\n        if (r.n.real && rows.length > 1) out.push(pill(cx, r.top + r.h + 18, dimsOf(r.n), lc, lbg, 20));\n      });\n      if (rows.length === 1 && rows[0].n.real) {\n        var r0 = rows[0];\n        out.push(dimLines({ x: cx - r0.w / 2, y: r0.top, w: r0.w, h: r0.h, wcm: r0.n.wcm, hcm: r0.n.hcm, ink: lc, bg: lbg, plan: false, fs: 22 }));\n      } else if (!rows[0].n.real) {\n        out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 16) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.7\">Exemple \u2014 saisissez votre pr\u00E9nom</text>');\n      }\n      out.push('</svg>');\n      return out.join('');\n    };\n    /* \u2500\u2500 SVG de production : deux trac\u00E9s (socle/contour puis lettres), viewBox en mm, m\u00EAme g\u00E9om\u00E9trie que l'aper\u00E7u \u2500\u2500 */\n    function svgHex(v) { if (isHolo(v)) return '#B5B5B5'; return hexFor(v, '#1A1A1A'); }\n    function productionSvg(n) {\n      if (BOULE) return bouleSvg(n);\n      var FS = 1200, est = function (fs) { var op = n.off * fs / (100 * n.k), m = Math.ceil((WOOD ? 3 : 2) * op) + 12; return (n.g.w * fs / 100 + 2 * m) * ((n.g.asc + n.g.desc) * fs / 100 + 2 * m); };\n      if (est(FS) > 3.5e6) FS = Math.max(400, Math.floor(FS * Math.sqrt(3.5e6 / est(FS))));\n      var offPx = n.off * FS / (100 * n.k); // offset en px du canevas\n      var bp = basePaths(n.t, offPx, FS, true, 2.5);\n      if (!bp) return '';\n      var mmPx = n.k * 100 / FS * 10, offMm = n.off * 10, o = offMm - bp.M * mmPx;\n      var Wmm = n.wcm * 10, Hmm = n.hcm * 10, F = function (v) { return (Math.round(v * 100) / 100).toString(); };\n      var base = bp.paths.map(function (pts) { return curvePath(pts, bp.epsB, mmPx, mmPx, o, o, 3); }).join(' ');\n      var font = otFont(), rule = 'evenodd', letters = null;\n      if (font) { letters = OT.united(font, n.t, offMm + n.g.left * n.k * 10, offMm + n.g.asc * n.k * 10, 1000 * n.k); if (!letters) { letters = OT.pathData(font, n.t, offMm + n.g.left * n.k * 10, offMm + n.g.asc * n.k * 10, 1000 * n.k, 3); rule = 'nonzero'; } }\n      else letters = (bp.glyphs || []).map(function (pts) { return curvePath(pts, bp.epsG, mmPx, mmPx, o, o, 3); }).join(' ');\n      return '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + F(Wmm) + ' ' + F(Hmm) + '\" width=\"' + F(Wmm) + 'mm\" height=\"' + F(Hmm) + 'mm\">' +\n        '<path id=\"' + (WOOD ? 'socle' : 'contour') + '\" fill=\"' + svgHex(n.nm.bg) + '\" fill-rule=\"nonzero\" d=\"' + base + '\"/>' +\n        '<path id=\"lettres\" fill=\"' + svgHex(n.nm.fg) + '\" fill-rule=\"' + rule + '\" d=\"' + letters + '\"/></svg>';\n    }\n    function slug(t) { return String(t).normalize('NFD').replace(/[\u0300-\u036F]/g, '').replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '').toLowerCase() || 'prenom'; }\n    function filesFor(n) {\n      var svg = productionSvg(n); if (!svg) return [];\n      // \u00AB _ \u00BB : fichier de production masqu\u00E9 c\u00F4t\u00E9 client (panier, checkout, emails), visible dans l'admin\n      return [{ prop: '_Fichier de d\u00E9coupe', blob: new Blob([svg], { type: 'image/svg+xml' }), name: (BOULE ? 'boule-' : 'prenom-') + slug(n.t) + '-' + slug(BOULE ? n.nm.fg : (state.opt.size || '')) + '.svg' }];\n    }\n\n    /* \u2500\u2500 Panier : une ligne par pr\u00E9nom \u2500\u2500 */\n    function propsFor(n, i, total) {\n      var p = { 'Pr\u00E9nom': n.t, 'Police': state.font };\n      if (BOULE) { if (B_L2 && n.t2) p['Ligne grav\u00E9e'] = n.t2; p['Couleur du bois'] = n.nm.fg; if (B_FOND) p['Fond'] = 'Peuplier naturel'; p['Diam\u00E8tre'] = dimsOf(n); if (total > 1) p['Lot'] = (i + 1) + '/' + total; return p; }\n      p[FG_LABEL] = n.nm.fg; p[BG_LABEL] = n.nm.bg;\n      p['Dimensions'] = dimsOf(n) + (WOOD ? ' (socle compris)' : ' (contour compris)');\n      if (total > 1) p['Lot'] = (i + 1) + '/' + total + (state.sameH ? ' \u00B7 m\u00EAme hauteur de lettres' : '');\n      return p;\n    }\n    function compactFor(nm) { return { v: 1, k: 'duo', o: state.opt, n: nm.t.trim(), n2: String(nm.t2 || '').trim(), fg: nm.fg, bg: nm.bg, f: state.font, sh: state.sameH ? 1 : 0, x: state.extras }; }\n    mod.cartItems = function (qty) {\n      var ns = layout().filter(function (n) { return n.real; });\n      return ns.map(function (n, i) {\n        var v = variantFor(n.nm), props = extraProps(propsFor(n, i, ns.length));\n        props._config = JSON.stringify(compactFor(n.nm));\n        return { id: v ? v.id : 0, quantity: qty, properties: props, files: filesFor(n) };\n      }).filter(function (it) { return it.id; });\n    };\n    mod.properties = function () { var n = layout()[0]; return propsFor(n, 0, 1); };\n    mod.compact = function () { return compactFor(state.names[0]); };\n    mod.apply = function (c) {\n      applyOpts(c.o);\n      if (c.f && (cfg.fonts || []).indexOf(c.f) >= 0) state.font = c.f;\n      var nm = state.names[0];\n      if (typeof c.n === 'string') nm.t = c.n;\n      if (typeof c.n2 === 'string') nm.t2 = c.n2;\n      if (c.fg && fgValues().indexOf(c.fg) >= 0) nm.fg = c.fg;\n      if (c.bg && bgValues().indexOf(c.bg) >= 0) nm.bg = c.bg;\n      if (c.sh !== undefined) state.sameH = !!c.sh;\n      if (c.x) Object.keys(c.x).forEach(function (k) { if (k in state.extras) state.extras[k] = !!c.x[k]; });\n      syncOpt();\n    };\n    mod.fontsToLoad = function () { return [fontObj()]; };\n    return mod;\n  })();\n\n  /* \u2500\u2500 SOCIAL : sticker r\u00E9seaux sociaux \u2014 pseudo(s) + logo du r\u00E9seau, police (TTF du th\u00E8me), finition (palette \u2192\n     propri\u00E9t\u00E9), hauteur (variante = hauteur totale du sticker, logo compris ; largeur calcul\u00E9e et affich\u00E9e).\n     Plusieurs pseudos par commande, chacun avec son r\u00E9seau ; une ligne de panier par pseudo avec son SVG de\n     production (deux trac\u00E9s : logo puis pseudo fusionn\u00E9). D\u00E9mo avant saisie. \u2500\u2500 */\n  KINDS.social = (function () {\n    var C = cfg.social || {}, NETS = C.networks || [], MAX = +C.maxChars || 30, MAXN = Math.max(1, +C.maxNames || 4);\n    var GAP = 0.16, TEXT_H = 0.78; // \u00E9cart logo-texte et hauteur d'encre de r\u00E9f\u00E9rence du texte, en fraction de la hauteur totale\n    var FIN = (cfg.palette || []).map(function (p) { return p.name; });\n    var LABELS_F = cfg.fontLabels || {};\n    function netOf(key) { return NETS.filter(function (n) { return n.key === key; })[0] || NETS[0] || { key: '', label: '' }; }\n    var mod = {\n      steps: ['text', 'network', 'font', 'finish', 'size'].filter(function (k) { return k !== 'size' || hasRole('size'); }),\n      labels: { text: 'Votre pseudo', network: 'R\u00E9seau', font: 'Police', finish: 'Finition', size: (cfg.labels && cfg.labels.size) || 'Hauteur' },\n      mainStep: 'text',\n      inlineFirst: true,\n      render: {},\n      init: function () {\n        if (!state.font || (cfg.fonts || []).indexOf(state.font) < 0) state.font = cfg.defaultFont || (cfg.fonts || [])[0] || '';\n        state.names = [{ t: '', net: NETS[0] ? NETS[0].key : '', font: state.font }];\n        state.finish = (cfg.defaults && cfg.defaults.color && FIN.indexOf(cfg.defaults.color) >= 0) ? cfg.defaults.color : (FIN[0] || '');\n        state.target = 'all';\n        OT.onChange = function () { gboxCache = {}; refreshDims(); updateLight(); };\n        OT.ensureFont(state.font); OT.ensureClipper();\n        NETS.forEach(function (n) { loadIcon(n.key); });\n        setTimeout(demoStart, 400);\n      }\n    };\n    /* \u2500\u2500 Logos : fichiers SVG du th\u00E8me \u2192 trac\u00E9 + bo\u00EEte r\u00E9elle \u2500\u2500 */\n    var icons = {};\n    function loadIcon(key) {\n      var n = netOf(key); if (!n.url || icons[key] !== undefined) return;\n      icons[key] = null;\n      fetch(n.url).then(function (r) { if (!r.ok) throw new Error(r.status); return r.text(); }).then(function (txt) {\n        var doc = new DOMParser().parseFromString(txt, 'image/svg+xml');\n        var d = Array.prototype.map.call(doc.querySelectorAll('path'), function (p) { return p.getAttribute('d') || ''; }).join(' ');\n        var NS = 'http://www.w3.org/2000/svg', tmp = document.createElementNS(NS, 'svg'), pe = document.createElementNS(NS, 'path');\n        tmp.setAttribute('width', '10'); tmp.setAttribute('height', '10'); tmp.style.cssText = 'position:absolute;left:-9999px;top:0';\n        pe.setAttribute('d', d); tmp.appendChild(pe); document.body.appendChild(tmp);\n        var b = pe.getBBox(); document.body.removeChild(tmp);\n        icons[key] = { d: d, x: b.x, y: b.y, w: Math.max(b.width, 1), h: Math.max(b.height, 1) };\n        refreshDims(); updateLight();\n      }).catch(function () { icons[key] = false; });\n    }\n    /* \u2500\u2500 Police courante (d\u00E9mo avant saisie) et bo\u00EEte d'encre \u2500\u2500 */\n    function famOf(nm) { return demoActive() && demo.font ? demo.font : (nm && nm.font) || state.font; }\n    function famNow() { return famOf(state.names[0]); }\n    function fontObj() { return { family: famNow(), weight: 400 }; }\n    var gboxCache = {};\n    function gbox(txt, fam) {\n      fam = fam || famNow(); var font = OT.font(fam), key = txt + '|' + fam + '|' + (font ? 'ot' : 'px');\n      if (gboxCache[key]) return gboxCache[key];\n      var g;\n      if (font) { var b = font.getPath(txt, 0, 0, 100, { kerning: true }).getBoundingBox(); g = { left: -b.x1, right: b.x2, w: Math.max(b.x2 - b.x1, 1), asc: -b.y1, desc: b.y2 }; }\n      else {\n        mctx.font = '400 100px \"' + fam + '\", sans-serif'; var m = mctx.measureText(txt);\n        var l = m.actualBoundingBoxLeft, r = m.actualBoundingBoxRight; if (!(l > -1e9)) l = 0; if (!(r > -1e9)) r = m.width;\n        g = { left: l, right: r, w: Math.max(l + r, 1), asc: m.actualBoundingBoxAscent >= 0 ? m.actualBoundingBoxAscent : 72, desc: m.actualBoundingBoxDescent >= 0 ? m.actualBoundingBoxDescent : 22 };\n      }\n      if (font) gboxCache[key] = g;\n      return g;\n    }\n    function heightMm(val) { var m = optionMeta(val || state.opt.size); if (m.h) return m.h * 10; var v = parseFloat(String(val || state.opt.size || '').replace(',', '.')); return v > 0 ? v : 30; }\n    function live() { return state.names.filter(function (nm, i) { return i === 0 || nm.t.trim(); }); }\n    /* G\u00E9om\u00E9trie d'une ligne, en mm : logo (carr\u00E9 de c\u00F4t\u00E9 H), \u00E9cart, texte \u00E0 taille constante (\u00E9chelle k tir\u00E9e de la bo\u00EEte de\n       r\u00E9f\u00E9rence \u00AB @Hgp \u00BB, 78 % de H) mais centr\u00E9 optiquement : la bo\u00EEte d'encre du pseudo r\u00E9ellement tap\u00E9 est centr\u00E9e sur le\n       milieu du logo. Un pseudo en capitales (sans jambage) ne para\u00EEt plus remont\u00E9 ; en minuscules, la place ne change presque pas. */\n    function layout(hVal) {\n      var H = heightMm(hVal), dm = demoActive();\n      return live().map(function (nm) {\n        var fam = famOf(nm), ref = gbox('@Hgp', fam), k = TEXT_H * H / (ref.asc + ref.desc);\n        var real = !!nm.t.trim(), t = real ? nm.t.trim() : (dm ? demoText() : '@lenidesign'), net = real || !dm ? nm.net : demo.net, ic = icons[net] || null;\n        var noLogo = !netOf(net).url; // \u00AB Sans logo \u00BB : le pseudo seul, sans r\u00E9serve \u00E0 gauche\n        var g = gbox(t, fam), base = H / 2 + (g.asc - g.desc) * k / 2;\n        var s = ic ? H / Math.max(ic.w, ic.h) : 0, iw = ic ? ic.w * s : (noLogo ? 0 : H), ih = ic ? ic.h * s : H, iy = (H - ih) / 2;\n        var tx = noLogo ? 0 : iw + GAP * H, top = Math.min(0, base - g.asc * k), bot = Math.max(H, base + g.desc * k);\n        return { nm: nm, t: t, real: real, net: net, fam: fam, ic: ic, s: s, iw: iw, ih: ih, iy: iy - top, tx: tx, k: k, g: g, base: base - top, H: H, wmm: tx + g.w * k, hmm: bot - top };\n      });\n    }\n    function dimsOf(n) { return fmtCm(n.wmm / 10) + ' \u00D7 ' + fmtCm(n.hmm / 10) + ' cm'; }\n    function dimsText() { return layout().filter(function (n) { return n.real; }).map(function (n, i, arr) { return (arr.length > 1 ? n.t + ' : ' : '') + dimsOf(n); }); }\n    function refreshDims() { var host = $('#leniSocialDims'); if (host) host.textContent = dimsText().length ? 'Dimensions finales ' + dimsText().join(' \u00B7 ') : ''; if (hasRole('size')) RENDER.size(); }\n    /* \u2500\u2500 D\u00E9mo avant saisie \u2500\u2500 */\n    var DEMO = ['@lenidesign', '@nringcupra', '@atelier.bois', '@marc.moto', '@cafe.du.port', '@julie_photo', '@team_ride67', '@lea.nails', '@garage_du_pont', '@mon_pseudo'];\n    var demo = { on: false, n: 0, i: 0, typed: 0, alpha: 1, phase: 'typing', font: '', net: '', fin: '', timer: null };\n    var reduceMotion = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);\n    function demoSet(n) { var fonts = cfg.fonts || [], dn = NETS.filter(function (x) { return x.url; }); demo.i = n % DEMO.length; demo.font = fonts.length ? fonts[n % fonts.length] : state.font; demo.net = dn.length ? dn[n % dn.length].key : ''; demo.fin = FIN.length ? FIN[n % FIN.length] : state.finish; OT.ensureFont(demo.font); }\n    function demoActive() { return demo.on && !state.names[0].t.trim(); }\n    function demoText() { return DEMO[demo.i].slice(0, Math.max(1, demo.typed)); }\n    function demoStop() { demo.on = false; if (demo.timer) clearTimeout(demo.timer); demo.timer = null; }\n    function demoStep() {\n      if (!demoActive()) { demoStop(); renderPreview(); return; }\n      var name = DEMO[demo.i], delay;\n      if (demo.phase === 'typing') { demo.typed++; if (demo.typed >= name.length) { demo.phase = 'hold'; delay = 2600; } else delay = 120; }\n      else if (demo.phase === 'hold') { demo.phase = 'fade'; demo.alpha = 0.7; delay = 80; }\n      else { demo.alpha -= 0.25; if (demo.alpha <= 0.05) { demo.n++; demoSet(demo.n); demo.typed = 0; demo.alpha = 1; demo.phase = 'typing'; delay = 320; } else delay = 80; }\n      renderPreview();\n      demo.timer = setTimeout(demoStep, delay);\n    }\n    function demoStart() {\n      if (reduceMotion || demo.on || state.names[0].t.trim() || editKey) return;\n      demo.on = true; demo.n = Math.floor(Math.random() * 97); demoSet(demo.n); demo.typed = 0; demo.alpha = 1; demo.phase = 'typing';\n      (cfg.fonts || []).forEach(OT.ensureFont);\n      demo.timer = setTimeout(demoStep, 900);\n    }\n    /* \u2500\u2500 \u00C9tape pseudo(s) \u2500\u2500 */\n    mod.render.text = function () {\n      var body = bodyOf('text'); if (!body) return;\n      body.innerHTML = '';\n      body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'Tapez votre pseudo exactement comme il appara\u00EEt, avec ou sans le @. Il est reproduit tel quel.' }));\n      state.names.forEach(function (nm, i) {\n        var e1 = i === 0 && errors.text && (submitAttempted || touchedKeys.text) ? errors.text : (nm.t.length > MAX ? MSG.tooLong : '');\n        var row = el('div', { class: 'leni-duo__row' + (i ? ' leni-duo__row--extra' : '') });\n        row.appendChild(textField({ key: 'name' + i, label: state.names.length > 1 ? 'Pseudo ' + (i + 1) : 'Pseudo', placeholder: i ? '@autre_pseudo' : '@lenidesign', max: MAX, value: nm.t, err: e1, required: i === 0,\n          onInput: function (v) { nm.t = v; touch('text'); if (i === 0 && v.trim()) demoStop(); debounced('name' + i, function () { markInteracted(); mod.validate(); markComplete(); patchField('name' + i, i === 0 ? errors.text : '', MAX + ' caract\u00E8res max.'); refreshDims(); updateLight(); if (state.names.length > 1) { mod.render.network(); RENDER.font(); } }); },\n          onBlur: function () { mod.validate(); patchField('name' + i, i === 0 && (submitAttempted || touchedKeys.text) ? errors.text : '', MAX + ' caract\u00E8res max.'); renderHeaders(); renderPriceAndCta(); } }));\n        if (i) row.appendChild(el('button', { type: 'button', class: 'leni-duo__remove', 'aria-label': 'Retirer ce pseudo', text: '\u2715', onclick: function () { state.names.splice(i, 1); if (state.target !== 'all' && +state.target >= state.names.length) state.target = 'all'; markInteracted(); update(); } }));\n        body.appendChild(row);\n      });\n      if (state.names.length < MAXN) body.appendChild(el('button', { type: 'button', class: 'leni-cfg__link leni-duo__add', text: '+ Ajouter un pseudo', onclick: function () { var f = state.names[0]; state.names.push({ t: '', net: f.net, font: f.font || state.font }); markInteracted(); update(); var inp = $('#leniField-name' + (state.names.length - 1)); if (inp) inp.focus(); } }));\n      if (state.names.length > 1) body.appendChild(el('p', { class: 'leni-cfg__hint', text: 'M\u00EAme hauteur et m\u00EAme finition pour tous ; le r\u00E9seau et la police se choisissent par pseudo. Une ligne de panier par pseudo.' }));\n      var d = dimsText(); body.appendChild(el('p', { class: 'leni-cfg__dims', id: 'leniSocialDims', text: d.length ? 'Dimensions finales ' + d.join(' \u00B7 ') : '' }));\n    };\n    /* \u2500\u2500 \u00C9tape r\u00E9seau \u2500\u2500 */\n    function targets() { return state.target === 'all' ? live() : [state.names[+state.target]].filter(Boolean); }\n    function iconSvg(key, px) { var ic = icons[key]; if (!ic) return ''; var s = px / Math.max(ic.w, ic.h); return '<svg viewBox=\"' + ic.x + ' ' + ic.y + ' ' + Math.max(ic.w, ic.h) + ' ' + Math.max(ic.w, ic.h) + '\" width=\"' + px + '\" height=\"' + px + '\" aria-hidden=\"true\"><path d=\"' + ic.d + '\" fill=\"currentColor\"/></svg>'; }\n    mod.render.network = function () {\n      var body = bodyOf('network'); if (!body) return;\n      body.innerHTML = '';\n      var ns = live();\n      if (ns.length > 1) {\n        body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', text: 'Appliquer \u00E0' }));\n        var tg = [{ key: 'all', label: 'Tous les pseudos' }].concat(ns.map(function (nm) { return { key: String(state.names.indexOf(nm)), label: nm.t.trim() }; }));\n        if (!tg.some(function (t) { return t.key === state.target; })) state.target = 'all';\n        var grp = el('div', { class: 'leni-chips', style: 'margin-bottom:12px', role: 'radiogroup', 'aria-label': 'Appliquer le r\u00E9seau \u00E0' });\n        tg.forEach(function (t) { grp.appendChild(el('button', { type: 'button', class: 'leni-chip' + (state.target === t.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.target === t.key ? 'true' : 'false', text: t.label, onclick: function () { state.target = t.key; mod.render.network(); } })); });\n        body.appendChild(grp);\n      }\n      var ref = state.target === 'all' ? state.names[0] : (state.names[+state.target] || state.names[0]);\n      var grid = el('div', { class: 'leni-nets', role: 'radiogroup', 'aria-label': 'R\u00E9seau social' });\n      NETS.forEach(function (n) {\n        grid.appendChild(el('button', { type: 'button', class: 'leni-net' + (ref.net === n.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': ref.net === n.key ? 'true' : 'false',\n          html: '<span class=\"leni-net__icon\">' + (iconSvg(n.key, 28) || '<span class=\"leni-net__none\" aria-hidden=\"true\">@</span>') + '</span><span class=\"leni-net__label\">' + esc(n.label) + '</span>',\n          onclick: function () { targets().forEach(function (nm) { nm.net = n.key; }); markInteracted(); update(); } }));\n      });\n      body.appendChild(grid);\n    };\n    /* \u2500\u2500 Police (\u00E9tape partag\u00E9e) \u2500\u2500 */\n    function fontRef() { return state.target === 'all' ? state.names[0] : (state.names[+state.target] || state.names[0]); }\n    mod.renderFontTarget = function (body) {\n      var ns = live(); if (ns.length < 2) { state.target = 'all'; return; }\n      body.appendChild(el('p', { class: 'leni-cfg__fieldlabel', text: 'Appliquer \u00E0' }));\n      var tg = [{ key: 'all', label: 'Tous les pseudos' }].concat(ns.map(function (nm) { return { key: String(state.names.indexOf(nm)), label: nm.t.trim() }; }));\n      if (!tg.some(function (t) { return t.key === state.target; })) state.target = 'all';\n      var grp = el('div', { class: 'leni-chips', style: 'margin-bottom:12px', role: 'radiogroup', 'aria-label': 'Appliquer la police \u00E0' });\n      tg.forEach(function (t) { grp.appendChild(el('button', { type: 'button', class: 'leni-chip' + (state.target === t.key ? ' is-selected' : ''), role: 'radio', 'aria-checked': state.target === t.key ? 'true' : 'false', text: t.label, onclick: function () { state.target = t.key; RENDER.font(); } })); });\n      body.appendChild(grp);\n    };\n    mod.pickFont = function (fam) { targets().forEach(function (nm) { nm.font = fam; }); state.font = state.names[0].font || fam; OT.ensureFont(fam); };\n    mod.fontCurrent = function () { return fontRef().font || state.font; };\n    mod.fontSample = function () { var t = fontRef().t.trim() || '@pseudo'; return t.length > 9 ? t.slice(0, 8) + '\u2026' : t; };\n    mod.fontValue = function () { var ns = live(), f = famOf(ns[0]); return ns.every(function (nm) { return famOf(nm) === f; }) ? (LABELS_F[f] || f) : 'Par pseudo'; };\n    mod.fontHint = function () { return live().length > 1 ? 'Choisissez un pseudo ci-dessus pour lui donner sa propre police.' : 'La police du pseudo.'; };\n    /* \u2500\u2500 Finition \u2500\u2500 */\n    mod.render.finish = function () {\n      var body = bodyOf('finish'); if (!body) return;\n      body.innerHTML = '';\n      renderSwatches(body, FIN, state.finish, function (val) { state.finish = val; markInteracted(); update(); }, 'Finition');\n      if (cfg.colorHint) body.appendChild(el('p', { class: 'leni-cfg__hint', style: 'margin-top:12px', text: cfg.colorHint }));\n    };\n    function finFill(name) { if (isHolo(name)) return 'url(#leniHolo)'; if (isGold(name)) return 'url(#leniGold)'; if (isSilver(name)) return 'url(#leniSilver)'; if (/blanc|white/i.test(name)) return 'url(#leniWhite)'; return hexFor(name, '#1A1A1A'); }\n    function finHex(name) { if (isHolo(name)) return '#B5B5B5'; if (isGold(name)) return '#D5A940'; if (isSilver(name)) return '#B5B5B5'; if (/blanc|white/i.test(name)) return '#FFFFFF'; return hexFor(name, '#1A1A1A'); }\n    /* \u2500\u2500 Validation, en-t\u00EAtes, r\u00E9cap \u2500\u2500 */\n    mod.validate = function () {\n      errors = {};\n      if (!state.names[0].t.trim()) errors.text = 'Indiquez votre pseudo.';\n      else if (state.names.some(function (nm) { return nm.t.length > MAX; })) errors.text = MSG.tooLong;\n      return mod.isValid();\n    };\n    mod.isValid = function () { return !errors.text; };\n    mod.isComplete = mod.isValid;\n    mod.touched = function (k) { return !!touchedKeys[k]; };\n    mod.firstInvalidStep = function () { return 'text'; };\n    mod.incompleteLabel = function () { return !state.names[0].t.trim() ? 'Indiquez votre pseudo' : 'Raccourcissez le pseudo'; };\n    mod.stepValue = function (key) {\n      if (key === 'text') { var ns = live().filter(function (nm) { return nm.t.trim(); }); return ns.length ? ns.map(function (nm) { return nm.t.trim(); }).join(' \u00B7 ') : '\u00C0 saisir'; }\n      if (key === 'network') { var ns2 = live(), f = ns2[0]; return ns2.every(function (nm) { return nm.net === f.net; }) ? netOf(f.net).label : 'Par pseudo'; }\n      if (key === 'finish') return state.finish;\n      return '';\n    };\n    mod.recapLines = function () {\n      var out = [], ns = live();\n      layout().forEach(function (n) { if (n.real) out.push({ text: n.t + ' \u2014 ' + netOf(n.net).label + ' \u2014 ' + dimsOf(n), step: 'text' }); });\n      out.push({ text: state.finish + ' \u00B7 ' + (LABELS_F[state.font] || state.font), step: 'finish' });\n      return out;\n    };\n    mod.stickySub = function () { var n = live().filter(function (nm) { return nm.t.trim(); }).length; return (state.opt.size || '') + ' \u00B7 ' + state.finish + (n > 1 ? ' \u00B7 ' + n + ' pseudos' : ''); };\n    mod.sizeExtra = function (val) { if (!state.names[0].t.trim()) return ''; var n = layout(val)[0]; return n ? 'largeur ' + fmtCm(n.wmm / 10) + ' cm' : ''; };\n    mod.totalPrice = function () { var v = currentVariant(); return (v ? v.price : 0) * live().length; };\n    mod.unitCount = function () { return Math.max(1, live().length); }; // une ligne de panier par pseudo : les offres par quantit\u00E9 comptent chaque pseudo\n    mod.lightBg = function () { var f = demoActive() ? demo.fin : state.finish; return /noir|black/i.test(f); };\n    /* \u2500\u2500 Aper\u00E7u \u2500\u2500 */\n    function pill(x, y, t, ink, bg, fs) {\n      var wpx = t.length * fs * 0.6 + 22;\n      return '<g><rect x=\"' + (x - wpx / 2).toFixed(1) + '\" y=\"' + (y - fs * 0.75).toFixed(1) + '\" width=\"' + wpx.toFixed(1) + '\" height=\"' + (fs * 1.5).toFixed(1) + '\" rx=\"' + (fs * 0.75).toFixed(1) + '\" fill=\"' + bg + '\"/><text x=\"' + x.toFixed(1) + '\" y=\"' + (y + fs * 0.36).toFixed(1) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"' + fs + '\" font-weight=\"600\" fill=\"' + ink + '\">' + esc(t) + '</text></g>';\n    }\n    /* bakePath : partag\u00E9 (voir VEC) */\n    function iconPath(n, x0, y0, scale, dec) {\n      // logo plac\u00E9 en (x0, y0) \u00E0 l'\u00E9chelle \u00AB scale \u00BB px par mm, bo\u00EEte r\u00E9elle du trac\u00E9 align\u00E9e ; coordonn\u00E9es cuites (pas de transform)\n      if (!n.ic) return '';\n      var s = n.s * scale, tx = x0 - n.ic.x * s, ty = y0 + n.iy * scale - n.ic.y * s, baked = bakePath(n.ic.d, s, tx, ty, dec || 2);\n      if (baked) return '<path d=\"' + baked + '\"/>';\n      return '<path d=\"' + n.ic.d + '\" transform=\"translate(' + tx.toFixed(2) + ' ' + ty.toFixed(2) + ') scale(' + s.toFixed(5) + ')\"/>';\n    }\n    mod.preview = function () {\n      var ns = layout(), W = 1000, pad = 60, right = ns.length === 1 && ns[0].real ? 90 : 0, avail = W - 2 * pad - right;\n      var wMax = ns.reduce(function (a, n) { return Math.max(a, n.wmm); }, 1), pxPerMm = Math.min(avail / wMax, 420 / ns[0].hmm), gap = 30, y = pad, rows = [];\n      ns.forEach(function (n) { var h = n.hmm * pxPerMm; rows.push({ n: n, top: y, h: h, w: n.wmm * pxPerMm }); y += h + gap; });\n      var H = y - gap + pad + (ns.length > 1 ? 34 : 60), cx = pad + avail / 2, fin = demoActive() ? demo.fin : state.finish, fill = finFill(fin);\n      var lc = mod.lightBg() ? '#1A1A1A' : '#F5F1EA', lbg = mod.lightBg() ? '#F7F5F1' : '#1A1A1A';\n      var out = ['<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + W + ' ' + H.toFixed(0) + '\" width=\"100%\" height=\"100%\" role=\"img\" aria-label=\"Aper\u00E7u de votre sticker\">', defs()];\n      rows.forEach(function (r) {\n        var n = r.n, font = OT.font(n.fam), x0 = cx - r.w / 2, tx = x0 + (n.tx + n.g.left * n.k) * pxPerMm, base = r.top + n.base * pxPerMm, S = 100 * n.k * pxPerMm;\n        out.push('<g fill=\"' + fill + '\"' + (n.real ? '' : ' opacity=\"' + (demoActive() ? demo.alpha.toFixed(2) : '0.55') + '\"') + '>');\n        out.push(iconPath(n, x0, r.top, pxPerMm));\n        if (font) out.push('<path d=\"' + OT.pathData(font, n.t, tx, base, S, 2) + '\"/>');\n        else out.push('<text x=\"' + tx.toFixed(1) + '\" y=\"' + base.toFixed(1) + '\" font-family=\"\\'' + esc(n.fam) + '\\', sans-serif\" font-size=\"' + S.toFixed(1) + '\">' + esc(n.t) + '</text>');\n        out.push('</g>');\n        if (n.real && rows.length > 1) out.push(pill(cx, r.top + r.h + 18, dimsOf(n), lc, lbg, 20));\n      });\n      if (rows.length === 1 && rows[0].n.real) { var r0 = rows[0]; out.push(dimLines({ x: cx - r0.w / 2, y: r0.top, w: r0.w, h: r0.h, wcm: r0.n.wmm / 10, hcm: r0.n.hmm / 10, ink: lc, bg: lbg, plan: false, fs: 22 })); }\n      else if (!rows[0].n.real) out.push('<text x=\"' + (W / 2) + '\" y=\"' + (H - 16) + '\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"24\" fill=\"' + lc + '\" fill-opacity=\"0.7\">Exemple \u2014 saisissez votre pseudo</text>');\n      out.push('</svg>');\n      return out.join('');\n    };\n    /* \u2500\u2500 SVG de production : deux trac\u00E9s (logo, pseudo fusionn\u00E9), viewBox en mm \u2500\u2500 */\n    function productionSvg(n) {\n      var font = OT.font(n.fam), F = function (v) { return (Math.round(v * 100) / 100).toString(); };\n      var logo = iconPath(n, 0, 0, 1, 3).replace('<path ', '<path id=\"logo\" fill=\"' + finHex(state.finish) + '\" '), tx = n.tx + n.g.left * n.k, size = 100 * n.k, hex = finHex(state.finish);\n      var pseudo = font ? (OT.united(font, n.t, tx, n.base, size) || OT.pathData(font, n.t, tx, n.base, size, 3)) : '';\n      if (!pseudo) return '';\n      return '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ' + F(n.wmm) + ' ' + F(n.hmm) + '\" width=\"' + F(n.wmm) + 'mm\" height=\"' + F(n.hmm) + 'mm\">' +\n        logo + '<path id=\"pseudo\" fill=\"' + hex + '\" fill-rule=\"evenodd\" d=\"' + pseudo + '\"/></svg>';\n    }\n    function slug(t) { return String(t).normalize('NFD').replace(/[\u0300-\u036F]/g, '').replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '').toLowerCase() || 'pseudo'; }\n    function filesFor(n) { var svg = productionSvg(n); if (!svg) return []; return [{ prop: '_Fichier de d\u00E9coupe', blob: new Blob([svg], { type: 'image/svg+xml' }), name: 'sticker-' + slug(n.t) + '-' + slug(netOf(n.net).label) + '-' + slug(state.opt.size || '') + '.svg' }]; } // \u00AB _ \u00BB : masqu\u00E9 c\u00F4t\u00E9 client, visible dans l'admin\n    /* \u2500\u2500 Panier : une ligne par pseudo \u2500\u2500 */\n    function propsFor(n, i, total) {\n      var p = { 'R\u00E9seau social': netOf(n.net).label, 'Pseudo': n.t, 'Police': LABELS_F[n.fam] || n.fam, 'Finition': state.finish, 'Dimensions': dimsOf(n) + (netOf(n.net).url ? ' (logo compris)' : '') };\n      if (total > 1) p['Lot'] = (i + 1) + '/' + total;\n      return p;\n    }\n    function compactFor(nm) { return { v: 1, k: 'social', o: state.opt, n: nm.t.trim(), net: nm.net, f: famOf(nm), fi: state.finish, x: state.extras }; }\n    mod.cartItems = function (qty) {\n      var ns = layout().filter(function (n) { return n.real; }), v = currentVariant();\n      return ns.map(function (n, i) { var props = extraProps(propsFor(n, i, ns.length)); props._config = JSON.stringify(compactFor(n.nm)); return { id: v ? v.id : 0, quantity: qty, properties: props, files: filesFor(n) }; }).filter(function (it) { return it.id; });\n    };\n    mod.properties = function () { var n = layout()[0]; return propsFor(n, 0, 1); };\n    mod.compact = function () { return compactFor(state.names[0]); };\n    mod.apply = function (c) {\n      applyOpts(c.o);\n      if (c.f && (cfg.fonts || []).indexOf(c.f) >= 0) { state.font = c.f; state.names[0].font = c.f; }\n      if (c.fi && FIN.indexOf(c.fi) >= 0) state.finish = c.fi;\n      var nm = state.names[0]; if (typeof c.n === 'string') nm.t = c.n; if (c.net && NETS.some(function (x) { return x.key === c.net; })) nm.net = c.net;\n      if (c.x) Object.keys(c.x).forEach(function (k) { if (k in state.extras) state.extras[k] = !!c.x[k]; });\n    };\n    mod.fontsToLoad = function () { var seen = {}; return state.names.map(function (nm) { return famOf(nm); }).filter(function (f) { if (!f || seen[f]) return false; seen[f] = 1; return true; }).map(function (f) { return { family: f, weight: 400 }; }); };\n    return mod;\n  })();\n\n  /* \u2500\u2500 Init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var K = KINDS[KIND] || KINDS.texte;\n  STEPS = K.steps; LABELS = K.labels;\n  K.init();\n  if (cfg.defaults && cfg.defaults.color && !hasRole('color') && paletteItem(cfg.defaults.color)) state.color = cfg.defaults.color;\n\n  loadEditLine().then(function () {\n    K.validate();\n    buildSteps();\n    bindStatic();\n    bindAccordions();\n    update();\n    bindSticky();\n    if (!isMobile() || K.inlineFirst) { var s1 = $('[data-step=\"1\"]'); if (s1) { s1.classList.add('is-open'); if (K.inlineFirst) s1.classList.add('is-inline'); } }\n    if (editKey || !cfg.hasMedia || cfg.previewDefault) showPreview(); else gallery.go(1);\n    renderPreview();\n    loadFonts(K.fontsToLoad()).then(renderPreview);\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(renderPreview);\n    if (editKey) openStep(stepIndex(K.mainStep));\n  });\n})();\n"],
  "mappings": "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",
  "names": ["chips", "i", "x", "y", "m", "loops", "L", "a", "b", "PH", "e", "T", "fitSize", "q", "D", "lim", "cp", "x0", "y0"]
}
