{
  "version": 3,
  "sources": ["/cdn/shop/t/85/assets/penup-kit-label-sync.js?t=1793802417627"],
  "sourcesContent": ["/* Pen'Up \u2014 \u00E9tiquette \u00AB Pack Maxi \u00BB toujours juste dans le panier (2026-11-04, GO Dimitri \u00AB corrige live \u00BB).\n *\n * Le bloc \u00AB choix du kit \u00BB (snippets/penup-kit-choice.liquid) \u00E9crit une \u00E9tiquette visible sur la ligne du pack au moment\n * de l'ajout : \u00AB Pack Maxi : Kit M\u00E9canique + Kit Floral \u00BB (les deux kits) ou \u00AB Pack Maxi : Pack Complet + Kit Floral \u00BB\n * (Kit Floral seul), et \u00AB Pack Maxi : Kit Floral \u00BB sur la ligne du kit. Si le client retire ensuite le Kit Floral du\n * panier, le prix redescend mais l'\u00E9tiquette restait : 17 commandes \u00AB 2 kits \u00BB pay\u00E9es 129,99 \u20AC sans Kit Floral.\n *\n * R\u00E8gle : s'il n'y a plus AUCUN Kit Floral dans le panier, on retire l'\u00E9tiquette des lignes pack (SKU contenant\n * PU3D-PACK-COMPLET) ; s'il n'y a plus aucune ligne pack \u00E9tiquet\u00E9e, on retire l'\u00E9tiquette du Kit Floral restant.\n * Seule la propri\u00E9t\u00E9 visible dont le nom contient \u00AB maxi \u00BB (Pack Maxi, Maxigro\u00DFset, Pacchetto Maxi, Maxi Pack\u2026) est\n * retir\u00E9e ; les propri\u00E9t\u00E9s cach\u00E9es (_Composition pour Presto\u2026) sont conserv\u00E9es, le prix ne change pas.\n *\n * Pi\u00E8ges Shopify (v\u00E9rifi\u00E9s en ligne le 04/11) : \u00AB properties: {} \u00BB est ignor\u00E9 et '' / null gardent la cl\u00E9 \u2192 quand\n * l'\u00E9tiquette est la seule propri\u00E9t\u00E9, on ajoute la ligne propre puis on retire l'ancienne ; les cl\u00E9s de ligne CHANGENT\n * \u00E0 chaque modification du panier \u2192 on relit toujours le panier et on reconna\u00EEt les lignes par variante + \u00E9tiquette.\n * Anti-boucle : une ligne non corrig\u00E9e n'est jamais retent\u00E9e, 4 corrections maximum par page.\n */\n(function () {\n  'use strict';\n  if (window.__penupKitLabelSync) return;\n  window.__penupKitLabelSync = true;\n\n  var FLORAL_HANDLE = 'kit-floral-penup-3d';\n  var MAX_FIXES = 4;\n  var busy = false, again = false, fixes = 0, failed = {};\n\n  function root() { return (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/'; }\n  function isLabel(k) { return !!k && k.charAt(0) !== '_' && /maxi/i.test(k); }\n  function labels(item) { return Object.keys(item.properties || {}).filter(isLabel); }\n  function isPack(item) { return /PU3D-PACK-COMPLET/.test(item.sku || ''); }\n  function isFloral(item) { return item.handle === FLORAL_HANDLE; }\n  /* Identit\u00E9 stable d'une ligne \u00E9tiquet\u00E9e (la cl\u00E9 Shopify change \u00E0 chaque modification du panier). */\n  function sig(item) { return item.variant_id + '|' + labels(item).map(function (k) { return k + '=' + item.properties[k]; }).join(';'); }\n\n  /* Ligne \u00E0 corriger, ou null. */\n  function target(cart) {\n    if (fixes >= MAX_FIXES) return null;\n    var items = (cart && cart.items) || [];\n    var floralQty = 0, labeledPacks = [];\n    items.forEach(function (i) {\n      if (isFloral(i)) floralQty += i.quantity;\n      if (isPack(i) && labels(i).length) labeledPacks.push(i);\n    });\n    var pick = function (list) { for (var n = 0; n < list.length; n++) if (!failed[sig(list[n])]) return list[n]; return null; };\n    if (!floralQty && labeledPacks.length) return pick(labeledPacks);\n    if (!labeledPacks.length) return pick(items.filter(function (i) { return isFloral(i) && labels(i).length; }));\n    return null;\n  }\n\n  function getCart() {\n    return fetch(root() + 'cart.js', { cache: 'reload', credentials: 'same-origin' }).then(function (r) { return r.json(); });\n  }\n  function post(path, body) {\n    return fetch(root() + path, {\n      method: 'POST', credentials: 'same-origin',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify(body)\n    }).then(function (r) { if (!r.ok) throw new Error(path + ' ' + r.status); return r.json(); });\n  }\n  function find(cart, s) { return ((cart && cart.items) || []).filter(function (i) { return sig(i) === s; })[0] || null; }\n\n  /* Retire l'\u00E9tiquette de la ligne t (lue dans un panier frais). Renvoie une promesse. */\n  function strip(t) {\n    var s = sig(t), qty = t.quantity, props = {}, src = t.properties || {};\n    Object.keys(src).forEach(function (k) { if (!isLabel(k) && src[k] !== null && src[k] !== '') props[k] = src[k]; });\n    fixes++;\n    if (Object.keys(props).length) return post('cart/change.js', { id: t.key, quantity: qty, properties: props });\n    /* \u00E9tiquette seule : ligne propre ajout\u00E9e, puis ancienne ligne retir\u00E9e (relue, sa cl\u00E9 a chang\u00E9) */\n    return post('cart/add.js', { items: [{ id: t.variant_id, quantity: qty }] })\n      .then(getCart)\n      .then(function (c) {\n        var old = find(c, s);\n        if (!old) return c;\n        return post('cart/change.js', { id: old.key, quantity: 0 }).catch(function (err) {\n          /* jamais deux packs : on annule l'ajout si l'ancienne ligne n'a pas pu \u00EAtre retir\u00E9e */\n          return getCart().then(function (c2) {\n            var clean = ((c2 && c2.items) || []).filter(function (i) { return i.variant_id === t.variant_id && !labels(i).length; })[0];\n            if (clean) return post('cart/change.js', { id: clean.key, quantity: Math.max(0, clean.quantity - qty) });\n          }).then(function () { throw err; });\n        });\n      });\n  }\n\n  function run() {\n    if (busy) { again = true; return; }\n    busy = true; again = false;\n    var changed = false;\n    var step = function (c) {\n      var t = target(c);\n      if (!t) return c;\n      var s = sig(t);\n      return strip(t).then(getCart).then(function (after) {\n        if (find(after, s)) failed[s] = true; else changed = true;   /* pas corrig\u00E9e : jamais retent\u00E9e */\n        return step(after);\n      });\n    };\n    getCart()\n      .then(step)\n      .then(function (c) {\n        busy = false;\n        if (changed && c) document.documentElement.dispatchEvent(new CustomEvent('cart:refresh', { bubbles: true, detail: { cart: c } }));\n        if (again) run();\n      })\n      .catch(function () { busy = false; });\n  }\n\n  function onCartEvent(e) {\n    var cart = e && e.detail && e.detail.cart;\n    /* pr\u00E9-contr\u00F4le gratuit sur le panier joint \u00E0 l'\u00E9v\u00E9nement ; sinon relecture */\n    if (cart && cart.items && !target(cart)) return;\n    run();\n  }\n\n  document.addEventListener('cart:change', onCartEvent);\n  document.addEventListener('cart:refresh', onCartEvent);\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', run);\n  else run();\n})();\n"],
  "mappings": "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",
  "names": []
}
