{
  "version": 3,
  "sources": ["/cdn/shop/t/20/assets/cart-added-popup.js?mdsv=20260914a"],
  "sourcesContent": ["/*\n  Popup \u00AB Ajout\u00E9 au panier \u00BB (snippets/cart-added-popup.liquid).\n\n  S'ouvre \u00E0 chaque ajout au panier r\u00E9ussi : \u00E9coute l'\u00E9v\u00E9nement global\n  `kt.cart.added` dispatch\u00E9 par Cart.add (assets/cart.js) \u2014 donc couvre la page\n  produit, l'ajout rapide des cartes produit et les sliders cross-sell.\n  L'ouverture automatique du panier lat\u00E9ral est neutralis\u00E9e dans cart.js quand\n  ce composant est pr\u00E9sent (il n'est pas rendu sur la page panier).\n\n  Apr\u00E8s l'ouverture :\n    - GET /cart.js \u2192 total, nombre d'articles, ligne ajout\u00E9e (barre livraison\n      offerte + ligne \u00AB Total \u00BB + quantit\u00E9 r\u00E9elle)\n    - GET {produit}?variant=\u2026&section_id=cart-added-popup \u2192 section AJAX\n      sections/cart-added-popup.liquid rendue dans le contexte du produit\n      ajout\u00E9 : prix barr\u00E9, quantit\u00E9 minimale, produits compl\u00E9mentaires\n      (m\u00E9tachamp custom.cross_sell_main)\n\n  Ajout multiple (kits : le kit puis fixation, c\u00E2ble, batterie,\n  accessoires\u2026 en un seul /cart/add.js) : le 1er produit de la r\u00E9ponse reste\n  le produit principal (stepper, prix barr\u00E9, compl\u00E9mentaires) ; les suivants\n  sont list\u00E9s dessous (\u00AB \u00C9galement ajout\u00E9s au panier \u00BB), quantit\u00E9 et prix\n  recal\u00E9s sur /cart.js comme le produit principal.\n\n  Le stepper \u00AB Quantit\u00E9 \u00BB est optimiste : chaque clic met \u00E0 jour l'affichage\n  imm\u00E9diatement (quantit\u00E9, prix de ligne, total et barre estim\u00E9s), puis la\n  rafale de clics est regroup\u00E9e en UN seul /cart/change.js via\n  cart-container.change() (badge compteur et tiroir resynchronis\u00E9s par le\n  th\u00E8me) ; la quantit\u00E9 minimale respecte la r\u00E8gle th\u00E8me (quantity_rule /\n  metafield) ET la r\u00E8gle Pareto (window.mdsParetoMinQuantity, expos\u00E9e par\n  assets/custom.js).\n\n  Les boutons \u00AB + \u00BB des produits compl\u00E9mentaires portent la classe\n  .cap-upsell-add : ils sont g\u00E9r\u00E9s par le handler d\u00E9l\u00E9gu\u00E9 de assets/custom.js\n  (m\u00EAme logique que .product-card-atc, quantit\u00E9 minimale Pareto comprise).\n  Un ajout effectu\u00E9 pendant que le popup est ouvert ne le reconstruit pas :\n  il met \u00E0 jour la barre, le total et l'\u00E9tat du bouton, et l'annonce dans la\n  r\u00E9gion aria-live. Les erreurs d'ajout/modification (kt.cart.error, dispatch\u00E9\n  par cart.js) s'affichent dans le bandeau .cap-error du popup quand il est\n  ouvert.\n*/\n\n(function () {\n  'use strict'\n\n  // Produit-service \u00AB v\u00E9hicule adapt\u00E9 \u00BB (rue non accessible aux 19 t) :\n  // suppl\u00E9ment de livraison, exclu de la barre \u00AB livraison offerte \u00BB.\n  const SPECIAL_VEHICLE_HANDLE = 'service-de-livraison-vehicule-adapte-rue-non-accessible-aux-19-t'\n\n  function formatMoney (cents) {\n    if (window.Shopify && typeof window.Shopify.formatMoney === 'function') {\n      return window.Shopify.formatMoney(cents)\n    }\n    return (cents / 100).toLocaleString('fr-FR', { minimumFractionDigits: 2 }) + ' \u20AC'\n  }\n\n  function resizeImageUrl (src, width) {\n    try {\n      const url = new URL(src, window.location.origin)\n      url.searchParams.set('width', String(width))\n      return url.toString()\n    } catch (err) {\n      return src\n    }\n  }\n\n  class CartAddedPopup extends HTMLElement {\n    constructor () {\n      super()\n\n      this.modalEl = this.querySelector('.modal')\n      this.contentEl = this.querySelector('.cap-content')\n      this.upsellItemsEl = this.querySelector('[data-cap-upsell-items]')\n      this.errorEl = this.querySelector('[data-cap-error]')\n      this.announceEl = this.querySelector('[data-cap-announce]')\n      this.extrasEl = this.querySelector('[data-cap-extras]')\n      this.extrasListEl = this.querySelector('[data-cap-extras-list]')\n      this.extrasTitleEl = this.querySelector('[data-cap-extras-title]')\n      this.extras = []\n      // Fen\u00EAtre de 3 lignes et demie de la liste \u00AB \u00C9galement ajout\u00E9s \u00BB,\n      // mesur\u00E9e d\u00E8s que la liste re\u00E7oit une mise en page (le modal est en\n      // display:none jusqu'\u00E0 l'ouverture), avant le premier affichage, puis \u00E0\n      // chaque changement de largeur. On observe la 1re ligne et non la\n      // liste, dont la hauteur change justement avec la mesure (boucle).\n      this.extrasObserver = 'ResizeObserver' in window\n        ? new ResizeObserver(() => this.sizeExtrasList())\n        : null\n      // Titres au singulier (snippet) : pass\u00E9s au pluriel pour un ajout multiple\n      this.titleEls = Array.from(this.querySelectorAll('.cap-title-full, .cap-title-short'))\n      this.titleEls.forEach(el => { el.dataset.singular = el.textContent })\n      this.skeletonHTML = this.upsellItemsEl ? this.upsellItemsEl.innerHTML : ''\n      this.threshold = parseInt(this.dataset.freeShippingThreshold, 10) || 0\n      // Ids produit hors offre livraison offerte (carports), pos\u00E9s par le snippet\n      this.excludedProductIds = new Set((this.dataset.freeShippingExcludedProducts || '')\n        .split(',').map(id => id.trim()).filter(Boolean))\n      this.sectionId = this.dataset.sectionId || 'cart-added-popup'\n      this.sectionToken = 0\n      this.cartToken = 0\n      this.line = null\n      this.pendingItem = null\n      this.qtyBusy = false\n      this.qtyTimer = null\n      this.qtyTarget = null\n      this.lastCart = null\n\n      window.addEventListener('kt.cart.added', event => {\n        this.onCartAdded(event.detail).catch(err => console.error('MDS popup panier :', err))\n      })\n      window.addEventListener('kt.cart.changed', event => {\n        if (this.isOpen && event.detail && Array.isArray(event.detail.items)) {\n          // Cet \u00E9tat est plus frais que toute relecture /cart.js encore en\n          // vol (refreshCart) : on p\u00E9rime ces derni\u00E8res avant d'appliquer.\n          this.cartToken++\n          this.syncFromCart(event.detail)\n        }\n      })\n      window.addEventListener('kt.cart.error', event => this.onCartError(event.detail))\n\n      // La fen\u00EAtre de 3 produits compl\u00E9mentaires visibles d\u00E9pend du\n      // breakpoint : on la remesure quand la fen\u00EAtre change de taille.\n      this.resizeTimer = null\n      window.addEventListener('resize', () => {\n        if (!this.isOpen) return\n        clearTimeout(this.resizeTimer)\n        this.resizeTimer = setTimeout(() => this.sizeUpsellList(), 150)\n      })\n\n      if (this.modalEl) {\n        // Pendant la transition de fermeture, #cart-added-popup perd .show :\n        // on garde le backdrop au-dessus du header via une classe sur <html>.\n        this.modalEl.addEventListener('hide.bs.modal', () => {\n          document.documentElement.classList.add('cap-modal-transition')\n        })\n        this.modalEl.addEventListener('hidden.bs.modal', () => {\n          document.documentElement.classList.remove('cap-modal-transition')\n          if (this.pendingItem) {\n            const pending = this.pendingItem\n            this.pendingItem = null\n            this.showFor(pending.item, pending.extras)\n          }\n        })\n        this.modalEl.addEventListener('shown.bs.modal', () => {\n          this.pendingItem = null\n          // Si la section AJAX est arriv\u00E9e alors que le modal n'\u00E9tait pas\n          // encore mesurable, la fen\u00EAtre de 3 produits n'a pas pu \u00EAtre\n          // calcul\u00E9e : on la remesure maintenant.\n          this.sizeUpsellList()\n        })\n      }\n\n      const minusBtn = this.querySelector('[data-cap-qty-minus]')\n      const plusBtn = this.querySelector('[data-cap-qty-plus]')\n      if (minusBtn) minusBtn.addEventListener('click', () => this.changeQty(-1))\n      if (plusBtn) plusBtn.addEventListener('click', () => this.changeQty(1))\n\n      this.initDragScroll()\n    }\n\n    // Tablette : la liste horizontale des compl\u00E9mentaires se tire aussi \u00E0 la\n    // souris, comme au doigt. Le tactile garde son d\u00E9filement natif (gestes\n    // pointerType \u00AB mouse \u00BB uniquement). Le glissement ne d\u00E9marre qu'au-del\u00E0\n    // de 5px pour pr\u00E9server le clic sur les liens et boutons \u00AB + \u00BB ; pendant\n    // le glissement le snap CSS est suspendu (classe cap-upsell-dragging),\n    // sinon chaque scrollLeft pos\u00E9 serait recoll\u00E9 \u00E0 une carte.\n    initDragScroll () {\n      const list = this.upsellItemsEl\n      if (!list) return\n\n      const state = { pointerId: null, startX: 0, startScroll: 0, dragging: false }\n\n      list.addEventListener('pointerdown', event => {\n        if (event.pointerType !== 'mouse' || event.button !== 0) return\n        if (list.scrollWidth <= list.clientWidth + 1) return\n        state.pointerId = event.pointerId\n        state.startX = event.clientX\n        state.startScroll = list.scrollLeft\n        state.dragging = false\n        // emp\u00EAche la s\u00E9lection de texte au glissement ; le click, lui,\n        // est toujours dispatch\u00E9 malgr\u00E9 le preventDefault sur pointerdown\n        event.preventDefault()\n      })\n\n      list.addEventListener('pointermove', event => {\n        if (state.pointerId !== event.pointerId) return\n        if (!(event.buttons & 1)) { state.pointerId = null; return }\n        if (!state.dragging) {\n          if (Math.abs(event.clientX - state.startX) < 5) return\n          state.dragging = true\n          // rebase : le mouvement d'armement (5px) ne fait pas sauter la liste\n          state.startX = event.clientX\n          state.startScroll = list.scrollLeft\n          list.classList.add('cap-upsell-dragging')\n          try { list.setPointerCapture(event.pointerId) } catch (err) { /* pointeur d\u00E9j\u00E0 rel\u00E2ch\u00E9 */ }\n        }\n        list.scrollLeft = state.startScroll - (event.clientX - state.startX)\n      })\n\n      const endDrag = event => {\n        if (state.pointerId !== event.pointerId) return\n        state.pointerId = null\n        if (!state.dragging) return\n        // le snap se r\u00E9applique : la liste se recolle \u00E0 la carte la plus proche\n        list.classList.remove('cap-upsell-dragging')\n        // drapeau consomm\u00E9 par le listener click (capture) ci-dessous ; le\n        // timeout couvre le cas o\u00F9 aucun click ne suit le rel\u00E2chement\n        setTimeout(() => { state.dragging = false }, 0)\n      }\n      list.addEventListener('pointerup', endDrag)\n      list.addEventListener('pointercancel', endDrag)\n\n      // un vrai glissement ne doit pas activer le lien/bouton sous le curseur\n      list.addEventListener('click', event => {\n        if (!state.dragging) return\n        state.dragging = false\n        event.preventDefault()\n        event.stopPropagation()\n      }, true)\n\n      // ni d\u00E9marrer un drag-and-drop natif de lien ou d'image\n      list.addEventListener('dragstart', event => {\n        if (state.pointerId !== null || state.dragging) event.preventDefault()\n      })\n    }\n\n    get isOpen () {\n      return this.modalEl && this.modalEl.classList.contains('show')\n    }\n\n    setAll (selector, text) {\n      this.querySelectorAll(selector).forEach(elem => { elem.textContent = text })\n    }\n\n    announce (message) {\n      if (this.announceEl) this.announceEl.textContent = message\n    }\n\n    showError (message) {\n      if (!this.errorEl) return\n      this.errorEl.textContent = message\n      this.errorEl.hidden = false\n    }\n\n    hideError () {\n      if (this.errorEl) this.errorEl.hidden = true\n    }\n\n    onCartError (detail) {\n      if (!this.isOpen) return\n      let message = \"L'ajout au panier a \u00E9chou\u00E9.\"\n      if (detail && typeof detail.description === 'string' && detail.description) {\n        message = detail.description\n      } else if (detail && typeof detail.message === 'string' && detail.message) {\n        message = detail.message\n      }\n      this.showError(message)\n\n      // Un /cart/change.js refus\u00E9 pendant une rafale du stepper laisse\n      // l'affichage optimiste en avance sur le panier r\u00E9el : on recale.\n      if (this.qtyTarget != null) {\n        clearTimeout(this.qtyTimer)\n        this.qtyTarget = null\n        this.refreshCart()\n      }\n    }\n\n    async onCartAdded (detail) {\n      if (!this.modalEl || !window.bootstrap || !detail || typeof detail !== 'object') return\n\n      // R\u00E9ponse /cart/add.js : objet ligne pour un ajout simple,\n      // { items: [...] } pour un ajout multiple (kits : le kit en t\u00EAte).\n      const items = (Array.isArray(detail.items) ? detail.items : [detail])\n        .filter(it => it && it.id)\n      const item = items[0]\n      if (!item) return\n\n      if (this.isOpen) {\n        // Ajout d\u00E9clench\u00E9 depuis le popup lui-m\u00EAme (bouton \u00AB + \u00BB) : on met \u00E0\n        // jour totaux/barre et l'\u00E9tat du bouton sans reconstruire le contenu.\n        this.hideError()\n        items.forEach(it => this.markAdded(it.variant_id || it.id))\n        this.refreshCart()\n        return\n      }\n\n      this.showFor(item, items.slice(1))\n    }\n\n    showFor (item, extras = []) {\n      const modal = window.bootstrap.Modal.getOrCreateInstance(this.modalEl)\n\n      // Modal en cours de FERMETURE (transition avec _isShown retomb\u00E9) :\n      // Bootstrap ignorerait show() \u2014 on rejoue l'ouverture sur\n      // hidden.bs.modal. En cours d'OUVERTURE (deux ajouts rapproch\u00E9s depuis\n      // une collection), on continue : le contenu bascule sur le nouveau\n      // produit et le show() redondant est sans effet.\n      if (modal._isTransitioning && !modal._isShown) {\n        this.pendingItem = { item, extras }\n        return\n      }\n\n      // Nouveau produit affich\u00E9 : la rafale du stepper du pr\u00E9c\u00E9dent est caduque\n      clearTimeout(this.qtyTimer)\n      this.qtyTarget = null\n      this.lastCart = null\n\n      this.line = {\n        key: item.key || null,\n        variantId: item.variant_id || item.id,\n        productId: item.product_id != null ? String(item.product_id) : null,\n        quantity: item.quantity || 1,\n        minQty: 1,\n        compareAtUnit: 0,\n        unitPrice: item.final_price != null ? item.final_price : (item.price != null ? item.price : null)\n      }\n\n      // Produit ajout\u00E9 (donn\u00E9es de la r\u00E9ponse /cart/add.js)\n      this.setAll('[data-cap-title]', item.product_title || item.title || '')\n\n      this.querySelectorAll('[data-cap-url]').forEach(link => {\n        if (item.url) link.setAttribute('href', item.url)\n      })\n\n      const vendorEl = this.querySelector('[data-cap-vendor]')\n      if (vendorEl) {\n        const vendor = (item.vendor || '').toUpperCase() === 'EURION ENERGY' ? '' : item.vendor\n        vendorEl.textContent = vendor || ''\n        vendorEl.hidden = !vendor\n      }\n\n      const imgEl = this.querySelector('[data-cap-image]')\n      if (imgEl) {\n        if (item.image) {\n          imgEl.src = resizeImageUrl(item.image, 152)\n          imgEl.alt = ''\n          imgEl.parentElement.hidden = false\n        } else {\n          imgEl.removeAttribute('src')\n          imgEl.parentElement.hidden = true\n        }\n      }\n\n      this.setAll('[data-cap-qty]', String(this.line.quantity))\n      this.setAll('[data-cap-price]', formatMoney(item.final_line_price != null ? item.final_line_price : item.line_price))\n\n      const compareEl = this.querySelector('[data-cap-compare]')\n      if (compareEl) compareEl.hidden = true\n\n      this.renderExtras(item, extras)\n\n      this.hideError()\n      this.announce('')\n      this.updateQtyButtons()\n\n      // Upsell : \u00E9tat de chargement, panneau visible par d\u00E9faut ; la hauteur\n      // mesur\u00E9e pour le produit pr\u00E9c\u00E9dent ne s'applique pas aux squelettes\n      if (this.upsellItemsEl) {\n        this.upsellItemsEl.innerHTML = this.skeletonHTML\n        this.upsellItemsEl.style.removeProperty('--cap-upsell-3-rows')\n        this.upsellItemsEl.classList.remove('cap-upsell-draggable')\n      }\n      if (this.contentEl) this.contentEl.classList.remove('cap-no-upsell')\n\n      modal.show()\n\n      this.refreshCart()\n      this.loadSection(item)\n    }\n\n    async loadSection (item) {\n      const token = ++this.sectionToken\n\n      try {\n        const url = new URL(item.url, window.location.origin)\n        url.search = ''\n        url.searchParams.set('variant', String(item.variant_id || item.id))\n        url.searchParams.set('section_id', this.sectionId)\n\n        // M\u00EAme filet que refreshCart : un \u00E9chec ponctuel ne doit pas priver le\n        // popup de son panneau de produits compl\u00E9mentaires. Le rendu de section\n        // (?section_id=\u2026) renvoie des 503 passagers sur cette boutique, parfois\n        // au-del\u00E0 d'une seconde : on insiste donc plus longtemps que refreshCart,\n        // le squelette de chargement reste affich\u00E9 entre les essais.\n        let html = null\n        for (const delay of [0, 600, 1500, 3000]) {\n          if (delay) await new Promise(resolve => setTimeout(resolve, delay))\n          if (token !== this.sectionToken) return\n          try {\n            const response = await fetch(url.toString())\n            if (!response.ok) continue\n            html = await response.text()\n            break\n          } catch (err) {\n            // r\u00E9seau : nouvel essai\n          }\n        }\n        if (token !== this.sectionToken) return\n        if (html === null) throw new Error('section indisponible')\n\n        const doc = new DOMParser().parseFromString(html, 'text/html')\n\n        // Prix barr\u00E9 + quantit\u00E9 minimale de la variante ajout\u00E9e\n        const meta = doc.querySelector('[data-cap-meta]')\n        if (meta && this.line) {\n          const compareAt = parseInt(meta.dataset.compareAt, 10) || 0\n          const unitPrice = parseInt(meta.dataset.price, 10) || 0\n          if (compareAt > unitPrice) {\n            this.line.compareAtUnit = compareAt\n            this.renderCompare()\n          }\n\n          let minQty = Math.max(1, parseInt(meta.dataset.minQuantity, 10) || 1)\n          if (typeof window.mdsParetoMinQuantity === 'function') {\n            minQty = Math.max(minQty, window.mdsParetoMinQuantity(meta.dataset.productId, meta.dataset.collectionIds))\n          }\n          this.line.minQty = minQty\n          this.updateQtyButtons()\n        }\n\n        // Produits compl\u00E9mentaires\n        const items = doc.querySelector('[data-cap-upsell-items]')\n        if (items && items.children.length > 0 && this.upsellItemsEl) {\n          this.upsellItemsEl.innerHTML = items.innerHTML\n          this.sizeUpsellList()\n        } else if (this.contentEl) {\n          this.contentEl.classList.add('cap-no-upsell')\n        }\n      } catch (err) {\n        if (token === this.sectionToken && this.contentEl) {\n          this.contentEl.classList.add('cap-no-upsell')\n        }\n      }\n    }\n\n    // Fen\u00EAtre de 3 produits compl\u00E9mentaires visibles : mesure la hauteur des\n    // 3 premi\u00E8res lignes et l'expose en variable CSS, utilis\u00E9e comme\n    // max-height par les listes verticales (mobile et desktop). La tablette\n    // d\u00E9file horizontalement et ignore la variable (max-height: none). Avec\n    // 3 produits ou moins la liste tient en entier : pas de limite.\n    sizeUpsellList () {\n      if (!this.upsellItemsEl) return\n      this.upsellItemsEl.style.removeProperty('--cap-upsell-3-rows')\n      // curseur de prise (tablette) seulement quand la liste d\u00E9borde vraiment\n      this.upsellItemsEl.classList.toggle(\n        'cap-upsell-draggable',\n        this.upsellItemsEl.scrollWidth > this.upsellItemsEl.clientWidth + 1\n      )\n      const items = this.upsellItemsEl.querySelectorAll('.cap-upsell-item')\n      if (items.length <= 3) return\n      const height = items[2].getBoundingClientRect().bottom -\n        items[0].getBoundingClientRect().top\n      if (height > 0) {\n        this.upsellItemsEl.style.setProperty('--cap-upsell-3-rows', Math.ceil(height) + 'px')\n      }\n    }\n\n    renderCompare () {\n      const compareEl = this.querySelector('[data-cap-compare]')\n      if (!compareEl || !this.line) return\n      if (this.line.compareAtUnit > 0) {\n        compareEl.textContent = formatMoney(this.line.compareAtUnit * this.line.quantity)\n        compareEl.hidden = false\n      } else {\n        compareEl.hidden = true\n      }\n    }\n\n    // Autres produits du m\u00EAme ajout (kits) : une ligne compacte chacun \u2014\n    // vignette, titre, variante et quantit\u00E9, prix de ligne. Le produit\n    // principal n'y figure pas, et une variante envoy\u00E9e deux fois (fusionn\u00E9e\n    // en une seule ligne par Shopify) n'appara\u00EEt qu'une fois. Liste vide :\n    // bloc masqu\u00E9 et titre du popup au singulier.\n    renderExtras (main, extras) {\n      this.extras = []\n      const seen = new Set([main.key || String(main.variant_id || main.id)])\n      extras.forEach(it => {\n        const id = it.key || String(it.variant_id || it.id)\n        if (seen.has(id)) return\n        seen.add(id)\n        this.extras.push({ key: it.key || null, variantId: it.variant_id || it.id, els: null, item: it })\n      })\n\n      const plural = this.extras.length > 0\n      this.titleEls.forEach(el => {\n        el.textContent = !plural ? el.dataset.singular\n          : el.classList.contains('cap-title-full') ? 'Produits ajout\u00E9s \u00E0 votre panier\u00A0!' : 'Ajout\u00E9s au panier\u00A0!'\n      })\n\n      if (!this.extrasEl || !this.extrasListEl) return\n      if (this.extrasObserver) this.extrasObserver.disconnect()\n      this.extrasListEl.textContent = ''\n      this.extrasListEl.scrollTop = 0\n      this.extrasEl.hidden = !plural\n      this.sizeExtrasList()\n      if (!plural) return\n\n      if (this.extrasTitleEl) {\n        this.extrasTitleEl.textContent = this.extras.length > 1\n          ? '\u00C9galement ajout\u00E9s au panier (' + this.extras.length + ')'\n          : '\u00C9galement ajout\u00E9 au panier'\n      }\n\n      this.extras.forEach(extra => {\n        const it = extra.item\n        const row = document.createElement('li')\n        row.className = 'cap-extra'\n\n        const media = document.createElement('span')\n        media.className = 'cap-extra-img'\n        if (it.image) {\n          const img = document.createElement('img')\n          img.src = resizeImageUrl(it.image, 80)\n          img.alt = ''\n          img.width = 40\n          img.height = 40\n          img.decoding = 'async'\n          media.appendChild(img)\n        }\n\n        const info = document.createElement('span')\n        info.className = 'cap-extra-info'\n        const title = document.createElement(it.url ? 'a' : 'span')\n        title.className = 'cap-extra-title'\n        if (it.url) title.href = it.url\n        title.textContent = it.product_title || it.title || ''\n        const meta = document.createElement('span')\n        meta.className = 'cap-extra-meta'\n        info.append(title, meta)\n\n        const price = document.createElement('span')\n        price.className = 'cap-extra-price'\n        const amount = document.createElement('strong')\n        const compare = document.createElement('s')\n        price.append(amount, compare)\n\n        row.append(media, info, price)\n        this.extrasListEl.appendChild(row)\n        extra.els = { meta, amount, compare }\n        this.renderExtraLine(extra, it)\n      })\n\n      const firstRow = this.extrasListEl.firstElementChild\n      if (this.extrasObserver && firstRow && this.extras.length > 3) {\n        this.extrasObserver.observe(firstRow)\n      }\n      this.sizeExtrasList()\n    }\n\n    // Plus de 3 lignes : hauteur limit\u00E9e au milieu de la 4e, la ligne coup\u00E9e\n    // signale le d\u00E9filement. Mesure en offsetTop/offsetHeight (rep\u00E8re de la\n    // liste, comme max-height \u2014 insensible au zoom desktop de la page) ;\n    // sans mise en page (modal ferm\u00E9), on attend le ResizeObserver.\n    sizeExtrasList () {\n      const list = this.extrasListEl\n      if (!list) return\n      const fourth = list.children[3]\n      if (!fourth || !fourth.offsetHeight) {\n        if (!fourth) list.style.removeProperty('--cap-extras-max')\n        return\n      }\n      const borders = list.offsetHeight - list.clientHeight\n      const height = fourth.offsetTop + Math.round(fourth.offsetHeight / 2) + borders\n      list.style.setProperty('--cap-extras-max', height + 'px')\n    }\n\n    renderExtraLine (extra, line) {\n      if (!extra.els) return\n      const variant = line.variant_title && line.variant_title !== 'Default Title' ? line.variant_title : ''\n      extra.els.meta.textContent = (variant ? variant + ' \u00B7 ' : '') + 'Qt\u00E9\u00A0: ' + line.quantity\n\n      const final = line.final_line_price != null ? line.final_line_price : line.line_price\n      extra.els.amount.textContent = formatMoney(final)\n      // Remise Shopify sur la ligne (ex. batterie suppl\u00E9mentaire en quantit\u00E9)\n      const original = line.original_line_price\n      extra.els.compare.hidden = !(original > final)\n      extra.els.compare.textContent = original > final ? formatMoney(original) : ''\n    }\n\n    // Quantit\u00E9s et prix des lignes \u00AB \u00C9galement ajout\u00E9s \u00BB d'apr\u00E8s le panier lu\n    // (remises calcul\u00E9es, quantit\u00E9 d\u00E9j\u00E0 pr\u00E9sente avant l'ajout comprise).\n    syncExtras (cart) {\n      if (!this.extras.length || !Array.isArray(cart.items)) return\n      this.extras.forEach(extra => {\n        const line = cart.items.find(it => (extra.key && it.key === extra.key) ||\n          (!extra.key && it.variant_id === extra.variantId))\n        if (!line) return\n        extra.key = line.key\n        this.renderExtraLine(extra, line)\n      })\n    }\n\n    // La lecture /cart.js qui suit imm\u00E9diatement un ajout \u00E9choue parfois\n    // (r\u00E9ponse en retard de l'\u00E9criture, non-JSON ou hoquet r\u00E9seau \u2014 constat\u00E9\n    // sur l'ajout rapide depuis les pages collection) : sans nouvel essai le\n    // popup resterait fig\u00E9 sur \u00AB Total \u00B7 0 article(s) \u00BB et la barre de\n    // livraison vide. On retente donc bri\u00E8vement ; si le panier lu ne\n    // contient pas encore la ligne ajout\u00E9e, il est en retard et on retente\n    // aussi (le dernier \u00E9tat lu est appliqu\u00E9 en dernier recours).\n    async refreshCart () {\n      const token = ++this.cartToken\n      const cartUrl = (window.Shopify && window.Shopify.routes && window.Shopify.routes.cart_url) || '/cart'\n      let cart = null\n\n      for (const delay of [0, 400, 1100]) {\n        if (delay) await new Promise(resolve => setTimeout(resolve, delay))\n        if (token !== this.cartToken) return\n\n        try {\n          const response = await fetch(cartUrl + '.js', {\n            cache: 'no-store',\n            headers: { Accept: 'application/json' }\n          })\n          if (!response.ok) continue\n          cart = await response.json()\n          if (this.hasLine(cart)) break\n        } catch (err) {\n          // r\u00E9seau ou r\u00E9ponse non-JSON : nouvel essai\n        }\n      }\n\n      if (token !== this.cartToken || !cart) return\n      this.syncFromCart(cart)\n    }\n\n    hasLine (cart) {\n      if (!this.line) return true\n      return Boolean(this.findLine(cart))\n    }\n\n    findLine (cart) {\n      if (!this.line || !Array.isArray(cart.items)) return null\n      return cart.items.find(it => (this.line.key && it.key === this.line.key) ||\n        (!this.line.key && it.variant_id === this.line.variantId)) || null\n    }\n\n    // Met \u00E0 jour barre de livraison, total, compteur d'articles et la ligne du\n    // produit ajout\u00E9 \u00E0 partir d'un objet panier complet (/cart.js ou r\u00E9ponse\n    // de /cart/change.js).\n    syncFromCart (cart) {\n      this.lastCart = cart\n\n      const line = this.findLine(cart)\n      if (line) {\n        this.line.key = line.key\n        this.line.unitPrice = line.final_price != null ? line.final_price : line.price\n      }\n\n      // Ind\u00E9pendantes du stepper : toujours \u00E0 jour, rafale en cours ou non\n      this.syncExtras(cart)\n\n      // Rafale de clics du stepper en cours : cet \u00E9tat serveur est d\u00E9j\u00E0\n      // d\u00E9pass\u00E9, l'affichage optimiste prime \u2014 flushQty rejouera le dernier\n      // panier re\u00E7u (lastCart) une fois la rafale r\u00E9ellement envoy\u00E9e.\n      if (this.qtyTarget != null && (!line || line.quantity !== this.qtyTarget)) {\n        return\n      }\n\n      if (typeof cart.total_price === 'number') this.updateShipping(this.shippingTotal(cart))\n      if (typeof cart.item_count === 'number') this.setAll('[data-cap-count]', String(cart.item_count))\n      if (typeof cart.total_price === 'number') this.setAll('[data-cap-total]', formatMoney(this.displayTotal(cart)))\n      this.renderSpecialVehicle(cart)\n\n      if (line) {\n        this.line.quantity = line.quantity\n        this.setAll('[data-cap-qty]', String(line.quantity))\n        this.setAll('[data-cap-price]', formatMoney(line.final_line_price != null ? line.final_line_price : line.line_price))\n        this.renderCompare()\n      }\n\n      this.updateQtyButtons()\n    }\n\n    // Prix de la ligne du produit-service \u00AB v\u00E9hicule adapt\u00E9 \u00BB dans le panier\n    // (0 s'il n'y est pas).\n    specialVehicleTotal (cart) {\n      let total = 0\n      if (Array.isArray(cart.items)) {\n        cart.items.forEach(item => {\n          if (item.handle === SPECIAL_VEHICLE_HANDLE) {\n            total += item.final_line_price != null ? item.final_line_price : item.line_price\n          }\n        })\n      }\n      return total\n    }\n\n    // Total affich\u00E9 (data-cap-total) : panier hors produit-service \u00AB v\u00E9hicule\n    // adapt\u00E9 \u00BB, qui a sa propre ligne \u00AB Service de livraison sp\u00E9cial \u00BB.\n    displayTotal (cart) {\n      return Math.max(0, cart.total_price - this.specialVehicleTotal(cart))\n    }\n\n    isShippingExcluded (productId) {\n      return productId != null && this.excludedProductIds.has(String(productId))\n    }\n\n    // Prix des lignes hors offre livraison offerte (carports).\n    excludedTotal (cart) {\n      let total = 0\n      if (Array.isArray(cart.items)) {\n        cart.items.forEach(item => {\n          if (this.isShippingExcluded(item.product_id)) {\n            total += item.final_line_price != null ? item.final_line_price : item.line_price\n          }\n        })\n      }\n      return total\n    }\n\n    // Total retenu pour la barre \u00AB livraison offerte \u00BB : ni le service\n    // \u00AB v\u00E9hicule adapt\u00E9 \u00BB (un suppl\u00E9ment de livraison ne doit pas rapprocher\n    // de la livraison offerte) ni les carports (hors offre).\n    shippingTotal (cart) {\n      return Math.max(0, this.displayTotal(cart) - this.excludedTotal(cart))\n    }\n\n    // Affiche/masque la ligne \u00AB Service de livraison sp\u00E9cial \u00BB du bloc total\n    // selon la pr\u00E9sence du produit-service dans le panier.\n    renderSpecialVehicle (cart) {\n      const wrap = this.querySelector('[data-cap-special-vehicle]')\n      if (!wrap) return\n      const total = this.specialVehicleTotal(cart)\n      wrap.hidden = total <= 0\n      if (total > 0) this.setAll('[data-cap-special-vehicle-amount]', formatMoney(total))\n    }\n\n    updateShipping (totalPrice) {\n      if (!this.threshold) return\n\n      const pct = Math.min(100, (totalPrice / this.threshold) * 100)\n      const remaining = Math.max(0, this.threshold - totalPrice)\n      const reached = totalPrice >= this.threshold\n\n      const bar = this.querySelector('[data-cap-bar]')\n      if (bar) bar.style.width = pct.toFixed(1) + '%'\n\n      const progress = this.querySelector('.cap-shipping-bar')\n      if (progress) progress.setAttribute('aria-valuenow', pct.toFixed(0))\n\n      const remainingWrap = this.querySelector('[data-cap-shipping-remaining]')\n      const reachedWrap = this.querySelector('[data-cap-shipping-reached]')\n      if (remainingWrap) remainingWrap.hidden = reached\n      if (reachedWrap) reachedWrap.hidden = !reached\n\n      this.setAll('[data-cap-remaining]', formatMoney(remaining))\n    }\n\n    updateQtyButtons () {\n      const minusBtn = this.querySelector('[data-cap-qty-minus]')\n      const plusBtn = this.querySelector('[data-cap-qty-plus]')\n      const min = this.line ? Math.max(1, this.line.minQty || 1) : 1\n\n      // Pas de verrou pendant la requ\u00EAte : le stepper est optimiste, les\n      // clics s'encha\u00EEnent et la rafale est regroup\u00E9e par changeQty.\n      if (minusBtn) minusBtn.disabled = !this.line || this.line.quantity <= min\n      if (plusBtn) plusBtn.disabled = !this.line\n    }\n\n    // Chaque clic met \u00E0 jour l'affichage imm\u00E9diatement (quantit\u00E9, prix de\n    // ligne, total et barre estim\u00E9s) ; l'envoi est regroup\u00E9 \u2014 un seul\n    // /cart/change.js, 350 ms apr\u00E8s le dernier clic de la rafale. Attendre\n    // un aller-retour serveur par clic (avec re-rendu de sections) rendait\n    // le stepper poussif.\n    changeQty (delta) {\n      if (!this.line) return\n\n      const min = Math.max(1, this.line.minQty || 1)\n      const target = Math.max(min, this.line.quantity + delta)\n      if (target === this.line.quantity) return\n\n      this.hideError()\n      this.line.quantity = target\n      this.qtyTarget = target\n      this.setAll('[data-cap-qty]', String(target))\n      if (this.line.unitPrice != null) {\n        this.setAll('[data-cap-price]', formatMoney(this.line.unitPrice * target))\n      }\n      this.renderCompare()\n      this.renderOptimisticTotals(target)\n      this.updateQtyButtons()\n\n      clearTimeout(this.qtyTimer)\n      this.qtyTimer = setTimeout(() => this.flushQty(), 350)\n    }\n\n    // Estime total, compteur d'articles et barre de livraison sans attendre\n    // le serveur (prix unitaire \u00D7 \u00E9cart de quantit\u00E9 appliqu\u00E9 au dernier\n    // panier connu) ; la r\u00E9ponse /cart/change.js recale ensuite les valeurs\n    // exactes (remises, plafond de stock\u2026).\n    renderOptimisticTotals (target) {\n      const cart = this.lastCart\n      if (!cart || !this.line || this.line.unitPrice == null) return\n      if (typeof cart.total_price !== 'number') return\n\n      const line = this.findLine(cart)\n      const diff = target - (line ? line.quantity : 0)\n      const delta = this.line.unitPrice * diff\n      // Un carport ajout\u00E9 ne fait pas avancer la barre, seulement le total\n      const shippingDelta = this.isShippingExcluded(this.line.productId) ? 0 : delta\n      this.updateShipping(Math.max(0, this.shippingTotal(cart) + shippingDelta))\n      this.setAll('[data-cap-total]', formatMoney(Math.max(0, this.displayTotal(cart) + delta)))\n      if (typeof cart.item_count === 'number') {\n        this.setAll('[data-cap-count]', String(Math.max(0, cart.item_count + diff)))\n      }\n    }\n\n    // Envoie la derni\u00E8re quantit\u00E9 vis\u00E9e par la rafale. Une seule requ\u00EAte en\n    // vol \u00E0 la fois ; si de nouveaux clics arrivent entre-temps, la fin de\n    // celle-ci en d\u00E9clenche une autre avec la nouvelle cible.\n    async flushQty () {\n      if (this.qtyBusy || this.qtyTarget == null || !this.line) return\n\n      const target = this.qtyTarget\n      const key = this.line.key || String(this.line.variantId)\n      this.qtyBusy = true\n\n      try {\n        const cartEl = document.querySelector('cart-container')\n\n        if (cartEl && typeof cartEl.change === 'function') {\n          // Dispatch kt.cart.changed (r\u00E9ponse = panier complet) \u2192 syncFromCart\n          // via le listener ; badge compteur et tiroir resynchronis\u00E9s.\n          await cartEl.change(key, target)\n        } else {\n          const changeUrl = (window.Shopify && window.Shopify.routes && window.Shopify.routes.cart_change_url) || '/cart/change'\n          const response = await fetch(changeUrl + '.js', {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ id: key, quantity: target })\n          })\n          const data = await response.json()\n          if (response.ok) {\n            // R\u00E9ponse plus fra\u00EEche que toute relecture /cart.js en vol\n            this.cartToken++\n            this.syncFromCart(data)\n          } else {\n            this.onCartError(data)\n          }\n        }\n\n        if (this.line) this.announce('Quantit\u00E9 mise \u00E0 jour : ' + this.line.quantity)\n      } catch (err) {\n        console.error('MDS popup panier :', err)\n        this.showError(\"La quantit\u00E9 n'a pas pu \u00EAtre mise \u00E0 jour. Veuillez r\u00E9essayer.\")\n      } finally {\n        this.qtyBusy = false\n        if (this.qtyTarget != null && this.qtyTarget !== target) {\n          // De nouveaux clics pendant la requ\u00EAte : on envoie la nouvelle cible\n          this.flushQty()\n        } else if (this.qtyTarget != null) {\n          this.qtyTarget = null\n          // Recale l'affichage sur le dernier panier re\u00E7u (quantit\u00E9 plafonn\u00E9e\n          // par le stock, requ\u00EAte \u00E9chou\u00E9e, relecture arriv\u00E9e pendant la\n          // rafale\u2026).\n          if (this.lastCart) this.syncFromCart(this.lastCart)\n        }\n      }\n    }\n\n    markAdded (variantId) {\n      if (!variantId) return\n      this.querySelectorAll('.cap-upsell-add[data-variant-id=\"' + variantId + '\"]').forEach(btn => {\n        btn.classList.add('is-added')\n        const title = btn.dataset.productTitle || ''\n        if (title) btn.setAttribute('aria-label', 'Ajout\u00E9 au panier : ' + title)\n        this.announce(title ? '\u00AB ' + title + ' \u00BB a \u00E9t\u00E9 ajout\u00E9 au panier.' : 'Produit ajout\u00E9 au panier.')\n      })\n    }\n  }\n\n  if (!customElements.get('cart-added-popup')) {\n    customElements.define('cart-added-popup', CartAddedPopup)\n  }\n})()\n"],
  "mappings": "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",
  "names": []
}
