{
  "version": 3,
  "sources": ["/cdn/shop/t/31/assets/carron-composer-core.js?cb=1"],
  "sourcesContent": ["/* ======================================================================\n   CARRON COMPOSER CORE - module transactionnel partage\n----------------------------------------------------------------------\n   Expose window.CarronComposer :\n     - formatMoney(cents, fmt)      -> chaine monnaie (shop.money_format)\n     - addToCart(items, opts)       -> Promise<cart> (POST /cart/add.js\n       multi-lignes + refresh du cart drawer natif Impact)\n     - preorder(payload, endpoint)  -> Promise (client precommande\n       prod.carron.paris/api/preorders/create -> draft order)\n\n   Le mecanisme panier est repris A L'IDENTIQUE de assets/set-composer.js\n   (methode addAll, fin de fichier) : meme sequence d'events natifs Impact\n   (cart:prepare-bundled-sections, cart:change, variant:add) + cart-drawer.show().\n\n   Consomme par carron-table-composer.js des la Phase 2. set-composer\n   migrera sur ce core en Phase 5 (pour l'instant set-composer garde son\n   propre code inline, il est live et eprouve : on n'y touche pas).\n   ====================================================================== */\n(function () {\n  'use strict';\n  if (window.CarronComposer) return;\n\n  var DEFAULT_PREORDER_ENDPOINT = 'https://prod.carron.paris/api/preorders/create';\n\n  /* --- format monetaire (mini Shopify.formatMoney, identique set-composer) --- */\n  function formatMoney(cents, fmt) {\n    fmt = fmt || '{{amount}} \u20AC';\n    var v = (cents / 100);\n    var useComma = /comma_separator/.test(fmt);\n    var noDec = /no_decimals/.test(fmt);\n    var dec = noDec ? 0 : 2;\n    var s = Math.abs(v).toFixed(dec);\n    var parts = s.split('.');\n    var thou = useComma ? '.' : ' ';\n    var decSep = ',';\n    parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thou);\n    var amount = parts[1] ? parts[0] + decSep + parts[1] : parts[0];\n    return fmt.replace(/\\{\\{\\s*(amount[^}]*)\\s*\\}\\}/g, amount);\n  }\n\n  function shopRoot() {\n    return (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n  }\n\n  /* --- ajout panier multi-lignes + refresh cart drawer Impact ---\n     items : [{ id: <variantId numerique>, quantity: <int> }, ...]\n     opts.source : element depuis lequel emettre variant:add (defaut : documentElement).\n     Renvoie une Promise resolue avec le cart. En cas d'echec /cart/add.js\n     (ligne epuisee, stock insuffisant...), rejette avec une Error enrichie :\n       err.status  = code HTTP (souvent 422)\n       err.data    = corps JSON Shopify (description, message, ...) */\n  function addToCart(items, opts) {\n    opts = opts || {};\n    var source = opts.source || document.documentElement;\n    var root = shopRoot();\n    if (!items || !items.length) {\n      return Promise.reject(new Error('CarronComposer.addToCart: aucune ligne a ajouter'));\n    }\n    // sections a rafraichir : le <cart-drawer> et le compteur s'ajoutent via cet event (natif Impact)\n    var sections = [];\n    document.documentElement.dispatchEvent(new CustomEvent('cart:prepare-bundled-sections', { bubbles: true, detail: { sections: sections } }));\n    return fetch(root + 'cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n      body: JSON.stringify({ items: items, sections: sections.join(','), sections_url: window.location.pathname })\n    }).then(function (r) {\n      if (!r.ok) {\n        return r.json().then(function (data) {\n          var e = new Error((data && (data.description || data.message)) || ('cart add failed (' + r.status + ')'));\n          e.status = r.status; e.data = data; throw e;\n        }, function () {\n          var e = new Error('cart add failed (' + r.status + ')');\n          e.status = r.status; throw e;\n        });\n      }\n      return r.json();\n    }).then(function (addJson) {\n      return fetch(root + 'cart.js').then(function (r) { return r.json(); }).then(function (cart) {\n        cart.sections = addJson.sections || {};\n        // rafraichit le compteur + le contenu du tiroir (mecanisme natif du theme)\n        document.documentElement.dispatchEvent(new CustomEvent('cart:change', { bubbles: true, detail: { baseEvent: 'variant:add', cart: cart } }));\n        // ouvre le tiroir (CartDrawer ecoute variant:add ; fallback show() direct)\n        source.dispatchEvent(new CustomEvent('variant:add', { bubbles: true, detail: { items: addJson.items || [addJson], cart: cart } }));\n        var d = document.querySelector('cart-drawer');\n        if (d && typeof d.show === 'function') { try { d.show(); } catch (e) {} }\n        return cart;\n      });\n    });\n  }\n\n  /* --- client precommande (draft order CARRONPROD) ---\n     payload : conforme au schema api/preorders/create (cf. CARRONPROD) :\n       { name, email, phone, shipping{address1,address2,zip,city,country},\n         billing{...}, sets:int, pieces:int, items:[{id,coll?,type?,dia?,variant?}],\n         company (honeypot, doit rester vide) }\n     Renvoie une Promise. Rejette avec Error enrichie (err.status, err.data)\n     ex. 422 = minimum de pieces non atteint ; 400 = payload invalide. */\n  function preorder(payload, endpoint) {\n    endpoint = endpoint || DEFAULT_PREORDER_ENDPOINT;\n    return fetch(endpoint, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload)\n    }).then(function (r) {\n      return r.json().catch(function () { return {}; }).then(function (data) {\n        if (!r.ok) {\n          var e = new Error((data && data.error) || ('HTTP ' + r.status));\n          e.status = r.status; e.data = data; throw e;\n        }\n        return data;\n      });\n    });\n  }\n\n  window.CarronComposer = {\n    version: 1,\n    defaultPreorderEndpoint: DEFAULT_PREORDER_ENDPOINT,\n    formatMoney: formatMoney,\n    addToCart: addToCart,\n    preorder: preorder\n  };\n})();\n"],
  "mappings": "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",
  "names": []
}
