{
  "version": 3,
  "sources": ["/cdn/shop/t/33/assets/mls-jewelry-builder-v2.js?mls_release=20261105-sautoir-1"],
  "sourcesContent": ["  const MLS_CART_SCHEMA_VERSION = 'mls-v2-5';\n  const MLS_RENDER_FORMULA_VERSION = 'anchor-local-v1';\n  const MLS_V2_RUNTIME_VERSION = '2026.11.05.1';\n  const MLS_TARGET_HEIGHTS = Object.freeze({ S: 42, M: 54, L: 64, XL: 74 });\n  const mlsTranslate = (template, replacements = {}) => Object.entries(replacements).reduce(\n    (message, [key, value]) => message.replaceAll(`__${key}__`, String(value)),\n    String(template || '')\n  );\n  const MLS_GENERIC_COLLECTION_HANDLES = new Set(['all', 'tous', 'catalogue', 'charms']);\n  const MLS_ASTROLOGY_COLLECTION_HANDLES = new Set([\n    'signes-astrologiques-avec-strass',\n    'signes-astrologiques-dores'\n  ]);\n  const MLS_LETTER_NUMBER_COLLECTION_HANDLES = new Set([\n    'chiffres-dores',\n    'chiffres-strass',\n    'lettres-chiffres-1',\n    'lettres-bulles',\n    'lettres-dorees',\n    'lettres-strass'\n  ]);\n  const MLS_VISIBLE_COLLECTION_ORDER = Object.freeze([\n    'lettres-chiffres',\n    'signes-astrologiques',\n    'amour-symboles',\n    'nature-animaux',\n    'astres-symboles',\n    'pierres-perles-strass',\n    'lifestyle'\n  ]);\n  const MLS_ZODIAC_ORDER = Object.freeze([\n    'belier',\n    'taureau',\n    'gemeaux',\n    'cancer',\n    'lion',\n    'vierge',\n    'balance',\n    'scorpion',\n    'sagittaire',\n    'capricorne',\n    'verseau',\n    'poissons'\n  ]);\n  const MLS_FAMILY_PREFIXES = Object.freeze([\n    ['medaille soleil et lune', 'medaille soleil et lune'],\n    ['medaillon lune etoile', 'medaillon lune etoile'],\n    ['medaille poisson', 'medaille poisson'],\n    ['medaille croix', 'medaille croix'],\n    ['pierre rectangle', 'pierre rectangle'],\n    ['etoile de mer', 'etoile de mer'],\n    ['oeil de protection', 'oeil protecteur'],\n    ['oeil protecteur', 'oeil protecteur'],\n    ['main de protection', 'main protectrice'],\n    ['main protectrice', 'main protectrice'],\n    ['sac a main', 'sac a main'],\n    ['coeur ange', 'coeur ange'],\n    ['petit coeur', 'petit coeur'],\n    ['aile d ange', 'aile d ange'],\n    ['cerises', 'cerises'],\n    ['colibri', 'colibri'],\n    ['coquillage', 'coquillage'],\n    ['croix', 'croix'],\n    ['etoile', 'etoile'],\n    ['fleur', 'fleur'],\n    ['happy', 'happy'],\n    ['love', 'love'],\n    ['medaille', 'medaille'],\n    ['medaillon', 'medaillon'],\n    ['noeud', 'noeud'],\n    ['perle', 'perle'],\n    ['soleil', 'soleil'],\n    ['tournesol', 'tournesol'],\n    ['coeur', 'coeur']\n  ]);\n  const MLS_COLLECTION_TITLES = Object.freeze({\n    'amour-symboles': 'Amour',\n    'chiffres-dores': 'Chiffres dor\u00E9s',\n    'chiffres-strass': 'Chiffres strass',\n    fleurs: 'Fleurs',\n    'lettres-chiffres-1': 'Lettres & chiffres',\n    'lettres-bulles': 'Lettres bulles',\n    'lettres-dorees': 'Lettres dor\u00E9es',\n    'lettres-strass': 'Lettres strass',\n    lifestyle: 'Lifestyle',\n    'nature-animaux': 'Nature, fleurs & animaux',\n    'pierres-perles-strass': 'Pierres, perles & strass',\n    'signes-astrologiques-avec-strass': 'Signes astrologiques avec strass',\n    'signes-astrologiques-dores': 'Signes astrologiques dor\u00E9s',\n    'astres-symboles': 'Symboles, spiritualit\u00E9 & porte-bonheur'\n  });\n\n  const mlsCollectionTitle = (handle, profile, suppliedTitle = '') => {\n    if (suppliedTitle) return suppliedTitle;\n    if (handle === String(profile?.category || '') && profile?.categoryTitle) return profile.categoryTitle;\n    if (MLS_COLLECTION_TITLES[handle]) return MLS_COLLECTION_TITLES[handle];\n    const title = String(handle || '').replace(/-/g, ' ').trim();\n    return title ? `${title.charAt(0).toLocaleUpperCase('fr')}${title.slice(1)}` : '';\n  };\n\n  const mlsCustomerCharmTitle = (value) => {\n    const title = String(value || '')\n      .replace(/^\\s*charm\\s+/iu, '')\n      .replace(/\\s*(?:[\u2013\u2014-]\\s*)?r\u00E9f\\.?\\s*[:#-]?\\s*[\\p{L}\\p{N}][\\p{L}\\p{N}._/-]*(?:\\s*[\u2013\u2014-]\\s*[\\p{L}\\p{N}._/-]+)*\\s*$/iu, '')\n      .trim();\n    return title ? `${title.charAt(0).toLocaleUpperCase('fr')}${title.slice(1)}` : '';\n  };\n\n  const mlsSortText = (value) => mlsCustomerCharmTitle(value)\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .replace(/\u0153/giu, 'oe')\n    .replace(/\u00E6/giu, 'ae')\n    .replace(/[^a-z0-9]+/giu, ' ')\n    .trim()\n    .toLocaleLowerCase('fr');\n\n  const mlsProfileCollectionHandles = (profile) => [...new Set([\n    ...(Array.isArray(profile?.collections) ? profile.collections.map((collection) => collection?.handle) : []),\n    ...(Array.isArray(profile?.collectionHandles) ? profile.collectionHandles : []),\n    profile?.category\n  ].map((value) => String(value || '').trim().toLocaleLowerCase('fr')).filter(Boolean))];\n\n  const mlsIsLetterNumberCharm = (profile) => {\n    return mlsProfileCollectionHandles(profile)\n      .some((handle) => MLS_LETTER_NUMBER_COLLECTION_HANDLES.has(handle));\n  };\n\n  const mlsVisibleCollections = (profile, labels = {}) => {\n    const collections = new Map();\n    const isLetterNumberCharm = mlsIsLetterNumberCharm(profile);\n    const add = (handleValue, title = '', forceVisibleLetters = false) => {\n      let handle = String(handleValue || '').trim().toLocaleLowerCase('fr');\n      if (MLS_ASTROLOGY_COLLECTION_HANDLES.has(handle)) {\n        handle = 'signes-astrologiques';\n        title = labels.astrology || 'Signes astrologiques';\n      }\n      if (handle === 'fleurs') {\n        handle = 'nature-animaux';\n        title = MLS_COLLECTION_TITLES['nature-animaux'];\n      }\n      if (MLS_LETTER_NUMBER_COLLECTION_HANDLES.has(handle)) {\n        if (!isLetterNumberCharm) return;\n        handle = 'lettres-chiffres';\n        title = labels.lettersNumbers || 'Lettres & Chiffres';\n        forceVisibleLetters = true;\n      }\n      if (handle === 'lettres-chiffres' && !forceVisibleLetters) return;\n      if (!handle || MLS_GENERIC_COLLECTION_HANDLES.has(handle) || collections.has(handle)) return;\n      collections.set(handle, mlsCollectionTitle(handle, profile, title));\n    };\n    if (Array.isArray(profile?.collections)) {\n      profile.collections.forEach((collection) => add(collection?.handle, collection?.title));\n    }\n    if (Array.isArray(profile?.collectionHandles)) {\n      profile.collectionHandles.forEach((handle) => add(handle));\n    }\n    add(profile?.category, profile?.categoryTitle);\n    if (isLetterNumberCharm) add('lettres-chiffres', labels.lettersNumbers || 'Lettres & Chiffres', true);\n    return [...collections].map(([handle, title]) => ({ handle, title }));\n  };\n\n  const mlsVisibleCollectionHandles = (profile) => mlsVisibleCollections(profile).map(({ handle }) => handle);\n  const mlsPrimaryCollection = (profile) => MLS_VISIBLE_COLLECTION_ORDER.find((handle) => (\n    mlsVisibleCollectionHandles(profile).includes(handle)\n  )) || 'lifestyle';\n\n  const mlsLetterNumberRange = (profile) => {\n    const handles = new Set(mlsProfileCollectionHandles(profile));\n    if (handles.has('lettres-strass')) return 0;\n    if (handles.has('lettres-bulles') || handles.has('lettres-dorees')) return 1;\n    if (handles.has('chiffres-strass')) return 2;\n    if (handles.has('chiffres-dores')) return 3;\n    return 99;\n  };\n\n  const mlsAstrologyRange = (profile) => {\n    const handles = new Set(mlsProfileCollectionHandles(profile));\n    if (handles.has('signes-astrologiques-avec-strass')) return 0;\n    if (handles.has('signes-astrologiques-dores')) return 1;\n    return 99;\n  };\n\n  const mlsLetterNumberItemRank = (profile) => {\n    const title = mlsSortText(profile?.title);\n    const letter = title.match(/^lettre\\s+([a-z])(?:\\s|$)/u)?.[1];\n    if (letter) return letter.charCodeAt(0) - 97;\n    const digit = title.match(/^chiffre\\s+([0-9])(?:\\s|$)/u)?.[1];\n    return digit === undefined ? 999 : Number(digit);\n  };\n\n  const mlsAstrologyItemRank = (profile) => {\n    const title = mlsSortText(profile?.title);\n    const index = MLS_ZODIAC_ORDER.findIndex((sign) => title.startsWith(sign));\n    return index < 0 ? 999 : index;\n  };\n\n  const mlsFamilyKey = (profile) => {\n    const title = mlsSortText(profile?.title);\n    const match = MLS_FAMILY_PREFIXES.find(([prefix]) => title.startsWith(prefix));\n    return match?.[1] || title;\n  };\n\n  const mlsCompareText = (left, right) => String(left || '').localeCompare(\n    String(right || ''),\n    'fr',\n    { sensitivity: 'base', numeric: true }\n  );\n\n  const mlsManualPosition = (profile, collectionHandle) => {\n    const position = Number(profile?.displayPositions?.[collectionHandle]);\n    return Number.isInteger(position) && position >= 0 ? position : Number.POSITIVE_INFINITY;\n  };\n\n  const mlsCompareWithinCollection = (left, right, collectionHandle) => {\n    const manualDifference = mlsManualPosition(left, collectionHandle) - mlsManualPosition(right, collectionHandle);\n    if (Number.isFinite(manualDifference) && manualDifference) return manualDifference;\n    if (mlsManualPosition(left, collectionHandle) !== mlsManualPosition(right, collectionHandle)) {\n      return Number.isFinite(mlsManualPosition(left, collectionHandle)) ? -1 : 1;\n    }\n    if (collectionHandle === 'lettres-chiffres') {\n      const rangeDifference = mlsLetterNumberRange(left) - mlsLetterNumberRange(right);\n      if (rangeDifference) return rangeDifference;\n      const itemDifference = mlsLetterNumberItemRank(left) - mlsLetterNumberItemRank(right);\n      if (itemDifference) return itemDifference;\n    } else if (collectionHandle === 'signes-astrologiques') {\n      const rangeDifference = mlsAstrologyRange(left) - mlsAstrologyRange(right);\n      if (rangeDifference) return rangeDifference;\n      const itemDifference = mlsAstrologyItemRank(left) - mlsAstrologyItemRank(right);\n      if (itemDifference) return itemDifference;\n    } else {\n      const familyDifference = mlsCompareText(mlsFamilyKey(left), mlsFamilyKey(right));\n      if (familyDifference) return familyDifference;\n    }\n    const titleDifference = mlsCompareText(mlsSortText(left?.title), mlsSortText(right?.title));\n    if (titleDifference) return titleDifference;\n    return mlsCompareText(left?.variantId, right?.variantId);\n  };\n\n  const mlsCompareProfiles = (left, right, activeFilter = 'all') => {\n    if (activeFilter !== 'all') return mlsCompareWithinCollection(left, right, activeFilter);\n    const leftCollection = mlsPrimaryCollection(left);\n    const rightCollection = mlsPrimaryCollection(right);\n    const collectionDifference = MLS_VISIBLE_COLLECTION_ORDER.indexOf(leftCollection)\n      - MLS_VISIBLE_COLLECTION_ORDER.indexOf(rightCollection);\n    return collectionDifference || mlsCompareWithinCollection(left, right, leftCollection);\n  };\n\n  const mlsNumericShopifyId = (value) => String(value || '').split('/').pop().trim();\n  const mlsReadBuilderRoute = (search = '') => {\n    const params = new URLSearchParams(search);\n    const editCreationId = String(params.get('edit_creation') || '').trim();\n    const supportId = editCreationId ? '' : String(params.get('support') || '').trim();\n    return {\n      editCreationId,\n      supportId,\n      variantId: editCreationId ? '' : mlsNumericShopifyId(params.get('variant')),\n      familyId: editCreationId || supportId ? '' : String(params.get('family') || '').trim()\n    };\n  };\n\n  const mlsSupportFamily = (support) => {\n    const identity = `${support?.profileId || ''} ${support?.handle || ''}`.toLowerCase();\n    if (identity.includes('collier') || identity.includes('sautoir')) return 'necklace';\n    if (identity.includes('bracelet')) return 'bracelet';\n    if (identity.includes('broche')) return 'brooch';\n    return '';\n  };\n\n  const mlsResolveBuilderRoute = ({ route, supports, defaultSupportId = '', messages = {} }) => {\n    const supportList = Array.isArray(supports) ? supports : [];\n    const supportMap = new Map(supportList.map((support) => [String(support.profileId), support]));\n    const fallbackSupport = supportMap.get(String(defaultSupportId)) || supportList[0] || null;\n\n    if (route.editCreationId) {\n      return { support: fallbackSupport, variant: null, familyId: '', selectionRequired: false };\n    }\n    if (route.familyId && !['necklace', 'bracelet', 'brooch'].includes(route.familyId)) {\n      throw new Error(mlsTranslate(messages.routeFamily || 'La famille de supports demand\u00E9e dans le lien (__family__) est inconnue.', { family: route.familyId }));\n    }\n    if (!route.supportId) {\n      if (route.variantId) {\n        throw new Error(messages.routeVariantWithoutSupport || 'Une variante a \u00E9t\u00E9 demand\u00E9e sans support associ\u00E9. Revenez au choix du bijou.');\n      }\n      return { support: fallbackSupport, variant: null, familyId: route.familyId, selectionRequired: true };\n    }\n\n    const support = supportMap.get(route.supportId);\n    if (!support) {\n      throw new Error(mlsTranslate(messages.routeSupport || 'Le support demand\u00E9 dans le lien (__support__) est inconnu. Revenez au choix du bijou.', { support: route.supportId }));\n    }\n    if (!route.variantId) return { support, variant: null, familyId: '', selectionRequired: false };\n\n    const variant = (support.variants || []).find((candidate) => (\n      mlsNumericShopifyId(candidate.id) === route.variantId\n    ));\n    if (!variant) {\n      throw new Error(mlsTranslate(messages.routeVariant || 'La variante demand\u00E9e ne correspond pas au support __support__.', { support: support.title || route.supportId }));\n    }\n    return { support, variant, familyId: '', selectionRequired: false };\n  };\n  const mlsSupportReferenceScale = (support, messages = {}) => {\n    const value = Number(support?.referenceScalePercent);\n    if (!Number.isFinite(value) || value < 50 || value > 150) {\n      throw new Error(messages.supportScale || 'La taille des charms de ce support est indisponible dans Shopify.');\n    }\n    return value;\n  };\n  const mlsCharmSupportScale = (item, support) => {\n    const supportProductId = String(support?.productId || '');\n    if (item?.frozenSupportProductId === supportProductId) {\n      const frozen = Number(item.frozenSupportScalePercent);\n      if (Number.isFinite(frozen) && frozen >= 50 && frozen <= 200) return frozen;\n    }\n    const value = Number(item?.supportScaleOverrides?.[supportProductId] ?? 100);\n    return Number.isFinite(value) && value >= 50 && value <= 200 ? value : 100;\n  };\n  const mlsCartCreationId = (line) => String(\n    line?.properties?._mls_creation_id || line?.properties?.['Cr\u00E9ation MLS'] || ''\n  );\n  const mlsCartComponentType = (line) => String(\n    line?.properties?._mls_component_type || line?.properties?.Type || ''\n  ).toLowerCase();\n\n  const mlsBuildCartItems = ({ support, supportVariant, items, attachmentPoints, creationId, placementMode = 'customer_exact', messages = {} }) => {\n    const supportVariantId = mlsNumericShopifyId(supportVariant?.id || support?.variantId);\n    if (!supportVariantId) throw new Error(messages.supportVariant || 'La variante du support est introuvable.');\n    const supportReferenceScalePercent = mlsSupportReferenceScale(support, messages);\n\n    const supportVariantTitle = String(supportVariant?.title || '').trim();\n    const supportLabel = supportVariantTitle && supportVariantTitle !== 'Default Title'\n      ? `${support.title} \u00B7 ${supportVariantTitle}`\n      : String(support.title || 'Support');\n    const points = new Map((attachmentPoints || []).map((point) => [point.sourceIndex, point]));\n    const count = items.length;\n    const capacity = Math.min(Number(support?.maxCharms || points.size), points.size);\n    if (count > capacity) {\n      throw new Error(mlsTranslate(\n        messages.cartCapacity || 'Cette cr\u00E9ation d\u00E9passe la capacit\u00E9 maximale de __capacity__ charms.',\n        { capacity }\n      ));\n    }\n    const attachmentMode = support?.attachmentMode === 'central_spring_ring'\n      ? 'central_spring_ring'\n      : 'distributed_points';\n    const common = {\n      _mls_creation_id: creationId,\n      _mls_support_label: supportLabel\n    };\n\n    const supportLine = {\n      id: supportVariantId,\n      quantity: 1,\n      properties: {\n        ...common,\n        'Cr\u00E9ation personnalis\u00E9e': `${count} charm${count > 1 ? 's' : ''}`,\n        _mls_component_type: 'support',\n        _mls_placement_mode: placementMode === 'atelier_free' ? 'atelier_free' : 'customer_exact',\n        _mls_charm_count: String(count),\n        _mls_schema: MLS_CART_SCHEMA_VERSION,\n        _mls_render_formula: MLS_RENDER_FORMULA_VERSION,\n        _mls_support_profile: String(support.profileId || ''),\n        _mls_support_product: String(support.productId || ''),\n        _mls_support_variant: String(supportVariant?.id || support?.variantId || ''),\n        _mls_support_image: String(support.image || ''),\n        _mls_support_reference_scale: String(supportReferenceScalePercent),\n        _mls_support_max_charms: String(Number(support.maxCharms || attachmentPoints?.length || 0)),\n        _mls_support_attachment_mode: attachmentMode,\n        ...(attachmentMode === 'central_spring_ring' ? {\n          _mls_manufacturing_instruction: 'Sautoir \u00C9pure \u2014 monter chaque charm avec un anneau de jonction ferm\u00E9 compatible avec l\u2019anneau poussoir central.'\n        } : {})\n      }\n    };\n\n    const charmLines = items.map((item, index) => {\n      const variantId = mlsNumericShopifyId(item.variantId);\n      if (!variantId) throw new Error(mlsTranslate(messages.charmVariant || 'La variante de __title__ est introuvable.', { title: item.title }));\n      const point = points.get(item.attachmentPointId);\n      if (!point) throw new Error(mlsTranslate(messages.attachmentPoint || 'Le point d\u2019accroche de __title__ est introuvable.', { title: item.title }));\n      const charmSupportScalePercent = mlsCharmSupportScale(item, support);\n      return {\n        id: variantId,\n        quantity: 1,\n        properties: {\n          ...common,\n          _mls_component_type: 'charm',\n          _mls_schema: MLS_CART_SCHEMA_VERSION,\n          _mls_render_formula: MLS_RENDER_FORMULA_VERSION,\n          _mls_instance: String(item.instanceId || `${creationId}-${index + 1}`),\n          _mls_charm_profile: String(item.profileId || ''),\n          _mls_charm_product: String(item.productId || ''),\n          _mls_charm_variant: String(item.variantId || ''),\n          _mls_charm_image: String(item.image || ''),\n          _mls_charm_size: String(item.size || 'M'),\n          _mls_render_base_height: String(MLS_TARGET_HEIGHTS[item.size] || MLS_TARGET_HEIGHTS.M),\n          _mls_order: String(index + 1),\n          _mls_display_title: mlsCustomerCharmTitle(item.technicalTitle || item.title),\n          _mls_point_id: String(point.id ?? point.sourceIndex),\n          _mls_point_source_index: String(point.sourceIndex),\n          _mls_point_x: String(point.x),\n          _mls_point_y: String(point.y),\n          _mls_point_angle: String(point.angle),\n          _mls_charm_anchor_x: String(item.anchorXPercent),\n          _mls_charm_anchor_y: String(item.anchorYPercent),\n          _mls_charm_scale: String(item.visualScalePercent),\n          _mls_charm_support_scale: String(charmSupportScalePercent)\n        }\n      };\n    });\n\n    return [supportLine, ...charmLines];\n  };\n\n  window.MLS_V2_CART_TEST = { buildCartItems: mlsBuildCartItems, numericShopifyId: mlsNumericShopifyId, charmSupportScale: mlsCharmSupportScale };\n  window.MLS_V2_ROUTE_TEST = {\n    readBuilderRoute: mlsReadBuilderRoute,\n    resolveBuilderRoute: mlsResolveBuilderRoute,\n    supportFamily: mlsSupportFamily\n  };\n  window.MLS_V2_FILTER_TEST = {\n    visibleCollections: mlsVisibleCollections,\n    customerTitle: mlsCustomerCharmTitle,\n    sortText: mlsSortText,\n    isLetterNumberCharm: mlsIsLetterNumberCharm,\n    compareProfiles: mlsCompareProfiles,\n    familyKey: mlsFamilyKey,\n    visibleCollectionOrder: MLS_VISIBLE_COLLECTION_ORDER\n  };\n\n  if (!customElements.get('mls-jewelry-builder-v2')) {\n    customElements.define('mls-jewelry-builder-v2', class extends HTMLElement {\n      constructor() {\n        super();\n        this.items = [];\n        this.drag = null;\n        this.uid = 0;\n        this.config = this.readConfig();\n        const configuredSupports = Array.isArray(this.config.supports) && this.config.supports.length\n          ? this.config.supports\n          : [this.config.support || {}];\n        this.supportProfiles = new Map(configuredSupports.map((profile) => [String(profile.profileId), profile]));\n        this.supportProfile = this.supportProfiles.get(String(this.config.activeSupportId)) || configuredSupports[0] || {};\n        this.supportVariantSelections = new Map();\n        this.supportVariant = this.resolveSupportVariant(this.supportProfile);\n        this.charmProfiles = new Map((this.config.charms || []).map((profile) => [String(profile.variantId), profile]));\n        this.basePrice = Number(this.supportVariant.priceCents ?? this.supportProfile.priceCents ?? this.dataset.basePrice ?? 0);\n        this.currency = this.dataset.currency || 'EUR';\n        this.locale = this.dataset.locale || 'fr-FR';\n        this.messages = {\n          catalogueRequired: this.dataset.errorCatalogueRequired,\n          shopifyConnection: this.dataset.errorShopifyConnection,\n          sectionVersion: this.dataset.errorSectionVersion,\n          cachedResource: this.dataset.errorCachedResource,\n          noReadyCharms: this.dataset.errorNoReadyCharms,\n          noSupports: this.dataset.errorNoSupports,\n          supportScale: this.dataset.errorSupportScale,\n          shopifyUnavailable: this.dataset.errorShopifyUnavailable,\n          creationBlocked: this.dataset.errorCreationBlocked,\n          shopifyTitle: this.dataset.errorShopifyTitle,\n          noFallback: this.dataset.errorNoFallback,\n          retry: this.dataset.errorRetry,\n          cartRestore: this.dataset.errorCartRestore,\n          cartIncomplete: this.dataset.errorCartIncomplete,\n          cartSupport: this.dataset.errorCartSupport,\n          creationRestored: this.dataset.errorCreationRestored,\n          cartReplace: this.dataset.errorCartReplace,\n          cartIncompatible: this.dataset.errorCartIncompatible,\n          cartCapacity: this.dataset.errorCartCapacity,\n          routeFamily: this.dataset.errorRouteFamily,\n          routeVariantWithoutSupport: this.dataset.errorRouteVariantWithoutSupport,\n          routeSupport: this.dataset.errorRouteSupport,\n          routeVariant: this.dataset.errorRouteVariant,\n          supportVariant: this.dataset.errorSupportVariant,\n          charmVariant: this.dataset.errorCharmVariant,\n          attachmentPoint: this.dataset.errorAttachmentPoint\n        };\n        this.previewSlot = this.querySelector('[data-preview-slot]');\n        this.stageWrap = this.querySelector('[data-stage-wrap]');\n        this.catalogColumn = this.querySelector('.mls-builder-v2__catalog-column');\n        this.stage = this.querySelector('[data-stage]');\n        this.layer = this.querySelector('[data-placed-layer]');\n        this.row = this.querySelector('[data-placed-row]');\n        this.pointsLayer = this.querySelector('[data-attachment-points-layer]');\n        this.empty = this.querySelector('[data-empty]');\n        this.total = this.querySelector('[data-total]');\n        this.summary = this.querySelector('.mls-builder-v2__summary');\n        this.mobileFinishButton = this.querySelector('[data-mobile-finish]');\n        this.selection = this.querySelector('[data-selection]');\n        this.selectionList = this.querySelector('[data-selection-list]');\n        this.resetButtons = [...this.querySelectorAll('[data-reset-creation]')];\n        this.changeSupportButton = this.querySelector('[data-change-support]');\n        this.supportPicker = this.querySelector('[data-support-picker]');\n        this.resetDialog = this.querySelector('[data-reset-dialog]');\n        this.liveRegion = this.querySelector('[data-live-region]');\n        this.compatibilityNotice = this.querySelector('[data-compatibility-notice]');\n        this.compatibilityMessage = this.querySelector('[data-compatibility-message]');\n        this.builderTitle = this.querySelector('[data-builder-title]');\n        this.initialSupportSelectionTitle = String(this.builderTitle?.textContent || '').trim();\n        this.supportTitle = this.querySelector('[data-support-title]');\n        this.supportPrice = this.querySelector('[data-support-price]');\n        this.supportVariantWrap = this.querySelector('[data-support-variant-wrap]');\n        this.supportVariantSelect = this.querySelector('[data-support-variant]');\n        this.supportImage = this.querySelector('[data-support-image]');\n        this.styleAdvice = this.querySelector('[data-style-advice]');\n        this.cartButton = this.querySelector('[data-add-creation-to-cart]');\n        this.cartStatus = this.querySelector('[data-cart-status]');\n        this.supportDialog = this.querySelector('[data-support-dialog]');\n        this.supportDialogTitle = this.querySelector('[data-support-dialog-title]');\n        this.supportDialogSummary = this.querySelector('[data-support-dialog-summary]');\n        this.supportDialogReasons = this.querySelector('[data-support-dialog-reasons]');\n        this.supportDialogItems = this.querySelector('[data-support-dialog-items]');\n        this.pendingSupportChange = null;\n        this.activeFilter = 'all';\n        this.catalogSearchQuery = '';\n        this.catalogSearch = this.querySelector('[data-catalog-search]');\n        this.imageBounds = new Map();\n        this.catalogImageBounds = new Map();\n        this.onWindowDragMove = (event) => this.moveDrag(event);\n        this.onWindowDragEnd = (event) => this.endDrag(event);\n        this.attachmentPoints = this.parseAttachmentPoints(this.supportProfile.attachmentPoints || this.dataset.attachmentPoints);\n        this.maxCharms = Math.min(\n          Number(this.supportProfile.maxCharms || this.attachmentPoints.length),\n          this.attachmentPoints.length\n        );\n        this.showAttachmentPoints = this.dataset.showAttachmentPoints === 'true';\n        this.isMobileSticky = false;\n        this.stickyFrame = null;\n        this.sceneReferenceSize = null;\n        this.cartBusy = false;\n        this.pendingCartFingerprint = '';\n        this.pendingCreationId = '';\n        this.builderRoute = mlsReadBuilderRoute(window.location.search);\n        this.editingCreationId = this.builderRoute.editCreationId;\n        this.requestedSupportFamily = this.builderRoute.familyId;\n        const navigationEntry = typeof performance.getEntriesByType === 'function'\n          ? performance.getEntriesByType('navigation')[0]\n          : null;\n        const isNewNavigation = navigationEntry\n          ? navigationEntry.type === 'navigate'\n          : performance.navigation?.type === 0;\n        this.shouldPositionNewEntryAtStart = (\n          !this.editingCreationId\n          && !window.location.hash\n          && isNewNavigation\n        );\n        this.initialEntryPositionFrame = null;\n        this.initialScrollRestoration = null;\n        this.initialDocumentOverflowAnchor = null;\n        this.supportSelectionRequired = false;\n        this.editingLineKeys = [];\n        this.placementMode = 'customer_exact';\n        this.mobileFinishSummaryVisible = null;\n        this.mobileFinishSummaryObserver = null;\n        this.mobileFinishPreviewBar = null;\n        this.mobileFinishPreviewBarResizeObserver = null;\n        this.mobileFinishPreviewBarMutationObserver = null;\n        this.mobileFinishVisualViewport = null;\n      }\n\n      readConfig() {\n        const source = this.querySelector('[data-builder-config]');\n        if (!source) return {};\n        try {\n          const config = JSON.parse(source.textContent || '{}');\n          if (!config || typeof config !== 'object') return {};\n          const privateCharms = Array.isArray(window.MLS_PRIVATE_CLIENT_CHARMS)\n            ? window.MLS_PRIVATE_CLIENT_CHARMS.filter((profile) => profile?.ready === true && profile?.image)\n            : [];\n          return { ...config, charms: privateCharms };\n        } catch (_error) {\n          return {};\n        }\n      }\n\n      async connectedCallback() {\n        this.prepareNewEntryPositioning();\n        if (this.dataset.dynamicCatalogueEnabled !== 'true') {\n          this.showShopifyDataUnavailable(new Error(this.messages.catalogueRequired || 'Le catalogue Shopify dynamique est requis pour utiliser le configurateur V2.'));\n          this.finishNewEntryPositioning();\n          return;\n        }\n        try {\n          await this.loadDynamicCatalogue();\n          if (this.isConnected) {\n            this.initializeBuilder();\n            this.finishNewEntryPositioning();\n          }\n        } catch (error) {\n          if (this.isConnected) {\n            this.showShopifyDataUnavailable(error);\n            this.finishNewEntryPositioning();\n          }\n        }\n      }\n\n      async loadDynamicCatalogue() {\n        if (!window.MLSShopifyCatalogueV2?.load) {\n          throw new Error(this.messages.shopifyConnection || 'La connexion aux donn\u00E9es Shopify est indisponible.');\n        }\n        const expectedRuntimeVersion = String(this.dataset.runtimeVersion || '');\n        if (!expectedRuntimeVersion || expectedRuntimeVersion !== MLS_V2_RUNTIME_VERSION) {\n          throw new Error(this.messages.sectionVersion || 'La version de la section V2 est incoh\u00E9rente. Rechargez la pr\u00E9visualisation.');\n        }\n        if (window.MLSShopifyCatalogueV2.version !== expectedRuntimeVersion) {\n          throw new Error(this.messages.cachedResource || 'Une ancienne ressource du configurateur est encore en cache. Rechargez la page.');\n        }\n        const payload = await window.MLSShopifyCatalogueV2.load({\n          endpoint: this.dataset.catalogueEndpoint,\n          locale: this.locale\n        });\n        const profiles = Array.isArray(payload) ? payload : payload?.charms;\n        if (!Array.isArray(profiles) || !profiles.length) throw new Error(this.messages.noReadyCharms || 'Aucun charm pr\u00EAt et disponible n\u2019a \u00E9t\u00E9 retourn\u00E9 par Shopify.');\n        const configuredSelectorImages = new Map((this.config.supports || []).map((support) => [\n          String(support.profileId),\n          String(support.selectorImage || '')\n        ]));\n        const dynamicSupports = (Array.isArray(payload?.supports) ? payload.supports : []).map((support) => ({\n          ...support,\n          selectorImage: configuredSelectorImages.get(String(support.profileId)) || String(support.selectorImage || support.image || '')\n        }));\n        if (!dynamicSupports.length) throw new Error(this.messages.noSupports || 'Aucun support Shopify correctement configur\u00E9 n\u2019est disponible.');\n        dynamicSupports.forEach((support) => mlsSupportReferenceScale(support, this.messages));\n        this.config = {\n          ...this.config,\n          charms: profiles,\n          supports: dynamicSupports\n        };\n        this.charmProfiles = new Map(profiles.map((profile) => [String(profile.variantId), profile]));\n        this.supportProfiles = new Map(dynamicSupports.map((profile) => [String(profile.profileId), profile]));\n        const routeSelection = mlsResolveBuilderRoute({\n          route: this.builderRoute,\n          supports: dynamicSupports,\n          defaultSupportId: this.config.activeSupportId || this.supportProfile?.profileId,\n          messages: this.messages\n        });\n        this.supportProfile = routeSelection.support;\n        this.requestedSupportFamily = routeSelection.familyId;\n        this.supportSelectionRequired = routeSelection.selectionRequired;\n        if (!this.supportProfile) throw new Error(this.messages.noSupports || 'Aucun support Shopify correctement configur\u00E9 n\u2019est disponible.');\n        if (routeSelection.variant) {\n          this.supportVariantSelections.set(\n            String(this.supportProfile.profileId),\n            String(routeSelection.variant.id)\n          );\n        }\n        this.supportVariant = this.resolveSupportVariant(this.supportProfile);\n        this.basePrice = Number(this.supportVariant.priceCents ?? this.supportProfile.priceCents ?? this.basePrice);\n        this.attachmentPoints = this.parseAttachmentPoints(this.supportProfile.attachmentPoints || []);\n        this.maxCharms = Math.min(\n          Number(this.supportProfile.maxCharms || this.attachmentPoints.length),\n          this.attachmentPoints.length\n        );\n        this.dataset.catalogueSource = 'shopify';\n        this.dataset.catalogueCount = String(profiles.length);\n      }\n\n      showShopifyDataUnavailable(error) {\n        const message = error instanceof Error && error.message\n          ? error.message\n          : (this.messages.shopifyUnavailable || 'Les donn\u00E9es Shopify sont momentan\u00E9ment indisponibles.');\n        this.dataset.catalogueSource = 'shopify-unavailable';\n        this.dataset.catalogueError = message;\n        if (this.stageWrap) this.stageWrap.hidden = true;\n        if (this.cartButton) this.cartButton.disabled = true;\n        if (this.cartStatus) {\n          this.cartStatus.textContent = this.messages.creationBlocked || 'La cr\u00E9ation ne peut pas \u00EAtre ajout\u00E9e tant que les donn\u00E9es Shopify ne sont pas disponibles.';\n          this.cartStatus.dataset.state = 'error';\n        }\n        const catalog = this.querySelector('[data-catalog]');\n        if (catalog) {\n          catalog.innerHTML = `\n            <div class=\"mls-builder-v2__charm-card\" role=\"alert\">\n              <strong>${this.escape(this.messages.shopifyTitle || 'Donn\u00E9es Shopify indisponibles')}</strong>\n              <p>${this.escape(message)} ${this.escape(this.messages.noFallback || 'Aucun r\u00E9glage de taille de secours n\u2019a \u00E9t\u00E9 appliqu\u00E9.')}</p>\n              <button type=\"button\" data-retry-shopify-data>${this.escape(this.messages.retry || 'R\u00E9essayer')}</button>\n            </div>\n          `;\n          catalog.querySelector('[data-retry-shopify-data]')?.addEventListener('click', () => window.location.reload());\n        }\n        this.querySelector('[data-dynamic-filters]')?.replaceChildren();\n        console.error('[MLS V2] Donn\u00E9es Shopify indisponibles. Le configurateur est arr\u00EAt\u00E9 sans valeur de secours.', error);\n      }\n\n      initializeBuilder() {\n        this.toggleInitialSupportSelection(this.supportSelectionRequired);\n        this.hydrateSupportOptions();\n        this.hydrateCatalog();\n        this.updateSupportPresentation();\n        this.querySelectorAll('[data-add-charm]').forEach((button) => {\n          button.addEventListener('click', () => this.add(button));\n        });\n        this.querySelectorAll('[data-filter]').forEach((button) => {\n          button.addEventListener('click', () => this.filter(button));\n        });\n        this.catalogSearch?.addEventListener('input', (event) => {\n          this.catalogSearchQuery = mlsSortText(event.target.value);\n          this.updateCatalogVisibility();\n        });\n        this.querySelectorAll('[data-support-option]').forEach((button) => {\n          button.addEventListener('click', () => this.selectSupportFromPicker(button.dataset.supportOption));\n        });\n        this.querySelector('[data-confirm-support-change]')?.addEventListener('click', () => this.confirmSupportChange());\n        this.querySelector('[data-cancel-support-change]')?.addEventListener('click', () => this.cancelSupportChange());\n        this.supportDialog?.addEventListener('cancel', (event) => {\n          event.preventDefault();\n          this.cancelSupportChange();\n        });\n        this.querySelector('[data-remove-incompatible]')?.addEventListener('click', () => this.removeIncompatibleItems());\n        this.resetButtons.forEach((button) => button.addEventListener('click', () => this.openResetDialog()));\n        this.changeSupportButton?.addEventListener('click', () => {\n          if (this.supportPicker) this.supportPicker.hidden = false;\n          const supportOptions = this.querySelector('[data-support-options]') || this.querySelector('[data-support-option]');\n          supportOptions?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n          this.querySelector('[data-support-option][aria-pressed=\"true\"]')?.focus({ preventScroll: true });\n        });\n        this.querySelector('[data-confirm-reset]')?.addEventListener('click', () => this.confirmReset());\n        this.querySelector('[data-cancel-reset]')?.addEventListener('click', () => this.closeResetDialog());\n        this.resetDialog?.addEventListener('cancel', (event) => {\n          event.preventDefault();\n          this.closeResetDialog();\n        });\n        this.supportVariantSelect?.addEventListener('change', (event) => this.changeSupportVariant(event.target.value));\n        this.cartButton?.addEventListener('click', () => this.addCreationToCart());\n        this.mobileFinishButton?.addEventListener('click', () => this.returnToSummary());\n        this.layer.addEventListener('pointerdown', (event) => this.startDrag(event));\n        this.layer.addEventListener('keydown', (event) => this.keyboardMove(event));\n        this.selectionList.addEventListener('click', (event) => {\n          const remove = event.target.closest('[data-remove-instance]');\n          if (remove) this.remove(remove.dataset.removeInstance);\n        });\n        this.querySelector('[data-catalog]').addEventListener('click', (event) => {\n          const increment = event.target.closest('[data-increment-variant]');\n          if (increment) {\n            const addButton = this.querySelector(`[data-add-charm][data-variant-id=\"${increment.dataset.incrementVariant}\"]`);\n            if (addButton) this.add(addButton);\n            return;\n          }\n          const decrement = event.target.closest('[data-decrement-variant]');\n          if (decrement) this.removeOneVariant(decrement.dataset.decrementVariant);\n        });\n        this.onViewportChange = () => this.scheduleStickyUpdate();\n        this.onPageShow = () => {\n          const restoredVariantId = this.supportVariantSelect?.value;\n          if (restoredVariantId && restoredVariantId !== String(this.supportVariant?.id || '')) {\n            this.changeSupportVariant(restoredVariantId);\n          }\n          this.scheduleStickyUpdate();\n        };\n        window.addEventListener('scroll', this.onViewportChange, { passive: true });\n        window.addEventListener('resize', this.onViewportChange);\n        window.addEventListener('pageshow', this.onPageShow);\n        this.setupMobileFinishTracking();\n        this.supportImage?.addEventListener('load', () => {\n          this.renderAttachmentPoints();\n          this.normalizeItems();\n        });\n        this.resizeObserver = new ResizeObserver(() => this.normalizeItems());\n        if (this.stage) this.resizeObserver.observe(this.stage);\n        this.renderAttachmentPoints();\n        this.render();\n        this.updateStickyState();\n        if (this.editingCreationId) this.restoreCreationFromCart(this.editingCreationId);\n      }\n\n      prepareNewEntryPositioning() {\n        if (!this.shouldPositionNewEntryAtStart) return;\n        this.initialScrollRestoration = window.history.scrollRestoration;\n        this.initialDocumentOverflowAnchor = document.documentElement.style.overflowAnchor;\n        window.history.scrollRestoration = 'manual';\n        document.documentElement.style.overflowAnchor = 'none';\n      }\n\n      finishNewEntryPositioning() {\n        if (!this.shouldPositionNewEntryAtStart) return;\n        this.shouldPositionNewEntryAtStart = false;\n        this.initialEntryPositionFrame = window.requestAnimationFrame(() => {\n          window.scrollTo({ top: 0, left: 0, behavior: 'auto' });\n          document.documentElement.style.overflowAnchor = this.initialDocumentOverflowAnchor || '';\n          window.history.scrollRestoration = this.initialScrollRestoration || 'auto';\n          this.initialEntryPositionFrame = null;\n        });\n      }\n\n      disconnectedCallback() {\n        window.removeEventListener('scroll', this.onViewportChange);\n        window.removeEventListener('resize', this.onViewportChange);\n        window.removeEventListener('pageshow', this.onPageShow);\n        this.mobileFinishVisualViewport?.removeEventListener('scroll', this.onViewportChange);\n        this.mobileFinishVisualViewport?.removeEventListener('resize', this.onViewportChange);\n        this.mobileFinishSummaryObserver?.disconnect();\n        this.mobileFinishPreviewBarResizeObserver?.disconnect();\n        this.mobileFinishPreviewBarMutationObserver?.disconnect();\n        this.removeWindowDragListeners();\n        this.resizeObserver?.disconnect();\n        if (this.stickyFrame) window.cancelAnimationFrame(this.stickyFrame);\n        if (this.initialEntryPositionFrame) window.cancelAnimationFrame(this.initialEntryPositionFrame);\n        if (this.initialDocumentOverflowAnchor !== null) {\n          document.documentElement.style.overflowAnchor = this.initialDocumentOverflowAnchor;\n        }\n        if (this.initialScrollRestoration !== null) {\n          window.history.scrollRestoration = this.initialScrollRestoration;\n        }\n      }\n\n      hydrateSupportOptions() {\n        const container = this.querySelector('[data-support-options]');\n        if (!container) return;\n        const visibleSupports = [...this.supportProfiles.values()].filter((support) => (\n          !this.requestedSupportFamily || mlsSupportFamily(support) === this.requestedSupportFamily\n        ));\n        container.dataset.supportCount = String(visibleSupports.length);\n        container.innerHTML = visibleSupports.map((support) => `\n          <button\n            type=\"button\"\n            class=\"mls-builder-v2__support-choice-card\"\n            data-support-option=\"${this.escape(support.profileId)}\"\n            aria-pressed=\"${String(!this.supportSelectionRequired && support === this.supportProfile)}\"\n          >\n            <span class=\"mls-builder-v2__support-choice-media\">\n              <img\n                src=\"${this.escape(support.selectorImage)}\"\n                alt=\"\"\n                loading=\"lazy\"\n                width=\"360\"\n                height=\"270\"\n              >\n            </span>\n            <span class=\"mls-builder-v2__support-choice-title\">${this.escape(support.title || support.profileId)}</span>\n          </button>\n        `).join('');\n      }\n\n      syncSupportOptionState() {\n        const activeProfileId = String(this.supportProfile?.profileId || '');\n        this.querySelectorAll('[data-support-option]').forEach((button) => {\n          button.setAttribute('aria-pressed', String(button.dataset.supportOption === activeProfileId));\n        });\n      }\n\n      toggleInitialSupportSelection(required) {\n        this.supportSelectionRequired = Boolean(required);\n        this.mobileFinishSummaryVisible = null;\n        this.toggleAttribute('data-support-selection-required', this.supportSelectionRequired);\n        if (this.supportPicker) this.supportPicker.hidden = !this.supportSelectionRequired;\n        const layout = this.querySelector('.mls-builder-v2__layout');\n        if (layout) layout.hidden = this.supportSelectionRequired;\n        this.updateBuilderTitle();\n        this.scheduleStickyUpdate();\n      }\n\n      selectSupportFromPicker(profileId) {\n        if (!this.supportSelectionRequired) {\n          if (String(profileId) === String(this.supportProfile?.profileId)) {\n            if (this.supportPicker) this.supportPicker.hidden = true;\n            return;\n          }\n          this.requestSupportChange(profileId);\n          return;\n        }\n        const support = this.supportProfiles.get(String(profileId));\n        if (!support) return;\n        this.applySupportChange({ support, removeItems: [] });\n        this.toggleInitialSupportSelection(false);\n        const nextUrl = new URL(window.location.href);\n        nextUrl.searchParams.set('view', 'configurateur-v2');\n        nextUrl.searchParams.set('support', String(support.profileId));\n        nextUrl.searchParams.delete('variant');\n        nextUrl.searchParams.delete('family');\n        window.history.replaceState({}, '', nextUrl);\n      }\n\n      hydrateCatalog() {\n        const filters = this.querySelector('[data-dynamic-filters]');\n        const catalog = this.querySelector('[data-catalog]');\n        if (!filters || !catalog) return;\n        const categories = new Map();\n        const orderedProfiles = [...this.charmProfiles.values()].sort((left, right) => (\n          mlsCompareProfiles(left, right, 'all')\n        ));\n        orderedProfiles.forEach((profile) => {\n          this.visibleCollections(profile).forEach(({ handle, title }) => {\n            if (!categories.has(handle)) categories.set(handle, title);\n          });\n        });\n        const allLabel = this.dataset.filterAllLabel || 'Tous les charms';\n        filters.innerHTML = [\n          `<button type=\"button\" data-filter=\"all\" aria-selected=\"true\">${this.escape(allLabel)}</button>`,\n          ...MLS_VISIBLE_COLLECTION_ORDER\n            .filter((key) => categories.has(key))\n            .map((key) => (\n              `<button type=\"button\" data-filter=\"${this.escape(key)}\" aria-selected=\"false\">${this.escape(categories.get(key))}</button>`\n            ))\n        ].join('');\n        catalog.innerHTML = orderedProfiles.map((profile) => {\n          const collectionHandles = this.visibleCollections(profile).map(({ handle }) => handle).join(' ');\n          const customerTitle = mlsCustomerCharmTitle(profile.displayTitle || profile.title);\n          return `\n          <article class=\"mls-builder-v2__charm-card\" data-profile-id=\"${this.escape(profile.profileId)}\" data-collections=\"${this.escape(collectionHandles)}\">\n            <button\n              class=\"mls-builder-v2__add\"\n              type=\"button\"\n              data-add-charm\n              data-title=\"${this.escape(customerTitle)}\"\n              data-image=\"${this.escape(profile.image)}\"\n              data-price=\"${Number(profile.priceCents || 0)}\"\n              data-inventory=\"${Number(profile.inventory || 0)}\"\n              data-product-id=\"${this.escape(profile.productId || '')}\"\n              data-variant-id=\"${this.escape(profile.variantId || '')}\"\n              data-size=\"${this.escape(profile.size || 'M')}\"\n            >\n              <span class=\"mls-builder-v2__charm-media\"><img src=\"${this.escape(profile.image)}\" alt=\"\" loading=\"lazy\" draggable=\"false\" crossorigin=\"anonymous\" data-catalog-thumbnail data-thumbnail-scale=\"${Number(profile.catalogThumbnailScalePercent || 100)}\"></span>\n              <span class=\"mls-builder-v2__charm-title\">${this.escape(customerTitle)}</span>\n              <span class=\"mls-builder-v2__charm-price\">${this.escape(this.formatMoney(profile.priceCents || 0))}</span>\n              <span class=\"mls-builder-v2__plus\" aria-hidden=\"true\">+</span>\n            </button>\n            <div class=\"mls-builder-v2__quantity-control\" data-quantity-control hidden>\n              <button type=\"button\" data-decrement-variant=\"${this.escape(profile.variantId)}\" aria-label=\"Retirer un ${this.escape(customerTitle)}\">\u2212</button>\n              <span data-variant-quantity>0</span>\n              <button type=\"button\" data-increment-variant=\"${this.escape(profile.variantId)}\" aria-label=\"Ajouter un ${this.escape(customerTitle)}\">+</button>\n            </div>\n          </article>\n        `;\n        }).join('');\n        this.normalizeCatalogThumbnails();\n      }\n\n      normalizeCatalogThumbnails() {\n        this.querySelectorAll('[data-catalog-thumbnail]').forEach((image) => {\n          const apply = () => this.normalizeCatalogThumbnail(image);\n          if (image.complete && image.naturalWidth) apply();\n          else image.addEventListener('load', apply, { once: true });\n        });\n      }\n\n      async decodeCatalogThumbnail(image) {\n        if (!image.complete || !image.naturalWidth) {\n          await new Promise((resolve) => {\n            image.addEventListener('load', resolve, { once: true });\n            image.addEventListener('error', resolve, { once: true });\n          });\n        }\n        if (!image.naturalWidth) return false;\n        if (typeof image.decode === 'function') {\n          try {\n            await image.decode();\n          } catch (_error) {\n            return false;\n          }\n        }\n        return Boolean(image.naturalWidth && image.naturalHeight);\n      }\n\n      reliableCatalogBounds(bounds) {\n        if (!bounds || !bounds.canvasWidth || !bounds.canvasHeight || !bounds.width || !bounds.height) return false;\n        return !(\n          bounds.left === 0\n          && bounds.top === 0\n          && bounds.width === bounds.canvasWidth\n          && bounds.height === bounds.canvasHeight\n        );\n      }\n\n      async catalogThumbnailProbe(source, cacheMode) {\n        const response = await fetch(source, {\n          mode: 'cors',\n          credentials: 'omit',\n          cache: cacheMode\n        });\n        if (!response.ok) throw new Error(`Image catalogue indisponible (${response.status})`);\n        const objectUrl = URL.createObjectURL(await response.blob());\n        const probe = new Image();\n        probe.decoding = 'async';\n        probe.src = objectUrl;\n        const decoded = await this.decodeCatalogThumbnail(probe);\n        if (!decoded) {\n          URL.revokeObjectURL(objectUrl);\n          throw new Error('Image catalogue non d\u00E9codable');\n        }\n        return {\n          image: probe,\n          release: () => URL.revokeObjectURL(objectUrl)\n        };\n      }\n\n      async measureCatalogThumbnail(image) {\n        const source = image.currentSrc || image.src;\n        if (!source) return null;\n        if (this.catalogImageBounds.has(source)) return this.catalogImageBounds.get(source);\n        const measurement = (async () => {\n          const decoded = await this.decodeCatalogThumbnail(image);\n          for (let attempt = decoded ? 0 : 1; attempt < 3; attempt += 1) {\n            let candidate = image;\n            let release = null;\n            try {\n              if (attempt > 0) {\n                const probe = await this.catalogThumbnailProbe(source, attempt === 1 ? 'reload' : 'no-store');\n                candidate = probe.image;\n                release = probe.release;\n              }\n              const bounds = await window.MLSAnchorLocalV1.visibleBounds(candidate, new Map());\n              if (this.reliableCatalogBounds(bounds)) return bounds;\n            } catch (_error) {\n            } finally {\n              if (release) release();\n            }\n            await new Promise((resolve) => window.setTimeout(resolve, 80 * (attempt + 1)));\n          }\n          return null;\n        })();\n        this.catalogImageBounds.set(source, measurement);\n        const bounds = await measurement;\n        if (bounds) this.catalogImageBounds.set(source, bounds);\n        else this.catalogImageBounds.delete(source);\n        return bounds;\n      }\n\n      async normalizeCatalogThumbnail(image) {\n        const addButton = image.closest('[data-add-charm]');\n        const profile = this.charmProfiles.get(String(addButton?.dataset.variantId || ''));\n        if (!profile) return;\n        if (image.dataset.thumbnailNormalizing === 'true') return;\n        image.dataset.thumbnailNormalizing = 'true';\n        const bounds = await this.measureCatalogThumbnail(image);\n        delete image.dataset.thumbnailNormalizing;\n        if (!image.isConnected) return;\n        if (!bounds) {\n          image.dataset.thumbnailNormalized = 'pending';\n          const retryCount = Number(image.dataset.thumbnailRetryCount || 0);\n          if (retryCount < 2) {\n            image.dataset.thumbnailRetryCount = String(retryCount + 1);\n            window.setTimeout(() => {\n              if (image.isConnected) this.normalizeCatalogThumbnail(image);\n            }, 250 * (retryCount + 1));\n          }\n          return;\n        }\n        const targetVisibleRatio = { S: 0.55, M: 0.65, L: 0.75 }[String(profile.size || 'M').toUpperCase()] || 0.65;\n        const individualScale = Number(profile.catalogThumbnailScalePercent || 100) / 100;\n        const appliedVisibleRatio = Math.max(0.35, Math.min(0.88, targetVisibleRatio * individualScale));\n        const maxVisibleDimension = Math.max(1, bounds.width, bounds.height);\n        const widthRatio = (bounds.canvasWidth / maxVisibleDimension) * appliedVisibleRatio;\n        const heightRatio = (bounds.canvasHeight / maxVisibleDimension) * appliedVisibleRatio;\n        const centerX = (bounds.left + (bounds.width / 2)) / Math.max(1, bounds.canvasWidth);\n        const centerY = (bounds.top + (bounds.height / 2)) / Math.max(1, bounds.canvasHeight);\n        image.style.width = `${(widthRatio * 100).toFixed(4)}%`;\n        image.style.height = `${(heightRatio * 100).toFixed(4)}%`;\n        image.style.left = `${((0.5 - (centerX * widthRatio)) * 100).toFixed(4)}%`;\n        image.style.top = `${((0.5 - (centerY * heightRatio)) * 100).toFixed(4)}%`;\n        image.style.transform = 'none';\n        image.dataset.thumbnailNormalized = 'true';\n        image.dataset.thumbnailAppliedScale = appliedVisibleRatio.toFixed(4);\n        delete image.dataset.thumbnailRetryCount;\n      }\n\n      visibleCollections(profile) {\n        const localizedTitles = {\n          'amour-symboles': this.dataset.filterLoveLabel,\n          'nature-animaux': this.dataset.filterNatureLabel,\n          'astres-symboles': this.dataset.filterSymbolsLabel,\n          'pierres-perles-strass': this.dataset.filterStonesLabel,\n          lifestyle: this.dataset.filterLifestyleLabel\n        };\n        return mlsVisibleCollections(profile, {\n          astrology: this.dataset.filterAstrologyLabel,\n          lettersNumbers: this.dataset.filterLettersNumbersLabel\n        }).map((collection) => ({\n          ...collection,\n          title: localizedTitles[collection.handle] || collection.title\n        }));\n      }\n\n      updateSupportPresentation() {\n        const support = this.supportProfile;\n        if (this.stage) this.stage.dataset.supportProfile = support.profileId || '';\n        this.updateBuilderTitle();\n        if (this.supportTitle) this.supportTitle.textContent = support.title || '';\n        if (this.supportPrice) this.supportPrice.textContent = this.formatMoney(this.basePrice);\n        if (this.supportImage && support.image) {\n          this.supportImage.src = support.image;\n          this.supportImage.alt = support.title || '';\n        }\n        if (this.styleAdvice) this.styleAdvice.hidden = !this.supportShowsStyleAdvice(support);\n        this.hydrateSupportVariants();\n      }\n\n      updateBuilderTitle() {\n        if (!this.builderTitle) return;\n        const title = this.supportSelectionRequired\n          ? this.initialSupportSelectionTitle\n          : String(this.supportProfile?.title || this.initialSupportSelectionTitle).trim();\n        if (title) this.builderTitle.textContent = title;\n      }\n\n      supportShowsStyleAdvice(support) {\n        const identity = `${support?.profileId || ''} ${support?.handle || ''} ${support?.title || ''}`\n          .normalize('NFD')\n          .replace(/[\\u0300-\\u036f]/g, '')\n          .toLowerCase();\n        return /(^|[-\\s])(collier|bracelet|necklace)([-\\s]|$)/.test(identity);\n      }\n\n      resolveSupportVariant(support) {\n        const variants = Array.isArray(support?.variants) ? support.variants : [];\n        const rememberedId = this.supportVariantSelections?.get(String(support?.profileId));\n        const preferredId = rememberedId || String(support?.variantId || '');\n        const selected = variants.find((variant) => String(variant.id) === preferredId)\n          || variants.find((variant) => variant.available)\n          || variants[0];\n        return selected || {\n          id: String(support?.variantId || ''),\n          title: 'Default Title',\n          priceCents: Number(support?.priceCents || 0),\n          available: support?.available !== false\n        };\n      }\n\n      hydrateSupportVariants() {\n        if (!this.supportVariantSelect || !this.supportVariantWrap) return;\n        const variants = Array.isArray(this.supportProfile?.variants) && this.supportProfile.variants.length\n          ? this.supportProfile.variants\n          : [this.resolveSupportVariant(this.supportProfile)];\n        this.supportVariantSelect.innerHTML = variants.map((variant) => `\n          <option value=\"${this.escape(variant.id)}\" ${variant.available ? '' : 'disabled'}>\n            ${this.escape(variant.title === 'Default Title' ? this.supportProfile.title : variant.title)} \u00B7 ${this.escape(this.formatMoney(variant.priceCents))}${variant.available ? '' : ' \u00B7 Indisponible'}\n          </option>\n        `).join('');\n        this.supportVariantSelect.value = String(this.supportVariant.id || '');\n        this.supportVariantWrap.hidden = variants.length <= 1 && variants[0]?.title === 'Default Title';\n      }\n\n      changeSupportVariant(variantId) {\n        const variants = Array.isArray(this.supportProfile?.variants) ? this.supportProfile.variants : [];\n        const variant = variants.find((candidate) => String(candidate.id) === String(variantId));\n        if (!variant || !variant.available) return;\n        this.supportVariantSelections.set(String(this.supportProfile.profileId), String(variant.id));\n        this.supportVariant = variant;\n        this.basePrice = Number(variant.priceCents || 0);\n        this.render();\n      }\n\n      scheduleStickyUpdate() {\n        if (this.stickyFrame) return;\n        this.stickyFrame = window.requestAnimationFrame(() => {\n          this.stickyFrame = null;\n          this.updateStickyState();\n        });\n      }\n\n      mobileFinishPreviewBarSelector() {\n        return '#preview-bar-iframe, [data-shopify-preview-bar], iframe[src*=\"preview_bar\"], iframe[src*=\"preview-bar\"]';\n      }\n\n      nodeContainsMobileFinishPreviewBar(node) {\n        if (!node || node.nodeType !== Node.ELEMENT_NODE) return false;\n        const selector = this.mobileFinishPreviewBarSelector();\n        return node.matches(selector) || Boolean(node.querySelector(selector));\n      }\n\n      findMobileFinishPreviewBar() {\n        return document.querySelector(this.mobileFinishPreviewBarSelector());\n      }\n\n      syncMobileFinishPreviewBar() {\n        const previewBar = this.findMobileFinishPreviewBar();\n        if (previewBar === this.mobileFinishPreviewBar) return;\n        this.mobileFinishPreviewBarResizeObserver?.disconnect();\n        this.mobileFinishPreviewBar = previewBar;\n        if (previewBar && typeof ResizeObserver === 'function') {\n          if (!this.mobileFinishPreviewBarResizeObserver) {\n            this.mobileFinishPreviewBarResizeObserver = new ResizeObserver(() => this.scheduleStickyUpdate());\n          }\n          this.mobileFinishPreviewBarResizeObserver.observe(previewBar);\n        }\n      }\n\n      mobileFinishPreviewOffset() {\n        this.syncMobileFinishPreviewBar();\n        const previewBar = this.mobileFinishPreviewBar;\n        if (!previewBar) return 0;\n        const bounds = previewBar.getBoundingClientRect();\n        const styles = window.getComputedStyle(previewBar);\n        if (\n          styles.display === 'none'\n          || styles.visibility === 'hidden'\n          || Number(styles.opacity) === 0\n          || bounds.height < 1\n        ) return 0;\n        const visualViewport = window.visualViewport;\n        const visualBottom = Number(visualViewport?.offsetTop || 0)\n          + Number(visualViewport?.height || window.innerHeight);\n        const touchesBottom = bounds.bottom >= visualBottom - 2\n          || bounds.bottom >= window.innerHeight - 2;\n        return touchesBottom ? Math.ceil(bounds.height + 8) : 0;\n      }\n\n      setupMobileFinishTracking() {\n        if (!this.mobileFinishButton || !this.summary) return;\n        if (typeof IntersectionObserver === 'function') {\n          this.mobileFinishSummaryObserver = new IntersectionObserver((entries) => {\n            const entry = entries.find((candidate) => candidate.target === this.summary);\n            if (!entry) return;\n            this.mobileFinishSummaryVisible = entry.isIntersecting && entry.intersectionRatio > 0;\n            this.scheduleStickyUpdate();\n          }, { root: null, threshold: [0, 0.01] });\n          this.mobileFinishSummaryObserver.observe(this.summary);\n        }\n        this.mobileFinishVisualViewport = window.visualViewport || null;\n        this.mobileFinishVisualViewport?.addEventListener('scroll', this.onViewportChange, { passive: true });\n        this.mobileFinishVisualViewport?.addEventListener('resize', this.onViewportChange);\n        if (typeof MutationObserver === 'function') {\n          this.mobileFinishPreviewBarMutationObserver = new MutationObserver((mutations) => {\n            const previewBarChanged = mutations.some((mutation) => (\n              [...mutation.addedNodes, ...mutation.removedNodes]\n                .some((node) => this.nodeContainsMobileFinishPreviewBar(node))\n            ));\n            if (previewBarChanged) this.scheduleStickyUpdate();\n          });\n          this.mobileFinishPreviewBarMutationObserver.observe(document.documentElement, {\n            childList: true,\n            subtree: true\n          });\n        }\n        this.syncMobileFinishPreviewBar();\n      }\n\n      updateStickyState() {\n        if (!this.previewSlot || !this.stageWrap || !this.catalogColumn) return;\n        const mobile = window.matchMedia('(max-width: 749px)').matches;\n        const slotBounds = this.previewSlot.getBoundingClientRect();\n        const catalogBounds = this.catalogColumn.getBoundingClientRect();\n        const stickyHeight = Math.min(370, Math.max(340, window.innerHeight * .43));\n        const shouldStick = mobile && slotBounds.top <= 0 && catalogBounds.bottom > stickyHeight;\n        const changed = shouldStick !== this.isMobileSticky;\n\n        if (shouldStick) {\n          if (!this.isMobileSticky) {\n            this.previewSlot.style.height = `${this.stageWrap.offsetHeight}px`;\n            this.sceneReferenceSize = this.stage.offsetWidth;\n            this.stageWrap.classList.add('is-mobile-sticky');\n            this.isMobileSticky = true;\n          }\n          const referenceSize = this.sceneReferenceSize || this.stage.offsetWidth;\n          const stickyWidth = window.innerWidth;\n          const sceneTargetSize = stickyWidth * .98;\n          const scale = sceneTargetSize / referenceSize;\n          this.stageWrap.style.setProperty('--mls-sticky-left', '0px');\n          this.stageWrap.style.setProperty('--mls-sticky-width', `${stickyWidth}px`);\n          this.stageWrap.style.setProperty('--mls-sticky-height', `${stickyHeight}px`);\n          this.stageWrap.style.setProperty('--mls-scene-reference-size', `${referenceSize}px`);\n          this.stageWrap.style.setProperty('--mls-sticky-scale', String(scale));\n        } else if (this.isMobileSticky) {\n          this.stageWrap.classList.remove('is-mobile-sticky');\n          this.stageWrap.style.removeProperty('--mls-sticky-left');\n          this.stageWrap.style.removeProperty('--mls-sticky-width');\n          this.stageWrap.style.removeProperty('--mls-sticky-height');\n          this.stageWrap.style.removeProperty('--mls-scene-reference-size');\n          this.stageWrap.style.removeProperty('--mls-sticky-scale');\n          this.previewSlot.style.removeProperty('height');\n          this.isMobileSticky = false;\n          this.sceneReferenceSize = null;\n        }\n\n        if (changed) window.requestAnimationFrame(() => this.normalizeItems());\n\n        if (this.mobileFinishButton && this.summary) {\n          const layout = this.querySelector('.mls-builder-v2__layout');\n          const summaryBounds = this.summary.getBoundingClientRect();\n          const visualViewport = window.visualViewport;\n          const viewportTop = Number(visualViewport?.offsetTop || 0);\n          const viewportBottom = viewportTop + Number(visualViewport?.height || window.innerHeight);\n          const summaryOutOfView = this.mobileFinishSummaryVisible === null\n            ? summaryBounds.bottom < viewportTop\n            : !this.mobileFinishSummaryVisible;\n          const previewOffset = mobile ? this.mobileFinishPreviewOffset() : 0;\n          this.style.setProperty('--mls-mobile-finish-preview-offset', `${previewOffset}px`);\n          const showFinishButton = mobile\n            && !this.supportSelectionRequired\n            && !layout?.hidden\n            && summaryOutOfView\n            && catalogBounds.top < viewportBottom\n            && catalogBounds.bottom > viewportTop;\n          this.mobileFinishButton.hidden = !showFinishButton;\n          this.classList.toggle('is-mobile-finish-visible', showFinishButton);\n        }\n      }\n\n      returnToSummary() {\n        if (!this.summary) return;\n        if (this.mobileFinishButton) this.mobileFinishButton.hidden = true;\n        this.classList.remove('is-mobile-finish-visible');\n        const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n        this.summary.scrollIntoView({\n          behavior: reducedMotion ? 'auto' : 'smooth',\n          block: 'end'\n        });\n        this.cartButton?.focus({ preventScroll: true });\n      }\n\n      openResetDialog() {\n        if (!this.items.length || !this.resetDialog) return;\n        if (typeof this.resetDialog.showModal === 'function') this.resetDialog.showModal();\n        else this.resetDialog.setAttribute('open', '');\n      }\n\n      closeResetDialog() {\n        if (this.resetDialog?.open && typeof this.resetDialog.close === 'function') this.resetDialog.close();\n        else this.resetDialog?.removeAttribute('open');\n      }\n\n      confirmReset() {\n        if (!this.items.length) {\n          this.closeResetDialog();\n          return;\n        }\n        this.items = [];\n        this.closeResetDialog();\n        this.render();\n        this.announce(this.dataset.resetDone || 'Votre cr\u00E9ation a \u00E9t\u00E9 r\u00E9initialis\u00E9e.');\n      }\n\n      add(button) {\n        const profile = this.charmProfiles.get(String(button.dataset.variantId)) || {};\n        const technicalTitle = mlsCustomerCharmTitle(profile.title || button.dataset.title);\n        const customerTitle = mlsCustomerCharmTitle(profile.displayTitle || profile.title || button.dataset.title);\n        if (!this.isCharmCompatible(profile)) return;\n        const nextPoint = this.nextFreeAttachmentPoint();\n        if (this.attachmentPoints.length > 0 && (this.items.length >= this.maxCharms || !nextPoint)) {\n          this.announce((this.dataset.capacityTemplate || '').replace('__count__', String(this.maxCharms)));\n          return;\n        }\n        const variantId = String(profile.variantId || button.dataset.variantId || '');\n        const inventory = Number(profile.inventory ?? button.dataset.inventory ?? 0);\n        const sameVariantCount = this.items.filter((item) => item.variantId === variantId).length;\n        if (inventory > 0 && sameVariantCount >= inventory) {\n          this.announce(this.template('limit', customerTitle));\n          return;\n        }\n        this.uid += 1;\n        this.items.push({\n          instanceId: `mls-${Date.now()}-${this.uid}`,\n          profileId: profile.profileId || button.closest('[data-profile-id]')?.dataset.profileId || '',\n          title: customerTitle,\n          technicalTitle,\n          image: profile.image || button.dataset.image,\n          price: Number(profile.priceCents ?? button.dataset.price ?? 0),\n          productId: String(profile.productId || button.dataset.productId || ''),\n          variantId,\n          size: profile.size || button.dataset.size || 'M',\n          visualScalePercent: Number(profile.visualScalePercent || 100),\n          supportScaleOverrides: { ...(profile.supportScaleOverrides || {}) },\n          anchorXPercent: Number(profile.anchorXPercent ?? 50),\n          anchorYPercent: Number(profile.anchorYPercent ?? 0),\n          attachmentPointId: nextPoint ? nextPoint.sourceIndex : null\n        });\n        this.render();\n        this.announce(this.template('added', customerTitle));\n      }\n\n      remove(instanceId) {\n        const item = this.items.find((candidate) => candidate.instanceId === instanceId);\n        if (!item) return;\n        this.items = this.items.filter((candidate) => candidate.instanceId !== instanceId);\n        this.render();\n        this.announce(this.template('removed', item.title));\n      }\n\n      removeOneVariant(variantId) {\n        const item = [...this.items].reverse().find((candidate) => candidate.variantId === variantId);\n        if (item) this.remove(item.instanceId);\n      }\n\n      render() {\n        const placedMarkup = this.items.map((item) => `\n          <div class=\"mls-builder-v2__placed\" data-instance=\"${this.escape(item.instanceId)}\" data-size=\"${this.escape(item.size)}\">\n            <button class=\"mls-builder-v2__grab\" type=\"button\" aria-label=\"D\u00E9placer ${this.escape(item.title)}\" data-grab-instance=\"${this.escape(item.instanceId)}\">\n              <img src=\"${this.escape(item.image)}\" alt=\"\" width=\"100\" height=\"130\" crossorigin=\"anonymous\" draggable=\"false\">\n            </button>\n          </div>\n        `).join('');\n        this.row.innerHTML = placedMarkup;\n        this.selectionList.innerHTML = this.items.map((item) => `\n          <li><button type=\"button\" data-remove-instance=\"${this.escape(item.instanceId)}\">${this.escape(item.title)} <span aria-hidden=\"true\">\u00D7</span></button></li>\n        `).join('');\n        this.empty.hidden = this.items.length > 0;\n        this.selection.hidden = false;\n        this.resetButtons.forEach((button) => { button.disabled = this.items.length === 0; });\n        const total = this.basePrice + this.items.reduce((sum, item) => sum + item.price, 0);\n        this.total.textContent = new Intl.NumberFormat(this.locale, { style: 'currency', currency: this.currency }).format(total / 100);\n        if (this.supportPrice) this.supportPrice.textContent = this.formatMoney(this.basePrice);\n        this.updateCardControls();\n        this.applyCompatibility();\n        this.renderCartState();\n        this.normalizeItems();\n      }\n\n      renderCartState() {\n        if (!this.cartButton) return;\n        const unavailableCharm = this.items.find((item) => {\n          const profile = this.charmProfiles.get(String(item.variantId));\n          return profile?.available === false;\n        });\n        const available = Boolean(this.supportVariant?.id) && this.supportVariant?.available !== false && !unavailableCharm;\n        this.cartButton.disabled = this.cartBusy || !available;\n        this.cartButton.textContent = this.cartBusy\n          ? (this.dataset.cartAddingLabel || 'Ajout en cours\u2026')\n          : (this.dataset.cartButtonLabel || 'Ajouter la cr\u00E9ation au panier');\n        if (!this.cartBusy && this.cartStatus) {\n          this.cartStatus.textContent = available\n            ? (this.dataset.cartNote || '')\n            : (this.dataset.cartUnavailable || 'Cette s\u00E9lection contient un article indisponible.');\n          this.cartStatus.dataset.state = available ? 'ready' : 'error';\n        }\n      }\n\n      cartFingerprint() {\n        return JSON.stringify({\n          support: this.supportProfile.profileId,\n          variant: this.supportVariant?.id,\n          items: this.items.map((item) => [item.instanceId, item.variantId, item.attachmentPointId])\n        });\n      }\n\n      createCreationId() {\n        const date = new Date().toISOString().slice(0, 10).replaceAll('-', '');\n        const random = (window.crypto?.randomUUID?.()\n          || `${Date.now()}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`)\n          .replaceAll('-', '').toUpperCase();\n        return `MLS-${date}-${random}`;\n      }\n\n      async restoreCreationFromCart(creationId) {\n        try {\n          const response = await fetch(`${this.dataset.cartUrl || '/cart'}.js`, {\n            headers: { Accept: 'application/json' }\n          });\n          if (!response.ok) throw new Error(this.messages.cartRestore || 'Impossible de relire la cr\u00E9ation depuis le panier.');\n          const cart = await response.json();\n          const lines = (cart.items || []).filter((line) => mlsCartCreationId(line) === creationId);\n          const supportLine = lines.find((line) => mlsCartComponentType(line) === 'support');\n          const charmLines = lines\n            .filter((line) => {\n              const type = mlsCartComponentType(line);\n              return type === 'charm' || /^charm\\s/u.test(type);\n            })\n            .sort((a, b) => Number(a.properties?._mls_order || 0) - Number(b.properties?._mls_order || 0));\n          if (!supportLine) throw new Error(this.messages.cartIncomplete || 'Cette cr\u00E9ation est incompl\u00E8te et ne peut pas \u00EAtre modifi\u00E9e.');\n\n          this.placementMode = supportLine.properties?._mls_placement_mode === 'atelier_free'\n            ? 'atelier_free'\n            : 'customer_exact';\n\n          const supportId = String(supportLine.properties?._mls_support_profile || '');\n          const storedSupport = this.supportProfiles.get(supportId);\n          if (!storedSupport) throw new Error(this.messages.cartSupport || 'Le support de cette cr\u00E9ation n\u2019est plus disponible.');\n          this.supportProfile = {\n            ...storedSupport,\n            image: supportLine.properties?._mls_support_image || storedSupport.image,\n            referenceScalePercent: Number(supportLine.properties?._mls_support_reference_scale || storedSupport.referenceScalePercent || 100)\n          };\n          this.supportVariant = this.resolveSupportVariant(this.supportProfile);\n          const storedVariantId = String(supportLine.variant_id || supportLine.properties?._mls_support_variant || '');\n          const exactVariant = (this.supportProfile.variants || []).find((variant) => (\n            mlsNumericShopifyId(variant.id) === mlsNumericShopifyId(storedVariantId)\n          ));\n          if (exactVariant) this.supportVariant = exactVariant;\n          this.basePrice = Number(this.supportVariant.priceCents ?? supportLine.final_price ?? 0);\n          this.attachmentPoints = this.parseAttachmentPoints(this.supportProfile.attachmentPoints || []);\n          this.maxCharms = Math.min(Number(this.supportProfile.maxCharms || this.attachmentPoints.length), this.attachmentPoints.length);\n\n          this.items = charmLines.map((line, index) => {\n            const props = line.properties || {};\n            const profile = this.charmProfiles.get(String(line.variant_id))\n              || [...this.charmProfiles.values()].find((candidate) => String(candidate.profileId) === String(props._mls_charm_profile))\n              || {};\n            return {\n              instanceId: String(props._mls_instance || `mls-restored-${Date.now()}-${index}`),\n              profileId: String(props._mls_charm_profile || profile.profileId || ''),\n              title: mlsCustomerCharmTitle(profile.displayTitle || props._mls_display_title || profile.title || line.product_title || ''),\n              technicalTitle: mlsCustomerCharmTitle(props._mls_display_title || profile.title || line.product_title || ''),\n              image: String(props._mls_charm_image || profile.image || line.image || ''),\n              price: Number(line.final_price ?? profile.priceCents ?? 0),\n              productId: String(props._mls_charm_product || profile.productId || line.product_id || ''),\n              variantId: String(line.variant_id || props._mls_charm_variant || profile.variantId || ''),\n              size: String(props._mls_charm_size || profile.size || 'M'),\n              visualScalePercent: Number(props._mls_charm_scale || profile.visualScalePercent || 100),\n              supportScaleOverrides: { ...(profile.supportScaleOverrides || {}) },\n              frozenSupportProductId: String(supportLine.properties?._mls_support_product || storedSupport.productId || ''),\n              frozenSupportScalePercent: Number(props._mls_charm_support_scale || 100),\n              anchorXPercent: Number(props._mls_charm_anchor_x ?? profile.anchorXPercent ?? 50),\n              anchorYPercent: Number(props._mls_charm_anchor_y ?? profile.anchorYPercent ?? 0),\n              attachmentPointId: Number(props._mls_point_source_index)\n            };\n          });\n          this.editingLineKeys = lines.map((line) => line.key).filter(Boolean);\n          this.supportVariantSelections.set(String(this.supportProfile.profileId), String(this.supportVariant.id));\n          this.updateSupportPresentation();\n          this.syncSupportOptionState();\n          this.renderAttachmentPoints();\n          this.render();\n          this.announce(mlsTranslate(this.messages.creationRestored || 'Cr\u00E9ation __id__ charg\u00E9e depuis le panier.', { id: creationId }));\n        } catch (error) {\n          this.showCartError(error.message);\n        }\n      }\n\n      async removeCartLinesByKeys(keys) {\n        if (!keys?.length) return;\n        const updates = Object.fromEntries(keys.map((key) => [key, 0]));\n        const response = await fetch('/cart/update.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({ updates })\n        });\n        if (!response.ok) throw new Error(this.messages.cartReplace || 'Impossible de remplacer l\u2019ancienne cr\u00E9ation dans le panier.');\n      }\n\n      async addCreationToCart() {\n        if (this.cartBusy) return;\n        const incompatible = this.incompatibleItems();\n        if (incompatible.length || this.items.length > this.maxCharms) {\n          this.showCartError(incompatible.length\n            ? (this.messages.cartIncompatible || 'Cette cr\u00E9ation contient un ou plusieurs charms incompatibles avec le support s\u00E9lectionn\u00E9.')\n            : mlsTranslate(this.messages.cartCapacity || 'Cette cr\u00E9ation d\u00E9passe la capacit\u00E9 maximale de __capacity__ charms.', { capacity: this.maxCharms }));\n          return;\n        }\n        const fingerprint = this.cartFingerprint();\n        if (fingerprint !== this.pendingCartFingerprint) {\n          this.pendingCartFingerprint = fingerprint;\n          this.pendingCreationId = this.createCreationId();\n        }\n\n        let cartItems;\n        try {\n          cartItems = mlsBuildCartItems({\n            support: this.supportProfile,\n            supportVariant: this.supportVariant,\n            items: this.items,\n            attachmentPoints: this.attachmentPoints,\n            creationId: this.pendingCreationId,\n            placementMode: this.placementMode,\n            messages: this.messages\n          });\n        } catch (error) {\n          this.showCartError(error.message);\n          return;\n        }\n\n        this.cartBusy = true;\n        this.renderCartState();\n        try {\n          const response = await fetch(this.dataset.cartAddUrl || '/cart/add.js', {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n            body: JSON.stringify({ items: cartItems })\n          });\n          const result = await response.json().catch(() => ({}));\n          if (!response.ok) throw new Error(result.description || result.message || this.dataset.cartError);\n          if (this.editingCreationId && this.editingLineKeys.length) {\n            try {\n              await this.removeCartLinesByKeys(this.editingLineKeys);\n            } catch (replaceError) {\n              const cartResponse = await fetch(`${this.dataset.cartUrl || '/cart'}.js`, { headers: { Accept: 'application/json' } });\n              const cart = await cartResponse.json().catch(() => ({ items: [] }));\n              const replacementKeys = (cart.items || [])\n                .filter((line) => mlsCartCreationId(line) === this.pendingCreationId)\n                .map((line) => line.key);\n              await this.removeCartLinesByKeys(replacementKeys).catch(() => {});\n              throw replaceError;\n            }\n          }\n          if (this.cartStatus) {\n            this.cartStatus.textContent = (this.dataset.cartSuccess || 'Cr\u00E9ation ajout\u00E9e au panier \u2713')\n              .replace('__id__', this.pendingCreationId);\n            this.cartStatus.dataset.state = 'success';\n          }\n          this.announce(this.cartStatus?.textContent || 'Cr\u00E9ation ajout\u00E9e au panier.');\n          window.location.assign(this.dataset.cartUrl || '/cart');\n        } catch (error) {\n          this.cartBusy = false;\n          this.renderCartState();\n          this.showCartError(error.message || this.dataset.cartError);\n        }\n      }\n\n      showCartError(message) {\n        if (this.cartStatus) {\n          this.cartStatus.textContent = message || this.dataset.cartError || 'Impossible d\u2019ajouter la cr\u00E9ation au panier.';\n          this.cartStatus.dataset.state = 'error';\n        }\n        this.announce(this.cartStatus?.textContent || message);\n      }\n\n      updateCardControls() {\n        this.querySelectorAll('.mls-builder-v2__charm-card').forEach((card) => {\n          const addButton = card.querySelector('[data-add-charm]');\n          const control = card.querySelector('[data-quantity-control]');\n          const quantity = card.querySelector('[data-variant-quantity]');\n          const plus = card.querySelector('.mls-builder-v2__plus');\n          if (!addButton || !control || !quantity || !plus) return;\n          const count = this.items.filter((item) => item.variantId === addButton.dataset.variantId).length;\n          card.classList.toggle('is-selected', count > 0);\n          plus.hidden = count > 0;\n          control.hidden = count === 0;\n          quantity.textContent = String(count);\n        });\n      }\n\n      targetHeight(size) {\n        return MLS_TARGET_HEIGHTS[size] || MLS_TARGET_HEIGHTS.M;\n      }\n\n      renderedImageMetrics() {\n        return window.MLSAnchorLocalV1.renderedImageMetrics(this.stage, this.supportImage);\n      }\n\n      projectSupportPoint(point, metrics = this.renderedImageMetrics()) {\n        return window.MLSAnchorLocalV1.projectSupportPoint(point, metrics);\n      }\n\n      async visibleBounds(image) {\n        return window.MLSAnchorLocalV1.visibleBounds(image, this.imageBounds);\n      }\n\n      async normalizeItems() {\n        this.renderAttachmentPoints();\n        const metrics = this.renderedImageMetrics();\n        const jobs = this.items.map(async (item) => {\n            const placed = this.row.querySelector(`[data-instance=\"${item.instanceId}\"]`);\n            const image = placed?.querySelector('img');\n            if (!placed || !image) return;\n            const bounds = await this.visibleBounds(image);\n            if (!placed.isConnected) return;\n            item.renderGeometry = window.MLSAnchorLocalV1.renderGeometry({\n              bounds,\n              baseHeight: this.targetHeight(item.size),\n              metrics,\n              supportReferenceScalePercent: this.supportProfile.referenceScalePercent,\n              visualScalePercent: item.visualScalePercent,\n              charmSupportScalePercent: mlsCharmSupportScale(item, this.supportProfile)\n            });\n          });\n        await Promise.all(jobs);\n        this.positionItems();\n      }\n\n      parseAttachmentPoints(rawValue) {\n        try {\n          const points = Array.isArray(rawValue) ? rawValue : JSON.parse(rawValue || '[]');\n          if (!Array.isArray(points)) return [];\n          return points\n            .map((point, index) => ({\n              id: Number(point.id ?? index + 1),\n              x: Number(point.x),\n              y: Number(point.y),\n              priority: Number(point.fillPriority ?? point.priority ?? index + 1),\n              angle: Number(point.angle || 0),\n              isCenter: point.isCenter === true,\n              sourceIndex: index\n            }))\n            .filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y) && Number.isFinite(point.priority))\n            .sort((first, second) => first.priority - second.priority);\n        } catch (_error) {\n          return [];\n        }\n      }\n\n      renderAttachmentPoints(forceVisible = false) {\n        if (!this.pointsLayer) return;\n        if (!this.showAttachmentPoints && !forceVisible) {\n          this.pointsLayer.hidden = true;\n          this.pointsLayer.innerHTML = '';\n          return;\n        }\n        this.pointsLayer.hidden = false;\n        const metrics = this.renderedImageMetrics();\n        this.pointsLayer.innerHTML = this.attachmentPoints.map((point) => {\n          const projected = this.projectSupportPoint(point, metrics);\n          return `\n          <span\n            class=\"mls-builder-v2__attachment-point\"\n            data-point-number=\"${point.priority}\"\n            style=\"left:${projected.x}px;top:${projected.y}px\"\n          ></span>\n        `;\n        }).join('');\n      }\n\n      activeAttachmentPoints(count) {\n        if (count <= 0) return [];\n        return this.attachmentPoints.slice(0, count);\n      }\n\n      nextFreeAttachmentPoint() {\n        const occupied = new Set(this.items.map((item) => item.attachmentPointId));\n        return this.attachmentPoints.find((point) => !occupied.has(point.sourceIndex)) || null;\n      }\n\n      positionItems() {\n        const metrics = this.renderedImageMetrics();\n        const usedPoints = new Set();\n        this.items.forEach((item) => {\n          const placed = this.row.querySelector(`[data-instance=\"${item.instanceId}\"]`);\n          let point = this.attachmentPoints.find((candidate) => candidate.sourceIndex === item.attachmentPointId);\n          if (!point || usedPoints.has(point.sourceIndex)) {\n            point = this.attachmentPoints.find((candidate) => !usedPoints.has(candidate.sourceIndex));\n            if (point) item.attachmentPointId = point.sourceIndex;\n          }\n          if (!placed || !point) return;\n          usedPoints.add(point.sourceIndex);\n          this.positionItemElement(item, placed, point, metrics);\n          placed.dataset.attachmentPoint = String(point.sourceIndex);\n        });\n      }\n\n      positionItemElement(item, placed, point, metrics = this.renderedImageMetrics()) {\n        const geometry = item.renderGeometry;\n        if (!geometry) return;\n        const { bounds, scale } = geometry;\n        const image = placed.querySelector('img');\n        if (!image) return;\n        window.MLSAnchorLocalV1.applyPlacement({\n          placed,\n          image,\n          point,\n          metrics,\n          bounds,\n          scale,\n          anchorXPercent: item.anchorXPercent,\n          anchorYPercent: item.anchorYPercent\n        });\n      }\n\n      targetPoint(clientX, clientY) {\n        const stageBounds = this.drag.stage.getBoundingClientRect();\n        const metrics = this.renderedImageMetrics();\n        const localStageWidth = this.drag.stage.offsetWidth || stageBounds.width || 1;\n        const localStageHeight = this.drag.stage.offsetHeight || stageBounds.height || 1;\n        const screenScaleX = stageBounds.width / localStageWidth;\n        const screenScaleY = stageBounds.height / localStageHeight;\n        let nearestPoint = this.attachmentPoints.find((point) => point.sourceIndex === this.drag.sourcePointId) || null;\n        let nearestDistance = Number.POSITIVE_INFINITY;\n        this.attachmentPoints.forEach((point) => {\n          const projected = this.projectSupportPoint(point, metrics);\n          const pointX = stageBounds.left + (projected.x * screenScaleX);\n          const pointY = stageBounds.top + (projected.y * screenScaleY);\n          const distance = Math.hypot(clientX - pointX, clientY - pointY);\n          if (distance < nearestDistance) {\n            nearestDistance = distance;\n            nearestPoint = point;\n          }\n        });\n        return nearestPoint;\n      }\n\n      swapIntoPoint(item, targetPointId) {\n        if (targetPointId === item.attachmentPointId) return;\n        const sourcePointId = item.attachmentPointId;\n        const occupant = this.items.find((candidate) => (\n          candidate.instanceId !== item.instanceId && candidate.attachmentPointId === targetPointId\n        ));\n        item.attachmentPointId = targetPointId;\n        if (occupant) occupant.attachmentPointId = sourcePointId;\n      }\n\n      startDrag(event) {\n        const placed = event.target.closest('[data-instance]');\n        if (!placed) return;\n        const item = this.items.find((candidate) => candidate.instanceId === placed.dataset.instance);\n        if (!item) return;\n        event.preventDefault();\n        const captureElement = placed;\n        try {\n          captureElement.setPointerCapture(event.pointerId);\n        } catch (_error) {}\n        window.addEventListener('pointermove', this.onWindowDragMove, { passive: false });\n        window.addEventListener('pointerup', this.onWindowDragEnd, { passive: false });\n        window.addEventListener('pointercancel', this.onWindowDragEnd, { passive: false });\n        placed.classList.add('is-dragging');\n        this.drag = {\n          pointerId: event.pointerId,\n          captureElement,\n          placed,\n          stage: this.stage,\n          item,\n          sourcePointId: item.attachmentPointId,\n          targetPointId: item.attachmentPointId\n        };\n        if (event.pointerType === 'mouse') this.renderAttachmentPoints(true);\n      }\n\n      moveDrag(event) {\n        if (!this.drag || this.drag.pointerId !== event.pointerId) return;\n        event.preventDefault();\n        const point = this.targetPoint(event.clientX, event.clientY);\n        if (!point || point.sourceIndex === this.drag.targetPointId) return;\n        this.drag.targetPointId = point.sourceIndex;\n        this.positionItemElement(this.drag.item, this.drag.placed, point);\n        this.drag.placed.dataset.attachmentPoint = String(point.sourceIndex);\n      }\n\n      endDrag(event) {\n        if (!this.drag || this.drag.pointerId !== event.pointerId) return;\n        event.preventDefault();\n        const captureElement = this.drag.captureElement || this.drag.placed;\n        if (captureElement.hasPointerCapture?.(event.pointerId)) captureElement.releasePointerCapture(event.pointerId);\n        this.removeWindowDragListeners();\n        this.drag.placed.classList.remove('is-dragging');\n        if (event.type !== 'pointercancel') this.swapIntoPoint(this.drag.item, this.drag.targetPointId);\n        this.drag = null;\n        this.render();\n      }\n\n      removeWindowDragListeners() {\n        window.removeEventListener('pointermove', this.onWindowDragMove);\n        window.removeEventListener('pointerup', this.onWindowDragEnd);\n        window.removeEventListener('pointercancel', this.onWindowDragEnd);\n      }\n\n      keyboardMove(event) {\n        const grab = event.target.closest('[data-grab-instance]');\n        if (!grab) return;\n        const item = this.items.find((candidate) => candidate.instanceId === grab.dataset.grabInstance);\n        if (!item) return;\n        if (event.key === 'Delete' || event.key === 'Backspace') {\n          event.preventDefault();\n          this.remove(item.instanceId);\n          return;\n        }\n        if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n        event.preventDefault();\n        const physicalPoints = [...this.attachmentPoints].sort((first, second) => first.x - second.x);\n        const currentIndex = physicalPoints.findIndex((point) => point.sourceIndex === item.attachmentPointId);\n        const nextIndex = Math.max(0, Math.min(physicalPoints.length - 1, currentIndex + (event.key === 'ArrowLeft' ? -1 : 1)));\n        if (currentIndex < 0 || nextIndex === currentIndex) return;\n        this.swapIntoPoint(item, physicalPoints[nextIndex].sourceIndex);\n        this.render();\n        this.querySelector(`[data-grab-instance=\"${item.instanceId}\"]`)?.focus();\n      }\n\n      parseList(value) {\n        if (Array.isArray(value)) return value.map((entry) => String(entry).trim()).filter(Boolean);\n        return String(value || '').split(/[\\s,;|]+/).map((entry) => entry.trim()).filter(Boolean);\n      }\n\n      isCharmCompatible(profile, support = this.supportProfile) {\n        const compatibility = support?.compatibility || {};\n        const variantId = String(profile?.variantId || '');\n        const profileId = String(profile?.profileId || '');\n        const productId = String(profile?.productId || '');\n        if (!['S', 'M', 'L'].includes(String(profile?.size || '').toUpperCase())) return false;\n        const allowedSizes = new Set(this.parseList(compatibility.allowedSizeClasses).map((size) => size.toUpperCase()));\n        if (allowedSizes.size && !allowedSizes.has(String(profile?.size || '').toUpperCase())) return false;\n        const excluded = new Set(this.parseList(compatibility.excludedVariantIds));\n        const excludedProducts = new Set(this.parseList(compatibility.excludedProductIds));\n        if (excluded.has(variantId) || excluded.has(profileId) || excludedProducts.has(productId)) return false;\n        if (compatibility.mode !== 'restricted') return true;\n\n        const included = new Set(this.parseList(compatibility.includedVariantIds));\n        const includedProducts = new Set(this.parseList(compatibility.includedProductIds));\n        if (included.has(variantId) || included.has(profileId) || includedProducts.has(productId)) return true;\n\n        const allowedCategories = new Set(this.parseList(compatibility.allowedCategories));\n        if (allowedCategories.has(String(profile?.category || ''))) return true;\n\n        const allowedCollections = new Set(this.parseList(compatibility.allowedCollectionHandles));\n        return this.parseList(profile?.collectionHandles).some((handle) => allowedCollections.has(handle));\n      }\n\n      supportCapacity(support) {\n        const points = this.parseAttachmentPoints(support?.attachmentPoints || '[]');\n        return Math.min(Number(support?.maxCharms || points.length), points.length);\n      }\n\n      supportChangePlan(support) {\n        const incompatible = this.items.filter((item) => {\n          const profile = this.charmProfiles.get(String(item.variantId)) || item;\n          return !this.isCharmCompatible(profile, support);\n        });\n        const incompatibleIds = new Set(incompatible.map((item) => item.instanceId));\n        const compatible = this.items.filter((item) => !incompatibleIds.has(item.instanceId));\n        const currentPoints = new Map(this.attachmentPoints.map((point) => [point.sourceIndex, point]));\n        const compatibleByPriority = [...compatible].sort((first, second) => {\n          const firstPriority = currentPoints.get(first.attachmentPointId)?.priority ?? Number.MAX_SAFE_INTEGER;\n          const secondPriority = currentPoints.get(second.attachmentPointId)?.priority ?? Number.MAX_SAFE_INTEGER;\n          return firstPriority - secondPriority;\n        });\n        const capacity = this.supportCapacity(support);\n        const overflow = compatibleByPriority.slice(capacity);\n        const removeById = new Map([...incompatible, ...overflow].map((item) => [item.instanceId, item]));\n        return {\n          support,\n          capacity,\n          incompatible,\n          overflow,\n          removeItems: [...removeById.values()]\n        };\n      }\n\n      requestSupportChange(profileId) {\n        const support = this.supportProfiles.get(String(profileId));\n        if (!support || support === this.supportProfile) return;\n        const plan = this.supportChangePlan(support);\n        if (!plan.removeItems.length) {\n          this.applySupportChange(plan);\n          return;\n        }\n        this.pendingSupportChange = plan;\n        this.openSupportChangeDialog(plan);\n      }\n\n      openSupportChangeDialog(plan) {\n        if (!this.supportDialog) return;\n        const supportName = String(plan.support.title || '');\n        this.supportDialogTitle.textContent = this.replaceTokens(\n          this.dataset.supportDialogTitleTemplate,\n          { support: supportName }\n        );\n        this.supportDialogSummary.textContent = this.replaceTokens(\n          this.dataset.supportDialogSummaryTemplate,\n          { support: supportName }\n        );\n        const reasons = [];\n        if (plan.incompatible.length) {\n          reasons.push(this.replaceTokens(\n            this.dataset.supportDialogIncompatibleTemplate,\n            { count: plan.incompatible.length }\n          ));\n        }\n        if (plan.overflow.length) {\n          reasons.push(this.replaceTokens(\n            this.dataset.supportDialogCapacityTemplate,\n            { count: plan.overflow.length, capacity: plan.capacity }\n          ));\n        }\n        this.supportDialogReasons.innerHTML = reasons.map((reason) => `<li>${this.escape(reason)}</li>`).join('');\n        this.supportDialogItems.innerHTML = plan.removeItems.map((item) => `<li>${this.escape(item.title)}</li>`).join('');\n        if (typeof this.supportDialog.showModal === 'function') this.supportDialog.showModal();\n        else this.supportDialog.setAttribute('open', '');\n      }\n\n      confirmSupportChange() {\n        if (!this.pendingSupportChange) return;\n        const plan = this.pendingSupportChange;\n        this.closeSupportChangeDialog();\n        this.applySupportChange(plan);\n        this.announce(this.replaceTokens(\n          this.dataset.supportChangedTemplate,\n          { support: plan.support.title || '', count: plan.removeItems.length }\n        ));\n      }\n\n      cancelSupportChange() {\n        if (!this.pendingSupportChange) return;\n        this.pendingSupportChange = null;\n        this.closeSupportChangeDialog();\n        this.announce(this.dataset.supportChangeCancelledTemplate || '');\n      }\n\n      closeSupportChangeDialog() {\n        if (this.supportDialog?.open && typeof this.supportDialog.close === 'function') this.supportDialog.close();\n        else this.supportDialog?.removeAttribute('open');\n        this.pendingSupportChange = null;\n      }\n\n      applySupportChange(plan) {\n        const support = plan.support;\n        const removeIds = new Set(plan.removeItems.map((item) => item.instanceId));\n        const oldPoints = new Map(this.attachmentPoints.map((point) => [point.sourceIndex, point]));\n        const remaining = this.items\n          .filter((item) => !removeIds.has(item.instanceId))\n          .sort((first, second) => {\n            const firstX = oldPoints.get(first.attachmentPointId)?.x ?? Number.MAX_SAFE_INTEGER;\n            const secondX = oldPoints.get(second.attachmentPointId)?.x ?? Number.MAX_SAFE_INTEGER;\n            return firstX - secondX;\n          });\n        const nextPoints = this.parseAttachmentPoints(support.attachmentPoints || '[]');\n        const nextCapacity = Math.min(Number(support.maxCharms || nextPoints.length), nextPoints.length);\n        const activePhysicalPoints = nextPoints.slice(0, Math.min(remaining.length, nextCapacity))\n          .sort((first, second) => first.x - second.x);\n        remaining.forEach((item, index) => {\n          item.attachmentPointId = activePhysicalPoints[index]?.sourceIndex ?? null;\n        });\n\n        this.items = remaining;\n        this.supportProfile = support;\n        this.supportVariant = this.resolveSupportVariant(support);\n        this.basePrice = Number(this.supportVariant.priceCents ?? support.priceCents ?? this.basePrice);\n        this.attachmentPoints = nextPoints;\n        this.maxCharms = nextCapacity;\n        this.showAttachmentPoints = support.showAttachmentPoints === true || support.showAttachmentPoints === 'true';\n        this.updateSupportPresentation();\n        this.syncSupportOptionState();\n        this.renderAttachmentPoints();\n        this.render();\n        if (this.supportPicker) this.supportPicker.hidden = true;\n        if (!plan.removeItems.length) {\n          this.announce(this.replaceTokens(\n            this.dataset.supportChangedNoRemovalTemplate,\n            { support: support.title || '' }\n          ));\n        }\n      }\n\n      applyCompatibility() {\n        const cards = [...this.querySelectorAll('.mls-builder-v2__charm-card')];\n        cards.forEach((card) => {\n          const variantId = card.querySelector('[data-add-charm]')?.dataset.variantId || '';\n          const profile = this.charmProfiles.get(String(variantId)) || {};\n          card.dataset.compatible = String(this.isCharmCompatible(profile));\n        });\n\n        const availableCategories = new Set(cards\n          .filter((card) => card.dataset.compatible === 'true')\n          .flatMap((card) => this.parseList(card.dataset.collections)));\n        this.querySelectorAll('[data-filter]').forEach((button) => {\n          const category = button.dataset.filter;\n          button.hidden = category !== 'all' && !availableCategories.has(category);\n        });\n\n        const selectedFilter = this.querySelector(`[data-filter=\"${this.activeFilter}\"]`);\n        if (!selectedFilter || selectedFilter.hidden) this.activeFilter = 'all';\n        this.querySelectorAll('[data-filter]').forEach((button) => {\n          button.setAttribute('aria-selected', String(button.dataset.filter === this.activeFilter));\n        });\n        this.updateCatalogVisibility();\n        this.renderCompatibilityNotice();\n      }\n\n      updateCatalogVisibility() {\n        this.sortCatalogCards(this.activeFilter);\n        this.querySelectorAll('.mls-builder-v2__charm-card').forEach((card) => {\n          const compatible = card.dataset.compatible === 'true';\n          const collections = this.parseList(card.dataset.collections);\n          const inActiveCategory = Boolean(this.catalogSearchQuery)\n            || this.activeFilter === 'all'\n            || collections.includes(this.activeFilter);\n          const title = card.querySelector('[data-add-charm]')?.dataset.title || '';\n          const matchesSearch = !this.catalogSearchQuery || mlsSortText(title).includes(this.catalogSearchQuery);\n          card.hidden = !compatible || !inActiveCategory || !matchesSearch;\n        });\n      }\n\n      sortCatalogCards(activeFilter = 'all') {\n        const catalog = this.querySelector('[data-catalog]');\n        if (!catalog) return;\n        const cards = [...catalog.querySelectorAll('.mls-builder-v2__charm-card')];\n        cards.sort((leftCard, rightCard) => {\n          const leftVariantId = leftCard.querySelector('[data-add-charm]')?.dataset.variantId || '';\n          const rightVariantId = rightCard.querySelector('[data-add-charm]')?.dataset.variantId || '';\n          const leftProfile = this.charmProfiles.get(String(leftVariantId)) || {};\n          const rightProfile = this.charmProfiles.get(String(rightVariantId)) || {};\n          return mlsCompareProfiles(leftProfile, rightProfile, activeFilter);\n        });\n        catalog.append(...cards);\n      }\n\n      incompatibleItems() {\n        return this.items.filter((item) => {\n          const profile = this.charmProfiles.get(String(item.variantId)) || item;\n          return !this.isCharmCompatible(profile);\n        });\n      }\n\n      renderCompatibilityNotice() {\n        if (!this.compatibilityNotice || !this.compatibilityMessage) return;\n        const incompatible = this.incompatibleItems();\n        this.compatibilityNotice.hidden = incompatible.length === 0;\n        this.compatibilityMessage.textContent = incompatible.length\n          ? (this.dataset.incompatibleTemplate || '').replace('__count__', String(incompatible.length))\n          : '';\n      }\n\n      removeIncompatibleItems() {\n        const incompatibleIds = new Set(this.incompatibleItems().map((item) => item.instanceId));\n        if (!incompatibleIds.size) return;\n        this.items = this.items.filter((item) => !incompatibleIds.has(item.instanceId));\n        this.render();\n        this.announce(this.dataset.incompatibleRemovedTemplate || '');\n      }\n\n      filter(button) {\n        if (button.hidden) return;\n        this.activeFilter = button.dataset.filter;\n        this.querySelectorAll('[data-filter]').forEach((candidate) => {\n          candidate.setAttribute('aria-selected', String(candidate === button));\n        });\n        this.updateCatalogVisibility();\n      }\n\n      template(type, title) {\n        return (this.dataset[`${type}Template`] || '').replace('__title__', title);\n      }\n\n      replaceTokens(template, values) {\n        return Object.entries(values).reduce(\n          (message, [key, value]) => message.replaceAll(`__${key}__`, String(value)),\n          String(template || '')\n        );\n      }\n\n      formatMoney(cents) {\n        return new Intl.NumberFormat(this.locale, { style: 'currency', currency: this.currency }).format(Number(cents) / 100);\n      }\n\n      announce(message) {\n        this.liveRegion.textContent = '';\n        window.requestAnimationFrame(() => { this.liveRegion.textContent = message; });\n      }\n\n      escape(value) {\n        return String(value).replace(/[&<>'\"]/g, (character) => ({\n          '&': '&amp;',\n          '<': '&lt;',\n          '>': '&gt;',\n          \"'\": '&#39;',\n          '\"': '&quot;'\n        })[character]);\n      }\n    });\n  }\n"],
  "mappings": "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",
  "names": ["support", "bounds"]
}
