{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/personalizer-cart-groups.js?orion=20260805-1"],
  "sourcesContent": ["\uFEFF(function () {\r\n  // ---------------------------------------------------------------------------\r\n  // Cart groups UI (page /cart)\r\n  // ---------------------------------------------------------------------------\r\n  // Ce module remplace visuellement le tableau panier Shopify pour les produits\r\n  // personnalis\u00C3\u00A9s:\r\n  // - regroupe les lignes par `_personalization_group`\r\n  // - masque les lignes natives + lignes de frais techniques\r\n  // - g\u00C3\u00A8re les modales \"quantit\u00C3\u00A9s\" / \"suppression\"\r\n  // - synchronise le r\u00C3\u00A9capitulatif de commande (colonne droite)\r\n  // ---------------------------------------------------------------------------\r\n  if (window.__orionPersonalizerCartGroupsInitialized) {\r\n    return;\r\n  }\r\n  window.__orionPersonalizerCartGroupsInitialized = true;\r\n\r\n  var rootSelector = '#personalizer-cart-groups';\r\n  var currentGroupsById = {};\r\n  var modal = null;\r\n  var deleteConfirmModal = null;\r\n  var imagePreviewModal = null;\r\n  var pendingUpdate = false;\r\n  var renderTimer = null;\r\n  var observerBound = false;\r\n  var domObserver = null;\r\n  var observerHost = null;\r\n  var bodyScrollLockCount = 0;\r\n  var bodyScrollPreviousPaddingRight = '';\r\n  var BUSY_FLAG_KEY = 'orion_personalizer_cart_busy';\r\n  var EMPTY_REDIRECT_FLAG_KEY = 'orion_personalizer_cart_empty_reload';\r\n  var GRAPHIC_EDIT_KEY = 'orion_personalizer_cart_edit';\r\n  var GROUP_PREVIEWS_KEY = 'orion_personalizer_cart_group_previews';\r\n  var VARIANT_STOCK_CACHE_KEY = 'orion_personalizer_variant_stock_cache';\r\n  var productCatalogCache = {};\r\n  var variantDetailsCache = {};\r\n  var productPageVariantStockCache = {};\r\n  var cartJsonCache = null;\r\n  var groupsHomeParent = null;\r\n  var groupsHomeNextSibling = null;\r\n  var viewportSyncTimer = null;\r\n  var busyOverlayFailsafeTimer = null;\r\n  var deferBusyOverlayRelease = false;\r\n  var initialCartSyncPromise = null;\r\n\r\n  // Prevent continuous rerenders from replacing clickable DOM outside modal flows.\r\n  // Auto-refresh is only useful during a save/delete validation.\r\n  function needsCartGroupsRecovery() {\r\n    var table = document.querySelector('#main-cart-items .cart-items');\r\n    var container = document.querySelector(rootSelector);\r\n    if (!table || !container) return false;\r\n    var tableVisible = !table.hidden && table.style.display !== 'none';\r\n    if (!tableVisible) return false;\r\n    var hasRenderedGroups = !!container.querySelector('.personalizer-cart-group');\r\n    return !hasRenderedGroups || container.hidden;\r\n  }\r\n\r\n  function shouldAutoRefreshCartGroups() {\r\n    return !!pendingUpdate || needsCartGroupsRecovery();\r\n  }\r\n\r\n  function routesRoot() {\r\n    return window.Shopify && window.Shopify.routes && typeof window.Shopify.routes.root === 'string'\r\n      ? window.Shopify.routes.root\r\n      : '/';\r\n  }\r\n\r\n  function money(cents) {\r\n    var amount = (Number(cents) || 0) / 100;\r\n    var code = (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'EUR';\r\n    try {\r\n      return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: code }).format(amount);\r\n    } catch (error) {\r\n      return amount.toFixed(2) + ' \u00E2\u201A\u00AC';\r\n    }\r\n  }\r\n\r\n  function moneyHt(cents) {\r\n    return money(cents) + ' HT';\r\n  }\r\n\r\n  function moneyTtc(cents) {\r\n    return money(cents) + ' TTC';\r\n  }\r\n\r\n  function ensureBusyOverlayNode() {\r\n    var overlay = document.getElementById('personalizer-cart-busy');\r\n    if (!overlay) {\r\n      overlay = document.createElement('div');\r\n      overlay.id = 'personalizer-cart-busy';\r\n      overlay.className = 'personalizer-cart-busy';\r\n      overlay.hidden = true;\r\n      overlay.innerHTML = '<div class=\"personalizer-cart-busy__box\">Mise a jour du panier...</div>';\r\n    }\r\n    if (overlay.parentElement !== document.body) {\r\n      document.body.appendChild(overlay);\r\n    }\r\n    return overlay;\r\n  }\r\n\r\n  function setBusyOverlay(visible, persistAcrossReload) {\r\n    var overlay = ensureBusyOverlayNode();\r\n    if (overlay) overlay.hidden = !visible;\r\n    if (busyOverlayFailsafeTimer) {\r\n      window.clearTimeout(busyOverlayFailsafeTimer);\r\n      busyOverlayFailsafeTimer = null;\r\n    }\r\n    if (persistAcrossReload) {\r\n      try { window.sessionStorage.setItem(BUSY_FLAG_KEY, '1'); } catch (error) {}\r\n    } else {\r\n      try { window.sessionStorage.removeItem(BUSY_FLAG_KEY); } catch (error) {}\r\n    }\r\n    if (visible) {\r\n      busyOverlayFailsafeTimer = window.setTimeout(function () {\r\n        busyOverlayFailsafeTimer = null;\r\n        if (pendingUpdate) return;\r\n        var staleOverlay = document.getElementById('personalizer-cart-busy');\r\n        if (staleOverlay) staleOverlay.hidden = true;\r\n        try { window.sessionStorage.removeItem(BUSY_FLAG_KEY); } catch (error) {}\r\n      }, 8000);\r\n    }\r\n  }\r\n\r\n  function restoreBusyOverlayIfNeeded() {\r\n    try {\r\n      if (window.sessionStorage.getItem(BUSY_FLAG_KEY) === '1') {\r\n        setBusyOverlay(true, false);\r\n      }\r\n    } catch (error) {}\r\n  }\r\n\r\n  function escapeHtml(value) {\r\n    return String(value || '')\r\n      .replace(/&/g, '&amp;')\r\n      .replace(/</g, '&lt;')\r\n      .replace(/>/g, '&gt;')\r\n      .replace(/\"/g, '&quot;')\r\n      .replace(/'/g, '&#39;');\r\n  }\r\n\r\n  function readStoredPreviewMap(storage) {\r\n    if (!storage) return {};\r\n    try {\r\n      var raw = storage.getItem(GROUP_PREVIEWS_KEY) || '{}';\r\n      var parsed = JSON.parse(raw);\r\n      return parsed && typeof parsed === 'object' ? parsed : {};\r\n    } catch (error) {\r\n      return {};\r\n    }\r\n  }\r\n\r\n  function writeStoredPreviewMap(storage, map) {\r\n    if (!storage) return;\r\n    try {\r\n      storage.setItem(GROUP_PREVIEWS_KEY, JSON.stringify(map || {}));\r\n    } catch (error) {}\r\n  }\r\n\r\n  function getStoredGroupPreviewMap() {\r\n    var sessionMap = readStoredPreviewMap(window.sessionStorage);\r\n    var localMap = readStoredPreviewMap(window.localStorage);\r\n    return Object.assign({}, localMap, sessionMap);\r\n  }\r\n\r\n  function getStoredGroupPreviews(groupId) {\n    if (!groupId) return null;\r\n    var map = getStoredGroupPreviewMap();\r\n    var entry = map[String(groupId)];\r\n    if (!entry || typeof entry !== 'object') return null;\r\n    return {\n      front: String(entry.front || ''),\n      back: String(entry.back || ''),\n      labels: {\n        front: String(entry.labels && entry.labels.front || 'Avant'),\n        back: String(entry.labels && entry.labels.back || 'Dos')\n      }\n    };\n  }\n\r\n  function storeGroupPreviews(groupId, previews) {\r\n    if (!groupId || !previews || typeof previews !== 'object') return;\r\n    var map = getStoredGroupPreviewMap();\r\n    map[String(groupId)] = {\n      front: String(previews.front || ''),\n      back: String(previews.back || ''),\n      labels: {\n        front: String(previews.labels && previews.labels.front || 'Avant'),\n        back: String(previews.labels && previews.labels.back || 'Dos')\n      }\n    };\n    writeStoredPreviewMap(window.sessionStorage, map);\r\n    writeStoredPreviewMap(window.localStorage, map);\r\n  }\r\n\r\n  function createPersonalizationGroupId() {\r\n    return 'grp_' + String(Date.now()) + '_' + String(Math.floor(Math.random() * 1000000)).padStart(6, '0');\r\n  }\r\n\r\n  function propsMap(line) {\r\n    var map = {};\r\n    Object.keys((line && line.properties) || {}).forEach(function (key) {\r\n      map[String(key)] = line.properties[key];\r\n    });\r\n    return map;\r\n  }\r\n\r\n  function isFeeLine(line) {\r\n    var props = propsMap(line);\r\n    return String(props._personalization_fee || '').toLowerCase() === 'true';\r\n  }\r\n\r\n  function isGroupedPersonalized(line) {\r\n    var props = propsMap(line);\r\n    return !!(props._custom_group_id || props._personalization_group) && (String(props._personalized_product || '').toLowerCase() === 'true' || isFeeLine(line));\r\n  }\r\n\r\n  function isSpecialPersonalizedLine(line) {\r\n    if (!line) return false;\r\n    if (isGroupedPersonalized(line)) return true;\r\n    var props = propsMap(line);\r\n    if (String(props._personalized_product || '').toLowerCase() === 'true') return true;\r\n    return false;\r\n  }\r\n\r\n  function isStandardVisibleLine(line) {\r\n    return !!line && !isFeeLine(line) && !isSpecialPersonalizedLine(line);\r\n  }\r\n\r\n  function getStandardGroupId(line) {\r\n    if (!line) return '';\r\n    var productId = String(line.product_id || line.id || line.handle || line.product_title || 'product');\r\n    var color = normalizeColorLabel(getLineProductColorValue(line) || 'default');\r\n    return 'std-' + productId + '-' + color.toLowerCase().replace(/\\s+/g, '-');\r\n  }\r\n\r\n  function sizeLabelFromLine(line) {\r\n    if (Array.isArray(line.options_with_values)) {\r\n      var sizeOpt = line.options_with_values.find(function (o) {\r\n        var n = String(o && o.name || '').toLowerCase();\r\n        return n.indexOf('taille') >= 0 || n.indexOf('size') >= 0;\r\n      });\r\n      if (sizeOpt && sizeOpt.value) return String(sizeOpt.value);\r\n    }\r\n    if (Array.isArray(line.options_with_values) && line.options_with_values.length) {\r\n      return String(line.options_with_values[line.options_with_values.length - 1].value || 'Taille');\r\n    }\r\n    if (line.variant_title) return String(line.variant_title).split('/').pop().trim();\r\n    return 'Taille';\r\n  }\r\n\r\n  function normalizeSizeLabelForSort(label) {\r\n    var text = String(label || '').trim();\r\n    if (!text) return '';\r\n    if (text.indexOf('/') >= 0) text = text.split('/').pop().trim();\r\n    return text.toUpperCase().replace(/\\s+/g, '');\r\n  }\r\n\r\n  function sizeSortWeight(label) {\r\n    var normalized = normalizeSizeLabelForSort(label);\r\n    var map = {\r\n      '3XS': 10,\r\n      'XXXS': 10,\r\n      '2XS': 20,\r\n      'XXS': 20,\r\n      'XS': 30,\r\n      'S': 40,\r\n      'M': 50,\r\n      'L': 60,\r\n      'XL': 70,\r\n      '2XL': 80,\r\n      'XXL': 80,\r\n      '3XL': 90,\r\n      'XXXL': 90,\r\n      '4XL': 100,\r\n      'XXXXL': 100,\r\n      '5XL': 110,\r\n      'XXXXXL': 110,\r\n      '6XL': 120\r\n    };\r\n    if (Object.prototype.hasOwnProperty.call(map, normalized)) return map[normalized];\r\n\r\n    var match = normalized.match(/^(\\d+)XL$/);\r\n    if (match) return 60 + (Number(match[1]) * 10);\r\n\r\n    return 1000;\r\n  }\r\n\r\n  function compareSizeLabels(a, b) {\r\n    var aLabel = String(a || '');\r\n    var bLabel = String(b || '');\r\n    var aWeight = sizeSortWeight(aLabel);\r\n    var bWeight = sizeSortWeight(bLabel);\r\n    if (aWeight !== bWeight) return aWeight - bWeight;\r\n    return aLabel.localeCompare(bLabel, 'fr', { numeric: true, sensitivity: 'base' });\r\n  }\r\n\r\n  function getGroupFirstProductEntry(group) {\r\n    return group && Array.isArray(group.productLines) && group.productLines.length ? group.productLines[0] : null;\r\n  }\r\n\r\n  function getGroupLineEntries(group) {\r\n    var entries = [];\r\n    if (group && Array.isArray(group.productLines)) entries = entries.concat(group.productLines);\r\n    if (group && Array.isArray(group.feeLines)) entries = entries.concat(group.feeLines);\r\n    return entries;\r\n  }\r\n\r\n  function getEntryOriginalLinePrice(entry) {\r\n    var line = entry && entry.line ? entry.line : {};\r\n    return Math.max(0, Math.round(Number(line.original_line_price || line.final_line_price || 0) || 0));\r\n  }\r\n\r\n  function getEntryFinalLinePrice(entry) {\r\n    var line = entry && entry.line ? entry.line : {};\r\n    return Math.max(0, Math.round(Number(line.final_line_price || line.original_line_price || 0) || 0));\r\n  }\r\n\r\n  function calculateEntriesPricing(entries) {\r\n    var list = Array.isArray(entries) ? entries : [];\r\n    var baseTotal = list.reduce(function (sum, entry) {\r\n      return sum + getEntryOriginalLinePrice(entry);\r\n    }, 0);\r\n    var finalTotal = list.reduce(function (sum, entry) {\r\n      return sum + getEntryFinalLinePrice(entry);\r\n    }, 0);\r\n    var savings = Math.max(0, baseTotal - finalTotal);\r\n    return {\r\n      baseTotalCents: baseTotal,\r\n      finalTotalCents: finalTotal,\r\n      savingsCents: savings,\r\n      savingsPercent: baseTotal > 0 ? Math.max(0, Math.round((savings / baseTotal) * 100)) : 0\r\n    };\r\n  }\r\n\r\n  function collectGroupDiscountAllocations(group) {\r\n    var totalsByTitle = {};\r\n    var feeEntries = Array.isArray(group && group.feeLines) ? group.feeLines : [];\r\n    getGroupLineEntries(group).forEach(function (entry) {\r\n      var line = entry && entry.line ? entry.line : {};\r\n      var scope = feeEntries.indexOf(entry) >= 0 ? 'fee' : 'product';\r\n      var allocations = Array.isArray(line.line_level_discount_allocations) ? line.line_level_discount_allocations : [];\r\n      allocations.forEach(function (allocation) {\r\n        var title = String(\r\n          allocation &&\r\n          allocation.discount_application &&\r\n          allocation.discount_application.title\r\n            ? allocation.discount_application.title\r\n            : 'Remise automatique'\r\n        ).trim();\r\n        var amount = Math.max(0, Math.round(Number(allocation && allocation.amount) || 0));\r\n        if (!title || !amount) return;\r\n        var allocationKey = scope + '::' + title;\r\n        if (!totalsByTitle[allocationKey]) {\r\n          totalsByTitle[allocationKey] = {\r\n            title: title,\r\n            scope: scope,\r\n            amount: 0\r\n          };\r\n        }\r\n        totalsByTitle[allocationKey].amount += amount;\r\n      });\r\n    });\r\n    return Object.keys(totalsByTitle).map(function (allocationKey) {\r\n      var allocation = totalsByTitle[allocationKey];\r\n      allocation.amount = Math.max(0, Math.round(Number(allocation.amount) || 0));\r\n      return allocation;\r\n    });\r\n  }\r\n\r\n  function splitPersonalizationSummary(summary) {\r\n    var text = String(summary || '').trim();\r\n    if (!text) return [];\r\n    return text\r\n      .split(/\\s+\\|\\s+/)\r\n      .map(function (item) { return String(item || '').trim(); })\r\n      .filter(Boolean);\r\n  }\r\n\r\n  function humanizeTechniqueLabel(value) {\r\n    var text = String(value || '').trim();\r\n    if (!text) return '';\r\n    var lower = text.toLowerCase();\r\n    if (lower.indexOf('brod') >= 0) return 'Broderie';\r\n    if (lower.indexOf('floc') >= 0) return 'Flocage';\r\n    if (lower.indexOf('dtg') >= 0) return 'Impression';\r\n    return text.charAt(0).toUpperCase() + text.slice(1);\r\n  }\r\n\r\n  function parseJsonSafe(value) {\r\n    if (!value) return null;\r\n    try {\r\n      return JSON.parse(value);\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  function getGroupBatPayload(group) {\r\n    var first = getGroupFirstProductEntry(group);\r\n    if (!first || !first.props) return null;\r\n    var saved = window.OrionPersonalizationStore.peek(first.props._personalization_config_id, group.id);\r\n    return saved ? saved.batPayload : parseJsonSafe(first.props._bat_payload || '');\r\n  }\r\n\r\n  function normalizeColorLabel(value) {\r\n    var text = String(value || '').trim();\r\n    if (!text) return '';\r\n    var normalized = text.toLowerCase().replace(/\\s+/g, '');\r\n    if (normalized === '#fff' || normalized === '#ffffff' || normalized === 'rgb(255,255,255)') return 'Blanc';\r\n    if (\r\n      normalized === '#111' ||\r\n      normalized === '#111111' ||\r\n      normalized === '#000' ||\r\n      normalized === '#000000' ||\r\n      normalized === 'rgb(17,17,17)' ||\r\n      normalized === 'rgb(0,0,0)'\r\n    ) return 'Noir';\r\n    if (normalized === '#c82a2a' || normalized === 'rgb(200,42,42)') return 'Rouge';\r\n    return text;\r\n  }\r\n\r\n  function getLineProductColorValue(line) {\r\n    if (!line) return '';\r\n    var sizeLabel = normalizeSizeLabelForSort(sizeLabelFromLine(line));\r\n    if (Array.isArray(line.options_with_values)) {\r\n      for (var i = 0; i < line.options_with_values.length; i += 1) {\r\n        var opt = line.options_with_values[i] || {};\r\n        var optName = String(opt.name || '').toLowerCase();\r\n        if (optName.indexOf('couleur') < 0 && optName.indexOf('color') < 0) continue;\r\n        if (\r\n          optName.indexOf('texte') >= 0 ||\r\n          optName.indexOf('text') >= 0 ||\r\n          optName.indexOf('impression') >= 0 ||\r\n          optName.indexOf('personnal') >= 0\r\n        ) continue;\r\n        return String(opt.value || '').trim();\r\n      }\r\n    }\r\n    var segments = String(line.variant_title || '')\r\n      .split('/')\r\n      .map(function (part) { return String(part || '').trim(); })\r\n      .filter(Boolean);\r\n    for (var j = 0; j < segments.length; j += 1) {\r\n      if (normalizeSizeLabelForSort(segments[j]) === sizeLabel) continue;\r\n      return segments[j];\r\n    }\r\n    return '';\r\n  }\r\n\r\n  function getGroupProductColorLabel(group) {\r\n    var first = getGroupFirstProductEntry(group);\r\n    var lineColor = first && first.line ? getLineProductColorValue(first.line) : '';\r\n    if (lineColor) return normalizeColorLabel(lineColor);\r\n    var batPayload = getGroupBatPayload(group);\r\n    if (batPayload && batPayload.color) return normalizeColorLabel(String(batPayload.color));\r\n    return '';\r\n  }\r\n\r\n  function getGroupTextColorLabel(group) {\r\n    var batPayload = getGroupBatPayload(group);\r\n    var groupedEntries = batPayload && Array.isArray(batPayload.grouped_entries) ? batPayload.grouped_entries : [];\r\n    for (var i = 0; i < groupedEntries.length; i += 1) {\r\n      var entry = groupedEntries[i] || {};\r\n      var textStyles = Array.isArray(entry.textStyles) ? entry.textStyles : [];\r\n      for (var j = 0; j < textStyles.length; j += 1) {\r\n        var style = textStyles[j] || {};\r\n        if (style.colorLabel) return String(style.colorLabel);\r\n        if (style.color) return normalizeColorLabel(style.color);\r\n      }\r\n    }\r\n    return '';\r\n  }\r\n\r\n  function getGroupTechniqueLabel(group) {\r\n    var first = getGroupFirstProductEntry(group);\r\n    var props = (first && first.props) || {};\r\n    return humanizeTechniqueLabel(props._selected_technique || '');\r\n  }\r\n\r\n  function withImageWidth(url, width) {\r\n    var source = String(url || '').trim();\r\n    if (!source) return '';\r\n    var targetWidth = Math.max(1, Math.floor(Number(width) || 0));\r\n    if (!targetWidth) return source;\r\n    return source + (source.indexOf('?') >= 0 ? '&' : '?') + 'width=' + String(targetWidth);\r\n  }\r\n\r\n  function lineImageUrl(line) {\r\n    if (line && line.featured_image && line.featured_image.url) {\r\n      return withImageWidth(line.featured_image.url, 420);\r\n    }\r\n    if (line && line.image) {\r\n      return withImageWidth(line.image, 420);\r\n    }\r\n    return '';\r\n  }\r\n\r\n  function fetchCart() {\r\n    return fetch(routesRoot() + 'cart.js', { headers: { Accept: 'application/json' } }).then(function (response) {\r\n      if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n      return response.json();\r\n    });\r\n  }\r\n\r\n  function fetchProductCatalog(handle, options) {\r\n    var settings = options || {};\r\n    var key = String(handle || '').trim();\r\n    if (!key) return Promise.resolve(null);\r\n    var injectedCatalog =\r\n      window.PersonalizerCartProductCatalog &&\r\n      typeof window.PersonalizerCartProductCatalog === 'object'\r\n        ? window.PersonalizerCartProductCatalog[key]\r\n        : null;\r\n    if (injectedCatalog && Array.isArray(injectedCatalog.variants) && injectedCatalog.variants.length) {\r\n      productCatalogCache[key] = injectedCatalog;\r\n      return Promise.resolve(injectedCatalog);\r\n    }\r\n    if (!settings.forceRefresh && productCatalogCache[key]) return Promise.resolve(productCatalogCache[key]);\r\n    var productUrl = routesRoot() + 'products/' + encodeURIComponent(key) + '.js';\r\n    if (settings.forceRefresh) {\r\n      productUrl += (productUrl.indexOf('?') >= 0 ? '&' : '?') + '_=' + String(Date.now());\r\n    }\r\n    return fetch(productUrl, {\r\n      headers: { Accept: 'application/json' }\r\n    }).then(function (response) {\r\n      if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n      return response.json();\r\n    }).then(function (product) {\r\n      productCatalogCache[key] = product || null;\r\n      return productCatalogCache[key];\r\n    }).catch(function (error) {\r\n      console.error('personalizer-cart-groups product fetch error', error);\r\n      return null;\r\n    });\r\n  }\r\n\r\n  function getLineOptionValue(line, names) {\r\n    var targets = Array.isArray(names) ? names : [];\r\n    if (!Array.isArray(line && line.options_with_values)) return '';\r\n    for (var i = 0; i < line.options_with_values.length; i += 1) {\r\n      var opt = line.options_with_values[i] || {};\r\n      var optName = String(opt.name || '').toLowerCase();\r\n      for (var j = 0; j < targets.length; j += 1) {\r\n        if (optName.indexOf(String(targets[j]).toLowerCase()) >= 0) return String(opt.value || '');\r\n      }\r\n    }\r\n    return '';\r\n  }\r\n\r\n  function getProductOptionIndexByName(product, names) {\r\n    var targets = Array.isArray(names) ? names : [];\r\n    var options = Array.isArray(product && product.options) ? product.options : [];\r\n    for (var i = 0; i < options.length; i += 1) {\r\n      var optionItem = options[i];\r\n      var label = String(\r\n        optionItem && typeof optionItem === 'object'\r\n          ? (optionItem.name || optionItem.label || '')\r\n          : (optionItem || '')\r\n      ).toLowerCase();\r\n      for (var j = 0; j < targets.length; j += 1) {\r\n        if (label.indexOf(String(targets[j]).toLowerCase()) >= 0) return i;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  // Reconstruit les groupes \u00C3\u00A0 partir des line item properties Shopify.\r\n  function groupCart(cart) {\r\n    var groups = {};\r\n    (cart.items || []).forEach(function (line, idx) {\r\n      var props = propsMap(line);\r\n      var isPersonalized = isGroupedPersonalized(line);\r\n      var isStandard = isStandardVisibleLine(line);\r\n      if (!isPersonalized && !isStandard) return;\r\n      var gid = isPersonalized ? String(props._custom_group_id || props._personalization_group || '') : getStandardGroupId(line);\r\n      if (!gid) return;\r\n      if (!groups[gid]) {\r\n        groups[gid] = {\r\n          id: gid,\r\n          kind: isPersonalized ? 'personalized' : 'standard',\r\n          productLines: [],\r\n          feeLines: [],\r\n          totalPriceCents: 0,\r\n          totalQty: 0,\r\n          summary: '',\r\n          title: '',\r\n          image: '',\r\n          previews: null,\r\n          productUrl: '',\r\n        };\r\n      }\r\n      var g = groups[gid];\r\n      var entry = { line: line, lineNumber: idx + 1, lineKey: String(line.key || ''), props: props };\r\n      g.totalPriceCents += Math.max(0, Number(line.final_line_price || line.original_line_price || 0) || 0);\r\n      if (isPersonalized && isFeeLine(line)) {\r\n        g.feeLines.push(entry);\r\n        return;\r\n      }\r\n      g.productLines.push(entry);\r\n      g.totalQty += Math.max(0, Number(line.quantity) || 0);\r\n      if (!g.title) g.title = String(line.product_title || line.title || 'Produit');\r\n      if (!g.image) g.image = lineImageUrl(line);\r\n      if (isPersonalized && !g.previews) g.previews = getStoredGroupPreviews(gid);\r\n      if (!g.productUrl) g.productUrl = String(line.url || '');\r\n      if (isPersonalized && !g.summary && props.personnalisation) g.summary = String(props.personnalisation);\r\n    });\r\n    return Object.values(groups)\r\n      .filter(function (g) { return g.productLines.length > 0; })\r\n      .map(function (g) {\r\n        g.pricing = calculateGroupPricing(g);\r\n        return g;\r\n      });\r\n  }\r\n  // Calcule le \"prix de base\" (avant remise quantit\u00C3\u00A9) et l'\u00C3\u00A9conomie pour l'affichage.\r\n  function calculateGroupPricing(group) {\r\n    var entries = getGroupLineEntries(group);\r\n    var pricingFromLines = calculateEntriesPricing(entries);\r\n    var discountAllocations = collectGroupDiscountAllocations(group);\r\n    var totalQtyFromProducts = 0;\r\n    (group && group.productLines || []).forEach(function (entry) {\r\n      var line = entry && entry.line ? entry.line : {};\r\n      totalQtyFromProducts += Math.max(0, Math.floor(Number(line.quantity) || 0));\r\n    });\r\n\r\n    var quantitiesByLine = {};\r\n    ((group && group.productLines) || []).forEach(function (entry) {\r\n      if (!entry || !entry.line) return;\r\n      var lineNumberKey = String(entry.lineNumber || '');\r\n      var variantKey = 'variant:' + String(entry.line.variant_id || '');\r\n      var qty = Math.max(0, Math.floor(Number(entry.line.quantity) || 0));\r\n      if (lineNumberKey) quantitiesByLine[lineNumberKey] = qty;\r\n      if (variantKey !== 'variant:') quantitiesByLine[variantKey] = qty;\r\n    });\r\n    var preview = calculateGroupPreview(group, quantitiesByLine);\r\n    var productFinalTotal = (((group && group.productLines) && Array.isArray(group.productLines)) ? group.productLines : []).reduce(function (sum, entry) {\r\n      var line = entry && entry.line ? entry.line : {};\r\n      return sum + Math.max(0, Math.round(Number(line.final_line_price || line.original_line_price || 0) || 0));\r\n    }, 0);\r\n    var personalizationFinalTotal = (((group && group.feeLines) && Array.isArray(group.feeLines)) ? group.feeLines : []).reduce(function (sum, entry) {\r\n      var line = entry && entry.line ? entry.line : {};\r\n      return sum + Math.max(0, Math.round(Number(line.final_line_price || line.original_line_price || 0) || 0));\r\n    }, 0);\r\n    var actualFinalTotal = productFinalTotal + personalizationFinalTotal;\r\n    var finalTotalCents = Math.max(0, Math.round(Number(actualFinalTotal) || 0));\r\n    var totalQty = Math.max(1, Math.round(Number(preview && preview.totalQty) || 0));\r\n\r\n    return {\r\n      baseTotalCents: pricingFromLines.baseTotalCents,\r\n      finalTotalCents: finalTotalCents,\r\n      savingsCents: pricingFromLines.savingsCents,\r\n      savingsPercent: pricingFromLines.savingsPercent,\r\n      totalQty: Math.max(1, totalQtyFromProducts || totalQty),\r\n      productTotalCents: productFinalTotal,\r\n      personalizationTotalCents: personalizationFinalTotal,\r\n      personalizationBaseTotalCents: Math.max(0, pricingFromLines.baseTotalCents - productFinalTotal),\r\n      discountAllocations: discountAllocations\r\n    };\r\n  }\r\n  // Cache les lignes produits du tableau Shopify qui sont d\u00C3\u00A9j\u00C3\u00A0 rendues en cartes group\u00C3\u00A9es.\r\n  function hideGroupedRows(groups) {\r\n    document.querySelectorAll('.cart-item.personalization-grouped-line').forEach(function (row) {\r\n      row.classList.remove('personalization-grouped-line');\r\n    });\r\n\r\n    groups.forEach(function (group) {\r\n      group.productLines.forEach(function (entry) {\r\n        var row = document.getElementById('CartItem-' + String(entry.lineNumber));\r\n        if (row) row.classList.add('personalization-grouped-line');\r\n      });\r\n    });\r\n  }\r\n\r\n  function getGroupedCartTotal(cart) {\r\n    return (cart.items || []).reduce(function (sum, line) {\r\n      if (!isGroupedPersonalized(line)) return sum;\r\n      return sum + Math.max(0, Math.round(Number(line.final_line_price || line.original_line_price || 0) || 0));\r\n    }, 0);\r\n  }\r\n\r\n  function cartHasStandardVisibleLines(cart) {\r\n    return (cart.items || []).some(function (line) {\r\n      return isStandardVisibleLine(line);\r\n    });\r\n  }\r\n\r\n  function syncNativeRowsVisibility(cart, groups) {\r\n    var table = document.querySelector('#main-cart-items .cart-items');\r\n    if (!table) return;\r\n    var list = Array.isArray(groups) ? groups : [];\r\n    var hasGroupedCards = list.length > 0;\r\n    table.hidden = hasGroupedCards;\r\n    table.style.display = hasGroupedCards ? 'none' : '';\r\n  }\r\n\r\n  // R\u00C3\u00A9conciliation de centimes:\r\n  // on corrige un \u00C3\u00A9ventuel delta d'arrondi pour que la somme des groupes\r\n  // corresponde exactement au total Shopify.\r\n  function reconcileGroupTotalsWithCart(groups, cartTotalCents) {\r\n    var list = Array.isArray(groups) ? groups : [];\r\n    if (!list.length) return list;\r\n    var target = Math.max(0, Math.round(Number(cartTotalCents) || 0));\r\n    var current = list.reduce(function (sum, g) {\r\n      return sum + Math.max(0, Math.round(Number(g && g.pricing && g.pricing.finalTotalCents) || 0));\r\n    }, 0);\r\n    var delta = target - current;\r\n    if (!delta) return list;\r\n    // Cette r\u00E9conciliation ne doit corriger que de minuscules \u00E9carts d'arrondi.\r\n    // Si le delta d\u00E9passe quelques centimes, c'est un vrai \u00E9cart de lignes panier\r\n    // et il ne faut surtout pas le reporter sur le dernier groupe.\r\n    if (Math.abs(delta) > 2) return list;\r\n\r\n    var lastGroup = list[list.length - 1];\r\n    if (!lastGroup) return list;\r\n    if (!lastGroup.pricing) lastGroup.pricing = calculateGroupPricing(lastGroup);\r\n\r\n    var nextFinal = Math.max(0, Math.round(Number(lastGroup.pricing.finalTotalCents) || 0) + delta);\r\n    lastGroup.pricing.finalTotalCents = nextFinal;\r\n    lastGroup.totalPriceCents = nextFinal;\r\n\r\n    var baseTotal = Math.max(0, Math.round(Number(lastGroup.pricing.baseTotalCents) || 0));\r\n    lastGroup.pricing.savingsCents = Math.max(0, baseTotal - nextFinal);\r\n    lastGroup.pricing.savingsPercent = baseTotal > 0 ? Math.max(0, Math.round((lastGroup.pricing.savingsCents / baseTotal) * 100)) : 0;\r\n    return list;\r\n  }\r\n\r\n  // Met \u00C3\u00A0 jour le bloc r\u00C3\u00A9cap de droite selon la logique groupes + remises.\r\n  // G\u00C3\u00A8re aussi le masquage imm\u00C3\u00A9diat du bloc quand le panier devient vide.\r\n  function syncCartRecapSidebar(cart, groups) {\r\n    var footer = document.getElementById('main-cart-footer');\r\n    if (!footer) return;\r\n    var isCartEmpty = !cart || Math.max(0, Number(cart.item_count) || 0) === 0;\r\n    footer.style.display = isCartEmpty ? 'none' : '';\r\n    footer.hidden = isCartEmpty;\r\n    if (isCartEmpty) return;\r\n\r\n    var baseNode = footer.querySelector('[data-cart-recap-base]');\r\n    var baseCompareNode = footer.querySelector('[data-cart-recap-base-compare]');\r\n    var discountNode = footer.querySelector('[data-cart-recap-discount]');\r\n    var discountRow = footer.querySelector('[data-cart-recap-row=\"discount\"]');\r\n    var taxNode = footer.querySelector('[data-cart-recap-tax]');\r\n    var finalNode = footer.querySelector('[data-cart-recap-final]');\r\n    if (!baseNode || !finalNode) return;\r\n\r\n    var list = Array.isArray(groups) ? groups : [];\r\n    var hasStandardLines = cartHasStandardVisibleLines(cart);\r\n    if (!list.length) {\r\n      var nativeBase = Math.max(0, Math.round(Number(cart && cart.original_total_price ? cart.original_total_price : 0) || 0));\r\n      var nativeDiscount = Math.max(0, Math.round(Number(cart && cart.total_discount) || 0));\r\n      var nativeSubtotalHt = Math.max(0, nativeBase - nativeDiscount);\r\n      var nativeTax = Math.round(nativeSubtotalHt * 0.2);\r\n      if (baseNode) baseNode.textContent = moneyHt(nativeSubtotalHt);\r\n      if (baseCompareNode) {\r\n        var showNativeBaseCompare = nativeDiscount > 0 && nativeBase > nativeSubtotalHt;\r\n        baseCompareNode.hidden = !showNativeBaseCompare;\r\n        baseCompareNode.textContent = showNativeBaseCompare ? moneyHt(nativeBase) : '';\r\n      }\r\n      if (taxNode) taxNode.textContent = money(nativeTax);\r\n      finalNode.textContent = money(nativeSubtotalHt + nativeTax);\r\n      if (discountRow) {\r\n        var showNativeDiscount = nativeDiscount > 0;\r\n        discountRow.hidden = !showNativeDiscount;\r\n        discountRow.style.display = showNativeDiscount ? '' : 'none';\r\n        if (discountNode) discountNode.textContent = showNativeDiscount ? money(nativeDiscount) : '';\r\n      }\r\n      return;\r\n    }\r\n\r\n    var nativeBaseTotal = Math.max(0, Math.round(Number(cart && cart.original_total_price ? cart.original_total_price : 0) || 0));\r\n    var nativeDiscountTotal = Math.max(0, Math.round(Number(cart && cart.total_discount) || 0));\r\n    var nativeSubtotalHt = Math.max(0, nativeBaseTotal - nativeDiscountTotal);\r\n    var nativeTaxTotal = Math.round(nativeSubtotalHt * 0.2);\r\n\r\n    baseNode.textContent = moneyHt(nativeSubtotalHt);\r\n    if (baseCompareNode) {\r\n      var showBaseCompare = nativeDiscountTotal > 0 && nativeBaseTotal > nativeSubtotalHt;\r\n      baseCompareNode.hidden = !showBaseCompare;\r\n      baseCompareNode.textContent = showBaseCompare ? moneyHt(nativeBaseTotal) : '';\r\n    }\r\n    if (taxNode) taxNode.textContent = money(nativeTaxTotal);\r\n    finalNode.textContent = money(nativeSubtotalHt + nativeTaxTotal);\r\n    if (discountRow) {\r\n      var showDiscount = nativeDiscountTotal > 0;\r\n      discountRow.hidden = !showDiscount;\r\n      discountRow.style.display = showDiscount ? '' : 'none';\r\n    }\r\n    if (discountNode) discountNode.textContent = nativeDiscountTotal > 0 ? money(nativeDiscountTotal) : '';\r\n  }\r\n\r\n  function renderGroupCards(groups) {\r\n    var container = document.querySelector(rootSelector);\r\n    if (!container) return;\r\n    currentGroupsById = {};\r\n    groups.forEach(function (g) { currentGroupsById[g.id] = g; });\r\n    if (!groups.length) {\r\n      container.hidden = true;\r\n      container.innerHTML = '';\r\n      return;\r\n    }\r\n    container.hidden = false;\r\n    container.innerHTML = groups\r\n      .map(function (g) {\r\n        var sortedProductLines = (g.productLines || []).slice().sort(function (a, b) {\r\n          return compareSizeLabels(sizeLabelFromLine(a.line), sizeLabelFromLine(b.line));\r\n        });\r\n        var techniqueLabel = getGroupTechniqueLabel(g);\r\n        var productColorLabel = getGroupProductColorLabel(g);\r\n        var textColorLabel = getGroupTextColorLabel(g);\r\n        var firstProductProps = sortedProductLines.length && sortedProductLines[0].props ? sortedProductLines[0].props : {};\r\n        var isPrintGroup = String(firstProductProps._orion_line_role || '') === 'print_main';\r\n        var printFormat = String(firstProductProps._print_format || '').trim();\r\n        var printPaper = String(firstProductProps._print_paper || '').trim();\r\n        var printSides = String(firstProductProps._print_sides || '').trim();\r\n        var optionLines = splitPersonalizationSummary(g.summary);\r\n        (g.feeLines || []).forEach(function (entry) {\r\n          var label = String(entry && entry.props && entry.props._print_option_label || '').trim();\r\n          if (label && optionLines.indexOf(label) < 0) optionLines.push(label);\r\n        });\r\n        var sizesRowsHtml = sortedProductLines\r\n          .map(function (entry) {\r\n            return (\r\n              '<div class=\"personalizer-cart-group__size-row\">' +\r\n              '<span class=\"personalizer-cart-group__size-cell personalizer-cart-group__size-cell--label\">' +\r\n              escapeHtml(isPrintGroup ? 'Quantit\u00E9' : sizeLabelFromLine(entry.line)) +\r\n              '</span>' +\r\n              '<span class=\"personalizer-cart-group__size-cell personalizer-cart-group__size-cell--qty\">' +\r\n              String(entry.line.quantity || 0) +\r\n              '</span>' +\r\n              '</div>'\r\n            );\r\n          })\r\n          .join('');\r\n        var optionLinesHtml = optionLines.length\r\n          ? optionLines\r\n              .map(function (line) {\r\n                var formatted = line\r\n                  .replace(/\\s*\\/\\s*/g, ' | ')\r\n                  .replace(/\\|\\s*Texte\\s+/i, '| Texte : ');\r\n                return '<li class=\"personalizer-cart-group__option-item\">' + escapeHtml(formatted) + '</li>';\r\n              })\r\n              .join('')\r\n          : '<li class=\"personalizer-cart-group__option-item\">Personnalisation enregistr\u00E9e</li>';\r\n        var previewFront = g.previews && g.previews.front ? String(g.previews.front) : '';\n        var previewBack = g.previews && g.previews.back ? String(g.previews.back) : '';\n        var previewFrontLabel = String(g.previews && g.previews.labels && g.previews.labels.front || 'Avant');\n        var previewBackLabel = String(g.previews && g.previews.labels && g.previews.labels.back || 'Dos');\n        var hasPreviewCarousel = !!(previewFront || previewBack);\r\n        var initialPreviewSrc = previewFront || previewBack || '';\r\n        var initialPreviewView = previewFront ? 'front' : (previewBack ? 'back' : 'front');\r\n        var imageHtml = hasPreviewCarousel\r\n          ? (\r\n              '<div class=\"personalizer-cart-group__preview-carousel\" data-group-preview-carousel data-current-view=\"' + escapeHtml(initialPreviewView) + '\">' +\r\n              '<img class=\"personalizer-cart-group__image\" data-group-preview-image src=\"' + escapeHtml(initialPreviewSrc) + '\" alt=\"Apercu personnalisation\">' +\r\n              '<div class=\"personalizer-cart-group__preview-controls\">' +\r\n              '<button type=\"button\" class=\"personalizer-cart-group__preview-btn\" data-action=\"group-preview-prev\" data-group-id=\"' + escapeHtml(g.id) + '\" aria-label=\"Vue precedente\"' + ((!previewFront || !previewBack) ? ' disabled' : '') + '>\u2039</button>' +\r\n              '<span class=\"personalizer-cart-group__preview-label\" data-group-preview-label>' + escapeHtml(initialPreviewView === 'back' ? previewBackLabel : previewFrontLabel) + '</span>' +\n              '<button type=\"button\" class=\"personalizer-cart-group__preview-btn\" data-action=\"group-preview-next\" data-group-id=\"' + escapeHtml(g.id) + '\" aria-label=\"Vue suivante\"' + ((!previewFront || !previewBack) ? ' disabled' : '') + '>\u203A</button>' +\r\n              '</div>' +\r\n              '<div class=\"personalizer-cart-group__preview-data\" hidden data-front-src=\"' + escapeHtml(previewFront) + '\" data-back-src=\"' + escapeHtml(previewBack) + '\" data-front-label=\"' + escapeHtml(previewFrontLabel) + '\" data-back-label=\"' + escapeHtml(previewBackLabel) + '\"></div>' +\n              '</div>'\r\n            )\r\n          : (g.image\r\n              ? '<img class=\"personalizer-cart-group__image\" src=\"' + escapeHtml(g.image) + '\" alt=\"\">'\r\n              : '<div class=\"personalizer-cart-group__image\"></div>');\r\n        var pricing = g.pricing || {};\r\n        var baseTotal = Math.max(0, Number(pricing.baseTotalCents) || 0);\r\n        var finalTotal = Math.max(0, Number(pricing.finalTotalCents) || g.totalPriceCents || 0);\r\n        var totalQty = Math.max(1, Math.round(Number(pricing.totalQty) || Number(g.totalQty) || 1));\r\n        var unitPrice = Math.max(0, Math.round(finalTotal / totalQty));\r\n        var unitBasePrice = Math.max(0, Math.round(baseTotal / totalQty));\r\n        var savings = Math.max(0, Number(pricing.savingsCents) || 0);\r\n        var isPersonalized = g.kind === 'personalized';\r\n        return (\r\n          '<section class=\"personalizer-cart-group\" data-personalizer-group-id=\"' + escapeHtml(g.id) + '\">' +\r\n          '<div class=\"personalizer-cart-group__head\">' +\r\n          '<div class=\"personalizer-cart-group__head-main\">' +\r\n          '<h3 class=\"personalizer-cart-group__title\">' + escapeHtml(g.title || 'Produit') + '</h3>' +\r\n          '</div>' +\r\n          '</div>' +\r\n          '<div class=\"personalizer-cart-group__grid\">' +\r\n          '<div class=\"personalizer-cart-group__media-card\">' +\r\n          (productColorLabel ? '<p class=\"personalizer-cart-group__color\">Couleur : ' + escapeHtml(productColorLabel) + '</p>' : '') +\r\n          imageHtml +\r\n          '<div class=\"personalizer-cart-group__actions\">' +\r\n          (isPersonalized ? '<button type=\"button\" class=\"personalizer-cart-group__action\" data-action=\"edit-graphic\" data-group-id=\"' + escapeHtml(g.id) + '\">Modifier le graphisme</button>' : '') +\r\n          (isPersonalized ? '<button type=\"button\" class=\"personalizer-cart-group__action\" data-action=\"duplicate-group\" data-group-id=\"' + escapeHtml(g.id) + '\">Dupliquer</button>' : '') +\r\n          '<button type=\"button\" class=\"personalizer-cart-group__action personalizer-cart-group__action--danger\" data-action=\"delete-group\" data-group-id=\"' + escapeHtml(g.id) + '\">Supprimer</button>' +\r\n          '</div>' +\r\n          '</div>' +\r\n          '<div class=\"personalizer-cart-group__content\">' +\r\n          '<div class=\"personalizer-cart-group__section personalizer-cart-group__section--sizes\">' +\r\n          '<div class=\"personalizer-cart-group__section-head\">' +\r\n          '<h4 class=\"personalizer-cart-group__section-title\">Tailles</h4>' +\r\n          '</div>' +\r\n          '<div class=\"personalizer-cart-group__sizes-table\">' +\r\n          '<div class=\"personalizer-cart-group__size-head\">' +\r\n          '<span class=\"personalizer-cart-group__size-head-cell\">Taille</span>' +\r\n          '<span class=\"personalizer-cart-group__size-head-cell personalizer-cart-group__size-head-cell--qty\">Quantit\u00E9s</span>' +\r\n          '</div>' +\r\n          sizesRowsHtml +\r\n          '</div>' +\r\n          '<button type=\"button\" class=\"personalizer-cart-group__action personalizer-cart-group__action--inline\" data-action=\"edit-sizes\" data-group-id=\"' + escapeHtml(g.id) + '\">Modifier les tailles et quantit\u00E9s</button>' +\r\n          '</div>' +\r\n          (isPersonalized ? '<div class=\"personalizer-cart-group__section personalizer-cart-group__section--options\">' +\r\n          '<h4 class=\"personalizer-cart-group__section-title\">Personnalisations choisies</h4>' +\r\n          '<ul class=\"personalizer-cart-group__options-list\">' + optionLinesHtml + '</ul>' +\r\n          '<div class=\"personalizer-cart-group__meta-grid\">' +\r\n          (printFormat ? '<p class=\"personalizer-cart-group__meta-row\"><span class=\"personalizer-cart-group__meta-label\">Format</span><span class=\"personalizer-cart-group__meta-value\">' + escapeHtml(printFormat) + '</span></p>' : '') +\r\n          (printPaper ? '<p class=\"personalizer-cart-group__meta-row\"><span class=\"personalizer-cart-group__meta-label\">Grammage</span><span class=\"personalizer-cart-group__meta-value\">' + escapeHtml(printPaper) + '</span></p>' : '') +\r\n          (printSides ? '<p class=\"personalizer-cart-group__meta-row\"><span class=\"personalizer-cart-group__meta-label\">Impression</span><span class=\"personalizer-cart-group__meta-value\">' + escapeHtml(printSides) + '</span></p>' : '') +\r\n          (!isPrintGroup && techniqueLabel ? '<p class=\"personalizer-cart-group__meta-row\"><span class=\"personalizer-cart-group__meta-label\">Technique</span><span class=\"personalizer-cart-group__meta-value\">' + escapeHtml(techniqueLabel) + '</span></p>' : '') +\r\n          (textColorLabel ? '<p class=\"personalizer-cart-group__meta-row\"><span class=\"personalizer-cart-group__meta-label\">Couleur du texte</span><span class=\"personalizer-cart-group__meta-value\">' + escapeHtml(textColorLabel) + '</span></p>' : '') +\r\n          '</div>' +\r\n          '</div>' : '') +\r\n          '</div>' +\r\n          '<div class=\"personalizer-cart-group__price-card\">' +\r\n          '<div class=\"personalizer-cart-group__total\">' +\r\n          '<div class=\"personalizer-cart-group__total-prices\">' +\r\n          (savings > 0 ? '<span class=\"personalizer-cart-group__price-base\">' + escapeHtml(moneyHt(baseTotal)) + '</span>' : '') +\r\n          '<span class=\"personalizer-cart-group__price-final\">' + escapeHtml(moneyHt(finalTotal)) + '</span>' +\r\n          '</div>' +\r\n          '<div class=\"personalizer-cart-group__unit-price\"><span>Prix unitaire avec personnalisation</span><span class=\"personalizer-cart-group__unit-values\">' +\r\n          (unitBasePrice > unitPrice ? '<s>' + escapeHtml(moneyHt(unitBasePrice)) + '</s>' : '') +\r\n          '<strong>' + escapeHtml(moneyHt(unitPrice)) + ' / pi\u00E8ce</strong></span></div>' +\r\n          (savings > 0 ? '<div class=\"personalizer-cart-group__discount-line personalizer-cart-group__discount-line--highlight\"><span>Vous \u00E9conomisez</span><strong>' + escapeHtml(money(savings)) + '</strong></div>' : '') +\r\n          '</div>' +\r\n          '</div>' +\r\n          '</div>' +\r\n          '</section>'\r\n        );\r\n      })\r\n      .join('');\r\n  }\r\n  function ensureModal() {\r\n    if (modal) return modal;\r\n    modal = document.createElement('div');\r\n    modal.className = 'personalizer-cart-qty-modal';\r\n    modal.hidden = true;\r\n    modal.innerHTML =\r\n      '<div class=\"personalizer-cart-qty-modal__overlay\" data-action=\"close\"></div>' +\r\n      '<div class=\"personalizer-cart-qty-modal__panel personalizer-modal__content\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Tailles et quantit\u00E9s\">' +\r\n      '<div class=\"personalizer-cart-qty-modal__layout\">' +\r\n      '<div class=\"personalizer-cart-qty-modal__head\">' +\r\n      '<h3 class=\"personalizer-cart-qty-modal__title\">Tailles et quantit\u00E9s</h3>' +\r\n      '<button type=\"button\" class=\"personalizer-cart-qty-modal__close\" data-action=\"close\" aria-label=\"Fermer la fen\u00EAtre\">\u00D7</button>' +\r\n      '</div>' +\r\n      '<div class=\"personalizer-cart-qty-grid\" data-size-grid></div>' +\r\n      '<div class=\"personalizer-cart-qty-summary\" data-size-summary></div>' +\r\n      '<div class=\"personalizer-cart-qty-modal__footer\">' +\r\n      '<button type=\"button\" class=\"button button--tertiary\" data-action=\"close\">Annuler</button>' +\r\n      '<button type=\"button\" class=\"button button--primary\" data-action=\"save\">Actualiser le panier</button>' +\r\n      '</div>' +\r\n      '</div>' +\r\n      '</div>';\r\n    document.body.appendChild(modal);\r\n\r\n    modal.addEventListener('click', function (event) {\r\n      var target = event.target;\r\n      if (!(target instanceof HTMLElement)) return;\r\n      var actionEl = target.closest('[data-action]');\r\n      if (!actionEl) return;\r\n      var action = actionEl.getAttribute('data-action');\r\n      if (action === 'close') closeModal();\r\n      if (action === 'save') saveModalChanges();\r\n      if (action === 'dec-size' || action === 'inc-size' || action === 'size-decrease' || action === 'size-increase') {\r\n        var rowNode = actionEl.closest('.personalizer-cart-qty-row');\r\n        var input = rowNode && rowNode.querySelector('input[data-variant-id]');\r\n        if (!input) return;\r\n        var current = Math.max(0, Math.floor(Number(input.value) || 0));\r\n        var isInc = action === 'inc-size' || action === 'size-increase';\r\n        var next = Math.max(0, current + (isInc ? 1 : -1));\r\n        var maxQtyAttr = input.getAttribute('data-max-qty');\r\n        if (maxQtyAttr !== null && maxQtyAttr !== '') {\r\n          var maxQty = Number(maxQtyAttr);\r\n          if (Number.isFinite(maxQty) && maxQty >= 0) next = Math.min(next, Math.floor(maxQty));\r\n        }\r\n        input.value = String(next);\r\n        syncModalRowInteractiveUi(rowNode, input);\r\n        renderModalPricingSummary();\r\n      }\r\n    });\r\n\r\n    modal.addEventListener('input', function (event) {\r\n      var target = event.target;\r\n      if (!(target instanceof HTMLInputElement)) return;\r\n      if (!target.matches('input[data-variant-id]')) return;\r\n      sanitizeQtyInputValue(target);\r\n      var rowNode = target.closest('.personalizer-cart-qty-row');\r\n      syncModalRowInteractiveUi(rowNode, target);\r\n      renderModalPricingSummary();\r\n    });\r\n\r\n    modal.addEventListener('keydown', function (event) {\r\n      var target = event.target;\r\n      if (!(target instanceof HTMLInputElement)) return;\r\n      if (!target.matches('input[data-size-quantity-input]')) return;\r\n\r\n      var blockedKeys = ['e', 'E', '+', '-', ',', '.'];\r\n      if (blockedKeys.indexOf(event.key) >= 0) {\r\n        event.preventDefault();\r\n        return;\r\n      }\r\n\r\n      if (event.key === 'Enter') {\r\n        event.preventDefault();\r\n        sanitizeQtyInputValue(target);\r\n        var rowNode = target.closest('.personalizer-cart-qty-row');\r\n        syncModalRowInteractiveUi(rowNode, target);\r\n        renderModalPricingSummary();\r\n      }\r\n    });\r\n\r\n    modal.addEventListener('focusin', function (event) {\r\n      var target = event.target;\r\n      if (!(target instanceof HTMLInputElement)) return;\r\n      if (!target.matches('input[data-size-quantity-input]')) return;\r\n      window.requestAnimationFrame(function () {\r\n        if (target && typeof target.select === 'function') target.select();\r\n      });\r\n    });\r\n\r\n    modal.addEventListener('blur', function (event) {\r\n      var target = event.target;\r\n      if (!(target instanceof HTMLInputElement)) return;\r\n      if (!target.matches('input[data-size-quantity-input]')) return;\r\n      sanitizeQtyInputValue(target);\r\n      var rowNode = target.closest('.personalizer-cart-qty-row');\r\n      syncModalRowInteractiveUi(rowNode, target);\r\n      renderModalPricingSummary();\r\n    }, true);\r\n    return modal;\r\n  }\r\n\r\n  // Cr\u00C3\u00A9e une seule fois la modale de confirmation de suppression de groupe.\r\n  function ensureDeleteConfirmModal() {\r\n    if (deleteConfirmModal) return deleteConfirmModal;\r\n    deleteConfirmModal = document.createElement('div');\r\n    deleteConfirmModal.className = 'personalizer-cart-delete-modal';\r\n    deleteConfirmModal.hidden = true;\r\n    deleteConfirmModal.innerHTML =\r\n      '<div class=\"personalizer-cart-delete-modal__overlay\" data-action=\"close-delete-confirm\"></div>' +\r\n      '<div class=\"personalizer-cart-delete-modal__panel personalizer-modal__content\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Confirmer la suppression\">' +\r\n      '<div class=\"personalizer-cart-delete-modal__layout\">' +\r\n      '<div class=\"personalizer-cart-delete-modal__icon\" aria-hidden=\"true\">' +\r\n      '<svg viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M9 3h6m-8 4h10m-9 0 .7 12h6.6L16 7M10 10v6m4-6v6\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>' +\r\n      '</div>' +\r\n      '<h3 class=\"personalizer-cart-delete-modal__title\">Supprimer ce produit ?</h3>' +\r\n      '<p class=\"personalizer-cart-delete-modal__text\">\u00CAtes-vous s\u00FBr de vouloir supprimer ce produit personnalis\u00E9 du panier ? Cette action est irr\u00E9versible.</p>' +\r\n      '<div class=\"personalizer-cart-delete-modal__actions\">' +\r\n      '<button type=\"button\" class=\"button button--tertiary\" data-action=\"close-delete-confirm\">Annuler</button>' +\r\n      '<button type=\"button\" class=\"button button--primary\" data-action=\"confirm-delete-group\">Supprimer le produit</button>' +\r\n      '</div>' +\r\n      '</div>' +\r\n      '</div>';\r\n    document.body.appendChild(deleteConfirmModal);\r\n\r\n    deleteConfirmModal.addEventListener('click', function (event) {\r\n      var target = event.target;\r\n      if (!(target instanceof HTMLElement)) return;\r\n      var actionEl = target.closest('[data-action]');\r\n      if (!actionEl) return;\r\n      var action = actionEl.getAttribute('data-action');\r\n      if (action === 'close-delete-confirm') {\r\n        closeDeleteConfirmModal();\r\n        return;\r\n      }\r\n      if (action === 'confirm-delete-group') {\r\n        var groupId = String(deleteConfirmModal.dataset.groupId || '');\r\n        if (!groupId || pendingUpdate) return;\r\n        var btn = deleteConfirmModal.querySelector('[data-action=\"confirm-delete-group\"]');\r\n        if (btn) btn.setAttribute('disabled', 'disabled');\r\n        closeDeleteConfirmModal();\r\n        deleteGroup(groupId);\r\n      }\r\n    });\r\n\r\n    return deleteConfirmModal;\r\n  }\r\n\r\n  function openDeleteConfirmModal(groupId) {\r\n    if (!groupId || pendingUpdate) return;\r\n    ensureDeleteConfirmModal();\r\n    deleteConfirmModal.dataset.groupId = String(groupId);\r\n    var btn = deleteConfirmModal.querySelector('[data-action=\"confirm-delete-group\"]');\r\n    if (btn) btn.removeAttribute('disabled');\r\n    deleteConfirmModal.hidden = false;\r\n    lockBodyScroll();\r\n  }\r\n\r\n  function closeDeleteConfirmModal() {\r\n    if (!deleteConfirmModal) return;\r\n    deleteConfirmModal.hidden = true;\r\n    deleteConfirmModal.removeAttribute('data-group-id');\r\n    unlockBodyScroll();\r\n  }\r\n\r\n  function captureGroupsHome(container) {\r\n    if (!container) return;\r\n    groupsHomeParent = container.parentElement || null;\r\n    groupsHomeNextSibling = container.nextSibling || null;\r\n  }\r\n\r\n  function getLiveGroupsHomeParent() {\r\n    var host = document.querySelector('#main-cart-items .js-contents');\r\n    return host || null;\r\n  }\r\n\r\n  function ensureGroupsContainer() {\r\n    var container = document.querySelector(rootSelector);\r\n    if (container) {\r\n      var existingHomeParent = getLiveGroupsHomeParent();\r\n      if (existingHomeParent && container.parentElement === existingHomeParent) {\r\n        captureGroupsHome(container);\r\n      }\r\n      return container;\r\n    }\r\n\r\n    var liveHomeParent = getLiveGroupsHomeParent();\r\n    if (!liveHomeParent) return null;\r\n\r\n    container = document.createElement('div');\r\n    container.id = 'personalizer-cart-groups';\r\n    container.className = 'personalizer-cart-groups';\r\n    container.hidden = true;\r\n    liveHomeParent.insertBefore(container, liveHomeParent.firstChild || null);\r\n    captureGroupsHome(container);\r\n    return container;\r\n  }\r\n\r\n  function shouldPlaceGroupsAfterFooter() {\r\n    if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\r\n    return window.matchMedia('(max-width: 989px)').matches;\r\n  }\r\n\r\n  function syncGroupsPlacement() {\r\n    var container = ensureGroupsContainer();\r\n    if (!container) return;\r\n    var liveHomeParent = getLiveGroupsHomeParent();\r\n    if (liveHomeParent && container.parentElement === liveHomeParent) {\r\n      captureGroupsHome(container);\r\n    } else if (liveHomeParent && (!groupsHomeParent || !document.documentElement.contains(groupsHomeParent))) {\r\n      groupsHomeParent = liveHomeParent;\r\n      groupsHomeNextSibling = container.nextSibling || null;\r\n    }\r\n\r\n    if (shouldPlaceGroupsAfterFooter()) {\r\n      var footer = document.getElementById('main-cart-footer');\r\n      if (footer && footer.parentElement && container.previousElementSibling !== footer) {\r\n        footer.insertAdjacentElement('afterend', container);\r\n      }\r\n      return;\r\n    }\r\n\r\n    // En desktop, la source de v\u00E9rit\u00E9 est toujours la zone des lignes panier.\r\n    // Ne pas r\u00E9utiliser un parent captur\u00E9 apr\u00E8s le d\u00E9placement mobile : sinon le\r\n    // conteneur reste dans la grille principale, sous le r\u00E9capitulatif.\r\n    if (!liveHomeParent) return;\r\n    var nativeCartTable = liveHomeParent.querySelector('.cart-items');\r\n    liveHomeParent.insertBefore(container, nativeCartTable || liveHomeParent.firstChild || null);\r\n    captureGroupsHome(container);\r\n  }\r\n\r\n  function lockBodyScroll() {\r\n    var body = document.body;\r\n    if (!body) return;\r\n    bodyScrollLockCount += 1;\r\n    if (bodyScrollLockCount > 1) {\r\n      body.classList.add('personalizer-cart-modal-open');\r\n      return;\r\n    }\r\n    bodyScrollPreviousPaddingRight = body.style.paddingRight || '';\r\n    var scrollbarWidth = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\r\n    if (scrollbarWidth > 0) {\r\n      var computedPaddingRight = Number.parseFloat(window.getComputedStyle(body).paddingRight || '0') || 0;\r\n      body.style.paddingRight = String(computedPaddingRight + scrollbarWidth) + 'px';\r\n    }\r\n    body.classList.add('personalizer-cart-modal-open');\r\n  }\r\n\r\n  function unlockBodyScroll() {\r\n    var body = document.body;\r\n    if (!body) return;\r\n    bodyScrollLockCount = Math.max(0, bodyScrollLockCount - 1);\r\n    if (bodyScrollLockCount > 0) return;\r\n    body.classList.remove('personalizer-cart-modal-open');\r\n    body.style.paddingRight = bodyScrollPreviousPaddingRight;\r\n    bodyScrollPreviousPaddingRight = '';\r\n  }\r\n\r\n  function resetBodyScrollLock() {\r\n    var body = document.body;\r\n    bodyScrollLockCount = 0;\r\n    if (!body) return;\r\n    body.classList.remove('personalizer-cart-modal-open');\r\n    body.style.paddingRight = bodyScrollPreviousPaddingRight;\r\n    bodyScrollPreviousPaddingRight = '';\r\n  }\r\n\r\n  function hasOpenPersonalizerCartModal() {\r\n    return !!(\r\n      (modal && !modal.hidden) ||\r\n      (deleteConfirmModal && !deleteConfirmModal.hidden) ||\r\n      (imagePreviewModal && !imagePreviewModal.hidden)\r\n    );\r\n  }\r\n\r\n  function reconcileBodyScrollLock() {\r\n    if (hasOpenPersonalizerCartModal()) {\r\n      bodyScrollLockCount = 0;\r\n      lockBodyScroll();\r\n    } else {\r\n      resetBodyScrollLock();\r\n    }\r\n  }\r\n\r\n  function ensureImagePreviewModal() {\r\n    if (imagePreviewModal) return imagePreviewModal;\r\n    imagePreviewModal = document.createElement('div');\r\n    imagePreviewModal.className = 'personalizer-cart-image-modal';\r\n    imagePreviewModal.hidden = true;\r\n    imagePreviewModal.innerHTML =\r\n      '<div class=\"personalizer-cart-image-modal__overlay\" data-action=\"close-image-preview\"></div>' +\r\n      '<div class=\"personalizer-cart-image-modal__panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Apercu image personnalisation\">' +\r\n      '<button type=\"button\" class=\"personalizer-cart-image-modal__close\" data-action=\"close-image-preview\" aria-label=\"Fermer\">&times;</button>' +\r\n      '<img class=\"personalizer-cart-image-modal__image\" data-image-preview-target src=\"\" alt=\"Apercu personnalisation\">' +\r\n      '</div>';\r\n    document.body.appendChild(imagePreviewModal);\r\n\r\n    imagePreviewModal.addEventListener('click', function (event) {\r\n      var target = event.target;\r\n      if (!(target instanceof HTMLElement)) return;\r\n      var actionEl = target.closest('[data-action=\"close-image-preview\"]');\r\n      if (!actionEl) return;\r\n      closeImagePreview();\r\n    });\r\n\r\n    document.addEventListener('keydown', function (event) {\r\n      if (event.key !== 'Escape') return;\r\n      if (imagePreviewModal && !imagePreviewModal.hidden) closeImagePreview();\r\n    });\r\n\r\n    return imagePreviewModal;\r\n  }\r\n\r\n  function openImagePreview(src, alt) {\r\n    var url = String(src || '').trim();\r\n    if (!url) return;\r\n    ensureImagePreviewModal();\r\n    var imageNode = imagePreviewModal.querySelector('[data-image-preview-target]');\r\n    if (!imageNode) return;\r\n    imageNode.setAttribute('src', url);\r\n    imageNode.setAttribute('alt', String(alt || 'Apercu personnalisation'));\r\n    imagePreviewModal.hidden = false;\r\n    lockBodyScroll();\r\n  }\r\n\r\n  function closeImagePreview() {\r\n    if (!imagePreviewModal) return;\r\n    imagePreviewModal.hidden = true;\r\n    var imageNode = imagePreviewModal.querySelector('[data-image-preview-target]');\r\n    if (imageNode) imageNode.setAttribute('src', '');\r\n    unlockBodyScroll();\r\n  }\r\n\r\n  // Pr\u00C3\u00A9visualisation de prix dans la modale de tailles (sans \u00C3\u00A9criture panier).\r\n  function calculateGroupPreview(group, quantitiesByLine) {\r\n    if (!group) return null;\r\n\r\n    if (group.kind === 'standard') {\r\n      var standardTotalQty = 0;\r\n      var standardFinal = 0;\r\n      group.productLines.forEach(function (entry) {\r\n        var lineNo = String(entry.lineNumber || '');\r\n        var variantKey = 'variant:' + String(entry.line && entry.line.variant_id ? entry.line.variant_id : '');\r\n        var qty = lineNo && Object.prototype.hasOwnProperty.call(quantitiesByLine, lineNo)\r\n          ? Math.max(0, Math.floor(Number(quantitiesByLine[lineNo]) || 0))\r\n          : Math.max(0, Math.floor(Number(quantitiesByLine[variantKey]) || 0));\r\n        var props = entry.props || {};\r\n        var unitBase = Math.max(0, Math.round(Number(props._pz_base_price_cents || entry.line.price || 0) || 0));\r\n        standardTotalQty += qty;\r\n        standardFinal += unitBase * qty;\r\n      });\r\n      var standardUnit = standardTotalQty > 0 ? Math.round(standardFinal / standardTotalQty) : 0;\r\n      return {\r\n        totalQty: standardTotalQty,\r\n        unitPriceCents: standardUnit,\r\n        unitBasePriceCents: standardUnit,\r\n        totalPriceCents: standardFinal,\r\n        totalBasePriceCents: standardFinal,\r\n        totalProductPriceCents: standardFinal,\r\n        totalPersonalizationBeforeDiscountCents: 0,\r\n        totalPersonalizationPriceCents: 0,\r\n        currentDiscountPercent: 0,\r\n        nextDiscountPercent: null,\r\n        nextTierMissingQty: 0,\r\n        nextTierHint: ''\r\n      };\r\n    }\r\n\r\n    var totalQty = 0;\r\n    var totalBase = 0;\r\n    var totalFinal = 0;\r\n    var totalProduct = 0;\r\n    var totalPersonalizationBeforeDiscount = 0;\r\n    var totalPersonalizationFinal = 0;\r\n    var nextTierHint = '';\r\n    var nextTierMissingQty = 0;\r\n    var currentDiscountPercent = 0;\r\n    var nextDiscountPercent = null;\r\n\r\n    group.productLines.forEach(function (entry) {\r\n      var lineNo = String(entry.lineNumber || '');\r\n      var variantKey = 'variant:' + String(entry.line && entry.line.variant_id ? entry.line.variant_id : '');\r\n      var qty = lineNo && Object.prototype.hasOwnProperty.call(quantitiesByLine, lineNo)\r\n        ? Math.max(0, Math.floor(Number(quantitiesByLine[lineNo]) || 0))\r\n        : Math.max(0, Math.floor(Number(quantitiesByLine[variantKey]) || 0));\r\n      totalQty += qty;\r\n    });\r\n\r\n    group.productLines.forEach(function (entry) {\r\n      var props = entry.props || {};\r\n      var lineNo = String(entry.lineNumber || '');\r\n      var variantKey = 'variant:' + String(entry.line && entry.line.variant_id ? entry.line.variant_id : '');\r\n      var qty = lineNo && Object.prototype.hasOwnProperty.call(quantitiesByLine, lineNo)\r\n        ? Math.max(0, Math.floor(Number(quantitiesByLine[lineNo]) || 0))\r\n        : Math.max(0, Math.floor(Number(quantitiesByLine[variantKey]) || 0));\r\n      var base = Math.max(0, Math.round(Number(props._pz_base_price_cents) || 0));\r\n      var tech = Math.max(0, Math.round(Number(props._pz_technique_price_cents) || 0));\r\n      var zone = Math.max(0, Math.round(Number(props._pz_zone_price_cents) || 0));\r\n      var pricing = {\r\n        unitBeforeDiscount: base + tech + zone,\r\n        unitAfterDiscount: base + tech + zone,\r\n        productUnitPrice: base,\r\n        personalizationUnitBeforeDiscount: tech + zone,\r\n        personalizationUnitAfterDiscount: tech + zone,\r\n        totalPriceCents: (base + tech + zone) * qty\r\n      };\r\n      var unitBeforeDiscountCents = Math.max(0, Math.round(Number(pricing && pricing.unitBeforeDiscount) || 0));\r\n      var unitAfterDiscountCents = Math.max(0, Math.round(Number(pricing && pricing.unitAfterDiscount) || 0));\r\n      var unitProductCents = Math.max(0, Math.round(Number(pricing && pricing.productUnitPrice) || base));\r\n      var unitPersonalizationBeforeDiscountCents = Math.max(0, Math.round(Number(pricing && pricing.personalizationUnitBeforeDiscount) || (tech + zone)));\r\n      var unitPersonalizationAfterDiscountCents = Math.max(0, Math.round(Number(pricing && pricing.personalizationUnitAfterDiscount) || (tech + zone)));\r\n      totalBase += unitBeforeDiscountCents * qty;\r\n      totalFinal += unitAfterDiscountCents * qty;\r\n      totalProduct += unitProductCents * qty;\r\n      totalPersonalizationBeforeDiscount += unitPersonalizationBeforeDiscountCents * qty;\r\n      totalPersonalizationFinal += unitPersonalizationAfterDiscountCents * qty;\r\n      if (!currentDiscountPercent && unitPersonalizationBeforeDiscountCents > 0) {\r\n        currentDiscountPercent = Math.max(0, Math.round((1 - (unitPersonalizationAfterDiscountCents / unitPersonalizationBeforeDiscountCents)) * 100));\r\n      }\r\n\r\n    });\r\n\r\n    var unitBaseAvg = totalQty > 0 ? Math.round(totalBase / totalQty) : 0;\r\n    var unitFinalAvg = totalQty > 0 ? Math.round(totalFinal / totalQty) : 0;\r\n    if (totalPersonalizationBeforeDiscount > 0 && totalPersonalizationFinal < totalPersonalizationBeforeDiscount) {\r\n      currentDiscountPercent = Math.max(0, Math.round((1 - (totalPersonalizationFinal / totalPersonalizationBeforeDiscount)) * 100));\r\n    } else {\r\n      currentDiscountPercent = 0;\r\n    }\r\n\r\n    return {\r\n      totalQty: totalQty,\r\n      unitPriceCents: Math.max(0, Math.round(Number(unitFinalAvg) || 0)),\r\n      unitBasePriceCents: Math.max(0, Math.round(Number(unitBaseAvg) || 0)),\r\n      totalPriceCents: Math.max(0, Math.round(Number(totalFinal) || 0)),\r\n      totalBasePriceCents: Math.max(0, Math.round(Number(totalBase) || 0)),\r\n      totalProductPriceCents: Math.max(0, Math.round(Number(totalProduct) || 0)),\r\n      totalPersonalizationBeforeDiscountCents: Math.max(0, Math.round(Number(totalPersonalizationBeforeDiscount) || 0)),\r\n      totalPersonalizationPriceCents: Math.max(0, Math.round(Number(totalPersonalizationFinal) || 0)),\r\n      currentDiscountPercent: Math.max(0, Math.round(Number(currentDiscountPercent) || 0)),\r\n      nextDiscountPercent: nextDiscountPercent !== null ? Math.max(0, Math.round(Number(nextDiscountPercent) || 0)) : null,\r\n      nextTierMissingQty: Math.max(0, Math.round(Number(nextTierMissingQty) || 0)),\r\n      nextTierHint: nextTierHint,\r\n    };\r\n  }\r\n\r\n  function fetchVariantDetails(variantId, options) {\r\n    var settings = options || {};\r\n    var key = String(variantId || '').trim();\r\n    if (!key) return Promise.resolve(null);\r\n    if (!settings.forceRefresh && Object.prototype.hasOwnProperty.call(variantDetailsCache, key)) {\r\n      return Promise.resolve(variantDetailsCache[key]);\r\n    }\r\n    var url = routesRoot() + 'variants/' + encodeURIComponent(key) + '.js';\r\n    if (settings.forceRefresh) {\r\n      url += (url.indexOf('?') >= 0 ? '&' : '?') + '_=' + String(Date.now());\r\n    }\r\n    return fetch(url, { headers: { Accept: 'application/json' } })\r\n      .then(function (response) {\r\n        if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n        return response.json();\r\n      })\r\n      .then(function (variant) {\r\n        variantDetailsCache[key] = variant || null;\r\n        return variantDetailsCache[key];\r\n      })\r\n      .catch(function () {\r\n        return null;\r\n      });\r\n  }\r\n\r\n  function buildProductPageUrlForGroup(group) {\r\n    var firstEntry = group && group.productLines && group.productLines[0] ? group.productLines[0] : null;\r\n    var line = (firstEntry && firstEntry.line) || {};\r\n    var productUrl = String(group && group.productUrl || line.url || '').trim();\r\n    if (productUrl) {\r\n      if (/^https?:\\/\\//i.test(productUrl)) return productUrl;\r\n      if (productUrl.charAt(0) === '/') return productUrl;\r\n      return routesRoot().replace(/\\/?$/, '/') + productUrl.replace(/^\\/+/, '');\r\n    }\r\n    var handle = String(line.handle || '').trim();\r\n    if (!handle) return '';\r\n    return routesRoot().replace(/\\/?$/, '/') + 'products/' + encodeURIComponent(handle);\r\n  }\r\n\r\n  function fetchCartJson(options) {\r\n    var settings = options || {};\r\n    if (!settings.forceRefresh && cartJsonCache) return Promise.resolve(cartJsonCache);\r\n    var url = routesRoot() + 'cart.js';\r\n    if (settings.forceRefresh) {\r\n      url += (url.indexOf('?') >= 0 ? '&' : '?') + '_=' + String(Date.now());\r\n    }\r\n    return fetch(url, { headers: { Accept: 'application/json' } })\r\n      .then(function (response) {\r\n        if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n        return response.json();\r\n      })\r\n      .then(function (cart) {\r\n        cartJsonCache = cart || null;\r\n        return cartJsonCache;\r\n      })\r\n      .catch(function () {\r\n        return null;\r\n      });\r\n  }\r\n\r\n  function resolveProductPageUrlForGroup(group, options) {\r\n    var directUrl = buildProductPageUrlForGroup(group);\r\n    if (directUrl) return Promise.resolve(directUrl);\r\n    var settings = options || {};\r\n    var groupId = String(group && group.id || '').trim();\r\n    if (!groupId) return Promise.resolve('');\r\n    return fetchCartJson({ forceRefresh: !!settings.forceRefresh }).then(function (cart) {\r\n      var items = Array.isArray(cart && cart.items) ? cart.items : [];\r\n      var match = null;\r\n      for (var i = 0; i < items.length; i += 1) {\r\n        var item = items[i] || {};\r\n        var props = item.properties || {};\r\n        if (String(props._custom_group_id || props._personalization_group || '') !== groupId) continue;\r\n        if (String(props._personalization_fee || '').toLowerCase() === 'true') continue;\r\n        match = item;\r\n        break;\r\n      }\r\n      var handle = String(match && match.handle || '').trim();\r\n      if (!handle) return '';\r\n      return routesRoot().replace(/\\/?$/, '/') + 'products/' + encodeURIComponent(handle);\r\n    });\r\n  }\r\n\r\n  function parseVariantsStockFromProductPageHtml(html) {\r\n    var source = String(html || '');\r\n    if (!source) return null;\r\n    var match = source.match(/variantsStock\\s*:\\s*(\\[[\\s\\S]*?\\])\\s*,\\s*[A-Za-z_][A-Za-z0-9_]*\\s*:/);\r\n    if (!match || !match[1]) return null;\r\n    try {\r\n      var list = Function('\"use strict\"; return (' + match[1] + ');')();\r\n      if (!Array.isArray(list)) return null;\r\n      var map = {};\r\n      list.forEach(function (variant) {\r\n        if (!variant || variant.id == null) return;\r\n        var key = String(variant.id);\r\n        map[key] = {\r\n          inventory_quantity: Number.isFinite(Number(variant.inventory_quantity))\r\n            ? Math.max(0, Math.floor(Number(variant.inventory_quantity)))\r\n            : null,\r\n          inventory_policy: String(variant.inventory_policy || ''),\r\n          inventory_management: variant.inventory_management || 'shopify',\r\n          available: variant.available !== false\r\n        };\r\n      });\r\n      return map;\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  function fetchServerRenderedVariantStockMap(group, options) {\r\n    var settings = options || {};\r\n    return resolveProductPageUrlForGroup(group, { forceRefresh: !!settings.forceRefresh }).then(function (url) {\r\n      if (!url) return null;\r\n      if (!settings.forceRefresh && Object.prototype.hasOwnProperty.call(productPageVariantStockCache, url)) {\r\n        return productPageVariantStockCache[url];\r\n      }\r\n      var requestUrl = url;\r\n      if (settings.forceRefresh) {\r\n        requestUrl += (requestUrl.indexOf('?') >= 0 ? '&' : '?') + '_=' + String(Date.now());\r\n      }\r\n      return fetch(requestUrl, { headers: { Accept: 'text/html' } })\r\n        .then(function (response) {\r\n          if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n          return response.text();\r\n        })\r\n        .then(function (html) {\r\n          var parsed = parseVariantsStockFromProductPageHtml(html);\r\n          productPageVariantStockCache[url] = parsed;\r\n          return parsed;\r\n        })\r\n        .catch(function () {\r\n          return null;\r\n        });\r\n    });\r\n  }\r\n\r\n  function getStoredVariantStockSnapshot(variantId) {\r\n    var key = String(variantId || '').trim();\r\n    if (!key) return null;\r\n    try {\r\n      var raw = window.sessionStorage.getItem(VARIANT_STOCK_CACHE_KEY) || '{}';\r\n      var parsed = JSON.parse(raw);\r\n      if (!parsed || typeof parsed !== 'object') return null;\r\n      var entry = parsed[key];\r\n      return entry && typeof entry === 'object' ? entry : null;\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  function getInjectedVariantStockSnapshot(variantId) {\r\n    var key = String(variantId || '').trim();\r\n    if (!key) return null;\r\n    var byId = window.PersonalizerCartVariantStockById;\r\n    if (byId && typeof byId === 'object' && byId[key] && typeof byId[key] === 'object') {\r\n      return byId[key];\r\n    }\r\n    var catalog = window.PersonalizerCartProductCatalog;\r\n    if (!catalog || typeof catalog !== 'object') return null;\r\n    var handles = Object.keys(catalog);\r\n    for (var i = 0; i < handles.length; i += 1) {\r\n      var entry = catalog[handles[i]];\r\n      var variants = Array.isArray(entry && entry.variants) ? entry.variants : [];\r\n      for (var j = 0; j < variants.length; j += 1) {\r\n        var variant = variants[j] || {};\r\n        if (String(variant.id || '') !== key) continue;\r\n        return {\r\n          inventory_quantity: variant.inventory_quantity,\r\n          inventory_policy: variant.inventory_policy,\r\n          inventory_management: variant.inventory_management,\r\n          available: variant.available\r\n        };\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  function parseGroupVariantStockSnapshot(group) {\r\n    var firstEntry = group && group.productLines && group.productLines[0] ? group.productLines[0] : null;\r\n    var firstProps = (firstEntry && firstEntry.props) || {};\r\n    var raw = String(firstProps._pz_variants_stock_json || '').trim();\r\n    if (!raw) return null;\r\n    try {\r\n      var parsed = JSON.parse(raw);\r\n      return parsed && typeof parsed === 'object' ? parsed : null;\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  function getGroupVariantStockSnapshot(group, variantId) {\r\n    var key = String(variantId || '').trim();\r\n    if (!key) return null;\r\n    var map = parseGroupVariantStockSnapshot(group);\r\n    if (!map || typeof map !== 'object') return null;\r\n    var entry = map[key];\r\n    return entry && typeof entry === 'object' ? entry : null;\r\n  }\r\n\r\n  function applyStockSnapshotToRow(row, snapshot) {\r\n    if (!row || !snapshot) return row;\r\n    var managed = !!snapshot.inventory_management;\r\n    var policy = String(snapshot.inventory_policy || '').toLowerCase();\r\n    var stockQty = managed && Number.isFinite(Number(snapshot.inventory_quantity))\r\n      ? Math.max(0, Math.floor(Number(snapshot.inventory_quantity)))\r\n      : null;\r\n    if (!managed || policy === 'continue') stockQty = null;\r\n    var currentQty = Math.max(0, Math.floor(Number(row.currentQty) || 0));\r\n    var remaining = stockQty === null ? null : Math.max(0, stockQty - currentQty);\r\n    row.stock = stockQty;\r\n    row.remainingStock = remaining;\r\n    row.stockLabel = remaining === null ? '' : ('Reste: ' + String(remaining));\r\n    return row;\r\n  }\r\n\r\n  function applyLiveStockToRowsByVariantId(rows, group) {\r\n    var list = Array.isArray(rows) ? rows : [];\r\n    if (!list.length) return Promise.resolve(list);\r\n    var groupStockMap = parseGroupVariantStockSnapshot(group);\r\n    return fetchServerRenderedVariantStockMap(group, { forceRefresh: true }).then(function (serverStockMap) {\r\n      return Promise.all(\r\n        list.map(function (row) {\r\n        var variantId = String(row && row.variantId || '');\r\n        if (!variantId) return Promise.resolve(row);\r\n        // Prefer server-rendered product page stock (Liquid, freshest available on /cart),\r\n        // then session snapshot, then line-embedded snapshot, then cart-page fallback.\r\n        var snapshot = (serverStockMap && serverStockMap[variantId])\r\n          || getStoredVariantStockSnapshot(variantId)\r\n          || (groupStockMap && groupStockMap[variantId])\r\n          || getInjectedVariantStockSnapshot(variantId);\r\n        if (snapshot) {\r\n          applyStockSnapshotToRow(row, snapshot);\r\n          return Promise.resolve(row);\r\n        }\r\n        return fetchVariantDetails(variantId, { forceRefresh: true }).then(function (variant) {\r\n          if (!variant) return row;\r\n          applyStockSnapshotToRow(row, variant);\r\n          return row;\r\n        });\r\n        })\r\n      ).then(function () {\r\n        return list;\r\n      });\r\n    });\r\n  }\r\n\r\n  // Lit les quantit\u00C3\u00A9s temporaires de la modale (source de v\u00C3\u00A9rit\u00C3\u00A9 locale avant save).\r\n  function getModalQuantities() {\r\n    if (!modal) return {};\r\n    var result = {};\r\n    Array.prototype.slice.call(modal.querySelectorAll('input[data-size-quantity-input]')).forEach(function (input) {\r\n      var lineNo = String(input.getAttribute('data-line-number') || '');\r\n      var variantId = String(input.getAttribute('data-variant-id') || '');\r\n      var qty = Math.max(0, Math.floor(Number(input.value) || 0));\r\n      if (lineNo) result[lineNo] = qty;\r\n      if (variantId) result['variant:' + variantId] = qty;\r\n    });\r\n    return result;\r\n  }\r\n\r\n  function getDiscountTierMinimum(title) {\r\n    var match = String(title || '').match(/(?:palier\\s*)?(\\d+)\\s*\\+/i);\r\n    return match ? Math.max(0, Math.floor(Number(match[1]) || 0)) : 0;\r\n  }\r\n\r\n  function getGroupOriginalTotalForScope(group, scope) {\r\n    var entries = scope === 'fee'\r\n      ? (Array.isArray(group && group.feeLines) ? group.feeLines : [])\r\n      : (Array.isArray(group && group.productLines) ? group.productLines : []);\r\n    return entries.reduce(function (sum, entry) {\r\n      return sum + getEntryOriginalLinePrice(entry);\r\n    }, 0);\r\n  }\r\n\r\n  function estimateModalDiscountAllocations(group, preview) {\r\n    var allocations = Array.isArray(group && group.pricing && group.pricing.discountAllocations)\r\n      ? group.pricing.discountAllocations\r\n      : collectGroupDiscountAllocations(group);\r\n    var currentQty = Math.max(0, Math.floor(Number(group && group.totalQty) || 0));\r\n    var nextQty = Math.max(0, Math.floor(Number(preview && preview.totalQty) || 0));\r\n\r\n    return allocations.map(function (allocation) {\r\n      var scope = allocation && allocation.scope === 'fee' ? 'fee' : 'product';\r\n      var threshold = getDiscountTierMinimum(allocation && allocation.title);\r\n      var isEligible = !threshold || nextQty >= threshold;\r\n      var currentAmount = Math.max(0, Math.round(Number(allocation && allocation.amount) || 0));\r\n      var currentScopeBase = getGroupOriginalTotalForScope(group, scope);\r\n      var nextScopeBase = scope === 'fee'\r\n        ? Math.max(0, Math.round(Number(preview && preview.totalPersonalizationBeforeDiscountCents) || 0))\r\n        : Math.max(0, Math.round(Number(preview && preview.totalProductPriceCents) || 0));\r\n      var estimatedAmount = 0;\r\n\r\n      if (isEligible && currentAmount > 0) {\r\n        if (nextQty === currentQty) {\r\n          estimatedAmount = currentAmount;\r\n        } else if (currentScopeBase > 0) {\r\n          estimatedAmount = Math.round(nextScopeBase * (currentAmount / currentScopeBase));\r\n        }\r\n      }\r\n\r\n      return {\r\n        title: String(allocation && allocation.title || (scope === 'fee' ? 'Remise frais palier' : 'Remise palier')),\r\n        scope: scope,\r\n        amount: Math.max(0, estimatedAmount)\r\n      };\r\n    });\r\n  }\r\n\r\n  // Met \u00E0 jour le r\u00E9capitulatif HT de la modale de tailles.\r\n  function renderModalPricingSummary() {\r\n    if (!modal) return;\r\n    var groupId = String(modal.dataset.groupId || '');\r\n    var group = currentGroupsById[groupId];\r\n    var summaryNode = modal.querySelector('[data-size-summary]');\r\n    if (!group || !summaryNode) return;\r\n\r\n    var previewGroup = {\r\n      productLines: (modal._sizeRows || []).map(function (row) {\r\n        return {\r\n          lineNumber: row.lineNumber || '',\r\n          line: {\r\n            quantity: row.quantity || 0,\r\n            variant_id: row.variantId || ''\r\n          },\r\n          props: row.props || {}\r\n        };\r\n      })\r\n    };\r\n    previewGroup.kind = group.kind;\r\n    var preview = calculateGroupPreview(previewGroup, getModalQuantities());\r\n    if (!preview) return;\r\n\r\n    var estimatedAllocations = estimateModalDiscountAllocations(group, preview);\r\n    var productDiscount = estimatedAllocations.filter(function (allocation) {\r\n      return allocation.scope === 'product';\r\n    }).reduce(function (sum, allocation) {\r\n      return sum + Math.max(0, Number(allocation.amount) || 0);\r\n    }, 0);\r\n    var feeDiscount = estimatedAllocations.filter(function (allocation) {\r\n      return allocation.scope === 'fee';\r\n    }).reduce(function (sum, allocation) {\r\n      return sum + Math.max(0, Number(allocation.amount) || 0);\r\n    }, 0);\r\n\r\n    // Fallback for legacy carts where the fee discount was calculated by the\r\n    // personalizer but no Shopify allocation metadata was stored.\r\n    if (\r\n      group.kind === 'personalized' &&\r\n      feeDiscount <= 0 &&\r\n      preview.totalPersonalizationBeforeDiscountCents > preview.totalPersonalizationPriceCents\r\n    ) {\r\n      feeDiscount = Math.max(\r\n        0,\r\n        preview.totalPersonalizationBeforeDiscountCents - preview.totalPersonalizationPriceCents\r\n      );\r\n    }\r\n\r\n    var baseTotal = Math.max(0, Math.round(Number(preview.totalBasePriceCents) || 0));\r\n    var totalDiscount = Math.min(baseTotal, Math.max(0, Math.round(productDiscount + feeDiscount)));\r\n    var finalTotal = Math.max(0, baseTotal - totalDiscount);\r\n    var productDiscountLabel = estimatedAllocations.find(function (allocation) {\r\n      return allocation.scope === 'product';\r\n    });\r\n    var feeDiscountLabel = estimatedAllocations.find(function (allocation) {\r\n      return allocation.scope === 'fee';\r\n    });\r\n\r\n    summaryNode.innerHTML =\r\n      '<div class=\"personalizer-size-footer\">' +\r\n      '<p class=\"personalizer-size-footer__count\">' + String(preview.totalQty) + ' produit' + (preview.totalQty === 1 ? '' : 's') + '</p>' +\r\n      '<div class=\"personalizer-size-footer__pricing\">' +\r\n      (group.kind === 'personalized'\r\n        ? '<p class=\"personalizer-size-footer__line personalizer-size-footer__line--discount\">' +\r\n          '<span>' + escapeHtml(productDiscountLabel ? productDiscountLabel.title : 'Remise palier') + '</span>' +\r\n          '<strong>' + escapeHtml(productDiscount > 0 ? ('- ' + money(productDiscount)) : money(0)) + '</strong>' +\r\n          '</p>' +\r\n          '<p class=\"personalizer-size-footer__line personalizer-size-footer__line--discount\">' +\r\n          '<span>' + escapeHtml(feeDiscountLabel ? feeDiscountLabel.title : 'Remise frais palier') + '</span>' +\r\n          '<strong>' + escapeHtml(feeDiscount > 0 ? ('- ' + money(feeDiscount)) : money(0)) + '</strong>' +\r\n          '</p>'\r\n        : '') +\r\n      '<p class=\"personalizer-size-footer__line\">' +\r\n      '<span>Total HT</span>' +\r\n      '<span class=\"personalizer-size-footer__price-wrap\">' +\r\n      (totalDiscount > 0 ? '<span class=\"personalizer-size-footer__price-base\">' + escapeHtml(money(baseTotal)) + '</span>' : '') +\r\n      '<strong>' + escapeHtml(money(finalTotal)) + '</strong>' +\r\n      '</span>' +\r\n      '</p>' +\r\n      '<p class=\"personalizer-size-footer__line personalizer-size-footer__line--total\">' +\r\n      '<span>Vous \u00E9conomisez</span>' +\r\n      '<strong>' + escapeHtml(money(totalDiscount)) + '</strong>' +\r\n      '</p>' +\r\n      '</div>' +\r\n      '</div>';\r\n  }\r\n\r\n  // Construit toutes les tailles affichables pour le groupe:\r\n  // - lignes d\u00C3\u00A9j\u00C3\u00A0 dans le panier\r\n  // - autres tailles de la m\u00C3\u00AAme couleur via `/products/{handle}.js`\r\n  // - stock restant / disponibilit\u00C3\u00A9 par taille\r\n  function buildModalRowsForGroup(group) {\r\n    var firstEntry = group && group.productLines && group.productLines[0] ? group.productLines[0] : null;\r\n    if (!firstEntry || !firstEntry.line) return Promise.resolve([]);\r\n\r\n    var firstLine = firstEntry.line;\r\n    var firstProps = firstEntry.props || {};\r\n    var activeColor = getLineOptionValue(firstLine, ['couleur', 'color']);\r\n    var currentRowsByVariant = {};\r\n\r\n    (group.productLines || []).forEach(function (entry) {\r\n      var line = entry.line || {};\r\n      var variantId = String(line.variant_id || '');\r\n      if (!variantId) return;\r\n      currentRowsByVariant[variantId] = {\r\n        label: sizeLabelFromLine(line),\r\n        variantId: variantId,\r\n        lineNumber: entry.lineNumber,\r\n        lineKey: entry.lineKey || '',\r\n        quantity: Math.max(0, Math.floor(Number(line.quantity) || 0)),\r\n        currentQty: Math.max(0, Math.floor(Number(line.quantity) || 0)),\r\n        stock: null,\r\n        remainingStock: null,\r\n        stockLabel: '',\r\n        props: Object.assign({}, firstProps, {\r\n          _pz_base_price_cents: String(Math.max(0, Math.round(Number(entry.props && entry.props._pz_base_price_cents) || 0)))\r\n        })\r\n      };\r\n    });\r\n\r\n    var handle = String(firstLine.handle || '');\r\n    if (!handle) {\r\n      return applyLiveStockToRowsByVariantId(Object.values(currentRowsByVariant), group);\r\n    }\r\n\r\n    return fetchProductCatalog(handle, { forceRefresh: true }).then(function (product) {\r\n      if (!product || !Array.isArray(product.variants)) {\r\n        return applyLiveStockToRowsByVariantId(Object.values(currentRowsByVariant), group);\r\n      }\r\n\r\n      var colorIdx = getProductOptionIndexByName(product, ['couleur', 'color']);\r\n      var sizeIdx = getProductOptionIndexByName(product, ['taille', 'size']);\r\n      var normalizedActiveColor = String(activeColor || '').trim().toLowerCase();\r\n      var rows = [];\r\n\r\n      product.variants.forEach(function (variant) {\r\n        if (!variant) return;\r\n        var variantId = String(variant.id || '');\r\n        if (!variantId) return;\r\n        var opts = Array.isArray(variant.options) ? variant.options : [];\r\n        if (colorIdx >= 0 && normalizedActiveColor) {\r\n          var variantColor = String(opts[colorIdx] || '').trim().toLowerCase();\r\n          if (variantColor !== normalizedActiveColor) return;\r\n        }\r\n\r\n        var existing = currentRowsByVariant[variantId] || null;\r\n        var inventoryManaged = !!variant.inventory_management;\r\n        var inventoryPolicy = String(variant.inventory_policy || '').toLowerCase();\r\n        var stockQty = inventoryManaged && Number.isFinite(Number(variant.inventory_quantity))\r\n          ? Math.max(0, Math.floor(Number(variant.inventory_quantity)))\r\n          : null;\r\n        if (!inventoryManaged || inventoryPolicy === 'continue') stockQty = null;\r\n        var remainingStock = stockQty === null\r\n          ? null\r\n          : Math.max(0, stockQty - Math.max(0, Math.floor(Number(existing ? existing.currentQty : 0) || 0)));\r\n        var stockLabel = 'En stock';\r\n        if (remainingStock !== null) {\r\n          stockLabel = remainingStock < 11\r\n            ? ('Reste: ' + String(Math.max(0, remainingStock)))\r\n            : 'En stock';\r\n        } else if (variant.available === false) {\r\n          stockLabel = '';\r\n        }\r\n\r\n        rows.push({\r\n          label: existing && existing.label\r\n            ? existing.label\r\n            : (sizeIdx >= 0 ? String(opts[sizeIdx] || 'Taille') : String(variant.title || 'Taille')),\r\n          variantId: variantId,\r\n          lineNumber: existing ? existing.lineNumber : '',\r\n          lineKey: existing ? (existing.lineKey || '') : '',\r\n          quantity: existing ? existing.quantity : 0,\r\n          currentQty: existing ? existing.currentQty : 0,\r\n          stock: stockQty,\r\n          remainingStock: remainingStock,\r\n          stockLabel: stockLabel,\r\n          props: Object.assign({}, firstProps, {\r\n            _pz_base_price_cents: String(Math.max(0, Math.round(Number(variant.price) || 0)))\r\n          })\r\n        });\r\n      });\r\n\r\n      var includedIds = {};\r\n      rows.forEach(function (row) {\r\n        includedIds[String(row.variantId || '')] = true;\r\n      });\r\n      Object.keys(currentRowsByVariant).forEach(function (variantId) {\r\n        if (includedIds[String(variantId)]) return;\r\n        rows.push(currentRowsByVariant[String(variantId)]);\r\n      });\r\n\r\n      rows = rows.filter(function (row) {\r\n        var label = String(row && row.label || '').toLowerCase();\r\n        if (!normalizedActiveColor) return true;\r\n        if (label.indexOf('/') >= 0) {\r\n          return label.indexOf(normalizedActiveColor) >= 0;\r\n        }\r\n        return true;\r\n      });\r\n\r\n      rows.sort(function (a, b) {\r\n        return compareSizeLabels(a && a.label, b && b.label);\r\n      });\r\n      return applyLiveStockToRowsByVariantId(rows.length ? rows : Object.values(currentRowsByVariant), group);\r\n    });\r\n  }\r\n\r\n  // Rend les lignes de la modale tailles avec steppers custom (style personalizer).\r\n  function renderSizeRowsInModal(rows) {\r\n    if (!modal) return;\r\n    var grid = modal.querySelector('[data-size-grid]');\r\n    if (!grid) return;\r\n    modal._sizeRows = Array.isArray(rows) ? rows : [];\r\n    grid.innerHTML = (modal._sizeRows || [])\r\n      .map(function (row) {\r\n        var lineNo = row.lineNumber ? String(row.lineNumber) : '';\r\n        var lineKey = row.lineKey ? String(row.lineKey) : '';\r\n        var variantId = String(row.variantId || '');\r\n        var qty = getModalRowQuantity(row);\r\n        var maxQty = getModalRowMaxQtyFromData(row);\r\n        var remainingStock = getModalRowRemainingStock(row);\r\n        var stockBadge = getModalStockBadgeState(remainingStock);\r\n        var disableMinus = qty <= 0;\r\n        var disablePlus = Number.isFinite(maxQty) ? qty >= maxQty : false;\r\n        return (\r\n          '<div class=\"personalizer-cart-qty-row\">' +\r\n          '<div class=\"personalizer-cart-qty-field\">' +\r\n          '<label>' + escapeHtml(row.label || 'Taille') + '</label>' +\r\n          '</div>' +\r\n          '<div class=\"personalizer-size-stepper\">' +\r\n          '<span class=\"personalizer-size-row__stock' + (stockBadge.hidden ? ' is-hidden' : '') + (stockBadge.available ? ' is-available' : '') + '\" data-size-stock-badge>' +\r\n          escapeHtml(stockBadge.text) +\r\n          '</span>' +\r\n          '<button type=\"button\" class=\"personalizer-size-stepper__btn' + (disableMinus ? ' is-disabled' : '') + '\" data-action=\"size-decrease\" data-variant-id=\"' + escapeHtml(variantId) + '\" aria-label=\"Retirer\"' + (disableMinus ? ' disabled' : '') + '>-</button>' +\r\n          '<input type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" class=\"personalizer-size-stepper__input\" data-size-quantity-input data-size-value data-variant-id=\"' + escapeHtml(variantId) + '\" value=\"' + String(qty) + '\"' +\r\n          ' data-current-qty=\"' + String(row.currentQty || 0) + '\"' +\r\n          (lineNo ? ' data-line-number=\"' + lineNo + '\"' : '') +\r\n          (lineKey ? ' data-line-key=\"' + escapeHtml(lineKey) + '\"' : '') +\r\n          (Number.isFinite(maxQty) ? ' data-max-qty=\"' + String(maxQty) + '\"' : '') +\r\n          ' aria-label=\"Quantit\u00E9 pour la taille ' + escapeHtml(row.label || 'Taille') + '\">' +\r\n          '<button type=\"button\" class=\"personalizer-size-stepper__btn' + (disablePlus ? ' is-disabled' : '') + '\" data-action=\"size-increase\" data-variant-id=\"' + escapeHtml(variantId) + '\" aria-label=\"Ajouter\"' + (disablePlus ? ' disabled' : '') + '>+</button>' +\r\n          '<div class=\"personalizer-cart-qty-stepper personalizer-cart-qty-stepper--legacy\">' +\r\n          '<button type=\"button\" data-action=\"dec-size\" aria-label=\"Retirer\">-</button>' +\r\n          '<input type=\"number\" min=\"0\" step=\"1\" value=\"' + String(qty) + '\"' +\r\n          (lineNo ? ' data-line-number=\"' + lineNo + '\"' : '') +\r\n          (lineKey ? ' data-line-key=\"' + escapeHtml(lineKey) + '\"' : '') +\r\n          ' data-variant-id=\"' + escapeHtml(variantId) + '\"' +\r\n          (Number.isFinite(maxQty) ? ' max=\"' + String(maxQty) + '\"' : '') +\r\n          (Number.isFinite(maxQty) ? ' data-max-qty=\"' + String(maxQty) + '\"' : '') +\r\n          ' data-current-qty=\"' + String(row.currentQty || 0) + '\">' +\r\n          '<button type=\"button\" data-action=\"inc-size\" aria-label=\"Ajouter\">+</button>' +\r\n          '</div>' +\r\n          '</div>' +\r\n          '</div>'\r\n        );\r\n      })\r\n      .join('');\r\n  }\r\n\r\n  function getModalRowQuantity(row) {\r\n    return Math.max(0, Math.floor(Number(row && row.quantity) || 0));\r\n  }\r\n\r\n  function getModalRowMaxQtyFromData(row) {\r\n    var stock = Number(row && row.stock);\r\n    if (!Number.isFinite(stock)) return Number.POSITIVE_INFINITY;\r\n    return Math.max(0, Math.floor(stock));\r\n  }\r\n\r\n  function getModalRowRemainingStock(row) {\r\n    var maxQty = getModalRowMaxQtyFromData(row);\r\n    if (!Number.isFinite(maxQty)) return Number.POSITIVE_INFINITY;\r\n    return Math.max(0, maxQty - getModalRowQuantity(row));\r\n  }\r\n\r\n  function getModalStockBadgeState(remaining) {\r\n    if (!Number.isFinite(remaining)) return { hidden: true, text: '', available: false };\r\n    if (remaining < 11) return { hidden: false, text: 'Reste: ' + String(Math.max(0, remaining)), available: false };\r\n    return { hidden: false, text: 'En stock', available: true };\r\n  }\r\n\r\n  // Ouvre la modale \"Modifier la quantit\u00C3\u00A9 et la taille\" puis charge les tailles async.\r\n  function getModalRowMaxQty(input) {\r\n    if (!input) return null;\r\n    var raw = input.getAttribute('data-max-qty');\r\n    if (raw === null || raw === '') return null;\r\n    var parsed = Number(raw);\r\n    if (!Number.isFinite(parsed) || parsed < 0) return null;\r\n    return Math.max(0, Math.floor(parsed));\r\n  }\r\n\r\n  function syncModalRowInteractiveUi(rowNode, input) {\r\n    if (!rowNode || !input) return;\r\n    var value = Math.max(0, Math.floor(Number(input.value) || 0));\r\n    var maxQty = getModalRowMaxQty(input);\r\n    if (Number.isFinite(maxQty)) value = Math.min(value, maxQty);\r\n    input.value = String(value);\r\n\r\n    var valueNode = rowNode.querySelector('[data-size-value]');\r\n    if (valueNode) {\r\n      if (String(valueNode.tagName || '').toLowerCase() === 'input') {\r\n        valueNode.value = String(value);\r\n      } else {\r\n        valueNode.textContent = String(value);\r\n      }\r\n    }\r\n\r\n    var decBtn = rowNode.querySelector('[data-action=\"size-decrease\"]');\r\n    var incBtn = rowNode.querySelector('[data-action=\"size-increase\"]');\r\n    if (decBtn) {\r\n      decBtn.disabled = value <= 0;\r\n      decBtn.classList.toggle('is-disabled', value <= 0);\r\n    }\r\n    if (incBtn) {\r\n      var atMax = Number.isFinite(maxQty) ? value >= maxQty : false;\r\n      incBtn.disabled = atMax;\r\n      incBtn.classList.toggle('is-disabled', atMax);\r\n    }\r\n\r\n    var stockBadge = rowNode.querySelector('[data-size-stock-badge]');\r\n    if (stockBadge) {\r\n      var remaining = Number.isFinite(maxQty) ? Math.max(0, maxQty - value) : null;\r\n      var badgeState = getModalStockBadgeState(remaining);\r\n      stockBadge.classList.toggle('is-hidden', !!badgeState.hidden);\r\n      stockBadge.classList.toggle('is-available', !!badgeState.available);\r\n      stockBadge.textContent = badgeState.text || '';\r\n    }\r\n  }\r\n\r\n  function openSizesModal(groupId) {\r\n    var group = currentGroupsById[groupId];\r\n    if (!group) return;\r\n    ensureModal();\r\n    modal.dataset.groupId = groupId;\r\n    modal._groupId = groupId;\r\n    var grid = modal.querySelector('[data-size-grid]');\r\n    if (grid) {\r\n      grid.innerHTML = '<div class=\"personalizer-cart-qty-loading\">Chargement des tailles...</div>';\r\n    }\r\n    modal._sizeRows = [];\r\n    renderModalPricingSummary();\r\n    modal.hidden = false;\r\n    lockBodyScroll();\r\n\r\n    buildModalRowsForGroup(group).then(function (rows) {\r\n      if (!modal || modal.hidden) return;\r\n      if (String(modal.dataset.groupId || '') !== String(groupId)) return;\r\n      renderSizeRowsInModal(rows);\r\n      renderModalPricingSummary();\r\n    });\r\n  }\r\n\r\n  function closeModal() {\r\n    if (!modal) return;\r\n    modal.hidden = true;\r\n    modal.removeAttribute('data-group-id');\r\n    unlockBodyScroll();\r\n  }\r\n\r\n  function cartChange(line, quantity) {\r\n    return fetch(routesRoot() + 'cart/change.js', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n      body: JSON.stringify({ line: line, quantity: quantity }),\r\n    }).then(function (response) {\r\n      if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n      return response.json();\r\n    });\r\n  }\r\n\r\n  function cartUpdate(updates) {\r\n    return fetch(routesRoot() + 'cart/update.js', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n      body: JSON.stringify({ updates: updates || {} }),\r\n    }).then(function (response) {\r\n      if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n      return response.json();\r\n    });\r\n  }\r\n\r\n  function cartAddItem(item) {\r\n    return fetch(routesRoot() + 'cart/add.js', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n      body: JSON.stringify(Object.assign({}, item, { properties: window.OrionPersonalizationStore.compactProperties(item.properties) })),\r\n    }).then(function (response) {\r\n      if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n      return response.json();\r\n    });\r\n  }\r\n\r\n  function sanitizeQtyInputValue(input) {\r\n    if (!input) return 0;\r\n    var sanitized = String(input.value || '').replace(/[^\\d]/g, '');\r\n    var nextVal = sanitized === '' ? 0 : Math.max(0, Math.floor(Number(sanitized) || 0));\r\n    var maxQty = getModalRowMaxQty(input);\r\n    if (Number.isFinite(maxQty)) nextVal = Math.min(nextVal, maxQty);\r\n    input.value = String(nextVal);\r\n    return nextVal;\r\n  }\r\n\r\n  function cartAddItems(items) {\r\n    return fetch(routesRoot() + 'cart/add.js', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n      body: JSON.stringify({ items: (items || []).map(function (item) {\r\n        return Object.assign({}, item, { properties: window.OrionPersonalizationStore.compactProperties(item.properties) });\r\n      }) }),\r\n    }).then(function (response) {\r\n      if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n      return response.json();\r\n    });\r\n  }\r\n\r\n  // Valide les modifications de tailles:\r\n  // 1) update des lignes existantes\r\n  // 2) add des nouvelles tailles\r\n  // 3) resync des frais techniques\r\n  // 4) rerender local (sans montrer les transitions backend)\r\n  function saveModalChanges() {\r\n    if (!modal || pendingUpdate) return;\r\n    // Chaque ligne contient aussi un ancien champ de compatibilit\u00E9 cach\u00E9.\r\n    // Ne lire que le champ principal, sinon sa valeur obsol\u00E8te peut \u00E9craser\r\n    // la valeur saisie dans le stepper (notamment lorsqu'elle vaut 0).\r\n    var inputs = Array.prototype.slice.call(modal.querySelectorAll('input[data-size-quantity-input]'));\r\n    if (!inputs.length) return closeModal();\r\n\r\n    var groupId = String(modal.dataset.groupId || '');\r\n    var group = currentGroupsById[groupId];\r\n    if (!group) return closeModal();\r\n\r\n    var existingUpdates = {};\r\n    var additions = [];\r\n    var firstEntry = group.productLines && group.productLines[0] ? group.productLines[0] : null;\r\n    var firstProps = Object.assign({}, (firstEntry && firstEntry.props) || {});\r\n    var isPersonalizedGroup = group.kind === 'personalized';\r\n\r\n    inputs.forEach(function (input) {\r\n      var nextQty = Math.max(0, Math.floor(Number(input.value) || 0));\r\n      var currentQty = Math.max(0, Math.floor(Number(input.getAttribute('data-current-qty')) || 0));\r\n      var lineAttr = String(input.getAttribute('data-line-number') || '');\r\n      var variantId = String(input.getAttribute('data-variant-id') || '');\r\n      if (!variantId) return;\r\n      if (lineAttr) {\r\n        var lineNum = Number(lineAttr);\r\n        if (Number.isFinite(lineNum) && nextQty !== currentQty) {\r\n          var lineKey = String(input.getAttribute('data-line-key') || '');\r\n          if (lineKey) {\r\n            existingUpdates[lineKey] = nextQty;\r\n          } else {\r\n            var entry = group.productLines.find(function (candidate) { return candidate.lineNumber === lineNum; });\r\n            if (entry && entry.lineKey) existingUpdates[entry.lineKey] = nextQty;\r\n            else throw new Error('Missing cart line key');\r\n          }\r\n        }\r\n        return;\r\n      }\r\n      if (nextQty <= 0) return;\r\n      var row = (modal._sizeRows || []).find(function (candidate) {\r\n        return String(candidate && candidate.variantId) === variantId;\r\n      });\r\n      var props = Object.assign({}, firstProps, row && row.props ? row.props : {});\r\n      var addition = {\r\n        id: variantId,\r\n        quantity: nextQty\r\n      };\r\n      if (isPersonalizedGroup) {\r\n        // Les nouvelles lignes produits ajoutees dans ce meme bloc reutilisent le meme group id.\r\n        props._custom_group_id = String(props._custom_group_id || group.id || props._custom_group_id || props._personalization_group || '');\r\n        props._personalization_group = String(group.id || props._custom_group_id || props._personalization_group || '');\r\n        props._personalized_product = 'true';\r\n        if (row && row.props && row.props._pz_base_price_cents) {\r\n          props._pz_base_price_cents = String(row.props._pz_base_price_cents);\r\n        }\r\n        addition.properties = props;\r\n      }\r\n      additions.push(addition);\r\n    });\r\n\r\n    pendingUpdate = true;\r\n    deferBusyOverlayRelease = true;\r\n    setBusyOverlay(true, false);\r\n    var saveBtn = modal.querySelector('[data-action=\"save\"]');\r\n    var closeBtns = Array.prototype.slice.call(modal.querySelectorAll('[data-action=\"close\"]'));\r\n    if (saveBtn) saveBtn.setAttribute('disabled', 'disabled');\r\n    closeBtns.forEach(function (btn) { btn.setAttribute('disabled', 'disabled'); });\r\n\r\n    var chain = Promise.resolve();\r\n    if (Object.keys(existingUpdates).length) {\r\n      chain = chain.then(function () {\r\n        return cartUpdate(existingUpdates);\r\n      });\r\n    }\r\n    additions.forEach(function (item) {\r\n      chain = chain.then(function () {\r\n        return cartAddItem(item);\r\n      });\r\n    });\r\n\r\n    chain\r\n      .then(function () {\r\n        if (group.kind === 'personalized' && window.PersonalizerCartSync && typeof window.PersonalizerCartSync.syncNow === 'function') {\r\n          return window.PersonalizerCartSync.syncNow();\r\n        }\r\n        if (group.kind === 'personalized' && window.PersonalizerCartSync && typeof window.PersonalizerCartSync.scheduleSync === 'function') {\r\n          window.PersonalizerCartSync.scheduleSync(50);\r\n        }\r\n        return Promise.resolve();\r\n      })\r\n      .then(function () {\r\n        return render();\r\n      })\r\n      .then(function () {\r\n        closeModal();\r\n      })\r\n      .catch(function (error) {\r\n        console.error('personalizer-cart-groups update error', error);\r\n        setBusyOverlay(false, false);\r\n        window.alert(\"Impossible de mettre a jour le panier pour le moment.\");\r\n      })\r\n      .finally(function () {\r\n        pendingUpdate = false;\r\n        if (saveBtn) saveBtn.removeAttribute('disabled');\r\n        closeBtns.forEach(function (btn) { btn.removeAttribute('disabled'); });\r\n        scheduleRecoveryRenders();\r\n      });\r\n  }\r\n\r\n  // Supprime toutes les lignes d'un groupe (produits + frais) en une op\u00C3\u00A9ration batch.\r\n  function deleteGroup(groupId) {\r\n    var group = currentGroupsById[groupId];\r\n    if (!group || pendingUpdate) return;\r\n    closeDeleteConfirmModal();\r\n    var allEntries = (group.productLines || []).concat(group.feeLines || []);\r\n    if (!allEntries.length) return;\r\n\r\n    pendingUpdate = true;\r\n    deferBusyOverlayRelease = true;\r\n    setBusyOverlay(true, false);\r\n    var updates = {};\r\n    allEntries.forEach(function (entry) {\r\n      var key = String(entry && entry.lineKey || '');\r\n      if (key) {\r\n        updates[key] = 0;\r\n        return;\r\n      }\r\n      var lineNo = Number(entry && entry.lineNumber);\r\n      if (Number.isFinite(lineNo)) updates[String(lineNo)] = 0;\r\n    });\r\n\r\n    var chain = Promise.resolve();\r\n    if (Object.keys(updates).length) {\r\n      chain = chain.then(function () {\r\n        return cartUpdate(updates);\r\n      });\r\n    }\r\n\r\n    chain\r\n      .then(function () {\r\n        if (window.PersonalizerCartSync && typeof window.PersonalizerCartSync.syncNow === 'function') {\r\n          return window.PersonalizerCartSync.syncNow();\r\n        }\r\n        if (window.PersonalizerCartSync && typeof window.PersonalizerCartSync.scheduleSync === 'function') {\r\n          window.PersonalizerCartSync.scheduleSync(50);\r\n        }\r\n        return Promise.resolve();\r\n      })\r\n      .then(function () {\r\n        return render();\r\n      })\r\n      .catch(function (error) {\r\n        console.error('personalizer-cart-groups delete error', error);\r\n        setBusyOverlay(false, false);\r\n        window.alert(\"Impossible de supprimer ce produit pour le moment.\");\r\n      })\r\n      .finally(function () {\r\n        pendingUpdate = false;\r\n        scheduleRecoveryRenders();\r\n      });\r\n  }\r\n\r\n  // Pr\u00C3\u00A9pare l'\u00C3\u00A9dition du graphisme depuis le panier:\r\n  // s\u00C3\u00A9rialise le contexte du groupe en sessionStorage puis redirige vers la fiche produit.\r\n  function openGraphicEditor(groupId) {\r\n    var group = currentGroupsById[groupId];\r\n    if (!group || !Array.isArray(group.productLines) || !group.productLines.length) return;\r\n\r\n    var firstEntry = group.productLines[0];\r\n    var firstProps = (firstEntry && firstEntry.props) || {};\r\n    var personalizationJson = String(firstProps._personalization_json || '');\r\n    if (!personalizationJson && !firstProps._personalization_config_id) {\r\n      window.alert(\"Aucune personnalisation sauvegardee n'a ete trouvee pour ce groupe.\");\r\n      return;\r\n    }\r\n\r\n    var sizesByVariantId = {};\r\n    group.productLines.forEach(function (entry) {\r\n      var line = entry && entry.line ? entry.line : null;\r\n      if (!line) return;\r\n      var variantId = String(line.variant_id || '');\r\n      if (!variantId) return;\r\n      sizesByVariantId[variantId] = Math.max(0, Math.floor(Number(line.quantity) || 0));\r\n    });\r\n\r\n    var selectedZone = String(firstProps._selected_zone || '');\r\n    var payload = {\r\n      version: 1,\r\n      source: 'cart-group',\r\n      savedAt: Date.now(),\r\n      groupId: String(group.id || ''),\r\n      productId: Number(firstEntry.line && firstEntry.line.product_id) || null,\r\n      productHandle: String((firstEntry.line && firstEntry.line.handle) || ''),\r\n      productUrl: String(group.productUrl || (firstEntry.line && firstEntry.line.url) || ''),\r\n      variantId: Number(firstEntry.line && firstEntry.line.variant_id) || null,\r\n      personalizationJson: personalizationJson,\r\n      personalizationConfigId: firstProps._personalization_config_id || null,\r\n      selectedTechnique: String(firstProps._selected_technique || ''),\r\n      selectedZone: selectedZone,\r\n      activeView: selectedZone.toLowerCase().indexOf('back') >= 0 ? 'back' : 'front',\r\n      sizesByVariantId: sizesByVariantId,\r\n      selectedPrintOptionKeys: (group.feeLines || []).map(function (entry) {\r\n        return String(entry && entry.props && entry.props._print_option_key || '');\r\n      }).filter(Boolean),\r\n      printSelection: {\r\n        format: String(firstProps._print_format || ''),\r\n        paper: String(firstProps._print_paper || ''),\r\n        sides: String(firstProps._print_sides || '')\r\n      }\r\n    };\r\n\r\n    if (!payload.productUrl) {\r\n      window.alert(\"Impossible de retrouver la fiche produit pour ce groupe.\");\r\n      return;\r\n    }\r\n\r\n    if (payload.variantId) {\r\n      try {\r\n        var editProductUrl = new URL(payload.productUrl, window.location.origin);\r\n        editProductUrl.searchParams.set('variant', String(payload.variantId));\r\n        payload.productUrl = editProductUrl.pathname + editProductUrl.search + editProductUrl.hash;\r\n      } catch (error) {}\r\n    }\r\n\r\n    try {\r\n      window.sessionStorage.setItem(GRAPHIC_EDIT_KEY, JSON.stringify(payload));\r\n    } catch (error) {\r\n      console.error('personalizer-cart-groups edit-graphic session error', error);\r\n      window.alert(\"Impossible de preparer l'edition du graphisme pour le moment.\");\r\n      return;\r\n    }\r\n\r\n    setBusyOverlay(true, false);\r\n    window.location.href = payload.productUrl;\r\n  }\r\n\r\n  function duplicateGroup(groupId) {\r\n    var group = currentGroupsById[groupId];\r\n    if (!group || pendingUpdate || !Array.isArray(group.productLines) || !group.productLines.length) return;\r\n\r\n    var nextGroupId = createPersonalizationGroupId();\r\n    var duplicatedMainQuantity = (group.productLines || []).reduce(function (total, entry) {\r\n      return total + Math.max(0, Math.floor(Number(entry && entry.line && entry.line.quantity) || 0));\r\n    }, 0);\r\n    var productAdditions = group.productLines\r\n      .map(function (entry) {\r\n        var line = entry && entry.line ? entry.line : null;\r\n        var props = Object.assign({}, (entry && entry.props) || {});\r\n        var variantId = line && line.variant_id ? line.variant_id : null;\r\n        var quantity = Math.max(0, Math.floor(Number(line && line.quantity) || 0));\r\n        if (!variantId || quantity <= 0) return null;\r\n        // La duplication cree un nouveau bloc: toutes ses lignes partagent un nouveau group id unique.\r\n        props._custom_group_id = nextGroupId;\r\n        props._personalization_group = nextGroupId;\r\n        props._personalized_product = 'true';\r\n        return {\r\n          id: variantId,\r\n          quantity: quantity,\r\n          properties: props\r\n        };\r\n      })\r\n      .filter(Boolean);\r\n\r\n    var feeAdditions = (group.feeLines || [])\r\n      .map(function (entry) {\r\n        var line = entry && entry.line ? entry.line : null;\r\n        var props = Object.assign({}, (entry && entry.props) || {});\r\n        var variantId = line && (line.variant_id || line.id) ? String(line.variant_id || line.id) : '';\r\n        var quantity = Math.max(0, Math.floor(Number(line && line.quantity) || 0));\r\n        var isPrintOption = String(props._print_option || '').toLowerCase() === 'true' || props._orion_line_role === 'print_option';\r\n        if (isPrintOption) {\r\n          quantity = String(props._print_option_quantity_mode || '').toLowerCase() === 'fixed'\r\n            ? 1\r\n            : duplicatedMainQuantity;\r\n        }\r\n        if (!variantId || quantity <= 0) return null;\r\n        props._custom_group_id = nextGroupId;\r\n        props._personalization_group = nextGroupId;\r\n        props._personalization_fee = 'true';\r\n        return {\r\n          id: variantId,\r\n          quantity: quantity,\r\n          properties: props\r\n        };\r\n      })\r\n      .filter(Boolean);\r\n\r\n    var additions = productAdditions.concat(feeAdditions);\r\n    if (!additions.length) return;\r\n    if (group.previews) storeGroupPreviews(nextGroupId, group.previews);\r\n\r\n    pendingUpdate = true;\r\n    deferBusyOverlayRelease = true;\r\n    setBusyOverlay(true, false);\r\n\r\n    var firstProps = group.productLines[0].props || {};\r\n    var chain = Promise.resolve().then(function () {\r\n      if (!firstProps._personalization_config_id) throw new Error('Ouvrez puis enregistrez cette ancienne personnalisation avant de la dupliquer.');\r\n      return window.OrionPersonalizationStore.clone(firstProps._personalization_config_id, group.id, nextGroupId);\r\n    }).then(function (saved) {\r\n      productAdditions.forEach(function (item) {\r\n        item.properties._personalization_config_id = saved.personalizationConfigId;\r\n        item.properties._bat_upload_id = saved.uploadId;\r\n      });\r\n      return cartAddItems(additions);\r\n    });\r\n\r\n    chain\r\n      .then(function () {\r\n        if (window.PersonalizerCartSync && typeof window.PersonalizerCartSync.syncNow === 'function') {\r\n          return window.PersonalizerCartSync.syncNow();\r\n        }\r\n        if (window.PersonalizerCartSync && typeof window.PersonalizerCartSync.scheduleSync === 'function') {\r\n          window.PersonalizerCartSync.scheduleSync(50);\r\n        }\r\n        return Promise.resolve();\r\n      })\r\n      .then(function () {\r\n        return render();\r\n      })\r\n      .catch(function (error) {\r\n        console.error('personalizer-cart-groups duplicate error', error);\r\n        setBusyOverlay(false, false);\r\n        window.alert(\"Impossible de dupliquer ce groupe pour le moment.\");\r\n      })\r\n      .finally(function () {\r\n        pendingUpdate = false;\r\n        scheduleRecoveryRenders();\r\n      });\r\n  }\r\n\r\n  // Executes one group action from the cart cards.\r\n  // Split from click delegation so we can re-run the same action after a cache refresh\r\n  // without forcing the user to click a second time.\r\n  function runGroupAction(action, groupId, event) {\r\n    if (!groupId) return;\r\n    if (pendingUpdate) {\r\n      if (event && typeof event.preventDefault === 'function') event.preventDefault();\r\n      return;\r\n    }\r\n\r\n    if (action === 'edit-sizes') {\r\n      if (event && typeof event.preventDefault === 'function') event.preventDefault();\r\n      openSizesModal(groupId);\r\n      return;\r\n    }\r\n    if (action === 'edit-graphic') {\r\n      if (event && typeof event.preventDefault === 'function') event.preventDefault();\r\n      openGraphicEditor(groupId);\r\n      return;\r\n    }\r\n    if (action === 'delete-group') {\r\n      if (event && typeof event.preventDefault === 'function') event.preventDefault();\r\n      openDeleteConfirmModal(groupId);\r\n      return;\r\n    }\r\n    if (action === 'duplicate-group') {\r\n      if (event && typeof event.preventDefault === 'function') event.preventDefault();\r\n      duplicateGroup(groupId);\r\n      return;\r\n    }\r\n  }\r\n\r\n  // Event delegation global:\r\n  // les cartes sont rerendues souvent, donc on centralise tous les clics ici.\r\n  function bindUiEvents() {\r\n    document.addEventListener('click', function (event) {\r\n      try {\r\n        var target = event.target;\r\n        if (!(target instanceof HTMLElement)) return;\r\n        var clickedImage = target.closest('img.personalizer-cart-group__image');\r\n        if (clickedImage && clickedImage.closest(rootSelector)) {\r\n          event.preventDefault();\r\n          openImagePreview(clickedImage.getAttribute('src'), clickedImage.getAttribute('alt'));\r\n          return;\r\n        }\r\n        var trigger = target.closest('[data-action][data-group-id]');\r\n        if (!trigger) return;\r\n\r\n        if (!trigger.closest(rootSelector)) return;\r\n\r\n        var action = trigger.getAttribute('data-action');\r\n        var groupId = String(trigger.getAttribute('data-group-id') || '');\r\n        if (!groupId) return;\r\n\r\n        if (action === 'group-preview-prev' || action === 'group-preview-next') {\r\n          event.preventDefault();\r\n          var section = trigger.closest('[data-personalizer-group-id]');\r\n          var carousel = section && section.querySelector('[data-group-preview-carousel]');\r\n          if (!carousel) return;\r\n          var dataNode = carousel.querySelector('.personalizer-cart-group__preview-data');\r\n          var imageNode = carousel.querySelector('[data-group-preview-image]');\r\n          var labelNode = carousel.querySelector('[data-group-preview-label]');\r\n          if (!dataNode || !imageNode) return;\r\n          var frontSrc = String(dataNode.getAttribute('data-front-src') || '');\n          var backSrc = String(dataNode.getAttribute('data-back-src') || '');\n          var frontLabel = String(dataNode.getAttribute('data-front-label') || 'Avant');\n          var backLabel = String(dataNode.getAttribute('data-back-label') || 'Dos');\n          if (!frontSrc || !backSrc) return;\r\n          var currentView = String(carousel.getAttribute('data-current-view') || 'front') === 'back' ? 'back' : 'front';\r\n          var nextView = currentView === 'front' ? 'back' : 'front';\r\n          imageNode.setAttribute('src', nextView === 'back' ? backSrc : frontSrc);\r\n          carousel.setAttribute('data-current-view', nextView);\r\n          if (labelNode) labelNode.textContent = nextView === 'back' ? backLabel : frontLabel;\n          return;\r\n        }\r\n\r\n        // If the local cache is momentarily stale after a section rerender, refresh and\r\n        // execute the requested action immediately (no second click required).\r\n        if (!currentGroupsById[groupId]) {\r\n          event.preventDefault();\r\n          render().then(function () {\r\n            if (currentGroupsById[groupId]) runGroupAction(action, groupId, null);\r\n          });\r\n          return;\r\n        }\r\n\r\n        runGroupAction(action, groupId, event);\r\n      } catch (error) {\r\n        console.error('personalizer-cart-groups click handler error', error);\r\n      }\r\n    });\r\n  }\r\n\r\n  // Pipeline principal de rendu de la page panier custom.\r\n  function render() {\r\n    var container = ensureGroupsContainer();\r\n    if (!container) return Promise.resolve();\r\n    syncGroupsPlacement();\r\n    container = ensureGroupsContainer();\r\n    if (!container) return Promise.resolve();\r\n    bindDomObserver();\r\n    return fetchCart()\r\n      .then(window.OrionPersonalizationStore.hydrateCart)\r\n      .then(function (cart) {\r\n        var itemCount = Math.max(0, Number(cart && cart.item_count) || 0);\r\n        if (itemCount === 0) {\r\n          var footer = document.getElementById('main-cart-footer');\r\n          var cartItemsRoot = document.querySelector('cart-items');\r\n          var nativeEmptyStateReady = !!(cartItemsRoot && cartItemsRoot.classList.contains('is-empty'));\r\n          if (footer) {\r\n            footer.style.display = 'none';\r\n            footer.hidden = true;\r\n          }\r\n          container.hidden = true;\r\n          container.innerHTML = '';\r\n          setBusyOverlay(false, false);\r\n          try {\r\n            if (!nativeEmptyStateReady && window.sessionStorage.getItem(EMPTY_REDIRECT_FLAG_KEY) !== '1') {\r\n              window.sessionStorage.setItem(EMPTY_REDIRECT_FLAG_KEY, '1');\r\n              window.location.reload();\r\n              return;\r\n            }\r\n            window.sessionStorage.removeItem(EMPTY_REDIRECT_FLAG_KEY);\r\n          } catch (error) {}\r\n          return;\r\n        }\r\n        try { window.sessionStorage.removeItem(EMPTY_REDIRECT_FLAG_KEY); } catch (error) {}\r\n\r\n        var groups = groupCart(cart);\r\n        groups = reconcileGroupTotalsWithCart(groups, cart && cart.total_price);\r\n        hideGroupedRows(groups);\r\n        syncNativeRowsVisibility(cart, groups);\r\n        if (!groups.length) {\r\n          container.hidden = true;\r\n          container.innerHTML = '';\r\n        }\r\n        renderGroupCards(groups);\r\n        syncCartRecapSidebar(cart, groups);\r\n        if (!deferBusyOverlayRelease) setBusyOverlay(false, false);\r\n      })\r\n      .catch(function (error) {\r\n        console.error('personalizer-cart-groups render error', error);\r\n        deferBusyOverlayRelease = false;\r\n        setBusyOverlay(false, false);\r\n      });\r\n  }\r\n\r\n  function scheduleRender(delay) {\r\n    if (renderTimer) window.clearTimeout(renderTimer);\r\n    renderTimer = window.setTimeout(function () {\r\n      renderTimer = null;\r\n      render();\r\n    }, typeof delay === 'number' ? delay : 80);\r\n  }\r\n\r\n  function scheduleRecoveryRenders() {\r\n    window.setTimeout(function () {\r\n      if (pendingUpdate) return;\r\n      render();\r\n    }, 140);\r\n    window.setTimeout(function () {\r\n      if (pendingUpdate) return;\r\n      render().finally(function () {\r\n        deferBusyOverlayRelease = false;\r\n        setBusyOverlay(false, false);\r\n      });\r\n    }, 420);\r\n  }\r\n\r\n  // Observe les rerenders de sections Shopify pour rerendre nos cartes group\u00C3\u00A9es.\r\n  function bindDomObserver() {\r\n    var host = document.querySelector('#main-cart-items .js-contents');\r\n    if (!host || typeof MutationObserver === 'undefined') return;\r\n    if (observerBound && domObserver && observerHost === host) return;\r\n    if (domObserver) {\r\n      try { domObserver.disconnect(); } catch (error) {}\r\n    }\r\n\r\n    observerBound = true;\r\n    observerHost = host;\r\n    domObserver = new MutationObserver(function () {\r\n      if (!shouldAutoRefreshCartGroups()) return;\r\n      scheduleRender(60);\r\n    });\r\n\r\n    domObserver.observe(host, {\r\n      childList: true,\r\n      subtree: true\r\n    });\r\n  }\r\n\r\n  // Initialisation unique du module (singleton gard\u00C3\u00A9 via flag global).\r\n  function init() {\r\n    if (!ensureGroupsContainer()) return;\r\n    reconcileBodyScrollLock();\r\n    window.addEventListener('pagehide', resetBodyScrollLock);\r\n    window.addEventListener('pageshow', reconcileBodyScrollLock);\r\n    restoreBusyOverlayIfNeeded();\r\n    bindUiEvents();\r\n    syncGroupsPlacement();\r\n    window.addEventListener('resize', function () {\r\n      if (viewportSyncTimer) window.clearTimeout(viewportSyncTimer);\r\n      viewportSyncTimer = window.setTimeout(function () {\r\n        viewportSyncTimer = null;\r\n        syncGroupsPlacement();\r\n      }, 120);\r\n    });\r\n    bindDomObserver();\r\n\r\n    setBusyOverlay(true, false);\r\n    initialCartSyncPromise = new Promise(function (resolve) {\r\n      var attempts = 0;\r\n      function waitForSyncModule() {\r\n        var syncApi = window.PersonalizerCartSync;\r\n        if (syncApi && (syncApi.ready || typeof syncApi.syncNow === 'function')) {\r\n          var promise = syncApi.ready || syncApi.syncNow();\r\n          Promise.resolve(promise)\r\n            .catch(function (error) {\r\n              console.error('personalizer-cart-groups initial sync error', error);\r\n            })\r\n            .finally(resolve);\r\n          return;\r\n        }\r\n        attempts += 1;\r\n        if (attempts >= 60) {\r\n          resolve();\r\n          return;\r\n        }\r\n        window.setTimeout(waitForSyncModule, 25);\r\n      }\r\n      waitForSyncModule();\r\n    });\r\n\r\n    initialCartSyncPromise.finally(function () {\r\n      render();\r\n      scheduleRecoveryRenders();\r\n    });\r\n\r\n    if (typeof subscribe === 'function' && typeof PUB_SUB_EVENTS !== 'undefined' && PUB_SUB_EVENTS.cartUpdate) {\r\n      subscribe(PUB_SUB_EVENTS.cartUpdate, function () {\r\n        scheduleRender(160);\r\n      });\r\n    }\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n\r\n"],
  "mappings": "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",
  "names": []
}
