{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/personalizer-modal.js?orion=20260922-assistance"],
  "sourcesContent": ["(function () {\r\n  const CART_EDIT_SESSION_KEY = 'orion_personalizer_cart_edit';\r\n  const CART_GROUP_PREVIEWS_SESSION_KEY = 'orion_personalizer_cart_group_previews';\r\n  const VARIANT_STOCK_CACHE_SESSION_KEY = 'orion_personalizer_variant_stock_cache';\r\n  const RECENT_UPLOADED_IMAGES_KEY = 'orion_personalizer_recent_uploaded_images';\r\n\r\n  function getOrionThemeColor(variableName, fallback) {\r\n    if (typeof window === 'undefined' || typeof document === 'undefined' || !window.getComputedStyle) return fallback;\r\n    const value = window.getComputedStyle(document.documentElement).getPropertyValue(variableName).trim();\r\n    return value || fallback;\r\n  }\r\n\r\n  function generateCustomGroupId() {\r\n    return 'grp_' + String(Date.now()) + '_' + String(Math.floor(Math.random() * 1000000)).padStart(6, '0');\r\n  }\r\n\r\n  function normalizeViewId(value) {\r\n    const normalized = String(value || 'front').trim().toLowerCase();\r\n    return normalized || 'front';\r\n  }\r\n\r\n  function PersonalizerModalApp(root, config) {\r\n    this.root = root;\r\n    this.config = config || {};\r\n    this.personalizerMode = String(\r\n      this.config.personalizerMode || (root && root.dataset ? root.dataset.personalizerMode : '') || 'textile'\r\n    ).toLowerCase();\r\n    this.form = null;\r\n    this.openButton = null;\r\n    this.modal = null;\r\n    this.canvasEngine = null;\r\n    this.selectedTechnique = null;\r\n    this.selectedZone = null;\r\n    this.currentVariant = null;\r\n    this.currentQuantity = 1;\r\n    this.techniques = [];\n    this.zones = [];\n    this.customizationRules = {\n      maxActiveZones: null,\n      minCustomizationQuantity: null,\n      variantQuantityMode: 'single',\n      splitOption: ''\n    };\n    this.sharedMarkingColor = '#111111';\n    this.mockups = {};\r\n    this.printTemplates = [];\r\n    this.recentUploadedImages = [];\r\n    this.colors = [];\r\n    this.mockupAdjustments = [];\r\n    this.pricingRules = null;\r\n    this.activeColorName = '';\r\n    this.activeView = 'front';\r\n    this.viewThumbnails = {};\r\n    this.zoneThumbnails = {};\r\n    this.zoneThumbnailStateKeys = {};\r\n    this.viewThumbnailStateKeys = {};\r\n    this.activeControlsPanel = 'default';\r\n    this.selectedDesignKind = '';\n    this.selectedDesignObject = null;\n    this.zoneOverlayRequested = false;\n    this.pendingImagePlaceholder = null;\r\n    this.pendingUserPlacement = null;\r\n    this.isApplyingPrintTemplate = false;\r\n    this.isApplyingPlacement = false;\r\n    this.closeTimeout = null;\r\n    this.canvasZoomRangeInput = null;\r\n    this.canvasZoomResetButton = null;\r\n    this.canvasZoomDecreaseButton = null;\r\n    this.canvasZoomIncreaseButton = null;\r\n    this.canvasZoomValueNode = null;\r\n    this.canvasDimensionsToggleButton = null;\r\n    this.canvasDimensionsPanel = null;\r\n    this.canvasDisclaimer = null;\r\n    this.batPdfButton = null;\r\n    this.batPdfButtons = [];\r\n    this.batIndividualToggleInput = null;\r\n    this.previewModal = null;\r\n    this.previewImage = null;\r\n    this.previewBatInfoModal = null;\r\n    this.zoneInfoModal = null;\r\n    this.previewActiveView = 'front';\r\n    this.previewWasOpenBeforeBatInfo = false;\r\n    this.isDimensionsVisible = false;\r\n    this.techniqueConfirmModal = null;\r\n    this.entryDisclaimerModal = null;\r\n    this.cartSuccessModal = null;\r\n    this.abandonConfirmModal = null;\r\n    this.cartEditCloseConfirmModal = null;\r\n    this.outOfFrameConfirmModal = null;\r\n    this.pendingTechniqueChange = null;\r\n    this.sizeQuantities = {};\r\n    this.designObjectUidCounter = 1;\r\n    this.draggingImpressionUid = '';\r\n    this.impressionTouchState = null;\r\n    this.impressionLongPressTimer = 0;\r\n    this.suppressNextImpressionClick = false;\r\n    this.activeFlyout = '';\r\n    this.isRestoringCartEdit = false;\r\n    this.cartEditContext = null;\r\n    this.cartEditInitialStateSnapshot = '';\r\n    this.isSubmittingCart = false;\r\n    this.globalBusyOverlay = null;\r\n    this.bodyScrollLockCount = 0;\r\n    this.bodyScrollPreviousPaddingRight = '';\r\n    this.zoomLockEnabled = false;\r\n    this.boundZoomLockWheelHandler = null;\r\n    this.boundZoomLockKeydownHandler = null;\r\n    this.boundZoomLockGestureHandler = null;\r\n    this.boundZoomLockTouchMoveHandler = null;\r\n    this.preservedFlyoutName = '';\r\n    this.impressionsSheetPanel = null;\r\n    this.viewportResizeHandler = null;\r\n    this.viewportScrollHandler = null;\r\n    this.debugEnabled = false;\r\n    this.variantColorSwatches = [];\r\n    this.pendingCanvasUiWork = null;\r\n    this.canvasUiWorkFrameId = 0;\r\n    this.pendingCanvasHeavyWork = null;\r\n    this.canvasHeavyUiTimer = 0;\r\n    this.thumbnailCaptureTimer = 0;\r\n    this.lastBackgroundSyncKey = '';\r\n    this.canvasViewTransitionPending = false;\r\n    this.qrUpdateTimer = 0;\r\n    this.qrRenderNonce = 0;\r\n    this.printOptions = [];\r\n    this.rawPrintOptions = [];\r\n    this.selectedPrintOptionKeys = {};\r\n    this.pendingPrintOptionKeys = [];\r\n    this.storefrontDiscountConfig = null;\r\n    this.printConfig = null;\r\n    this.printSelection = {};\r\n    this.printDocument = null;\r\n    this.printStyleValues = {};\n    this.viewDisplayConfig = {};\n    this.hasWarnedMissingPrintConfig = false;\r\n  }\r\n\r\n  PersonalizerModalApp.prototype.init = function () {\r\n    if (!this.root || !window.PersonalizerMetafields || !window.PersonalizerPricing || !window.PersonalizerCanvas) {\r\n      return;\r\n    }\r\n    const self = this;\r\n    this.debugEnabled = this.isDebugEnabled();\r\n    if (this.config.hasPrintTag && this.config.hasTextileTag && typeof console !== 'undefined') {\r\n      console.warn('[Personalizer] Tags print et textile d\u00E9tect\u00E9s : le parcours print est prioritaire.');\r\n    }\r\n\r\n    this.modal = this.root.querySelector('#personalizer-modal');\r\n    if (!this.modal) return;\r\n    this.printConfig = this.isPrintMode() ? this.normalizePrintConfig(this.config.printConfig) : null;\r\n    if (this.isPrintMode() && !this.printConfig && !this.hasWarnedMissingPrintConfig) {\r\n      console.warn('[Personalizer Print] Le metafield custom.print_config est absent ou invalide. Le comportement print historique est conserv\u00E9.');\r\n      this.hasWarnedMissingPrintConfig = true;\r\n    }\r\n    this.recentUploadedImages = this.getRecentUploadedImages();\r\n    this.root.classList.toggle('product-personalizer-root--print', this.isPrintMode());\r\n    this.modal.classList.toggle('personalizer-modal--print', this.isPrintMode());\r\n    this.applyModeUi();\r\n\r\n    this.form = document.querySelector('form[data-type=\"add-to-cart-form\"]');\r\n    this.openButton = this.injectOpenButton();\r\n    if (this.isPrintMode()) {\r\n      this.currentVariant = (this.config.variants || []).find(\r\n        function (variant) { return Number(variant && variant.id) === Number(this.config.selectedVariantId); }.bind(this)\r\n      ) || null;\r\n      this.refreshPrintConfigurationFromVariant({ initialize: true });\r\n    }\r\n\r\n    const defaultMetafields = this.getDefaultMetafieldsConfig();\r\n    const sourceMetafields = this.config.metafields || {};\n    this.viewDisplayConfig = this.normalizeViewDisplayConfig(sourceMetafields.viewDisplay);\n    const sourceTechniquesInput = Array.isArray(sourceMetafields.techniques) ? sourceMetafields.techniques : [];\r\n    const sourceZonesInput = Array.isArray(sourceMetafields.zones) ? sourceMetafields.zones : [];\r\n    const sourceTechniques = sourceTechniquesInput.length ? sourceTechniquesInput : defaultMetafields.techniques;\r\n    // Fallback de zones temporairement d\u00E9sactiv\u00E9 pour auditer les produits dont le m\u00E9tachamp custom.zones est vide.\r\n    // const sourceZones = sourceZonesInput.length ? sourceZonesInput : defaultMetafields.zones;\r\n    const sourceZones = sourceZonesInput;\r\n    this.techniques = window.PersonalizerMetafields.normalizeTechniques(sourceTechniques);\n    this.customizationRules = window.PersonalizerMetafields.normalizeCustomizationRules\n      ? window.PersonalizerMetafields.normalizeCustomizationRules(sourceMetafields.customizationRules)\n      : { maxActiveZones: null, minCustomizationQuantity: null, variantQuantityMode: 'single', splitOption: '' };\n    if (this.isPrintMode()) {\r\n      const hasPrintTechnique = this.techniques.some(function (technique) {\r\n        const key = String((technique && (technique.id || technique.label)) || '').toLowerCase();\r\n        return key.indexOf('impression') >= 0 || key.indexOf('print') >= 0;\r\n      });\r\n      if (!hasPrintTechnique) {\r\n        this.techniques = window.PersonalizerMetafields.normalizeTechniques(defaultMetafields.techniques);\r\n      }\r\n    }\r\n    if (!this.isPrintMode()) {\r\n      this.techniques.sort(function (a, b) {\r\n        const aKey = String((a && (a.id || a.label)) || '').toLowerCase();\r\n        const bKey = String((b && (b.id || b.label)) || '').toLowerCase();\r\n        const aIsFlocage = aKey.indexOf('flocage') >= 0;\r\n        const bIsFlocage = bKey.indexOf('flocage') >= 0;\r\n        if (aIsFlocage && !bIsFlocage) return -1;\r\n        if (!aIsFlocage && bIsFlocage) return 1;\r\n        return 0;\r\n      });\r\n    }\r\n    this.zones = window.PersonalizerMetafields.normalizeZones(sourceZones);\r\n    if (this.isPrintMode()) {\r\n      this.zones = this.getPrintSurfaceZones(this.zones);\r\n    }\r\n    this.mockups = window.PersonalizerMetafields.normalizeMockups(this.config.metafields?.mockups);\r\n    this.printTemplates = this.normalizePrintTemplates(this.config.metafields?.printTemplates);\r\n    if (this.debugEnabled && typeof console !== 'undefined') {\r\n      console.log('[PRINT TEMPLATES RAW]', this.config.metafields?.printTemplates);\r\n      console.log('[PRINT TEMPLATES NORMALIZED]', this.printTemplates);\r\n    }\r\n    this.colors = window.PersonalizerMetafields.getAvailableColors(this.config.metafields?.colors);\r\n    this.mockupAdjustments = window.PersonalizerMetafields.normalizeMockupAdjustments(\r\n      this.config.metafields?.mockupAdjustments\r\n    );\r\n    this.variantColorSwatches = Array.isArray(this.config.variantColorSwatches) ? this.config.variantColorSwatches : [];\r\n    this.debugColorState('init-colors', {\r\n      rawMetafieldColors: this.config && this.config.metafields ? this.config.metafields.colors : null,\r\n      normalizedColors: this.colors,\r\n      variantColorSwatches: this.variantColorSwatches\r\n    });\r\n    // Discount rules are loaded exclusively from the Shopify App Proxy.\r\n    // Fail closed until the proxy has returned an active configuration.\r\n    this.pricingRules = null;\r\n    this.loadAppProxyDiscountConfig();\r\n\r\n    this.selectedTechnique =\r\n      (this.isPrintMode() &&\r\n        this.techniques.find(function (technique) {\r\n          const key = String((technique && (technique.id || technique.label)) || '').toLowerCase();\r\n          return key.indexOf('impression') >= 0 || key.indexOf('print') >= 0;\r\n        })) ||\r\n      (!this.isPrintMode() &&\r\n        this.techniques.find(function (technique) {\r\n          const key = String((technique && (technique.id || technique.label)) || '').toLowerCase();\r\n          return key.indexOf('flocage') >= 0;\r\n        })) ||\r\n      this.techniques[0] ||\r\n      null;\r\n    this.selectedZone = null;\r\n\r\n    const canvasElement = this.modal.querySelector('canvas');\r\n    const width = Number(this.root.dataset.canvasWidth || 900);\r\n    const height = Number(this.root.dataset.canvasHeight || 520);\r\n    const mockupZoom = Number(this.root.dataset.mockupZoom || 1);\r\n    const mockupOffsetXRatio = Number(this.root.dataset.mockupOffsetXRatio || 0);\r\n    const mockupOffsetYRatio = Number(this.root.dataset.mockupOffsetYRatio || 0);\r\n    const mockupFitMode = String(this.root.dataset.mockupFitMode || 'contain');\r\n    const manualZoomMin = Number(this.root.dataset.manualZoomMin || 1);\r\n    const manualZoomMax = Number(this.root.dataset.manualZoomMax || 4);\r\n    this.canvasZoomRangeInput = this.modal.querySelector('[data-canvas-zoom-range]');\r\n    this.canvasZoomResetButton = this.modal.querySelector('[data-canvas-zoom-reset]');\r\n    this.canvasZoomDecreaseButton = this.modal.querySelector('[data-canvas-zoom-decrease]');\r\n    this.canvasZoomIncreaseButton = this.modal.querySelector('[data-canvas-zoom-increase]');\r\n    this.canvasZoomValueNode = this.modal.querySelector('[data-canvas-zoom-value]');\r\n    this.canvasDimensionsToggleButton = this.modal.querySelector('[data-canvas-dimensions-toggle]');\r\n    this.canvasDimensionsPanel = this.modal.querySelector('[data-canvas-dimensions-panel]');\r\n    this.canvasDisclaimer = this.modal.querySelector('.personalizer-canvas-disclaimer');\r\n    this.canvasDisclaimerText = this.modal.querySelector('[data-canvas-disclaimer-text]');\r\n    this.canvasDisclaimerActions = this.modal.querySelector('[data-canvas-disclaimer-actions]');\r\n    this.batPdfButton = this.modal.querySelector('[data-action=\"download-bat-pdf\"]');\r\n    this.batPdfButtons = Array.prototype.slice.call(\r\n      this.modal.querySelectorAll('[data-action=\"open-preview-modal\"], [data-action=\"download-bat-pdf\"]')\r\n    );\r\n    this.batIndividualToggleInput = this.modal.querySelector('[data-bat-individual-toggle]');\r\n    this.previewModal = this.modal.querySelector('[data-preview-modal]');\r\n    this.previewImage = this.modal.querySelector('[data-preview-image]');\r\n    this.previewBatInfoModal = this.modal.querySelector('[data-preview-bat-info-modal]');\r\n    this.zoneInfoModal = this.modal.querySelector('[data-zone-info-modal]');\r\n    if (!this.batPdfButton) this.batPdfButton = this.modal.querySelector('[data-action=\"open-preview-modal\"]');\r\n    this.techniqueConfirmModal = this.modal.querySelector('[data-technique-confirm]');\r\n    this.entryDisclaimerModal = this.modal.querySelector('[data-entry-disclaimer-modal]');\r\n    this.cartSuccessModal = this.modal.querySelector('[data-cart-success-modal]');\r\n    this.abandonConfirmModal = this.ensureAbandonConfirmModal();\n    if (window.OrionAssistance) window.OrionAssistance.setup(this);\n    this.cartEditCloseConfirmModal = this.ensureCartEditCloseConfirmModal();\r\n    this.outOfFrameConfirmModal = this.ensureOutOfFrameConfirmModal();\r\n    this.impressionsSheetPanel = this.modal.querySelector('[data-flyout=\"impressions\"] .personalizer-flyout__panel');\r\n\r\n    this.canvasEngine = new window.PersonalizerCanvas({\r\n      canvasElement: canvasElement,\r\n      containerElement: this.modal.querySelector('.personalizer-canvas'),\r\n      width: width,\r\n      height: height,\r\n      mockupZoom: mockupZoom,\r\n      mockupOffsetXRatio: mockupOffsetXRatio,\r\n      mockupOffsetYRatio: mockupOffsetYRatio,\r\n      mockupFitMode: mockupFitMode,\r\n      useFullBackgroundBounds: false,\r\n      manualZoomMin: manualZoomMin,\r\n      manualZoomMax: manualZoomMax,\r\n      printGuidesEnabled: this.isPrintMode(),\r\n      printGuideWidthCm: this.printDocument ? this.printDocument.workWidthMm / 10 : 8.8,\r\n      printGuideHeightCm: this.printDocument ? this.printDocument.workHeightMm / 10 : 5.8,\r\n      printBleedCm: this.printDocument ? this.printDocument.bleedMm / 10 : 0.5,\r\n      printSafeMarginCm: this.printDocument ? this.printDocument.safeMarginMm / 10 : 0,\r\n      printTrimWidthCm: this.printDocument ? this.printDocument.widthMm / 10 : 0,\r\n      printTrimHeightCm: this.printDocument ? this.printDocument.heightMm / 10 : 0,\r\n      printDocument: this.printDocument,\r\n      colors: this.colors,\r\n      mockups: this.mockups,\r\n      view: this.activeView,\r\n      fallbackUrl: this.config.featuredImage || '',\r\n      onCanvasChange: function (payload) {\r\n        const reason = payload && payload.reason ? String(payload.reason) : '';\r\n        const work = self.resolveCanvasWorkloadByReason(reason);\r\n        self.scheduleCanvasUiWork(work);\r\n      },\r\n      onSelectionChange: function (payload) {\r\n        const kind = payload && payload.kind ? payload.kind : '';\r\n        const object = payload && payload.object ? payload.object : null;\r\n        const reason = payload && payload.reason ? String(payload.reason) : '';\r\n        const objectZoneId = object && object.zoneId ? object.zoneId : '';\r\n        const keepMobileImpressionsOpen =\r\n          self.activeFlyout === 'impressions' &&\r\n          window.matchMedia &&\r\n          window.matchMedia('(max-width: 989px)').matches;\r\n        const isLightweightSelectionUpdate =\r\n          reason === 'text-style-updated' ||\r\n          reason === 'object-centered' ||\r\n          reason === 'object-rotated' ||\r\n          reason === 'text-updated' ||\r\n          reason === 'text-changed';\r\n\r\n        if (!kind && !object && !self.isApplyingPlacement) {\n          self.selectedDesignKind = '';\n          self.selectedDesignObject = null;\n          self.zoneOverlayRequested = false;\n          if (keepMobileImpressionsOpen) {\r\n            self.renderImpressionsUi();\r\n            self.syncDimensionsToolUi();\r\n            return;\r\n          }\r\n          if (self.activeControlsPanel !== 'impressions') {\r\n            self.setControlsPanel('default');\r\n          } else {\r\n            self.renderImpressionsUi();\r\n          }\r\n          self.syncDimensionsToolUi();\r\n          return;\r\n        }\r\n\r\n        self.selectedDesignKind = kind;\n        if (object) {\n          self.selectedDesignObject = object;\n          self.zoneOverlayRequested = true;\n        }\n        // Selection may change while the image panel is already open (first import).\r\n        // setControlsPanel is then skipped, so refresh these controls explicitly.\r\n        self.syncCanvasZoomUi();\r\n\r\n        if (\r\n          (kind === 'placeholder' || (object && object.personalizerPlaceholderId)) &&\r\n          object &&\r\n          reason === 'placeholder-click' &&\r\n          self.isToolAllowedForCurrentView('image') &&\r\n          !self.isApplyingPrintTemplate\r\n        ) {\r\n          self.pendingImagePlaceholder = object;\r\n          const input = self.modal.querySelector('[data-action=\"upload-image\"]');\r\n          if (input) {\r\n            input.value = '';\r\n            input.click();\r\n          }\r\n          self.syncDimensionsToolUi();\r\n          return;\r\n        }\r\n\r\n        if (objectZoneId && !isLightweightSelectionUpdate) {\r\n          const zoneCandidate =\r\n            self.zones.find(function (zone) {\r\n              return zone.id === objectZoneId;\r\n            }) || null;\r\n          if (zoneCandidate) {\r\n            const previousZoneId = self.selectedZone && self.selectedZone.id ? self.selectedZone.id : '';\r\n            self.selectedZone = zoneCandidate;\r\n            if (previousZoneId !== zoneCandidate.id) {\r\n              self.applyActiveZoneToCanvas();\r\n            } else {\r\n              self.renderPositionPresets();\r\n              self.renderPanelPlacementControls();\r\n            }\r\n          }\r\n        }\r\n\r\n        if (keepMobileImpressionsOpen) {\r\n          self.renderImpressionsUi();\r\n          self.syncDimensionsToolUi();\r\n          return;\r\n        }\r\n\r\n        if (isLightweightSelectionUpdate) {\r\n          const isTypingUpdate = reason === 'text-updated' || reason === 'text-changed';\r\n          const shouldSyncDimensionsOnTyping =\r\n            isTypingUpdate &&\r\n            self.isDimensionsVisible === true &&\r\n            typeof self.isDimensionsToolEnabled === 'function' &&\r\n            self.isDimensionsToolEnabled();\r\n          if (!isTypingUpdate || shouldSyncDimensionsOnTyping) {\r\n            self.syncDimensionsToolUi();\r\n          }\r\n          return;\r\n        }\r\n\r\n        if (self.activeControlsPanel === 'impressions') {\r\n          if (kind === 'text') {\r\n            self.setControlsPanel('text');\r\n            self.syncTextPanelInputFromSelection();\r\n            self.syncDimensionsToolUi();\r\n            return;\r\n          }\r\n          if (kind === 'qr') {\r\n            self.setControlsPanel('qr');\r\n            self.syncQrPanelInputFromSelection();\r\n            self.syncDimensionsToolUi();\r\n            return;\r\n          }\r\n          if (kind === 'image') {\r\n            self.setControlsPanel('image');\r\n            self.syncDimensionsToolUi();\r\n            return;\r\n          }\r\n          self.renderImpressionsUi();\r\n          self.syncDimensionsToolUi();\r\n          return;\r\n        }\r\n\r\n        if (kind === 'text') {\r\n          if (self.activeControlsPanel !== 'text') {\r\n            self.setControlsPanel('text');\r\n          }\r\n          self.syncTextPanelInputFromSelection();\r\n          self.syncDimensionsToolUi();\r\n          return;\r\n        }\r\n        if (kind === 'qr') {\r\n          if (self.activeControlsPanel !== 'qr') {\r\n            self.setControlsPanel('qr');\r\n          }\r\n          self.syncQrPanelInputFromSelection();\r\n          self.syncDimensionsToolUi();\r\n          return;\r\n        }\r\n        if (kind === 'image') {\r\n          if (self.activeControlsPanel !== 'image') {\r\n            self.setControlsPanel('image');\r\n          }\r\n        }\r\n        self.renderImpressionsSummary();\r\n        self.renderImpressionsUi();\r\n        self.syncDimensionsToolUi();\r\n      }\r\n    });\r\n\r\n    this.canvasEngine.init();\r\n    if (this.isPrintMode() && typeof this.canvasEngine.applyPrintSystemElements === 'function') {\r\n      const systemCount = this.canvasEngine.applyPrintSystemElements();\r\n      this.syncPrintStyleValuesToCanvas();\r\n      if (this.debugEnabled && typeof console !== 'undefined') console.log('[Print] system elements:', systemCount);\r\n    }\r\n    if (this.canvasZoomRangeInput && typeof this.canvasEngine.getManualZoom === 'function') {\r\n      this.canvasZoomRangeInput.min = String(manualZoomMin);\r\n      this.canvasZoomRangeInput.max = String(manualZoomMax);\r\n      const currentZoom = this.canvasEngine.getManualZoom();\r\n      this.canvasZoomRangeInput.value = String(currentZoom);\r\n      this.syncCanvasZoomValue(currentZoom);\r\n    }\r\n\r\n    this.syncFromProductState();\r\n    this.renderTechniques();\r\n    this.renderPositionPresets();\r\n    this.renderPrintTemplates();\r\n    this.applyActiveZoneToCanvas();\r\n    this.renderColors();\r\n    this.renderViewSwitchers();\r\n    this.setControlsPanel('default');\r\n    this.updatePrice();\r\n    this.renderImpressionsSummary();\r\n    this.renderImpressionsUi();\r\n    this.syncCanvasZoomUi();\r\n    this.syncDimensionsToolUi();\r\n    this.syncBatPdfToolUi();\r\n    this.bindEvents();\r\n    this.bindTierTooltipPositioning();\r\n    this.bindFixedQuantityProductSelector();\r\n    this.renderFixedQuantityProductPricing();\r\n    this.bindImpressionsSheetSwipeClose();\r\n    this.bindMobileViewportKeyboardAware();\r\n    if (this.isPrintMode()) this.loadPrintOptions();\r\n    this.restoreCartEditSessionIfNeeded();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isDebugEnabled = function () {\r\n    try {\r\n      if (typeof window === 'undefined') return false;\r\n      const query = new URLSearchParams(window.location.search || '');\r\n      if (query.get('personalizerDebug') === '1') return true;\r\n      if (window.localStorage && window.localStorage.getItem('orion_personalizer_debug') === '1') return true;\r\n    } catch (_error) {\r\n      return false;\r\n    }\r\n    return false;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isPrintMode = function () {\r\n    const mode = String(this.personalizerMode || '').trim().toLowerCase();\r\n    return mode === 'print' || mode === 'impression';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.bindTierTooltipPositioning = function () {\r\n    if (!this.modal || this.tierTooltipPositioningBound) return;\r\n    this.tierTooltipPositioningBound = true;\r\n\r\n    var floatingPanel = null;\n    var activeTrigger = null;\n\n    var hideTooltip = function () {\n      if (floatingPanel) floatingPanel.remove();\n      if (activeTrigger) activeTrigger.setAttribute('aria-expanded', 'false');\n      floatingPanel = null;\n      activeTrigger = null;\n    };\n\r\n    var showTooltip = function (tooltip) {\r\n      if (!tooltip) return;\r\n      var trigger = tooltip.querySelector('.personalizer-tier-tooltip__trigger');\r\n      var panel = tooltip.querySelector('.personalizer-tier-tooltip__panel');\r\n      if (!trigger || !panel) return;\r\n\r\n      hideTooltip();\n      activeTrigger = trigger;\n      activeTrigger.setAttribute('aria-expanded', 'true');\n      floatingPanel = panel.cloneNode(true);\n      floatingPanel.removeAttribute('id');\n      floatingPanel.setAttribute('role', 'dialog');\n      floatingPanel.setAttribute('aria-modal', 'false');\n      floatingPanel.classList.add('is-floating');\n      document.body.appendChild(floatingPanel);\n\r\n      var triggerRect = trigger.getBoundingClientRect();\r\n      var viewportWidth = window.visualViewport\r\n        ? window.visualViewport.width\r\n        : (window.innerWidth || document.documentElement.clientWidth);\r\n      var viewportHeight = window.visualViewport\r\n        ? window.visualViewport.height\r\n        : (window.innerHeight || document.documentElement.clientHeight);\r\n      var gap = 10;\r\n      var viewportMargin = 12;\r\n      var spaceAbove = Math.max(0, triggerRect.top - gap - viewportMargin);\n      var spaceBelow = Math.max(0, viewportHeight - triggerRect.bottom - gap - viewportMargin);\n      var availableHeight = Math.max(spaceAbove, spaceBelow);\n      var panelWidth = Math.min(floatingPanel.offsetWidth || 520, viewportWidth - (viewportMargin * 2));\n      var panelHeight = Math.min(floatingPanel.scrollHeight || 0, 640, availableHeight);\n      var panelLeft = Math.min(\r\n        viewportWidth - viewportMargin - panelWidth,\r\n        Math.max(viewportMargin, triggerRect.right - panelWidth)\r\n      );\r\n      var openAbove = spaceAbove >= spaceBelow;\n      var panelTop = openAbove\n        ? Math.max(viewportMargin, triggerRect.top - gap - panelHeight)\n        : Math.min(viewportHeight - viewportMargin - panelHeight, triggerRect.bottom + gap);\n\n      floatingPanel.style.setProperty(\n        '--personalizer-tier-max-height',\n        Math.max(120, Math.floor(availableHeight)) + 'px'\n      );\r\n      floatingPanel.style.setProperty('--personalizer-tier-left', Math.floor(panelLeft) + 'px');\r\n      floatingPanel.style.setProperty('--personalizer-tier-top', Math.floor(panelTop) + 'px');\r\n    };\r\n\r\n    this.modal.addEventListener('click', function (event) {\n      var trigger = event.target && event.target.closest && event.target.closest('.personalizer-tier-tooltip__trigger');\n      if (!trigger) return;\n      event.preventDefault();\n      event.stopPropagation();\n      if (activeTrigger === trigger && floatingPanel) {\n        hideTooltip();\n        return;\n      }\n      showTooltip(trigger.closest('.personalizer-tier-tooltip'));\n    });\n    document.addEventListener('click', function (event) {\n      if (!floatingPanel) return;\n      if (floatingPanel.contains(event.target) || (activeTrigger && activeTrigger.contains(event.target))) return;\n      hideTooltip();\n    });\n    document.addEventListener('keydown', function (event) {\n      if (event.key !== 'Escape' || !floatingPanel) return;\n      var trigger = activeTrigger;\n      hideTooltip();\n      if (trigger) trigger.focus();\n    });\n    window.addEventListener('resize', hideTooltip);\n    window.addEventListener('scroll', function (event) {\n      if (floatingPanel && floatingPanel.contains(event.target)) return;\n      hideTooltip();\n    }, true);\n    if (window.visualViewport) window.visualViewport.addEventListener('resize', hideTooltip);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizePrintConfig = function (input) {\r\n    if (!this.isPrintMode() || !input) return null;\r\n    let config = input;\r\n    if (typeof config === 'string') {\r\n      try { config = JSON.parse(config); } catch (error) {\r\n        console.error('[Personalizer Print] custom.print_config contient un JSON invalide.', error);\r\n        return null;\r\n      }\r\n    }\r\n    if (!config || typeof config !== 'object') return null;\r\n    return config;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizeOptionName = function (value) {\r\n    return String(value || '')\r\n      .replace(/\\u00a0/g, ' ')\r\n      .trim()\r\n      .toLocaleLowerCase('fr-FR')\r\n      .replace(/-\\d+$/, '')\r\n      .replace(/\\s+/g, ' ')\r\n      .trim();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizeOptionValue = function (value) {\r\n    return String(value || '')\r\n      .replace(/\\u00a0/g, ' ')\r\n      .trim()\r\n      .toLocaleLowerCase('fr-FR')\r\n      .replace(/\\s*[x\u00D7]\\s*/g, ' \u00D7 ')\r\n      .replace(/\\s+/g, ' ')\r\n      .trim();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.findNormalizedConfigEntry = function (entries, selectedValue) {\r\n    if (!entries || typeof entries !== 'object' || !selectedValue) return null;\r\n    if (Object.prototype.hasOwnProperty.call(entries, selectedValue)) {\r\n      return { key: selectedValue, config: entries[selectedValue] };\r\n    }\r\n    const wanted = this.normalizeOptionValue(selectedValue);\r\n    const keys = Object.keys(entries);\r\n    for (let index = 0; index < keys.length; index += 1) {\r\n      const key = keys[index];\r\n      if (this.normalizeOptionValue(key) === wanted) {\r\n        return { key: key, config: entries[key] };\r\n      }\r\n    }\r\n    return null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.findConfiguredFormat = function (formats, selectedValue) {\r\n    return this.findNormalizedConfigEntry(formats, selectedValue);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getOptionIndexByName = function (optionName) {\r\n    const wanted = this.normalizeOptionName(optionName);\r\n    if (!wanted) return -1;\r\n    return (Array.isArray(this.config.options) ? this.config.options : []).findIndex(\r\n      function (name) { return this.normalizeOptionName(name) === wanted; }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getVariantOptionValue = function (variant, optionName) {\r\n    const index = this.getOptionIndexByName(optionName);\r\n    if (index < 0 || !variant || !Array.isArray(variant.options)) return '';\r\n    return String(variant.options[index] || '').trim();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSelectedOptionValue = function (optionName) {\r\n    return this.getVariantOptionValue(this.currentVariant, optionName);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPrintFacesCount = function () {\r\n    return this.printDocument ? Math.max(1, Math.floor(Number(this.printDocument.faces) || 1)) : 1;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.resolveSidesConfig = function (sidesValue) {\r\n    const sides = this.printConfig && this.printConfig.sides && typeof this.printConfig.sides === 'object'\r\n      ? this.printConfig.sides\r\n      : {};\r\n    const configuredOptionName = this.printConfig && this.printConfig.variant_options\r\n      ? this.printConfig.variant_options.sides\r\n      : '';\r\n    const selectedValue = configuredOptionName ? sidesValue : '';\r\n    let resolved = selectedValue ? this.findNormalizedConfigEntry(sides, selectedValue) : null;\r\n    const keys = Object.keys(sides);\r\n    if (!resolved && !configuredOptionName && keys.length === 1) {\r\n      resolved = { key: keys[0], config: sides[keys[0]] };\r\n    }\r\n    return resolved;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.resolveViews = function (sidesConfig) {\r\n    const config = sidesConfig && typeof sidesConfig === 'object' ? sidesConfig : {};\r\n    const faces = Math.max(1, Math.floor(Number(config.faces) || 1));\r\n    const defaultTools = { image: true, qr: true, text: true, background: true, template: true };\r\n    const seenViewIds = {};\r\n    const seenZoneIds = {};\r\n    const configuredViews = Array.isArray(config.views)\r\n      ? config.views.map(function (view, index) {\r\n          if (!view || typeof view !== 'object') return null;\r\n          const rawId = String(view.id || view.view || '').trim();\r\n          const id = rawId ? normalizeViewId(rawId) : '';\r\n          if (!id || seenViewIds[id]) {\r\n            if (this.debugEnabled && typeof console !== 'undefined') console.warn('[Print] invalid or duplicate view id:', id);\r\n            return null;\r\n          }\r\n          seenViewIds[id] = true;\r\n          const hasExtendedContract =\r\n            Object.prototype.hasOwnProperty.call(view, 'tools') ||\r\n            Object.prototype.hasOwnProperty.call(view, 'zones') ||\r\n            Object.prototype.hasOwnProperty.call(view, 'base_elements') ||\r\n            Object.prototype.hasOwnProperty.call(view, 'style_options') ||\r\n            Object.prototype.hasOwnProperty.call(view, 'pages') ||\r\n            String(view.type || '').toLowerCase() === 'spread';\r\n          const tools = Object.assign({}, defaultTools);\r\n          if (view.tools && typeof view.tools === 'object') {\r\n            Object.keys(defaultTools).forEach(function (tool) {\r\n              if (typeof view.tools[tool] === 'boolean') tools[tool] = view.tools[tool];\r\n              else if (view.tools[tool] !== undefined && this.debugEnabled && typeof console !== 'undefined') {\r\n                console.warn('[Print] invalid tool flag:', id, tool, view.tools[tool]);\r\n              }\r\n            }, this);\r\n          }\r\n          const zones = Array.isArray(view.zones) ? view.zones.map(function (zone, zoneIndex) {\r\n            if (!zone || typeof zone !== 'object') return null;\r\n            const zoneId = String(zone.id || '').trim();\r\n            const x = Math.max(0, Math.min(100, Number(zone.x ?? zone.xPercent) || 0));\r\n            const y = Math.max(0, Math.min(100, Number(zone.y ?? zone.yPercent) || 0));\r\n            const width = Math.max(0, Math.min(100 - x, Number(zone.width ?? zone.widthPercent) || 0));\r\n            const height = Math.max(0, Math.min(100 - y, Number(zone.height ?? zone.heightPercent) || 0));\r\n            if (!zoneId || seenZoneIds[zoneId] || !(width > 0) || !(height > 0)) {\r\n              if (this.debugEnabled && typeof console !== 'undefined') console.warn('[Print] invalid or duplicate zone:', id, zoneIndex, zone);\r\n              return null;\r\n            }\r\n            seenZoneIds[zoneId] = true;\r\n            return {\r\n              id: zoneId,\r\n              label: String(zone.label || zoneId),\r\n              xPercent: x,\r\n              yPercent: y,\r\n              widthPercent: width,\r\n              heightPercent: height,\r\n              strict: zone.strict === true,\r\n              fullCanvas: x === 0 && y === 0 && width === 100 && height === 100\r\n            };\r\n          }, this).filter(Boolean) : [];\r\n          const zonesConfigured = Array.isArray(view.zones);\r\n          const styleOptions = {};\r\n          const rawStyleOptions = view.style_options && typeof view.style_options === 'object' && !Array.isArray(view.style_options)\r\n            ? view.style_options\r\n            : {};\r\n          Object.keys(rawStyleOptions).forEach(function (optionKey) {\r\n            const rawOption = rawStyleOptions[optionKey];\r\n            const key = String(optionKey || '').trim();\r\n            if (!key || !rawOption || typeof rawOption !== 'object' || String(rawOption.type || '').toLowerCase() !== 'select') {\r\n              if (this.debugEnabled && typeof console !== 'undefined') console.warn('[Print] invalid style option:', id, optionKey, rawOption);\r\n              return;\r\n            }\r\n            const seenChoiceValues = {};\r\n            const choices = Array.isArray(rawOption.choices) ? rawOption.choices.map(function (choice) {\r\n              if (!choice || typeof choice !== 'object') return null;\r\n              const value = String(choice.value ?? '').trim();\r\n              const color = this.normalizeHexColor(choice.color || '');\r\n              if (!value || seenChoiceValues[value] || !color) return null;\r\n              seenChoiceValues[value] = true;\r\n              return { value: value, label: String(choice.label || value).trim() || value, color: color };\r\n            }, this).filter(Boolean) : [];\r\n            if (!choices.length) {\r\n              if (this.debugEnabled && typeof console !== 'undefined') console.warn('[Print] style option without valid choices:', id, key);\r\n              return;\r\n            }\r\n            const requestedDefault = String(rawOption.default ?? '').trim();\r\n            styleOptions[key] = {\r\n              id: key,\r\n              label: String(rawOption.label || key).trim() || key,\r\n              type: 'select',\r\n              default: choices.some(function (choice) { return choice.value === requestedDefault; })\r\n                ? requestedDefault\r\n                : choices[0].value,\r\n              choices: choices\r\n            };\r\n          }, this);\r\n          const baseElements = Array.isArray(view.base_elements)\r\n            ? view.base_elements.filter(function (element, elementIndex) {\r\n                const type = String(element && element.type || '').toLowerCase().replace(/_/g, '-');\r\n                const valid = element && typeof element === 'object' && ['shape', 'rect', 'rectangle', 'line', 'text'].indexOf(type) >= 0;\r\n                if (!valid && this.debugEnabled && typeof console !== 'undefined') {\r\n                  console.warn('[Print] invalid base element:', id, elementIndex, element);\r\n                }\r\n                return !!valid;\r\n              }, this).map(function (element) {\r\n                const normalized = Object.assign({}, element);\r\n                const binding = element.styleBinding;\r\n                const normalizedBinding = {};\r\n                if (binding && typeof binding === 'object' && !Array.isArray(binding)) {\r\n                  ['color', 'fill', 'stroke'].forEach(function (property) {\r\n                    const optionId = String(binding[property] || '').trim();\r\n                    if (optionId && styleOptions[optionId]) normalizedBinding[property] = optionId;\r\n                  });\r\n                }\r\n                if (Object.keys(normalizedBinding).length) normalized.styleBinding = normalizedBinding;\r\n                else delete normalized.styleBinding;\r\n                return normalized;\r\n              })\r\n            : [];\r\n          const requestedViewType = String(view.type || 'page').trim().toLowerCase() === 'spread' ? 'spread' : 'page';\r\n          const spreadPages = requestedViewType === 'spread' && Array.isArray(view.pages)\r\n            ? this.resolveViews({\r\n                faces: view.pages.length,\r\n                views: view.pages.map(function (page, pageIndex) {\r\n                  const inherited = Object.assign({}, page);\r\n                  if (!Object.prototype.hasOwnProperty.call(inherited, 'style_options') && view.style_options) {\r\n                    inherited.style_options = view.style_options;\r\n                  }\r\n                  inherited.position = String(page.position || (pageIndex === 0 ? 'left' : 'right')).toLowerCase();\r\n                  return inherited;\r\n                })\r\n              }).slice(0, 2).map(function (page, pageIndex) {\r\n                page.position = String(view.pages[pageIndex] && view.pages[pageIndex].position || (pageIndex === 0 ? 'left' : 'right')).toLowerCase();\r\n                page.parentViewId = id;\r\n                page.styleStateId = id;\r\n                return page;\r\n              })\r\n            : [];\r\n          if (spreadPages.length === 2) {\r\n            const positions = spreadPages.map(function (page) { return String(page.position || '').toLowerCase(); });\r\n            if (positions.indexOf('left') < 0 || positions.indexOf('right') < 0 || positions[0] === positions[1]) {\r\n              spreadPages[0].position = 'left';\r\n              spreadPages[1].position = 'right';\r\n            }\r\n          }\r\n          const viewType = requestedViewType === 'spread' && spreadPages.length === 2 ? 'spread' : 'page';\r\n          if (requestedViewType === 'spread' && viewType !== 'spread' && this.debugEnabled && typeof console !== 'undefined') {\r\n            console.warn('[Print] spread requires exactly two valid pages:', id, view.pages);\r\n          }\r\n          const resolvedTools = viewType === 'spread' && spreadPages.length\r\n            ? spreadPages.reduce(function (result, page) {\r\n                Object.keys(defaultTools).forEach(function (tool) {\r\n                  result[tool] = result[tool] || page.tools[tool] !== false;\r\n                });\r\n                return result;\r\n              }, { image: false, qr: false, text: false, background: false, template: false })\r\n            : tools;\r\n          return {\r\n            id: id,\r\n            label: String(view.label || view.name || id).trim() || id,\r\n            type: viewType,\r\n            pages: spreadPages,\r\n            tools: resolvedTools,\r\n            zones: viewType === 'spread' ? [] : zones,\r\n            zonesConfigured: viewType === 'spread' ? false : zonesConfigured,\r\n            baseElements: viewType === 'spread' ? [] : baseElements,\r\n            styleOptions: styleOptions,\r\n            extended: hasExtendedContract\r\n          };\r\n        }, this).filter(Boolean)\r\n      : [];\r\n    if (configuredViews.length) {\r\n      const physicalViewCount = configuredViews.reduce(function (count, view) {\r\n        return count + (view && view.type === 'spread' && Array.isArray(view.pages) ? view.pages.length : 1);\r\n      }, 0);\r\n      if (physicalViewCount !== faces && typeof console !== 'undefined') {\r\n        console.warn('[Print] sides config mismatch: faces=%s physicalViews=%s', faces, physicalViewCount);\r\n      }\r\n      return configuredViews;\r\n    }\r\n    const legacyViews = [{ id: 'front', label: 'Recto', tools: Object.assign({}, defaultTools), zones: [], baseElements: [], styleOptions: {}, extended: false }];\r\n    if (faces >= 2) legacyViews.push({ id: 'back', label: 'Verso', tools: Object.assign({}, defaultTools), zones: [], baseElements: [], styleOptions: {}, extended: false });\r\n    for (let index = 2; index < faces; index += 1) {\r\n      legacyViews.push({ id: 'view_' + (index + 1), label: 'Vue ' + (index + 1), tools: Object.assign({}, defaultTools), zones: [], baseElements: [], styleOptions: {}, extended: false });\r\n    }\r\n    return legacyViews;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getAllowedFormatsFromTypeRule = function (rule) {\r\n    if (!rule || typeof rule !== 'object') return [];\r\n    const configured = rule.allowed_formats ?? rule.valid_formats ?? rule.formats ?? rule.format;\r\n    if (Array.isArray(configured)) return configured.map(String);\r\n    if (typeof configured === 'string') return [configured];\r\n    if (configured && typeof configured === 'object') return Object.keys(configured);\r\n    return [];\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isFormatAllowedForType = function (formatValue, typeValue) {\r\n    const rules = this.printConfig && this.printConfig.type_rules;\r\n    if (!rules || typeof rules !== 'object' || !typeValue) return true;\r\n    const resolvedRule = this.findNormalizedConfigEntry(rules, typeValue);\r\n    if (!resolvedRule || !resolvedRule.config) return false;\r\n    const allowedFormats = this.getAllowedFormatsFromTypeRule(resolvedRule.config);\r\n    if (!allowedFormats.length) return true;\r\n    const wantedFormat = this.normalizeOptionValue(formatValue);\r\n    return allowedFormats.some(\r\n      function (allowedFormat) {\r\n        return this.normalizeOptionValue(allowedFormat) === wantedFormat;\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildPrintDocument = function (formatValue, sidesValue, typeValue) {\r\n    if (!this.printConfig) return null;\r\n    const formats = this.printConfig.formats && typeof this.printConfig.formats === 'object'\r\n      ? this.printConfig.formats\r\n      : {};\r\n    const resolvedFormat = this.findConfiguredFormat(formats, formatValue);\r\n    if (!resolvedFormat || !resolvedFormat.config) return null;\r\n    if (!this.isFormatAllowedForType(resolvedFormat.key, typeValue)) return null;\r\n    const format = resolvedFormat.config;\r\n    const widthMm = Number(format.width_mm);\r\n    const heightMm = Number(format.height_mm);\r\n    if (!(widthMm > 0) || !(heightMm > 0)) return null;\r\n    const bleedMm = Math.max(0, Number(format.bleed_mm) || 0);\r\n    const safeMarginMm = Math.max(0, Number(format.safe_margin_mm) || 0);\r\n    const resolvedSides = this.resolveSidesConfig(sidesValue);\r\n    const sidesConfig = resolvedSides && resolvedSides.config;\r\n    const views = this.resolveViews(sidesConfig);\r\n    const physicalViews = views.reduce(function (result, view) {\r\n      if (view && view.type === 'spread') return result.concat(Array.isArray(view.pages) ? view.pages : []);\r\n      result.push(view);\r\n      return result;\r\n    }, []);\r\n    const canvasConfig = this.printConfig.canvas && typeof this.printConfig.canvas === 'object'\r\n      ? this.printConfig.canvas\r\n      : {};\r\n    return {\r\n      format: resolvedFormat.key,\r\n      widthMm: widthMm,\r\n      heightMm: heightMm,\r\n      bleedMm: bleedMm,\r\n      safeMarginMm: safeMarginMm,\r\n      workWidthMm: widthMm + bleedMm * 2,\r\n      workHeightMm: heightMm + bleedMm * 2,\r\n      orientation: String(format.orientation || (widthMm > heightMm ? 'landscape' : 'portrait')),\r\n      sides: resolvedSides ? resolvedSides.key : '',\r\n      faces: sidesConfig ? Math.max(1, Math.floor(Number(sidesConfig.faces) || views.length || 1)) : 1,\r\n      views: views,\r\n      physicalViews: physicalViews,\r\n      extendedViews: views.some(function (view) { return view.extended === true; }),\r\n      background: String(canvasConfig.background || '#ffffff'),\r\n      showBleed: canvasConfig.show_bleed !== false,\r\n      showTrim: canvasConfig.show_trim !== false,\r\n      showSafeMargin: canvasConfig.show_safe_margin !== false,\r\n      exportGuides: canvasConfig.export_guides === true,\r\n      exportDpi: Math.max(1, Number(canvasConfig.export_dpi) || 300)\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.refreshPrintConfigurationFromVariant = function (options) {\r\n    if (!this.isPrintMode() || !this.printConfig) return false;\r\n    const settings = options || {};\r\n    const previousActiveViewId = normalizeViewId(this.activeView);\r\n    const names = this.printConfig.variant_options || {};\r\n    const nextSelection = {\r\n      format: this.getSelectedOptionValue(names.format),\r\n      paper: this.getSelectedOptionValue(names.paper),\r\n      sides: this.getSelectedOptionValue(names.sides),\r\n      type: this.getSelectedOptionValue(names.type)\r\n    };\r\n    const previousDocument = this.printDocument;\r\n    const previousViews = previousDocument && Array.isArray(previousDocument.physicalViews)\r\n      ? previousDocument.physicalViews\r\n      : previousDocument && Array.isArray(previousDocument.views) ? previousDocument.views : [];\r\n    this.printSelection = nextSelection;\r\n    this.printDocument = this.buildPrintDocument(nextSelection.format, nextSelection.sides, nextSelection.type);\r\n    this.ensurePrintStyleValues();\r\n\r\n    if (this.debugEnabled && typeof console !== 'undefined') {\r\n      console.log('[PRINT] configured format option:', names.format || '');\r\n      console.log('[PRINT] Shopify selected options:', this.currentVariant && this.currentVariant.options || []);\r\n      console.log('[PRINT] resolved selected format:', nextSelection.format || '');\r\n      console.log('[PRINT] resolved selected type:', nextSelection.type || '');\r\n      console.log('[PRINT] configured format keys:', Object.keys(this.printConfig.formats || {}));\r\n    }\r\n\r\n    if (!this.printDocument) {\r\n      if (!settings.initialize) {\r\n        console.error('[Personalizer Print] Format absent de custom.print_config :', nextSelection.format || '(vide)');\r\n      }\r\n      return false;\r\n    }\r\n\r\n    this.zones = this.getPrintSurfaceZones(this.zones);\r\n    this.selectedZone = this.zones.find(\r\n      function (zone) { return String(zone.view || 'front') === String(this.activeView || 'front'); }.bind(this)\r\n    ) || this.zones[0] || null;\r\n    if (this.canvasEngine && typeof this.canvasEngine.setPrintDocumentConfig === 'function') {\r\n      this.canvasEngine.setPrintDocumentConfig(this.printDocument);\r\n      if (typeof this.canvasEngine.removeDesignObjectsForView === 'function') {\r\n        const nextViewIds = (this.printDocument.physicalViews || this.printDocument.views).map(function (view) { return view.id; });\r\n        previousViews.forEach(function (view) {\r\n          if (nextViewIds.indexOf(view.id) < 0) this.canvasEngine.removeDesignObjectsForView(view.id);\r\n        }, this);\r\n      }\r\n      if (typeof this.canvasEngine.applyPrintSystemElements === 'function') {\r\n        this.canvasEngine.applyPrintSystemElements();\r\n      }\r\n      this.syncPrintStyleValuesToCanvas();\r\n    }\r\n    const resolvedViewIds = this.printDocument.views.map(function (view) { return view.id; });\r\n    const restoredNavigationViewId = this.getNavigationViewForPhysicalView(previousActiveViewId);\r\n    this.activeView = resolvedViewIds.indexOf(restoredNavigationViewId) >= 0\r\n      ? restoredNavigationViewId\r\n      : resolvedViewIds[0] || 'front';\r\n    if (this.debugEnabled && typeof console !== 'undefined') {\r\n      console.log('[Print] variant_options:', this.printConfig.variant_options);\r\n      console.log('[Print] sides:', this.printConfig.sides);\r\n      console.log('[Print] selected sides option:', nextSelection.sides || undefined);\r\n      console.log('[Print] resolved sides config:', this.resolveSidesConfig(nextSelection.sides)?.config);\r\n      console.log('[Print] faces:', this.printDocument.faces);\r\n      console.log('[Print] resolved views:', this.printDocument.views);\r\n      console.log('[Print] resolved zones:', this.zones);\r\n      console.log('[Print] system elements:', (this.printDocument.physicalViews || this.printDocument.views).reduce(function (items, view) {\r\n        return items.concat(Array.isArray(view.baseElements) ? view.baseElements : []);\r\n      }, []));\r\n      console.log('[Print] current view:', this.activeView);\r\n    }\r\n    if (this.rawPrintOptions.length) this.applyFinishingRulesToPrintOptions();\r\n    if (this.modal && this.canvasEngine) this.renderViewSwitchers();\r\n    if (this.modal) this.renderPrintTemplates();\r\n    return true;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.canOpenConfiguredPrintCanvas = function () {\r\n    if (!this.isPrintMode() || !this.printConfig) return true;\r\n    if (this.printDocument) return true;\r\n    const formatName = this.printSelection && this.printSelection.format ? this.printSelection.format : '';\r\n    console.error('[Personalizer Print] Format non configur\u00E9 :', formatName || '(vide)');\r\n    window.alert(\"Ce format n'est pas encore configur\u00E9 pour la personnalisation.\");\r\n    return false;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFixedQuantityProductPricing = function (quantity) {\r\n    const qty = Math.max(1, Math.floor(Number(quantity) || 1));\r\n    const variantId = String(\r\n      (this.currentVariant && this.currentVariant.id) ||\r\n      this.getReferenceProductPricingVariantId() ||\r\n      this.config.selectedVariantId || ''\r\n    );\r\n    const previousQuantities = this.sizeQuantities;\r\n    const previousCurrentQuantity = this.currentQuantity;\r\n    this.sizeQuantities = variantId ? { [variantId]: qty } : {};\r\n    this.currentQuantity = qty;\r\n    try {\r\n      const pricing = this.getProductPricingSummary();\r\n      const totalBaseCents = Math.max(0, Math.round(Number(pricing.totalBaseCents) || 0));\r\n      const totalFinalCents = Math.max(0, Math.round(Number(pricing.totalFinalCents) || 0));\r\n      return {\r\n        quantity: qty,\r\n        totalBaseCents: totalBaseCents,\r\n        totalCents: totalFinalCents,\r\n        unitBaseCents: Math.max(0, Math.round(totalBaseCents / qty)),\r\n        unitCents: Math.max(0, Math.round(totalFinalCents / qty)),\r\n        discountPercent: Math.max(0, Number(pricing.currentDiscountPercent) || 0),\n        hasDiscount: totalBaseCents > totalFinalCents\r\n      };\r\n    } finally {\r\n      this.sizeQuantities = previousQuantities;\r\n      this.currentQuantity = previousCurrentQuantity;\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderFixedQuantityProductPricing = function () {\r\n    if (!this.config.hasFixedQuantity || !window.PersonalizerPricing) return;\r\n    const select = document.querySelector('[data-fixed-quantity-select]');\r\n    if (!select) return;\r\n\r\n    Array.prototype.forEach.call(select.options || [],\r\n      function (option) {\r\n        const qty = Math.max(1, Math.floor(Number(option.value) || 1));\r\n        const pricing = this.getFixedQuantityProductPricing(qty);\r\n        const quantityLabel = Number(qty).toLocaleString('fr-FR');\r\n        const unitFinal = window.PersonalizerPricing.formatMoney(pricing.unitCents, this.config.currencyCode);\r\n        option.textContent = quantityLabel + ' \u2014 ' + unitFinal + ' HT / unit\u00E9';\r\n      }.bind(this)\r\n    );\r\n\r\n    const selectedPricing = this.getFixedQuantityProductPricing(select.value);\r\n    const priceRoot = document.querySelector('.product__info-container [id^=\"price-\"] .price');\r\n    if (!priceRoot) return;\r\n    const totalBase = window.PersonalizerPricing.formatMoney(selectedPricing.totalBaseCents, this.config.currencyCode);\r\n    const totalFinal = window.PersonalizerPricing.formatMoney(selectedPricing.totalCents, this.config.currencyCode);\r\n    const unitFinal = window.PersonalizerPricing.formatMoney(selectedPricing.unitCents, this.config.currencyCode);\r\n    const previousTotal = selectedPricing.hasDiscount ? '<s class=\"orion-fixed-price__previous\">' + this.escapeHtml(totalBase) + '</s>' : '';\r\n    const badge = selectedPricing.hasDiscount ? '<span class=\"orion-fixed-price__badge\">-' + selectedPricing.discountPercent + ' %</span>' : '';\r\n    const quantityLabel = Number(selectedPricing.quantity).toLocaleString('fr-FR');\r\n    priceRoot.innerHTML =\r\n      '<div class=\"orion-fixed-price\" data-fixed-quantity-price-summary>' +\r\n        '<div class=\"orion-fixed-price__row orion-fixed-price__row--total\"><span class=\"orion-fixed-price__values\">' +\r\n          previousTotal + '<strong class=\"orion-product-price-value\" data-fixed-quantity-main-price>' + this.escapeHtml(totalFinal) + ' HT</strong>' + badge +\r\n        '</span></div>' +\r\n        '<div class=\"orion-fixed-price__row\"><span class=\"orion-fixed-price__values\">' +\r\n          '<strong data-orion-fixed-unit-price data-orion-price-ht-cents=\"' + selectedPricing.unitCents + '\" data-orion-currency=\"EUR\" data-orion-price-suffix=\" l\u2019unit\u00E9 / ' + quantityLabel + ' unit\u00E9s\">' + this.escapeHtml(unitFinal) + ' HT l\u2019unit\u00E9 / ' + quantityLabel + ' unit\u00E9s</strong>' +\r\n        '</span></div>' +\r\n      '</div>';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.bindFixedQuantityProductSelector = function () {\r\n    if (!this.config.hasFixedQuantity) return;\r\n    const select = document.querySelector('[data-fixed-quantity-select]');\r\n    if (!select || select.dataset.personalizerBound === 'true') return;\r\n    select.dataset.personalizerBound = 'true';\r\n    const priceWrapper = document.querySelector('.product__info-container [id^=\"price-\"]');\r\n    if (priceWrapper && !priceWrapper.__orionFixedQuantityObserver) {\r\n      priceWrapper.__orionFixedQuantityObserver = new MutationObserver(\r\n        function () {\r\n          if (priceWrapper.querySelector('[data-fixed-quantity-main-price]')) return;\r\n          window.requestAnimationFrame(this.renderFixedQuantityProductPricing.bind(this));\r\n        }.bind(this)\r\n      );\r\n      priceWrapper.__orionFixedQuantityObserver.observe(priceWrapper, { childList: true, subtree: true });\r\n    }\r\n    select.addEventListener('change',\r\n      function () {\r\n        this.currentQuantity = Math.max(1, Math.floor(Number(select.value) || 1));\r\n        if (this.currentVariant && this.currentVariant.id) {\r\n          this.sizeQuantities = { [String(this.currentVariant.id)]: this.currentQuantity };\r\n        }\r\n        this.renderFixedQuantityProductPricing();\r\n        this.renderSizesUi();\r\n        this.updatePrice();\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.printOptionsDebug = function (message, payload) {\r\n    if (!this.debugEnabled || typeof console === 'undefined') return;\r\n    console.info('[Personalizer Print Options] ' + message, payload || '');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPrintOptionKey = function (option) {\r\n    return String(option && option.optionProductHandle || '') + '::' + String(option && option.optionVariantSku || '');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.loadAppProxyDiscountConfig = function () {\r\n    if (!window.OrionDiscountConfig || typeof window.OrionDiscountConfig.load !== 'function') {\r\n      this.storefrontDiscountConfig = null;\r\n      this.pricingRules = null;\r\n      return Promise.resolve(null);\r\n    }\r\n    return window.OrionDiscountConfig.load().then(function (config) {\r\n      if (!config || config.ok !== true) {\r\n        this.storefrontDiscountConfig = null;\r\n        this.pricingRules = null;\r\n        return null;\r\n      }\r\n      this.storefrontDiscountConfig = config;\r\n      const productConfig = window.OrionDiscountConfig.resolveProduct(config, {\r\n        id: this.config.productId,\r\n        handle: this.config.productHandle\r\n      });\r\n      this.pricingRules = productConfig && Array.isArray(productConfig.tiers)\r\n        ? { quantity_discounts: productConfig.tiers }\r\n        : null;\r\n      this.updatePrice();\r\n      this.renderFixedQuantityProductPricing();\r\n      return config;\r\n    }.bind(this));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.loadPrintOptions = async function () {\r\n    const wrapper = this.modal && this.modal.querySelector('[data-print-options-wrapper]');\r\n    const status = this.modal && this.modal.querySelector('[data-print-options-status]');\r\n    if (!wrapper) return;\r\n    try {\r\n      this.printOptionsDebug('chargement', { productHandle: this.config.productHandle });\r\n      const responses = await Promise.all([\r\n        window.OrionPersonalizationOptions && window.OrionPersonalizationOptions.load\r\n          ? window.OrionPersonalizationOptions.load({ id: this.config.productId })\r\n          : Promise.resolve({ ok: false, products: {}, associations: [] }),\r\n        this.loadAppProxyDiscountConfig()\r\n      ]);\r\n      const catalog = responses[0];\r\n      if (!catalog || catalog.ok === false || !window.OrionPersonalizationOptions) throw new Error('Options App Proxy indisponibles');\r\n      const definitions = window.OrionPersonalizationOptions.getForProduct(catalog, {\r\n        id: this.config.productId,\r\n        handle: this.config.productHandle\r\n      });\r\n      definitions.sort(function (a, b) { return (Number(a.sortOrder) || 0) - (Number(b.sortOrder) || 0); });\r\n      const handles = Array.from(new Set(definitions.map(function (item) {\r\n        return String(item && (item.optionProductHandle || item.option_product_handle || item.technicalProductHandle || item.technical_product_handle || item.feeProductHandle ||\r\n          (item.technicalProduct && item.technicalProduct.handle)) || '').trim();\r\n      }).filter(Boolean)));\r\n      const products = {};\r\n      await Promise.all(handles.map(async function (handle) {\r\n        try {\r\n          const productResponse = await fetch('/products/' + encodeURIComponent(handle) + '.js', { headers: { Accept: 'application/json' } });\r\n          if (!productResponse.ok) throw new Error('HTTP ' + productResponse.status);\r\n          products[handle] = await productResponse.json();\r\n        } catch (error) {\r\n          products[handle] = null;\r\n          console.error('[Personalizer Print Options] Produit technique introuvable', { handle: handle, error: error });\r\n        }\r\n      }));\r\n      this.rawPrintOptions = definitions.map(function (definition) {\r\n        const handle = String(definition.optionProductHandle || definition.option_product_handle || definition.technicalProductHandle || definition.technical_product_handle || definition.feeProductHandle ||\r\n          (definition.technicalProduct && definition.technicalProduct.handle) || '');\r\n        const sku = String(definition.optionVariantSku || definition.option_variant_sku || definition.technicalVariantSku || definition.technical_variant_sku || definition.feeVariantSku ||\r\n          (definition.technicalVariant && definition.technicalVariant.sku) || '');\r\n        const configuredVariantId = definition.optionVariantId || definition.option_variant_id || definition.technicalVariantId || definition.technical_variant_id || definition.feeVariantId ||\r\n          (definition.technicalVariant && definition.technicalVariant.id) || definition.variantId;\r\n        const product = products[handle];\r\n        let variant = product && Array.isArray(product.variants) && product.variants.find(function (candidate) {\r\n          return (configuredVariantId && window.OrionPersonalizationOptions.sameId(candidate && candidate.id, configuredVariantId)) ||\r\n            (sku && String(candidate && candidate.sku || '') === sku);\r\n        });\r\n        if (!variant && configuredVariantId && definition.price) {\r\n          const numericVariantId = String(configuredVariantId).replace(/^gid:\\/\\/shopify\\/ProductVariant\\//, '');\r\n          variant = {\r\n            id: numericVariantId,\r\n            sku: definition.sku || sku,\r\n            title: definition.title,\r\n            price: Math.round(Number(definition.price.amount) * 100),\r\n            compare_at_price: 0,\r\n            available: definition.availableForSale !== false\r\n          };\r\n        }\r\n        if (!variant) {\r\n          console.error('[Personalizer Print Options] Option non r\u00E9solue', { handle: handle, sku: sku });\r\n          return null;\r\n        }\r\n        return Object.assign({}, definition, {\r\n          key: handle + '::' + String(variant.sku || sku || variant.id),\r\n          optionProductHandle: handle,\r\n          optionVariantSku: String(variant.sku || sku || ''),\r\n          variantId: variant.id,\r\n          variantTitle: variant.title && variant.title !== 'Default Title' ? variant.title : (product && product.title) || definition.productTitle,\r\n          productTitle: (product && product.title) || definition.productTitle,\r\n          price: Math.max(0, Math.round(Number(variant.price) || 0)),\r\n          compareAtPrice: Math.max(0, Math.round(Number(variant.compare_at_price) || 0)),\r\n          available: variant.available !== false,\r\n          selectionType: definition.selectionType === 'radio' ? 'radio' : 'checkbox',\r\n          group: String(definition.group || ''),\r\n          quantityMode: definition.quantityMode === 'fixed' ? 'fixed' : 'per_unit',\r\n          association: definition\r\n        });\r\n      }).filter(Boolean);\r\n      this.applyFinishingRulesToPrintOptions();\r\n      this.pendingPrintOptionKeys.forEach(\r\n        function (key) {\r\n          const pendingKey = String(key || '');\r\n          const functional = this.printOptions.find(function (option) {\r\n            return option.key === pendingKey || option.sourceKey === pendingKey ||\r\n              (Array.isArray(option.technicalKeys) && option.technicalKeys.indexOf(pendingKey) >= 0);\r\n          });\r\n          this.selectedPrintOptionKeys[functional ? functional.key : pendingKey] = true;\r\n        }.bind(this)\r\n      );\r\n      this.renderPrintOptions();\r\n      this.updatePrice();\r\n      this.renderFixedQuantityProductPricing();\r\n      this.printOptionsDebug('options r\u00E9solues', this.printOptions);\r\n    } catch (error) {\r\n      console.error('[Personalizer Print Options] Erreur de chargement', error);\r\n      this.printOptions = [];\r\n      this.rawPrintOptions = [];\r\n      wrapper.hidden = true;\r\n      if (status) status.textContent = 'Options indisponibles.';\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSelectedPrintOptions = function () {\r\n    return this.printOptions.filter(function (option) {\r\n      return option.available && this.selectedPrintOptionKeys[option.key];\r\n    }.bind(this));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyLegacyFinishingRulesToPrintOptions = function () {\r\n    const rawOptions = Array.isArray(this.rawPrintOptions) ? this.rawPrintOptions : [];\r\n    const rules = this.printConfig && this.printConfig.finishing_rules && typeof this.printConfig.finishing_rules === 'object'\r\n      ? this.printConfig.finishing_rules\r\n      : null;\r\n    if (!rules) {\r\n      this.printOptions = rawOptions.slice();\r\n      return;\r\n    }\r\n\r\n    const usedTechnicalKeys = new Set();\r\n    const functionalOptions = [];\r\n    Object.keys(rules).forEach(\r\n      function (ruleKey) {\r\n        const rule = rules[ruleKey] || {};\r\n        const handle = String(rule.technical_product_handle || '').trim();\r\n        const variantsBySides = rule.variants_by_sides && typeof rule.variants_by_sides === 'object'\r\n          ? rule.variants_by_sides\r\n          : {};\r\n        const technicalSkus = Object.keys(variantsBySides).map(function (side) { return String(variantsBySides[side] || ''); });\r\n        rawOptions.forEach(function (option) {\r\n          if (String(option.optionProductHandle || '') === handle && technicalSkus.indexOf(String(option.optionVariantSku || '')) >= 0) {\r\n            usedTechnicalKeys.add(option.key);\r\n          }\r\n        });\r\n        const selectedSku = String(variantsBySides[this.printSelection.sides] || '');\r\n        const resolved = rawOptions.find(function (option) {\r\n          return String(option.optionProductHandle || '') === handle && String(option.optionVariantSku || '') === selectedSku;\r\n        });\r\n        if (!resolved) {\r\n          console.error('[Personalizer Print] Finition conditionnelle non r\u00E9solue', {\r\n            rule: ruleKey,\r\n            sides: this.printSelection.sides,\r\n            handle: handle,\r\n            sku: selectedSku\r\n          });\r\n          return;\r\n        }\r\n        functionalOptions.push(Object.assign({}, resolved, {\r\n          key: 'finishing::' + ruleKey,\r\n          sourceKey: resolved.key,\r\n          technicalKeys: technicalSkus.map(function (sku) { return handle + '::' + sku; }),\r\n          variantTitle: String(rule.label || ruleKey),\r\n          displayLabel: String(rule.label || ruleKey),\r\n          selectionType: rule.type === 'radio' ? 'radio' : 'checkbox',\r\n          quantityMode: resolved.quantityMode === 'fixed' ? 'fixed' : 'per_unit',\r\n          finishingRuleKey: ruleKey\r\n        }));\r\n      }.bind(this)\r\n    );\r\n\r\n    this.printOptions = rawOptions.filter(function (option) {\r\n      return !usedTechnicalKeys.has(option.key);\r\n    }).concat(functionalOptions).sort(function (a, b) {\r\n      return (Number(a.sortOrder) || 0) - (Number(b.sortOrder) || 0);\r\n    });\r\n    if (this.modal) {\r\n      this.renderPrintOptions();\r\n      this.renderPrintOptionsSummary();\r\n      this.updatePrice();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyFinishingRulesToPrintOptions = function () {\r\n    const rawOptions = Array.isArray(this.rawPrintOptions) ? this.rawPrintOptions : [];\r\n    const groups = {};\r\n    rawOptions.forEach(function (option) {\r\n      const association = option.association || {};\r\n      const groupKey = String(association.functionalOptionId || association.functional_option_id || association.optionType || association.option_type || association.optionKey ||\r\n        association.technicalProductId || association.technical_product_id || association.optionProductId || association.option_product_id || option.optionProductHandle || option.productTitle);\r\n      if (!groups[groupKey]) groups[groupKey] = [];\r\n      groups[groupKey].push(option);\r\n    });\r\n    const previousSelections = Object.assign({}, this.selectedPrintOptionKeys || {});\r\n    this.printOptions = Object.keys(groups).map(function (groupKey) {\r\n      const candidates = groups[groupKey];\r\n      const resolved = this.resolveTechnicalPrintOption(candidates);\r\n      const representative = resolved || candidates[0];\r\n      const functionalKey = 'association::' + groupKey;\r\n      const wasSelected = candidates.some(function (option) {\r\n        return previousSelections[option.key] || previousSelections[functionalKey];\r\n      });\r\n      if (wasSelected) this.selectedPrintOptionKeys[functionalKey] = true;\r\n      candidates.forEach(function (option) { delete this.selectedPrintOptionKeys[option.key]; }.bind(this));\r\n      const label = this.getFunctionalPrintOptionLabel(representative, groupKey);\r\n      return Object.assign({}, representative, {\r\n        key: functionalKey,\r\n        sourceKey: resolved ? resolved.key : '',\r\n        technicalKeys: candidates.map(function (option) { return option.key; }),\r\n        technicalVariantTitle: representative.variantTitle,\r\n        variantTitle: label,\r\n        displayLabel: label,\r\n        selectionType: 'checkbox',\r\n        available: !!(resolved && resolved.available),\r\n        unresolved: !resolved\r\n      });\r\n    }.bind(this)).sort(function (a, b) {\r\n      return (Number(a.sortOrder) || 0) - (Number(b.sortOrder) || 0);\r\n    });\r\n    if (this.modal) {\r\n      this.renderPrintOptions();\r\n      this.renderPrintOptionsSummary();\r\n      this.updatePrice();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFunctionalPrintOptionLabel = function (option, fallback) {\r\n    const association = option && option.association ? option.association : {};\r\n    const explicit = association.displayLabel || association.display_label || association.optionLabel || association.option_label || association.functionalLabel || association.functional_label || association.label;\r\n    if (explicit) return String(explicit);\r\n    let label = String((option && option.productTitle) || fallback || '').replace(/^\\s*Frais\\s*-\\s*/i, '').trim();\r\n    const productTitle = String(this.config && this.config.productTitle || '').trim();\r\n    if (productTitle) label = label.replace(new RegExp('\\\\s*' + productTitle.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\s*$', 'i'), '').trim();\r\n    return label.replace(/[\\s\\-/]+$/, '').trim() || 'Option';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.resolveTechnicalPrintOption = function (candidates) {\r\n    const current = this.currentVariant || {};\r\n    const currentSku = String(current.sku || '');\r\n    const values = (Array.isArray(current.options) ? current.options : []).map(this.normalizeOptionValue.bind(this)).filter(Boolean);\r\n    const byId = candidates.find(function (option) {\r\n      const association = option.association || {};\r\n      const id = association.mainVariantId || association.main_variant_id || association.productVariantId || association.product_variant_id || association.shopifyVariantId ||\r\n        (association.mainVariant && association.mainVariant.id);\r\n      return id && window.OrionPersonalizationOptions.sameId(id, current.id);\r\n    });\r\n    if (byId) return byId;\r\n    const bySku = candidates.find(function (option) {\r\n      const association = option.association || {};\r\n      const sku = association.mainVariantSku || association.main_variant_sku || association.productVariantSku || association.product_variant_sku ||\r\n        (association.mainVariant && association.mainVariant.sku);\r\n      return sku && currentSku && String(sku) === currentSku;\r\n    });\r\n    if (bySku) return bySku;\r\n    const byCriteria = candidates.find(function (option) {\r\n      const association = option.association || {};\r\n      const criteria = association.variantOptions || association.variant_options || association.mainVariantOptions || association.main_variant_options || association.conditions || association.criteria;\r\n      if (!criteria) return false;\r\n      const expected = Array.isArray(criteria) ? criteria : Object.keys(criteria).map(function (key) { return criteria[key]; });\r\n      return expected.length > 0 && expected.every(function (value) {\r\n        const normalized = this.normalizeOptionValue(value && value.value !== undefined ? value.value : value);\r\n        return normalized && values.indexOf(normalized) >= 0;\r\n      }.bind(this));\r\n    }.bind(this));\r\n    if (byCriteria) return byCriteria;\r\n    return candidates.find(function (option) {\r\n      const title = this.normalizeOptionValue(option.variantTitle || '');\r\n      return values.length > 0 && values.every(function (value) {\r\n        const dimension = value.match(/\\d+(?:[.,]\\d+)?\\s*[x\u00D7]\\s*\\d+(?:[.,]\\d+)?/);\r\n        if (dimension) return title.replace(/\\s/g, '').indexOf(dimension[0].replace(/\\s/g, '')) >= 0;\r\n        if (value.indexOf('recto') >= 0) {\r\n          return title.indexOf('recto') >= 0 && (value.indexOf('verso') >= 0) === (title.indexOf('verso') >= 0);\r\n        }\r\n        return title.indexOf(value) >= 0;\r\n      });\r\n    }.bind(this)) || null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderPrintOptions = function () {\r\n    const wrapper = this.modal.querySelector('[data-print-options-wrapper]');\r\n    const list = this.modal.querySelector('[data-print-options-list]');\r\n    const status = this.modal.querySelector('[data-print-options-status]');\r\n    if (!wrapper || !list) return;\r\n    wrapper.hidden = !this.printOptions.length;\r\n    if (!this.printOptions.length) return;\r\n    if (status) status.hidden = true;\r\n    list.innerHTML = this.printOptions.map(function (option, index) {\r\n      const inputType = option.selectionType;\r\n      const groupName = inputType === 'radio' ? (option.group || ('option-' + index)) : option.key;\r\n      const checked = this.selectedPrintOptionKeys[option.key] ? ' checked' : '';\r\n      const disabled = option.available ? '' : ' disabled aria-disabled=\"true\"';\r\n      const pricing = this.getPrintOptionDisplayPricing(option);\r\n      const basePrice = window.PersonalizerPricing.formatMoney(pricing.unitOriginalCents, this.config.currencyCode);\r\n      const finalPrice = this.formatPrintOptionUnitPrice(pricing.unitFinalCents);\r\n      const totalPrice = window.PersonalizerPricing.formatMoney(pricing.totalFinalCents, this.config.currencyCode);\r\n      const priceHtml =\r\n        '<span class=\"personalizer-print-option__price-main\">' +\r\n          '<strong class=\"personalizer-print-option__price-final\">' + this.escapeHtml(finalPrice) + ' HT / pi\u00E8ce</strong>' +\r\n          (pricing.discountPercent > 0\r\n            ? '<span class=\"personalizer-print-option__discount\">-' + pricing.discountPercent + ' %</span>'\r\n            : '') +\r\n        '</span>' +\r\n        '<span class=\"personalizer-print-option__price-details\">' +\r\n          (pricing.hasDiscount\r\n            ? '<span class=\"personalizer-print-option__price-base\">' + this.escapeHtml(basePrice) + '</span>'\r\n            : '') +\r\n          '<span class=\"personalizer-print-option__total\">Total : ' + this.escapeHtml(totalPrice) + ' HT</span>' +\r\n        '</span>';\r\n      return '<label class=\"personalizer-print-option' + (option.available ? '' : ' is-disabled') + '\">' +\r\n        '<input type=\"' + inputType + '\" name=\"print-option-' + this.escapeHtml(groupName) + '\" value=\"' + this.escapeHtml(option.key) + '\" data-print-option-input' + checked + disabled + '>' +\r\n        '<span class=\"personalizer-print-option__content\">' +\r\n          '<span class=\"personalizer-print-option__title\">' + this.escapeHtml(option.variantTitle) + '</span>' +\r\n          '<span class=\"personalizer-print-option__price\">' + priceHtml + '</span>' +\r\n        '</span>' +\r\n        (option.available ? '' : '<span class=\"visually-hidden\">Indisponible</span>') + '</label>';\r\n    }.bind(this)).join('');\r\n    this.renderPrintOptionsSummary();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPrintOptionDisplayPricing = function (option) {\r\n    const quantity = Math.max(1, this.getTotalSelectedSizeQuantity());\r\n    const unitBaseCents = Math.max(0, Math.round(Number(option && option.price) || 0));\r\n    const compareAtPrice = Math.max(0, Math.round(Number(option && option.compareAtPrice) || 0));\r\n    const feeConfig = this.getAppProxyFeeConfig({\r\n      productHandle: option && option.optionProductHandle,\r\n      variantSku: option && option.optionVariantSku,\r\n      variantId: option && option.variantId\r\n    });\r\n    const discountPercent = this.getDiscountPercentForQuantityFromTiers(\r\n      feeConfig && Array.isArray(feeConfig.tiers) ? feeConfig.tiers : [],\r\n      quantity\r\n    );\r\n    const unitDiscountCents = Math.min(\n      unitBaseCents,\n      Math.max(0, Math.round(unitBaseCents * discountPercent / 100))\n    );\n    const unitFinalCents = Math.max(0, unitBaseCents - unitDiscountCents);\n    const chargedQuantity = option && option.quantityMode === 'fixed' ? 1 : quantity;\n    const totalBaseCents = unitBaseCents * chargedQuantity;\n    const totalDiscountCents = Math.min(\n      totalBaseCents,\n      Math.max(0, Math.round(totalBaseCents * discountPercent / 100))\n    );\n    return {\n      unitOriginalCents: compareAtPrice > unitBaseCents ? compareAtPrice : unitBaseCents,\r\n      unitBaseCents: unitBaseCents,\r\n      unitFinalCents: unitFinalCents,\r\n      totalBaseCents: totalBaseCents,\n      totalOriginalCents: Math.max(compareAtPrice, unitBaseCents) * chargedQuantity,\r\n      totalFinalCents: Math.max(0, totalBaseCents - totalDiscountCents),\n      discountPercent: discountPercent,\r\n      hasDiscount: unitFinalCents < unitBaseCents || compareAtPrice > unitFinalCents\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.formatPrintOptionUnitPrice = function (cents) {\r\n    const numericCents = Math.max(0, Number(cents) || 0);\r\n    const euros = numericCents / 100;\r\n    const needsSubCentPrecision = numericCents > 0 && numericCents < 1;\r\n    try {\r\n      return new Intl.NumberFormat('fr-FR', {\r\n        style: 'currency',\r\n        currency: this.config.currencyCode || 'EUR',\r\n        minimumFractionDigits: needsSubCentPrecision ? 3 : 2,\r\n        maximumFractionDigits: needsSubCentPrecision ? 4 : 2\r\n      }).format(euros);\r\n    } catch (error) {\r\n      return euros.toFixed(needsSubCentPrecision ? 4 : 2).replace('.', ',') + ' \u20AC';\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderPrintOptionsSummary = function () {\r\n    const selected = this.getSelectedPrintOptions();\r\n    const summary = this.modal.querySelector('[data-print-options-summary]');\r\n    const total = this.modal.querySelector('[data-print-options-total]');\r\n    if (!summary || !total) return;\r\n    const cents = selected.reduce(function (sum, option) {\r\n      return sum + this.getPrintOptionDisplayPricing(option).totalFinalCents;\r\n    }.bind(this), 0);\r\n    summary.hidden = !selected.length;\r\n    total.textContent = '+' + window.PersonalizerPricing.formatMoney(cents, this.config.currencyCode);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPrintSurfaceZones = function (zones) {\r\n    if (this.printDocument) {\r\n      const document = this.printDocument;\r\n      const views = Array.isArray(document.physicalViews) && document.physicalViews.length\r\n        ? document.physicalViews\r\n        : Array.isArray(document.views) && document.views.length\r\n          ? document.views\r\n        : this.resolveViews({ faces: document.faces });\r\n      return views.reduce(function (result, view) {\r\n        const configuredZones = Array.isArray(view.zones) && view.zones.length\r\n          ? view.zones\r\n          : view.parentViewId && view.zonesConfigured === true\r\n            ? []\r\n            : [{\r\n          id: 'print-' + view.id,\r\n          label: view.label,\r\n          xPercent: 0,\r\n          yPercent: 0,\r\n          widthPercent: 100,\r\n          heightPercent: 100,\r\n          strict: false,\r\n          fullCanvas: true\r\n        }];\r\n        configuredZones.forEach(function (configuredZone) {\r\n          result.push({\r\n          id: configuredZone.id,\r\n          label: configuredZone.label || view.label,\r\n          view: view.id,\r\n          techniqueIds: [],\r\n          xPercent: configuredZone.xPercent,\r\n          yPercent: configuredZone.yPercent,\r\n          widthPercent: configuredZone.widthPercent,\r\n          heightPercent: configuredZone.heightPercent,\r\n          offsetXPercent: 0,\r\n          offsetYPercent: 0,\r\n          previewScale: 1,\r\n          forceSquare: false,\r\n          widthCm: (Number(document.widthMm) > 0 ? Number(document.widthMm) : Number(document.workWidthMm)) / 10 * configuredZone.widthPercent / 100,\r\n          heightCm: (Number(document.heightMm) > 0 ? Number(document.heightMm) : Number(document.workHeightMm)) / 10 * configuredZone.heightPercent / 100,\r\n          fullImage: true,\r\n          fullCanvas: configuredZone.fullCanvas === true,\r\n          strict: configuredZone.strict === true\r\n          });\r\n        });\r\n        return result;\r\n      }, []);\r\n    }\r\n\r\n    // Fallback Recto/Verso temporairement d\u00E9sactiv\u00E9 : une impression sans zones configur\u00E9es doit rester vide.\r\n    // const sourceZones = Array.isArray(zones) && zones.length\r\n    //   ? zones\r\n    //   : [\r\n    //       { id: 'print-front', label: 'Recto', view: 'front' },\r\n    //       { id: 'print-back', label: 'Verso', view: 'back' }\r\n    //     ];\r\n    const sourceZones = Array.isArray(zones) ? zones : [];\r\n\r\n    const normalizedZones = sourceZones.map(function (zone, index) {\r\n      const view = normalizeViewId(zone.view || zone.side || (index === 1 ? 'back' : 'front'));\r\n      return Object.assign({}, zone, {\r\n        id: zone.id || (view === 'back' ? 'print-back' : 'print-front'),\r\n        label: zone.label || (view === 'back' ? 'Verso' : 'Recto'),\r\n        view: view,\r\n        techniqueIds: [],\r\n        xPercent: 0,\r\n        yPercent: 0,\r\n        widthPercent: 100,\r\n        heightPercent: 100,\r\n        offsetXPercent: 0,\r\n        offsetYPercent: 0,\r\n        previewScale: 1,\r\n        forceSquare: false,\r\n        widthCm: Number(zone.widthCm) > 0 ? Number(zone.widthCm) : 8.8,\r\n        heightCm: Number(zone.heightCm) > 0 ? Number(zone.heightCm) : 5.8,\r\n        fullImage: true\r\n      });\r\n    });\r\n\r\n    const byView = {};\r\n    normalizedZones.forEach(function (zone) {\r\n      const view = normalizeViewId(zone.view);\r\n      if (!byView[view]) byView[view] = zone;\r\n    });\r\n    // Fallbacks par vue temporairement d\u00E9sactiv\u00E9s pendant l'audit des produits.\r\n    // Ne pas recr\u00E9er automatiquement une zone Recto ou Verso manquante ici.\r\n    if (byView.front) byView.front.label = 'Recto';\r\n    if (byView.back) byView.back.label = 'Verso';\r\n    return ['front', 'back'].map(function (view) { return byView[view]; }).filter(Boolean);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyModeUi = function () {\r\n    if (!this.modal || !this.isPrintMode()) return;\r\n\r\n    this.modal.querySelectorAll('[data-techniques-wrapper], [data-techniques-mobile-wrapper]').forEach(function (node) {\r\n      node.hidden = true;\r\n    });\r\n\r\n    this.modal.querySelectorAll('[data-colors-wrapper]').forEach(function (node) {\r\n      node.hidden = true;\r\n    });\r\n\r\n    this.modal.querySelectorAll('.personalizer-controls__group--position-choice').forEach(function (group) {\r\n      if (group.querySelector('[data-text-panel-zones], [data-image-panel-zones], [data-qr-panel-zones]')) {\r\n        group.hidden = true;\r\n      }\r\n    });\r\n\r\n    this.modal.querySelectorAll('[data-action=\"open-impressions-panel\"], [data-action=\"mobile-focus-product-color\"], [data-action=\"mobile-focus-text-zone\"], [data-action=\"mobile-focus-image-zone\"], [data-action=\"mobile-focus-qr-zone\"]').forEach(function (node) {\r\n      node.hidden = true;\r\n    });\r\n\r\n    this.modal.querySelectorAll('.personalizer-primary-cta[data-action=\"open-sizes-panel\"]').forEach(function (button) {\r\n      button.textContent = 'Choisir la quantite';\r\n      button.setAttribute('aria-label', 'Choisir la quantite');\r\n    });\r\n\r\n    this.modal.querySelectorAll('[data-sizes-summary-wrapper] .personalizer-controls__label').forEach(function (label) {\r\n      label.textContent = 'Quantite';\r\n    });\r\n\r\n    this.modal.querySelectorAll('[data-controls-panel=\"sizes\"] .personalizer-controls__title--panel').forEach(function (title) {\r\n      title.textContent = 'Choisir la quantite';\r\n    });\r\n\r\n    this.modal.querySelectorAll('.personalizer-controls__group--position-choice .personalizer-controls__label').forEach(function (label) {\r\n      if (String(label.textContent || '').toLowerCase().indexOf('vue') >= 0) {\r\n        label.textContent = 'Choix de la face';\r\n      }\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.debugColorState = function (label, payload) {\r\n    if (!this.debugEnabled || typeof console === 'undefined') return;\r\n    const title = '[Personalizer Colors] ' + String(label || 'state');\r\n    if (typeof console.groupCollapsed === 'function') console.groupCollapsed(title);\r\n    if (typeof console.log === 'function') console.log(payload);\r\n    if (typeof console.groupEnd === 'function') console.groupEnd();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.resolveCanvasWorkloadByReason = function (reason) {\r\n    const key = String(reason || '').trim().toLowerCase();\r\n\r\n    const countAndPricingReasons = {\r\n      'image-background-updated': true,\r\n      'object-added': true,\r\n      'object-deleted': true,\r\n      'text-added': true,\r\n      'image-added': true,\r\n      'object-duplicated': true,\r\n      'import-json': true,\r\n      'object-repositioned': true,\r\n      'object-modified': true,\r\n      'object-centered': true,\r\n      'object-rotated': true,\r\n      'object-nudged': true,\r\n      'text-updated': true,\r\n      'text-changed': true\r\n    };\r\n    const impressionsReasons = {\r\n      'image-background-updated': true,\r\n      'object-added': true,\r\n      'object-deleted': true,\r\n      'text-added': true,\r\n      'image-added': true,\r\n      'object-duplicated': true,\r\n      'import-json': true,\r\n      'object-repositioned': true\r\n    };\r\n    const thumbnailReasons = {\r\n      'image-background-updated': true,\r\n      'object-added': true,\r\n      'object-deleted': true,\r\n      'text-added': true,\r\n      'image-added': true,\r\n      'object-duplicated': true,\r\n      'import-json': true,\r\n      'object-repositioned': true,\r\n      'object-modified': true,\r\n      'object-centered': true,\r\n      'object-rotated': true,\r\n      'object-nudged': true,\r\n      'text-style-updated': true,\r\n      'text-updated': true,\r\n      'text-changed': true,\r\n      'background-updated': true,\r\n      'switch-view': true\r\n    };\r\n\r\n    return {\r\n      updatePrice: !!countAndPricingReasons[key],\r\n      syncBatTool: !!countAndPricingReasons[key],\r\n      renderImpressionsSummary: !!countAndPricingReasons[key],\r\n      renderImpressionsUi: !!impressionsReasons[key],\r\n      captureThumbnail: !!thumbnailReasons[key],\r\n      renderPreviewModal: true\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.scheduleCanvasUiWork = function (work) {\r\n    if (!work) return;\r\n    const nextWork = this.pendingCanvasUiWork || {\r\n      updatePrice: false,\r\n      syncBatTool: false,\r\n      renderImpressionsSummary: false,\r\n      renderImpressionsUi: false,\r\n      captureThumbnail: false,\r\n      renderPreviewModal: false\r\n    };\r\n\r\n    nextWork.updatePrice = nextWork.updatePrice || !!work.updatePrice;\r\n    nextWork.syncBatTool = nextWork.syncBatTool || !!work.syncBatTool;\r\n    nextWork.renderImpressionsSummary = nextWork.renderImpressionsSummary || !!work.renderImpressionsSummary;\r\n    nextWork.renderImpressionsUi = nextWork.renderImpressionsUi || !!work.renderImpressionsUi;\r\n    nextWork.captureThumbnail = nextWork.captureThumbnail || !!work.captureThumbnail;\r\n    nextWork.renderPreviewModal = nextWork.renderPreviewModal || !!work.renderPreviewModal;\r\n    this.pendingCanvasUiWork = nextWork;\r\n\r\n    if (this.canvasUiWorkFrameId) return;\r\n    const self = this;\r\n    const flush = function () {\r\n      self.canvasUiWorkFrameId = 0;\r\n      const queued = self.pendingCanvasUiWork;\r\n      self.pendingCanvasUiWork = null;\r\n      if (!queued) return;\r\n\r\n      const queuedHeavy = self.pendingCanvasHeavyWork || {\r\n        updatePrice: false,\r\n        syncBatTool: false,\r\n        renderImpressionsSummary: false,\r\n        renderImpressionsUi: false\r\n      };\r\n      queuedHeavy.updatePrice = queuedHeavy.updatePrice || !!queued.updatePrice;\r\n      queuedHeavy.syncBatTool = queuedHeavy.syncBatTool || !!queued.syncBatTool;\r\n      queuedHeavy.renderImpressionsSummary = queuedHeavy.renderImpressionsSummary || !!queued.renderImpressionsSummary;\r\n      queuedHeavy.renderImpressionsUi = queuedHeavy.renderImpressionsUi || !!queued.renderImpressionsUi;\r\n      self.pendingCanvasHeavyWork = queuedHeavy;\r\n\r\n      if (!self.canvasHeavyUiTimer) {\r\n        self.canvasHeavyUiTimer = window.setTimeout(function () {\r\n          self.canvasHeavyUiTimer = 0;\r\n          const heavy = self.pendingCanvasHeavyWork;\r\n          self.pendingCanvasHeavyWork = null;\r\n          if (!heavy) return;\r\n          if (heavy.updatePrice) {\n            self.updatePrice();\n            self.renderSizesUi();\n          }\n          if (heavy.syncBatTool) self.syncBatPdfToolUi();\r\n          if (heavy.renderImpressionsSummary) self.renderImpressionsSummary();\r\n          if (heavy.renderImpressionsUi) self.renderImpressionsUi();\r\n        }, 0);\r\n      }\r\n\r\n      if (queued.captureThumbnail) self.scheduleActiveViewThumbnailCapture();\r\n      if (queued.renderPreviewModal && self.previewModal && !self.previewModal.classList.contains('is-hidden')) {\r\n        self.renderPreviewModal();\r\n      }\r\n    };\r\n\r\n    if (typeof window !== 'undefined' && typeof window.requestAnimationFrame === 'function') {\r\n      this.canvasUiWorkFrameId = window.requestAnimationFrame(flush);\r\n      return;\r\n    }\r\n    this.canvasUiWorkFrameId = window.setTimeout(flush, 16);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.scheduleThumbnailCaptureForView = function (view, delayMs) {\r\n    if (this.thumbnailCaptureTimer) {\r\n      window.clearTimeout(this.thumbnailCaptureTimer);\r\n      this.thumbnailCaptureTimer = 0;\r\n    }\r\n    const targetView = normalizeViewId(view || this.activeView);\r\n    const wait = Math.max(40, Number(delayMs) || 120);\r\n    this.thumbnailCaptureTimer = window.setTimeout(\r\n      function () {\r\n        this.thumbnailCaptureTimer = 0;\r\n        this.captureThumbnailForView(targetView);\r\n      }.bind(this),\r\n      wait\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.scheduleActiveViewThumbnailCapture = function (delayMs) {\r\n    this.scheduleThumbnailCaptureForView(this.activeView || 'front', delayMs);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.ensureCartEditCloseConfirmModal = function () {\r\n    if (!this.modal) return null;\r\n    let existing = this.modal.querySelector('[data-cart-edit-close-confirm]');\r\n    if (existing) return existing;\r\n\r\n    const wrapper = document.createElement('div');\r\n    wrapper.className = 'personalizer-confirm-modal is-hidden';\r\n    wrapper.setAttribute('data-cart-edit-close-confirm', '');\r\n    wrapper.innerHTML =\r\n      '<div class=\"personalizer-confirm-modal__overlay\" data-action=\"cart-edit-close-discard\"></div>' +\r\n      '<div class=\"personalizer-confirm-modal__dialog\" role=\"alertdialog\" aria-modal=\"true\">' +\r\n      '<h3 class=\"personalizer-confirm-modal__title\">Voulez vous appliquer vos modifications a votre panier ?</h3>' +\r\n      '<p class=\"personalizer-confirm-modal__text\">Vous pouvez appliquer vos changements maintenant ou fermer sans sauvegarder.</p>' +\r\n      '<div class=\"personalizer-confirm-modal__actions\">' +\r\n      '<button type=\"button\" class=\"personalizer-confirm-modal__button personalizer-confirm-modal__button--primary\" data-action=\"cart-edit-close-apply\">Oui, appliquer les changements</button>' +\r\n      '<button type=\"button\" class=\"personalizer-confirm-modal__button personalizer-confirm-modal__button--secondary\" data-action=\"cart-edit-close-discard\">Non, ne pas sauvegarder</button>' +\r\n      '</div>' +\r\n      '</div>';\r\n    this.modal.appendChild(wrapper);\r\n    return wrapper;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.ensureAbandonConfirmModal = function () {\r\n    if (!this.modal) return null;\r\n    let existing = this.modal.querySelector('[data-abandon-confirm]');\r\n    if (existing) return existing;\r\n\r\n    const wrapper = document.createElement('div');\r\n    wrapper.className = 'personalizer-confirm-modal is-hidden';\r\n    wrapper.setAttribute('data-abandon-confirm', '');\r\n    wrapper.innerHTML =\n      '<div class=\"personalizer-confirm-modal__overlay\" data-action=\"abandon-confirm-cancel\"></div>' +\n      '<div class=\"personalizer-confirm-modal__dialog\" role=\"alertdialog\" aria-modal=\"true\">' +\n      '<button type=\"button\" class=\"personalizer-confirm-modal__close\" aria-label=\"Fermer\" data-action=\"abandon-confirm-cancel\">\u00D7</button>' +\n      '<div class=\"personalizer-confirm-modal__visual\" aria-hidden=\"true\"><span>!</span></div>' +\n      '<div class=\"personalizer-confirm-modal__main\">' +\n      '<div class=\"personalizer-confirm-modal__brand\">AGENCE ORION</div>' +\n      '<h3 class=\"personalizer-confirm-modal__title\">Abandonner votre personnalisation ?</h3>' +\n      '<p class=\"personalizer-confirm-modal__text\">Votre projet peut \u00EAtre transmis \u00E0 notre \u00E9quipe si vous souhaitez \u00EAtre accompagn\u00E9 pour le finaliser.</p>' +\n      '<div class=\"personalizer-confirm-modal__actions\">' +\n      '<button type=\"button\" class=\"personalizer-confirm-modal__button personalizer-confirm-modal__button--secondary\" data-action=\"abandon-confirm-proceed\">Oui, quitter le projet</button>' +\n      '<button type=\"button\" class=\"personalizer-confirm-modal__button personalizer-confirm-modal__button--secondary\" data-action=\"abandon-confirm-cancel\">Continuer ma personnalisation</button>' +\n      '<button type=\"button\" class=\"personalizer-confirm-modal__button personalizer-confirm-modal__button--primary\" data-action=\"assistance-open\"><span class=\"orion-group-icon\" aria-hidden=\"true\"></span> \u00CAtre accompagn\u00E9 par ORION <span aria-hidden=\"true\">\u2192</span></button>' +\n      '</div><div class=\"personalizer-confirm-modal__footer-note\">VOS ID\u00C9ES M\u00C9RITENT UN ACCOMPAGNEMENT EXPERT</div></div>' +\n      '</div>';\n    this.modal.appendChild(wrapper);\r\n    return wrapper;\r\n  };\r\n\r\n  // Confirmation modal shown before add-to-cart when some elements are 100% outside print zone.\r\n  // Those elements are excluded from price, BAT and cart summary.\r\n  PersonalizerModalApp.prototype.ensureOutOfFrameConfirmModal = function () {\r\n    if (!this.modal) return null;\r\n    let existing = this.modal.querySelector('[data-out-of-frame-confirm]');\r\n    if (existing) return existing;\r\n\r\n    const wrapper = document.createElement('div');\r\n    wrapper.className = 'personalizer-confirm-modal is-hidden';\r\n    wrapper.setAttribute('data-out-of-frame-confirm', '');\r\n    wrapper.innerHTML =\r\n      '<div class=\"personalizer-confirm-modal__overlay\" data-action=\"out-of-frame-confirm-edit\"></div>' +\r\n      '<div class=\"personalizer-confirm-modal__dialog\" role=\"alertdialog\" aria-modal=\"true\">' +\r\n      '<h3 class=\"personalizer-confirm-modal__title\">Personnalisation hors cadre d\u00E9tect\u00E9e</h3>' +\r\n      '<p class=\"personalizer-confirm-modal__text\">Une ou plusieurs personnalisations sont 100% hors cadre. Elles ne seront pas prises en compte dans le prix, les BAT et le panier.</p>' +\r\n      '<div class=\"personalizer-confirm-modal__actions\">' +\r\n      '<button type=\"button\" class=\"personalizer-confirm-modal__button personalizer-confirm-modal__button--secondary\" data-action=\"out-of-frame-confirm-edit\">Continuer \u00E0 modifier</button>' +\r\n      '<button type=\"button\" class=\"personalizer-confirm-modal__button personalizer-confirm-modal__button--primary\" data-action=\"out-of-frame-confirm-proceed\">Valider le panier sans prendre en compte cela</button>' +\r\n      '</div>' +\r\n      '</div>';\r\n    this.modal.appendChild(wrapper);\r\n    return wrapper;\r\n  };\r\n\r\n  // User came from cart > \"Modifier mon graphisme\".\r\n  // In this mode, saving should update/replace an existing cart group.\r\n  PersonalizerModalApp.prototype.isCartEditMode = function () {\r\n    return !!(this.cartEditContext && this.cartEditContext.groupId);\r\n  };\r\n\r\n  // Updates CTA labels depending on normal mode vs cart-edit mode.\r\n  PersonalizerModalApp.prototype.syncCartEditUi = function () {\r\n    if (!this.modal) return;\r\n    const isEditMode = this.isCartEditMode();\r\n    const addButtons = this.modal.querySelectorAll('[data-action=\"modal-add-to-cart\"]');\r\n    addButtons.forEach(function (button) {\r\n      button.textContent = isEditMode ? 'Actualiser mon panier' : 'Ajouter au panier';\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openCartEditCloseConfirm = function () {\r\n    if (!this.cartEditCloseConfirmModal) return;\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n    this.cartEditCloseConfirmModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closeCartEditCloseConfirm = function () {\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.cartEditCloseConfirmModal) this.cartEditCloseConfirmModal.classList.add('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openAbandonConfirm = function () {\r\n    if (!this.abandonConfirmModal) return;\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n    this.abandonConfirmModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closeAbandonConfirm = function () {\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.abandonConfirmModal) this.abandonConfirmModal.classList.add('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.discardCurrentPersonalization = function () {\r\n    if (this.canvasEngine && typeof this.canvasEngine.reset === 'function') {\r\n      this.canvasEngine.reset();\r\n    }\r\n    this.activeView = 'front';\r\n    this.selectedZone = this.zones.find(function (zone) {\r\n      return String(zone && zone.view || 'front').toLowerCase() === 'front';\r\n    }) || this.zones[0] || null;\r\n    this.selectedDesignObject = null;\r\n    this.selectedDesignKind = '';\r\n    this.pendingImagePlaceholder = null;\r\n    this.zoneThumbnails = {};\r\n    this.zoneThumbnailStateKeys = {};\r\n    this.setControlsPanel('default');\r\n    this.applyActiveZoneToCanvas();\r\n    this.renderViewSwitchers();\r\n    this.renderImpressionsSummary();\r\n    this.renderImpressionsUi();\r\n    this.updatePrice();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openOutOfFrameConfirm = function () {\r\n    if (!this.outOfFrameConfirmModal) return;\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n    this.outOfFrameConfirmModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closeOutOfFrameConfirm = function () {\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.outOfFrameConfirmModal) this.outOfFrameConfirmModal.classList.add('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.discardCartEditMode = function () {\r\n    this.cartEditContext = null;\r\n    this.cartEditInitialStateSnapshot = '';\r\n    this.closeCartEditCloseConfirm();\r\n    this.syncCartEditUi();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildCartEditStateSnapshot = function () {\r\n    const sizeQuantities = this.sizeQuantities && typeof this.sizeQuantities === 'object'\r\n      ? this.sizeQuantities\r\n      : {};\r\n    const orderedSizes = Object.keys(sizeQuantities)\r\n      .sort()\r\n      .reduce(function (acc, key) {\r\n        const qty = Math.max(0, Math.floor(Number(sizeQuantities[key]) || 0));\r\n        if (qty > 0) acc[String(key)] = qty;\r\n        return acc;\r\n      }, {});\r\n    let personalizationJson = '';\r\n    try {\r\n      personalizationJson =\r\n        this.canvasEngine && typeof this.canvasEngine.exportJSON === 'function'\r\n          ? String(this.canvasEngine.exportJSON() || '')\r\n          : '';\r\n    } catch (error) {\r\n      personalizationJson = '';\r\n    }\r\n    return JSON.stringify({\r\n      personalizationJson: personalizationJson,\r\n      selectedTechnique: this.selectedTechnique ? String(this.selectedTechnique.id || '') : '',\r\n      selectedZone: this.selectedZone ? String(this.selectedZone.id || '') : '',\r\n      activeView: String(this.activeView || 'front'),\r\n      sizeQuantities: orderedSizes,\r\n      variantId: this.currentVariant && this.currentVariant.id ? String(this.currentVariant.id) : '',\r\n      printSelection: this.isPrintMode() ? this.printSelection : null,\r\n      selectedPrintOptionKeys: this.isPrintMode()\r\n        ? Object.keys(this.selectedPrintOptionKeys || {}).filter(\r\n            function (key) { return this.selectedPrintOptionKeys[key] === true; }.bind(this)\r\n          ).sort()\r\n        : []\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.captureCartEditInitialState = function () {\r\n    this.cartEditInitialStateSnapshot = this.buildCartEditStateSnapshot();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hasUnsavedCartEditChanges = function () {\r\n    if (!this.isCartEditMode() || this.isRestoringCartEdit) return false;\r\n    return this.buildCartEditStateSnapshot() !== String(this.cartEditInitialStateSnapshot || '');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.handleBeforeUnload = function (event) {\r\n    if (!this.hasUnsavedCartEditChanges()) return;\r\n    if (event) {\r\n      event.preventDefault();\r\n      event.returnValue = '';\r\n    }\r\n    return '';\r\n  };\r\n\r\n  // Shared redirect helper for cart-edit flows (save / discard).\r\n  PersonalizerModalApp.prototype.redirectToCart = function () {\r\n    const routesRoot =\r\n      window.Shopify && window.Shopify.routes && typeof window.Shopify.routes.root === 'string'\r\n        ? window.Shopify.routes.root\r\n        : '/';\r\n    // Release the document before navigating so a cached product page cannot\r\n    // restore with its background scroll still locked.\r\n    this.disableZoomLock();\r\n    this.unlockBodyScroll();\r\n    if (this.modal) {\r\n      this.modal.classList.remove('is-open');\r\n      this.modal.setAttribute('aria-hidden', 'true');\r\n    }\r\n    window.location.href = routesRoot + 'cart';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openEntryDisclaimer = function () {\r\n    this.syncFromProductState();\r\n    if (!this.canOpenConfiguredPrintCanvas()) return;\r\n    if (!this.entryDisclaimerModal) {\r\n      this.open();\r\n      return;\r\n    }\r\n    this.open();\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n    this.entryDisclaimerModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closeEntryDisclaimer = function () {\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.entryDisclaimerModal) this.entryDisclaimerModal.classList.add('is-hidden');\r\n  };\r\n\r\n  // Saves front/back preview snapshots in sessionStorage so /cart can display\r\n  // a lightweight carousel preview without recreating Fabric rendering there.\r\n  PersonalizerModalApp.prototype.waitForPreviewCaptureFrame = function () {\n    return new Promise(function (resolve) {\n      if (typeof window.requestAnimationFrame !== 'function') {\r\n        window.setTimeout(resolve, 40);\r\n        return;\r\n      }\r\n      window.requestAnimationFrame(function () {\r\n        window.requestAnimationFrame(function () {\r\n          window.setTimeout(resolve, 0);\r\n        });\r\n      });\n    });\n  };\n\n  PersonalizerModalApp.prototype.prepareViewForBatCapture = function (view) {\n    const targetView = normalizeViewId(view);\n    const viewTransition = typeof this.setActiveView === 'function'\n      ? this.setActiveView(targetView)\n      : Promise.resolve();\n    return Promise.resolve(viewTransition).then(\n      function () {\n        return this.waitForPreviewCaptureFrame();\n      }.bind(this)\n    );\n  };\n\r\n  PersonalizerModalApp.prototype.storeCartGroupPreviewImages = function (groupId) {\n    if (!groupId || !this.canvasEngine) return Promise.resolve();\n    const views = this.getTechniqueAvailableViews();\n    const payload = {\n      labels: {\n        front: this.getViewLabel('front'),\n        back: this.getViewLabel('back')\n      }\n    };\n    const originalAppView = normalizeViewId(this.activeView);\r\n    const canDirectViewCapture = typeof this.canvasEngine.getPreviewDataURLForView === 'function';\r\n    const canGenericCapture = typeof this.canvasEngine.getPreviewDataURL === 'function';\r\n    let chain = Promise.resolve();\r\n\r\n    views.forEach(\r\n      function (view) {\r\n        chain = chain\r\n          .then(\r\n            function () {\r\n              // Force the full personalizer view switch so the correct mockup background is applied.\r\n              this.setActiveView(view);\r\n              return this.waitForPreviewCaptureFrame();\r\n            }.bind(this)\r\n          )\r\n          .then(\r\n            function () {\r\n              let src = '';\r\n              try {\r\n                if (canDirectViewCapture) src = this.canvasEngine.getPreviewDataURLForView(view, { multiplier: 0.8 }) || '';\r\n                if (!src && canGenericCapture) src = this.canvasEngine.getPreviewDataURL({ multiplier: 0.8 }) || '';\r\n              } catch (error) {\r\n                src = '';\r\n              }\r\n              if (src) payload[view] = src;\r\n            }.bind(this)\r\n          );\r\n      }.bind(this)\r\n    );\r\n\r\n    return chain\r\n      .catch(function () {})\r\n      .finally(\r\n        function () {\r\n          // Restore the user's active view after snapshot generation.\r\n          try { this.setActiveView(originalAppView); } catch (error) {}\r\n        }.bind(this)\r\n      )\r\n      .then(function () {\r\n        if (!payload.front && !payload.back) return;\r\n\r\n        try {\r\n          const readPreviewMap = function (storage) {\r\n            if (!storage) return {};\r\n            try {\r\n              const raw = storage.getItem(CART_GROUP_PREVIEWS_SESSION_KEY) || '{}';\r\n              const parsed = JSON.parse(raw);\r\n              return parsed && typeof parsed === 'object' ? parsed : {};\r\n            } catch (error) {\r\n              return {};\r\n            }\r\n          };\r\n          const writePreviewMap = function (storage, value) {\r\n            if (!storage) return;\r\n            try {\r\n              storage.setItem(CART_GROUP_PREVIEWS_SESSION_KEY, JSON.stringify(value || {}));\r\n            } catch (error) {}\r\n          };\r\n          const existing = Object.assign(\r\n            {},\r\n            readPreviewMap(window.localStorage),\r\n            readPreviewMap(window.sessionStorage)\r\n          );\r\n          existing[String(groupId)] = payload;\r\n          writePreviewMap(window.sessionStorage, existing);\r\n          writePreviewMap(window.localStorage, existing);\r\n        } catch (error) {\r\n          // Ignore storage quota/session issues, fallback image will be used in cart.\r\n        }\r\n      });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.storeVariantStockCacheForCart = function () {\r\n    const variants = Array.isArray(this.config.variantsStock) && this.config.variantsStock.length\r\n      ? this.config.variantsStock\r\n      : (Array.isArray(this.config.variants) ? this.config.variants : []);\r\n    if (!variants.length) return;\r\n    try {\r\n      const raw = window.sessionStorage.getItem(VARIANT_STOCK_CACHE_SESSION_KEY) || '{}';\r\n      let map = {};\r\n      try { map = JSON.parse(raw) || {}; } catch (error) { map = {}; }\r\n      variants.forEach(function (variant) {\r\n        const id = String(variant && variant.id ? variant.id : '');\r\n        if (!id) return;\r\n        map[id] = {\r\n          inventory_quantity: Number.isFinite(Number(variant.inventory_quantity)) ? Math.max(0, Math.floor(Number(variant.inventory_quantity))) : null,\r\n          inventory_policy: String(variant && variant.inventory_policy || ''),\r\n          inventory_management: variant && variant.inventory_management ? variant.inventory_management : null,\r\n          available: variant && variant.available !== false,\r\n          savedAt: Date.now()\r\n        };\r\n      });\r\n      window.sessionStorage.setItem(VARIANT_STOCK_CACHE_SESSION_KEY, JSON.stringify(map));\r\n    } catch (error) {}\r\n  };\r\n\r\n  // Opens the simplified \"Apercu\" popup (visual preview only).\r\n  PersonalizerModalApp.prototype.openPreviewModal = function () {\r\n    if (!this.previewModal) return;\r\n    if (!this.hasPersonalizationObjects()) return;\r\n    if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\r\n      this.canvasEngine.clearSelection();\r\n    }\r\n    this.captureThumbnailForView(this.activeView || 'front');\r\n    this.previewActiveView = normalizeViewId(this.activeView);\r\n    this.renderPreviewModal();\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n    this.previewModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closePreviewModal = function () {\r\n    if (this.previewModal) this.previewModal.classList.add('is-hidden');\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    this.closePreviewBatInfoModal();\r\n  };\r\n\r\n  // Opens the BAT explanation popup and hides the preview popup underneath.\r\n  PersonalizerModalApp.prototype.openPreviewBatInfoModal = function () {\r\n    if (!this.previewBatInfoModal) return;\r\n    this.previewWasOpenBeforeBatInfo = !!(this.previewModal && !this.previewModal.classList.contains('is-hidden'));\r\n    if (this.previewModal) this.previewModal.classList.add('is-hidden');\r\n    this.previewBatInfoModal.classList.remove('is-hidden');\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closePreviewBatInfoModal = function () {\r\n    if (this.previewBatInfoModal) this.previewBatInfoModal.classList.add('is-hidden');\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.previewWasOpenBeforeBatInfo && this.previewModal) {\r\n      this.previewModal.classList.remove('is-hidden');\r\n      this.renderPreviewModal();\r\n    }\r\n    this.previewWasOpenBeforeBatInfo = false;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openZoneInfoModal = function () {\r\n    if (!this.zoneInfoModal) return;\r\n    this.zoneInfoModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closeZoneInfoModal = function () {\r\n    if (this.zoneInfoModal) this.zoneInfoModal.classList.add('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setPreviewView = function (view) {\r\n    this.previewActiveView = normalizeViewId(view);\r\n    this.renderPreviewModal();\r\n  };\r\n\r\n  // Renders preview image + syncs bottom view buttons labels with the main personalizer views.\r\n  PersonalizerModalApp.prototype.renderPreviewModal = function () {\r\n    if (!this.previewModal) return;\r\n    const availableViews = this.getTechniqueAvailableViews();\r\n    const requestedView = normalizeViewId(this.previewActiveView);\r\n    const activeView = normalizeViewId(this.activeView);\r\n    const view = availableViews.indexOf(requestedView) >= 0\r\n      ? requestedView\r\n      : availableViews.indexOf(activeView) >= 0\r\n        ? activeView\r\n        : availableViews[0] || 'front';\r\n    this.previewActiveView = view;\r\n    let previewSrc = '';\r\n    if (this.canvasEngine && typeof this.canvasEngine.getPreviewDataURLForView === 'function') {\r\n      try {\r\n        previewSrc = this.canvasEngine.getPreviewDataURLForView(view, {\r\n          multiplier: 1.8,\r\n          includePrintGuides: false\r\n        }) || '';\r\n      } catch (error) {\r\n        previewSrc = '';\r\n      }\r\n    }\r\n    if (!previewSrc) {\r\n      const expectedStateKey = this.getViewThumbnailStateKey(view);\r\n      const hasFreshThumbnail =\r\n        !!this.viewThumbnails[view] && String(this.viewThumbnailStateKeys[view] || '') === expectedStateKey;\r\n      previewSrc = (hasFreshThumbnail ? this.viewThumbnails[view] : '') || this.getViewThumbnailFallback(view) || '';\r\n    }\r\n    if (this.previewImage) {\r\n      if (previewSrc) this.previewImage.src = previewSrc;\r\n      else this.previewImage.removeAttribute('src');\r\n    }\r\n    this.previewModal.querySelectorAll('[data-action=\"preview-switch-view\"]').forEach(\r\n      function (button) {\r\n        const buttonView = normalizeViewId(button.dataset.previewView);\r\n        const active = buttonView === view;\r\n        const sourceViewButton = this.modal ? this.modal.querySelector('[data-view-switch=\"' + buttonView + '\"]') : null;\r\n        const sourceLabel = sourceViewButton ? String(sourceViewButton.textContent || '').trim() : '';\r\n        if (sourceLabel) button.textContent = sourceLabel;\r\n        button.classList.toggle('is-active', active);\r\n        button.setAttribute('aria-pressed', active ? 'true' : 'false');\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.downloadBatFromPreview = async function () {\r\n    try {\r\n      await this.downloadPersonalizationBatPdf();\n      if (this.previewBatInfoModal) this.previewBatInfoModal.classList.add('is-hidden');\r\n      if (this.previewModal) this.previewModal.classList.add('is-hidden');\r\n      this.previewWasOpenBeforeBatInfo = false;\r\n      if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    } catch (error) {\r\n      console.error('preview bat download error', error);\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizeFeeZoneKey = function (value) {\r\n    const source = String(value || '')\r\n      .toLowerCase()\r\n      .replace(/\u0153/g, 'oe')\r\n      .replace(/\u00E6/g, 'ae')\r\n      .normalize('NFD')\r\n      .replace(/[\\u0300-\\u036f]/g, '')\r\n      .trim();\r\n    if (!source) return '';\r\n    if (source.indexOf('anti') >= 0 && source.indexOf('coeur') >= 0) return 'anti-coeur';\r\n    if (source.indexOf('avant') >= 0 && source.indexOf('a3') >= 0) return 'front-a3';\r\n    if (source.indexOf('avant') >= 0 && source.indexOf('a4') >= 0) return 'front-a4';\r\n    if (source.indexOf('dos') >= 0 && source.indexOf('a3') >= 0) return 'back-a3';\r\n    if (source.indexOf('dos') >= 0 && source.indexOf('a4') >= 0) return 'back-a4';\r\n    if (source.indexOf('front-a3') >= 0) return 'front-a3';\r\n    if (source.indexOf('front-a4') >= 0) return 'front-a4';\r\n    if (source.indexOf('back-a3') >= 0) return 'back-a3';\r\n    if (source.indexOf('back-a4') >= 0) return 'back-a4';\r\n    if (source.indexOf('coeur') >= 0) return 'coeur';\r\n    if (source.indexOf('dos') >= 0) return 'dos';\r\n    if (source.indexOf('col') >= 0) return 'col';\r\n    return '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.findFeeVariantForZone = function (variants, zoneId) {\r\n    const zone = this.getZoneById(zoneId);\r\n    const wantedKey = [\r\n      zone && zone.label ? zone.label : '',\r\n      zone && zone.id ? zone.id : '',\r\n      zoneId || ''\r\n    ]\r\n      .map(this.normalizeFeeZoneKey.bind(this))\r\n      .find(Boolean);\r\n    if (!wantedKey) return null;\r\n\r\n    const variantList = Array.isArray(variants) ? variants : [];\r\n    const baseVariant = variantList.find(\r\n      function (variant) {\r\n        const title = String(variant && variant.title ? variant.title : '');\r\n        return (\r\n          this.normalizeFeeZoneKey(title) === wantedKey &&\r\n          !/\\d{1,3}\\s*%/.test(title)\r\n        );\r\n      }.bind(this)\r\n    );\r\n    return baseVariant || null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getQuantityDiscountPercent = function (quantity) {\r\n    const rules = this.normalizePricingRules(this.pricingRules) || null;\r\n    const qty = Math.max(1, Math.floor(Number(quantity) || 0));\r\n    const tiers = Array.isArray(rules && rules.quantity_discounts)\r\n      ? rules.quantity_discounts\r\n      : Array.isArray(rules && rules.tiers)\r\n        ? rules.tiers\r\n        : Array.isArray(rules)\r\n          ? rules\r\n          : [];\r\n\r\n    for (let index = 0; index < tiers.length; index += 1) {\r\n      const tier = tiers[index] || {};\r\n      const min = Number(tier.min ?? tier.min_qty ?? tier.quantity_min ?? 1);\r\n      const max = Number(tier.max ?? tier.max_qty ?? tier.quantity_max ?? Number.POSITIVE_INFINITY);\r\n      if (!Number.isFinite(min) || qty < min) continue;\r\n      if (Number.isFinite(max) && qty > max) continue;\r\n      if (tier.discount_percent !== undefined) {\r\n        const percent = Math.max(0, Math.round(Number(tier.discount_percent) || 0));\r\n        return percent;\r\n      }\r\n      const multiplier =\r\n        tier.multiplier !== undefined ? Number(tier.multiplier)\r\n        : tier.coefficient !== undefined ? Number(tier.coefficient)\r\n        : tier.coef !== undefined ? Number(tier.coef)\r\n        : 1;\r\n      if (Number.isFinite(multiplier)) {\r\n        return Math.max(0, Math.round((1 - multiplier) * 100));\r\n      }\r\n    }\r\n\r\n    return 0;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.parseFeeVariantDiscountPercent = function (value) {\r\n    const match = String(value || '')\r\n      .replace(/[\u2013\u2014\u2212]/g, '-')\r\n      .match(/(?:^|[^\\d])(\\d{1,3})\\s*%/);\r\n    if (!match) return 0;\r\n    return Math.max(0, Math.round(Number(match[1]) || 0));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFeeVariantZoneLabel = function (zoneId) {\r\n    const wantedKey = this.normalizeFeeZoneKey(zoneId || '');\r\n    if (wantedKey === 'coeur') return 'Coeur';\r\n    if (wantedKey === 'anti-coeur') return 'Anti-coeur';\r\n    if (wantedKey === 'front-a3') return 'Avant A3';\r\n    if (wantedKey === 'front-a4') return 'Avant A4';\r\n    if (wantedKey === 'back-a3') return 'Dos A3';\r\n    if (wantedKey === 'back-a4') return 'Dos A4';\r\n    if (wantedKey === 'dos') return 'Dos';\r\n    if (wantedKey === 'col') return 'Col';\r\n    const zone = this.getZoneById(zoneId);\r\n    return zone && zone.label ? String(zone.label) : String(zoneId || '');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildFeeVariantTitleCandidates = function (techniqueId, zoneId, discountPercent) {\r\n    const techniqueKey = String(techniqueId || '').toLowerCase();\r\n    const prefix = techniqueKey.indexOf('brod') >= 0 ? 'Frais broderie' : 'Frais flocage';\r\n    const zoneLabel = this.getFeeVariantZoneLabel(zoneId);\r\n    const discount = Math.max(0, Math.round(Number(discountPercent) || 0));\r\n    if (!zoneLabel) return [];\r\n    if (discount <= 0) return [prefix + ' - ' + zoneLabel];\r\n    return [\r\n      prefix + ' - ' + zoneLabel + ' -' + String(discount) + '%',\r\n      prefix + ' - ' + zoneLabel + ' - ' + String(discount) + '%',\r\n      prefix + ' - ' + zoneLabel + ' ' + String(discount) + '%'\r\n    ];\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.findFeeVariantForZoneAndDiscount = function (variants, zoneId, discountPercent) {\r\n    const techniqueId = this.selectedTechnique && this.selectedTechnique.id ? this.selectedTechnique.id : '';\r\n    const titleCandidates = this.buildFeeVariantTitleCandidates(techniqueId, zoneId, discountPercent).map(function (value) {\r\n      return String(value || '').trim().toLowerCase();\r\n    });\r\n    if (titleCandidates.length) {\r\n      const direct = (Array.isArray(variants) ? variants : []).find(function (variant) {\r\n        const title = String(variant && variant.title ? variant.title : '').trim().toLowerCase();\r\n        return titleCandidates.indexOf(title) >= 0;\r\n      });\r\n      if (direct) return direct;\r\n    }\r\n\r\n    const wantedZone = this.findFeeVariantForZone(variants, zoneId);\r\n    const wantedKey = this.normalizeFeeZoneKey(\r\n      wantedZone && wantedZone.title ? wantedZone.title : (zoneId || '')\r\n    );\r\n    if (!wantedKey) return null;\r\n\r\n    const targetDiscount = Math.max(0, Math.round(Number(discountPercent) || 0));\r\n    const variantList = Array.isArray(variants) ? variants : [];\r\n    const exact = variantList.find(\r\n      function (variant) {\r\n        const title = variant && variant.title ? String(variant.title) : '';\r\n        return (\r\n          this.normalizeFeeZoneKey(title) === wantedKey &&\r\n          this.parseFeeVariantDiscountPercent(title) === targetDiscount\r\n        );\r\n      }.bind(this)\r\n    );\r\n    if (exact) return exact;\r\n\r\n    if (targetDiscount > 0) {\r\n      const relaxed = variantList.find(\r\n        function (variant) {\r\n          const title = variant && variant.title ? String(variant.title) : '';\r\n          return this.normalizeFeeZoneKey(title) === wantedKey && title.indexOf(String(targetDiscount) + '%') >= 0;\r\n        }.bind(this)\r\n      );\r\n      if (relaxed) return relaxed;\r\n    }\r\n\r\n    if (targetDiscount > 0) return null;\r\n    return variantList.find(\r\n      function (variant) {\r\n        return (\r\n          this.normalizeFeeZoneKey(variant && variant.title ? variant.title : '') === wantedKey &&\r\n          this.parseFeeVariantDiscountPercent(variant && variant.title ? variant.title : '') === 0\r\n        );\r\n      }.bind(this)\r\n    ) || null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildTechniqueFeeItems = function (args) {\r\n    const options = args || {};\r\n    const techniqueId = String(options.techniqueId || '').toLowerCase();\r\n    const quantity = Math.max(0, Math.floor(Number(options.quantity) || 0));\r\n    const personalizationGroupId = String(options.personalizationGroupId || '');\r\n    const usedZoneIds = Array.isArray(options.usedZoneIds) ? options.usedZoneIds : [];\r\n    if (!quantity || !personalizationGroupId) return [];\r\n\r\n    const feeProducts = this.config.personalizationFeeProducts || {};\r\n    const selectedTechnique = this.selectedTechnique || {};\n    const feeHandle = String(selectedTechnique.feeProductHandle || '').trim();\n    const feeConfig = feeHandle\n      ? (feeProducts.byHandle && feeProducts.byHandle[feeHandle]) || null\n      : techniqueId.indexOf('brod') >= 0\n        ? feeProducts.broderie || {}\n        : techniqueId.indexOf('floc') >= 0\r\n          ? feeProducts.flocage || {}\r\n          : null;\r\n    const feeVariants = Array.isArray(feeConfig && feeConfig.variants) ? feeConfig.variants : [];\r\n    if (!feeVariants.length) return [];\r\n    const uniqueZoneIds = Array.from(new Set(usedZoneIds.filter(Boolean)));\r\n    if (!uniqueZoneIds.length) return [];\r\n\r\n    const feeItems = uniqueZoneIds\r\n      .map(\r\n        function (zoneId) {\r\n          // Les variantes remis\u00E9es de frais ne sont plus utilis\u00E9es ; la remise est d\u00E9sormais g\u00E9r\u00E9e par la Discount Function Shopify.\r\n          const variant = feeHandle\n            ? this.resolveGenericFeeVariant(feeConfig, selectedTechnique.feeVariantSku)\n            : this.findFeeVariantForZone(feeVariants, zoneId);\n          if (!variant || !variant.id) return null;\r\n          const zone = this.getZoneById(zoneId);\r\n          return {\r\n            id: String(variant.id),\r\n            quantity: quantity,\r\n            properties: {\r\n              ligne: 'Frais de personnalisation',\r\n              // Les lignes de frais de ce bloc partagent le meme group id que le produit principal.\r\n              _custom_group_id: personalizationGroupId,\r\n              _personalization_group: personalizationGroupId,\r\n              _personalization_fee: 'true',\r\n              _selected_technique: techniqueId,\r\n              _selected_zone: String(zoneId || ''),\r\n              _fee_variant_title: String(variant.title || ''),\r\n              _fee_zone_label: String((zone && zone.label) || zoneId || '')\r\n            }\r\n          };\r\n        }.bind(this)\r\n      )\r\n      .filter(Boolean);\r\n\r\n    return feeItems.length === uniqueZoneIds.length ? feeItems : [];\n  };\n\n  PersonalizerModalApp.prototype.resolveGenericFeeVariant = function (feeConfig, requestedSku) {\n    const variants = Array.isArray(feeConfig && feeConfig.variants)\n      ? feeConfig.variants.filter(function (variant) { return variant && variant.id && variant.available !== false; })\n      : [];\n    const wantedSku = String(requestedSku || '').trim().toLowerCase();\n    if (wantedSku) {\n      const matches = variants.filter(function (variant) {\n        return String(variant && variant.sku || '').trim().toLowerCase() === wantedSku;\n      });\n      if (matches.length === 1) return matches[0];\n      if (typeof console !== 'undefined') {\n        console.error('[Personalizer] Variant de frais introuvable ou ambigu pour le SKU ' + String(requestedSku) + '.');\n      }\n      return null;\n    }\n    if (variants.length === 1) return variants[0];\n    if (typeof console !== 'undefined') {\n      const handle = String(feeConfig && feeConfig.handle || '');\n      console.error(\n        variants.length === 0\n          ? '[Personalizer] Aucun variant de frais utilisable pour ' + handle + '.'\n          : '[Personalizer] Plusieurs variants de frais utilisables pour ' + handle + ' sans regle de selection.'\n      );\n    }\n    return null;\n  };\n\r\n  PersonalizerModalApp.prototype.getFeeVariantCatalog = function () {\r\n    const feeConfig = this.getSelectedFeeConfig();\r\n    return Array.isArray(feeConfig && feeConfig.variants) ? feeConfig.variants : [];\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSelectedFeeConfig = function () {\n    const feeProducts = this.config.personalizationFeeProducts || {};\n    const feeHandle = String(this.selectedTechnique && this.selectedTechnique.feeProductHandle || '').trim();\n    if (feeHandle) return (feeProducts.byHandle && feeProducts.byHandle[feeHandle]) || null;\n    const techniqueId = String((this.selectedTechnique && this.selectedTechnique.id) || '').toLowerCase();\n    return (\r\n      techniqueId.indexOf('brod') >= 0\r\n        ? feeProducts.broderie || {}\r\n        : techniqueId.indexOf('floc') >= 0\r\n          ? feeProducts.flocage || {}\r\n          : null\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizeFeeDiscountKey = function (value) {\r\n    return String(value || '').trim().toLowerCase();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFeeDiscountRulesMap = function () {\r\n    return {};\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getAppProxyFeeConfig = function (identity) {\r\n    if (!this.storefrontDiscountConfig || !window.OrionDiscountConfig) return null;\r\n    return window.OrionDiscountConfig.resolveFee(this.storefrontDiscountConfig, identity || {});\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFeeDiscountTiersForVariantHandle = function (variantHandle, variantId) {\r\n    const selectedFeeConfig = this.getSelectedFeeConfig() || {};\r\n    const proxyFee = this.getAppProxyFeeConfig({\r\n      productHandle: selectedFeeConfig.handle,\r\n      variantId: variantId,\r\n      portableId: variantHandle\r\n    });\r\n    return proxyFee && Array.isArray(proxyFee.tiers) ? proxyFee.tiers : [];\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getDiscountPercentForQuantityFromTiers = function (tiers, quantity) {\r\n    const qty = Math.max(1, Math.floor(Number(quantity) || 0));\r\n    const list = Array.isArray(tiers) ? tiers : [];\r\n    let matchedPercent = 0;\r\n\r\n    for (let index = 0; index < list.length; index += 1) {\r\n      const tier = list[index] || {};\r\n      const min = this.toNumericValue(tier.min ?? tier.minQty ?? tier.min_qty ?? tier.quantity_min, 1);\r\n      const max = this.toNumericValue(tier.max ?? tier.max_qty ?? tier.quantity_max, Number.POSITIVE_INFINITY);\r\n      if (!Number.isFinite(min) || qty < min) continue;\r\n      if (Number.isFinite(max) && qty > max) continue;\r\n      matchedPercent = this.getPricingTierDiscountPercent(tier);\r\n    }\r\n\r\n    return Math.max(0, Number(matchedPercent) || 0);\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPendingFeePricingSummary = function () {\r\n    if (this.isPrintMode()) {\r\n      const mainQuantity = Math.max(1, this.getPreviewSelectedSizeQuantity());\r\n      const totals = this.getSelectedPrintOptions().reduce(function (summary, option) {\r\n        const optionQuantity = option.quantityMode === 'fixed' ? 1 : mainQuantity;\r\n        const lineBase = Math.max(0, Math.round(Number(option.price) || 0)) * optionQuantity;\r\n        const feeConfig = this.getAppProxyFeeConfig({\r\n          productHandle: option.optionProductHandle,\r\n          variantSku: option.optionVariantSku,\r\n          variantId: option.variantId\r\n        });\r\n        const discountPercent = this.getDiscountPercentForQuantityFromTiers(\r\n          feeConfig && Array.isArray(feeConfig.tiers) ? feeConfig.tiers : [],\r\n          mainQuantity\r\n        );\r\n        const lineDiscount = Math.min(lineBase, Math.max(0, Math.round(lineBase * discountPercent / 100)));\n        const lineFinal = Math.max(0, lineBase - lineDiscount);\n        summary.base += lineBase;\r\n        summary.final += lineFinal;\r\n        summary.discount += Math.max(0, lineBase - lineFinal);\r\n        summary.weightedPercentNumerator += lineBase * discountPercent;\r\n        return summary;\r\n      }.bind(this), { base: 0, final: 0, discount: 0, weightedPercentNumerator: 0 });\r\n      return {\r\n        totalBaseCents: totals.base,\r\n        totalFinalCents: totals.final,\r\n        totalDiscountCents: totals.discount,\r\n        currentDiscountPercent: totals.base > 0 ? Math.round(totals.weightedPercentNumerator / totals.base) : 0\r\n      };\r\n    }\r\n\r\n    const pendingFeeItems = this.getPendingFeeItems();\r\n    const summary = pendingFeeItems.reduce(\r\n      function (accumulator, item) {\r\n        const variant = this.getFeeVariantById(item && item.id ? item.id : '');\r\n        const unitPrice = Math.max(0, Math.round(Number(variant && variant.price) || 0));\r\n        const quantity = Math.max(0, Math.floor(Number(item && item.quantity) || 0));\r\n        const variantHandle = this.normalizeFeeZoneKey(String(\r\n          (item && item.properties && item.properties._fee_variant_title) ||\r\n          (variant && variant.title) ||\r\n          ''\r\n        ));\r\n        const discountPercent = this.getDiscountPercentForQuantityFromTiers(\r\n          this.getFeeDiscountTiersForVariantHandle(variantHandle, item && item.id),\r\n          quantity\r\n        );\r\n        const lineBaseCents = unitPrice * quantity;\r\n        const lineDiscountCents = Math.min(\n          lineBaseCents,\n          Math.max(0, Math.round(lineBaseCents * discountPercent / 100))\n        );\n        const lineFinalCents = Math.max(0, lineBaseCents - lineDiscountCents);\n        accumulator.totalBaseCents += lineBaseCents;\r\n        accumulator.totalFinalCents += lineFinalCents;\r\n        accumulator.totalDiscountCents += Math.max(0, lineBaseCents - lineFinalCents);\r\n        return accumulator;\r\n      }.bind(this),\r\n      {\r\n        totalBaseCents: 0,\r\n        totalFinalCents: 0,\r\n        totalDiscountCents: 0\r\n      }\r\n    );\r\n\r\n    return {\r\n      totalBaseCents: Math.max(0, Math.round(summary.totalBaseCents || 0)),\r\n      totalFinalCents: Math.max(0, Math.round(summary.totalFinalCents || 0)),\r\n      totalDiscountCents: Math.max(0, Math.round(summary.totalDiscountCents || 0)),\r\n      currentDiscountPercent:\r\n        summary.totalBaseCents > 0\r\n          ? Math.max(0, Math.round((summary.totalDiscountCents / summary.totalBaseCents) * 100))\r\n          : 0\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFeeVariantById = function (variantId) {\r\n    const wantedId = String(variantId || '');\r\n    if (!wantedId) return null;\r\n    return (\r\n      this.getFeeVariantCatalog().find(function (variant) {\r\n        return String(variant && variant.id ? variant.id : '') === wantedId;\r\n      }) || null\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPendingFeeItems = function () {\r\n    if (this.isPrintMode()) return [];\r\n\r\n    const personalizationGroupId = '__preview__';\r\n    const usedZoneIds = this.getBillableDesignObjects()\r\n      .map(function (object) {\r\n        return object && object.zoneId ? String(object.zoneId) : '';\r\n      })\r\n      .filter(Boolean);\r\n    if (!usedZoneIds.length) return [];\r\n    return this.buildTechniqueFeeItems({\r\n      techniqueId: this.selectedTechnique ? this.selectedTechnique.id : '',\r\n      quantity: this.getPreviewSelectedSizeQuantity(),\r\n      personalizationGroupId: personalizationGroupId,\r\n      usedZoneIds: Array.from(new Set(usedZoneIds))\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPendingFeeBaseTotalCents = function () {\r\n    return this.getPendingFeePricingSummary().totalBaseCents;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.readCartEditSessionPayload = function () {\r\n    let raw = '';\r\n    try {\r\n      raw = window.sessionStorage.getItem(CART_EDIT_SESSION_KEY) || '';\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n    if (!raw) return null;\r\n\r\n    let payload = null;\r\n    try {\r\n      payload = JSON.parse(raw);\r\n    } catch (error) {\r\n      payload = null;\r\n    }\r\n\r\n    const sameProduct =\r\n      payload &&\r\n      (\r\n        (payload.productId && Number(payload.productId) === Number(this.config.productId)) ||\r\n        (payload.productHandle && String(payload.productHandle) === String(this.config.productHandle))\r\n      );\r\n\r\n    if (!sameProduct) return null;\r\n\r\n    try {\r\n      window.sessionStorage.removeItem(CART_EDIT_SESSION_KEY);\r\n    } catch (error) {}\r\n\r\n    return payload || null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.restoreCartEditSessionIfNeeded = function () {\r\n    const payload = this.readCartEditSessionPayload();\r\n    if (!payload) return;\r\n\r\n    this.open();\r\n    this.applyCartEditPayload(payload);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyCartEditPayload = function (payload) {\r\n    if (!payload || this.isRestoringCartEdit) return;\r\n    if (payload.personalizationConfigId && !payload.personalizationJson) {\r\n      this.setGlobalBusyOverlay(true, 'Chargement de la personnalisation...');\r\n      window.OrionPersonalizationStore.load(payload.personalizationConfigId, payload.groupId, true)\r\n        .then(function (config) {\r\n          this.applyCartEditPayload(Object.assign({}, payload, {\r\n            personalizationJson: JSON.stringify(config.personalizationJson),\r\n            selectedTechnique: config.technique,\r\n            selectedZone: config.selectedZone || (config.selectedZones || [])[0] || '',\r\n            selectedPrintOptionKeys: config.printOptions || [], printSelection: config.printSelection || payload.printSelection\r\n          }));\r\n        }.bind(this))\r\n        .catch(function (error) { window.alert(error.message); })\r\n        .finally(function () { this.setGlobalBusyOverlay(false, ''); }.bind(this));\r\n      return;\r\n    }\r\n    this.isRestoringCartEdit = true;\r\n\r\n    try {\r\n      this.cartEditContext = {\n        groupId: String(payload.groupId || ''),\n        personalizationConfigId: payload.personalizationConfigId || null,\n        source: 'cart-group'\r\n      };\r\n      this.syncCartEditUi();\r\n\r\n      if (this.isPrintMode() && payload.variantId) {\r\n        const restoredVariant = (this.config.variants || []).find(function (variant) {\r\n          return Number(variant && variant.id) === Number(payload.variantId);\r\n        });\r\n        if (restoredVariant) {\r\n          this.currentVariant = restoredVariant;\r\n          const variantInput = this.form ? this.form.querySelector('input[name=\"id\"]') : null;\r\n          if (variantInput) variantInput.value = String(restoredVariant.id);\r\n          this.refreshPrintConfigurationFromVariant();\r\n        }\r\n      }\r\n\r\n      this.pendingPrintOptionKeys = Array.isArray(payload.selectedPrintOptionKeys)\r\n        ? payload.selectedPrintOptionKeys.map(String)\r\n        : [];\r\n      this.pendingPrintOptionKeys.forEach(function (key) { this.selectedPrintOptionKeys[key] = true; }.bind(this));\r\n      if (this.isPrintMode()) this.renderPrintOptions();\r\n\r\n      if (payload.selectedTechnique) {\r\n        this.applyTechniqueById(String(payload.selectedTechnique));\r\n      }\r\n\r\n      if (payload.activeView) {\r\n        this.setActiveView(String(payload.activeView));\r\n      }\r\n\r\n      if (payload.selectedZone) {\r\n        const zone = this.getZoneById(String(payload.selectedZone));\r\n        if (zone) {\r\n          this.selectedZone = zone;\r\n        }\r\n      }\r\n\r\n      const nextSizeQuantities = {};\r\n      const sizesByVariantId = payload.sizesByVariantId && typeof payload.sizesByVariantId === 'object'\r\n        ? payload.sizesByVariantId\r\n        : {};\r\n      Object.keys(sizesByVariantId).forEach(function (variantId) {\r\n        const qty = Math.max(0, Math.floor(Number(sizesByVariantId[variantId]) || 0));\r\n        if (qty > 0) nextSizeQuantities[String(variantId)] = qty;\r\n      });\r\n      this.sizeQuantities = nextSizeQuantities;\r\n      this.syncSizeQuantitiesWithAvailableVariants();\r\n      this.renderSizesUi();\r\n      this.updatePrice();\r\n\r\n      this.lastBackgroundSyncKey = '';\r\n      Promise.resolve(this.syncBackgroundWithVariant())\r\n        .catch(function () {\r\n          return null;\r\n        })\r\n        .then(\r\n          function () {\r\n            this.applyActiveZoneToCanvas();\r\n\r\n            if (payload.personalizationJson && this.canvasEngine && typeof this.canvasEngine.importJSON === 'function') {\r\n              return this.canvasEngine.importJSON(String(payload.personalizationJson))\r\n                .then(\r\n                  function () {\r\n                    this.restorePrintStyleValuesFromCanvas();\r\n                    this.applyActiveZoneToCanvas();\r\n                    this.renderImpressionsSummary();\r\n                    this.renderImpressionsUi();\r\n                    this.updatePrice();\r\n                    this.captureCartEditInitialState();\r\n                  }.bind(this)\r\n                )\r\n                .catch(function (error) {\r\n                  console.error('restore cart edit personalization error', error);\r\n                })\r\n                .finally(\r\n                  function () {\r\n                    this.isRestoringCartEdit = false;\r\n                  }.bind(this)\r\n                );\r\n            }\r\n\r\n            this.captureCartEditInitialState();\r\n            this.isRestoringCartEdit = false;\r\n            return null;\r\n          }.bind(this)\r\n        );\r\n      return;\r\n    } catch (error) {\r\n      console.error('applyCartEditPayload error', error);\r\n    }\r\n\r\n    this.captureCartEditInitialState();\r\n    this.isRestoringCartEdit = false;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.injectOpenButton = function () {\r\n    const buttonsWrapper = document.querySelector('.product-form__buttons');\r\n    const existing = document.querySelector('.personalized-product-card .js-open-personalizer:not([data-orion-sticky-personalize])');\r\n    if (existing) return existing;\r\n\r\n    const button = document.createElement('button');\r\n    button.type = 'button';\r\n    button.className = 'button button--primary button--full-width personalizer-primary-cta js-open-personalizer';\r\n    button.textContent = 'Personnaliser';\r\n\r\n    const fixedQuantityWrapper = document.querySelector('[data-fixed-quantity-wrapper]');\r\n    if (fixedQuantityWrapper && fixedQuantityWrapper.parentNode) {\r\n      fixedQuantityWrapper.parentNode.insertBefore(button, fixedQuantityWrapper.nextSibling);\r\n      return button;\r\n    }\r\n\r\n    const productInfoContainer = document.querySelector('#ProductInfo-' + String(this.config.sectionId || ''));\r\n    const variantSelects = productInfoContainer\r\n      ? productInfoContainer.querySelector('variant-selects')\r\n      : document.querySelector('variant-selects');\r\n    if (variantSelects && variantSelects.parentNode) {\r\n      variantSelects.parentNode.insertBefore(button, variantSelects.nextSibling);\r\n      return button;\r\n    }\r\n\r\n    if (buttonsWrapper) {\r\n      buttonsWrapper.appendChild(button);\r\n      return button;\r\n    }\r\n\r\n    const fallbackContainer = document.querySelector('.product__info-container');\r\n    if (!fallbackContainer) return null;\r\n\r\n    const fallbackButtons = document.createElement('div');\r\n    fallbackButtons.className = 'product-form__buttons personalizer-launcher__buttons';\r\n    fallbackButtons.appendChild(button);\r\n\r\n    const descriptionNode = fallbackContainer.querySelector('.product__description');\r\n    if (descriptionNode && descriptionNode.parentNode) {\r\n      descriptionNode.parentNode.insertBefore(fallbackButtons, descriptionNode);\r\n    } else {\r\n      fallbackContainer.appendChild(fallbackButtons);\r\n    }\r\n\r\n    return button;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getDefaultMetafieldsConfig = function () {\r\n    if (this.isPrintMode()) {\r\n      return {\r\n        techniques: [\r\n          {\r\n            id: 'impression',\r\n            label: 'Impression'\r\n          }\r\n        ],\r\n        zones: [\r\n          {\r\n            id: 'print-front',\r\n            label: 'Recto',\r\n            view: 'front',\r\n            technique_ids: [],\r\n            width_cm: 8.8,\r\n            height_cm: 5.8,\r\n            x_percent: 0,\r\n            y_percent: 0,\r\n            width_percent: 100,\r\n            height_percent: 100,\r\n            full_image: true\r\n          },\r\n          {\r\n            id: 'print-back',\r\n            label: 'Verso',\r\n            view: 'back',\r\n            technique_ids: [],\r\n            width_cm: 8.8,\r\n            height_cm: 5.8,\r\n            x_percent: 0,\r\n            y_percent: 0,\r\n            width_percent: 100,\r\n            height_percent: 100,\r\n            full_image: true\r\n          }\r\n        ]\r\n      };\r\n    }\r\n\r\n    return {\r\n      techniques: [\r\n        {\r\n          id: 'flocage',\r\n          label: 'Flocage'\r\n        },\r\n        {\r\n          id: 'broderie',\r\n          label: 'Broderie'\r\n        }\r\n      ],\r\n      zones: [\r\n        {\r\n          id: 'broderie-front-coeur',\r\n          label: 'Coeur',\r\n          view: 'front',\r\n          technique_ids: ['broderie'],\r\n          width_cm: 15,\r\n          height_cm: 15,\r\n          price: 9,\r\n          x_percent: 33,\r\n          y_percent: 23,\r\n          width_percent: 16,\r\n          height_percent: 16\r\n        },\r\n        {\r\n          id: 'broderie-front-anti-coeur',\r\n          label: 'Anti-coeur',\r\n          view: 'front',\r\n          technique_ids: ['broderie'],\r\n          width_cm: 15,\r\n          height_cm: 15,\r\n          price: 9,\r\n          x_percent: 51,\r\n          y_percent: 23,\r\n          width_percent: 16,\r\n          height_percent: 16\r\n        },\r\n        {\r\n          id: 'broderie-back-dos',\r\n          label: 'Dos',\r\n          view: 'back',\r\n          technique_ids: ['broderie'],\r\n          width_cm: 30,\r\n          height_cm: 35,\r\n          price: 15,\r\n          x_percent: 31,\r\n          y_percent: 18,\r\n          width_percent: 38,\r\n          height_percent: 44\r\n        },\r\n        {\r\n          id: 'broderie-back-col',\r\n          label: 'Col',\r\n          view: 'back',\r\n          technique_ids: ['broderie'],\r\n          width_cm: 15,\r\n          height_cm: 7,\r\n          price: 9,\r\n          x_percent: 42,\r\n          y_percent: 10,\r\n          width_percent: 16,\r\n          height_percent: 8\r\n        },\r\n        {\r\n          id: 'flocage-front-coeur',\r\n          label: 'Coeur',\r\n          view: 'front',\r\n          technique_ids: ['flocage'],\r\n          width_cm: 15,\r\n          height_cm: 15,\r\n          price: 5,\r\n          constraint_group: 'front-small',\r\n          exclusive_with: ['front-large'],\r\n          x_percent: 33,\r\n          y_percent: 23,\r\n          width_percent: 16,\r\n          height_percent: 16\r\n        },\r\n        {\r\n          id: 'flocage-front-anti-coeur',\r\n          label: 'Anti-coeur',\r\n          view: 'front',\r\n          technique_ids: ['flocage'],\r\n          width_cm: 15,\r\n          height_cm: 15,\r\n          price: 5,\r\n          constraint_group: 'front-small',\r\n          exclusive_with: ['front-large'],\r\n          x_percent: 51,\r\n          y_percent: 23,\r\n          width_percent: 16,\r\n          height_percent: 16\r\n        },\r\n        {\r\n          id: 'flocage-front-a3',\r\n          label: 'Avant A3',\r\n          view: 'front',\r\n          technique_ids: ['flocage'],\r\n          width_cm: 30,\r\n          height_cm: 40,\r\n          price: 13,\r\n          constraint_group: 'front-large',\r\n          exclusive_with: ['front-small', 'front-large'],\r\n          x_percent: 29,\r\n          y_percent: 18,\r\n          width_percent: 42,\r\n          height_percent: 56\r\n        },\r\n        {\r\n          id: 'flocage-front-a4',\r\n          label: 'Avant A4',\r\n          view: 'front',\r\n          technique_ids: ['flocage'],\r\n          width_cm: 20,\r\n          height_cm: 30,\r\n          price: 10,\r\n          constraint_group: 'front-large',\r\n          exclusive_with: ['front-small', 'front-large'],\r\n          x_percent: 36,\r\n          y_percent: 18,\r\n          width_percent: 28,\r\n          height_percent: 42\r\n        },\r\n        {\r\n          id: 'flocage-back-a3',\r\n          label: 'Dos A3',\r\n          view: 'back',\r\n          technique_ids: ['flocage'],\r\n          width_cm: 30,\r\n          height_cm: 40,\r\n          price: 13,\r\n          constraint_group: 'back-large',\r\n          exclusive_with: ['back-large'],\r\n          x_percent: 29,\r\n          y_percent: 18,\r\n          width_percent: 42,\r\n          height_percent: 56\r\n        },\r\n        {\r\n          id: 'flocage-back-a4',\r\n          label: 'Dos A4',\r\n          view: 'back',\r\n          technique_ids: ['flocage'],\r\n          width_cm: 20,\r\n          height_cm: 30,\r\n          price: 10,\r\n          constraint_group: 'back-large',\r\n          exclusive_with: ['back-large'],\r\n          x_percent: 36,\r\n          y_percent: 18,\r\n          width_percent: 28,\r\n          height_percent: 42\r\n        }\r\n      ],\r\n      pricingRules: null\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.bindEvents = function () {\r\n    const self = this;\r\n\r\n    if (this.openButton) {\r\n      this.openButton.addEventListener('click', function () {\r\n        self.openEntryDisclaimer();\r\n      });\r\n    }\r\n\r\n    document.addEventListener('orion:open-personalizer', function (event) {\r\n      const requestedSectionId = String((event.detail && event.detail.sectionId) || '');\r\n      const currentSectionId = String(self.config.sectionId || '');\r\n      if (requestedSectionId && currentSectionId && requestedSectionId !== currentSectionId) return;\r\n      self.openEntryDisclaimer();\r\n    });\r\n\r\n    window.addEventListener('beforeunload', function (event) {\r\n      return self.handleBeforeUnload(event);\r\n    });\r\n\r\n    // Browsers can restore a page from the back/forward cache with its DOM\r\n    // classes intact. Release the lock before caching, then restore it only if\r\n    // the personalizer itself is still visibly open.\r\n    window.addEventListener('pagehide', function () {\r\n      self.unlockBodyScroll();\r\n      self.disableZoomLock();\r\n    });\r\n    window.addEventListener('pageshow', function () {\r\n      self.reconcileBodyScrollLock();\r\n      if (self.modal && self.modal.classList.contains('is-open')) self.enableZoomLock();\r\n    });\r\n\r\n    this.modal.addEventListener('click', function (event) {\r\n      if (event.target.closest('[data-close-modal]')) {\r\n        self.close();\r\n        return;\r\n      }\r\n\r\n      const sidebarViewSwitch = event.target.closest('.personalizer-sidebar [data-view-switch]');\r\n      if (sidebarViewSwitch) {\r\n        self.setActiveView(sidebarViewSwitch.dataset.viewSwitch || 'front', { fromSidebar: true });\r\n        return;\r\n      }\r\n\r\n      const viewSwitch = event.target.closest('[data-view-switch]');\r\n      if (viewSwitch) {\r\n        self.setActiveView(viewSwitch.dataset.viewSwitch || 'front');\r\n        return;\r\n      }\r\n\r\n      const mobileSelectOption = event.target.closest('[data-mobile-select-option]');\r\n      if (mobileSelectOption) {\r\n        event.preventDefault();\r\n        const optionType = String(mobileSelectOption.dataset.mobileSelectType || '');\r\n        const optionValue = String(mobileSelectOption.dataset.value || '');\r\n        if (!optionValue) return;\r\n\r\n        if (optionType === 'text-font') {\r\n          const desktopSelect = self.modal.querySelector('[data-text-panel-font]');\r\n          const mobileSelect = self.modal.querySelector('[data-mobile-text-font-select]');\r\n          if (desktopSelect) desktopSelect.value = optionValue;\r\n          if (mobileSelect) mobileSelect.value = optionValue;\r\n          self.updateSelectedTextStyleFromPanel({ fontFamily: optionValue || 'Rubik' });\r\n          self.renderMobileTextOptionLists();\r\n          return;\r\n        }\r\n\r\n        if (optionType === 'text-color') {\r\n          const desktopSelect = self.modal.querySelector('[data-text-panel-color]');\r\n          const mobileSelect = self.modal.querySelector('[data-mobile-text-color-select]');\r\n          if (desktopSelect) desktopSelect.value = optionValue;\r\n          if (mobileSelect) mobileSelect.value = optionValue;\r\n          if (self.usesSharedMarkingColor()) self.applySharedMarkingColor(optionValue || '#111111');\n          else self.updateSelectedTextStyleFromPanel({ fill: optionValue || '#111111' });\n          self.renderMobileTextOptionLists();\r\n          return;\r\n        }\r\n      }\r\n\r\n      const actionButton = event.target.closest('[data-action]');\r\n      if (!actionButton) return;\r\n\r\n      const action = actionButton.dataset.action;\n      if (!self.isActionAllowedForCurrentView(action)) {\n        event.preventDefault();\n        return;\n      }\n      if (action === 'open-preview-modal') {\r\n        self.openPreviewModal();\r\n        return;\r\n      }\r\n\r\n      if (action === 'preview-close') {\r\n        self.closePreviewModal();\r\n        return;\r\n      }\r\n\r\n      if (action === 'preview-switch-view') {\r\n        const nextPreviewView = actionButton.dataset.previewView || 'front';\r\n        self.setActiveView(nextPreviewView);\r\n        self.setPreviewView(nextPreviewView);\r\n        return;\r\n      }\r\n\r\n      if (action === 'preview-open-bat-info') {\r\n        self.openPreviewBatInfoModal();\r\n        return;\r\n      }\r\n\r\n      if (action === 'preview-bat-info-close') {\r\n        self.closePreviewBatInfoModal();\r\n        return;\r\n      }\r\n\r\n      if (action === 'preview-download-bat') {\r\n        self.downloadBatFromPreview();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-zone-info-modal') {\r\n        self.openZoneInfoModal();\r\n        return;\r\n      }\r\n\r\n      if (action === 'zone-info-close') {\r\n        self.closeZoneInfoModal();\r\n        return;\r\n      }\r\n\r\n      if (action === 'close-flyout') {\r\n        self.closeFlyout();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-sizes-flyout') {\n        self.openFlyout('sizes');\n        return;\n      }\n\n      if (action === 'open-text-placement-flyout') {\r\n        self.openFlyout('text-placement');\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-image-placement-flyout') {\r\n        self.openFlyout('image-placement');\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-text-input-flyout') {\r\n        self.openTextInputFlyout();\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-input-apply') {\r\n        self.applyTextInputFlyoutValue();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-text-align-flyout') {\r\n        const isMobileTextMode = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n        if (isMobileTextMode) {\r\n          if (!self.getSelectedObjectForKind('text')) {\r\n            self.clearSelectionForPanelSwitch();\r\n          }\r\n          self.setControlsPanel('text');\r\n        } else if (self.activeControlsPanel !== 'text') {\r\n          self.clearSelectionForPanelSwitch();\r\n          self.setControlsPanel('text');\r\n          self.ensureTextObjectForPanel();\r\n        } else {\r\n          self.ensureTextObjectForPanel();\r\n        }\r\n        self.openFlyout('text-align');\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-text-font-flyout') {\r\n        self.openTextFontFlyout();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-text-color-flyout') {\r\n        self.openTextColorFlyout();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-text-format-flyout') {\r\n        self.openTextFormatFlyout();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-image-upload-flyout') {\r\n        self.openImageUploadFlyout();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-image-align-flyout') {\r\n        self.openImageAlignFlyout();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-image-picker' || action === 'open-image-panel') {\r\n        self.clearSelectionForPanelSwitch();\r\n        self.prepareNewImageFromPanel();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-text-panel') {\r\n        if (window.matchMedia && window.matchMedia('(max-width: 989px)').matches) {\r\n          self.openTextInputFlyout();\r\n          return;\r\n        }\r\n        self.clearSelectionForPanelSwitch();\r\n        self.setControlsPanel('text');\r\n        self.startNewTextFromPanel();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-qr-panel') {\r\n        self.clearSelectionForPanelSwitch();\r\n        self.setControlsPanel('qr');\r\n        self.startNewQrFromPanel();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-background-panel') {\r\n        if (!self.isPrintMode()) return;\r\n        self.clearSelectionForPanelSwitch();\r\n        self.setControlsPanel('background');\r\n        self.syncBackgroundPanelUi();\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-template-panel') {\r\n        if (!self.isPrintMode()) return;\r\n        self.clearSelectionForPanelSwitch();\r\n        self.setControlsPanel('template');\r\n        self.renderPrintTemplates();\r\n        return;\r\n      }\r\n\r\n      if (action === 'apply-print-template') {\r\n        self.applyPrintTemplateById(actionButton.dataset.templateId || '');\r\n        return;\r\n      }\r\n\r\n      if (action === 'controls-back') {\r\n        if (self.canvasEngine && typeof self.canvasEngine.clearSelection === 'function') {\r\n          self.canvasEngine.clearSelection();\r\n        }\r\n        self.selectedDesignObject = null;\r\n        self.selectedDesignKind = '';\r\n        self.setControlsPanel('default');\r\n        return;\r\n      }\r\n\r\n      if (action === 'panel-select-view') {\r\n        const keepFlyout = self.activeFlyout === 'text-placement' || self.activeFlyout === 'image-placement' ? self.activeFlyout : '';\r\n        self.isApplyingPlacement = true;\r\n        if (keepFlyout) self.preservedFlyoutName = keepFlyout;\r\n        try {\r\n          self.setActiveView(actionButton.dataset.view || 'front');\r\n          self.applyPlacementToActivePanelObject();\r\n          self.renderPanelPlacementControls();\r\n        } finally {\r\n          self.isApplyingPlacement = false;\r\n          self.preservedFlyoutName = '';\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (action === 'panel-select-zone') {\r\n        if (self.isPrintMode()) return;\r\n        const keepFlyout = self.activeFlyout === 'text-placement' || self.activeFlyout === 'image-placement' ? self.activeFlyout : '';\r\n        const zoneId = actionButton.dataset.zoneId || '';\r\n        const targetZone =\r\n          self.getAvailableZonesForCurrentView().find(function (zone) {\r\n            return zone.id === zoneId;\r\n          }) || null;\r\n        if (!targetZone) return;\r\n\r\n        self.isApplyingPlacement = true;\r\n        if (keepFlyout) self.preservedFlyoutName = keepFlyout;\r\n        try {\r\n          self.selectedZone = targetZone;\r\n          self.applyActiveZoneToCanvas();\r\n          self.applyPlacementToActivePanelObject();\r\n          self.updatePrice();\r\n          self.renderPanelPlacementControls();\r\n        } finally {\r\n          self.isApplyingPlacement = false;\r\n          self.preservedFlyoutName = '';\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (action === 'panel-upload-image') {\r\n        const input = self.modal.querySelector('[data-action=\"upload-image\"]');\r\n        if (input) input.click();\r\n        return;\r\n      }\r\n\r\n      if (action === 'remove-image-background') {\r\n        self.removeBackgroundFromSelectedImage(actionButton);\r\n        return;\r\n      }\r\n\r\n      if (action === 'use-recent-image') {\r\n        const imageId = String(actionButton.dataset.imageId || '');\r\n        const cachedImage =\r\n          self.getRecentUploadedImages().find(function (item) {\r\n            return String(item.id || '') === imageId;\r\n          }) || null;\r\n        if (!cachedImage || !cachedImage.sourceDataUrl || !self.canvasEngine || typeof self.canvasEngine.addImageDataUrl !== 'function') {\r\n          return;\r\n        }\r\n        self.pendingImagePlaceholder = null;\r\n        const placement = self.getCurrentUserPlacement();\r\n        self.canvasEngine.addImageDataUrl(cachedImage.sourceDataUrl, {\n          mimeType: cachedImage.mimeType || '',\n          name: cachedImage.name || '',\n          placement: placement\n        }).then(function (result) {\n          if (result && result.object && self.usesSharedMarkingColor()) {\n            self.applySharedMarkingColor(self.sharedMarkingColor);\n          }\n        });\n        const reordered = self.getRecentUploadedImages().filter(function (item) {\r\n          return String(item.id || '') !== imageId;\r\n        });\r\n        reordered.unshift(cachedImage);\r\n        self.setRecentUploadedImages(reordered);\r\n        return;\r\n      }\r\n\r\n      if (action === 'delete-active') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          const selectedObject = self.getSelectedObjectForKind('');\r\n          let deleted = false;\r\n\r\n          if (selectedObject && self.canvasEngine && typeof self.canvasEngine.deleteDesignObject === 'function') {\r\n            deleted = self.canvasEngine.deleteDesignObject(selectedObject);\r\n          }\r\n\r\n          if (!deleted && self.canvasEngine && typeof self.canvasEngine.deleteActiveObject === 'function') {\r\n            self.canvasEngine.deleteActiveObject();\r\n            deleted = true;\r\n          }\r\n\r\n          if (deleted) {\r\n            self.selectedDesignObject = null;\r\n            self.selectedDesignKind = '';\r\n            self.syncTextPanelInputFromSelection();\r\n            self.syncQrPanelInputFromSelection();\r\n          }\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'duplicate-active') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.duplicateSelectedObjectFromPanel();\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-toggle-bold') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.toggleSelectedTextStyleFromPanel('bold');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-toggle-italic') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.toggleSelectedTextStyleFromPanel('italic');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-toggle-underline') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.toggleSelectedTextStyleFromPanel('underline');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-center-horizontal') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.centerSelectedTextInZone('x');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-center-vertical') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.centerSelectedTextInZone('y');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-rotate-right') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.rotateSelectedTextFromPanel(90);\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'text-rotate-left') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.rotateSelectedTextFromPanel(-90);\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'qr-center-horizontal') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.centerSelectedPanelObjectInZone('qr', 'x');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'qr-center-vertical') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.centerSelectedPanelObjectInZone('qr', 'y');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'qr-rotate-right') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.rotateSelectedPanelObjectFromPanel('qr', 90);\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'qr-rotate-left') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.rotateSelectedPanelObjectFromPanel('qr', -90);\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'image-center-horizontal') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.centerSelectedPanelObjectInZone('image', 'x');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'image-center-vertical') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.centerSelectedPanelObjectInZone('image', 'y');\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'image-rotate-right') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.rotateSelectedPanelObjectFromPanel('image', 90);\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'image-rotate-left') {\r\n        self.runWithStickyFlyoutLock(function () {\r\n          self.rotateSelectedPanelObjectFromPanel('image', -90);\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (action === 'modal-add-to-cart') {\r\n        const insideSizesPanel = !!actionButton.closest('[data-controls-panel=\"sizes\"]');\r\n        if (!insideSizesPanel) {\r\n          self.setControlsPanel('sizes');\r\n          return;\r\n        }\r\n        if (!self.hasSelectedSizes()) return;\r\n        self.submitPersonalizedCart();\r\n        return;\r\n      }\r\n\r\n      if (action === 'technique-confirm-ok') {\r\n        self.resolveTechniqueChangeConfirmation(true);\r\n        return;\r\n      }\r\n\r\n      if (action === 'technique-confirm-cancel') {\r\n        self.resolveTechniqueChangeConfirmation(false);\r\n        return;\r\n      }\r\n\r\n      if (action === 'request-close-personalizer') {\r\n        self.close();\r\n        return;\r\n      }\r\n\r\n      if (action === 'entry-disclaimer-confirm') {\r\n        self.closeEntryDisclaimer();\r\n        return;\r\n      }\r\n\r\n      if (action === 'entry-disclaimer-cancel') {\r\n        self.closeEntryDisclaimer();\r\n        return;\r\n      }\r\n\r\n      if (action === 'cart-success-go-cart') {\r\n        self.resolveCartSuccessModal('go-cart');\r\n        return;\r\n      }\r\n\r\n      if (action === 'cart-success-continue') {\r\n        self.resolveCartSuccessModal('continue-shopping');\r\n        return;\r\n      }\r\n\r\n      if (action === 'cart-edit-close-apply') {\r\n        self.closeCartEditCloseConfirm();\r\n        if (!self.hasSelectedSizes()) {\r\n          self.setControlsPanel('sizes');\r\n          return;\r\n        }\r\n        self.submitPersonalizedCart();\r\n        return;\r\n      }\r\n\r\n      if (action === 'cart-edit-close-discard') {\r\n        self.discardCartEditMode();\r\n        self.close({ force: true });\r\n        self.redirectToCart();\r\n        return;\r\n      }\r\n\r\n      if (action === 'abandon-confirm-cancel') {\n        self.closeAbandonConfirm();\n        return;\n      }\n\n      if (action === 'assistance-open') {\n        self.closeAbandonConfirm();\n        if (self.assistanceDialog && typeof self.assistanceDialog.showModal === 'function') {\n          self.assistanceDialog.showModal();\n        }\n        return;\n      }\n\n      if (action === 'abandon-confirm-proceed') {\n        self.closeAbandonConfirm();\r\n        self.discardCurrentPersonalization();\r\n        self.close({ force: true });\r\n        return;\r\n      }\r\n\r\n      if (action === 'out-of-frame-confirm-edit') {\r\n        self.closeOutOfFrameConfirm();\r\n        return;\r\n      }\r\n\r\n      if (action === 'out-of-frame-confirm-proceed') {\r\n        self.closeOutOfFrameConfirm();\r\n        self.submitPersonalizedCart({ skipOutOfFrameConfirm: true });\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-next-step-confirm') {\r\n        const nextStepModal = self.modal.querySelector('[data-next-step-confirm]');\r\n        if (nextStepModal) {\r\n          self.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n          nextStepModal.classList.remove('is-hidden');\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (action === 'next-step-continue' || action === 'next-step-sizes') {\r\n        const nextStepModal = self.modal.querySelector('[data-next-step-confirm]');\r\n        if (nextStepModal) nextStepModal.classList.add('is-hidden');\r\n        self.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n        self.clearSelectionForPanelSwitch();\r\n        self.setControlsPanel(action === 'next-step-sizes' ? 'sizes' : 'default');\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-sizes-panel') {\r\n        const defaultCtaButton = actionButton.matches('.personalizer-primary-cta[data-action=\"open-sizes-panel\"]')\r\n          ? actionButton\r\n          : null;\r\n        if (defaultCtaButton && self.hasSelectedSizes()) {\r\n          self.submitPersonalizedCart();\r\n          return;\r\n        }\r\n        self.clearSelectionForPanelSwitch();\r\n        self.setControlsPanel('sizes');\r\n        return;\r\n      }\r\n\r\n      if (action === 'open-impressions-panel') {\r\n        if (self.isPrintMode()) return;\r\n        if (window.matchMedia && window.matchMedia('(max-width: 989px)').matches) {\r\n          self.setControlsPanel('default');\r\n          self.renderImpressionsUi();\r\n          self.openFlyout('impressions');\r\n          return;\r\n        }\r\n        self.clearSelectionForPanelSwitch();\r\n        self.setControlsPanel('impressions');\r\n        return;\r\n      }\r\n\r\n      if (action === 'set-background-color') {\r\n        self.applyPrintBackgroundColor(actionButton.dataset.color || '#ffffff');\r\n        return;\r\n      }\r\n\r\n      if (action === 'clear-background-color') {\r\n        self.clearPrintBackgroundColor();\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-product-color') {\r\n        if (self.isPrintMode()) return;\r\n        self.setControlsPanel('default');\r\n        self.openColorDropdownFromMobile();\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-text-input') {\r\n        self.focusInControls('[data-text-panel-input]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-text-font') {\r\n        self.focusInControls('[data-text-panel-font]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-text-color') {\r\n        self.focusInControls('[data-text-panel-color]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-qr-input') {\r\n        self.focusInControls('[data-qr-panel-input]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-qr-color') {\r\n        self.focusInControls('[data-qr-panel-color]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-text-format') {\r\n        self.focusInControls('.personalizer-text-toolbar');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-text-zone' || action === 'mobile-focus-text-view') {\r\n        if (self.isPrintMode() && action === 'mobile-focus-text-zone') return;\r\n        if (window.matchMedia && window.matchMedia('(max-width: 989px)').matches) {\r\n          self.openFlyout('text-placement');\r\n          return;\r\n        }\r\n        self.focusInControls('[data-text-panel-zones]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-image-zone' || action === 'mobile-focus-image-view') {\r\n        if (self.isPrintMode() && action === 'mobile-focus-image-zone') return;\r\n        if (window.matchMedia && window.matchMedia('(max-width: 989px)').matches) {\r\n          self.openFlyout('image-placement');\r\n          return;\r\n        }\r\n        self.focusInControls('[data-image-panel-zones]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'mobile-focus-qr-zone' || action === 'mobile-focus-qr-view') {\r\n        if (self.isPrintMode() && action === 'mobile-focus-qr-zone') return;\r\n        self.focusInControls('[data-qr-panel-zones]');\r\n        return;\r\n      }\r\n\r\n      if (action === 'download-bat-pdf') {\r\n        self.downloadPersonalizationBatPdf();\r\n        return;\r\n      }\r\n\r\n      if (action === 'sizes-back') {\r\n        self.setControlsPanel('default');\r\n        return;\r\n      }\r\n\r\n      if (action === 'impressions-back') {\r\n        self.setControlsPanel('default');\r\n        return;\r\n      }\r\n\r\n      if (action === 'impression-select-object') {\r\n        const objectUid = String(actionButton.dataset.objectUid || '');\r\n        self.selectObjectFromImpressionsPanel(objectUid);\r\n        return;\r\n      }\r\n\r\n      if (action === 'impression-delete-object') {\r\n        const objectUid = String(actionButton.dataset.objectUid || '');\r\n        self.deleteObjectFromImpressionsPanel(objectUid);\r\n        return;\r\n      }\r\n\r\n      if (action === 'impression-add-text' || action === 'impression-add-image' || action === 'impression-add-qr') {\r\n        const zoneId = String(actionButton.dataset.impressionZoneId || '');\r\n        const targetView = String(actionButton.dataset.impressionView || 'front');\r\n        const zone = self.getZoneById(zoneId);\n        if (!zone) return;\n\n        self.zoneOverlayRequested = true;\n        self.isApplyingPlacement = true;\n        try {\r\n          self.setActiveView(self.getNavigationViewForPhysicalView(targetView));\r\n          self.selectedZone = zone;\r\n          self.applyActiveZoneToCanvas();\r\n          self.updatePrice();\r\n        } finally {\r\n          self.isApplyingPlacement = false;\r\n        }\r\n\r\n        if (action === 'impression-add-text') {\r\n          self.clearSelectionForPanelSwitch();\r\n          self.setControlsPanel('text');\r\n          self.startNewTextFromPanel();\r\n          return;\r\n        }\r\n\r\n        if (action === 'impression-add-qr') {\r\n          self.clearSelectionForPanelSwitch();\r\n          self.setControlsPanel('qr');\r\n          self.startNewQrFromPanel();\r\n          return;\r\n        }\r\n\r\n        self.clearSelectionForPanelSwitch();\r\n        self.prepareNewImageFromPanel();\r\n        return;\r\n      }\r\n\r\n      if (action === 'size-increase' || action === 'size-decrease') {\r\n        const variantId = String(actionButton.dataset.variantId || '');\r\n        if (!variantId) return;\r\n        const delta = action === 'size-increase' ? 1 : -1;\r\n        self.adjustSizeQuantity(variantId, delta);\r\n        return;\r\n      }\r\n    });\r\n\r\n    const uploadInput = this.modal.querySelector('[data-action=\"upload-image\"]');\r\n    if (uploadInput) {\r\n      uploadInput.addEventListener('change', function (event) {\n        if (!self.isToolAllowedForCurrentView('image')) {\n          self.pendingImagePlaceholder = null;\r\n          event.target.value = '';\r\n          return;\r\n        }\r\n        const file = event.target.files && event.target.files[0];\r\n        const maxUploadSizeBytes = 32 * 1024 * 1024;\n        if (!file) {\r\n          self.pendingImagePlaceholder = null;\r\n          event.target.value = '';\r\n          return;\r\n        }\r\n        if (Number(file.size) > maxUploadSizeBytes) {\n          window.alert(\"Le fichier depasse la taille maximale autorisee de 32 Mo.\");\r\n          self.pendingImagePlaceholder = null;\r\n          event.target.value = '';\r\n          return;\r\n        }\r\n        const placeholder = self.pendingImagePlaceholder;\r\n        self.pendingImagePlaceholder = null;\r\n        const placement = self.pendingUserPlacement || self.getCurrentUserPlacement();\r\n        self.pendingUserPlacement = null;\r\n        const addPromise = self.canvasEngine.addImageFile(file, { targetPlaceholder: placeholder, placement: placement });\r\n        if (addPromise && typeof addPromise.then === 'function') {\r\n          addPromise.then(function (result) {\n            self.rememberUploadedImage(result, file);\n            if (result && result.object && self.usesSharedMarkingColor()) {\n              self.applySharedMarkingColor(self.sharedMarkingColor);\n            }\n          });\n        }\r\n        event.target.value = '';\r\n      });\r\n    }\r\n\r\n    const textPanelInput = this.modal.querySelector('[data-text-panel-input]');\r\n    if (textPanelInput) {\r\n      textPanelInput.addEventListener('input', function (event) {\r\n        self.updateSelectedTextFromPanel(event.target.value || '');\r\n      });\r\n    }\r\n\r\n    const textPanelColorSelect = this.modal.querySelector('[data-text-panel-color]');\r\n    if (textPanelColorSelect) {\n      textPanelColorSelect.addEventListener('change', function (event) {\n        const color = event.target.value || '#111111';\n        if (self.usesSharedMarkingColor()) self.applySharedMarkingColor(color);\n        else self.updateSelectedTextStyleFromPanel({ fill: color });\n      });\n    }\r\n\r\n    const qrPanelInput = this.modal.querySelector('[data-qr-panel-input]');\r\n    if (qrPanelInput) {\r\n      qrPanelInput.addEventListener('input', function (event) {\r\n        self.updateSelectedQrFromPanel(event.target.value || '');\r\n      });\r\n    }\r\n\r\n    const qrPanelColorSelect = this.modal.querySelector('[data-qr-panel-color]');\r\n    if (qrPanelColorSelect) {\n      qrPanelColorSelect.addEventListener('change', function (event) {\n        const color = event.target.value || '#111111';\n        if (self.usesSharedMarkingColor()) self.applySharedMarkingColor(color);\n        else self.updateSelectedQrStyleFromPanel({ fill: color });\n      });\n    }\r\n\r\n    const backgroundColorMap = this.modal.querySelector('[data-background-color-map]');\r\n    if (backgroundColorMap) {\r\n      const applyFromPointer = function (event) {\r\n        const rect = backgroundColorMap.getBoundingClientRect();\r\n        if (!rect.width || !rect.height) return;\r\n        const saturation = Math.max(0, Math.min(1, (event.clientX - rect.left) / rect.width));\r\n        const value = Math.max(0, Math.min(1, 1 - ((event.clientY - rect.top) / rect.height)));\r\n        const state = self.getBackgroundPickerState();\r\n        const rgb = self.hsvToRgb(state.h, saturation, value);\r\n        self.applyPrintBackgroundColor(self.rgbToHex(rgb.r, rgb.g, rgb.b), {\r\n          pickerState: { h: state.h, s: saturation, v: value }\r\n        });\r\n      };\r\n      backgroundColorMap.addEventListener('pointerdown', function (event) {\r\n        event.preventDefault();\r\n        backgroundColorMap.setPointerCapture(event.pointerId);\r\n        applyFromPointer(event);\r\n      });\r\n      backgroundColorMap.addEventListener('pointermove', function (event) {\r\n        if (!backgroundColorMap.hasPointerCapture(event.pointerId)) return;\r\n        applyFromPointer(event);\r\n      });\r\n    }\r\n\r\n    const backgroundHueInput = this.modal.querySelector('[data-background-hue-input]');\r\n    if (backgroundHueInput) {\r\n      backgroundHueInput.addEventListener('input', function (event) {\r\n        const state = self.getBackgroundPickerState();\r\n        const hue = Math.max(0, Math.min(360, Math.round(Number(event.target.value) || 0)));\r\n        const rgb = self.hsvToRgb(hue, state.s, state.v);\r\n        self.applyPrintBackgroundColor(self.rgbToHex(rgb.r, rgb.g, rgb.b), {\r\n          pickerState: { h: hue, s: state.s, v: state.v }\r\n        });\r\n      });\r\n    }\r\n\r\n    const backgroundHexInput = this.modal.querySelector('[data-background-hex-input]');\r\n    if (backgroundHexInput) {\r\n      backgroundHexInput.addEventListener('input', function (event) {\r\n        const normalized = self.normalizeHexColor(event.target.value || '');\r\n        if (normalized) self.applyPrintBackgroundColor(normalized);\r\n      });\r\n      backgroundHexInput.addEventListener('blur', function (event) {\r\n        self.syncBackgroundPanelUi(self.normalizeHexColor(event.target.value || '') || undefined);\r\n      });\r\n    }\r\n\r\n    this.modal.querySelectorAll('[data-background-rgb-input]').forEach(function (input) {\r\n      input.addEventListener('input', function () {\r\n        const values = self.getBackgroundRgbInputs();\r\n        self.applyPrintBackgroundColor(self.rgbToHex(values.r, values.g, values.b));\r\n      });\r\n    });\r\n\r\n    const textPanelFontSelect = this.modal.querySelector('[data-text-panel-font]');\r\n    if (textPanelFontSelect) {\r\n      textPanelFontSelect.addEventListener('change', function (event) {\r\n        self.updateSelectedTextStyleFromPanel({ fontFamily: event.target.value || 'Rubik' });\r\n      });\r\n    }\r\n\r\n    const mobileTextFontSelect = this.modal.querySelector('[data-mobile-text-font-select]');\r\n    if (mobileTextFontSelect) {\r\n      mobileTextFontSelect.addEventListener('change', function (event) {\r\n        self.updateSelectedTextStyleFromPanel({ fontFamily: event.target.value || 'Rubik' });\r\n      });\r\n    }\r\n\r\n    const mobileTextColorSelect = this.modal.querySelector('[data-mobile-text-color-select]');\r\n    if (mobileTextColorSelect) {\n      mobileTextColorSelect.addEventListener('change', function (event) {\n        const color = event.target.value || '#111111';\n        if (self.usesSharedMarkingColor()) self.applySharedMarkingColor(color);\n        else self.updateSelectedTextStyleFromPanel({ fill: color });\n      });\n    }\r\n\r\n    const textPanelSizeRange = this.modal.querySelector('[data-text-panel-size]');\r\n    if (textPanelSizeRange) {\r\n      textPanelSizeRange.addEventListener('input', function (event) {\r\n        const nextSize = Number(event.target.value || 34);\r\n        self.updateSelectedTextStyleFromPanel({ fontSize: nextSize });\r\n      });\r\n    }\r\n\r\n    const mobileTextSizeRange = this.modal.querySelector('[data-mobile-text-size]');\r\n    if (mobileTextSizeRange) {\r\n      mobileTextSizeRange.addEventListener('input', function (event) {\r\n        const nextSize = Number(event.target.value || 34);\r\n        self.updateSelectedTextStyleFromPanel({ fontSize: nextSize });\r\n        const desktopRange = self.modal.querySelector('[data-text-panel-size]');\r\n        if (desktopRange) desktopRange.value = String(nextSize);\r\n      });\r\n    }\r\n\r\n    const techniquesContainers = this.modal.querySelectorAll('[data-techniques], [data-techniques-mobile]');\r\n    techniquesContainers.forEach(function (techniquesContainer) {\r\n      techniquesContainer.addEventListener('click', function (event) {\r\n        const button = event.target.closest('[data-technique-id]');\r\n        if (!button) return;\r\n\r\n        const targetId = button.dataset.techniqueId;\r\n        const currentTechniqueId = self.selectedTechnique && self.selectedTechnique.id ? self.selectedTechnique.id : '';\r\n        const isTechniqueChanging = !!currentTechniqueId && targetId !== currentTechniqueId;\r\n        if (isTechniqueChanging) {\r\n          self.openTechniqueChangeConfirmation(function () {\r\n            self.selectedDesignObject = null;\r\n            self.selectedDesignKind = '';\r\n            self.applyTechniqueById(targetId);\r\n          });\r\n          return;\r\n        }\r\n\r\n        self.applyTechniqueById(targetId);\r\n      });\r\n    });\r\n\r\n    const positionContainer = this.modal.querySelector('[data-position-presets]');\r\n    if (positionContainer) {\r\n      positionContainer.addEventListener('click', function (event) {\r\n        const button = event.target.closest('[data-position-zone-id]');\r\n        if (!button) return;\r\n\r\n        const zoneId = button.dataset.positionZoneId;\r\n        const zones = self.getAvailableZonesForCurrentView();\r\n        const targetZone = zones.find(function (zone) {\r\n          return zone.id === zoneId;\r\n        });\r\n        if (!targetZone) return;\r\n\r\n        self.selectedZone = targetZone;\r\n        self.renderPositionPresets();\r\n        self.applyActiveZoneToCanvas();\r\n        self.canvasEngine.centerActiveObjectInZone(targetZone);\r\n        self.updatePrice();\r\n      });\r\n    }\r\n\r\n    const colorsContainers = this.modal.querySelectorAll('[data-colors], [data-colors-mobile]');\r\n    colorsContainers.forEach(function (colorsContainer) {\r\n      colorsContainer.addEventListener('click', function (event) {\r\n        const optionButton = event.target.closest('[data-color-option]');\r\n        if (optionButton) {\r\n          event.preventDefault();\r\n          const colorName = String(optionButton.dataset.colorOption || '');\r\n          const dropdown = optionButton.closest('[data-color-dropdown]');\r\n          if (dropdown) {\r\n            dropdown.classList.remove('is-open');\r\n            const toggle = dropdown.querySelector('[data-color-dropdown-toggle]');\r\n            if (toggle) toggle.setAttribute('aria-expanded', 'false');\r\n          }\r\n          if (colorName) self.syncVariantFromModalColor(colorName);\r\n          return;\r\n        }\r\n\r\n        const toggleButton = event.target.closest('[data-color-dropdown-toggle]');\r\n        if (toggleButton) {\r\n          event.preventDefault();\r\n          const dropdown = toggleButton.closest('[data-color-dropdown]');\r\n          if (!dropdown) return;\r\n          const willOpen = !dropdown.classList.contains('is-open');\r\n          self.modal.querySelectorAll('[data-color-dropdown].is-open').forEach(function (node) {\r\n            if (node !== dropdown) {\r\n              node.classList.remove('is-open');\r\n              const otherToggle = node.querySelector('[data-color-dropdown-toggle]');\r\n              if (otherToggle) otherToggle.setAttribute('aria-expanded', 'false');\r\n            }\r\n          });\r\n          dropdown.classList.toggle('is-open', willOpen);\r\n          toggleButton.setAttribute('aria-expanded', willOpen ? 'true' : 'false');\r\n          return;\r\n        }\r\n\r\n        if (!event.target.closest('[data-color-dropdown]')) {\r\n          self.modal.querySelectorAll('[data-color-dropdown].is-open').forEach(function (node) {\r\n            node.classList.remove('is-open');\r\n            const toggle = node.querySelector('[data-color-dropdown-toggle]');\r\n            if (toggle) toggle.setAttribute('aria-expanded', 'false');\r\n          });\r\n        }\r\n      });\r\n    });\r\n\r\n    document.addEventListener('click', function (event) {\r\n      if (!self.modal || !self.modal.classList.contains('is-open')) return;\r\n      if (event.target && event.target.closest && event.target.closest('[data-color-dropdown]')) return;\r\n      self.modal.querySelectorAll('[data-color-dropdown].is-open').forEach(function (node) {\r\n        node.classList.remove('is-open');\r\n        const toggle = node.querySelector('[data-color-dropdown-toggle]');\r\n        if (toggle) toggle.setAttribute('aria-expanded', 'false');\r\n      });\r\n    });\r\n\r\n    const impressionsLists = this.modal.querySelectorAll('[data-impressions-list], [data-impressions-list-sidebar]');\r\n    impressionsLists.forEach(function (impressionsList) {\r\n      impressionsList.addEventListener('pointerdown', function (event) {\r\n        if (!event || event.pointerType === 'mouse') return;\r\n        const dragHandle = event.target.closest('.personalizer-impression-row__drag-handle');\r\n        if (!dragHandle) return;\r\n        const rowNode = dragHandle.closest('[data-impression-drag]');\r\n        if (!rowNode) return;\r\n        self.suppressNextImpressionClick = false;\r\n        event.preventDefault();\r\n        self.beginImpressionTouchDrag(impressionsList, rowNode, event, { immediateStart: true });\r\n      });\r\n\r\n      impressionsList.addEventListener('pointermove', function (event) {\r\n        const touchState = self.impressionTouchState;\r\n        if (!touchState || touchState.pointerId !== event.pointerId) return;\r\n\r\n        if (!touchState.isDragging) {\r\n          const deltaX = Math.abs((Number(event.clientX) || 0) - touchState.startX);\r\n          const deltaY = Math.abs((Number(event.clientY) || 0) - touchState.startY);\r\n          if (deltaX > 8 || deltaY > 8) {\r\n            self.resetImpressionTouchState();\r\n          }\r\n          return;\r\n        }\r\n\r\n        event.preventDefault();\r\n        self.updateImpressionTouchDropTarget(event.clientX, event.clientY);\r\n      });\r\n\r\n      impressionsList.addEventListener('pointerup', function (event) {\r\n        const touchState = self.impressionTouchState;\r\n        if (!touchState || touchState.pointerId !== event.pointerId) return;\r\n        const handled = self.finishImpressionTouchDrag(event);\r\n        if (handled) {\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n        }\r\n      });\r\n\r\n      impressionsList.addEventListener('pointercancel', function (event) {\r\n        const touchState = self.impressionTouchState;\r\n        if (!touchState || touchState.pointerId !== event.pointerId) return;\r\n        self.finishImpressionTouchDrag(event);\r\n      });\r\n\r\n      impressionsList.addEventListener('click', function (event) {\r\n        if (self.suppressNextImpressionClick) {\r\n          self.suppressNextImpressionClick = false;\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n          return;\r\n        }\r\n        const dragHandle = event.target.closest('.personalizer-impression-row__drag-handle');\r\n        if (dragHandle) {\r\n          const rowNode = dragHandle.closest('[data-impression-drag]');\r\n          const objectUid = rowNode ? String(rowNode.dataset.objectUid || '') : '';\r\n          if (!objectUid) return;\r\n          if (self.draggingImpressionUid === objectUid) {\r\n            self.clearPendingImpressionMove();\r\n            return;\r\n          }\r\n          self.setPendingImpressionMove(objectUid);\r\n          return;\r\n        }\r\n\r\n        const row = event.target.closest('[data-impression-drag]');\r\n        if (row && !event.target.closest('[data-action]')) {\r\n          const objectUid = String(row.dataset.objectUid || '');\r\n          if (objectUid) {\r\n            self.clearPendingImpressionMove();\r\n            self.selectObjectFromImpressionsPanel(objectUid, { keepImpressionsPanel: true });\r\n            return;\r\n          }\r\n        }\r\n\r\n        const zoneNode = event.target.closest('[data-impression-drop-zone]');\r\n        if (!zoneNode) return;\r\n        if (event.target.closest('[data-action]')) return;\r\n        if (event.target.closest('[data-impression-drag]')) return;\r\n        const zoneId = String(zoneNode.dataset.impressionZoneId || '');\r\n        const view = String(zoneNode.dataset.impressionView || 'front');\r\n        if (self.draggingImpressionUid) {\r\n          self.moveImpressionObjectToZone(self.draggingImpressionUid, zoneId, view);\r\n          return;\r\n        }\r\n        self.selectZoneFromImpressionsPanel(zoneId, view);\r\n      });\r\n\r\n      impressionsList.addEventListener('dragstart', function (event) {\r\n        const dragNode = event.target.closest('[data-impression-drag]');\r\n        if (!dragNode) return;\r\n        const objectUid = String(dragNode.dataset.objectUid || '');\r\n        if (!objectUid) return;\r\n        self.setPendingImpressionMove(objectUid);\r\n        if (event.dataTransfer) {\r\n          event.dataTransfer.effectAllowed = 'move';\r\n          event.dataTransfer.setData('text/plain', objectUid);\r\n        }\r\n      });\r\n\r\n      impressionsList.addEventListener('dragend', function () {\r\n        self.clearPendingImpressionMove();\r\n      });\r\n\r\n      impressionsList.addEventListener('dragover', function (event) {\r\n        const dropZone = event.target.closest('[data-impression-drop-zone]');\r\n        if (!dropZone) return;\r\n        const objectUid = self.draggingImpressionUid || (event.dataTransfer ? event.dataTransfer.getData('text/plain') : '');\r\n        const object = objectUid ? self.getDesignObjectByUid(objectUid) : null;\r\n        const zoneId = String(dropZone.dataset.impressionZoneId || '');\r\n        const view = String(dropZone.dataset.impressionView || 'front');\r\n        if (!object || !zoneId || !self.isZoneAllowedForObject(zoneId, view, object)) {\r\n          dropZone.classList.remove('is-drop-target');\r\n          return;\r\n        }\r\n        event.preventDefault();\r\n        if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\r\n        self.clearImpressionDropTargets();\r\n        dropZone.classList.add('is-drop-target');\r\n      });\r\n\r\n      impressionsList.addEventListener('dragleave', function (event) {\r\n        const dropZone = event.target.closest('[data-impression-drop-zone]');\r\n        if (!dropZone) return;\r\n        if (dropZone.contains(event.relatedTarget)) return;\r\n        dropZone.classList.remove('is-drop-target');\r\n      });\r\n\r\n      impressionsList.addEventListener('drop', function (event) {\r\n        const dropZone = event.target.closest('[data-impression-drop-zone]');\r\n        if (!dropZone) return;\r\n        event.preventDefault();\r\n        const objectUid = self.draggingImpressionUid || (event.dataTransfer ? event.dataTransfer.getData('text/plain') : '');\r\n        const zoneId = String(dropZone.dataset.impressionZoneId || '');\r\n        const view = String(dropZone.dataset.impressionView || 'front');\r\n        self.clearImpressionDropTargets();\r\n        if (!objectUid || !zoneId) return;\r\n        self.moveImpressionObjectToZone(objectUid, zoneId, view);\r\n      });\r\n    });\r\n\r\n    if (this.canvasZoomRangeInput) {\r\n      this.canvasZoomRangeInput.addEventListener('input', function (event) {\r\n        if (!self.isCanvasZoomEnabled()) return;\r\n        const nextZoom = Number(event.target.value || 1);\r\n        if (!self.canvasEngine || typeof self.canvasEngine.setManualZoom !== 'function') return;\r\n        const appliedZoom = self.canvasEngine.setManualZoom(nextZoom, { zone: self.selectedZone || null });\r\n        event.target.value = String(appliedZoom);\r\n        self.syncCanvasZoomValue(appliedZoom);\r\n      });\r\n    }\r\n\r\n    const applyZoomStep = function (direction) {\r\n      if (!self.isCanvasZoomEnabled()) return;\r\n      if (!self.canvasEngine || typeof self.canvasEngine.setManualZoom !== 'function') return;\r\n      const currentZoom =\r\n        typeof self.canvasEngine.getManualZoom === 'function'\r\n          ? Number(self.canvasEngine.getManualZoom() || 1)\r\n          : Number(self.canvasZoomRangeInput && self.canvasZoomRangeInput.value) || 1;\r\n      const step = 0.1;\r\n      const appliedZoom = self.canvasEngine.setManualZoom(currentZoom + direction * step, {\r\n        zone: self.selectedZone || null\r\n      });\r\n      if (self.canvasZoomRangeInput) self.canvasZoomRangeInput.value = String(appliedZoom);\r\n      self.syncCanvasZoomValue(appliedZoom);\r\n    };\r\n\r\n    if (this.canvasZoomDecreaseButton) {\r\n      this.canvasZoomDecreaseButton.addEventListener('click', function () {\r\n        applyZoomStep(-1);\r\n      });\r\n    }\r\n\r\n    if (this.canvasZoomIncreaseButton) {\r\n      this.canvasZoomIncreaseButton.addEventListener('click', function () {\r\n        applyZoomStep(1);\r\n      });\r\n    }\r\n\r\n    if (this.canvasZoomResetButton) {\r\n      this.canvasZoomResetButton.addEventListener('click', function () {\r\n        if (!self.isCanvasZoomEnabled()) return;\r\n        if (!self.canvasEngine || typeof self.canvasEngine.resetZoom !== 'function') return;\r\n        self.canvasEngine.resetZoom();\r\n        if (self.canvasZoomRangeInput && typeof self.canvasEngine.getManualZoom === 'function') {\r\n          self.canvasZoomRangeInput.value = String(self.canvasEngine.getManualZoom());\r\n        }\r\n      });\r\n    }\r\n\r\n    if (this.canvasDimensionsToggleButton) {\r\n      this.canvasDimensionsToggleButton.addEventListener('click', function () {\r\n        if (!self.isDimensionsToolEnabled()) return;\r\n        self.isDimensionsVisible = !self.isDimensionsVisible;\r\n        self.syncDimensionsToolUi();\r\n      });\r\n    }\r\n\r\n    document.addEventListener('keydown', function (event) {\r\n      if (!self.modal.classList.contains('is-open')) return;\r\n\r\n      if (event.key === 'Escape') {\r\n        self.modal.querySelectorAll('[data-color-dropdown].is-open').forEach(function (node) {\r\n          node.classList.remove('is-open');\r\n          const toggle = node.querySelector('[data-color-dropdown-toggle]');\r\n          if (toggle) toggle.setAttribute('aria-expanded', 'false');\r\n        });\r\n      }\r\n\r\n      if (event.key === 'Escape') {\r\n        if (self.activeFlyout) {\r\n          self.closeFlyout();\r\n          return;\r\n        }\r\n        if (self.activeControlsPanel && self.activeControlsPanel !== 'default') {\r\n          self.setControlsPanel('default');\r\n          return;\r\n        }\r\n        self.close();\r\n        return;\r\n      }\r\n\r\n      const active = document.activeElement;\r\n      const isTyping =\r\n        active &&\r\n        (active.tagName === 'INPUT' || active.tagName === 'TEXTAREA' || active.isContentEditable === true);\r\n\r\n      if (!isTyping && self.handleDirectTypingForSelectedText(event)) {\r\n        return;\r\n      }\r\n\r\n      if ((event.key === 'Delete' || event.key === 'Backspace') && !isTyping) {\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        const deleted =\r\n          self.canvasEngine &&\r\n          typeof self.canvasEngine.deleteActiveObject === 'function' &&\r\n          self.canvasEngine.deleteActiveObject();\r\n\r\n        if (deleted) {\r\n          self.selectedDesignObject = null;\r\n          self.selectedDesignKind = '';\r\n          self.syncTextPanelInputFromSelection();\r\n          self.syncCanvasZoomUi();\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (!isTyping && (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\r\n        const step = event.shiftKey ? 10 : 1;\r\n        let deltaX = 0;\r\n        let deltaY = 0;\r\n\r\n        if (event.key === 'ArrowLeft') deltaX = -step;\r\n        if (event.key === 'ArrowRight') deltaX = step;\r\n        if (event.key === 'ArrowUp') deltaY = -step;\r\n        if (event.key === 'ArrowDown') deltaY = step;\r\n\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        const nudged =\r\n          self.canvasEngine &&\r\n          typeof self.canvasEngine.nudgeActiveObject === 'function' &&\r\n          self.canvasEngine.nudgeActiveObject(deltaX, deltaY);\r\n\r\n        if (nudged) {\r\n          if (typeof self.canvasEngine.getActiveDesignObject === 'function') {\r\n            self.selectedDesignObject = self.canvasEngine.getActiveDesignObject() || null;\r\n          }\r\n          self.selectedDesignKind = self.getActiveDesignObjectKind();\r\n          if (self.selectedDesignKind === 'text') {\r\n            self.syncTextPanelInputFromSelection();\r\n          } else if (self.selectedDesignKind === 'qr') {\r\n            self.syncQrPanelInputFromSelection();\r\n          }\r\n        }\r\n      }\r\n    });\r\n\r\n    document.addEventListener('change', function (event) {\r\n      if (event.target.matches('[data-print-option-input]')) {\r\n        const key = String(event.target.value || '');\r\n        if (event.target.type === 'radio' && event.target.checked) {\r\n          const name = event.target.name;\r\n          self.modal.querySelectorAll('[data-print-option-input][name=\"' + CSS.escape(name) + '\"]').forEach(function (input) {\r\n            if (input !== event.target) delete self.selectedPrintOptionKeys[String(input.value || '')];\r\n          });\r\n        }\r\n        if (event.target.checked) self.selectedPrintOptionKeys[key] = true;\r\n        else delete self.selectedPrintOptionKeys[key];\r\n        self.renderPrintOptionsSummary();\r\n        self.updatePrice();\r\n        return;\r\n      }\r\n      if (event.target.matches('[data-size-quantity-input]')) {\r\n        const variantId = String(event.target.getAttribute('data-variant-id') || '');\r\n        if (!variantId) return;\r\n        self.handleSizeQuantityInputCommit(event.target, variantId);\r\n        return;\r\n      }\r\n      if (\r\n        event.target.matches('input[name=\"id\"]') ||\r\n        event.target.matches('.product-form__input input') ||\r\n        event.target.matches('.quantity__input') ||\r\n        event.target.closest('variant-selects') ||\r\n        event.target.closest('variant-radios')\r\n      ) {\r\n        window.requestAnimationFrame(function () {\r\n          self.syncFromProductState();\r\n        });\r\n      }\r\n    });\r\n\r\n    document.addEventListener('input', function (event) {\r\n      if (!event.target.matches('[data-size-quantity-input]')) return;\r\n      const input = event.target;\r\n      const sanitized = String(input.value || '').replace(/[^\\d]/g, '');\r\n      if (input.value !== sanitized) input.value = sanitized;\r\n      if (self.isPrintMode()) {\r\n        const variantId = String(input.getAttribute('data-variant-id') || '');\r\n        if (!variantId) return;\r\n        const nextValue = sanitized === '' ? 0 : Math.max(0, Math.floor(Number(sanitized) || 0));\r\n        if (nextValue > 0) {\r\n          self.sizeQuantities[variantId] = nextValue;\r\n        } else {\r\n          delete self.sizeQuantities[variantId];\r\n        }\r\n        const totalNode = self.modal && self.modal.querySelector('[data-size-total-label]');\r\n        if (totalNode) {\r\n          totalNode.textContent = nextValue + ' produit' + (nextValue === 1 ? '' : 's');\r\n        }\r\n        self.updatePrice();\n        self.modal.querySelectorAll('[data-action=\"modal-add-to-cart\"]').forEach(function (button) {\n          const personalizationQuantityValid = self.isPersonalizationQuantityValid();\n          const canUseButton = nextValue > 0 && personalizationQuantityValid && !self.isSubmittingCart && !button.hasAttribute('data-loading-lock');\n          button.disabled = !canUseButton;\n          button.setAttribute('aria-disabled', canUseButton ? 'false' : 'true');\n          button.classList.toggle('is-disabled', !canUseButton);\n        });\n        self.syncCustomizationQuantityUi();\n      }\r\n    });\r\n\r\n    document.addEventListener('blur', function (event) {\r\n      if (!event.target.matches('[data-size-quantity-input]')) return;\r\n      const variantId = String(event.target.getAttribute('data-variant-id') || '');\r\n      if (!variantId) return;\r\n      self.handleSizeQuantityInputCommit(event.target, variantId);\r\n    }, true);\r\n\r\n    if (typeof subscribe === 'function' && typeof PUB_SUB_EVENTS !== 'undefined') {\r\n      subscribe(PUB_SUB_EVENTS.variantChange, function () {\r\n        self.syncFromProductState();\r\n      });\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncFromProductState = function () {\r\n    if (!this.form || !document.body.contains(this.form)) {\r\n      this.form = document.querySelector('form[data-type=\"add-to-cart-form\"]');\r\n    }\r\n\r\n    if (!this.openButton || !document.body.contains(this.openButton)) {\r\n      this.openButton = this.injectOpenButton();\r\n      if (this.openButton) {\r\n        this.openButton.addEventListener(\r\n          'click',\r\n          function () {\r\n            this.openEntryDisclaimer();\r\n          }.bind(this)\r\n        );\r\n      }\r\n    }\r\n\r\n    const variantInput = this.form ? this.form.querySelector('input[name=\"id\"]') : null;\r\n    const quantityInput = document.querySelector('[data-fixed-quantity-select]') || document.querySelector('.quantity__input');\r\n    let variantId = Number(variantInput && variantInput.value);\r\n\r\n    if (!Number.isFinite(variantId) || variantId <= 0) {\r\n      const selectedVariantScript = document.querySelector('variant-selects [data-selected-variant]');\r\n      if (selectedVariantScript) {\r\n        try {\r\n          const variantPayload = JSON.parse(selectedVariantScript.textContent || '{}');\r\n          const fromScript = Number(variantPayload && variantPayload.id);\r\n          if (Number.isFinite(fromScript) && fromScript > 0) {\r\n            variantId = fromScript;\r\n          }\r\n        } catch (error) {\r\n          // Ignore malformed selected-variant payload.\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!Number.isFinite(variantId) || variantId <= 0) {\r\n      const fromQuery = Number(new URLSearchParams(window.location.search).get('variant'));\r\n      if (Number.isFinite(fromQuery) && fromQuery > 0) {\r\n        variantId = fromQuery;\r\n      }\r\n    }\r\n\r\n    const previousVariantId = this.currentVariant && this.currentVariant.id ? String(this.currentVariant.id) : '';\r\n    const previousPrintQuantity = previousVariantId ? this.getSizeQuantityByVariantId(previousVariantId) : 0;\r\n    this.currentVariant =\r\n      (this.config.variants || []).find(function (variant) {\r\n        return Number(variant.id) === variantId;\r\n      }) ||\r\n      (this.config.variants || []).find(\r\n        function (variant) {\r\n          return Number(variant.id) === Number(this.config.selectedVariantId);\r\n        }.bind(this)\r\n      ) ||\r\n      null;\r\n\r\n    if (this.isPrintMode() && this.printConfig) {\r\n      this.refreshPrintConfigurationFromVariant();\r\n      const nextVariantId = this.currentVariant && this.currentVariant.id ? String(this.currentVariant.id) : '';\r\n      if (previousPrintQuantity > 0 && nextVariantId && nextVariantId !== previousVariantId) {\r\n        this.sizeQuantities = { [nextVariantId]: previousPrintQuantity };\r\n      }\r\n    }\r\n\r\n    this.currentQuantity = Math.max(1, Number(quantityInput && quantityInput.value) || 1);\r\n    if (this.config.hasFixedQuantity && this.currentVariant && this.currentVariant.id) {\r\n      this.sizeQuantities = { [String(this.currentVariant.id)]: this.currentQuantity };\r\n    }\r\n    this.activeColorName = window.PersonalizerMetafields.getVariantColorValue(\r\n      this.currentVariant,\r\n      this.config.options || []\r\n    );\r\n    if (!this.activeColorName && this.colors.length) this.activeColorName = this.colors[0].name;\r\n\r\n    this.renderColors();\r\n    this.renderPositionPresets();\r\n    this.applyActiveZoneToCanvas();\r\n    this.syncBackgroundWithVariant();\r\n    this.syncSizeQuantitiesWithAvailableVariants();\r\n    this.renderSizesUi();\r\n    this.updatePrice();\r\n    this.renderFixedQuantityProductPricing();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSizeOptionIndex = function () {\n    const options = Array.isArray(this.config.options) ? this.config.options : [];\n    return options.findIndex(function (name) {\n      const normalized = String(name || '').toLowerCase();\n      return normalized.includes('taille') || normalized.includes('size');\n    });\n  };\n\n  PersonalizerModalApp.prototype.isSplitVariantQuantityMode = function () {\n    return String(this.customizationRules && this.customizationRules.variantQuantityMode || '').toLowerCase() === 'split';\n  };\n\n  PersonalizerModalApp.prototype.normalizeVariantOptionName = function (value) {\n    return String(value || '')\n      .trim()\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '');\n  };\n\n  PersonalizerModalApp.prototype.getSplitOptionIndex = function () {\n    if (!this.isSplitVariantQuantityMode()) return -1;\n    const configuredOption = this.normalizeVariantOptionName(this.customizationRules && this.customizationRules.splitOption);\n    if (!configuredOption) return -1;\n    return (Array.isArray(this.config.options) ? this.config.options : []).findIndex(\n      function (optionName) {\n        return this.normalizeVariantOptionName(optionName) === configuredOption;\n      }.bind(this)\n    );\n  };\n\n  PersonalizerModalApp.prototype.getSplitQuantityVariants = function (variants) {\n    const splitOptionIndex = this.getSplitOptionIndex();\n    if (splitOptionIndex < 0) return null;\n    const currentOptions = this.currentVariant && Array.isArray(this.currentVariant.options)\n      ? this.currentVariant.options\n      : [];\n    const byOptionValue = new Map();\n\n    (Array.isArray(variants) ? variants : []).forEach(\n      function (variant) {\n        if (!variant || !variant.id || variant.available === false || !Array.isArray(variant.options)) return;\n        const matchesOtherOptions = variant.options.every(function (optionValue, optionIndex) {\n          if (optionIndex === splitOptionIndex || currentOptions[optionIndex] === undefined) return true;\n          return String(optionValue || '') === String(currentOptions[optionIndex] || '');\n        });\n        if (!matchesOtherOptions) return;\n        const label = String(variant.options[splitOptionIndex] || '').trim();\n        if (!label || byOptionValue.has(label)) return;\n        byOptionValue.set(label, {\n          id: String(variant.id),\n          label: label,\n          available: true,\n          inventoryPolicy: String(variant.inventory_policy || 'deny'),\n          stock: variant.inventory_management && Number.isFinite(Number(variant.inventory_quantity))\n            ? Math.max(0, Math.floor(Number(variant.inventory_quantity)))\n            : Number.POSITIVE_INFINITY\n        });\n      }.bind(this)\n    );\n\n    return Array.from(byOptionValue.values());\n  };\n\r\n  PersonalizerModalApp.prototype.getVariantsForActiveColor = function () {\r\n    const variants = Array.isArray(this.config.variantsStock) && this.config.variantsStock.length\r\n      ? this.config.variantsStock\r\n      : Array.isArray(this.config.variants)\r\n        ? this.config.variants\r\n        : [];\r\n    const colorIndex = window.PersonalizerMetafields.getColorOptionIndex(this.config.options || []);\r\n    const activeColor = String(this.activeColorName || '').trim().toLowerCase();\r\n    if (colorIndex < 0 || !activeColor) return variants;\r\n\r\n    return variants.filter(function (variant) {\r\n      const optionValue = Array.isArray(variant.options) ? String(variant.options[colorIndex] || '').trim().toLowerCase() : '';\r\n      return optionValue === activeColor;\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getAvailableSizeVariants = function () {\r\n    const sizeIndex = this.getSizeOptionIndex();\r\n    const variants = Array.isArray(this.config.variantsStock) && this.config.variantsStock.length\r\n      ? this.config.variantsStock\r\n      : Array.isArray(this.config.variants)\r\n        ? this.config.variants\r\n        : [];\r\n\r\n    if (this.isPrintMode()) {\r\n      const selectedVariantId = String((this.currentVariant && this.currentVariant.id) || this.config.selectedVariantId || '');\r\n      const preferredVariant =\r\n        variants.find(function (variant) {\r\n          return selectedVariantId && String(variant.id || '') === selectedVariantId;\r\n        }) ||\r\n        variants[0] ||\r\n        (Array.isArray(this.config.variantPricing) && this.config.variantPricing.length ? this.config.variantPricing[0] : null) ||\r\n        null;\r\n\r\n      if (!preferredVariant || !preferredVariant.id) return [];\r\n\r\n      return [\n        {\n          id: String(preferredVariant.id),\r\n          label: 'Quantite',\r\n          available: true,\r\n          inventoryPolicy: String(preferredVariant.inventory_policy || 'deny'),\r\n          stock: Number.POSITIVE_INFINITY\r\n        }\n      ];\n    }\n\n    if (this.isSplitVariantQuantityMode()) {\n      const splitVariants = this.getSplitQuantityVariants(variants);\n      if (splitVariants) return splitVariants;\n      if (typeof console !== 'undefined') {\n        console.warn('[Personalizer] split_option introuvable. Le mode single est conserve.', {\n          splitOption: String(this.customizationRules && this.customizationRules.splitOption || '')\n        });\n      }\n    }\n\n    const colorIndex = window.PersonalizerMetafields.getColorOptionIndex(this.config.options || []);\n    const activeColor = String(this.activeColorName || '').trim().toLowerCase();\r\n    const groupedBySize = new Map();\r\n\r\n    variants.forEach(function (variant) {\r\n      const label =\r\n        sizeIndex >= 0 && Array.isArray(variant.options)\r\n          ? String(variant.options[sizeIndex] || '').trim()\r\n          : String(variant.title || '').trim();\r\n      const normalizedLabel = String(label || '').trim();\r\n      if (!normalizedLabel) return;\r\n      if (!groupedBySize.has(normalizedLabel)) groupedBySize.set(normalizedLabel, []);\r\n      groupedBySize.get(normalizedLabel).push(variant);\r\n    });\r\n\r\n    const result = [];\r\n    groupedBySize.forEach(function (variantsForSize, label) {\r\n      const preferredVariant = variantsForSize\r\n        .slice()\r\n        .sort(function (left, right) {\r\n          const leftColor =\r\n            colorIndex >= 0 && Array.isArray(left.options)\r\n              ? String(left.options[colorIndex] || '').trim().toLowerCase()\r\n              : '';\r\n          const rightColor =\r\n            colorIndex >= 0 && Array.isArray(right.options)\r\n              ? String(right.options[colorIndex] || '').trim().toLowerCase()\r\n              : '';\r\n          const leftAvailable = left.available !== false ? 1 : 0;\r\n          const rightAvailable = right.available !== false ? 1 : 0;\r\n          const leftColorMatch = activeColor && leftColor === activeColor ? 1 : 0;\r\n          const rightColorMatch = activeColor && rightColor === activeColor ? 1 : 0;\r\n          const leftStock = Number.isFinite(Number(left.inventory_quantity))\r\n            ? Math.max(0, Math.floor(Number(left.inventory_quantity)))\r\n            : Number.POSITIVE_INFINITY;\r\n          const rightStock = Number.isFinite(Number(right.inventory_quantity))\r\n            ? Math.max(0, Math.floor(Number(right.inventory_quantity)))\r\n            : Number.POSITIVE_INFINITY;\r\n\r\n          if (rightAvailable !== leftAvailable) return rightAvailable - leftAvailable;\r\n          if (rightColorMatch !== leftColorMatch) return rightColorMatch - leftColorMatch;\r\n          if (rightStock !== leftStock) return rightStock - leftStock;\r\n          return 0;\r\n        })[0];\r\n\r\n      if (!preferredVariant || !preferredVariant.id || preferredVariant.available === false) return;\r\n\r\n      result.push({\r\n        id: String(preferredVariant.id),\r\n        label: label || 'Taille',\r\n        available: preferredVariant.available !== false,\r\n        inventoryPolicy: String(preferredVariant.inventory_policy || 'deny'),\r\n        stock: Number.isFinite(Number(preferredVariant.inventory_quantity))\r\n          ? Math.max(0, Math.floor(Number(preferredVariant.inventory_quantity)))\r\n          : Number.POSITIVE_INFINITY\r\n      });\r\n    });\r\n\r\n    return result;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncSizeQuantitiesWithAvailableVariants = function () {\r\n    const byId = {};\r\n    this.getAvailableSizeVariants().forEach(function (item) {\r\n      byId[String(item.id)] = item;\r\n    });\r\n    const availableIds = new Set(\r\n      Object.keys(byId).map(function (key) {\r\n        return String(key);\r\n      })\r\n    );\r\n\r\n    const next = {};\r\n    Object.keys(this.sizeQuantities || {}).forEach(\r\n      function (key) {\r\n        if (!availableIds.has(String(key))) return;\r\n        const variant = byId[String(key)];\r\n        const maxQty = variant && Number.isFinite(variant.stock) ? Math.max(0, Math.floor(Number(variant.stock))) : Number.POSITIVE_INFINITY;\r\n        const qty = Math.max(0, Number(this.sizeQuantities[key]) || 0);\r\n        const clampedQty = Number.isFinite(maxQty) ? Math.min(qty, maxQty) : qty;\r\n        if (clampedQty > 0) next[String(key)] = clampedQty;\r\n      }.bind(this)\r\n    );\r\n    this.sizeQuantities = next;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSizeQuantityByVariantId = function (variantId) {\r\n    const key = String(variantId || '');\r\n    return Math.max(0, Number(this.sizeQuantities[key]) || 0);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setSizeQuantityByVariantId = function (variantId, quantity) {\r\n    const key = String(variantId || '');\r\n    if (!key) return;\r\n    const maxQty = this.getMaxSizeQuantityByVariantId(key);\r\n    const rawQty = Math.max(0, Math.floor(Number(quantity) || 0));\r\n    const nextQty = Number.isFinite(maxQty) ? Math.min(rawQty, maxQty) : rawQty;\r\n    if (nextQty <= 0) {\r\n      delete this.sizeQuantities[key];\r\n    } else {\r\n      this.sizeQuantities[key] = nextQty;\r\n    }\r\n    this.renderSizesUi();\r\n    this.updatePrice();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.adjustSizeQuantity = function (variantId, delta) {\r\n    const current = this.getSizeQuantityByVariantId(variantId);\r\n    this.setSizeQuantityByVariantId(variantId, current + (Number(delta) || 0));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.handleSizeQuantityInputCommit = function (input, variantId) {\r\n    if (!input) return;\r\n    const sanitized = String(input.value || '').replace(/[^\\d]/g, '');\r\n    const nextValue = sanitized === '' ? 0 : Math.max(0, Math.floor(Number(sanitized) || 0));\r\n    this.setSizeQuantityByVariantId(variantId, nextValue);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getVariantStockById = function (variantId) {\r\n    const key = String(variantId || '');\r\n    if (!key) return Number.POSITIVE_INFINITY;\r\n    const variant = this.getAvailableSizeVariants().find(function (item) {\r\n      return String(item.id) === key;\r\n    });\r\n    if (!variant) return Number.POSITIVE_INFINITY;\r\n    if (String(variant.inventoryPolicy || '').toLowerCase() === 'continue') return Number.POSITIVE_INFINITY;\r\n    return Number.isFinite(variant.stock) ? Math.max(0, Math.floor(Number(variant.stock))) : Number.POSITIVE_INFINITY;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getMaxSizeQuantityByVariantId = function (variantId) {\r\n    return this.getVariantStockById(variantId);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getRemainingStockByVariantId = function (variantId) {\r\n    const maxQty = this.getMaxSizeQuantityByVariantId(variantId);\r\n    if (!Number.isFinite(maxQty)) return Number.POSITIVE_INFINITY;\r\n    return Math.max(0, maxQty - this.getSizeQuantityByVariantId(variantId));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getTotalSelectedSizeQuantity = function () {\r\n    return Object.keys(this.sizeQuantities || {}).reduce(\r\n      function (total, key) {\r\n        return total + Math.max(0, Number(this.sizeQuantities[key]) || 0);\r\n      }.bind(this),\r\n      0\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPreviewSelectedSizeQuantity = function () {\r\n    return Math.max(1, this.getTotalSelectedSizeQuantity());\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hasSelectedSizes = function () {\n    return this.getTotalSelectedSizeQuantity() > 0;\n  };\n\n  PersonalizerModalApp.prototype.getMinimumCustomizationQuantity = function () {\n    const minimum = Number(this.customizationRules && this.customizationRules.minCustomizationQuantity);\n    return Number.isFinite(minimum) && minimum > 0 ? Math.floor(minimum) : null;\n  };\n\n  PersonalizerModalApp.prototype.isCustomizationQuantityAllowed = function () {\n    const minimum = this.getMinimumCustomizationQuantity();\n    return minimum === null || this.getTotalSelectedSizeQuantity() >= minimum;\n  };\n\n  PersonalizerModalApp.prototype.isPersonalizationQuantityValid = function () {\n    return !this.hasPersonalizationObjects() || this.isCustomizationQuantityAllowed();\n  };\n\n  PersonalizerModalApp.prototype.getCustomizationQuantityMessage = function () {\n    const minimum = this.getMinimumCustomizationQuantity();\n    if (minimum === null) return '';\n    const missingQuantity = Math.max(0, minimum - this.getTotalSelectedSizeQuantity());\n    return 'La personnalisation n\\u00e9cessite un minimum de ' + minimum + ' exemplaires.' +\n      (missingQuantity > 0 ? ' Ajoutez encore ' + missingQuantity + ' exemplaire' + (missingQuantity > 1 ? 's' : '') + ' pour pouvoir commander.' : '');\n  };\n\n  PersonalizerModalApp.prototype.syncCustomizationQuantityUi = function () {\n    if (!this.modal) return;\n    const minimum = this.getMinimumCustomizationQuantity();\n    const quantity = this.getTotalSelectedSizeQuantity();\n    const hasPersonalization = this.hasPersonalizationObjects();\n    const missingQuantity = minimum === null ? 0 : Math.max(0, minimum - quantity);\n    const message = minimum === null\n      ? ''\n      : hasPersonalization && missingQuantity > 0\n        ? 'La personnalisation n\\u00e9cessite un minimum de ' + minimum + ' exemplaires. Ajoutez encore ' +\n          missingQuantity + ' exemplaire' + (missingQuantity > 1 ? 's' : '') + ' pour pouvoir commander.'\n        : 'Personnalisation : minimum ' + minimum + ' exemplaires pour commander.';\n    const notice = this.modal.querySelector('[data-customization-minimum-message]');\n    if (notice) {\n      notice.textContent = message;\n      notice.hidden = !message;\n    }\n  };\n\r\n  PersonalizerModalApp.prototype.getSelectedSizeSummary = function () {\r\n    if (this.isPrintMode()) {\r\n      const total = this.getTotalSelectedSizeQuantity();\r\n      return total > 0 ? [total + ' produit' + (total > 1 ? 's' : '')] : [];\r\n    }\r\n\r\n    const available = this.getAvailableSizeVariants();\r\n    const labels = available\r\n      .map(\r\n        function (item) {\r\n          const qty = this.getSizeQuantityByVariantId(item.id);\r\n          if (!qty) return '';\r\n          return qty + ' ' + item.label;\r\n        }.bind(this)\r\n      )\r\n      .filter(Boolean);\r\n    return labels;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderSizesUi = function () {\n    if (!this.modal) return;\n\n    const isSplitMode = this.isSplitVariantQuantityMode() && this.getSplitOptionIndex() >= 0;\n    const splitOptionLabel = String(this.customizationRules && this.customizationRules.splitOption || 'variante');\n    if (isSplitMode) {\n      this.modal.querySelectorAll('[data-controls-panel=\"sizes\"] .personalizer-controls__title--panel').forEach(function (title) {\n        title.textContent = 'Choisissez vos quantit\\u00e9s par ' + splitOptionLabel.toLowerCase();\n      });\n      this.modal.querySelectorAll('[data-flyout=\"sizes\"] .personalizer-flyout__title').forEach(function (title) {\n        title.textContent = 'Quantit\\u00e9s par ' + splitOptionLabel.toLowerCase();\n      });\n      this.modal.querySelectorAll('[data-action=\"next-step-sizes\"]').forEach(function (button) {\n        const label = 'Choisir les quantit\\u00e9s par ' + splitOptionLabel.toLowerCase();\n        button.textContent = label;\n        button.setAttribute('aria-label', label);\n      });\n    }\n\r\n    const summaryNode = this.modal.querySelector('[data-sizes-summary-text]');\r\n    const summaryLabelNode = this.modal.querySelector('.personalizer-sizes-summary__label');\r\n    const selectedSummary = this.getSelectedSizeSummary();\r\n    if (summaryNode) {\r\n      const summaryItems = selectedSummary.length\r\n        ? selectedSummary\r\n        : this.getAvailableSizeVariants().map(\r\n            function (item) {\r\n              return this.isPrintMode() ? 'Quantite' : item.label;\r\n            }.bind(this)\r\n          );\r\n      if (summaryLabelNode) {\r\n        summaryLabelNode.textContent = this.isPrintMode()\r\n          ? selectedSummary.length\r\n            ? 'Choisie :'\r\n            : 'A renseigner :'\r\n          : selectedSummary.length\r\n            ? 'Choisies :'\r\n            : 'Disponibles :';\r\n      }\r\n      if (summaryItems.length) {\r\n        summaryNode.innerHTML = summaryItems\r\n          .map(function (label) {\r\n            return '<span class=\"personalizer-sizes-summary__chip\">' + this.escapeHtml(label) + '</span>';\r\n          }, this)\r\n          .join('');\r\n      } else {\r\n        summaryNode.innerHTML = '<span class=\"personalizer-sizes-summary__placeholder\">Aucune</span>';\r\n      }\r\n    }\r\n\r\n    const totalQty = this.getTotalSelectedSizeQuantity();\r\n    const hasSelectedSizes = totalQty > 0;\r\n    const totalNode = this.modal.querySelector('[data-size-total-label]');\r\n    if (totalNode) {\r\n      totalNode.textContent = totalQty + ' produit' + (totalQty === 1 ? '' : 's');\r\n    }\r\n\r\n    this.modal.querySelectorAll('.personalizer-primary-cta[data-action=\"open-sizes-panel\"]').forEach(\r\n      function (button) {\r\n        if (!button) return;\r\n        const label = isSplitMode\n          ? 'Choisir les quantit\\u00e9s par ' + splitOptionLabel.toLowerCase()\n          : hasSelectedSizes\n            ? 'Ajouter au panier'\n            : this.isPrintMode()\n              ? 'Choisir la quantite'\n              : 'Choisir tailles et quantit\u00E9s';\n        button.textContent = label;\r\n        button.setAttribute('aria-label', label);\r\n      }.bind(this)\r\n    );\r\n\r\n    const listNodes = this.modal.querySelectorAll('[data-size-list], [data-size-list-overlay]');\n    if (listNodes.length) {\n      const available = this.getAvailableSizeVariants();\n      let listHtml = this.isPrintMode()\n        ? '<p>Aucune variante disponible.</p>'\n        : isSplitMode\n          ? '<p>Aucune variante disponible pour cette r\\u00e9partition.</p>'\n          : '<p>Aucune taille disponible.</p>';\n      if (available.length) {\r\n        listHtml = available\r\n          .map(\r\n            function (item) {\r\n              const qty = this.getSizeQuantityByVariantId(item.id);\r\n              const maxQty = this.getMaxSizeQuantityByVariantId(item.id);\r\n              const remaining = this.getRemainingStockByVariantId(item.id);\r\n              const hasFiniteStock = Number.isFinite(remaining);\r\n              const showLowStock = hasFiniteStock && remaining < 11;\r\n              const showAvailableStock = hasFiniteStock && remaining >= 11;\r\n              const disableMinus = qty <= 0;\r\n              const disablePlus = Number.isFinite(maxQty) ? qty >= maxQty : false;\r\n              if (this.config.hasFixedQuantity) {\r\n                return (\r\n                  '<div class=\"personalizer-size-row personalizer-size-row--fixed\">' +\r\n                  '<span class=\"personalizer-size-row__label\">Quantit\u00E9 s\u00E9lectionn\u00E9e</span>' +\r\n                  '<strong class=\"personalizer-size-row__fixed-value\">' + qty + '</strong>' +\r\n                  '</div>'\r\n                );\r\n              }\r\n              return (\r\n                '<div class=\"personalizer-size-row\">' +\r\n                '<span class=\"personalizer-size-row__label\">' + (this.isPrintMode() ? 'Quantite' : item.label) + '</span>' +\r\n                '<span class=\"personalizer-size-row__stock' + (showLowStock || showAvailableStock ? '' : ' is-hidden') + (showAvailableStock ? ' is-available' : '') + '\">' +\r\n                (showLowStock ? ('Reste: ' + remaining) : (showAvailableStock ? 'En stock' : '')) +\r\n                '</span>' +\r\n                '<div class=\"personalizer-size-stepper\">' +\r\n                '<button type=\"button\" class=\"personalizer-size-stepper__btn' + (disableMinus ? ' is-disabled' : '') + '\" data-action=\"size-decrease\" data-variant-id=\"' + item.id + '\" aria-label=\"Retirer\"' + (disableMinus ? ' disabled' : '') + '>-</button>' +\r\n                '<input type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" class=\"personalizer-size-stepper__input\" data-size-quantity-input data-variant-id=\"' + item.id + '\" value=\"' + qty + '\" aria-label=\"' + (this.isPrintMode() ? 'Quantite' : ('Quantite pour la taille ' + this.escapeHtml(item.label))) + '\" />' +\r\n                '<button type=\"button\" class=\"personalizer-size-stepper__btn' + (disablePlus ? ' is-disabled' : '') + '\" data-action=\"size-increase\" data-variant-id=\"' + item.id + '\" aria-label=\"Ajouter\"' + (disablePlus ? ' disabled' : '') + '>+</button>' +\r\n                '</div>' +\r\n                '</div>'\r\n              );\r\n            }.bind(this)\r\n          )\r\n          .join('');\r\n      }\r\n      listNodes.forEach(function (node) {\n        node.innerHTML = listHtml;\n      });\n    }\n\n    const personalizationQuantityBlocked = !this.isPersonalizationQuantityValid();\n    const canAddToCart = hasSelectedSizes && !personalizationQuantityBlocked && !this.isSubmittingCart;\n    this.modal.querySelectorAll('[data-action=\"modal-add-to-cart\"]').forEach(function (button) {\r\n      if (!button) return;\r\n      const lockedByLoading = button.hasAttribute('data-loading-lock');\r\n      const canUseButton = canAddToCart && !lockedByLoading;\r\n      button.disabled = !canUseButton;\r\n      button.setAttribute('aria-disabled', canUseButton ? 'false' : 'true');\r\n      button.classList.toggle('is-disabled', !canUseButton);\r\n    });\r\n\r\n    this.syncCustomizationQuantityUi();\n    this.renderImpressionsUi();\n    this.renderSizesPriceSummary();\n  };\r\n\r\n  PersonalizerModalApp.prototype.getQuantityTierProgressState = function (quantity) {\n    const currentQuantity = Math.max(0, Math.round(Number(quantity) || 0));\n    const allTierStarts = this.getQuantityPricingTierStarts();\n    const tierStarts = allTierStarts.filter(function (tierMin) {\n      return tierMin > 1;\n    });\n    if (!allTierStarts.length) return { hasRules: false, currentQuantity: currentQuantity, progressPercent: 0 };\n    if (!tierStarts.length) {\n      return {\n        hasRules: true,\n        isMaximum: true,\n        currentQuantity: currentQuantity,\n        targetQuantity: 1,\n        missingQuantity: 0,\n        discountPercent: this.getPersonalizedPricingForQuantity(currentQuantity).globalDiscountPercent,\n        progressPercent: 100\n      };\n    }\n    const nextTierMin = tierStarts.find(function (tierMin) { return tierMin > currentQuantity; }) || 0;\n    if (!nextTierMin) {\n      return {\n        hasRules: true,\n        isMaximum: true,\n        currentQuantity: currentQuantity,\n        targetQuantity: tierStarts[tierStarts.length - 1],\n        missingQuantity: 0,\n        discountPercent: this.getPersonalizedPricingForQuantity(currentQuantity).globalDiscountPercent,\n        progressPercent: 100\n      };\n    }\n    return {\n      hasRules: true,\n      isMaximum: false,\n      currentQuantity: currentQuantity,\n      targetQuantity: nextTierMin,\n      missingQuantity: Math.max(0, nextTierMin - currentQuantity),\n      discountPercent: this.getPersonalizedPricingForQuantity(nextTierMin).globalDiscountPercent,\n      progressPercent: Math.min(100, Math.max(0, (currentQuantity / nextTierMin) * 100))\n    };\n  };\n\n  PersonalizerModalApp.prototype.renderSizesPriceSummary = function () {\n    if (!this.modal || !window.PersonalizerPricing) return;\r\n    const totalNode = this.modal.querySelector('[data-size-price-total]');\r\n    const totalBaseNode = this.modal.querySelector('[data-size-price-total-base]');\r\n    const unitPriceNode = this.modal.querySelector('[data-size-unit-price]');\r\n    const unitPriceBaseNode = this.modal.querySelector('[data-size-unit-price-base]');\r\n    const productDiscountLabelNode = this.modal.querySelector('[data-size-product-discount-label]');\r\n    const productDiscountValueNode = this.modal.querySelector('[data-size-product-discount-value]');\r\n    const feeDiscountLabelNode = this.modal.querySelector('[data-size-fee-discount-label]');\r\n    const feeDiscountValueNode = this.modal.querySelector('[data-size-fee-discount-value]');\r\n    const savingsLabelNode = this.modal.querySelector('[data-size-savings-label]');\r\n    const savingsValueNode = this.modal.querySelector('[data-size-savings-value]');\n    const nextTierMessageNode = this.modal.querySelector('[data-size-next-tier-message]');\n    const tierEyebrowNode = this.modal.querySelector('[data-size-tier-eyebrow]');\n    const tierBadgeNode = this.modal.querySelector('[data-size-tier-badge]');\n    const tierProgressNode = this.modal.querySelector('[data-size-tier-progress]');\n    const tierProgressBarNode = this.modal.querySelector('[data-size-tier-progress-bar]');\n    const tierDiscountNode = this.modal.querySelector('[data-size-tier-discount]');\n    const tierTableBody = this.modal.querySelector('[data-size-tier-table-body]');\r\n    const hasProductDiscountRules = this.hasConfiguredProductDiscounts();\r\n    const hasFeeDiscountRules = this.hasConfiguredFeeDiscounts();\r\n    const hasAnyDiscountRules = hasProductDiscountRules || hasFeeDiscountRules;\r\n    const productDiscountRow = productDiscountValueNode?.closest('.personalizer-size-footer__line');\r\n    const feeDiscountRow = feeDiscountValueNode?.closest('.personalizer-size-footer__line');\r\n    const savingsRow = savingsValueNode?.closest('.personalizer-size-footer__line');\r\n    const tierInfo = nextTierMessageNode?.closest('.personalizer-size-footer__tier-info');\r\n    productDiscountRow?.classList.toggle('is-hidden', !hasAnyDiscountRules);\n    feeDiscountRow?.classList.toggle('is-hidden', !hasAnyDiscountRules);\n    savingsRow?.classList.toggle('is-hidden', !hasAnyDiscountRules);\r\n    tierInfo?.classList.toggle('is-hidden', !hasAnyDiscountRules);\r\n    if (!totalNode) return;\r\n    if (!this.currentPricing) {\r\n      totalNode.textContent = '--';\r\n      if (totalBaseNode) {\r\n        totalBaseNode.textContent = '';\r\n        totalBaseNode.classList.add('is-hidden');\r\n      }\r\n      if (unitPriceNode) unitPriceNode.textContent = '--';\r\n      if (unitPriceBaseNode) {\r\n        unitPriceBaseNode.textContent = '';\r\n        unitPriceBaseNode.classList.add('is-hidden');\r\n      }\r\n      if (productDiscountLabelNode) productDiscountLabelNode.textContent = 'Remise palier actuelle';\n      if (productDiscountValueNode) productDiscountValueNode.textContent = '--';\r\n      if (feeDiscountLabelNode) feeDiscountLabelNode.textContent = 'Remise frais palier';\r\n      if (feeDiscountValueNode) feeDiscountValueNode.textContent = '--';\r\n      if (savingsLabelNode) savingsLabelNode.textContent = 'Vous \u00E9conomisez';\r\n      if (savingsValueNode) savingsValueNode.textContent = '--';\r\n      if (nextTierMessageNode && hasAnyDiscountRules) nextTierMessageNode.textContent = 'Ajoutez une quantit\u00E9 pour afficher le prochain palier.';\n      if (tierBadgeNode) tierBadgeNode.textContent = '';\n      if (tierProgressBarNode) tierProgressBarNode.style.width = '0%';\n      if (tierProgressNode) tierProgressNode.setAttribute('aria-valuenow', '0');\n      if (tierDiscountNode) tierDiscountNode.textContent = '';\n      if (tierTableBody && hasAnyDiscountRules) this.renderQuantityTierTable(tierTableBody);\r\n      return;\r\n    }\r\n\r\n    const summary = this.getDisplayPricingSummary();\r\n    const selectedQty = Math.max(0, Math.round(Number(summary.selectedQty) || 0));\r\n    const actualSelectedQty = Math.max(0, Math.round(Number(this.getTotalSelectedSizeQuantity()) || 0));\r\n    const totalAfterDiscount = Math.max(0, Math.round(Number(summary.totalFinalCents) || 0));\r\n    const totalSavings = Math.max(0, Math.round(Number(summary.totalSavingsCents) || 0));\r\n    const hasDiscount = totalSavings > 0;\r\n    const tierProgress = this.getQuantityTierProgressState(actualSelectedQty);\n\n    if (nextTierMessageNode && hasAnyDiscountRules) {\n      if (tierProgress.isMaximum) {\n        if (tierEyebrowNode) tierEyebrowNode.textContent = 'Meilleure remise atteinte';\n        nextTierMessageNode.textContent = 'Palier maximum atteint';\n        if (tierBadgeNode) tierBadgeNode.textContent = 'Remise maximale';\n      } else {\n        const missing = tierProgress.missingQuantity;\n        const articleLabel = missing > 1 ? 'articles' : 'article';\n        if (tierEyebrowNode) tierEyebrowNode.textContent = 'Palier suivant';\n        nextTierMessageNode.innerHTML = 'Plus que ' + missing + ' ' + articleLabel +\n          ' pour atteindre <strong>' + tierProgress.discountPercent + ' %</strong> !';\n        if (tierBadgeNode) tierBadgeNode.textContent = '\u00C0 ' + missing + ' ' + articleLabel + ' du palier';\n      }\n      if (tierProgressBarNode) tierProgressBarNode.style.width = tierProgress.progressPercent.toFixed(2) + '%';\n      if (tierProgressNode) tierProgressNode.setAttribute('aria-valuenow', String(Math.round(tierProgress.progressPercent)));\n      if (tierDiscountNode) tierDiscountNode.textContent = String(tierProgress.discountPercent || 0) + ' % de remise';\n      const totalLabelNode = this.modal.querySelector('[data-size-total-label]');\n      if (totalLabelNode) {\n        totalLabelNode.textContent = tierProgress.isMaximum\n          ? actualSelectedQty + ' produit' + (actualSelectedQty === 1 ? '' : 's')\n          : actualSelectedQty + ' produit' + (actualSelectedQty === 1 ? '' : 's') + ' sur ' + tierProgress.targetQuantity;\n      }\n    }\r\n    if (tierTableBody && hasAnyDiscountRules) this.renderQuantityTierTable(tierTableBody);\r\n\r\n    totalNode.textContent = window.PersonalizerPricing.formatMoney(\r\n      totalAfterDiscount,\r\n      this.config.currencyCode\r\n    );\r\n    if (unitPriceNode) {\r\n      unitPriceNode.textContent = actualSelectedQty > 0\r\n        ? window.PersonalizerPricing.formatMoney(\r\n            Math.round(totalAfterDiscount / actualSelectedQty),\r\n            this.config.currencyCode\r\n          ) + ' HT / pi\u00E8ce'\r\n        : '--';\r\n    }\r\n    if (unitPriceBaseNode) {\r\n      const unitBasePrice = actualSelectedQty > 0 ? Math.round(Number(summary.totalBaseCents || 0) / actualSelectedQty) : 0;\r\n      const unitFinalPrice = actualSelectedQty > 0 ? Math.round(totalAfterDiscount / actualSelectedQty) : 0;\r\n      const showUnitBasePrice = actualSelectedQty > 0 && unitBasePrice > unitFinalPrice;\r\n      unitPriceBaseNode.textContent = showUnitBasePrice\r\n        ? window.PersonalizerPricing.formatMoney(unitBasePrice, this.config.currencyCode)\r\n        : '';\r\n      unitPriceBaseNode.classList.toggle('is-hidden', !showUnitBasePrice);\r\n    }\r\n    if (totalBaseNode) {\r\n      totalBaseNode.textContent = hasDiscount\r\n        ? window.PersonalizerPricing.formatMoney(summary.totalBaseCents, this.config.currencyCode)\r\n        : '';\r\n      totalBaseNode.classList.toggle('is-hidden', !hasDiscount);\r\n    }\r\n    if (productDiscountLabelNode) {\n      productDiscountLabelNode.textContent = 'Remise palier actuelle';\n    }\r\n    if (productDiscountValueNode) {\r\n      productDiscountValueNode.textContent = selectedQty > 0\r\n        ? this.formatDiscountPercent(summary.productCurrentDiscountPercent) + ' %'\n        : '--';\r\n    }\r\n    if (feeDiscountLabelNode) {\r\n      feeDiscountLabelNode.textContent = this.getFeeDiscountLabel(summary);\r\n    }\r\n    if (feeDiscountValueNode) {\r\n      feeDiscountValueNode.textContent = selectedQty > 0\r\n        ? this.formatDiscountPercent(summary.feeCurrentDiscountPercent) + ' %'\n        : '--';\r\n    }\r\n    if (savingsValueNode) {\r\n      savingsValueNode.textContent = hasDiscount\r\n        ? window.PersonalizerPricing.formatMoney(totalSavings, this.config.currencyCode)\r\n        : selectedQty > 0\r\n          ? window.PersonalizerPricing.formatMoney(0, this.config.currencyCode)\r\n          : '--';\r\n    }\r\n\r\n    if (savingsLabelNode) savingsLabelNode.textContent = 'Vous economisez';\r\n\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hasConfiguredProductDiscounts = function () {\r\n    return this.parsePricingTiers().some(\r\n      function (tier) {\r\n        return this.getPricingTierDiscountPercent(tier) > 0;\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hasConfiguredFeeDiscounts = function () {\r\n    let tierLists = [];\r\n    if (this.isPrintMode()) {\r\n      tierLists = this.getSelectedPrintOptions().map(function (option) {\r\n        const feeConfig = this.getAppProxyFeeConfig({\r\n          productHandle: option.optionProductHandle,\r\n          variantSku: option.optionVariantSku,\r\n          variantId: option.variantId\r\n        });\r\n        return feeConfig && Array.isArray(feeConfig.tiers) ? feeConfig.tiers : [];\r\n      }.bind(this));\r\n    } else {\r\n      tierLists = this.getPendingFeeItems().map(\r\n        function (item) {\r\n          const variant = this.getFeeVariantById(item && item.id ? item.id : '');\r\n          const variantHandle = this.normalizeFeeZoneKey(String(\r\n            (item && item.properties && item.properties._fee_variant_title) ||\r\n            (variant && variant.title) ||\r\n            ''\r\n          ));\r\n          return this.getFeeDiscountTiersForVariantHandle(variantHandle, item && item.id);\r\n        }.bind(this)\r\n      );\r\n    }\r\n\r\n    return tierLists.some(\r\n      function (tiers) {\r\n        return (Array.isArray(tiers) ? tiers : []).some(\r\n          function (tier) {\r\n            return this.getPricingTierDiscountPercent(tier) > 0;\r\n          }.bind(this)\r\n        );\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPersonalizedPricingForQuantity = function (quantity) {\r\n    const qty = Math.max(1, Math.floor(Number(quantity) || 1));\r\n    const referenceVariantId = this.getReferenceProductPricingVariantId();\r\n    const previousQuantities = this.sizeQuantities;\r\n    this.sizeQuantities = referenceVariantId ? { [referenceVariantId]: qty } : {};\r\n    try {\r\n      const summary = this.getDisplayPricingSummary();\r\n      const totalBaseCents = Math.max(0, Math.round(Number(summary.totalBaseCents) || 0));\r\n      const totalFinalCents = Math.max(0, Math.round(Number(summary.totalFinalCents) || 0));\r\n      return {\r\n        unitBaseCents: Math.max(0, Math.round(totalBaseCents / qty)),\r\n        unitFinalCents: Math.max(0, Math.round(totalFinalCents / qty)),\r\n        globalDiscountPercent:\r\n          totalBaseCents > 0\r\n            ? Math.max(0, Math.round(((totalBaseCents - totalFinalCents) / totalBaseCents) * 100))\r\n            : 0\r\n      };\r\n    } finally {\r\n      this.sizeQuantities = previousQuantities;\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderQuantityTierTable = function (tableBody) {\r\n    if (!tableBody || !window.PersonalizerPricing) return;\r\n    const rowStarts = this.getQuantityPricingTierStarts();\r\n\r\n    tableBody.innerHTML = rowStarts.map(\r\n      function (minQuantity, index) {\r\n        const nextMin = rowStarts[index + 1] || null;\r\n        const quantityLabel = nextMin ? minQuantity + ' \u00E0 ' + (nextMin - 1) : minQuantity + ' et +';\r\n        const pricing = this.getPersonalizedPricingForQuantity(minQuantity);\r\n        return '<tr><td>' + quantityLabel + '</td><td>' + pricing.globalDiscountPercent + ' %</td><td>' +\r\n          window.PersonalizerPricing.formatMoney(pricing.unitFinalCents, this.config.currencyCode) + ' HT</td></tr>';\r\n      }.bind(this)\r\n    ).join('');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getQuantityPricingTierStarts = function () {\r\n    const tiers = this.parsePricingTiers();\r\n    const rowStarts = [1];\r\n    const addTierStarts = function (tierList) {\r\n      (Array.isArray(tierList) ? tierList : []).forEach(\r\n        function (tier) {\r\n          const min = Math.max(1, Math.floor(this.toNumericValue(tier && (tier.min ?? tier.minQty ?? tier.min_qty ?? tier.quantity_min), 1)));\r\n          if (rowStarts.indexOf(min) === -1) rowStarts.push(min);\r\n        }.bind(this)\r\n      );\r\n    }.bind(this);\r\n    tiers.forEach(function (tier) {\r\n      const min = Math.max(1, Math.floor(Number(tier && tier.min) || 1));\r\n      if (rowStarts.indexOf(min) === -1) rowStarts.push(min);\r\n    });\r\n\r\n    if (this.isPrintMode()) {\r\n      this.getSelectedPrintOptions().forEach(function (option) {\r\n        const feeConfig = this.getAppProxyFeeConfig({\r\n          productHandle: option.optionProductHandle,\r\n          variantSku: option.optionVariantSku,\r\n          variantId: option.variantId\r\n        });\r\n        addTierStarts(feeConfig && feeConfig.tiers);\r\n      }.bind(this));\r\n    } else {\r\n      this.getPendingFeeItems().forEach(\r\n        function (item) {\r\n          const variant = this.getFeeVariantById(item && item.id ? item.id : '');\r\n          const variantHandle = this.normalizeFeeZoneKey(String(\r\n            (item && item.properties && item.properties._fee_variant_title) ||\r\n            (variant && variant.title) || ''\r\n          ));\r\n          addTierStarts(this.getFeeDiscountTiersForVariantHandle(variantHandle, item && item.id));\r\n        }.bind(this)\r\n      );\r\n    }\r\n    rowStarts.sort(function (left, right) { return left - right; });\r\n    return rowStarts;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setCartSubmissionLoading = function (isLoading, message) {\r\n    const loading = !!isLoading;\r\n    this.isSubmittingCart = loading;\r\n    this.setGlobalBusyOverlay(loading, loading ? (message || 'Ajout au panier en cours...') : '');\r\n    if (this.modal) {\r\n      this.modal.querySelectorAll('[data-action=\"modal-add-to-cart\"]').forEach(function (button) {\r\n        if (!button) return;\r\n        if (loading) {\r\n          button.setAttribute('data-loading-lock', 'true');\r\n          button.disabled = true;\r\n          button.setAttribute('aria-disabled', 'true');\r\n          button.classList.add('is-disabled');\r\n          return;\r\n        }\r\n        button.removeAttribute('data-loading-lock');\r\n      });\r\n    }\r\n    if (!loading) this.renderSizesUi();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.ensureGlobalBusyOverlay = function () {\r\n    if (this.globalBusyOverlay && this.globalBusyOverlay.isConnected) return this.globalBusyOverlay;\r\n    var existing = document.getElementById('personalizer-cart-busy');\r\n    if (existing) {\r\n      this.globalBusyOverlay = existing;\r\n      return existing;\r\n    }\r\n    var overlay = document.createElement('div');\r\n    overlay.id = 'personalizer-cart-busy';\r\n    overlay.className = 'personalizer-cart-busy';\r\n    overlay.hidden = true;\r\n    overlay.innerHTML = '<div class=\"personalizer-cart-busy__box\">Mise a jour du panier...</div>';\r\n    document.body.appendChild(overlay);\r\n    this.globalBusyOverlay = overlay;\r\n    return overlay;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setGlobalBusyOverlay = function (visible, message) {\r\n    var overlay = this.ensureGlobalBusyOverlay();\r\n    if (!overlay) return;\r\n    var box = overlay.querySelector('.personalizer-cart-busy__box');\r\n    if (box && message) box.textContent = String(message);\r\n    overlay.hidden = !visible;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.lockBodyScroll = function () {\r\n    var body = document.body;\r\n    if (!body) return;\r\n    // The main personalizer is the sole owner of this lock. Keep it\r\n    // idempotent so two rapid open calls cannot leave a stale lock behind.\r\n    if (this.bodyScrollLockCount > 0) {\r\n      body.classList.add('personalizer-modal-open');\r\n      return;\r\n    }\r\n    this.bodyScrollLockCount = 1;\r\n    this.bodyScrollPreviousPaddingRight = body.style.paddingRight || '';\r\n    var scrollbarWidth = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\r\n    if (scrollbarWidth > 0) {\r\n      var computedPaddingRight = Number.parseFloat(window.getComputedStyle(body).paddingRight || '0') || 0;\r\n      body.style.paddingRight = String(computedPaddingRight + scrollbarWidth) + 'px';\r\n    }\r\n    body.classList.add('personalizer-modal-open');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.enableZoomLock = function () {\r\n    if (this.zoomLockEnabled) return;\r\n\r\n    this.boundZoomLockWheelHandler =\r\n      this.boundZoomLockWheelHandler ||\r\n      function (event) {\r\n        if (!this.modal || !this.modal.classList.contains('is-open')) return;\r\n        if (event.ctrlKey || event.metaKey) {\r\n          event.preventDefault();\r\n        }\r\n      }.bind(this);\r\n\r\n    this.boundZoomLockKeydownHandler =\r\n      this.boundZoomLockKeydownHandler ||\r\n      function (event) {\r\n        if (!this.modal || !this.modal.classList.contains('is-open')) return;\r\n        if (!event.ctrlKey && !event.metaKey) return;\r\n        var key = String(event.key || '').toLowerCase();\r\n        if (key === '+' || key === '-' || key === '=' || key === '_' || key === '0') {\r\n          event.preventDefault();\r\n        }\r\n      }.bind(this);\r\n\r\n    this.boundZoomLockGestureHandler =\r\n      this.boundZoomLockGestureHandler ||\r\n      function (event) {\r\n        if (!this.modal || !this.modal.classList.contains('is-open')) return;\r\n        event.preventDefault();\r\n      }.bind(this);\r\n\r\n    this.boundZoomLockTouchMoveHandler =\r\n      this.boundZoomLockTouchMoveHandler ||\r\n      function (event) {\r\n        if (!this.modal || !this.modal.classList.contains('is-open')) return;\r\n        if (event.touches && event.touches.length > 1) {\r\n          event.preventDefault();\r\n        }\r\n      }.bind(this);\r\n\r\n    document.addEventListener('wheel', this.boundZoomLockWheelHandler, { passive: false });\r\n    document.addEventListener('keydown', this.boundZoomLockKeydownHandler, { passive: false });\r\n    document.addEventListener('gesturestart', this.boundZoomLockGestureHandler, { passive: false });\r\n    document.addEventListener('gesturechange', this.boundZoomLockGestureHandler, { passive: false });\r\n    document.addEventListener('gestureend', this.boundZoomLockGestureHandler, { passive: false });\r\n    document.addEventListener('touchmove', this.boundZoomLockTouchMoveHandler, { passive: false });\r\n    this.zoomLockEnabled = true;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.disableZoomLock = function () {\r\n    if (!this.zoomLockEnabled) return;\r\n    if (this.boundZoomLockWheelHandler) {\r\n      document.removeEventListener('wheel', this.boundZoomLockWheelHandler, { passive: false });\r\n    }\r\n    if (this.boundZoomLockKeydownHandler) {\r\n      document.removeEventListener('keydown', this.boundZoomLockKeydownHandler, { passive: false });\r\n    }\r\n    if (this.boundZoomLockGestureHandler) {\r\n      document.removeEventListener('gesturestart', this.boundZoomLockGestureHandler, { passive: false });\r\n      document.removeEventListener('gesturechange', this.boundZoomLockGestureHandler, { passive: false });\r\n      document.removeEventListener('gestureend', this.boundZoomLockGestureHandler, { passive: false });\r\n    }\r\n    if (this.boundZoomLockTouchMoveHandler) {\r\n      document.removeEventListener('touchmove', this.boundZoomLockTouchMoveHandler, { passive: false });\r\n    }\r\n    this.zoomLockEnabled = false;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.unlockBodyScroll = function () {\r\n    var body = document.body;\r\n    if (!body) return;\r\n    this.bodyScrollLockCount = 0;\r\n    body.classList.remove('personalizer-modal-open');\r\n    body.style.paddingRight = this.bodyScrollPreviousPaddingRight;\r\n    this.bodyScrollPreviousPaddingRight = '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.reconcileBodyScrollLock = function () {\r\n    if (!this.modal) {\r\n      this.unlockBodyScroll();\r\n      return;\r\n    }\r\n    const isActuallyOpen =\r\n      this.modal.classList.contains('is-open') &&\r\n      !this.modal.classList.contains('hidden') &&\r\n      this.modal.getAttribute('aria-hidden') === 'false';\r\n    if (isActuallyOpen) {\r\n      this.lockBodyScroll();\r\n    } else {\r\n      this.unlockBodyScroll();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.escapeHtml = function (value) {\r\n    return String(value || '')\r\n      .replace(/&/g, '&amp;')\r\n      .replace(/</g, '&lt;')\r\n      .replace(/>/g, '&gt;')\r\n      .replace(/\"/g, '&quot;')\r\n      .replace(/'/g, '&#39;');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.ensureDesignObjectUid = function (object) {\r\n    if (!object) return '';\r\n    if (object._personalizerUid) return String(object._personalizerUid);\r\n    object._personalizerUid = 'pz-' + String(this.designObjectUidCounter++);\r\n    return String(object._personalizerUid);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getDesignObjectByUid = function (uid) {\r\n    const targetUid = String(uid || '');\r\n    if (!targetUid || !this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return null;\r\n    const objects = this.canvasEngine.getDesignObjects();\r\n    return (\r\n      objects.find(\r\n        function (object) {\r\n          return this.ensureDesignObjectUid(object) === targetUid;\r\n        }.bind(this)\r\n      ) || null\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getAvailableZonesForView = function (view) {\r\n    const normalizedView = normalizeViewId(view);\r\n    return this.getTechniqueFilteredZones().filter(function (zone) {\r\n      return (zone.view || 'front') === normalizedView;\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getImpressionObjectLabel = function (object, index) {\r\n    const kind = this.getSelectedObjectKind(object);\r\n    if (kind === 'qr') {\r\n      const qrValue = String(object && object.personalizerQrValue ? object.personalizerQrValue : '').replace(/\\s+/g, ' ').trim();\r\n      return qrValue ? 'QR Code - ' + qrValue : 'QR Code ' + String(index + 1);\r\n    }\r\n    if (kind === 'text') {\r\n      const textValue = String(object && object.text ? object.text : '').replace(/\\s+/g, ' ').trim();\r\n      return textValue || 'Texte ' + String(index + 1);\r\n    }\r\n    return 'Image ' + String(index + 1);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderImpressionsSummary = function () {\r\n    if (!this.modal || !this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return;\r\n    const summaryNode = this.modal.querySelector('[data-impressions-summary-text]');\r\n    if (!summaryNode) return;\r\n    const count = this.canvasEngine.getDesignObjects().length;\r\n    summaryNode.textContent =\r\n      count > 0 ? 'Classer les zones d\\'impression (' + String(count) + ')' : 'Classer les zones d\\'impression';\r\n  };\r\n\r\n  // Left sidebar \"Zones d'impressions\" renderer.\r\n  // Important: zone cards remain visible, but add buttons are disabled when\r\n  // compatibility constraints (coeur/anti-coeur vs A3/A4, etc.) block the zone.\r\n  PersonalizerModalApp.prototype.renderImpressionsUi = function () {\r\n    if (!this.modal) return;\r\n    const listNodes = this.modal.querySelectorAll('[data-impressions-list], [data-impressions-list-sidebar]');\r\n    if (!listNodes.length) return;\r\n\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') {\r\n      listNodes.forEach(function (node) {\r\n        node.innerHTML = '<p class=\"personalizer-impressions-empty\">Aucun element.</p>';\r\n      });\r\n      return;\r\n    }\r\n\r\n    const objects = this.canvasEngine.getDesignObjects();\r\n    const selectedUid = this.selectedDesignObject ? this.ensureDesignObjectUid(this.selectedDesignObject) : '';\r\n    const views = this.getTechniqueAvailableViews();\r\n    const chunks = [];\r\n\r\n    for (let viewIndex = 0; viewIndex < views.length; viewIndex += 1) {\r\n      const view = views[viewIndex];\r\n      const viewLabel = 'Vue : ' + this.getViewLabel(view);\r\n      const zones = this.getAvailableZonesForView(view);\r\n      const keepSelectedObjectAsOccupiedForAdds = this.shouldKeepAddButtonsConstrainedForSelectedObject(view);\r\n      const addAllowedZoneIds = this.getConstraintFilteredZones(\n        zones,\n        view,\n        null,\n        {\n          ignoreCurrentSelection:\n            Number(this.customizationRules && this.customizationRules.maxActiveZones) > 0\n              ? false\n              : !keepSelectedObjectAsOccupiedForAdds\n        }\n      ).reduce(function (accumulator, zone) {\r\n        if (zone && zone.id) accumulator[String(zone.id)] = true;\r\n        return accumulator;\r\n      }, {});\r\n      const zoneBlocks = zones\r\n        .map(\r\n          function (zone, zoneIndex) {\r\n            const zoneId = String(zone.id || '');\r\n            const canAddInZone = !!addAllowedZoneIds[zoneId];\n            const zoneLabel = this.escapeHtml(zone.label || ('Zone ' + String(zoneIndex + 1)));\r\n            const zonePlacementIcon = this.getZonePlacementIconMarkup(zone, view);\r\n            const zoneViewLabel = this.escapeHtml(this.getViewDisplay(view).zoneLabel);\n            const zoneObjects = objects.filter(function (object) {\r\n              return (object.view || 'front') === view && String(object.zoneId || '') === zoneId;\r\n            });\r\n            const selectedZoneObject = zoneObjects.find(\r\n              function (object) {\r\n                return selectedUid && this.ensureDesignObjectUid(object) === selectedUid;\r\n              }.bind(this)\r\n            );\r\n            const zoneHasSelection = !!selectedZoneObject;\r\n            const selectedZoneKind = selectedZoneObject ? this.getSelectedObjectKind(selectedZoneObject) : '';\r\n\r\n            const rows = zoneObjects\r\n              .map(\r\n                function (object, rowIndex) {\r\n                  const uid = this.ensureDesignObjectUid(object);\r\n                  const kind = this.getSelectedObjectKind(object);\r\n                  const badge = this.getContentKindIconMarkup(kind);\r\n                  const label = this.escapeHtml(this.getImpressionObjectLabel(object, rowIndex));\r\n                  return (\r\n                    '<div class=\"personalizer-impression-row' + (selectedUid && selectedUid === uid ? ' is-selected' : '') + '\" draggable=\"true\" data-impression-drag data-object-uid=\"' + this.escapeHtml(uid) + '\">' +\r\n                      '<span class=\"personalizer-impression-row__badge\">' + badge + '</span>' +\r\n                      '<div class=\"personalizer-impression-row__main\">' +\r\n                        '<p class=\"personalizer-impression-row__name\">' + label + '</p>' +\r\n                      '</div>' +\r\n                      '<div class=\"personalizer-impression-row__actions\">' +\r\n                        '<button type=\"button\" class=\"personalizer-impression-row__action\" data-action=\"impression-select-object\" data-object-uid=\"' + this.escapeHtml(uid) + '\" aria-label=\"Selectionner\">' +\r\n                          '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M3 17.25V21h3.75L19.81 7.94l-3.75-3.75L3 17.25zm2.92 2.33H5v-.92l9.06-9.06.92.92-9.06 9.06zM20.71 5.63a1 1 0 0 0 0-1.41L18.78 2.3a1 1 0 0 0-1.41 0l-1.13 1.13 3.75 3.75 1.12-1.55z\"></path></svg>' +\r\n                        '</button>' +\r\n                        '<button type=\"button\" class=\"personalizer-impression-row__action personalizer-impression-row__action--delete\" data-action=\"impression-delete-object\" data-object-uid=\"' + this.escapeHtml(uid) + '\" aria-label=\"Supprimer\">' +\r\n                          '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M9 3h6l1 2h4v2H4V5h4l1-2zm1 7h2v8h-2v-8zm4 0h2v8h-2v-8zM7 10h2v8H7v-8z\"></path></svg>' +\r\n                        '</button>' +\r\n                        '<span class=\"personalizer-impression-row__drag-handle\" aria-hidden=\"true\" draggable=\"true\">' +\r\n                          '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M9 5h2v2H9zm4 0h2v2h-2zM9 11h2v2H9zm4 0h2v2h-2zM9 17h2v2H9zm4 0h2v2h-2z\"></path></svg>' +\r\n                        '</span>' +\r\n                      '</div>' +\r\n                    '</div>'\r\n                  );\r\n                }.bind(this)\r\n              )\r\n              .join('');\r\n\r\n            return (\r\n              '<section class=\"personalizer-impression-zone' + (zoneHasSelection ? ' is-active' : '') + '\" data-impression-drop-zone data-impression-zone-id=\"' + this.escapeHtml(zoneId) + '\" data-impression-view=\"' + this.escapeHtml(view) + '\">' +\r\n                '<div class=\"personalizer-impression-zone__head\">' +\r\n                  '<span class=\"personalizer-impression-zone__thumb-wrap\">' +\r\n                    zonePlacementIcon +\r\n                  '</span>' +\r\n                  '<span class=\"personalizer-impression-zone__copy\">' +\r\n                    '<h4 class=\"personalizer-impression-zone__title\">' + zoneLabel + '</h4>' +\r\n                    '<span class=\"personalizer-impression-zone__view\">' + zoneViewLabel + '</span>' +\r\n                  '</span>' +\r\n                  '<div class=\"personalizer-impression-zone__tools\">' +\r\n                    '<button type=\"button\" class=\"personalizer-impression-zone__tool' + (selectedZoneKind === 'text' ? ' is-context-active' : '') + (canAddInZone ? '' : ' is-disabled') + '\" data-action=\"impression-add-text\" data-impression-zone-id=\"' + this.escapeHtml(zoneId) + '\" data-impression-view=\"' + this.escapeHtml(view) + '\"' + (canAddInZone ? '' : ' disabled aria-disabled=\"true\" title=\"Zone indisponible selon la zone deja utilisee\"') + '>+ Texte</button>' +\r\n                    '<button type=\"button\" class=\"personalizer-impression-zone__tool' + (selectedZoneKind === 'image' ? ' is-context-active' : '') + (canAddInZone ? '' : ' is-disabled') + '\" data-action=\"impression-add-image\" data-impression-zone-id=\"' + this.escapeHtml(zoneId) + '\" data-impression-view=\"' + this.escapeHtml(view) + '\"' + (canAddInZone ? '' : ' disabled aria-disabled=\"true\" title=\"Zone indisponible selon la zone deja utilisee\"') + '>+ Image</button>' +\r\n                    '<button type=\"button\" class=\"personalizer-impression-zone__tool' + (selectedZoneKind === 'qr' ? ' is-context-active' : '') + (canAddInZone ? '' : ' is-disabled') + '\" data-action=\"impression-add-qr\" data-impression-zone-id=\"' + this.escapeHtml(zoneId) + '\" data-impression-view=\"' + this.escapeHtml(view) + '\"' + (canAddInZone ? '' : ' disabled aria-disabled=\"true\" title=\"Zone indisponible selon la zone deja utilisee\"') + '>+ QR Code</button>' +\r\n                  '</div>' +\r\n                '</div>' +\r\n                (rows || '<p class=\"personalizer-impressions-empty\">Zone vide</p>') +\r\n              '</section>'\r\n            );\r\n          }.bind(this)\r\n        )\r\n        .join('');\r\n\r\n      chunks.push(\r\n        '<section class=\"personalizer-impressions-view\"><h3 class=\"personalizer-impressions-view__title\">' +\r\n          viewLabel +\r\n          '</h3>' +\r\n          (zoneBlocks || '<p class=\"personalizer-impressions-empty\">Aucune zone disponible.</p>') +\r\n        '</section>'\r\n      );\r\n    }\r\n\r\n    const maxActiveZones = Number(this.customizationRules && this.customizationRules.maxActiveZones) || 0;\n    const ruleNotice = maxActiveZones === 1\n      ? '<p class=\"personalizer-impressions-rule-note\">Choisissez un seul emplacement de personnalisation. Vous pourrez d\u00E9placer votre contenu vers un autre emplacement.</p>'\n      : '';\n    const monoNotice = this.usesSharedMarkingColor()\n      ? '<p class=\"personalizer-impressions-rule-note\">Le texte, les images et les QR Codes utilisent une couleur de marquage commune. Pour un meilleur r\u00E9sultat, utilisez un logo simple avec un fond transparent.</p>'\n      : '';\n    const html = ruleNotice + monoNotice + chunks.join('');\n    listNodes.forEach(function (node) {\r\n      node.innerHTML = html;\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getContentKindIconMarkup = function (kind) {\r\n    const normalizedKind = String(kind || 'image').toLowerCase();\r\n    if (normalizedKind === 'text') {\r\n      return '<span class=\"personalizer-kind-icon personalizer-kind-icon--text\" aria-hidden=\"true\">Aa</span>';\r\n    }\r\n    if (normalizedKind === 'qr') {\r\n      return (\r\n        '<svg class=\"personalizer-kind-icon personalizer-kind-icon--svg\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\">' +\r\n          '<path d=\"M3 3h7v7H3V3Zm2 2v3h3V5H5Zm9-2h7v7h-7V3Zm2 2v3h3V5h-3ZM3 14h7v7H3v-7Zm2 2v3h3v-3H5Zm9-2h3v3h-3v-3Zm4 0h3v3h-3v-3Zm-4 4h3v3h-3v-3Zm4 0h1v1h2v2h-4v-3Z\" fill=\"currentColor\"></path>' +\r\n        '</svg>'\r\n      );\r\n    }\r\n    return (\r\n      '<svg class=\"personalizer-kind-icon personalizer-kind-icon--svg\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\">' +\r\n        '<path d=\"M4 6h11a2 2 0 0 1 2 2v1h-2V8H6v8h12v-4h2v5a2 2 0 0 1-2 2H4V6Zm3 8 2.4-2.6 2.1 2 2-2 2.5 2.6H7Zm10-9h2V2h2v3h3v2h-3v3h-2V7h-2V5Z\" fill=\"currentColor\"></path>' +\r\n      '</svg>'\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setPendingImpressionMove = function (uid) {\r\n    if (!this.modal) return;\r\n    const nextUid = String(uid || '');\r\n    this.draggingImpressionUid = nextUid;\r\n    this.modal.querySelectorAll('[data-impression-drag].is-dragging').forEach(function (node) {\r\n      node.classList.remove('is-dragging');\r\n    });\r\n    if (!nextUid) {\r\n      this.clearImpressionDropTargets();\r\n      return;\r\n    }\r\n    this.modal.querySelectorAll('[data-impression-drag][data-object-uid=\"' + nextUid + '\"]').forEach(function (node) {\r\n      node.classList.add('is-dragging');\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.clearPendingImpressionMove = function () {\r\n    this.setPendingImpressionMove('');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.clearImpressionLongPressTimer = function () {\r\n    if (this.impressionLongPressTimer) {\r\n      window.clearTimeout(this.impressionLongPressTimer);\r\n      this.impressionLongPressTimer = 0;\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.releaseImpressionPointerCapture = function () {\r\n    const touchState = this.impressionTouchState;\r\n    if (!touchState || !touchState.captureNode || !touchState.captureNode.releasePointerCapture) return;\r\n    if (!Number.isFinite(touchState.pointerId)) return;\r\n    try {\r\n      touchState.captureNode.releasePointerCapture(touchState.pointerId);\r\n    } catch (_error) {\r\n      // Ignore capture release failures on unsupported browsers.\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.resetImpressionTouchState = function () {\r\n    this.clearImpressionLongPressTimer();\r\n    this.releaseImpressionPointerCapture();\r\n    this.impressionTouchState = null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getImpressionDropTargetFromPoint = function (clientX, clientY) {\r\n    if (!Number.isFinite(clientX) || !Number.isFinite(clientY) || typeof document === 'undefined') return null;\r\n    const hit = document.elementFromPoint(clientX, clientY);\r\n    if (!hit || !hit.closest) return null;\r\n    const dropZone = hit.closest('[data-impression-drop-zone]');\r\n    if (!dropZone) return null;\r\n    const zoneId = String(dropZone.dataset.impressionZoneId || '');\r\n    const view = String(dropZone.dataset.impressionView || 'front');\r\n    return {\r\n      node: dropZone,\r\n      zoneId: zoneId,\r\n      view: view\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.updateImpressionTouchDropTarget = function (clientX, clientY) {\r\n    const touchState = this.impressionTouchState;\r\n    if (!touchState || !touchState.isDragging) return null;\r\n\r\n    const objectUid = this.draggingImpressionUid || touchState.objectUid;\r\n    const object = objectUid ? this.getDesignObjectByUid(objectUid) : null;\r\n    const target = this.getImpressionDropTargetFromPoint(clientX, clientY);\r\n\r\n    this.clearImpressionDropTargets();\r\n    if (!object || !target || !target.zoneId || !this.isZoneAllowedForObject(target.zoneId, target.view, object)) {\r\n      return null;\r\n    }\r\n\r\n    target.node.classList.add('is-drop-target');\r\n    return target;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.beginImpressionTouchDrag = function (impressionsList, rowNode, event, options) {\r\n    if (!impressionsList || !rowNode || !event) return;\r\n    const settings = options || {};\r\n    const objectUid = String(rowNode.dataset.objectUid || '');\r\n    if (!objectUid) return;\r\n\r\n    this.clearImpressionLongPressTimer();\r\n    this.impressionTouchState = {\r\n      pointerId: event.pointerId,\r\n      objectUid: objectUid,\r\n      startX: Number(event.clientX) || 0,\r\n      startY: Number(event.clientY) || 0,\r\n      isDragging: false,\r\n      captureNode: impressionsList\r\n    };\r\n\r\n    if (settings.immediateStart) {\r\n      this.impressionTouchState.isDragging = true;\r\n      this.suppressNextImpressionClick = true;\r\n      this.setPendingImpressionMove(objectUid);\r\n      if (impressionsList.setPointerCapture && Number.isFinite(event.pointerId)) {\r\n        try {\r\n          impressionsList.setPointerCapture(event.pointerId);\r\n        } catch (_error) {\r\n          // Ignore pointer capture failures on unsupported browsers.\r\n        }\r\n      }\r\n      this.updateImpressionTouchDropTarget(event.clientX, event.clientY);\r\n      return;\r\n    }\r\n\r\n    this.impressionLongPressTimer = window.setTimeout(\r\n      function () {\r\n        if (!this.impressionTouchState || this.impressionTouchState.objectUid !== objectUid) return;\r\n        this.impressionTouchState.isDragging = true;\r\n        this.suppressNextImpressionClick = true;\r\n        this.setPendingImpressionMove(objectUid);\r\n        if (impressionsList.setPointerCapture && Number.isFinite(event.pointerId)) {\r\n          try {\r\n            impressionsList.setPointerCapture(event.pointerId);\r\n          } catch (_error) {\r\n            // Ignore pointer capture failures on unsupported browsers.\r\n          }\r\n        }\r\n        this.updateImpressionTouchDropTarget(event.clientX, event.clientY);\r\n      }.bind(this),\r\n      220\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.finishImpressionTouchDrag = function (event) {\r\n    const touchState = this.impressionTouchState;\r\n    if (!touchState) return false;\r\n\r\n    const wasDragging = !!touchState.isDragging;\r\n    const clientX = event && Number.isFinite(event.clientX) ? Number(event.clientX) : touchState.startX;\r\n    const clientY = event && Number.isFinite(event.clientY) ? Number(event.clientY) : touchState.startY;\r\n\r\n    this.clearImpressionLongPressTimer();\r\n\r\n    if (wasDragging) {\r\n      const target = this.updateImpressionTouchDropTarget(clientX, clientY);\r\n      if (target && target.zoneId) {\r\n        this.moveImpressionObjectToZone(touchState.objectUid, target.zoneId, target.view);\r\n      } else {\r\n        this.clearPendingImpressionMove();\r\n      }\r\n      this.clearImpressionDropTargets();\r\n      this.releaseImpressionPointerCapture();\r\n      this.impressionTouchState = null;\r\n      return true;\r\n    }\r\n\r\n    this.releaseImpressionPointerCapture();\r\n    this.impressionTouchState = null;\r\n    return false;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.clearImpressionDropTargets = function () {\r\n    if (!this.modal) return;\r\n    this.modal.querySelectorAll('[data-impressions-list] .is-drop-target, [data-impressions-list-sidebar] .is-drop-target').forEach(function (node) {\r\n      node.classList.remove('is-drop-target');\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.moveImpressionObjectToZone = function (uid, zoneId, view) {\r\n    const object = this.getDesignObjectByUid(uid);\r\n    if (!object || !this.canvasEngine || typeof this.canvasEngine.reassignObjectToPlacement !== 'function') return;\r\n    const targetZone = this.getZoneById(zoneId);\r\n    if (!targetZone) return;\r\n\r\n    const targetView = normalizeViewId(view || targetZone.view || object.view);\r\n    if (!this.isZoneAllowedForObject(targetZone.id, targetView, object)) {\r\n      this.clearImpressionDropTargets();\r\n      this.clearPendingImpressionMove();\r\n      return;\r\n    }\r\n    const moved = this.canvasEngine.reassignObjectToPlacement(object, targetZone, targetView);\n    if (!moved) return;\n\n    this.clearPendingImpressionMove();\n    this.syncSelectedObjectZoneContext(object).then(function () {\n      this.renderImpressionsSummary();\n      this.renderImpressionsUi();\n      this.renderPanelPlacementControls();\n    }.bind(this));\n  };\r\n\r\n  PersonalizerModalApp.prototype.selectZoneFromImpressionsPanel = function (zoneId, view) {\n    const zone = this.getZoneById(zoneId);\r\n    if (!zone) return;\r\n    const targetView = normalizeViewId(view || zone.view);\n    this.zoneOverlayRequested = true;\n    this.isApplyingPlacement = true;\r\n    try {\r\n      if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\r\n        this.canvasEngine.clearSelection();\r\n      }\r\n      this.selectedDesignObject = null;\r\n      this.selectedDesignKind = '';\r\n      this.setActiveView(this.getNavigationViewForPhysicalView(targetView));\r\n      this.selectedZone = zone;\r\n      this.applyActiveZoneToCanvas();\r\n      if (this.canvasEngine && typeof this.canvasEngine.focusOnZone === 'function') {\r\n        this.canvasEngine.focusOnZone(zone);\r\n      }\r\n      if (this.activeControlsPanel !== 'default') {\r\n        this.setControlsPanel('default');\r\n      }\r\n      this.syncTextPanelInputFromSelection();\r\n      this.syncQrPanelInputFromSelection();\r\n      this.syncDimensionsToolUi();\r\n      this.renderImpressionsUi();\r\n    } finally {\r\n      this.isApplyingPlacement = false;\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.selectObjectFromImpressionsPanel = function (uid, options) {\n    const settings = options || {};\r\n    const object = this.getDesignObjectByUid(uid);\r\n    if (!object || !this.canvasEngine || typeof this.canvasEngine.selectDesignObject !== 'function') return;\r\n    this.syncSelectedObjectZoneContext(object).then(function () {\n      const kind = this.getSelectedObjectKind(object);\n      if (settings.keepImpressionsPanel) {\n        if (!settings.skipImpressionsRerender) this.renderImpressionsUi();\n        this.syncDimensionsToolUi();\n        return;\n      }\n\n      if (kind === 'text') {\n        this.setControlsPanel('text');\n        this.syncTextPanelInputFromSelection();\n      } else if (kind === 'qr') {\n        this.setControlsPanel('qr');\n        this.syncQrPanelInputFromSelection();\n      } else if (kind === 'image') {\n        this.setControlsPanel('image');\n      }\n    }.bind(this));\n  };\n\n  PersonalizerModalApp.prototype.syncSelectedObjectZoneContext = function (object) {\n    if (!object || !this.canvasEngine) return Promise.resolve(false);\n    const objectView = normalizeViewId(object.view);\n    const objectZone = object.zoneId ? this.getZoneById(object.zoneId) : null;\n    this.selectedDesignObject = object;\n    this.selectedDesignKind = this.getSelectedObjectKind(object);\n    this.zoneOverlayRequested = true;\n    if (objectZone) this.selectedZone = objectZone;\n\n    return Promise.resolve(this.setActiveView(this.getNavigationViewForPhysicalView(objectView))).then(function () {\n      if (objectZone) this.selectedZone = objectZone;\n      this.applyActiveZoneToCanvas();\n      return this.canvasEngine.selectDesignObject(object);\n    }.bind(this));\n  };\n\r\n  PersonalizerModalApp.prototype.deleteObjectFromImpressionsPanel = function (uid) {\r\n    const object = this.getDesignObjectByUid(uid);\r\n    if (!object || !this.canvasEngine || typeof this.canvasEngine.deleteDesignObject !== 'function') return;\r\n    const deleted = this.canvasEngine.deleteDesignObject(object);\r\n    if (!deleted) return;\r\n    this.selectedDesignObject = null;\n    this.selectedDesignKind = '';\n    this.renderImpressionsSummary();\n    this.renderImpressionsUi();\n    this.renderSizesUi();\n  };\r\n\r\n  PersonalizerModalApp.prototype.toNumericValue = function (value, fallback) {\r\n    if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n    if (value && typeof value === 'object') {\r\n      const candidateKeys = ['amount', 'price', 'value'];\r\n      for (let index = 0; index < candidateKeys.length; index += 1) {\r\n        const nestedValue = value[candidateKeys[index]];\r\n        if (nestedValue === undefined || nestedValue === null || nestedValue === value) continue;\r\n        const parsedNested = this.toNumericValue(nestedValue, NaN);\r\n        if (Number.isFinite(parsedNested)) return parsedNested;\r\n      }\r\n    }\r\n    if (typeof value === 'string') {\r\n      const normalized = value\r\n        .replace(/\\s/g, '')\r\n        .replace(/[^0-9,.-]/g, '')\r\n        .replace(',', '.');\r\n      const parsed = Number(normalized);\r\n      if (Number.isFinite(parsed)) return parsed;\r\n    }\r\n    return fallback;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizePricingRules = function (value) {\r\n    if (value == null) return null;\r\n    if (Array.isArray(value)) return value;\r\n    if (typeof value === 'string') {\r\n      const trimmed = value.trim();\r\n      if (!trimmed) return null;\r\n      try {\r\n        return JSON.parse(trimmed);\r\n      } catch (error) {\r\n        return null;\r\n      }\r\n    }\r\n    if (typeof value === 'object') {\r\n      const normalized = Object.assign({}, value);\r\n      if (typeof normalized.quantity_discounts === 'string') {\r\n        normalized.quantity_discounts = this.normalizePricingRules(normalized.quantity_discounts);\r\n      }\r\n      if (typeof normalized.tiers === 'string') {\r\n        normalized.tiers = this.normalizePricingRules(normalized.tiers);\r\n      }\r\n      return normalized;\r\n    }\r\n    return null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.parsePricingTiers = function () {\r\n    const rules = this.normalizePricingRules(this.pricingRules);\r\n    if (!rules) return [];\r\n    const list = Array.isArray(rules)\r\n      ? rules\r\n      : Array.isArray(rules.quantity_discounts)\r\n        ? rules.quantity_discounts\r\n        : Array.isArray(rules.tiers)\r\n          ? rules.tiers\r\n          : [];\r\n\r\n    return list\r\n      .map(\r\n        function (tier) {\r\n          const min = this.toNumericValue(tier.min ?? tier.minQty ?? tier.min_qty ?? tier.quantity_min, 1);\r\n          const max = this.toNumericValue(tier.max ?? tier.max_qty ?? tier.quantity_max, Number.POSITIVE_INFINITY);\r\n          let multiplier = 1;\r\n          if (tier.multiplier !== undefined) multiplier = this.toNumericValue(tier.multiplier, 1);\r\n          else if (tier.coefficient !== undefined) multiplier = this.toNumericValue(tier.coefficient, 1);\r\n          else if (tier.coef !== undefined) multiplier = this.toNumericValue(tier.coef, 1);\r\n          else if (tier.discount_percent !== undefined || tier.discountPercent !== undefined) {\r\n            const percent = this.toNumericValue(tier.discount_percent ?? tier.discountPercent, 0);\r\n            multiplier = Math.max(0, 1 - percent / 100);\r\n          }\r\n          return { min: min, max: max, multiplier: multiplier };\r\n        }.bind(this)\r\n      )\r\n      .filter(function (tier) {\r\n        return Number.isFinite(tier.min) && tier.min > 0 && Number.isFinite(tier.multiplier);\r\n      })\r\n      .sort(function (a, b) {\r\n        return a.min - b.min;\r\n      });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getLowestProductUnitPrice = function () {\r\n    const stockById = {};\r\n    (Array.isArray(this.config && this.config.variantsStock) ? this.config.variantsStock : []).forEach(function (variant) {\r\n      stockById[String(variant && variant.id ? variant.id : '')] = variant && variant.available !== false;\r\n    });\r\n\r\n    const variants = Array.isArray(this.config && this.config.variantPricing) ? this.config.variantPricing : [];\r\n    let lowestBasePrice = Number.POSITIVE_INFINITY;\r\n    let lowestNativePrice = Number.POSITIVE_INFINITY;\r\n\r\n    variants.forEach(function (variant) {\r\n      const variantId = String(variant && variant.id ? variant.id : '');\r\n      if (stockById[variantId] === false) return;\r\n      const basePrice = Math.max(0, Math.round(Number(variant && variant.price) || 0));\r\n      if (basePrice > 0) {\r\n        lowestBasePrice = Math.min(lowestBasePrice, basePrice);\r\n        lowestNativePrice = Math.min(lowestNativePrice, basePrice);\r\n      }\r\n      const priceBreaks = Array.isArray(variant && variant.quantity_price_breaks)\r\n        ? variant.quantity_price_breaks\r\n        : [];\r\n      priceBreaks.forEach(function (priceBreak) {\r\n        const breakPrice = Math.max(0, Math.round(Number(priceBreak && priceBreak.price) || 0));\r\n        if (breakPrice > 0) lowestNativePrice = Math.min(lowestNativePrice, breakPrice);\r\n      });\r\n    });\r\n\r\n    if (!Number.isFinite(lowestBasePrice)) {\r\n      lowestBasePrice = Math.max(0, Math.round(Number(this.config && this.config.basePriceCents) || 0));\r\n    }\r\n    if (!Number.isFinite(lowestNativePrice)) lowestNativePrice = lowestBasePrice;\r\n\r\n    let lowestDiscountMultiplier = 1;\r\n    this.parsePricingTiers().forEach(function (tier) {\r\n      const multiplier = Number(tier && tier.multiplier);\r\n      if (Number.isFinite(multiplier) && multiplier >= 0) {\r\n        lowestDiscountMultiplier = Math.min(lowestDiscountMultiplier, multiplier);\r\n      }\r\n    });\r\n    const lowestDiscountedPrice = Math.max(0, Math.round(lowestBasePrice * lowestDiscountMultiplier));\r\n    return Math.min(lowestNativePrice, lowestDiscountedPrice);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getNextPricingTier = function (currentQuantity) {\r\n    const qty = Math.max(0, Math.floor(Number(currentQuantity) || 0));\r\n    const tiers = this.parsePricingTiers();\r\n    for (let index = 0; index < tiers.length; index += 1) {\r\n      if (tiers[index].min > qty) return tiers[index];\r\n    }\r\n    return null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getCurrentPricingTier = function (currentQuantity) {\r\n    const qty = Math.max(0, Math.floor(Number(currentQuantity) || 0));\r\n    const tiers = this.parsePricingTiers();\r\n    let currentTier = null;\r\n    for (let index = 0; index < tiers.length; index += 1) {\r\n      const tier = tiers[index];\r\n      if (tier.min > qty) break;\r\n      if (Number.isFinite(tier.max) && qty > tier.max) continue;\r\n      currentTier = tier;\r\n    }\r\n    return currentTier;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getVariantPricingEntry = function (variantId) {\r\n    const wantedId = String(variantId || '');\r\n    if (!wantedId) return null;\r\n    const variants = Array.isArray(this.config.variantPricing) ? this.config.variantPricing : [];\r\n    return (\r\n      variants.find(function (variant) {\r\n        return String(variant && variant.id ? variant.id : '') === wantedId;\r\n      }) || null\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFallbackVariantPricingEntryWithBreaks = function () {\r\n    const availableIds = new Set(\r\n      this.getAvailableSizeVariants().map(function (variant) {\r\n        return String(variant && variant.id ? variant.id : '');\r\n      })\r\n    );\r\n    const variants = Array.isArray(this.config.variantPricing) ? this.config.variantPricing : [];\r\n    return (\r\n      variants.find(function (variant) {\r\n        const key = String(variant && variant.id ? variant.id : '');\r\n        const breaks = Array.isArray(variant && variant.quantity_price_breaks) ? variant.quantity_price_breaks : [];\r\n        return availableIds.has(key) && breaks.length > 0;\r\n      }) || null\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getVariantPriceBreaks = function (variantId) {\r\n    const variant = this.getVariantPricingEntry(variantId) || this.getFallbackVariantPricingEntryWithBreaks();\r\n    const breaks = Array.isArray(variant && variant.quantity_price_breaks) ? variant.quantity_price_breaks : [];\r\n    return breaks\r\n      .map(\r\n        function (priceBreak) {\r\n          return {\r\n            min: Math.max(1, Math.floor(this.toNumericValue(priceBreak.minimum_quantity, 1))),\r\n            price: Math.max(0, Math.round(this.toNumericValue(priceBreak.price, 0)))\r\n          };\r\n        }.bind(this)\r\n      )\r\n      .filter(function (priceBreak) {\r\n        return priceBreak.min > 0 && priceBreak.price >= 0;\r\n      })\r\n      .sort(function (left, right) {\r\n        return left.min - right.min;\r\n      });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPricingTierDiscountPercent = function (tier) {\n    if (!tier) return 0;\n    if (tier.discount_percent !== undefined || tier.discountPercent !== undefined) {\n      const explicitPercent = this.toNumericValue(tier.discount_percent ?? tier.discountPercent, 0);\n      return Math.max(0, Math.round(explicitPercent * 10000) / 10000);\n    }\n    const multiplier =\r\n      tier.multiplier !== undefined ? Number(tier.multiplier)\r\n      : tier.coefficient !== undefined ? Number(tier.coefficient)\r\n      : tier.coef !== undefined ? Number(tier.coef)\r\n      : 1;\r\n    if (!Number.isFinite(multiplier)) return 0;\n    return Math.max(0, Math.round((1 - multiplier) * 1000000) / 10000);\n  };\n\n  PersonalizerModalApp.prototype.formatDiscountPercent = function (value) {\n    const percent = Math.max(0, Math.round((Number(value) || 0) * 100) / 100);\n    return percent.toLocaleString('fr-FR', { maximumFractionDigits: 2 });\n  };\n\r\n  PersonalizerModalApp.prototype.getVariantUnitPriceForQuantity = function (variantId, quantity) {\r\n    const variant = this.getVariantPricingEntry(variantId);\r\n    const fallbackBasePrice =\r\n      this.currentVariant && Number(this.currentVariant.price)\r\n        ? Number(this.currentVariant.price)\r\n        : Number(this.config.basePriceCents || 0);\r\n    const baseUnitPrice = Math.max(0, Math.round(this.toNumericValue(variant && variant.price, fallbackBasePrice)));\r\n    const qty = Math.max(1, Math.floor(Number(quantity) || 0));\r\n    const breaks = this.getVariantPriceBreaks(variantId);\r\n    let finalUnitPrice = baseUnitPrice;\r\n    let activeTierMin = null;\r\n    let nextTierMin = null;\r\n    let nextTierPriceCents = null;\r\n\r\n    for (let index = 0; index < breaks.length; index += 1) {\r\n      const priceBreak = breaks[index];\r\n      if (qty >= priceBreak.min) {\r\n        finalUnitPrice = priceBreak.price;\r\n        activeTierMin = priceBreak.min;\r\n        continue;\r\n      }\r\n      nextTierMin = priceBreak.min;\r\n      nextTierPriceCents = priceBreak.price;\r\n      break;\r\n    }\r\n\r\n    return {\r\n      baseUnitPriceCents: baseUnitPrice,\r\n      finalUnitPriceCents: finalUnitPrice,\r\n      savingsUnitCents: Math.max(0, baseUnitPrice - finalUnitPrice),\r\n      activeTierMin: activeTierMin,\r\n      nextTierMin: nextTierMin,\r\n      nextTierPriceCents: nextTierPriceCents\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getReferenceProductPricingVariantId = function () {\r\n    const selectedVariantIds = Object.keys(this.sizeQuantities || {}).filter(\r\n      function (variantId) {\r\n        return Math.max(0, Number(this.sizeQuantities[variantId]) || 0) > 0;\r\n      }.bind(this)\r\n    );\r\n    if (selectedVariantIds.length) {\r\n      const selectedWithBreaks = selectedVariantIds.find(\r\n        function (variantId) {\r\n          return this.getVariantPriceBreaks(variantId).length > 0;\r\n        }.bind(this)\r\n      );\r\n      return String(selectedWithBreaks || selectedVariantIds[0]);\r\n    }\r\n    if (this.currentVariant && this.currentVariant.id && this.getVariantPriceBreaks(this.currentVariant.id).length > 0) {\r\n      return String(this.currentVariant.id);\r\n    }\r\n    if (this.currentVariant && this.currentVariant.id) return String(this.currentVariant.id);\r\n    const available = this.getAvailableSizeVariants();\r\n    if (available.length) {\r\n      const availableWithBreaks = available.find(\r\n        function (variant) {\r\n          return this.getVariantPriceBreaks(variant && variant.id).length > 0;\r\n        }.bind(this)\r\n      );\r\n      return String((availableWithBreaks || available[0]).id || '');\r\n    }\r\n    const fallbackVariant = this.getFallbackVariantPricingEntryWithBreaks();\r\n    return fallbackVariant && fallbackVariant.id ? String(fallbackVariant.id) : '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getProductPricingSummary = function () {\n    const selectedQty = this.getPreviewSelectedSizeQuantity();\r\n    const selectedVariants = this.getAvailableSizeVariants()\r\n      .map(\r\n        function (variant) {\r\n          const qty = this.getSizeQuantityByVariantId(variant.id);\r\n          if (!qty) return null;\r\n          return {\r\n            id: String(variant.id),\r\n            quantity: Math.max(0, Math.floor(Number(qty) || 0))\r\n          };\r\n        }.bind(this)\r\n      )\r\n      .filter(Boolean);\r\n\r\n    let totalBaseCents = 0;\n    let totalFinalCents = 0;\n\r\n    if (selectedVariants.length) {\n      selectedVariants.forEach(\n        function (variantEntry) {\n          const unitPricing = this.getVariantUnitPriceForQuantity(variantEntry.id, variantEntry.quantity);\n          totalBaseCents += unitPricing.finalUnitPriceCents * variantEntry.quantity;\n        }.bind(this)\n      );\n    } else {\n      const fallbackPricing = this.getVariantUnitPriceForQuantity(this.getReferenceProductPricingVariantId(), 1);\n      totalBaseCents = fallbackPricing.finalUnitPriceCents;\n    }\n\r\n    const currentTier = this.getCurrentPricingTier(selectedQty);\r\n    const nextTier = this.getNextPricingTier(selectedQty);\r\n    const currentDiscountPercent = currentTier ? this.getPricingTierDiscountPercent(currentTier) : 0;\r\n    const nextDiscountPercent = nextTier ? this.getPricingTierDiscountPercent(nextTier) : null;\r\n    const nextTierMin = nextTier && Number.isFinite(nextTier.min) ? nextTier.min : null;\r\n    if (selectedVariants.length) {\n      totalFinalCents = selectedVariants.reduce(\n        function (sum, variantEntry) {\n          const unitPricing = this.getVariantUnitPriceForQuantity(variantEntry.id, variantEntry.quantity);\n          const lineSubtotalCents = unitPricing.finalUnitPriceCents * variantEntry.quantity;\n          const lineDiscountCents = Math.min(\n            lineSubtotalCents,\n            Math.max(0, Math.round(lineSubtotalCents * currentDiscountPercent / 100))\n          );\n          return sum + lineSubtotalCents - lineDiscountCents;\n        }.bind(this),\n        0\n      );\n    } else {\n      const fallbackDiscountCents = Math.min(\n        totalBaseCents,\n        Math.max(0, Math.round(totalBaseCents * currentDiscountPercent / 100))\n      );\n      totalFinalCents = totalBaseCents - fallbackDiscountCents;\n    }\n    totalFinalCents = Math.max(0, Math.round(totalFinalCents || 0));\n    const totalDiscountCents = Math.max(0, Math.round(totalBaseCents || 0) - totalFinalCents);\r\n\r\n    return {\r\n      totalBaseCents: Math.max(0, Math.round(totalBaseCents || 0)),\r\n      totalFinalCents: totalFinalCents,\r\n      totalDiscountCents: totalDiscountCents,\r\n      activeTierMin: currentTier && Number.isFinite(currentTier.min) ? currentTier.min : null,\r\n      nextTierMin: nextTierMin,\r\n      currentDiscountPercent: currentDiscountPercent,\r\n      nextDiscountPercent: nextDiscountPercent,\r\n      nextTierMissingQty:\r\n        nextTierMin && selectedQty > 0\r\n          ? Math.max(0, nextTierMin - selectedQty)\r\n          : 0\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getDisplayPricingSummary = function () {\r\n    const selectedQty = this.getPreviewSelectedSizeQuantity();\r\n    const productPricing = this.getProductPricingSummary();\r\n    const feePricing = this.getPendingFeePricingSummary();\r\n    return {\r\n      selectedQty: selectedQty,\r\n      productBaseCents: productPricing.totalBaseCents,\r\n      productFinalCents: productPricing.totalFinalCents,\r\n      productDiscountCents: productPricing.totalDiscountCents,\r\n      productActiveTierMin: productPricing.activeTierMin,\r\n      productNextTierMin: productPricing.nextTierMin,\r\n      productCurrentDiscountPercent: productPricing.currentDiscountPercent,\r\n      productNextDiscountPercent: productPricing.nextDiscountPercent,\r\n      productNextTierMissingQty: productPricing.nextTierMissingQty,\r\n      feeBaseCents: feePricing.totalBaseCents,\r\n      feeFinalCents: feePricing.totalFinalCents,\r\n      feeDiscountCents: feePricing.totalDiscountCents,\r\n      feeActiveTierMin: null,\r\n      feeNextTierMin: null,\r\n      feeCurrentDiscountPercent: feePricing.currentDiscountPercent,\r\n      feeNextDiscountPercent: null,\r\n      feeNextTierMissingQty: 0,\r\n      totalBaseCents: Math.max(0, productPricing.totalBaseCents + feePricing.totalBaseCents),\r\n      totalFinalCents: Math.max(0, productPricing.totalFinalCents + feePricing.totalFinalCents),\r\n      totalSavingsCents: Math.max(0, productPricing.totalDiscountCents + feePricing.totalDiscountCents),\r\n      productDiscountLabel: '',\r\n      feeDiscountLabel: ''\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getProductDiscountLabel = function (summary) {\r\n    if (summary && summary.productDiscountLabel) return String(summary.productDiscountLabel);\r\n    return 'Remise palier';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getFeeDiscountLabel = function (summary) {\r\n    if (summary && summary.feeDiscountLabel) return String(summary.feeDiscountLabel);\r\n    return 'Remise frais palier';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getTechniqueFilteredZones = function () {\r\n    return window.PersonalizerMetafields.getAvailableZones(this.zones, this.selectedTechnique);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getTechniqueById = function (techniqueId) {\r\n    const wantedId = String(techniqueId || '');\r\n    if (!wantedId) return null;\r\n    return (\r\n      this.techniques.find(function (technique) {\r\n        return String(technique && technique.id || '') === wantedId;\r\n      }) || null\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getZoneTechniqueTransitionKey = function (zone) {\r\n    if (!zone) return '';\r\n    const zoneId = String(zone.id || '').toLowerCase();\r\n    const label = String(zone.label || '').toLowerCase();\r\n    if (label === 'coeur' || zoneId.indexOf('coeur') >= 0 && zoneId.indexOf('anti-coeur') < 0) return 'coeur';\r\n    if (label === 'anti-coeur' || zoneId.indexOf('anti-coeur') >= 0) return 'anti-coeur';\r\n    if (label.indexOf('avant a3') >= 0 || zoneId.indexOf('front-a3') >= 0) return 'front-a3';\r\n    if (label.indexOf('avant a4') >= 0 || zoneId.indexOf('front-a4') >= 0) return 'front-a4';\r\n    if (label.indexOf('dos a3') >= 0 || zoneId.indexOf('back-a3') >= 0) return 'back-a3';\r\n    if (label.indexOf('dos a4') >= 0 || zoneId.indexOf('back-a4') >= 0) return 'back-a4';\r\n    if (label === 'dos' || zoneId.indexOf('back-dos') >= 0 || zoneId === 'dos') return 'dos';\r\n    if (label === 'col' || zoneId.indexOf('back-col') >= 0 || zoneId === 'col') return 'col';\r\n    return zoneId;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getTechniqueTransitionTargetKey = function (sourceZone, targetTechniqueId) {\r\n    const sourceKey = this.getZoneTechniqueTransitionKey(sourceZone);\r\n    const targetId = String(targetTechniqueId || '').toLowerCase();\r\n    const isTargetBroderie = targetId.indexOf('brod') >= 0;\r\n    const isTargetFlocage = targetId.indexOf('floc') >= 0;\r\n\r\n    if (isTargetBroderie) {\r\n      if (sourceKey === 'front-a3' || sourceKey === 'front-a4') return 'coeur';\r\n      if (sourceKey === 'back-a3' || sourceKey === 'back-a4') return 'dos';\r\n      return sourceKey;\r\n    }\r\n\r\n    if (isTargetFlocage) {\r\n      if (sourceKey === 'dos' || sourceKey === 'back-a3' || sourceKey === 'back-a4' || sourceKey === 'col') return 'back-a4';\r\n      return sourceKey;\r\n    }\r\n\r\n    return sourceKey;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.findTechniqueZoneByTransitionKey = function (targetTechnique, transitionKey, sourceZone) {\r\n    const targetZones = window.PersonalizerMetafields.getAvailableZones(this.zones, targetTechnique);\r\n    if (!targetZones.length) return null;\r\n\r\n    const direct = targetZones.find(\r\n      function (zone) {\r\n        return this.getZoneTechniqueTransitionKey(zone) === transitionKey;\r\n      }.bind(this)\r\n    );\r\n    if (direct) return direct;\r\n\r\n    const sourceView = sourceZone && sourceZone.view ? String(sourceZone.view) : '';\r\n    const sameViewZones = sourceView\r\n      ? targetZones.filter(function (zone) { return String(zone && zone.view || '') === sourceView; })\r\n      : [];\r\n    if (sameViewZones.length) {\r\n      return sameViewZones.find(Boolean) || null;\r\n    }\r\n\r\n    return targetZones[0] || null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.reassignDesignObjectsForTechnique = function (targetTechniqueId) {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return;\r\n    if (typeof this.canvasEngine.reassignObjectToPlacement !== 'function') return;\r\n\r\n    const targetTechnique = this.getTechniqueById(targetTechniqueId);\r\n    if (!targetTechnique) return;\r\n\r\n    const objects = this.canvasEngine.getDesignObjects();\r\n    objects.forEach(\r\n      function (object) {\r\n        const sourceZone = this.getZoneById(object && object.zoneId ? object.zoneId : '');\r\n        const transitionKey = this.getTechniqueTransitionTargetKey(sourceZone, targetTechniqueId);\r\n        const targetZone = this.findTechniqueZoneByTransitionKey(targetTechnique, transitionKey, sourceZone);\r\n        if (!targetZone) return;\r\n        this.canvasEngine.reassignObjectToPlacement(object, targetZone, targetZone.view, {\r\n          forceFitWidthRatio: 0.8\r\n        });\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.enforceSelectedTechniqueOnObjects = function () {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return;\r\n    if (typeof this.canvasEngine.deleteDesignObject !== 'function') return;\r\n\r\n    const allowedZoneIds = new Set(\r\n      this.getTechniqueFilteredZones().map(function (zone) {\r\n        return zone.id;\r\n      })\r\n    );\r\n\r\n    const objects = this.canvasEngine.getDesignObjects();\r\n    objects.forEach(\r\n      function (object) {\r\n        const zoneId = object && object.zoneId ? object.zoneId : '';\r\n        if (!zoneId) return;\r\n        if (allowedZoneIds.has(zoneId)) return;\r\n        this.canvasEngine.deleteDesignObject(object);\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyTechniqueById = function (targetId) {\r\n    this.selectedTechnique =\r\n      this.techniques.find(function (technique) {\r\n        return technique.id === targetId;\r\n      }) || null;\r\n\r\n    this.reassignDesignObjectsForTechnique(targetId);\r\n    this.enforceSelectedTechniqueOnObjects();\r\n    this.renderTechniques();\r\n    this.renderPositionPresets();\r\n    this.applyActiveZoneToCanvas();\n    this.syncBackgroundWithVariant();\n    this.updatePrice();\n    if (this.usesSharedMarkingColor()) this.applySharedMarkingColor(this.sharedMarkingColor);\n  };\n\r\n  PersonalizerModalApp.prototype.clearAllDesignObjects = function () {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return;\r\n    if (typeof this.canvasEngine.deleteDesignObject !== 'function') return;\r\n\r\n    const objects = this.canvasEngine.getDesignObjects();\r\n    objects.forEach(\r\n      function (object) {\r\n        this.canvasEngine.deleteDesignObject(object);\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openTechniqueChangeConfirmation = function (onConfirm) {\r\n    this.pendingTechniqueChange = typeof onConfirm === 'function' ? onConfirm : null;\r\n    if (!this.techniqueConfirmModal) {\r\n      if (this.pendingTechniqueChange) this.pendingTechniqueChange();\r\n      this.pendingTechniqueChange = null;\r\n      return;\r\n    }\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n    this.techniqueConfirmModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.resolveTechniqueChangeConfirmation = function (confirmed) {\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.techniqueConfirmModal) {\r\n      this.techniqueConfirmModal.classList.add('is-hidden');\r\n    }\r\n    const callback = this.pendingTechniqueChange;\r\n    this.pendingTechniqueChange = null;\r\n    if (confirmed && typeof callback === 'function') callback();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openCartSuccessModal = function () {\r\n    if (!this.cartSuccessModal) return;\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.add('is-technique-confirm-open');\r\n    this.cartSuccessModal.classList.remove('is-hidden');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.resolveCartSuccessModal = function (action) {\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.cartSuccessModal) this.cartSuccessModal.classList.add('is-hidden');\r\n    if (action === 'go-cart') {\r\n      this.redirectToCart();\r\n      return;\r\n    }\r\n    if (action === 'continue-shopping') {\r\n      this.close({ force: true });\r\n      let continueUrl = String(this.config.continueShoppingUrl || '/collections/all');\r\n      try {\r\n        const referrerUrl = document.referrer ? new URL(document.referrer) : null;\r\n        if (referrerUrl && referrerUrl.origin === window.location.origin && referrerUrl.pathname.indexOf('/collections/') !== -1) {\r\n          continueUrl = referrerUrl.pathname + referrerUrl.search;\r\n        }\r\n      } catch (error) {\r\n        // Keep the Liquid collection fallback when the referrer cannot be parsed.\r\n      }\r\n      window.location.href = continueUrl;\r\n      return;\r\n    }\r\n    this.setControlsPanel('default');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getUsedDesignObjectsForView = function (view) {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return [];\r\n    return this.getPhysicalViewIdsForView(view || this.activeView || 'front').reduce(function (items, viewId) {\r\n      return items.concat(this.canvasEngine.getDesignObjects({ view: viewId }));\r\n    }.bind(this), []);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getZoneById = function (zoneId) {\r\n    if (!zoneId) return null;\r\n    return (\r\n      this.zones.find(function (zone) {\r\n        return zone.id === zoneId;\r\n      }) || null\r\n    );\r\n  };\r\n\r\n  // Explicit mutual-exclusion families for A3/A4 pairs (same behavior as existing\r\n  // coeur/anti-coeur vs avant A3/A4 constraints, but scoped to sibling A3/A4 zones).\r\n  PersonalizerModalApp.prototype.getZoneSiblingExclusionFamilyKey = function (zone) {\r\n    if (!zone) return '';\r\n    const id = String(zone.id || '').toLowerCase();\r\n    if (id === 'flocage-front-a3' || id === 'flocage-front-a4') return 'front-a3a4';\r\n    if (id === 'flocage-back-a3' || id === 'flocage-back-a4') return 'back-a3a4';\r\n    return '';\r\n  };\r\n\r\n  // Shared zone compatibility filter used by placement UI.\r\n  // It excludes zones that are mutually exclusive with already occupied zones on the same view.\r\n  PersonalizerModalApp.prototype.getConstraintFilteredZones = function (zones, view, ignoredObject, options) {\n    const zoneList = Array.isArray(zones) ? zones : [];\r\n    if (!zoneList.length) return zoneList;\r\n    const settings = options || {};\r\n    const ignoreCurrentSelection = settings.ignoreCurrentSelection !== false;\r\n\r\n    const activeCanvasObject =\r\n      this.canvasEngine && typeof this.canvasEngine.getActiveDesignObject === 'function'\r\n        ? this.canvasEngine.getActiveDesignObject()\r\n        : null;\r\n    const panelSelectedObject =\n      this.selectedDesignObject && this.selectedDesignObject.canvas ? this.selectedDesignObject : null;\n\n    const maxActiveZones = Number(this.customizationRules && this.customizationRules.maxActiveZones) || 0;\n    if (maxActiveZones > 0 && this.canvasEngine && typeof this.canvasEngine.getDesignObjects === 'function') {\n      const globallyOccupiedZoneIds = Array.from(new Set(\n        this.canvasEngine.getDesignObjects()\n          .filter(function (object) {\n            if (!object || !object.zoneId) return false;\n            if (ignoredObject && object === ignoredObject) return false;\n            if (ignoreCurrentSelection && activeCanvasObject && object === activeCanvasObject) return false;\n            if (ignoreCurrentSelection && panelSelectedObject && object === panelSelectedObject) return false;\n            return true;\n          })\n          .map(function (object) { return String(object.zoneId); })\n      ));\n      if (globallyOccupiedZoneIds.length >= maxActiveZones) {\n        const allowedZoneIds = globallyOccupiedZoneIds.slice(0, maxActiveZones);\n        return zoneList.filter(function (zone) {\n          return allowedZoneIds.indexOf(String(zone && zone.id || '')) >= 0;\n        });\n      }\n    }\n\n    const usedObjects = this.getUsedDesignObjectsForView(view || this.activeView);\n    // Apply exclusivity as soon as one zone is occupied.\r\n    if (usedObjects.length <= 0) return zoneList;\r\n    const occupiedZones = usedObjects\r\n      .filter(function (object) {\r\n        const zoneId = object && object.zoneId ? object.zoneId : '';\r\n        if (!zoneId) return false;\r\n        if (ignoredObject && object === ignoredObject) return false;\r\n        if (ignoreCurrentSelection && activeCanvasObject && object === activeCanvasObject) return false;\r\n        if (ignoreCurrentSelection && panelSelectedObject && object === panelSelectedObject) return false;\r\n        return true;\r\n      })\r\n      .map(\r\n        function (object) {\r\n          return this.getZoneById(object.zoneId);\r\n        }.bind(this)\r\n      )\r\n      .filter(Boolean);\r\n\r\n    if (!occupiedZones.length) return zoneList;\r\n\r\n    return zoneList.filter(function (candidateZone) {\r\n      return !occupiedZones.some(function (occupiedZone) {\r\n        const candidateGroup = String(candidateZone.constraintGroup || '');\r\n        const occupiedGroup = String(occupiedZone.constraintGroup || '');\r\n        const candidateExclusiveWith = Array.isArray(candidateZone.exclusiveWith) ? candidateZone.exclusiveWith : [];\r\n        const occupiedExclusiveWith = Array.isArray(occupiedZone.exclusiveWith) ? occupiedZone.exclusiveWith : [];\r\n\r\n        if (candidateGroup && occupiedExclusiveWith.indexOf(candidateGroup) >= 0) return true;\r\n        if (occupiedGroup && candidateExclusiveWith.indexOf(occupiedGroup) >= 0) return true;\r\n\r\n        // A3/A4 sibling exclusivity: block only the sibling zone, not the same zone.\r\n        const candidateSiblingFamily = this.getZoneSiblingExclusionFamilyKey(candidateZone);\r\n        const occupiedSiblingFamily = this.getZoneSiblingExclusionFamilyKey(occupiedZone);\r\n        if (\r\n          candidateSiblingFamily &&\r\n          occupiedSiblingFamily &&\r\n          candidateSiblingFamily === occupiedSiblingFamily &&\r\n          String(candidateZone.id || '') !== String(occupiedZone.id || '')\r\n        ) {\r\n          return true;\r\n        }\r\n        return false;\r\n      }.bind(this));\r\n    }.bind(this));\r\n  };\r\n\r\n  // Returns true if a zone is currently allowed for the provided object/view,\r\n  // taking exclusivity rules into account.\r\n  PersonalizerModalApp.prototype.isZoneAllowedForObject = function (zoneId, view, object) {\r\n    const targetZoneId = String(zoneId || '');\r\n    if (!targetZoneId) return false;\r\n    const normalizedView = normalizeViewId(view);\r\n    const zones = this.getAvailableZonesForView(normalizedView);\r\n    if (!zones.length) return false;\r\n    const allowed = this.getConstraintFilteredZones(zones, normalizedView, object);\r\n    const isAllowedByConstraints = allowed.some(function (zone) {\r\n      return String(zone && zone.id || '') === targetZoneId;\r\n    });\r\n    if (!isAllowedByConstraints) return false;\r\n    return !this.isFamilySplitMoveBlocked(object, targetZoneId, normalizedView);\r\n  };\r\n\r\n  // Prevent splitting an exclusive family across sibling zones when another object\r\n  // of the same family already exists (ex: moving one item from Dos A4 to Dos A3\r\n  // while another item remains in Dos A4).\r\n  PersonalizerModalApp.prototype.isFamilySplitMoveBlocked = function (object, targetZoneId, view) {\r\n    if (!object || !object.zoneId) return false;\r\n    const targetZone = this.getZoneById(targetZoneId);\r\n    const sourceZone = this.getZoneById(object.zoneId);\r\n    if (!targetZone || !sourceZone) return false;\r\n    if (String(targetZone.id || '') === String(sourceZone.id || '')) return false;\r\n\r\n    const normalizedView = normalizeViewId(view || object.view);\r\n    const sourceView = normalizeViewId(object.view);\r\n    if (normalizedView !== sourceView) return false;\r\n\r\n    const sourceSiblingFamily = this.getZoneSiblingExclusionFamilyKey(sourceZone);\r\n    const targetSiblingFamily = this.getZoneSiblingExclusionFamilyKey(targetZone);\r\n    if (!sourceSiblingFamily || !targetSiblingFamily || sourceSiblingFamily !== targetSiblingFamily) return false;\r\n\r\n    const siblingsInFamily = this.getUsedDesignObjectsForView(normalizedView).filter(\r\n      function (candidate) {\r\n        if (!candidate || candidate === object || !candidate.zoneId) return false;\r\n        const candidateZone = this.getZoneById(candidate.zoneId);\r\n        if (!candidateZone) return false;\r\n        return this.getZoneSiblingExclusionFamilyKey(candidateZone) === sourceSiblingFamily;\r\n      }.bind(this)\r\n    );\r\n\r\n    return siblingsInFamily.length > 0;\r\n  };\r\n\r\n  // Special-case UX rule for left sidebar add buttons:\r\n  // when editing/selecting the single object currently placed in an exclusive zone family\r\n  // (ex: coeur/anti-coeur vs avant A3/A4), keep add-buttons disabled on incompatible zones\r\n  // while still allowing drag/move of the selected object itself.\r\n  PersonalizerModalApp.prototype.shouldKeepAddButtonsConstrainedForSelectedObject = function (view) {\r\n    const selectedObject = this.selectedDesignObject && this.selectedDesignObject.canvas ? this.selectedDesignObject : null;\r\n    if (!selectedObject || !selectedObject.zoneId) return false;\r\n    const selectedView = normalizeViewId(selectedObject.view);\r\n    const normalizedView = normalizeViewId(view || this.activeView);\r\n    if (selectedView !== normalizedView) return false;\r\n\r\n    const selectedZone = this.getZoneById(selectedObject.zoneId);\r\n    if (!selectedZone) return false;\r\n    const selectedGroup = String(selectedZone.constraintGroup || '');\r\n    const selectedExclusiveWith = Array.isArray(selectedZone.exclusiveWith) ? selectedZone.exclusiveWith : [];\r\n    if (!selectedGroup && !selectedExclusiveWith.length) return false;\r\n\r\n    const usedObjects = this.getUsedDesignObjectsForView(normalizedView).filter(function (object) {\r\n      return !!(object && object.zoneId);\r\n    });\r\n    if (!usedObjects.length) return false;\r\n\r\n    // Count only objects in the same exclusivity family as the selected one.\r\n    const familyObjects = usedObjects.filter(function (object) {\r\n      const zone = this.getZoneById(object.zoneId);\r\n      if (!zone) return false;\r\n      const zoneGroup = String(zone.constraintGroup || '');\r\n      const zoneExclusiveWith = Array.isArray(zone.exclusiveWith) ? zone.exclusiveWith : [];\r\n      if (selectedGroup && zoneExclusiveWith.indexOf(selectedGroup) >= 0) return true;\r\n      if (zoneGroup && selectedExclusiveWith.indexOf(zoneGroup) >= 0) return true;\r\n      if (selectedGroup && zoneGroup && zoneGroup === selectedGroup) return true;\r\n      return false;\r\n    }.bind(this));\r\n\r\n    return familyObjects.length === 1 && familyObjects[0] === selectedObject;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getAvailableZonesForCurrentView = function () {\r\n    const currentView = this.activeView || 'front';\r\n    const physicalViewIds = this.getPhysicalViewIdsForView(currentView);\r\n    const viewZones = this.getTechniqueFilteredZones().filter(function (zone) {\r\n      const zoneView = zone.view || 'front';\r\n      return physicalViewIds.indexOf(zoneView) >= 0;\r\n    });\r\n    return this.getConstraintFilteredZones(viewZones, currentView);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setActiveView = function (view, options) {\r\n    const settings = options || {};\r\n    const requestedView = normalizeViewId(view);\r\n    let nextView = this.isPrintMode() ? this.getNavigationViewForPhysicalView(requestedView) : requestedView;\r\n    const availableViews = this.getTechniqueAvailableViews();\r\n    if (this.isPrintMode() && availableViews.indexOf(nextView) < 0) {\r\n      const currentNavigationView = this.getNavigationViewForPhysicalView(this.activeView);\r\n      nextView = availableViews.indexOf(currentNavigationView) >= 0\r\n        ? currentNavigationView\r\n        : availableViews[0] || 'front';\r\n    }\r\n    const controlsPanelBeforeTransition = this.activeControlsPanel;\r\n    const expectedKindBeforeTransition =\r\n      controlsPanelBeforeTransition === 'text'\r\n        ? 'text'\r\n        : controlsPanelBeforeTransition === 'image'\r\n          ? 'image'\r\n          : '';\r\n    const selectedZoneIdBeforeTransition = this.selectedZone && this.selectedZone.id ? String(this.selectedZone.id) : '';\r\n    const selectedObjectBeforeTransition =\r\n      this.selectedDesignObject && this.selectedDesignObject.canvas ? this.selectedDesignObject : null;\r\n    const shouldRestoreSelectionAfterTransition =\r\n      !!selectedObjectBeforeTransition &&\r\n      this.getPhysicalViewIdsForView(nextView).indexOf(String(selectedObjectBeforeTransition.view || 'front').toLowerCase()) >= 0;\r\n    if (this.activeView === nextView) {\n      if (settings.fromSidebar) {\n        if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\r\n          this.canvasEngine.clearSelection();\r\n        }\r\n        this.selectedDesignObject = null;\n        this.selectedDesignKind = '';\n        this.zoneOverlayRequested = false;\n        this.setControlsPanel('default');\n      }\r\n      return Promise.resolve();\r\n    }\r\n\r\n    this.scheduleThumbnailCaptureForView(this.activeView, 90);\r\n    this.activeView = nextView;\r\n    this.renderViewSwitchers();\r\n    this.renderPositionPresets();\r\n    this.canvasViewTransitionPending = true;\r\n    this.applyActiveZoneToCanvas({ deferCanvasUpdate: true });\r\n\r\n    const transitionPromise = this.syncBackgroundWithVariant()\r\n      .finally(\r\n        function () {\r\n          this.canvasViewTransitionPending = false;\r\n          this.applyActiveZoneToCanvas();\r\n          if (!settings.fromSidebar && this.canvasEngine && typeof this.canvasEngine.selectDesignObject === 'function') {\r\n            const objectToReselect =\r\n              (shouldRestoreSelectionAfterTransition ? selectedObjectBeforeTransition : null) ||\r\n              (expectedKindBeforeTransition\r\n                ? this.getViewObjectForKind(nextView, expectedKindBeforeTransition, selectedZoneIdBeforeTransition)\r\n                : null);\r\n\r\n            if (objectToReselect) {\r\n              this.selectedDesignObject = objectToReselect;\r\n              this.selectedDesignKind = this.getSelectedObjectKind(objectToReselect);\r\n              this.canvasEngine.selectDesignObject(objectToReselect);\r\n            }\r\n          }\r\n          if (this.previewModal && !this.previewModal.classList.contains('is-hidden')) {\r\n            this.previewActiveView = this.activeView;\r\n            this.renderPreviewModal();\r\n          }\r\n          if (this.activeControlsPanel === 'background') {\r\n            this.syncBackgroundPanelUi();\r\n          }\r\n        }.bind(this)\r\n      );\r\n\r\n    if (settings.fromSidebar) {\n      if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\r\n        this.canvasEngine.clearSelection();\r\n      }\r\n      this.selectedDesignObject = null;\n      this.selectedDesignKind = '';\n      this.zoneOverlayRequested = false;\n      this.setControlsPanel('default');\n    }\r\n\r\n    return transitionPromise;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyActiveZoneToCanvas = function (options) {\n    if (!this.canvasEngine) return;\r\n    const settings = options || {};\r\n\r\n    const viewZones = this.getAvailableZonesForCurrentView();\r\n    if (!this.selectedZone || !viewZones.some(function (zone) { return zone.id === this.selectedZone.id; }.bind(this))) {\r\n      this.selectedZone = viewZones.length ? viewZones[0] : null;\r\n    }\r\n\r\n    const physicalViewIds = this.getPhysicalViewIdsForView(this.activeView);\r\n    const targetPhysicalView = this.selectedZone && physicalViewIds.indexOf(this.selectedZone.view) >= 0\r\n      ? this.selectedZone.view\r\n      : physicalViewIds[0] || this.activeView;\r\n    this.canvasEngine.currentView = targetPhysicalView;\r\n    if (typeof this.canvasEngine.setViewPresentation === 'function') {\r\n      this.canvasEngine.setViewPresentation(this.activeView, physicalViewIds, targetPhysicalView);\r\n    }\r\n    if (typeof this.canvasEngine.setZoneDebugEnabled === 'function') {\n      this.canvasEngine.setZoneDebugEnabled(this.shouldShowZoneOverlay(this.activeControlsPanel));\n    }\r\n    if (settings.deferCanvasUpdate || this.canvasViewTransitionPending) {\r\n      if (typeof this.canvasEngine.prepareViewZoneTransition === 'function') {\r\n        this.canvasEngine.prepareViewZoneTransition(targetPhysicalView, this.selectedZone || null);\r\n      }\r\n    } else {\r\n      this.canvasEngine.setActiveView(targetPhysicalView);\r\n      this.canvasEngine.setActiveZone(this.selectedZone || null);\r\n    }\r\n    this.renderPanelPlacementControls();\n  };\n\n  PersonalizerModalApp.prototype.shouldShowZoneOverlay = function (panelName) {\n    if (!this.selectedZone) return false;\n    if (this.isPrintMode()) return this.selectedZone.strict === true;\n    const panel = String(panelName || this.activeControlsPanel || 'default');\n    const editingZone = panel === 'text' || panel === 'qr' || panel === 'image';\n    return this.zoneOverlayRequested === true || !!this.selectedDesignObject || editingZone;\n  };\n\r\n  PersonalizerModalApp.prototype.syncBackgroundWithVariant = function () {\r\n    if (this.isPrintMode() && this.printDocument && this.canvasEngine && this.canvasEngine.fabricCanvas) {\r\n      const canvas = this.canvasEngine.fabricCanvas;\r\n      canvas.backgroundColor = this.printDocument.background || '#ffffff';\r\n      canvas.setBackgroundImage(null, canvas.renderAll.bind(canvas));\r\n      this.canvasEngine.recalculateActiveZone();\r\n      return Promise.resolve();\r\n    }\r\n    const colorMockupUrl = window.PersonalizerMetafields.getMockupForColor(\r\n      this.activeColorName,\r\n      this.activeView,\r\n      this.colors\r\n    );\r\n    const variantMockupUrl = window.PersonalizerMetafields.getMockupUrl(\r\n      this.mockups,\r\n      this.currentVariant,\r\n      this.config.options,\r\n      this.config.featuredImage\r\n    );\r\n    const mockupUrl = colorMockupUrl || variantMockupUrl || this.config.featuredImage;\r\n    const placementAdjustment =\r\n      window.PersonalizerMetafields && typeof window.PersonalizerMetafields.getMockupAdjustment === 'function'\r\n        ? window.PersonalizerMetafields.getMockupAdjustment(\r\n            this.mockupAdjustments,\r\n            this.activeColorName,\r\n            this.activeView,\r\n            this.currentVariant\r\n          )\r\n        : null;\r\n    const adjustmentSignature = placementAdjustment\r\n      ? [\r\n          placementAdjustment.zoom || '',\r\n          placementAdjustment.offsetXRatio || 0,\r\n          placementAdjustment.offsetYRatio || 0\r\n        ].join('|')\r\n      : '';\r\n    const syncKey = String(this.activeView || 'front') + '|' + String(mockupUrl || '') + '|' + adjustmentSignature;\r\n    if (this.lastBackgroundSyncKey === syncKey) return Promise.resolve();\r\n    this.lastBackgroundSyncKey = syncKey;\r\n\r\n    this.canvasEngine.fallbackUrl = mockupUrl || this.config.featuredImage || '';\r\n    const backgroundPromise = this.canvasEngine.setMockupByColor(this.activeColorName, {\r\n      placementAdjustment: placementAdjustment\r\n    });\r\n\r\n    if (this.canvasEngine && typeof this.canvasEngine.preloadMockupUrls === 'function') {\r\n      const variantUrl = window.PersonalizerMetafields.getMockupUrl(\r\n        this.mockups,\r\n        this.currentVariant,\r\n        this.config.options,\r\n        this.config.featuredImage\r\n      );\r\n      const preloadUrls = [];\r\n      this.getTechniqueAvailableViews().forEach(\r\n        function (view) {\r\n          const normalizedView = normalizeViewId(view);\r\n          preloadUrls.push(\r\n            window.PersonalizerMetafields.getMockupForColor(this.activeColorName, normalizedView, this.colors) ||\r\n              variantUrl ||\r\n              this.config.featuredImage ||\r\n              ''\r\n          );\r\n        }.bind(this)\r\n      );\r\n      (Array.isArray(this.colors) ? this.colors : []).forEach(\r\n        function (colorItem) {\r\n          const colorName = colorItem && colorItem.name ? String(colorItem.name) : '';\r\n          if (!colorName) return;\r\n          preloadUrls.push(\r\n            window.PersonalizerMetafields.getMockupForColor(colorName, this.activeView, this.colors) ||\r\n              this.config.featuredImage ||\r\n              ''\r\n          );\r\n        }.bind(this)\r\n      );\r\n      this.canvasEngine.preloadMockupUrls(preloadUrls);\r\n    }\r\n\r\n    return backgroundPromise;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.ensurePrintStyleValues = function () {\r\n    const views = this.printDocument && Array.isArray(this.printDocument.views) ? this.printDocument.views : [];\r\n    if (!this.printStyleValues || typeof this.printStyleValues !== 'object' || Array.isArray(this.printStyleValues)) {\r\n      this.printStyleValues = {};\r\n    }\r\n    views.forEach(function (view) {\r\n      const viewId = normalizeViewId(view && view.id);\r\n      const options = view && view.styleOptions && typeof view.styleOptions === 'object' ? view.styleOptions : {};\r\n      const values = this.printStyleValues[viewId] && typeof this.printStyleValues[viewId] === 'object'\r\n        ? this.printStyleValues[viewId]\r\n        : {};\r\n      Object.keys(options).forEach(function (key) {\r\n        const option = options[key];\r\n        const selected = String(values[key] ?? '');\r\n        values[key] = option.choices.some(function (choice) { return choice.value === selected; })\r\n          ? selected\r\n          : option.default;\r\n      });\r\n      this.printStyleValues[viewId] = values;\r\n    }, this);\r\n    return this.printStyleValues;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncPrintStyleValuesToCanvas = function () {\r\n    if (!this.canvasEngine) return 0;\r\n    this.ensurePrintStyleValues();\r\n    if (typeof this.canvasEngine.setPrintStyleValues === 'function') {\r\n      this.canvasEngine.setPrintStyleValues(this.printStyleValues);\r\n    }\r\n    return typeof this.canvasEngine.applyPrintSystemStyles === 'function'\r\n      ? this.canvasEngine.applyPrintSystemStyles()\r\n      : 0;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.restorePrintStyleValuesFromCanvas = function () {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getPrintStyleValues !== 'function') return;\r\n    this.printStyleValues = this.canvasEngine.getPrintStyleValues();\r\n    this.ensurePrintStyleValues();\r\n    this.syncPrintStyleValuesToCanvas();\r\n    this.renderPrintStyleOptions();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderPrintStyleOptions = function () {\r\n    if (!this.modal) return;\r\n    const wrapper = this.modal.querySelector('[data-print-style-options]');\r\n    if (!wrapper) return;\r\n    const view = this.getCurrentPrintViewConfig ? this.getCurrentPrintViewConfig() : null;\r\n    const options = view && view.styleOptions && typeof view.styleOptions === 'object' ? view.styleOptions : {};\r\n    const keys = Object.keys(options);\r\n    wrapper.hidden = !keys.length;\r\n    if (!keys.length) {\r\n      wrapper.innerHTML = '';\r\n      return;\r\n    }\r\n    this.ensurePrintStyleValues();\r\n    const viewId = normalizeViewId(view.id);\r\n    const values = this.printStyleValues[viewId] || {};\r\n    wrapper.innerHTML = keys.map(function (key, index) {\r\n      const option = options[key];\r\n      const activeChoice = option.choices.find(function (choice) { return choice.value === values[key]; }) || option.choices[0];\r\n      const activeTextColor = this.getContrastingTextColor(activeChoice.color);\r\n      const activeIsLight = this.isLightColor(activeChoice.color);\r\n      return '<div class=\"personalizer-print-style-option\">' +\r\n        '<span class=\"personalizer-controls__label personalizer-print-style-option__label\">' +\r\n          '<span class=\"personalizer-controls__step\">' + String(index + 1).padStart(2, '0') + '</span>' +\r\n          this.escapeHtml(option.label) +\r\n        '</span>' +\r\n        '<div class=\"personalizer-color-dropdown personalizer-print-style-option__dropdown\" data-color-dropdown>' +\r\n          '<button type=\"button\" class=\"personalizer-color-dropdown__toggle' +\r\n            (activeIsLight ? ' personalizer-color-dropdown__toggle--light' : '') +\r\n            '\" data-color-dropdown-toggle aria-haspopup=\"listbox\" aria-expanded=\"false\" style=\"background:' +\r\n            activeChoice.color + ';color:' + activeTextColor + ';\">' +\r\n            '<span class=\"personalizer-color-dropdown__toggle-label\">' + this.escapeHtml(activeChoice.label) + '</span>' +\r\n            '<span class=\"personalizer-color-dropdown__toggle-caret\" aria-hidden=\"true\"><svg viewBox=\"0 0 20 20\" focusable=\"false\"><path d=\"M5 7.5 10 12.5 15 7.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg></span>' +\r\n          '</button>' +\r\n          '<div class=\"personalizer-color-dropdown__menu\" role=\"listbox\" aria-label=\"' + this.escapeHtml(option.label) + '\">' +\r\n            option.choices.map(function (choice) {\r\n              const selected = choice.value === activeChoice.value;\r\n              const textColor = this.getContrastingTextColor(choice.color);\r\n              return '<button type=\"button\" class=\"personalizer-color-dropdown__option' +\r\n                (this.isLightColor(choice.color) ? ' personalizer-color-dropdown__option--light' : '') +\r\n                (selected ? ' is-selected' : '') +\r\n                '\" data-print-style-choice=\"' + this.escapeHtml(choice.value) + '\" data-print-style-key=\"' +\r\n                this.escapeHtml(key) + '\" role=\"option\" aria-selected=\"' + (selected ? 'true' : 'false') +\r\n                '\" style=\"background:' + choice.color + ';color:' + textColor + ';\">' +\r\n                '<span class=\"personalizer-color-dropdown__option-name\">' + this.escapeHtml(choice.label) + '</span>' +\r\n              '</button>';\r\n            }, this).join('') +\r\n          '</div>' +\r\n        '</div>' +\r\n      '</div>';\r\n    }, this).join('');\r\n    wrapper.querySelectorAll('[data-print-style-choice]').forEach(function (button) {\r\n      button.addEventListener('click', function () {\r\n        const key = String(button.dataset.printStyleKey || '');\r\n        const option = options[key];\r\n        const value = String(button.dataset.printStyleChoice || '');\r\n        if (!option || !option.choices.some(function (choice) { return choice.value === value; })) return;\r\n        if (!this.printStyleValues[viewId]) this.printStyleValues[viewId] = {};\r\n        this.printStyleValues[viewId][key] = value;\r\n        this.syncPrintStyleValuesToCanvas();\r\n        this.renderPrintStyleOptions();\r\n      }.bind(this));\r\n    }, this);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderViewSwitchers = function () {\r\n    const currentView = this.activeView || 'front';\r\n    const availableViews = this.getTechniqueAvailableViews();\r\n    if (this.isPrintMode()) {\r\n      this.modal.querySelectorAll('.personalizer-view-tabs').forEach(function (container) {\r\n        container.innerHTML = availableViews.map(function (view) {\r\n          const label = this.getViewLabel(view);\r\n          return '<button type=\"button\" class=\"personalizer-view-tab\" data-view-switch=\"' +\r\n            this.escapeHtml(view) + '\" aria-label=\"Passer \u00E0 ' + this.escapeHtml(label) + '\">' +\n            this.escapeHtml(label) + '</button>';\r\n        }, this).join('');\r\n      }, this);\r\n      this.modal.querySelectorAll('.personalizer-preview-modal__views').forEach(function (container) {\r\n        container.querySelectorAll('[data-preview-view]').forEach(function (button) { button.remove(); });\r\n        container.insertAdjacentHTML('beforeend', availableViews.map(function (view) {\r\n          const label = this.getViewLabel(view);\r\n          return '<button type=\"button\" class=\"personalizer-preview-modal__view\" data-action=\"preview-switch-view\" data-preview-view=\"' +\r\n            this.escapeHtml(view) + '\">' + this.escapeHtml(label) + '</button>';\r\n        }, this).join(''));\r\n      }, this);\r\n    }\r\n    const buttons = this.modal.querySelectorAll('[data-view-switch]');\r\n    buttons.forEach(\r\n      function (button) {\r\n      const active = button.dataset.viewSwitch === currentView;\n      const isAvailable = availableViews.indexOf(button.dataset.viewSwitch || 'front') >= 0;\n      button.hidden = !isAvailable;\n      const label = this.getViewLabel(button.dataset.viewSwitch || 'front');\n      if (!button.classList.contains('personalizer-view-choice')) button.textContent = label;\n      button.setAttribute('aria-label', 'Passer \u00E0 ' + label);\n      button.classList.toggle('is-active', active);\r\n      }.bind(this)\r\n    );\r\n\r\n    this.modal.querySelectorAll('[data-preview-view]').forEach(function (button) {\n      button.hidden = availableViews.indexOf(button.dataset.previewView || 'front') < 0;\n      const label = this.getViewLabel(button.dataset.previewView || 'front');\n      button.textContent = label;\n      button.setAttribute('aria-label', 'Afficher ' + label);\n    }, this);\n\r\n    this.syncCurrentViewToolsUi();\r\n    this.renderPrintStyleOptions();\r\n    this.renderSidebarViewThumbnails();\r\n    this.renderPanelPlacementControls();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.captureThumbnailForView = function (view) {\r\n    if (!this.canvasEngine) return;\r\n    const targetView = String(view || '').toLowerCase();\r\n    if (this.getTechniqueAvailableViews().indexOf(targetView) < 0) return;\r\n    if (typeof this.canvasEngine.getPreviewDataURL === 'function') {\r\n      this.viewThumbnails[targetView] = this.canvasEngine.getPreviewDataURL();\r\n    } else {\r\n      return;\r\n    }\r\n    this.viewThumbnailStateKeys[targetView] = this.getViewThumbnailStateKey(targetView);\r\n    this.renderSidebarViewThumbnails();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getViewThumbnailStateKey = function (view) {\r\n    const normalizedView = normalizeViewId(view);\r\n    const colorKey = String(this.activeColorName || '').trim().toLowerCase();\r\n    const variantId = this.currentVariant && this.currentVariant.id ? String(this.currentVariant.id) : '';\r\n    return normalizedView + '|' + colorKey + '|' + variantId;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setControlsPanel = function (panelName) {\r\n    if (!this.modal) return;\r\n    if (this.isPrintMode() && ['image', 'qr', 'text', 'background', 'template'].indexOf(panelName) >= 0 && !this.isToolAllowedForCurrentView(panelName)) {\r\n      panelName = 'default';\r\n    }\r\n    this.closeFlyout();\r\n\r\n    const targetPanel =\r\n      panelName === 'text' ||\r\n      panelName === 'qr' ||\r\n      panelName === 'image' ||\r\n      panelName === 'background' ||\r\n      panelName === 'template' ||\r\n      panelName === 'sizes' ||\r\n      (!this.isPrintMode() && panelName === 'impressions')\r\n        ? panelName\r\n        : 'default';\r\n    this.activeControlsPanel = targetPanel;\r\n    const contentNode = this.modal.querySelector('.personalizer-modal__content');\r\n    if (contentNode) {\r\n      contentNode.setAttribute('data-active-panel', targetPanel);\r\n    }\r\n\r\n    const panels = this.modal.querySelectorAll('[data-controls-panel]');\r\n    panels.forEach(function (panel) {\r\n      const panelId = panel.dataset.controlsPanel || 'default';\r\n      panel.classList.toggle('is-hidden', panelId !== targetPanel);\r\n    });\r\n\r\n    if (this.canvasEngine && typeof this.canvasEngine.setZoneDebugEnabled === 'function') {\n      this.canvasEngine.setZoneDebugEnabled(this.shouldShowZoneOverlay(targetPanel));\n    }\r\n\r\n    const toolButtons = this.modal.querySelectorAll('.personalizer-tool-sidebar [data-action]');\r\n    toolButtons.forEach(function (button) {\r\n      const action = String(button.dataset.action || '');\r\n      const active =\r\n        (targetPanel === 'image' && action === 'open-image-panel') ||\r\n        (targetPanel === 'qr' && action === 'open-qr-panel') ||\r\n        (targetPanel === 'text' && action === 'open-text-panel') ||\r\n        (targetPanel === 'background' && action === 'open-background-panel') ||\r\n        (targetPanel === 'template' && action === 'open-template-panel') ||\r\n        (targetPanel === 'impressions' && action === 'open-impressions-panel') ||\r\n        (targetPanel === 'sizes' && action === 'open-sizes-panel');\r\n      button.classList.toggle('is-active', active);\r\n    });\r\n\r\n    this.renderPanelPlacementControls();\r\n    this.renderSizesUi();\r\n    this.renderImpressionsUi();\r\n    this.syncCanvasZoomUi();\r\n    this.syncDimensionsToolUi();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openFlyout = function (name) {\r\n    if (!this.modal) return;\r\n    const target = String(name || '');\r\n    const flyouts = this.modal.querySelectorAll('[data-flyout]');\r\n    let activated = false;\r\n    flyouts.forEach(function (node) {\r\n      const isTarget = (node.dataset.flyout || '') === target;\r\n      node.classList.toggle('is-hidden', !isTarget);\r\n      if (isTarget) {\r\n        const panel = node.querySelector('.personalizer-flyout__panel');\r\n        if (panel) {\r\n          panel.style.transform = '';\r\n          panel.style.transition = '';\r\n        }\r\n      }\r\n      if (isTarget) activated = true;\r\n    });\r\n    this.activeFlyout = activated ? target : '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.closeFlyout = function () {\r\n    if (!this.modal) return;\r\n    if (this.preservedFlyoutName && this.activeFlyout === this.preservedFlyoutName) return;\r\n    this.modal.querySelectorAll('[data-flyout]').forEach(function (node) {\r\n      node.classList.add('is-hidden');\r\n      const panel = node.querySelector('.personalizer-flyout__panel');\r\n      if (panel) {\r\n        panel.style.transform = '';\r\n        panel.style.transition = '';\r\n      }\r\n    });\r\n    this.activeFlyout = '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.bindImpressionsSheetSwipeClose = function () {\r\n    if (!this.impressionsSheetPanel || !this.modal) return;\r\n\r\n    const panel = this.impressionsSheetPanel;\r\n    const scrollNode = panel.querySelector('[data-impressions-sheet-scroll]') || panel;\r\n    const state = {\r\n      startX: 0,\r\n      startY: 0,\r\n      deltaY: 0,\r\n      startScrollTop: 0,\r\n      tracking: false,\r\n      dragging: false\r\n    };\r\n\r\n    panel.addEventListener(\r\n      'touchstart',\r\n      function (event) {\r\n        if (!event.touches || !event.touches.length) return;\r\n        if (this.activeFlyout !== 'impressions') return;\r\n        const touch = event.touches[0];\r\n        state.startX = touch.clientX;\r\n        state.startY = touch.clientY;\r\n        state.deltaY = 0;\r\n        state.startScrollTop = Number(scrollNode.scrollTop || 0);\r\n        state.tracking = true;\r\n        state.dragging = false;\r\n      }.bind(this),\r\n      { passive: true }\r\n    );\r\n\r\n    panel.addEventListener(\r\n      'touchmove',\r\n      function (event) {\r\n        if (!state.tracking || !event.touches || !event.touches.length) return;\r\n        if (this.activeFlyout !== 'impressions') return;\r\n\r\n        const touch = event.touches[0];\r\n        const deltaX = touch.clientX - state.startX;\r\n        const deltaY = touch.clientY - state.startY;\r\n        state.deltaY = deltaY;\r\n\r\n        if (deltaY <= 0) return;\r\n        if (Math.abs(deltaX) > Math.abs(deltaY)) return;\r\n        if (state.startScrollTop > 0 || Number(scrollNode.scrollTop || 0) > 0) return;\r\n\r\n        state.dragging = true;\r\n        panel.style.transition = 'none';\r\n        panel.style.transform = 'translateY(' + String(Math.min(deltaY * 0.95, 220)) + 'px)';\r\n        event.preventDefault();\r\n      }.bind(this),\r\n      { passive: false }\r\n    );\r\n\r\n    panel.addEventListener(\r\n      'touchend',\r\n      function () {\r\n        if (!state.tracking) return;\r\n        state.tracking = false;\r\n\r\n        if (!state.dragging) return;\r\n\r\n        panel.style.transition = 'transform 0.22s ease';\r\n        if (state.deltaY > 95) {\r\n          this.closeFlyout();\r\n          return;\r\n        }\r\n        panel.style.transform = 'translateY(0)';\r\n      }.bind(this),\r\n      { passive: true }\r\n    );\r\n\r\n    panel.addEventListener(\r\n      'touchcancel',\r\n      function () {\r\n        state.tracking = false;\r\n        state.dragging = false;\r\n        panel.style.transition = 'transform 0.22s ease';\r\n        panel.style.transform = 'translateY(0)';\r\n      },\r\n      { passive: true }\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.bindMobileViewportKeyboardAware = function () {\r\n    if (!this.modal || !window.visualViewport) return;\r\n\r\n    const syncOffset = function () {\r\n      if (!this.modal || !this.modal.classList.contains('is-open')) return;\r\n      const isMobile = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n      if (!isMobile) {\r\n        this.modal.style.setProperty('--pz-mobile-keyboard-offset', '0px');\r\n        return;\r\n      }\r\n\r\n      const vv = window.visualViewport;\r\n      const overlap = Math.max(0, Math.round(window.innerHeight - (vv.height + vv.offsetTop)));\r\n      const offset = overlap > 60 ? overlap : 0;\r\n      this.modal.style.setProperty('--pz-mobile-keyboard-offset', String(offset) + 'px');\r\n\r\n      const active = document.activeElement;\r\n      if (!active) return;\r\n      const isField = active.matches && active.matches('input, textarea, select');\r\n      if (!isField) return;\r\n      if (!active.closest('.personalizer-flyout__panel--mobile-sheet')) return;\r\n      if (typeof active.scrollIntoView === 'function') {\r\n        active.scrollIntoView({ block: 'nearest', inline: 'nearest' });\r\n      }\r\n    }.bind(this);\r\n\r\n    this.viewportResizeHandler = syncOffset;\r\n    this.viewportScrollHandler = syncOffset;\r\n    window.visualViewport.addEventListener('resize', this.viewportResizeHandler);\r\n    window.visualViewport.addEventListener('scroll', this.viewportScrollHandler);\r\n    this.modal.addEventListener('focusin', this.viewportResizeHandler);\r\n    this.modal.addEventListener(\r\n      'focusout',\r\n      function () {\r\n        window.requestAnimationFrame(this.viewportResizeHandler);\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getStickyFlyoutName = function () {\r\n    const name = String(this.activeFlyout || '');\r\n    return (\r\n      name === 'text-placement' ||\r\n      name === 'image-placement' ||\r\n      name === 'text-align' ||\r\n      name === 'image-align' ||\r\n      name === 'text-style' ||\r\n      name === 'text-format'\r\n    )\r\n      ? name\r\n      : '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.reopenStickyFlyout = function (name) {\r\n    const target = String(name || '');\r\n    if (!target) return;\r\n    this.preservedFlyoutName = target;\r\n    window.requestAnimationFrame(\r\n      function () {\r\n        if (this.preservedFlyoutName === target) this.preservedFlyoutName = '';\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.runWithStickyFlyoutLock = function (callback) {\r\n    const sticky = this.getStickyFlyoutName();\r\n    if (sticky) this.preservedFlyoutName = sticky;\r\n    try {\r\n      if (typeof callback === 'function') callback();\r\n    } finally {\r\n      if (sticky) {\r\n        window.requestAnimationFrame(\r\n          function () {\r\n            if (this.preservedFlyoutName === sticky) this.preservedFlyoutName = '';\r\n          }.bind(this)\r\n        );\r\n      }\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isCanvasZoomEnabled = function () {\r\n    const hasSelectedObject = !!(this.selectedDesignObject && this.selectedDesignObject.canvas);\r\n    const hasPanelContext =\r\n      this.activeControlsPanel === 'text' ||\r\n      this.activeControlsPanel === 'qr' ||\r\n      this.activeControlsPanel === 'image';\r\n    return hasSelectedObject && hasPanelContext;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncCanvasZoomUi = function () {\r\n    this.syncBackgroundRemovalButton();\r\n    const enabled = this.isCanvasZoomEnabled();\r\n\r\n    if (!enabled && this.canvasEngine && typeof this.canvasEngine.getManualZoom === 'function') {\r\n      const currentZoom = Number(this.canvasEngine.getManualZoom() || 1);\r\n      if (currentZoom > 1 && typeof this.canvasEngine.resetZoom === 'function') {\r\n        this.canvasEngine.resetZoom();\r\n      }\r\n      if (this.canvasZoomRangeInput) {\r\n        this.canvasZoomRangeInput.value = String(this.canvasEngine.getManualZoom());\r\n      }\r\n    }\r\n\r\n    if (this.canvasZoomRangeInput) this.canvasZoomRangeInput.disabled = !enabled;\r\n    if (this.canvasZoomResetButton) this.canvasZoomResetButton.disabled = !enabled;\r\n    if (this.canvasZoomDecreaseButton) this.canvasZoomDecreaseButton.disabled = !enabled;\r\n    if (this.canvasZoomIncreaseButton) this.canvasZoomIncreaseButton.disabled = !enabled;\r\n    if (this.canvasEngine && typeof this.canvasEngine.getManualZoom === 'function') {\r\n      this.syncCanvasZoomValue(this.canvasEngine.getManualZoom());\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncCanvasZoomValue = function (zoom) {\r\n    if (!this.canvasZoomValueNode) return;\r\n    const normalizedZoom = Math.max(0, Number(zoom) || 1);\r\n    this.canvasZoomValueNode.textContent = String(Math.round(normalizedZoom * 100)) + '%';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isDimensionsToolEnabled = function () {\r\n    if (this.isPrintMode()) {\r\n      return !!(this.selectedZone && this.canvasEngine);\r\n    }\r\n    return !!(\r\n      this.selectedZone &&\r\n      this.canvasEngine &&\r\n      this.selectedDesignObject &&\r\n      this.selectedDesignObject.canvas\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.formatDimensionPx = function (value) {\r\n    const numeric = Math.max(0, Number(value) || 0);\r\n    return String(Math.round(numeric));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.formatDimensionPair = function (width, height) {\r\n    return this.formatDimensionPx(width) + ' x ' + this.formatDimensionPx(height);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderDimensionsToolValues = function () {\r\n    if (!this.canvasDimensionsPanel || !this.canvasEngine) return;\r\n\r\n    const zoneNode = this.canvasDimensionsPanel.querySelector('[data-dimensions-zone]');\r\n    const objectNode = this.canvasDimensionsPanel.querySelector('[data-dimensions-object]');\r\n    if (!zoneNode || !objectNode) return;\r\n\r\n    const zoneDimensions =\r\n      typeof this.canvasEngine.getActiveZoneDimensions === 'function' ? this.canvasEngine.getActiveZoneDimensions() : null;\r\n    const objectDimensions =\r\n      typeof this.canvasEngine.getDesignObjectDimensions === 'function'\r\n        ? this.canvasEngine.getDesignObjectDimensions(this.selectedDesignObject)\r\n        : null;\r\n\r\n    const zoneWidthCm = this.selectedZone && Number(this.selectedZone.widthCm) > 0 ? Number(this.selectedZone.widthCm) : 0;\r\n    const zoneHeightCm = this.selectedZone && Number(this.selectedZone.heightCm) > 0 ? Number(this.selectedZone.heightCm) : 0;\r\n\r\n    if (zoneWidthCm && zoneHeightCm) {\r\n      if (this.isPrintMode()) {\r\n        const cutWidthCm = Math.max(0, zoneWidthCm - 1);\r\n        const cutHeightCm = Math.max(0, zoneHeightCm - 1);\r\n        zoneNode.textContent = 'Surface: ' + this.formatDimensionPair(zoneWidthCm, zoneHeightCm) + ' cm \u00B7 Apr\u00E8s d\u00E9coupe: ' + this.formatDimensionPair(cutWidthCm, cutHeightCm) + ' cm';\r\n      } else {\r\n        zoneNode.textContent = 'Cadre position: ' + this.formatDimensionPair(zoneWidthCm, zoneHeightCm);\r\n      }\r\n    } else {\r\n      zoneNode.textContent = 'Cadre position: -';\r\n    }\r\n\r\n    if (objectDimensions && zoneDimensions && zoneWidthCm && zoneHeightCm && zoneDimensions.width > 0 && zoneDimensions.height > 0) {\r\n      const objectWidthCm = (Number(objectDimensions.width) / Number(zoneDimensions.width)) * zoneWidthCm;\r\n      const objectHeightCm = (Number(objectDimensions.height) / Number(zoneDimensions.height)) * zoneHeightCm;\r\n      objectNode.textContent = 'Personnalisation: ' + this.formatDimensionPair(objectWidthCm, objectHeightCm);\r\n    } else {\r\n      objectNode.textContent = 'Personnalisation: -';\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncCanvasDisclaimerVisibility = function () {\r\n    if (!this.canvasDisclaimer) return;\r\n    const isDimensionsPanelVisible =\r\n      !!this.canvasDimensionsPanel && !this.canvasDimensionsPanel.classList.contains('is-hidden');\r\n    const defaultText = this.canvasDisclaimer.dataset.defaultText || '';\r\n    const dimensionsText = this.canvasDisclaimer.dataset.dimensionsText || defaultText;\r\n    let printText = this.canvasDisclaimer.dataset.printText || defaultText;\r\n    let printDimensionsText = this.canvasDisclaimer.dataset.printDimensionsText || printText;\r\n    if (this.printDocument) {\r\n      const bleedLabel = String(Math.round(Number(this.printDocument.bleedMm) * 10) / 10).replace('.', ',');\r\n      const safeLabel = String(Math.round(Number(this.printDocument.safeMarginMm) * 10) / 10).replace('.', ',');\r\n      printText = 'Le fond perdu de ' + bleedLabel + ' mm est personnalisable. Gardez les \u00E9l\u00E9ments importants dans la zone de s\u00E9curit\u00E9, \u00E0 ' + safeLabel + ' mm de la coupe finale.';\r\n      printDimensionsText = 'Le contour ext\u00E9rieur repr\u00E9sente le fond perdu, la ligne de coupe le format fini ' +\r\n        String(this.printDocument.widthMm).replace('.', ',') + ' \u00D7 ' + String(this.printDocument.heightMm).replace('.', ',') +\r\n        ' mm, et les pointill\u00E9s int\u00E9rieurs la zone de s\u00E9curit\u00E9.';\r\n    }\r\n    const nextText = this.isPrintMode()\r\n      ? (isDimensionsPanelVisible ? printDimensionsText : printText)\r\n      : (isDimensionsPanelVisible ? dimensionsText : defaultText);\r\n    this.canvasDisclaimer.hidden = false;\r\n    this.canvasDisclaimer.dataset.variant = isDimensionsPanelVisible ? 'dimensions' : 'default';\r\n    if (this.canvasDisclaimerText) {\r\n      this.canvasDisclaimerText.textContent = nextText;\r\n    }\r\n    if (this.canvasDisclaimerActions) {\r\n      this.canvasDisclaimerActions.hidden = isDimensionsPanelVisible;\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncDimensionsToolUi = function () {\r\n    const enabled = this.isDimensionsToolEnabled();\r\n    if (this.canvasDimensionsToggleButton) {\r\n      this.canvasDimensionsToggleButton.disabled = !enabled;\r\n    }\r\n    if (!enabled) {\r\n      this.isDimensionsVisible = false;\r\n    }\r\n\r\n    if (this.canvasDimensionsPanel) {\r\n      const shouldShow = enabled && this.isDimensionsVisible;\r\n      // En textile, les dimensions sont dessin\u00E9es sur le canvas. En impression,\r\n      // le panneau pr\u00E9cise aussi le format fini apr\u00E8s la d\u00E9coupe.\r\n      this.canvasDimensionsPanel.classList.toggle('is-hidden', !this.isPrintMode() || !shouldShow);\r\n      if (this.isPrintMode() && shouldShow) this.renderDimensionsToolValues();\r\n      if (this.canvasEngine && typeof this.canvasEngine.setDimensionsOverlayEnabled === 'function') {\r\n        this.canvasEngine.setDimensionsOverlayEnabled(shouldShow && !!this.selectedDesignObject);\r\n      }\r\n    }\r\n\r\n    if (this.canvasDimensionsToggleButton) {\r\n      this.canvasDimensionsToggleButton.setAttribute(\r\n        'aria-expanded',\r\n        enabled && this.isDimensionsVisible ? 'true' : 'false'\r\n      );\r\n      this.canvasDimensionsToggleButton.setAttribute(\r\n        'aria-pressed',\r\n        enabled && this.isDimensionsVisible ? 'true' : 'false'\r\n      );\r\n    }\r\n    this.syncCanvasDisclaimerVisibility();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hasPersonalizationObjects = function () {\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return false;\n    return this.canvasEngine.getDesignObjects().some(function (object) {\n      if (String(object && object.personalizerSource || '').toLowerCase() === 'system') return false;\n      const kind = String(object && object.personalizerKind || '').toLowerCase();\n      return kind !== 'background' && kind !== 'placeholder';\n    });\n  };\n\n  PersonalizerModalApp.prototype.shouldGeneratePersonalizationBat = function () {\n    return this.hasPersonalizationObjects();\n  };\n\r\n  PersonalizerModalApp.prototype.syncBatPdfToolUi = function () {\r\n    const buttons = (this.batPdfButtons && this.batPdfButtons.length ? this.batPdfButtons : [this.batPdfButton]).filter(Boolean);\r\n    if (!buttons.length) return;\r\n    const enabled = this.hasPersonalizationObjects();\r\n    buttons.forEach(function (button) {\r\n      button.disabled = !enabled;\r\n      button.setAttribute('aria-disabled', enabled ? 'false' : 'true');\r\n      button.title = enabled\r\n        ? \"Ouvrir l'apercu du produit\"\r\n        : \"Ajoutez au moins une personnalisation pour ouvrir l'apercu\";\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getObjectDimensionCm = function (object, zone) {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjectDimensions !== 'function') return null;\r\n    if (!zone || Number(zone.widthCm) <= 0 || Number(zone.heightCm) <= 0) return null;\r\n\r\n    const objectDimensions = this.canvasEngine.getDesignObjectDimensions(object);\r\n    const zoneBounds =\r\n      typeof this.canvasEngine.getZoneBounds === 'function' ? this.canvasEngine.getZoneBounds(zone) : null;\r\n    if (!objectDimensions || !zoneBounds || Number(zoneBounds.width) <= 0 || Number(zoneBounds.height) <= 0) return null;\r\n\r\n    return {\r\n      widthCm: (Number(objectDimensions.width) / Number(zoneBounds.width)) * Number(zone.widthCm),\r\n      heightCm: (Number(objectDimensions.height) / Number(zoneBounds.height)) * Number(zone.heightCm)\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getImageObjectSource = function (object) {\r\n    if (!object) return '';\r\n    if (object.personalizerSourceDataUrl && typeof object.personalizerSourceDataUrl === 'string') {\r\n      return object.personalizerSourceDataUrl;\r\n    }\r\n    if (typeof object.getSrc === 'function') {\r\n      const src = object.getSrc();\r\n      if (src && typeof src === 'string') return src;\r\n    }\r\n    if (object._originalElement && object._originalElement.src) {\r\n      return String(object._originalElement.src);\r\n    }\r\n    return '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getRectIntersection = function (firstRect, secondRect) {\r\n    if (!firstRect || !secondRect) return null;\r\n    const left = Math.max(Number(firstRect.left) || 0, Number(secondRect.left) || 0);\r\n    const top = Math.max(Number(firstRect.top) || 0, Number(secondRect.top) || 0);\r\n    const right = Math.min(\r\n      (Number(firstRect.left) || 0) + (Number(firstRect.width) || 0),\r\n      (Number(secondRect.left) || 0) + (Number(secondRect.width) || 0)\r\n    );\r\n    const bottom = Math.min(\r\n      (Number(firstRect.top) || 0) + (Number(firstRect.height) || 0),\r\n      (Number(secondRect.top) || 0) + (Number(secondRect.height) || 0)\r\n    );\r\n    const width = right - left;\r\n    const height = bottom - top;\r\n    if (width <= 0 || height <= 0) return null;\r\n    return {\r\n      left: left,\r\n      top: top,\r\n      width: width,\r\n      height: height\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getObjectZoneVisibilityInfo = function (object) {\r\n    if (!object || !this.canvasEngine) {\r\n      return {\r\n        objectRect: null,\r\n        zoneBounds: null,\r\n        intersectionRect: null,\r\n        isFullyOutsideZone: false,\r\n        isVisibleInZone: false\r\n      };\r\n    }\r\n\r\n    const zone = this.getZoneById(object.zoneId);\r\n    const objectRect =\r\n      typeof this.canvasEngine.getDesignObjectRect === 'function'\r\n        ? this.canvasEngine.getDesignObjectRect(object)\r\n        : null;\r\n    const zoneBounds =\r\n      zone && typeof this.canvasEngine.getZoneBounds === 'function' ? this.canvasEngine.getZoneBounds(zone) : null;\r\n    const intersectionRect = objectRect && zoneBounds ? this.getRectIntersection(objectRect, zoneBounds) : null;\r\n\r\n    return {\r\n      objectRect: objectRect,\r\n      zoneBounds: zoneBounds,\r\n      intersectionRect: intersectionRect,\r\n      isVisibleInZone: !!intersectionRect,\r\n      isFullyOutsideZone: !!objectRect && !!zoneBounds && !intersectionRect\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getBillableDesignObjects = function () {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return [];\r\n    return this.canvasEngine.getDesignObjects().filter(\r\n      function (object) {\r\n        if (String(object && object.personalizerSource || '').toLowerCase() === 'system') return false;\r\n        if (String(object && object.personalizerKind || '').toLowerCase() === 'background') return false;\r\n        if (String(object && object.personalizerKind || '').toLowerCase() === 'placeholder') return false;\r\n        return this.getObjectZoneVisibilityInfo(object).isVisibleInZone;\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildBatEntries = function () {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return [];\r\n    const objects = this.canvasEngine.getDesignObjects();\r\n    return objects.map(\r\n      function (object, index) {\r\n        const kind = this.getSelectedObjectKind(object);\r\n        const zone = this.getZoneById(object.zoneId);\r\n        const dimensions = this.getObjectDimensionCm(object, zone);\r\n        const visibilityInfo = this.getObjectZoneVisibilityInfo(object);\r\n        const objectRect = visibilityInfo.objectRect;\r\n        const zoneBounds = visibilityInfo.zoneBounds;\r\n        const croppedRect = visibilityInfo.intersectionRect;\r\n        const objectView = normalizeViewId(object && object.view);\r\n        const textValue = kind === 'text' ? String(object.text || '').replace(/\\s+/g, ' ').trim() : '';\r\n        const fillValue = kind === 'text' ? String(object.fill || '').trim() : '';\r\n        const fontValue = kind === 'text' ? String(object.fontFamily || '').trim() : '';\r\n        const imageSource = kind === 'image' ? this.getImageObjectSource(object) : '';\r\n        let croppedWidthCm = 0;\r\n        let croppedHeightCm = 0;\r\n        if (croppedRect && zoneBounds && Number(zone.widthCm) > 0 && Number(zone.heightCm) > 0) {\r\n          croppedWidthCm = (Number(croppedRect.width) / Number(zoneBounds.width)) * Number(zone.widthCm);\r\n          croppedHeightCm = (Number(croppedRect.height) / Number(zoneBounds.height)) * Number(zone.heightCm);\r\n        }\r\n        const colorDescriptor = kind === 'text' ? this.getTextColorOptionDescriptor(fillValue) : null;\r\n        return {\r\n          index: index + 1,\r\n          type: kind === 'image' ? 'Image' : 'Texte',\r\n          view: this.getViewLabel(objectView),\r\n          viewKey: objectView,\r\n          zoneId: zone && zone.id ? zone.id : '',\r\n          zoneLabel: zone && zone.label ? zone.label : '-',\r\n          zoneWidthCm: zone && Number(zone.widthCm) > 0 ? Number(zone.widthCm) : 0,\r\n          zoneHeightCm: zone && Number(zone.heightCm) > 0 ? Number(zone.heightCm) : 0,\r\n          objectWidthCm: dimensions ? Number(dimensions.widthCm) : 0,\r\n          objectHeightCm: dimensions ? Number(dimensions.heightCm) : 0,\r\n          croppedWidthCm: croppedWidthCm,\r\n          croppedHeightCm: croppedHeightCm,\r\n          objectRect: objectRect\r\n            ? {\r\n                left: Number(objectRect.left) || 0,\r\n                top: Number(objectRect.top) || 0,\r\n                width: Number(objectRect.width) || 0,\r\n                height: Number(objectRect.height) || 0\r\n              }\r\n            : null,\r\n          croppedRect: croppedRect\r\n            ? {\r\n                left: Number(croppedRect.left) || 0,\r\n                top: Number(croppedRect.top) || 0,\r\n                width: Number(croppedRect.width) || 0,\r\n                height: Number(croppedRect.height) || 0\r\n              }\r\n            : null,\r\n          visibleInZone: visibilityInfo.isVisibleInZone,\r\n          fullyOutsideZone: visibilityInfo.isFullyOutsideZone,\r\n          text: textValue,\r\n          color: fillValue,\r\n          colorLabel: colorDescriptor && colorDescriptor.label ? colorDescriptor.label : '',\r\n          font: fontValue,\r\n          imageSource: imageSource\r\n        };\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildBatGroupedEntries = function (entries) {\r\n    const list = Array.isArray(entries) ? entries : [];\r\n    const grouped = new Map();\r\n\r\n    list.forEach(\r\n      function (entry) {\r\n        const key = String(entry.viewKey || '') + '|' + String(entry.zoneId || '');\r\n        if (!grouped.has(key)) {\r\n          grouped.set(key, {\r\n            view: entry.view,\r\n            viewKey: entry.viewKey,\r\n            zoneId: entry.zoneId,\r\n            zoneLabel: entry.zoneLabel,\r\n            zoneWidthCm: entry.zoneWidthCm,\r\n            zoneHeightCm: entry.zoneHeightCm,\r\n            objectRect: null,\r\n            textParts: [],\r\n            hasImage: false,\r\n            hasText: false,\r\n            objectWidthCm: 0,\r\n            objectHeightCm: 0,\r\n            croppedWidthCm: 0,\r\n            croppedHeightCm: 0,\r\n            croppedRect: null,\r\n            textStyles: [],\r\n            imageSources: []\r\n            ,\r\n            visibleEntryCount: 0\r\n          });\r\n        }\r\n\r\n        const group = grouped.get(key);\r\n        if (!group) return;\r\n        if (entry.visibleInZone) group.visibleEntryCount += 1;\r\n        if (entry.type === 'Image' && entry.visibleInZone) group.hasImage = true;\r\n        if (entry.type === 'Texte' && entry.visibleInZone) group.hasText = true;\r\n        if (entry.type === 'Texte' && entry.text && entry.visibleInZone) group.textParts.push(entry.text);\r\n        if (entry.type === 'Texte') {\r\n          if (entry.visibleInZone) {\r\n            group.textStyles.push({\r\n              text: String(entry.text || '').trim(),\r\n              color: String(entry.color || '').trim(),\r\n              colorLabel: String(entry.colorLabel || '').trim(),\r\n              font: String(entry.font || '').trim()\r\n            });\r\n          }\r\n        }\r\n        if (entry.type === 'Image' && entry.visibleInZone && entry.imageSource) {\r\n          group.imageSources.push(String(entry.imageSource));\r\n        }\r\n\r\n        const rect = entry.visibleInZone ? entry.objectRect : null;\r\n        if (rect && Number(rect.width) > 0 && Number(rect.height) > 0) {\r\n          if (!group.objectRect) {\r\n            group.objectRect = {\r\n              left: Number(rect.left) || 0,\r\n              top: Number(rect.top) || 0,\r\n              width: Number(rect.width) || 0,\r\n              height: Number(rect.height) || 0\r\n            };\r\n          } else {\r\n            const left = Math.min(group.objectRect.left, Number(rect.left) || 0);\r\n            const top = Math.min(group.objectRect.top, Number(rect.top) || 0);\r\n            const right = Math.max(\r\n              group.objectRect.left + group.objectRect.width,\r\n              (Number(rect.left) || 0) + (Number(rect.width) || 0)\r\n            );\r\n            const bottom = Math.max(\r\n              group.objectRect.top + group.objectRect.height,\r\n              (Number(rect.top) || 0) + (Number(rect.height) || 0)\r\n            );\r\n            group.objectRect = {\r\n              left: left,\r\n              top: top,\r\n              width: Math.max(0, right - left),\r\n              height: Math.max(0, bottom - top)\r\n            };\r\n          }\r\n        }\r\n\r\n        const cropped = entry.croppedRect;\r\n        if (cropped && Number(cropped.width) > 0 && Number(cropped.height) > 0) {\r\n          if (!group.croppedRect) {\r\n            group.croppedRect = {\r\n              left: Number(cropped.left) || 0,\r\n              top: Number(cropped.top) || 0,\r\n              width: Number(cropped.width) || 0,\r\n              height: Number(cropped.height) || 0\r\n            };\r\n          } else {\r\n            const left = Math.min(group.croppedRect.left, Number(cropped.left) || 0);\r\n            const top = Math.min(group.croppedRect.top, Number(cropped.top) || 0);\r\n            const right = Math.max(\r\n              group.croppedRect.left + group.croppedRect.width,\r\n              (Number(cropped.left) || 0) + (Number(cropped.width) || 0)\r\n            );\r\n            const bottom = Math.max(\r\n              group.croppedRect.top + group.croppedRect.height,\r\n              (Number(cropped.top) || 0) + (Number(cropped.height) || 0)\r\n            );\r\n            group.croppedRect = {\r\n              left: left,\r\n              top: top,\r\n              width: Math.max(0, right - left),\r\n              height: Math.max(0, bottom - top)\r\n            };\r\n          }\r\n        }\r\n      }.bind(this)\r\n    );\r\n\r\n    return Array.from(grouped.values())\r\n      .filter(function (group) {\r\n        return Number(group.visibleEntryCount) > 0;\r\n      })\r\n      .map(\r\n      function (group, index) {\r\n        const zone = this.getZoneById(group.zoneId);\r\n        const zoneBounds =\r\n          zone && this.canvasEngine && typeof this.canvasEngine.getZoneBounds === 'function'\r\n            ? this.canvasEngine.getZoneBounds(zone)\r\n            : null;\r\n\r\n        if (group.objectRect && zoneBounds && Number(zoneBounds.width) > 0 && Number(zoneBounds.height) > 0) {\r\n          group.objectWidthCm = (Number(group.objectRect.width) / Number(zoneBounds.width)) * Number(group.zoneWidthCm || 0);\r\n          group.objectHeightCm =\r\n            (Number(group.objectRect.height) / Number(zoneBounds.height)) * Number(group.zoneHeightCm || 0);\r\n        }\r\n        if (group.croppedRect && zoneBounds && Number(zoneBounds.width) > 0 && Number(zoneBounds.height) > 0) {\r\n          group.croppedWidthCm =\r\n            (Number(group.croppedRect.width) / Number(zoneBounds.width)) * Number(group.zoneWidthCm || 0);\r\n          group.croppedHeightCm =\r\n            (Number(group.croppedRect.height) / Number(zoneBounds.height)) * Number(group.zoneHeightCm || 0);\r\n        }\r\n\r\n        const typeLabel = group.hasImage && group.hasText ? 'Texte + Image' : group.hasImage ? 'Image' : 'Texte';\r\n        return {\r\n          index: index + 1,\r\n          type: typeLabel,\r\n          view: group.view,\r\n          viewKey: group.viewKey,\r\n          zoneId: group.zoneId,\r\n          zoneLabel: group.zoneLabel,\r\n          zoneWidthCm: group.zoneWidthCm,\r\n          zoneHeightCm: group.zoneHeightCm,\r\n          objectWidthCm: group.objectWidthCm,\r\n          objectHeightCm: group.objectHeightCm,\r\n          croppedWidthCm: group.croppedWidthCm,\r\n          croppedHeightCm: group.croppedHeightCm,\r\n          objectRect: group.objectRect,\r\n          croppedRect: group.croppedRect,\r\n          text: group.textParts.join(' | '),\r\n          textStyles: group.textStyles,\r\n          imageSources: group.imageSources\r\n        };\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hasFullyOutOfFramePersonalizations = function () {\r\n    const entries = this.buildBatEntries();\r\n    return entries.some(function (entry) {\r\n      return !!(entry && entry.fullyOutsideZone);\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildBatExportData = function () {\n    const rawEntries = this.buildBatEntries();\n    const entries = this.buildBatGroupedEntries(rawEntries);\n    const technique = this.selectedTechnique && this.selectedTechnique.label ? this.selectedTechnique.label : '-';\n    const splitDistribution = this.isSplitVariantQuantityMode() && this.getSplitOptionIndex() >= 0\n      ? this.getAvailableSizeVariants()\n          .map(\n            function (variant) {\n              const quantity = this.getSizeQuantityByVariantId(variant.id);\n              return quantity > 0 ? String(variant.label || '') + ' x ' + quantity : '';\n            }.bind(this)\n          )\n          .filter(Boolean)\n          .join(', ')\n      : '';\n    const color = splitDistribution || this.activeColorName || (this.currentVariant && this.currentVariant.title ? this.currentVariant.title : '-');\n    return {\r\n      generatedAt: new Date().toISOString(),\r\n      productTitle: this.config.productTitle || '',\r\n      technique: technique,\r\n      color: color,\r\n      rawEntries: rawEntries,\r\n      entries: entries\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildBatSummaryForOrder = function (batData) {\r\n    const data = batData || this.buildBatExportData();\r\n    if (!data.entries.length) return '';\r\n    return data.entries\r\n      .map(function (entry) {\r\n        const sizePart =\r\n          entry.objectWidthCm > 0 && entry.objectHeightCm > 0\r\n            ? ' (' +\r\n              this.formatDimensionPx(entry.objectWidthCm) +\r\n              ' x ' +\r\n              this.formatDimensionPx(entry.objectHeightCm) +\r\n              ')'\r\n            : '';\r\n        const contentPart = entry.type === 'Texte' && entry.text ? ' \"' + entry.text + '\"' : '';\r\n        return entry.view + ' / ' + entry.zoneLabel + ' / ' + entry.type + contentPart + sizePart;\r\n      }, this)\r\n      .join(' | ');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.loadImageElement = function (src) {\r\n    return new Promise(function (resolve, reject) {\r\n      if (!src) {\r\n        reject(new Error('Missing image source'));\r\n        return;\r\n      }\r\n      const image = new Image();\r\n      image.crossOrigin = 'anonymous';\r\n      image.onload = function () {\r\n        resolve(image);\r\n      };\r\n      image.onerror = function () {\r\n        reject(new Error('Image load failed'));\r\n      };\r\n      image.src = src;\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.parseHexColorToRgb = function (value) {\r\n    const raw = String(value || '').trim().toLowerCase();\r\n    const normalized = raw.startsWith('#') ? raw.slice(1) : raw;\r\n    if (normalized.length !== 6) return null;\r\n    const r = Number.parseInt(normalized.slice(0, 2), 16);\r\n    const g = Number.parseInt(normalized.slice(2, 4), 16);\r\n    const b = Number.parseInt(normalized.slice(4, 6), 16);\r\n    if (!Number.isFinite(r) || !Number.isFinite(g) || !Number.isFinite(b)) return null;\r\n    return { r: r, g: g, b: b };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.cropDataUrlByRect = async function (sourceDataUrl, rect, options) {\r\n    const settings = options || {};\r\n    const padding = Math.max(0, Number(settings.paddingRatio) || 0.22);\r\n    const outputWidth = Math.max(80, Number(settings.outputWidth) || 320);\r\n    const outputHeight = Math.max(80, Number(settings.outputHeight) || 220);\r\n    const scale = Math.max(0.1, Number(settings.scale) || 1);\r\n    const transparentBackground = !!settings.transparentBackground;\r\n    const matchCropAspect = !!settings.matchCropAspect;\r\n    if (!sourceDataUrl || !rect) return '';\r\n\r\n    const image = await this.loadImageElement(sourceDataUrl);\r\n    const safeRectWidth = Math.max(1, (Number(rect.width) || 0) * scale);\r\n    const safeRectHeight = Math.max(1, (Number(rect.height) || 0) * scale);\r\n    const padX = safeRectWidth * padding;\r\n    const padY = safeRectHeight * padding;\r\n    const x = Math.max(0, (Number(rect.left) || 0) * scale - padX);\r\n    const y = Math.max(0, (Number(rect.top) || 0) * scale - padY);\r\n    const maxCropWidth = image.width - x;\r\n    const maxCropHeight = image.height - y;\r\n    const cropWidth = Math.max(1, Math.min(maxCropWidth, safeRectWidth + padX * 2));\r\n    const cropHeight = Math.max(1, Math.min(maxCropHeight, safeRectHeight + padY * 2));\r\n\r\n    const offscreen = document.createElement('canvas');\r\n    let resolvedOutputWidth = outputWidth;\r\n    let resolvedOutputHeight = outputHeight;\r\n    if (matchCropAspect && cropWidth > 0 && cropHeight > 0) {\r\n      resolvedOutputHeight = Math.max(2, Math.round(resolvedOutputWidth * (cropHeight / cropWidth)));\r\n    }\r\n    offscreen.width = resolvedOutputWidth;\r\n    offscreen.height = resolvedOutputHeight;\r\n    const ctx = offscreen.getContext('2d');\r\n    if (!ctx) return '';\r\n\r\n    if (!transparentBackground) {\r\n      ctx.fillStyle = getOrionThemeColor('--orion-surface-light', '#f7eee8');\r\n      ctx.fillRect(0, 0, offscreen.width, offscreen.height);\r\n    } else {\r\n      ctx.clearRect(0, 0, offscreen.width, offscreen.height);\r\n    }\r\n    ctx.imageSmoothingEnabled = true;\r\n    ctx.imageSmoothingQuality = 'high';\r\n\r\n    if (matchCropAspect) {\r\n      ctx.drawImage(image, x, y, cropWidth, cropHeight, 0, 0, resolvedOutputWidth, resolvedOutputHeight);\r\n    } else {\r\n      const ratioX = resolvedOutputWidth / cropWidth;\r\n      const ratioY = resolvedOutputHeight / cropHeight;\r\n      const ratio = Math.min(ratioX, ratioY);\r\n      const drawWidth = cropWidth * ratio;\r\n      const drawHeight = cropHeight * ratio;\r\n      const dx = (resolvedOutputWidth - drawWidth) / 2;\r\n      const dy = (resolvedOutputHeight - drawHeight) / 2;\r\n      ctx.drawImage(image, x, y, cropWidth, cropHeight, dx, dy, drawWidth, drawHeight);\r\n    }\r\n\r\n    return offscreen.toDataURL('image/png');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getRectForPdfRendering = function (entryOrRaw) {\r\n    if (!entryOrRaw) return null;\r\n    return entryOrRaw.croppedRect || entryOrRaw.objectRect || null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getRelativeRect = function (childRect, parentRect, boundsWidth, boundsHeight) {\r\n    if (!childRect || !parentRect) return null;\r\n    const parentW = Math.max(1, Number(parentRect.width) || 0);\r\n    const parentH = Math.max(1, Number(parentRect.height) || 0);\r\n    const xRatio = ((Number(childRect.left) || 0) - (Number(parentRect.left) || 0)) / parentW;\r\n    const yRatio = ((Number(childRect.top) || 0) - (Number(parentRect.top) || 0)) / parentH;\r\n    const wRatio = (Number(childRect.width) || 0) / parentW;\r\n    const hRatio = (Number(childRect.height) || 0) / parentH;\r\n    return {\r\n      // Keep negative offsets for source rects so clipping can cut overflow correctly.\r\n      x: xRatio * boundsWidth,\r\n      y: yRatio * boundsHeight,\r\n      width: Math.max(0, wRatio) * boundsWidth,\r\n      height: Math.max(0, hRatio) * boundsHeight\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.buildVisibleImageDataUrl = async function (rawImageEntry) {\r\n    const source = rawImageEntry && rawImageEntry.imageSource ? String(rawImageEntry.imageSource) : '';\r\n    if (!source) return '';\r\n    const objectRect = rawImageEntry.objectRect;\r\n    const visibleRect = rawImageEntry.croppedRect || rawImageEntry.objectRect;\r\n    if (!objectRect || !visibleRect) return source;\r\n\r\n    const sourceImage = await this.loadImageElement(source);\r\n    const objW = Math.max(1, Number(objectRect.width) || 1);\r\n    const objH = Math.max(1, Number(objectRect.height) || 1);\r\n    const visW = Math.max(1, Number(visibleRect.width) || 1);\r\n    const visH = Math.max(1, Number(visibleRect.height) || 1);\r\n    const dx = ((Number(visibleRect.left) || 0) - (Number(objectRect.left) || 0)) / objW;\r\n    const dy = ((Number(visibleRect.top) || 0) - (Number(objectRect.top) || 0)) / objH;\r\n    const dw = visW / objW;\r\n    const dh = visH / objH;\r\n\r\n    const sx = Math.max(0, dx * sourceImage.width);\r\n    const sy = Math.max(0, dy * sourceImage.height);\r\n    const sw = Math.max(1, Math.min(sourceImage.width - sx, dw * sourceImage.width));\r\n    const sh = Math.max(1, Math.min(sourceImage.height - sy, dh * sourceImage.height));\r\n\r\n    const outCanvas = document.createElement('canvas');\r\n    outCanvas.width = Math.max(2, Math.round(sw));\r\n    outCanvas.height = Math.max(2, Math.round(sh));\r\n    const ctx = outCanvas.getContext('2d');\r\n    if (!ctx) return source;\r\n    ctx.imageSmoothingEnabled = true;\r\n    ctx.imageSmoothingQuality = 'high';\r\n    ctx.clearRect(0, 0, outCanvas.width, outCanvas.height);\r\n    ctx.drawImage(sourceImage, sx, sy, sw, sh, 0, 0, outCanvas.width, outCanvas.height);\r\n    return outCanvas.toDataURL('image/png');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getBatViewPreviewMap = function () {\r\n    const result = {};\r\n    const views = this.getTechniqueAvailableViews().slice();\r\n    if (this.isPrintMode() && this.printDocument && Array.isArray(this.printDocument.physicalViews)) {\r\n      this.printDocument.physicalViews.forEach(function (view) {\r\n        const viewId = normalizeViewId(view && view.id);\r\n        if (views.indexOf(viewId) < 0) views.push(viewId);\r\n      });\r\n    }\r\n    // A BAT displays these captures in small boxes. JPEG at this resolution avoids\n    // turning a small customer logo into a multi-megabyte PDF without touching the original.\n    // Render the source preview at a higher pixel density, then crop the zoom\n    // to the design bounds below. JPEG keeps the complete BAT small while the\n    // crop retains enough detail for text and logos.\n    const previewMultiplier = 2;\n    const previewOptions = { multiplier: previewMultiplier, format: 'jpeg', quality: 0.78 };\n    views.forEach(\r\n      function (view) {\r\n        if (!this.canvasEngine) return;\r\n        if (typeof this.canvasEngine.getPreviewDataURLForView === 'function') {\r\n          result[view] = {\r\n            dataUrl: this.canvasEngine.getPreviewDataURLForView(view, previewOptions) || '',\n            multiplier: previewMultiplier\r\n          };\r\n          return;\r\n        }\r\n        if (typeof this.canvasEngine.getPreviewDataURL === 'function') {\r\n          result[view] = {\r\n            dataUrl: this.canvasEngine.getPreviewDataURL(previewOptions) || '',\n            multiplier: previewMultiplier\r\n          };\r\n          return;\r\n        }\r\n        result[view] = { dataUrl: '', multiplier: 1 };\r\n      }.bind(this)\r\n    );\r\n    return result;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getBatRawTextEntriesForGroup = function (batData, groupedEntry) {\r\n    if (!batData || !Array.isArray(batData.rawEntries)) return [];\r\n    return batData.rawEntries.filter(function (raw) {\r\n      return (\r\n        raw &&\r\n        raw.type === 'Texte' &&\r\n        raw.viewKey === groupedEntry.viewKey &&\r\n        String(raw.zoneId || '') === String(groupedEntry.zoneId || '') &&\r\n        raw.visibleInZone &&\r\n        raw.objectRect &&\r\n        Number(raw.objectRect.width) > 0 &&\r\n        Number(raw.objectRect.height) > 0\r\n      );\r\n    });\r\n  };\r\n\r\n  // BAT composition is deliberately separate from the legacy individual production exports.\n  PersonalizerModalApp.prototype.createPersonalizationBatPdf = async function () {\n    if (!this.hasPersonalizationObjects()) throw new Error('Aucune personnalisation \u00E0 enregistrer dans le BAT.');\n    const Pdf = window.jspdf && window.jspdf.jsPDF;\n    if (!Pdf) throw new Error('Le module PDF est indisponible pour le moment.');\n    const app = this;\n    const batData = this.buildBatExportData();\n    const doc = new Pdf({ unit: 'mm', format: 'a4', compress: true });\n    const objects = this.canvasEngine.getDesignObjects();\n    const entries = batData.rawEntries.filter(function (entry) { return entry.visibleInZone !== false; }).map(function (raw, i) {\n      const object = objects[raw.index - 1] || {};\n      const qr = !!object.personalizerQrValue;\n      const text = raw.type === 'Texte' ? String(object.text == null ? raw.text || '' : object.text) : '';\n      const styles = [];\n      Object.keys(object.styles || {}).forEach(function (line) {\n        const characters = object.styles[line] || {};\n        let run = null;\n        Object.keys(characters).sort(function (a, b) { return Number(a) - Number(b); }).forEach(function (column) {\n          const style = Object.assign({}, object, characters[column]);\n          const label = styleLabel(style);\n          if (run && run.label === label && Number(column) === run.end + 1) {\n            run.end = Number(column);\n          } else {\n            run = { line: Number(line) + 1, start: Number(column), end: Number(column), label: label };\n            styles.push(run);\n          }\n        });\n      });\n      return Object.assign({}, raw, {\n        number: i + 1, object: object, text: text, type: qr ? 'QR Code' : raw.type,\n        content: qr ? String(object.personalizerQrValue) : text || object.personalizerSourceName || 'Image import\u00E9e',\n        dimensions: dimensions(raw.objectWidthCm, raw.objectHeightCm),\n        frame: dimensions(raw.zoneWidthCm, raw.zoneHeightCm),\n        style: raw.type === 'Texte' ? styleLabel(object) : '',\n        runs: styles.map(function (run) { return 'Ligne ' + run.line + ', caract\u00E8res ' + (run.start + 1) + '\u2013' + (run.end + 1) + ' : ' + run.label; }),\n        complex: qr || styles.length > 0 || text.length > 180 || text.split('\\n').length > 4\n      });\n    });\n    const views = [];\n    entries.forEach(function (entry) {\n      let view = views.find(function (item) { return item.key === entry.viewKey; });\n      if (!view) { view = { key: entry.viewKey, label: entry.view, entries: [] }; views.push(view); }\n      view.entries.push(entry);\n    });\n    const date = new Date(batData.generatedAt).toLocaleString('fr-FR');\n    const order = batData.orderName || batData.orderNumber || this.config.orderName;\n    const version = String(batData.version || 1);\n    const left = 12, width = 186, bottom = 278;\n    let y = 0, firstPage = true;\n    let logo = null;\n    if (this.config.agencyLogo) {\n      try { logo = await this.loadImageElement(this.config.agencyLogo); } catch (error) { /* Typographic logo below. */ }\n    }\n    function dimensions(w, h) {\n      function value(n) { return Number(n || 0).toLocaleString('fr-FR', { maximumFractionDigits: 1 }); }\n      return value(w) + ' \u00D7 ' + value(h) + ' cm';\n    }\n    function styleLabel(object) {\n      const weight = String(object.fontWeight || 'normal');\n      const bold = weight === 'bold' || Number(weight) >= 600;\n      return (object.fontFamily || 'Police non renseign\u00E9e') + ' / ' + String(object.fill || '#111111')\n        + '\\nGras : ' + (bold ? 'Oui' : 'Non') + ' \u00B7 Italique : ' + (object.fontStyle === 'italic' ? 'Oui' : 'Non')\n        + '\\nSoulign\u00E9 : ' + (object.underline ? 'Oui' : 'Non') + ' \u00B7 Barr\u00E9 : ' + (object.linethrough ? 'Oui' : 'Non');\n    }\n    function font(size, bold, muted) {\n      doc.setFont('helvetica', bold ? 'bold' : 'normal'); doc.setFontSize(size);\n      doc.setTextColor.apply(doc, muted ? [111, 103, 99] : [39, 22, 17]);\n    }\n    function card(x, top, w, h, tint) {\n      doc.setFillColor.apply(doc, tint ? [255, 237, 227] : [249, 248, 246]);\n      doc.setDrawColor(232, 226, 222); doc.setLineWidth(0.2);\n      doc.roundedRect(x, top, w, h, 3, 3, 'FD');\n    }\n    function title(label) {\n      font(9, true); doc.text(label, left + 3, y + 4);\n      doc.setDrawColor(239, 82, 22); doc.setLineWidth(0.65); doc.line(left + 3, y + 6, left + 20, y + 6);\n      y += 10;\n    }\n    function page(label, subtitle) {\n      if (!firstPage) doc.addPage(); firstPage = false;\n      if (logo) {\n        const fit = app.getContainedBox(46, 18, logo.width, logo.height);\n        doc.addImage(logo, 'PNG', left + fit.offsetX, 9 + fit.offsetY, fit.width, fit.height);\n      } else {\n        font(8, false); doc.text('A G E N C E', left, 14);\n        font(25, true); doc.text('ORION', left, 24);\n      }\n      doc.setDrawColor(239, 82, 22); doc.setLineWidth(0.5); doc.line(62, 12, 62, 25);\n      font(8, true); doc.text('BON \u00C0 TIRER', 198, 13, { align: 'right' });\n      font(7, false, true); doc.text(['Version ' + version, date, order ? 'Commande ' + order : 'Pr\u00E9commande'], 198, 18, { align: 'right' });\n      font(23, true); doc.text(label, left, 42);\n      font(10, false, true); doc.text(subtitle, left, 49);\n      y = 57;\n    }\n    function continuation(label) { page(label, 'Suite des informations de personnalisation'); }\n    // Cells are wrapped and split across pages: even a long text is never silently truncated.\n    function table(headers, sizes, rows, continuationLabel) {\n      const lineHeight = 3.25;\n      function heading() {\n        doc.setFillColor(243, 239, 235); doc.roundedRect(left, y, width, 10, 1.5, 1.5, 'F');\n        let x = left;\n        headers.forEach(function (value, i) { font(6.5, true); doc.text(doc.splitTextToSize(value, sizes[i] - 4), x + 2, y + 4); x += sizes[i]; });\n        y += 11;\n      }\n      if (y + 22 > bottom) continuation(continuationLabel);\n      heading();\n      rows.forEach(function (row) {\n        font(6.8, false);\n        const cells = row.map(function (value, i) { return doc.splitTextToSize(String(value == null ? '' : value), sizes[i] - 4); });\n        let offset = 0;\n        const length = Math.max.apply(Math, cells.map(function (lines) { return lines.length; }));\n        while (offset < length) {\n          if (bottom - y < 9) { continuation(continuationLabel); heading(); }\n          const count = Math.min(length - offset, Math.max(1, Math.floor((bottom - y - 4) / lineHeight)));\n          const height = count * lineHeight + 4;\n          let x = left;\n          cells.forEach(function (lines, i) {\n            font(6.8, i === 0);\n            doc.text(lines.slice(offset, offset + count), x + 2, y + 3.5, { lineHeightFactor: lineHeight / (6.8 * 25.4 / 72) });\n            x += sizes[i];\n          });\n          doc.setDrawColor(232, 226, 222); doc.setLineWidth(0.15); doc.line(left, y + height, left + width, y + height);\n          y += height; offset += count;\n        }\n      });\n      y += 5;\n    }\n    async function image(data, x, top, w, h) {\n      if (!data || !await app.drawImageDataUrlContained(doc, data, x, top, w, h, 'FAST')) {\n        throw new Error('Impossible de g\u00E9n\u00E9rer un aper\u00E7u du BAT. Veuillez r\u00E9essayer.');\n      }\n    }\n    // Capture the original Fabric scene at the resolution of the destination, not a enlarged thumbnail.\n    function surface(view) {\n      return app.canvasEngine.getPhysicalPageSurfaceBounds(view) || {\n        left: 0, top: 0, width: app.canvasEngine.fabricCanvas.getWidth(), height: app.canvasEngine.fabricCanvas.getHeight()\n      };\n    }\n    async function capture(view, rect, pixels, png) {\n      const bounds = rect || surface(view);\n      const multiplier = Math.min(32, pixels / Math.max(1, bounds.width, bounds.height));\n      const source = app.canvasEngine.getPreviewDataURLForView(view, {\n        crop: bounds, multiplier: multiplier, format: 'png'\n      });\n      if (png) return source;\n      // Flatten transparent margins onto white before JPEG encoding (otherwise they turn black).\n      const visual = await app.loadImageElement(source);\n      const canvas = document.createElement('canvas');\n      canvas.width = visual.width; canvas.height = visual.height;\n      const context = canvas.getContext('2d');\n      context.fillStyle = '#ffffff'; context.fillRect(0, 0, canvas.width, canvas.height);\n      context.drawImage(visual, 0, 0);\n      return canvas.toDataURL('image/jpeg', 0.88);\n    }\n    const zooms = {};\n    async function captureZoom(entry) {\n      const r = entry.croppedRect || entry.objectRect;\n      if (!r || !r.width || !r.height) return previews[entry.viewKey];\n      const bounds = surface(entry.viewKey);\n      const pad = Math.max(r.width, r.height) * 0.12;\n      const x = Math.max(bounds.left, r.left - pad), top = Math.max(bounds.top, r.top - pad);\n      const rect = { left: x, top: top, width: Math.min(bounds.left + bounds.width, r.left + r.width + pad) - x,\n        height: Math.min(bounds.top + bounds.height, r.top + r.height + pad) - top };\n      return capture(entry.viewKey, rect, 1100, true);\n    }\n    const previews = {};\n    const originalBatCaptureView = normalizeViewId(this.activeView);\n    const originalSelectedZoneId = this.selectedZone && this.selectedZone.id ? String(this.selectedZone.id) : '';\n    try {\n      for (const view of views) {\n        await this.prepareViewForBatCapture(view.key);\n        previews[view.key] = await capture(view.key, null, 1600, false);\n        for (const entry of view.entries) {\n          zooms[entry.number] = await captureZoom(entry);\n        }\n      }\n    } finally {\n      await this.prepareViewForBatCapture(originalBatCaptureView);\n      if (originalSelectedZoneId) {\n        const originalZone = this.getZoneById(originalSelectedZoneId);\n        if (originalZone) {\n          this.selectedZone = originalZone;\n          this.applyActiveZoneToCanvas();\n        }\n      }\n    }\n    function zoom(entry) {\n      return zooms[entry.number] || previews[entry.viewKey] || '';\n    }\n    async function renderPersonalizationZooms(items, label) {\n      for (let offset = 0; offset < items.length; offset += 3) {\n        if (y + 41 > bottom) continuation(label);\n        title('ZOOMS SUR LES PERSONNALISATIONS');\n        const zoomHeight = Math.min(48, bottom - y - 8);\n        const batch = items.slice(offset, offset + 3), gap = 5, w = (width - gap * (batch.length - 1)) / batch.length;\n        for (let i = 0; i < batch.length; i++) {\n          const entry = batch[i], x = left + i * (w + gap);\n          card(x, y, w, zoomHeight);\n          await image(await zoom(entry), x + 2, y + 2, w - 4, zoomHeight - 4);\n          doc.setFillColor(239, 82, 22); doc.circle(x + 5, y + 5, 3, 'F');\n          font(7, true); doc.setTextColor(255, 255, 255); doc.text(String(entry.number), x + 5, y + 6, { align: 'center' });\n          font(7, false, true); doc.text(doc.splitTextToSize(entry.zoneLabel, w), x, y + zoomHeight + 4);\n        }\n        y += zoomHeight + 9;\n      }\n    }\n    // Cover: real used views only, generous product area, complete overview table.\n    font(6.8, false);\n    const summaryHeight = entries.reduce(function (total, e) {\n      const dimensionsText = e.dimensions + '\\nCadre : ' + e.frame + '\\nRotation : ' + (Number(e.object.angle) || 0) + '\u00B0';\n      const styleText = e.style ? e.style + '\\n' + (e.colorLabel || e.color || '') + ' \u00B7 Alignement : ' + (e.object.textAlign || 'Gauche') : 'Visuel fourni';\n      return total + 4 + 3.25 * Math.max(doc.splitTextToSize(dimensionsText, 19).length,\n        doc.splitTextToSize(styleText, 45).length, doc.splitTextToSize(e.content, 28).length,\n        doc.splitTextToSize(e.zoneLabel, 16).length);\n    }, 0);\n    page('BON \u00C0 TIRER', 'Synth\u00E8se de la personnalisation');\n    const info = [\n      ['Produit', batData.productTitle], ['Technique', batData.technique],\n      ['Couleur', batData.color], ['Date', date],\n      ['Commande', order || 'Pr\u00E9commande'], ['Version', version]\n    ];\n    if (batData.customerName) info.push(['Client', batData.customerName]);\n    if (this.currentVariant && this.currentVariant.title && this.currentVariant.title !== batData.color) info.push(['Variante', this.currentVariant.title]);\n    const infoRows = [];\n    for (let i = 0; i < info.length; i += 2) infoRows.push([info[i][0], info[i][1], info[i + 1] ? info[i + 1][0] : '', info[i + 1] ? info[i + 1][1] : '']);\n    font(8, true);\n    const infoRowHeights = infoRows.map(function (row) {\n      return Math.max(10, 4 + 3.5 * Math.max(doc.splitTextToSize(String(row[1] || ''), 60).length,\n        doc.splitTextToSize(String(row[3] || ''), 60).length));\n    });\n    const infoHeight = infoRowHeights.reduce(function (sum, height) { return sum + height; }, 6);\n    card(left, y, width, infoHeight);\n    let infoOffset = 0;\n    for (let row = 0; row < infoRows.length; row++) {\n      for (let col = 0; col < 2; col++) {\n        const x = left + 5 + col * 93;\n        font(7, false, true); doc.text(infoRows[row][col * 2], x, y + 7 + infoOffset);\n        font(8, true); doc.text(doc.splitTextToSize(String(infoRows[row][col * 2 + 1] || ''), 60), x + 23, y + 7 + infoOffset);\n      }\n      infoOffset += infoRowHeights[row];\n    }\n    y += infoHeight + 5;\n    title('APER\u00C7U DU PRODUIT');\n    const previewHeight = Math.max(58, Math.min(84, bottom - y - summaryHeight - 55));\n    for (let offset = 0; offset < views.length; offset += 2) {\n      if (y + previewHeight + 8 > bottom) { continuation('Aper\u00E7u du produit'); }\n      const batch = views.slice(offset, offset + 2), w = batch.length === 1 ? width : (width - 5) / 2;\n      for (let i = 0; i < batch.length; i++) {\n        const x = left + i * (w + 5); card(x, y, w, previewHeight);\n        await image(previews[batch[i].key], x + 2, y + 2, w - 4, previewHeight - 9);\n        font(8, false, true); doc.text(batch[i].label, x + w / 2, y + previewHeight - 3, { align: 'center' });\n      }\n      y += previewHeight + 7;\n    }\n    title('R\u00C9CAPITULATIF DES PERSONNALISATIONS');\n    table(['#', 'Vue', 'Zone', 'Type', 'Contenu', 'Dimensions', 'Style / Police / Couleur', 'Technique'],\n      [7, 15, 20, 15, 32, 23, 49, 25],\n      entries.map(function (e) { return [e.number, e.view, e.zoneLabel, e.type, e.content, e.dimensions + '\\nCadre : ' + e.frame + '\\nRotation : ' + (Number(e.object.angle) || 0) + '\u00B0', e.style ? e.style + '\\n' + (e.colorLabel || e.color || '') + ' \u00B7 Alignement : ' + ({ left: 'Gauche', center: 'Centre', right: 'Droite', justify: 'Justifi\u00E9' }[e.object.textAlign] || e.object.textAlign || 'Gauche') : 'Visuel fourni', batData.technique]; }), 'Synth\u00E8se \u00B7 suite');\n    if (y + 18 > bottom) continuation('Validation du BAT');\n    card(left, y, width, 17, true); font(8, false);\n    doc.text(['Ce BAT pr\u00E9sente un aper\u00E7u de votre personnalisation.',\n      'Merci de v\u00E9rifier attentivement les \u00E9l\u00E9ments avant validation.'], left + 7, y + 6);\n    // One main sheet per view; overflow alone produces continuation sheets.\n    for (const view of views) {\n      const label = /^vue\\b/i.test(view.label) ? view.label : 'Vue ' + view.label;\n      page(label, 'D\u00E9tail des personnalisations et aper\u00E7u du rendu');\n      card(left, y, width, 125);\n      await image(previews[view.key], left + 3, y + 3, width - 6, 119);\n      y += 130;\n      title('D\u00C9TAILS DES ZONES \u00B7 ' + view.label.toUpperCase());\n      table(['#', 'Zone / Type', 'Contenu', 'Dimensions / Cadre', 'Technique'],\n        [8, 36, 69, 45, 28], view.entries.map(function (e) {\n          return [e.number, e.zoneLabel + '\\n' + e.type, e.content, e.dimensions + '\\nCadre : ' + e.frame, batData.technique];\n        }), label + ' \u00B7 suite');\n      await renderPersonalizationZooms(view.entries, label + ' \u00B7 suite');\n    }\n    // Complete technical data lives in structured tables. Complex elements get the large detail visual.\n    for (const view of views) {\n      for (const e of view.entries.filter(function (item) { return item.complex; })) {\n        page('D\u00E9tail de personnalisation', '#' + e.number + ' \u00B7 ' + e.view + ' \u00B7 ' + e.zoneLabel);\n        card(left, y, width, 120); await image(await zoom(e), left + 3, y + 3, width - 6, 114); y += 126;\n        title('INFORMATIONS D\u00C9TAILL\u00C9ES');\n        const technicalRows = [\n          ['Vue / Zone', e.view + ' / ' + e.zoneLabel], ['Type', e.type]\n        ];\n        if (e.type === 'QR Code') {\n          technicalRows.push(['Contenu / URL', e.content], ['Dimensions', e.dimensions],\n            ['Couleur', e.colorLabel || e.object.personalizerQrColor || e.color || '#111111'],\n            ['Cadre', e.frame], ['Rotation', (Number(e.object.angle) || 0) + '\u00B0'], ['Technique', batData.technique]);\n        } else if (e.type === 'Image') {\n          technicalRows.push(['Nom du fichier', e.object.personalizerSourceName || e.content],\n            ['Dimensions', e.dimensions], ['Cadre', e.frame],\n            ['Rotation', (Number(e.object.angle) || 0) + '\u00B0'], ['Technique', batData.technique]);\n        } else {\n          const textObject = e.object || {};\n          technicalRows.push(['Contenu exact', e.content], ['Dimensions', e.dimensions], ['Police', textObject.fontFamily || 'Non renseign\u00E9e'],\n            ['Couleur', e.colorLabel || e.color || '#111111'], ['Gras', (textObject.fontWeight === 'bold' || Number(textObject.fontWeight) >= 600) ? 'Oui' : 'Non'],\n            ['Italique', textObject.fontStyle === 'italic' ? 'Oui' : 'Non'], ['Soulign\u00E9', textObject.underline ? 'Oui' : 'Non'],\n            ['Barr\u00E9', textObject.linethrough ? 'Oui' : 'Non'], ['Alignement', textObject.textAlign || 'Gauche'],\n            ['Rotation', (Number(textObject.angle) || 0) + '\u00B0'], ['Cadre', e.frame], ['Technique', batData.technique]);\n          e.runs.forEach(function (run) { technicalRows.push(['Style local', run]); });\n        }\n        table(['Information', 'Valeur'], [43, 143], technicalRows, 'D\u00E9tail \u00B7 suite');\n      }\n    }\n    const count = doc.internal.getNumberOfPages();\n    for (let p = 1; p <= count; p++) {\n      doc.setPage(p); font(7, false, true);\n      doc.text(p + ' / ' + count, left, 289);\n      doc.text('www.ag-orion.com', 198, 289, { align: 'right' });\n    }\n    const safeTitle = String(this.config.productTitle || 'personnalisation').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n    return { doc: doc, batData: batData, safeTitle: safeTitle || 'produit' };\n  };\n\r\n  PersonalizerModalApp.prototype.downloadPersonalizationBatPdf = async function (options) {\r\n    try {\r\n      const result = await this.createPersonalizationBatPdf(options);\r\n      result.doc.save('bat-' + result.safeTitle + '.pdf');\r\n    } catch (error) {\r\n      window.alert(error && error.message ? error.message : 'Le BAT PDF est indisponible pour le moment.');\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.createPersonalizationBatBlob = async function () {\r\n    const result = await this.createPersonalizationBatPdf();\r\n    return result.doc.output('blob');\r\n  };\r\n\r\n  // Keep customer uploads separate from the rendered BAT and exclude generated QR/background images.\r\n  PersonalizerModalApp.prototype.getPersonalizationSourceFiles = async function () {\r\n    const objects = this.canvasEngine.getDesignObjects();\r\n    const sourceIndexes = new Map();\r\n    const files = [];\r\n    const sourceNameIndexes = new Map();\r\n    const removedBackgroundPairs = [];\r\n    // Keep the original file even if the customer removes its visible canvas object.\r\n    const sourceObjects = objects.slice();\r\n    objects.forEach(function (object) {\r\n      if (object.personalizerBackgroundRemovalOriginalDataUrl) sourceObjects.push({\r\n        personalizerKind: 'image', personalizerSourceDataUrl: object.personalizerBackgroundRemovalOriginalDataUrl,\r\n        personalizerSourceName: object.personalizerBackgroundRemovalSourceName\r\n      });\r\n      if (object.personalizerRemovedBackgroundDataUrl) sourceObjects.push({\r\n        personalizerKind: 'image', personalizerSourceDataUrl: object.personalizerRemovedBackgroundDataUrl,\r\n        personalizerSourceName: String(object.personalizerBackgroundRemovalSourceName || object.personalizerSourceName || 'image').replace(/\\.[^.]+$/, '') + '-sans-fond.png'\r\n      });\r\n    });\r\n    for (const object of sourceObjects) {\r\n      if (!['image', 'placeholder-image'].includes(object.personalizerKind) || object.personalizerSource === 'system') continue;\r\n      const source = object.personalizerSourceDataUrl;\r\n      if (typeof source !== 'string' || !source.startsWith('data:')) {\r\n        throw new Error(\"Une image source est indisponible. Veuillez la d\u00E9poser \u00E0 nouveau.\");\r\n      }\r\n      let fileIndex = sourceIndexes.get(source);\r\n      if (fileIndex === undefined) {\r\n        fileIndex = files.length;\r\n        sourceIndexes.set(source, fileIndex);\r\n        const blob = await (await fetch(source)).blob();\r\n        const extensions = { 'image/png': 'png', 'image/jpeg': 'jpg', 'image/webp': 'webp', 'image/gif': 'gif', 'image/avif': 'avif' };\r\n        const extension = extensions[blob.type];\r\n        if (!extension) throw new Error(\"Pour enregistrer vos images, utilisez un fichier PNG, JPG, WebP, GIF ou AVIF.\");\r\n        const name = object.personalizerSourceName || ('image-' + fileIndex + '.' + extension);\r\n        files.push({ blob: blob, dataUrl: source, name: name });\r\n        if (name && !name.endsWith('-sans-fond.png')) sourceNameIndexes.set(name, sourceNameIndexes.has(name) ? null : fileIndex);\r\n      }\r\n    }\r\n    objects.forEach(function (object) {\r\n      const originalName = String(object.personalizerBackgroundRemovalSourceName || '');\r\n      const originalIndex = object.personalizerBackgroundRemovalOriginalDataUrl\r\n        ? sourceIndexes.get(object.personalizerBackgroundRemovalOriginalDataUrl) : sourceNameIndexes.get(originalName);\r\n      const variantIndex = sourceIndexes.get(String(object.personalizerRemovedBackgroundDataUrl || object.personalizerSourceDataUrl || ''));\r\n      if (Number.isInteger(originalIndex) && variantIndex !== undefined && variantIndex !== originalIndex) {\r\n        removedBackgroundPairs.push({ originalIndex: originalIndex,\r\n          removedIndex: variantIndex, originalName: originalName,\r\n          removedName: files[variantIndex].name });\r\n      }\r\n    });\r\n    if (files.length > 120) throw new Error(\"Une personnalisation peut contenir au maximum 120 fichiers images.\");\r\n    files.removedBackgroundPairs = removedBackgroundPairs;\r\n    return files;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncBackgroundRemovalButton = function () {\r\n    if (!this.modal) return;\r\n    const object = this.selectedDesignObject;\r\n    const removed = !!(object && object.personalizerBackgroundRemovalOriginalDataUrl &&\r\n      object.personalizerSourceDataUrl === object.personalizerRemovedBackgroundDataUrl);\r\n    this.modal.querySelectorAll('[data-action=\"remove-image-background\"]').forEach(function (button) {\r\n      const label = button.querySelector('.personalizer-inline-action-btn__label') || button;\r\n      label.textContent = removed ? 'Remettre l\u2019arri\u00E8re-plan' : 'Supprimer l\u2019arri\u00E8re-plan';\r\n      button.setAttribute('aria-label', label.textContent + ' de l\u2019image');\r\n      button.disabled = !!this.backgroundRemovalBusy;\r\n    }, this);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.removeBackgroundFromSelectedImage = async function () {\r\n    if (this.backgroundRemovalBusy) return;\r\n    const object = this.getSelectedObjectForKind('image');\r\n    if (!object || !this.canvasEngine || object.personalizerSource === 'system' || String(object.personalizerKind || '') === 'qr') {\r\n      window.alert('S\u00E9lectionnez une image import\u00E9e pour supprimer son arri\u00E8re-plan.');\r\n      return;\r\n    }\r\n    const original = object.personalizerBackgroundRemovalOriginalDataUrl || object.personalizerSourceDataUrl;\r\n    const isRemoved = !!(object.personalizerBackgroundRemovalOriginalDataUrl &&\r\n      object.personalizerSourceDataUrl === object.personalizerRemovedBackgroundDataUrl);\r\n    if (!String(original || '').startsWith('data:image/')) {\r\n      window.alert('Le fichier source de cette image est indisponible.');\r\n      return;\r\n    }\r\n    this.backgroundRemovalBusy = true;\r\n    this.syncBackgroundRemovalButton();\r\n    this.setGlobalBusyOverlay(true, isRemoved ? 'Restauration de l\u2019arri\u00E8re-plan\u2026' : 'Suppression de l\u2019arri\u00E8re-plan\u2026');\r\n    try {\r\n      let removedSource = object.personalizerRemovedBackgroundDataUrl;\r\n      if (!removedSource) {\r\n        const sourceBlob = await (await fetch(original)).blob();\r\n        if (sourceBlob.size > 8 * 1024 * 1024) throw new Error('Le d\u00E9tourage est limit\u00E9 \u00E0 8 Mo et 4 millions de pixels. Votre original reste conserv\u00E9.');\r\n        const formData = new FormData();\r\n        const customGroupId = window.crypto && typeof window.crypto.randomUUID === 'function'\r\n          ? window.crypto.randomUUID() : 'REMOVE-' + Date.now() + '-' + Math.random().toString(36).slice(2);\r\n        formData.append('productId', String(this.config.productId || ''));\r\n        formData.append('variantId', String((this.currentVariant || {}).id || ''));\r\n        formData.append('customGroupId', customGroupId);\r\n        formData.append('image', sourceBlob, object.personalizerBackgroundRemovalSourceName || object.personalizerSourceName || 'image');\r\n        const response = await fetch(this.config.removeBackgroundEndpoint || '/apps/pricing-preview/remove-background', { method: 'POST', body: formData });\r\n        const payload = await response.json().catch(function () { return {}; });\r\n        if (!response.ok || !payload.ok || !payload.imageDataUrl) {\r\n          throw new Error('Le d\u00E9tourage a \u00E9chou\u00E9 : ' + (payload.error || payload.message || ('R\u00E9ponse HTTP ' + response.status)));\r\n        }\r\n        removedSource = payload.imageDataUrl;\r\n      }\r\n      const changed = await this.canvasEngine.setImageBackgroundRemoved(object, removedSource, !isRemoved);\r\n      if (!changed) throw new Error('L\u2019image n\u2019a pas pu \u00EAtre mise \u00E0 jour.');\r\n      this.selectedDesignObject = object;\r\n      this.renderImpressionsUi();\r\n      this.syncCanvasZoomUi();\r\n    } catch (error) {\r\n      window.alert(error && error.message ? error.message : 'Le d\u00E9tourage a \u00E9chou\u00E9. R\u00E9essayez.');\r\n    } finally {\r\n      this.backgroundRemovalBusy = false;\r\n      this.setGlobalBusyOverlay(false, '');\r\n      this.syncBackgroundRemovalButton();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.uploadPersonalizationBat = async function (args) {\r\n    const options = args || {};\r\n    const productId = String(this.config.productId || '');\r\n    const variantId = String(options.variantId || '');\r\n    const customGroupId = String(options.customGroupId || '');\r\n    const shop = String(this.config.shopDomain || (window.Shopify && window.Shopify.shop) || '');\r\n    if (!productId || !variantId || !customGroupId || !shop) throw new Error('Configuration BAT incompl\u00E8te.');\r\n\r\n    const blob = await this.createPersonalizationBatBlob();\r\n    const originals = await this.getPersonalizationSourceFiles();\r\n    if (!window.OrionPersonalizationStore || !options.personalizationConfig) throw new Error('Configuration de personnalisation indisponible.');\r\n    const prepared = await window.OrionPersonalizationStore.prepare(options.personalizationConfig, originals);\r\n    if (prepared.json) {\r\n      const configPayload = JSON.parse(prepared.json);\r\n      configPayload.removedBackgroundPairs = originals.removedBackgroundPairs;\r\n      configPayload.sourceLabels = prepared.files.map(function (file) { return file.name; });\r\n      prepared.json = JSON.stringify(configPayload);\r\n    }\r\n    const sourceFiles = prepared.files;\r\n    const configBytes = new Blob([prepared.json]).size;\n    const sourceBytes = sourceFiles.reduce(function (total, file) { return total + file.blob.size; }, 0);\n    if (sourceBytes > 200 * 1024 * 1024) {\n      const mb = function (bytes) { return (bytes / 1024 / 1024).toFixed(1).replace('.', ','); };\n      throw new Error('La taille totale des fichiers client d\u00E9passe 200 Mo (images : ' +\n        mb(sourceBytes) + ' Mo, configuration : ' + mb(configBytes) + ' Mo). R\u00E9duisez le poids ou le nombre des images.');\n    }\r\n\r\n    const tokenResponse = await fetch(this.config.batTokenEndpoint || '/apps/pricing-preview/bat-upload-token', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n      body: JSON.stringify({ productId: productId, variantId: variantId, customGroupId: customGroupId })\r\n    });\r\n    const tokenPayload = await tokenResponse.json().catch(function () { return {}; });\r\n    if (!tokenResponse.ok || !tokenPayload.ok || !tokenPayload.uploadToken) {\r\n      throw new Error(tokenPayload.error || \"L'autorisation d'enregistrement du BAT a \u00E9chou\u00E9.\");\r\n    }\r\n\r\n    const safeGroupId = customGroupId.replace(/[^A-Za-z0-9_-]+/g, '-').slice(0, 120) || 'personnalisation';\r\n    const formData = new FormData();\r\n    formData.append('file', blob, 'BAT-' + safeGroupId + '.pdf');\r\n    formData.append('shop', shop);\r\n    formData.append('productId', productId);\r\n    formData.append('variantId', variantId);\r\n    formData.append('customGroupId', customGroupId);\r\n    formData.append('uploadToken', tokenPayload.uploadToken);\r\n    formData.append('personalizationConfig', prepared.json);\r\n    sourceFiles.forEach(function (file) { formData.append('sourceFiles', file.blob, file.name); });\r\n\r\n    const uploadResponse = await fetch(this.config.batUploadEndpoint || 'https://api.ag-orion.com/api/uploads/bat', {\r\n      method: 'POST', body: formData\r\n    });\r\n    const uploadPayload = await uploadResponse.json().catch(function () { return {}; });\r\n    if (!uploadResponse.ok || !uploadPayload.ok || !uploadPayload.uploadId) {\r\n      throw new Error(uploadPayload.error || \"Le BAT n'a pas pu \u00EAtre enregistr\u00E9.\");\r\n    }\r\n    if (sourceFiles.length && uploadPayload.sourceCount !== sourceFiles.length) {\r\n      throw new Error(\"Les images sources n'ont pas toutes \u00E9t\u00E9 enregistr\u00E9es. Veuillez r\u00E9essayer.\");\r\n    }\r\n    if (uploadPayload.personalizationConfigId !== uploadPayload.uploadId) {\r\n      throw new Error(\"La configuration complete n'a pas ete enregistree.\");\r\n    }\r\n    return String(uploadPayload.uploadId);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.appendIndividualBatPagesToPdf = async function (doc, batData) {\r\n    if (!doc || !batData || !Array.isArray(batData.entries) || !batData.entries.length) return;\r\n\r\n    for (const entry of batData.entries) {\r\n      const rect = entry.croppedRect || entry.objectRect;\r\n      doc.addPage('a4', 'portrait');\r\n      const pageWidth = doc.internal.pageSize.getWidth();\r\n      const pageHeight = doc.internal.pageSize.getHeight();\r\n\r\n      doc.setFillColor(243, 246, 255);\r\n      doc.rect(0, 0, pageWidth, pageHeight, 'F');\r\n      doc.setTextColor(17, 17, 17);\r\n      doc.setFont('helvetica', 'bold');\r\n      doc.setFontSize(13);\r\n      doc.text('BAT individuel - Personnalisation ' + entry.index, 12, 16);\r\n\r\n      doc.setFont('helvetica', 'normal');\r\n      doc.setFontSize(9);\r\n      doc.text('Vue: ' + (entry.view || '-'), 12, 24);\r\n      doc.text('Zone: ' + (entry.zoneLabel || '-'), 12, 29);\r\n      doc.text('Type: ' + (entry.type || '-'), 12, 34);\r\n      doc.text(\r\n        'Dimensions: ' +\r\n          this.formatDimensionPx(entry.croppedWidthCm || entry.objectWidthCm || 0) +\r\n          ' x ' +\r\n          this.formatDimensionPx(entry.croppedHeightCm || entry.objectHeightCm || 0),\r\n        12,\r\n        39\r\n      );\r\n\r\n      const renderX = 12;\r\n      const renderY = 47;\r\n      const renderW = pageWidth - 24;\r\n      const renderH = pageHeight - 61;\r\n      doc.setDrawColor(190, 199, 230);\r\n      doc.roundedRect(renderX, renderY, renderW, renderH, 2, 2);\r\n\r\n      let rendered = false;\r\n      if (rect) {\r\n        let designOnlyPreview = '';\r\n        if (typeof this.canvasEngine.getDesignOnlyPreviewDataURL === 'function') {\r\n          designOnlyPreview = this.canvasEngine.getDesignOnlyPreviewDataURL({\r\n            view: entry.viewKey,\r\n            zoneId: entry.zoneId,\r\n            multiplier: 6\r\n          });\r\n        }\r\n        if (designOnlyPreview) {\r\n          try {\r\n            const croppedDesign = await this.cropDataUrlByRect(designOnlyPreview, rect, {\r\n              outputWidth: 2200,\r\n              outputHeight: 1600,\r\n              paddingRatio: 0.03,\r\n              scale: 6,\r\n              transparentBackground: true,\r\n              matchCropAspect: true\r\n            });\r\n            if (croppedDesign) {\r\n              await this.drawImageDataUrlContained(doc, croppedDesign, renderX + 4, renderY + 4, renderW - 8, renderH - 8, 'NONE');\r\n              rendered = true;\r\n            }\r\n          } catch (error) {\r\n            rendered = false;\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!rendered) {\r\n        const fallbackPreview = (this.getBatViewPreviewMap()[entry.viewKey] || {}).dataUrl || '';\r\n        if (fallbackPreview) {\r\n          try {\r\n            await this.drawImageDataUrlContained(doc, fallbackPreview, renderX + 4, renderY + 4, renderW - 8, renderH - 8, 'NONE');\r\n          } catch (error) {\r\n            // leave framed blank page if preview cannot render\r\n          }\r\n        }\r\n      }\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.shouldDownloadIndividualPdfs = function () {\r\n    return !!(this.batIndividualToggleInput && this.batIndividualToggleInput.checked);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizeHexColor = function (value) {\r\n    const raw = String(value || '').trim();\r\n    const match = raw.match(/^#?([0-9a-fA-F]{6})$/);\r\n    return match ? ('#' + match[1].toUpperCase()) : '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hexToRgb = function (hex) {\r\n    const normalized = this.normalizeHexColor(hex);\r\n    if (!normalized) return { r: 255, g: 255, b: 255 };\r\n    return {\r\n      r: parseInt(normalized.slice(1, 3), 16),\r\n      g: parseInt(normalized.slice(3, 5), 16),\r\n      b: parseInt(normalized.slice(5, 7), 16)\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.rgbToHex = function (r, g, b) {\r\n    const toHex = function (value) {\r\n      const numeric = Math.max(0, Math.min(255, Math.round(Number(value) || 0)));\r\n      return numeric.toString(16).padStart(2, '0').toUpperCase();\r\n    };\r\n    return '#' + toHex(r) + toHex(g) + toHex(b);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.rgbToHsv = function (r, g, b) {\r\n    const red = Math.max(0, Math.min(255, Number(r) || 0)) / 255;\r\n    const green = Math.max(0, Math.min(255, Number(g) || 0)) / 255;\r\n    const blue = Math.max(0, Math.min(255, Number(b) || 0)) / 255;\r\n    const max = Math.max(red, green, blue);\r\n    const min = Math.min(red, green, blue);\r\n    const delta = max - min;\r\n    let hue = 0;\r\n    if (delta) {\r\n      if (max === red) hue = ((green - blue) / delta) % 6;\r\n      else if (max === green) hue = (blue - red) / delta + 2;\r\n      else hue = (red - green) / delta + 4;\r\n      hue = Math.round(hue * 60);\r\n      if (hue < 0) hue += 360;\r\n    }\r\n    return {\r\n      h: hue,\r\n      s: max === 0 ? 0 : delta / max,\r\n      v: max\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.hsvToRgb = function (h, s, v) {\r\n    const hue = ((Number(h) || 0) % 360 + 360) % 360;\r\n    const rawSaturation = Number(s);\r\n    const rawValue = Number(v);\r\n    const saturation = Math.max(0, Math.min(1, Number.isFinite(rawSaturation) ? rawSaturation : 0));\r\n    const value = Math.max(0, Math.min(1, Number.isFinite(rawValue) ? rawValue : 1));\r\n    const c = value * saturation;\r\n    const x = c * (1 - Math.abs(((hue / 60) % 2) - 1));\r\n    const m = value - c;\r\n    let r = 0;\r\n    let g = 0;\r\n    let b = 0;\r\n    if (hue < 60) {\r\n      r = c; g = x;\r\n    } else if (hue < 120) {\r\n      r = x; g = c;\r\n    } else if (hue < 180) {\r\n      g = c; b = x;\r\n    } else if (hue < 240) {\r\n      g = x; b = c;\r\n    } else if (hue < 300) {\r\n      r = x; b = c;\r\n    } else {\r\n      r = c; b = x;\r\n    }\r\n    return {\r\n      r: Math.round((r + m) * 255),\r\n      g: Math.round((g + m) * 255),\r\n      b: Math.round((b + m) * 255)\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getBackgroundPickerState = function () {\r\n    const map = this.modal ? this.modal.querySelector('[data-background-color-map]') : null;\r\n    return {\r\n      h: Math.max(0, Math.min(360, Number(map && map.dataset.hue) || 0)),\r\n      s: Math.max(0, Math.min(1, Number(map && map.dataset.saturation) || 0)),\r\n      v: Math.max(0, Math.min(1, Number(map && map.dataset.value) || 1))\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getBackgroundRgbInputs = function () {\r\n    const values = { r: 0, g: 0, b: 0 };\r\n    if (!this.modal) return values;\r\n    this.modal.querySelectorAll('[data-background-rgb-input]').forEach(function (input) {\r\n      const channel = String(input.dataset.channel || '').toLowerCase();\r\n      if (channel === 'r' || channel === 'g' || channel === 'b') {\r\n        values[channel] = Math.max(0, Math.min(255, Math.round(Number(input.value) || 0)));\r\n      }\r\n    });\r\n    return values;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getActivePrintBackgroundColor = function () {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getPrintBackgroundColor !== 'function') return '';\r\n    return this.normalizeHexColor(this.canvasEngine.getPrintBackgroundColor(this.activeView));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncBackgroundPanelUi = function (color, options) {\r\n    if (!this.modal) return;\r\n    const settings = options || {};\r\n    const normalized = this.normalizeHexColor(color || this.getActivePrintBackgroundColor() || '#FFFFFF') || '#FFFFFF';\r\n    const hexInput = this.modal.querySelector('[data-background-hex-input]');\r\n    const preview = this.modal.querySelector('[data-background-color-preview]');\r\n    const picker = this.modal.querySelector('.personalizer-background-picker');\r\n    const hueInput = this.modal.querySelector('[data-background-hue-input]');\r\n    const rgb = this.hexToRgb(normalized);\r\n    const hsv = settings.pickerState || this.rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n    const hueRgb = this.hsvToRgb(hsv.h, 1, 1);\r\n    const hueColor = this.rgbToHex(hueRgb.r, hueRgb.g, hueRgb.b);\r\n    if (hexInput) hexInput.value = normalized;\r\n    if (hueInput) hueInput.value = String(Math.round(hsv.h));\r\n    this.modal.querySelectorAll('[data-background-rgb-input]').forEach(function (input) {\r\n      const channel = String(input.dataset.channel || '').toLowerCase();\r\n      if (channel === 'r' || channel === 'g' || channel === 'b') input.value = String(rgb[channel]);\r\n    });\r\n    if (preview) {\r\n      preview.style.setProperty('--background-picker-color', hueColor);\r\n      preview.style.setProperty('--background-picker-saturation', String(hsv.s));\r\n      preview.style.setProperty('--background-picker-value', String(hsv.v));\r\n      preview.style.setProperty('--background-picker-x', String(hsv.s * 100) + '%');\r\n      preview.style.setProperty('--background-picker-y', String((1 - hsv.v) * 100) + '%');\r\n    }\r\n    if (picker) {\r\n      picker.style.setProperty('--background-picker-color', hueColor);\r\n      picker.style.setProperty('--background-picker-saturation', String(hsv.s));\r\n      picker.style.setProperty('--background-picker-value', String(hsv.v));\r\n      picker.style.setProperty('--background-picker-x', String(hsv.s * 100) + '%');\r\n      picker.style.setProperty('--background-picker-y', String((1 - hsv.v) * 100) + '%');\r\n      picker.dataset.hue = String(hsv.h);\r\n      picker.dataset.saturation = String(hsv.s);\r\n      picker.dataset.value = String(hsv.v);\r\n    }\r\n    this.modal.querySelectorAll('[data-background-swatches] [data-color]').forEach(function (button) {\r\n      button.classList.toggle('is-active', String(button.dataset.color || '').toUpperCase() === normalized);\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyPrintBackgroundColor = function (color, options) {\r\n    if (!this.isToolAllowedForCurrentView('background')) return;\r\n    const normalized = this.normalizeHexColor(color);\r\n    if (!normalized || !this.canvasEngine || typeof this.canvasEngine.setPrintBackgroundColor !== 'function') return;\r\n    this.canvasEngine.setPrintBackgroundColor(normalized, { view: this.activeView });\r\n    this.syncBackgroundPanelUi(normalized, options || {});\r\n    this.updatePrice();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.clearPrintBackgroundColor = function () {\r\n    if (!this.isToolAllowedForCurrentView('background')) return;\r\n    if (this.canvasEngine && typeof this.canvasEngine.clearPrintBackgroundColor === 'function') {\r\n      this.canvasEngine.clearPrintBackgroundColor({ view: this.activeView });\r\n    }\r\n    this.syncBackgroundPanelUi('#FFFFFF');\r\n    this.updatePrice();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizePrintTemplates = function (value) {\r\n    let parsedValue = value;\r\n    for (let parseAttempt = 0; parseAttempt < 2 && typeof parsedValue === 'string'; parseAttempt += 1) {\r\n      const serializedValue = parsedValue.trim();\r\n      if (!serializedValue) {\r\n        parsedValue = [];\r\n        break;\r\n      }\r\n      try {\r\n        parsedValue = JSON.parse(serializedValue);\r\n      } catch (error) {\r\n        parsedValue = [];\r\n        break;\r\n      }\r\n    }\r\n    if (parsedValue && typeof parsedValue === 'object' && !Array.isArray(parsedValue) && 'value' in parsedValue) {\r\n      parsedValue = parsedValue.value;\r\n      if (typeof parsedValue === 'string') {\r\n        try {\r\n          parsedValue = JSON.parse(parsedValue);\r\n        } catch (error) {\r\n          parsedValue = [];\r\n        }\r\n      }\r\n    }\r\n    const list = Array.isArray(parsedValue)\r\n      ? parsedValue\r\n      : parsedValue && typeof parsedValue === 'object' && Array.isArray(parsedValue.templates)\r\n        ? parsedValue.templates\r\n        : [];\r\n    return list\r\n      .map(function (template, index) {\r\n        if (!template || typeof template !== 'object') return null;\r\n        const id = String(template.id || template.handle || ('template-' + (index + 1))).trim();\r\n        const name = String(template.name || template.title || ('Modele ' + (index + 1))).trim();\r\n        const sourceViews = template.views && typeof template.views === 'object'\r\n          ? template.views\r\n          : { front: template.front, back: template.back };\r\n        const views = {};\r\n        Object.keys(sourceViews).forEach(function (view) {\r\n          const sourceView = sourceViews[view];\r\n          if (!sourceView || typeof sourceView !== 'object') return;\r\n          const viewId = normalizeViewId(view);\r\n          views[viewId] = Object.assign({}, sourceView, {\r\n            objects: Array.isArray(sourceView.objects)\r\n              ? sourceView.objects\r\n              : Array.isArray(sourceView.elements)\r\n                ? sourceView.elements\r\n                : []\r\n          });\r\n        });\r\n        if (!id || !name || !Object.keys(views).length) return null;\r\n        return {\r\n          id: id,\r\n          name: name,\r\n          format: String(template.format || '').trim(),\r\n          orientation: String(template.orientation || '').trim(),\r\n          thumbnail: String(template.thumbnail || '').trim(),\r\n          colors: Array.isArray(template.colors) ? template.colors : [],\r\n          tags: Array.isArray(template.tags) ? template.tags : [],\r\n          views: views\r\n        };\r\n      })\r\n      .filter(Boolean);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizePrintTemplateCriterion = function (value) {\r\n    return String(value || '')\r\n      .trim()\r\n      .toLocaleLowerCase('fr')\r\n      .normalize('NFD')\r\n      .replace(/[\\u0300-\\u036f]/g, '')\r\n      .replace(/[\\s_-]+/g, '');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getCompatiblePrintTemplates = function () {\r\n    const currentFormat = this.normalizePrintTemplateCriterion(this.printSelection && this.printSelection.format);\r\n    const currentOrientation = this.normalizePrintTemplateCriterion(this.printDocument && this.printDocument.orientation);\r\n    return this.printTemplates.filter(\r\n      function (template) {\r\n        const templateFormat = this.normalizePrintTemplateCriterion(template.format);\r\n        const templateOrientation = this.normalizePrintTemplateCriterion(template.orientation);\r\n        return (!templateFormat || !currentFormat || templateFormat === currentFormat) &&\r\n          (!templateOrientation || !currentOrientation || templateOrientation === currentOrientation);\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderPrintTemplatePreview = function (template) {\r\n    if (template.thumbnail) {\r\n      return '<span class=\"personalizer-template-card__preview personalizer-template-card__preview--image\"><img src=\"' +\r\n        this.escapeHtml(template.thumbnail) + '\" alt=\"\" loading=\"lazy\"></span>';\r\n    }\r\n    const firstTemplateView = template.views ? Object.keys(template.views)[0] : '';\r\n    const viewConfig = (template.views && template.views[firstTemplateView]) || {};\r\n    const background = this.normalizeHexColor(viewConfig.background || viewConfig.backgroundColor || '#FFFFFF') || '#FFFFFF';\r\n    const objects = Array.isArray(viewConfig.objects) ? viewConfig.objects : [];\r\n    const elementsHtml = objects\r\n      .map(\r\n        function (item) {\r\n          const type = String(item.type || 'text').toLowerCase().replace(/_/g, '-');\r\n          const left = Math.max(0, Math.min(100, Number(item.x ?? item.left ?? 0) || 0));\r\n          const top = Math.max(0, Math.min(100, Number(item.y ?? item.top ?? 0) || 0));\r\n          const width = Math.max(1, Math.min(100, Number(item.width ?? item.w ?? 20) || 20));\r\n          const height = Math.max(1, Math.min(100, Number(item.height ?? item.h ?? 8) || 8));\r\n          const color = this.normalizeHexColor(item.color || item.fill || '') || String(item.color || item.fill || '#111111');\r\n          const fontSize = Math.max(6, Math.min(26, (Number(item.fontSize ?? item.font_size) || 14) * 0.38));\r\n          if (type === 'line') {\r\n            return '<span class=\"personalizer-template-card__element\" style=\"left:' + left + '%;top:' + top + '%;width:' + width + '%;height:' + Math.max(1, Number(item.thickness) || height) + '%;background:' + this.escapeHtml(color) + ';\"></span>';\r\n          }\r\n          if (type === 'rect' || type === 'shape') {\r\n            return '<span class=\"personalizer-template-card__element\" style=\"left:' + left + '%;top:' + top + '%;width:' + width + '%;height:' + height + '%;background:' + this.escapeHtml(color) + ';\"></span>';\r\n          }\r\n          if (type === 'image-placeholder' || type === 'placeholder') {\r\n            const placeholderColor = this.normalizeHexColor(item.placeholderColor || item.placeholder_color || item.fill || '#DDDDDD') || '#DDDDDD';\r\n            return '<span class=\"personalizer-template-card__element personalizer-template-card__element--placeholder\" style=\"left:' + left + '%;top:' + top + '%;width:' + width + '%;height:' + height + '%;background:' + this.escapeHtml(placeholderColor) + ';\">' + this.escapeHtml(item.label || item.text || 'Ajouter une image') + '</span>';\r\n          }\r\n          return '<span class=\"personalizer-template-card__element\" style=\"left:' + left + '%;top:' + top + '%;width:' + width + '%;height:' + height + '%;color:' + this.escapeHtml(color) + ';font-size:' + fontSize + 'px;font-weight:' + this.escapeHtml(item.fontWeight || item.font_weight || '400') + ';text-align:' + this.escapeHtml(item.align || item.textAlign || 'left') + ';\">' + this.escapeHtml(item.text || item.label || 'Texte') + '</span>';\r\n        }.bind(this)\r\n      )\r\n      .join('');\r\n\r\n    return '<span class=\"personalizer-template-card__preview\" style=\"background:' + this.escapeHtml(background) + ';\">' + elementsHtml + '</span>';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderPrintTemplates = function () {\r\n    if (!this.modal) return;\r\n    const grid = this.modal.querySelector('[data-template-grid]');\r\n    if (!grid) return;\r\n    const compatibleTemplates = this.getCompatiblePrintTemplates();\r\n    if (!compatibleTemplates.length) {\r\n      grid.innerHTML = '<p class=\"personalizer-template-empty\">Aucun modele n est configure pour ce produit.</p>';\r\n      return;\r\n    }\r\n    grid.innerHTML = compatibleTemplates\r\n      .map(\r\n        function (template) {\r\n          return (\r\n            '<button type=\"button\" class=\"personalizer-template-card\" data-action=\"apply-print-template\" data-template-id=\"' +\r\n            this.escapeHtml(template.id) +\r\n            '\">' +\r\n            this.renderPrintTemplatePreview(template) +\r\n            '<span class=\"personalizer-template-card__name\">' +\r\n            this.escapeHtml(template.name) +\r\n            '</span>' +\r\n            '</button>'\r\n          );\r\n        }.bind(this)\r\n      )\r\n      .join('');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyPrintTemplateById = function (templateId) {\r\n    if (!this.isToolAllowedForCurrentView('template')) return;\r\n    const key = String(templateId || '');\r\n    const template =\r\n      this.printTemplates.find(function (item) {\r\n        return String(item.id || '') === key;\r\n      }) || null;\r\n    if (!template || !this.canvasEngine || typeof this.canvasEngine.applyPrintTemplate !== 'function') return;\r\n    const allowedTemplateViews = {};\r\n    Object.keys(template.views || {}).forEach(function (viewId) {\r\n      const configuredView = this.printDocument && Array.isArray(this.printDocument.views)\r\n        ? this.printDocument.views.find(function (view) { return view.id === normalizeViewId(viewId); })\r\n        : null;\r\n      if (!configuredView || !configuredView.tools || configuredView.tools.template !== false) {\r\n        allowedTemplateViews[normalizeViewId(viewId)] = template.views[viewId];\r\n      }\r\n    }, this);\r\n    if (!Object.keys(allowedTemplateViews).length) return;\r\n    const applicableTemplate = Object.assign({}, template, { views: allowedTemplateViews });\r\n    const requestedView = normalizeViewId(this.activeView);\r\n    const availableViews = this.getTechniqueAvailableViews();\r\n    const targetView =\r\n      availableViews.indexOf(requestedView) >= 0 && applicableTemplate.views[requestedView]\r\n        ? requestedView\r\n        : (Object.keys(applicableTemplate.views)[0] || availableViews[0] || 'front');\r\n    if (this.debugEnabled && typeof console !== 'undefined') {\r\n      const systemCount = this.canvasEngine && typeof this.canvasEngine.getDesignObjects === 'function'\r\n        ? this.canvasEngine.getDesignObjects().filter(function (object) {\r\n            return String(object && object.personalizerSource || '').toLowerCase() === 'system';\r\n          }).length\r\n        : 0;\r\n      console.log('[Print] template target views:', Object.keys(applicableTemplate.views));\r\n      console.log('[Print] preserved system objects:', systemCount);\r\n    }\r\n    this.isApplyingPrintTemplate = true;\r\n    try {\r\n      this.canvasEngine.applyPrintTemplate(applicableTemplate, {\r\n        zones: this.zones,\r\n        replace: true\r\n      });\r\n    } finally {\r\n      this.isApplyingPrintTemplate = false;\r\n    }\r\n    this.selectedDesignKind = '';\r\n    this.selectedDesignObject = null;\r\n    this.setActiveView(targetView);\r\n    this.setControlsPanel('default');\r\n    this.updatePrice();\r\n    this.scheduleActiveViewThumbnailCapture(120);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getRawEntriesForGroupedEntry = function (batData, groupedEntry) {\r\n    if (!batData || !Array.isArray(batData.rawEntries)) return [];\r\n    return batData.rawEntries.filter(function (raw) {\r\n      return (\r\n        raw &&\r\n        raw.viewKey === groupedEntry.viewKey &&\r\n        String(raw.zoneId || '') === String(groupedEntry.zoneId || '') &&\r\n        raw.visibleInZone\r\n      );\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.fitRectInBounds = function (boundsWidth, boundsHeight, targetRatio) {\r\n    const width = Math.max(1, Number(boundsWidth) || 1);\r\n    const height = Math.max(1, Number(boundsHeight) || 1);\r\n    const ratio = Math.max(0.01, Number(targetRatio) || 1);\r\n    let drawWidth = width;\r\n    let drawHeight = drawWidth / ratio;\r\n    if (drawHeight > height) {\r\n      drawHeight = height;\r\n      drawWidth = drawHeight * ratio;\r\n    }\r\n    return {\r\n      width: drawWidth,\r\n      height: drawHeight,\r\n      x: (width - drawWidth) / 2,\r\n      y: (height - drawHeight) / 2\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getContainedBox = function (boxWidth, boxHeight, sourceWidth, sourceHeight) {\r\n    const bw = Math.max(1, Number(boxWidth) || 1);\r\n    const bh = Math.max(1, Number(boxHeight) || 1);\r\n    const sw = Math.max(1, Number(sourceWidth) || 1);\r\n    const sh = Math.max(1, Number(sourceHeight) || 1);\r\n    const scale = Math.min(bw / sw, bh / sh);\r\n    const width = sw * scale;\r\n    const height = sh * scale;\r\n    return {\r\n      width: width,\r\n      height: height,\r\n      offsetX: (bw - width) / 2,\r\n      offsetY: (bh - height) / 2\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.drawImageDataUrlContained = async function (doc, dataUrl, boxX, boxY, boxW, boxH, compression) {\r\n    if (!doc || !dataUrl) return false;\r\n    let imageElement = null;\r\n    try {\r\n      imageElement = await this.loadImageElement(dataUrl);\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n    if (!imageElement) return false;\r\n    const fit = this.getContainedBox(boxW, boxH, imageElement.width, imageElement.height);\r\n    const format = dataUrl.indexOf('image/jpeg') !== -1 || dataUrl.indexOf('image/jpg') !== -1 ? 'JPEG' : 'PNG';\r\n    doc.addImage(\r\n      dataUrl,\r\n      format,\r\n      boxX + fit.offsetX,\r\n      boxY + fit.offsetY,\r\n      fit.width,\r\n      fit.height,\r\n      undefined,\r\n      compression || 'NONE'\r\n    );\r\n    return true;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.computeIndividualPdfPageSizeMm = function (widthMm, heightMm) {\r\n    const w = Math.max(10, Number(widthMm) || 10);\r\n    const h = Math.max(10, Number(heightMm) || 10);\r\n    const margin = 8;\r\n    const pageWidth = Math.max(40, w + margin * 2);\r\n    const pageHeight = Math.max(40, h + margin * 2 + 12);\r\n    return {\r\n      pageWidth: pageWidth,\r\n      pageHeight: pageHeight,\r\n      margin: margin\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.downloadIndividualPersonalizationPdfs = async function (batData, safeTitle) {\r\n    if (!batData || !Array.isArray(batData.entries) || !batData.entries.length) return;\r\n    const jsPdfLib = window.jspdf && window.jspdf.jsPDF ? window.jspdf.jsPDF : null;\r\n    if (!jsPdfLib || !this.canvasEngine) return;\r\n\r\n    for (const entry of batData.entries) {\r\n      const rect = entry.croppedRect || entry.objectRect;\r\n      if (!rect) continue;\r\n      const targetWidthMm = Math.max(8, Number((entry.croppedWidthCm || entry.objectWidthCm || 0) * 10) || 8);\r\n      const targetHeightMm = Math.max(8, Number((entry.croppedHeightCm || entry.objectHeightCm || 0) * 10) || 8);\r\n      const pageSize = this.computeIndividualPdfPageSizeMm(targetWidthMm, targetHeightMm);\r\n      const isLandscape = pageSize.pageWidth >= pageSize.pageHeight;\r\n      const doc = new jsPdfLib({\r\n        unit: 'mm',\r\n        orientation: isLandscape ? 'landscape' : 'portrait',\r\n        format: [pageSize.pageWidth, pageSize.pageHeight]\r\n      });\r\n      const pageWidth = doc.internal.pageSize.getWidth();\r\n      const pageHeight = doc.internal.pageSize.getHeight();\r\n      doc.setFont('helvetica', 'bold');\r\n      doc.setFontSize(11);\r\n      doc.setTextColor(17, 17, 17);\r\n      doc.text('Personnalisation ' + entry.index, pageSize.margin, 6);\r\n      doc.setFont('helvetica', 'normal');\r\n      doc.setFontSize(8);\r\n      doc.text(entry.view + ' - ' + entry.zoneLabel + ' (' + entry.type + ')', pageSize.margin, 10);\r\n      const globalSizeText =\r\n        'Global: ' +\r\n        this.formatDimensionPx(entry.croppedWidthCm || entry.objectWidthCm || 0) +\r\n        ' x ' +\r\n        this.formatDimensionPx(entry.croppedHeightCm || entry.objectHeightCm || 0);\r\n      doc.text(globalSizeText, pageSize.margin, 13);\r\n\r\n      const renderX = pageSize.margin;\r\n      const renderY = 18;\r\n      const renderW = Math.max(8, pageWidth - pageSize.margin * 2);\r\n      const renderH = Math.max(8, pageHeight - renderY - pageSize.margin);\r\n\r\n      const rawEntries = this.getRawEntriesForGroupedEntry(batData, entry);\r\n      const imageEntries = rawEntries.filter(function (raw) {\r\n        return raw.type === 'Image' && raw.imageSource;\r\n      });\r\n      const textEntries = rawEntries.filter(function (raw) {\r\n        return raw.type === 'Texte' && raw.text;\r\n      });\r\n      const elementDimensionLines = rawEntries\r\n        .map(\r\n          function (raw, idx) {\r\n            const isCrop =\r\n              (Number(raw.croppedWidthCm) || 0) > 0 &&\r\n              (Number(raw.croppedHeightCm) || 0) > 0 &&\r\n              (Math.abs((Number(raw.objectWidthCm) || 0) - (Number(raw.croppedWidthCm) || 0)) > 0.05 ||\r\n                Math.abs((Number(raw.objectHeightCm) || 0) - (Number(raw.croppedHeightCm) || 0)) > 0.05);\r\n            const w = isCrop ? Number(raw.croppedWidthCm) || 0 : Number(raw.objectWidthCm) || 0;\r\n            const h = isCrop ? Number(raw.croppedHeightCm) || 0 : Number(raw.objectHeightCm) || 0;\r\n            const label = raw.type === 'Texte' ? 'Texte' : 'Image';\r\n            return (\r\n              label +\r\n              ' ' +\r\n              String(idx + 1) +\r\n              ': ' +\r\n              this.formatDimensionPx(w) +\r\n              ' x ' +\r\n              this.formatDimensionPx(h) +\r\n              (isCrop ? ' (crop)' : '')\r\n            );\r\n          }.bind(this)\r\n        )\r\n        .filter(Boolean);\r\n      if (elementDimensionLines.length) {\r\n        const lineText = 'Elements: ' + elementDimensionLines.join(' | ');\r\n        const wrapped = doc.splitTextToSize(lineText, Math.max(20, pageWidth - pageSize.margin * 2));\r\n        doc.text(wrapped.slice(0, 2), pageSize.margin, Math.min(pageHeight - pageSize.margin - 2, 16.5));\r\n      }\r\n\r\n      let rendered = false;\r\n\r\n      if (imageEntries.length === 1 && !textEntries.length) {\r\n        try {\r\n          const source = await this.buildVisibleImageDataUrl(imageEntries[0]);\r\n          if (source) {\r\n            const ext = source.indexOf('image/jpeg') !== -1 || source.indexOf('image/jpg') !== -1 ? 'JPEG' : 'PNG';\r\n            doc.addImage(source, ext, renderX, renderY, renderW, renderH, undefined, 'NONE');\r\n            rendered = true;\r\n          }\r\n        } catch (error) {\r\n          rendered = false;\r\n        }\r\n      }\r\n\r\n      if (!rendered) {\r\n        let designOnlyPreview = '';\r\n        if (typeof this.canvasEngine.getDesignOnlyPreviewDataURL === 'function') {\r\n          designOnlyPreview = this.canvasEngine.getDesignOnlyPreviewDataURL({\r\n            view: entry.viewKey,\r\n            zoneId: entry.zoneId,\r\n            multiplier: 6\r\n          });\r\n        }\r\n        if (designOnlyPreview) {\r\n          try {\r\n            const croppedDesign = await this.cropDataUrlByRect(designOnlyPreview, rect, {\r\n              outputWidth: 1800,\r\n              outputHeight: 1400,\r\n              paddingRatio: 0,\r\n              scale: 6,\r\n              transparentBackground: true,\r\n              matchCropAspect: true\r\n            });\r\n            if (croppedDesign) {\r\n              doc.addImage(croppedDesign, 'PNG', renderX, renderY, renderW, renderH, undefined, 'NONE');\r\n            }\r\n          } catch (error) {\r\n            // Keep empty output if rendering fails.\r\n          }\r\n        }\r\n      }\r\n\r\n      const name =\r\n        'bat-' +\r\n        String(safeTitle || 'produit') +\r\n        '-' +\r\n        String(entry.viewKey || 'view') +\r\n        '-' +\r\n        String(entry.zoneId || ('zone-' + String(entry.index)))\r\n          .toLowerCase()\r\n          .replace(/[^a-z0-9-]+/g, '-') +\r\n        '.pdf';\r\n      doc.save(name);\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getExpectedPanelObjectKind = function () {\r\n    if (this.activeControlsPanel === 'text') return 'text';\r\n    if (this.activeControlsPanel === 'qr') return 'qr';\r\n    if (this.activeControlsPanel === 'image') return 'image';\r\n    if (this.activeControlsPanel === 'background') return 'background';\r\n    return '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getActiveDesignObjectKind = function () {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getActiveDesignObject !== 'function') return '';\r\n    const object = this.canvasEngine.getActiveDesignObject();\r\n    if (!object) return '';\r\n    if (String(object.personalizerKind || '').toLowerCase() === 'background') return 'background';\r\n    if (String(object.personalizerKind || '').toLowerCase() === 'qr') return 'qr';\r\n    const type = String(object.type || '').toLowerCase();\r\n    if (type === 'i-text' || type === 'text' || type === 'textbox') return 'text';\r\n    if (type === 'image') return 'image';\r\n    return 'design';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSelectedObjectKind = function (object) {\r\n    if (!object) return '';\r\n    if (String(object.personalizerKind || '').toLowerCase() === 'background') return 'background';\r\n    if (String(object.personalizerKind || '').toLowerCase() === 'qr') return 'qr';\r\n    const type = String(object.type || '').toLowerCase();\r\n    if (type === 'i-text' || type === 'text' || type === 'textbox') return 'text';\r\n    if (type === 'image') return 'image';\r\n    return 'design';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSelectedObjectForKind = function (kind) {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getActiveDesignObject !== 'function') return null;\r\n    const activeObject = this.canvasEngine.getActiveDesignObject();\r\n    const fallbackObject = this.selectedDesignObject;\r\n    const object = activeObject || fallbackObject;\r\n    if (!object) return null;\r\n    if (!object.canvas) return null;\r\n\r\n    const objectKind = this.getSelectedObjectKind(object);\r\n    if (kind && objectKind !== kind) return null;\r\n    return object;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPanelObjectForKind = function (kind) {\r\n    const normalizedKind = String(kind || '').toLowerCase();\r\n    const direct = this.getSelectedObjectForKind(normalizedKind);\r\n    if (direct) return direct;\r\n\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return null;\r\n    const objects = this.getUsedDesignObjectsForView(this.activeView);\r\n    for (let index = objects.length - 1; index >= 0; index -= 1) {\r\n      const candidate = objects[index];\r\n      if (!candidate || !candidate.canvas) continue;\r\n      if (!normalizedKind || this.getSelectedObjectKind(candidate) === normalizedKind) {\r\n        return candidate;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getViewObjectForKind = function (view, kind, preferredZoneId) {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return null;\r\n\r\n    const normalizedView = normalizeViewId(view);\r\n    const normalizedKind = String(kind || '').toLowerCase();\r\n    const preferredZoneKey = String(preferredZoneId || '');\r\n    const objects = this.canvasEngine.getDesignObjects({ view: normalizedView });\r\n\r\n    if (!objects.length) return null;\r\n\r\n    for (let index = objects.length - 1; index >= 0; index -= 1) {\r\n      const candidate = objects[index];\r\n      if (!candidate || !candidate.canvas) continue;\r\n      if (normalizedKind && this.getSelectedObjectKind(candidate) !== normalizedKind) continue;\r\n      if (preferredZoneKey && String(candidate.zoneId || '') !== preferredZoneKey) continue;\r\n      return candidate;\r\n    }\r\n\r\n    for (let index = objects.length - 1; index >= 0; index -= 1) {\r\n      const candidate = objects[index];\r\n      if (!candidate || !candidate.canvas) continue;\r\n      if (!normalizedKind || this.getSelectedObjectKind(candidate) === normalizedKind) {\r\n        return candidate;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncTextPanelInputFromSelection = function () {\r\n    if (!this.modal) return;\r\n    const textObject = this.getSelectedObjectForKind('text');\r\n    const input = this.modal.querySelector('[data-text-panel-input]');\r\n    if (!input) return;\r\n    const nextTextValue = textObject && typeof textObject.text === 'string' ? textObject.text : '';\r\n    if (input.value !== nextTextValue) {\r\n      input.value = nextTextValue;\r\n    }\r\n\r\n    const colorSelect = this.modal.querySelector('[data-text-panel-color]');\r\n    if (colorSelect) {\r\n      const colorOptions = Array.from(colorSelect.options || [])\r\n        .map(function (option) {\r\n          return String(option.value || '').trim();\r\n        })\r\n        .filter(Boolean);\r\n      const normalizeColorToOption = function (value) {\r\n        if (!colorOptions.length) return '#111111';\r\n        const fallback = colorOptions.includes('#111111') ? '#111111' : colorOptions[0];\r\n        const normalized = this.normalizeCssColorValue(value);\r\n        if (!normalized) return fallback;\r\n\r\n        const exact = colorOptions.find(function (optionValue) {\r\n          return String(optionValue).toLowerCase() === String(normalized).toLowerCase();\r\n        });\r\n        if (exact) return exact;\r\n\r\n        const sourceChannels = this.getColorRgbChannels(normalized);\r\n        if (!sourceChannels) return fallback;\r\n\r\n        let bestOption = fallback;\r\n        let bestDistance = Number.POSITIVE_INFINITY;\r\n        colorOptions.forEach(\r\n          function (optionValue) {\r\n            const optionChannels = this.getColorRgbChannels(optionValue);\r\n            if (!optionChannels) return;\r\n            const distance =\r\n              Math.abs(sourceChannels.r - optionChannels.r) +\r\n              Math.abs(sourceChannels.g - optionChannels.g) +\r\n              Math.abs(sourceChannels.b - optionChannels.b);\r\n            if (distance < bestDistance) {\r\n              bestDistance = distance;\r\n              bestOption = optionValue;\r\n            }\r\n          }.bind(this)\r\n        );\r\n        return bestOption;\r\n      }.bind(this);\r\n\r\n      const baseFill =\r\n        textObject && textObject._personalizerBaseStyle && textObject._personalizerBaseStyle.fill\r\n          ? textObject._personalizerBaseStyle.fill\r\n          : textObject && textObject.fill\r\n            ? textObject.fill\r\n            : '#111111';\r\n      const nextColor = normalizeColorToOption(baseFill);\r\n      colorSelect.value = nextColor;\r\n      colorSelect.classList.toggle('personalizer-controls__input--light', String(nextColor).toLowerCase() === '#ffffff');\r\n    }\r\n\r\n    const fontSelect = this.modal.querySelector('[data-text-panel-font]');\r\n    if (fontSelect) {\r\n      const nextFont = textObject && textObject.fontFamily ? String(textObject.fontFamily) : 'Rubik';\r\n      const exists = Array.from(fontSelect.options).some(function (option) {\r\n        return String(option.value) === nextFont;\r\n      });\r\n      if (exists) fontSelect.value = nextFont;\r\n    }\r\n\r\n    const sizeRange = this.modal.querySelector('[data-text-panel-size]');\r\n    if (sizeRange) {\r\n      const nextSize = textObject && Number(textObject.fontSize) > 0 ? Math.round(Number(textObject.fontSize)) : 34;\r\n      sizeRange.value = String(nextSize);\r\n    }\r\n\r\n    this.renderTextPanelLiveSize(textObject);\r\n    this.syncTextPanelStyleToggleUi(textObject);\r\n    this.syncMobileTextSelectOptions();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.handleDirectTypingForSelectedText = function (event) {\r\n    if (!event || event.defaultPrevented) return false;\r\n    if (event.ctrlKey || event.metaKey || event.altKey) return false;\r\n    const textObject = this.getSelectedObjectForKind('text');\r\n    if (!textObject) return false;\r\n\r\n    const input = this.modal ? this.modal.querySelector('[data-text-panel-input]') : null;\r\n    if (!input) return false;\r\n\r\n    let nextValue = null;\r\n    const currentValue = String(typeof textObject.text === 'string' ? textObject.text : input.value || '');\r\n\r\n    if (event.key === 'Backspace') {\r\n      nextValue = currentValue.slice(0, -1);\r\n    } else if (event.key === 'Delete') {\r\n      nextValue = currentValue.slice(0, -1);\r\n    } else if (event.key === 'Enter') {\r\n      nextValue = currentValue + '\\n';\r\n    } else if (typeof event.key === 'string' && event.key.length === 1) {\r\n      nextValue = currentValue + event.key;\r\n    } else {\r\n      return false;\r\n    }\r\n\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n\r\n    if (this.activeControlsPanel !== 'text') {\r\n      this.setControlsPanel('text');\r\n    }\r\n\r\n    input.value = nextValue;\r\n    this.updateSelectedTextFromPanel(nextValue);\r\n\r\n    try {\r\n      input.focus({ preventScroll: true });\r\n    } catch (error) {\r\n      input.focus();\r\n    }\r\n    if (typeof input.setSelectionRange === 'function') {\r\n      const cursor = nextValue.length;\r\n      input.setSelectionRange(cursor, cursor);\r\n    }\r\n    return true;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getSelectedTextObjectSizeLabel = function (textObject) {\r\n    if (!textObject || !this.canvasEngine) return '-';\r\n    if (typeof this.canvasEngine.getDesignObjectDimensions !== 'function') return '-';\r\n    if (typeof this.canvasEngine.getActiveZoneDimensions !== 'function') return '-';\r\n\r\n    const objectDimensions = this.canvasEngine.getDesignObjectDimensions(textObject);\r\n    const zoneDimensions = this.canvasEngine.getActiveZoneDimensions();\r\n    const zoneWidthCm = this.selectedZone && Number(this.selectedZone.widthCm) > 0 ? Number(this.selectedZone.widthCm) : 0;\r\n    const zoneHeightCm = this.selectedZone && Number(this.selectedZone.heightCm) > 0 ? Number(this.selectedZone.heightCm) : 0;\r\n    if (!objectDimensions || !zoneDimensions || !zoneWidthCm || !zoneHeightCm) return '-';\r\n    if (Number(zoneDimensions.width) <= 0 || Number(zoneDimensions.height) <= 0) return '-';\r\n\r\n    const widthCm = (Number(objectDimensions.width) / Number(zoneDimensions.width)) * zoneWidthCm;\r\n    const heightCm = (Number(objectDimensions.height) / Number(zoneDimensions.height)) * zoneHeightCm;\r\n    return this.formatDimensionPair(Math.max(0.1, widthCm), Math.max(0.1, heightCm));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderTextPanelLiveSize = function (textObject) {\r\n    if (!this.modal) return;\r\n    const valueNode = this.modal.querySelector('[data-text-panel-size-value]');\r\n    const valueNodeMobile = this.modal.querySelector('[data-text-panel-size-value-mobile]');\r\n    const label = this.getSelectedTextObjectSizeLabel(textObject);\r\n    if (valueNode) valueNode.textContent = label;\r\n    if (valueNodeMobile) valueNodeMobile.textContent = label;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncTextPanelStyleToggleUi = function (textObject) {\r\n    if (!this.modal) return;\r\n    const boldButton = this.modal.querySelector('[data-action=\"text-toggle-bold\"]');\r\n    const italicButton = this.modal.querySelector('[data-action=\"text-toggle-italic\"]');\r\n    const underlineButton = this.modal.querySelector('[data-action=\"text-toggle-underline\"]');\r\n\r\n    const isBold = !!(textObject && String(textObject.fontWeight || '').toLowerCase() === 'bold');\r\n    const isItalic = !!(textObject && String(textObject.fontStyle || '').toLowerCase() === 'italic');\r\n    const isUnderline = !!(textObject && textObject.underline === true);\r\n\r\n    if (boldButton) {\r\n      boldButton.classList.toggle('is-active', isBold);\r\n      boldButton.setAttribute('aria-pressed', isBold ? 'true' : 'false');\r\n    }\r\n    if (italicButton) {\r\n      italicButton.classList.toggle('is-active', isItalic);\r\n      italicButton.setAttribute('aria-pressed', isItalic ? 'true' : 'false');\r\n    }\r\n    if (underlineButton) {\r\n      underlineButton.classList.toggle('is-active', isUnderline);\r\n      underlineButton.setAttribute('aria-pressed', isUnderline ? 'true' : 'false');\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.toggleSelectedTextStyleFromPanel = function (styleKey) {\r\n    const textObject = this.getSelectedObjectForKind('text');\r\n    if (!textObject) return;\r\n\r\n    if (styleKey === 'bold') {\r\n      const isBold = String(textObject.fontWeight || '').toLowerCase() === 'bold';\r\n      this.updateSelectedTextStyleFromPanel({ fontWeight: isBold ? 'normal' : 'bold' });\r\n      return;\r\n    }\r\n    if (styleKey === 'italic') {\r\n      const isItalic = String(textObject.fontStyle || '').toLowerCase() === 'italic';\r\n      this.updateSelectedTextStyleFromPanel({ fontStyle: isItalic ? 'normal' : 'italic' });\r\n      return;\r\n    }\r\n    if (styleKey === 'underline') {\r\n      this.updateSelectedTextStyleFromPanel({ underline: !(textObject.underline === true) });\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.centerSelectedPanelObjectInZone = function (kind, axis) {\r\n    const object = this.getPanelObjectForKind(kind || '');\r\n    if (!object || !this.canvasEngine || typeof this.canvasEngine.centerObjectInZone !== 'function') return;\r\n    const centered = this.canvasEngine.centerObjectInZone(object, axis);\r\n    if (centered) {\r\n      const objectKind = this.getSelectedObjectKind(object);\r\n      this.selectedDesignObject = object;\r\n      this.selectedDesignKind = objectKind;\r\n      if (objectKind === 'text') {\r\n        this.syncTextPanelInputFromSelection();\r\n      }\r\n      this.syncDimensionsToolUi();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.rotateSelectedPanelObjectFromPanel = function (kind, deltaDegrees) {\r\n    const object = this.getPanelObjectForKind(kind || '');\r\n    if (!object || !this.canvasEngine || typeof this.canvasEngine.rotateDesignObject !== 'function') return;\r\n    const rotated = this.canvasEngine.rotateDesignObject(object, deltaDegrees);\r\n    if (rotated) {\r\n      const objectKind = this.getSelectedObjectKind(object);\r\n      this.selectedDesignObject = object;\r\n      this.selectedDesignKind = objectKind;\r\n      if (objectKind === 'text') {\r\n        this.syncTextPanelInputFromSelection();\r\n      }\r\n      this.syncDimensionsToolUi();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.centerSelectedTextInZone = function (axis) {\r\n    this.centerSelectedPanelObjectInZone('text', axis);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.rotateSelectedTextFromPanel = function (deltaDegrees) {\r\n    this.rotateSelectedPanelObjectFromPanel('text', deltaDegrees);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.duplicateSelectedObjectFromPanel = function () {\r\n    const sourceObject = this.getSelectedObjectForKind('');\r\n    if (!sourceObject || !this.canvasEngine || typeof this.canvasEngine.duplicateDesignObject !== 'function') return;\r\n\r\n    this.canvasEngine\r\n      .duplicateDesignObject(sourceObject)\r\n      .then(\r\n        function (clone) {\r\n          if (!clone) return;\r\n          this.selectedDesignObject = clone;\r\n          this.selectedDesignKind = this.getSelectedObjectKind(clone);\r\n          if (this.selectedDesignKind === 'text') {\r\n            this.setControlsPanel('text');\r\n            this.syncTextPanelInputFromSelection();\r\n          } else if (this.selectedDesignKind === 'qr') {\r\n            this.setControlsPanel('qr');\r\n            this.syncQrPanelInputFromSelection();\r\n          } else if (this.selectedDesignKind === 'image') {\r\n            this.setControlsPanel('image');\r\n          }\r\n          this.syncDimensionsToolUi();\r\n        }.bind(this)\r\n      )\r\n      .catch(function () {\r\n        // Ignore duplication failures.\r\n      });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.ensureTextObjectForPanel = function () {\n    if (!this.isToolAllowedForCurrentView('text')) return;\r\n    if (!this.canvasEngine || typeof this.canvasEngine.addText !== 'function') return;\r\n    if (!this.modal) return;\r\n\r\n    const existingTextObject = this.getSelectedObjectForKind('text');\n    if (existingTextObject) {\r\n      this.syncTextPanelInputFromSelection();\r\n      return;\n    }\n    const placement = this.getCurrentUserPlacement();\n    if (!this.canCreateInZone(placement.zoneId)) return;\n\n    const input = this.modal.querySelector('[data-text-panel-input]');\n    const value = input ? input.value.trim() : '';\n    const newTextObject = this.canvasEngine.addText(value || 'Votre texte', placement);\r\n    if (newTextObject) {\n      this.selectedDesignObject = newTextObject;\n      this.selectedDesignKind = 'text';\n      if (this.usesSharedMarkingColor()) this.applySharedMarkingColor(this.sharedMarkingColor);\n      this.syncTextPanelInputFromSelection();\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.startNewTextFromPanel = function () {\n    if (!this.isToolAllowedForCurrentView('text')) return;\n    if (!this.canvasEngine || typeof this.canvasEngine.addText !== 'function') return;\r\n    if (!this.modal) return;\r\n\r\n    const placement = this.getCurrentUserPlacement();\n    if (!this.canCreateInZone(placement.zoneId)) return;\n    if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\n      this.canvasEngine.clearSelection();\r\n    }\r\n\r\n    this.selectedDesignObject = null;\r\n    this.selectedDesignKind = '';\r\n\r\n    const input = this.modal.querySelector('[data-text-panel-input]');\r\n    if (input) input.value = '';\r\n\r\n    const newTextObject = this.canvasEngine.addText('Votre texte', placement);\n    if (!newTextObject) return;\r\n\r\n    this.selectedDesignObject = newTextObject;\n    this.selectedDesignKind = 'text';\n    if (this.usesSharedMarkingColor()) this.applySharedMarkingColor(this.sharedMarkingColor);\n    this.syncTextPanelInputFromSelection();\n  };\r\n\r\n  PersonalizerModalApp.prototype.updateSelectedTextFromPanel = function (value) {\r\n    if (!this.canvasEngine || typeof this.canvasEngine.updateTextObjectValue !== 'function') return;\r\n    const textObject = this.getSelectedObjectForKind('text');\r\n    if (!textObject) return;\r\n\r\n    const updated = this.canvasEngine.updateTextObjectValue(textObject, value);\r\n    if (updated) {\r\n      this.selectedDesignObject = textObject;\r\n      this.selectedDesignKind = 'text';\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.updateSelectedTextStyleFromPanel = function (style) {\n    if (!this.canvasEngine || typeof this.canvasEngine.updateTextObjectStyle !== 'function') return;\n    const textObject = this.getSelectedObjectForKind('text');\n    if (!textObject) return;\n\n    const nextStyle = Object.assign({}, style || {});\n    if (nextStyle.fill !== undefined && nextStyle.fill !== null && nextStyle.fill !== '') {\n      nextStyle.fill = this.resolveCanvasRenderColor(nextStyle.fill);\n    }\n\n    const updated = this.canvasEngine.updateTextObjectStyle(textObject, nextStyle);\n    if (updated) {\r\n      this.selectedDesignObject = textObject;\r\n      this.selectedDesignKind = 'text';\r\n      this.syncTextPanelInputFromSelection();\r\n      this.syncDimensionsToolUi();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getQrDefaultValue = function () {\n    return 'https://ag-orion.com/';\n  };\n\n  PersonalizerModalApp.prototype.resolveCanvasRenderColor = function (value) {\n    const raw = String(value || '').trim();\n    if (!raw) return '#111111';\n\n    const cssVariableMatch = raw.match(/^var\\(\\s*(--[^,\\s)]+)(?:\\s*,\\s*([^\\)]+))?\\s*\\)$/);\n    if (cssVariableMatch && typeof window.getComputedStyle === 'function') {\n      const variableName = cssVariableMatch[1];\n      const fallback = String(cssVariableMatch[2] || '').trim();\n      const scopes = [this.modal, document.documentElement].filter(Boolean);\n      for (let index = 0; index < scopes.length; index += 1) {\n        const resolved = String(window.getComputedStyle(scopes[index]).getPropertyValue(variableName) || '').trim();\n        if (resolved) return this.normalizeCssColorValue(resolved) || resolved;\n      }\n      if (fallback) return this.normalizeCssColorValue(fallback) || fallback;\n      return '#111111';\n    }\n\n    return this.normalizeCssColorValue(raw) || '#111111';\n  };\n\n  PersonalizerModalApp.prototype.generateQrCodeDataUrl = function (value, color) {\n    const textValue = String(value || '').trim();\n    const fillColor = this.resolveCanvasRenderColor(color);\n\r\n    return new Promise(function (resolve) {\r\n      if (!textValue || typeof QRCode === 'undefined') {\r\n        resolve('');\r\n        return;\r\n      }\r\n\r\n      try {\r\n        const mount = document.createElement('div');\r\n        mount.style.position = 'fixed';\r\n        mount.style.left = '-9999px';\r\n        mount.style.top = '-9999px';\r\n        mount.style.width = '256px';\r\n        mount.style.height = '256px';\r\n        mount.style.pointerEvents = 'none';\r\n        mount.style.opacity = '0';\r\n        document.body.appendChild(mount);\r\n\r\n        const qrCode = new QRCode(mount, {\r\n          text: textValue,\r\n          width: 256,\r\n          height: 256,\r\n          colorDark: fillColor,\r\n          colorLight: '#0000',\r\n          correctLevel: QRCode.CorrectLevel ? QRCode.CorrectLevel.H : undefined\r\n        });\r\n\r\n        const maxAttempts = 6;\r\n        let attempt = 0;\r\n\r\n        const cleanup = function () {\r\n          if (qrCode && typeof qrCode.clear === 'function') qrCode.clear();\r\n          mount.remove();\r\n        };\r\n\r\n        const resolveFromRenderedNode = function () {\r\n          try {\r\n            const canvas = mount.querySelector('canvas');\r\n            if (canvas && typeof canvas.toDataURL === 'function') {\r\n              resolve(canvas.toDataURL('image/png'));\r\n              cleanup();\r\n              return true;\r\n            }\r\n\r\n            const image = mount.querySelector('img');\r\n            const imageSource = image ? String(image.currentSrc || image.src || '').trim() : '';\r\n            if (imageSource) {\r\n              resolve(imageSource);\r\n              cleanup();\r\n              return true;\r\n            }\r\n          } catch (_error) {\r\n            resolve('');\r\n            cleanup();\r\n            return true;\r\n          }\r\n          return false;\r\n        };\r\n\r\n        const waitForRender = function () {\r\n          attempt += 1;\r\n          if (resolveFromRenderedNode()) return;\r\n          if (attempt >= maxAttempts) {\r\n            resolve('');\r\n            cleanup();\r\n            return;\r\n          }\r\n          window.setTimeout(waitForRender, 40);\r\n        };\r\n\r\n        window.setTimeout(waitForRender, 20);\r\n      } catch (_error) {\r\n        resolve('');\r\n      }\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncQrPanelInputFromSelection = function () {\r\n    if (!this.modal) return;\r\n    const qrObject = this.getSelectedObjectForKind('qr');\r\n    const input = this.modal.querySelector('[data-qr-panel-input]');\r\n    const colorSelect = this.modal.querySelector('[data-qr-panel-color]');\r\n\r\n    if (input) {\r\n      const nextValue =\r\n        qrObject && !qrObject.personalizerQrUsesDefaultValue && qrObject.personalizerQrValue\r\n          ? String(qrObject.personalizerQrValue)\r\n          : '';\r\n      if (input.value !== nextValue) input.value = nextValue;\r\n    }\r\n\r\n    if (colorSelect) {\r\n      const nextColor = qrObject && qrObject.personalizerQrColor ? String(qrObject.personalizerQrColor) : '#111111';\r\n      colorSelect.value = nextColor;\r\n      colorSelect.classList.toggle('personalizer-controls__input--light', String(nextColor).toLowerCase() === '#ffffff');\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.ensureQrObjectForPanel = function () {\r\n    if (!this.isToolAllowedForCurrentView('qr')) return Promise.resolve(null);\r\n    if (this.getSelectedObjectForKind('qr')) {\r\n      this.syncQrPanelInputFromSelection();\r\n      return Promise.resolve(this.getSelectedObjectForKind('qr'));\r\n    }\r\n    return this.startNewQrFromPanel();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.startNewQrFromPanel = function () {\n    if (!this.canvasEngine || typeof this.canvasEngine.addQrCode !== 'function' || !this.modal) {\n      return Promise.resolve(null);\r\n    }\r\n\r\n    const placement = this.getCurrentUserPlacement();\n    if (!this.canCreateInZone(placement.zoneId)) return Promise.resolve(null);\n    if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\n      this.canvasEngine.clearSelection();\r\n    }\r\n\r\n    this.selectedDesignObject = null;\r\n    this.selectedDesignKind = '';\r\n\r\n    const input = this.modal.querySelector('[data-qr-panel-input]');\r\n    const colorSelect = this.modal.querySelector('[data-qr-panel-color]');\r\n    const value = input ? String(input.value || '').trim() : '';\r\n    const color = this.usesSharedMarkingColor()\n      ? String(this.sharedMarkingColor || '#111111')\n      : colorSelect ? String(colorSelect.value || '#111111') : '#111111';\n    const defaultValue = this.getQrDefaultValue();\r\n    const usesDefaultValue = !value && !!defaultValue;\r\n    const nextValue = value || defaultValue;\r\n    if (!nextValue) {\r\n      this.syncQrPanelInputFromSelection();\r\n      return Promise.resolve(null);\r\n    }\r\n\r\n    return this.generateQrCodeDataUrl(nextValue, color).then(function (dataUrl) {\n      if (!dataUrl) return null;\r\n      return this.canvasEngine.addQrCode(dataUrl, {\r\n        value: nextValue,\r\n        color: color,\r\n        usesDefaultValue: usesDefaultValue,\r\n        placement: placement\r\n      }).then(function (newQrObject) {\r\n        if (!newQrObject) return null;\r\n        this.selectedDesignObject = newQrObject;\r\n        this.selectedDesignKind = 'qr';\r\n        this.syncQrPanelInputFromSelection();\r\n        return newQrObject;\r\n      }.bind(this));\r\n    }.bind(this));\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.scheduleQrObjectRefresh = function (value, color, options) {\r\n    if (this.qrUpdateTimer) {\r\n      window.clearTimeout(this.qrUpdateTimer);\r\n      this.qrUpdateTimer = 0;\r\n    }\r\n\r\n    const settings = options || {};\r\n    const nextValue = String(value || '').trim();\r\n    const nextColor = String(color || '#111111') || '#111111';\r\n    const usesDefaultValue = !!settings.usesDefaultValue;\r\n    const nonce = ++this.qrRenderNonce;\r\n\r\n    this.qrUpdateTimer = window.setTimeout(function () {\r\n      this.qrUpdateTimer = 0;\r\n      const qrObject = this.getSelectedObjectForKind('qr');\r\n      if (!qrObject || !this.canvasEngine || typeof this.canvasEngine.updateQrCodeObject !== 'function') return;\r\n\r\n      this.generateQrCodeDataUrl(nextValue, nextColor).then(function (dataUrl) {\r\n        if (nonce !== this.qrRenderNonce || !dataUrl) return;\r\n        this.canvasEngine.updateQrCodeObject(qrObject, dataUrl, {\r\n          value: nextValue,\r\n          color: nextColor,\r\n          usesDefaultValue: usesDefaultValue\r\n        }).then(function (updated) {\r\n          if (!updated) return;\r\n          this.selectedDesignObject = qrObject;\r\n          this.selectedDesignKind = 'qr';\r\n          this.syncQrPanelInputFromSelection();\r\n          this.syncDimensionsToolUi();\r\n        }.bind(this));\r\n      }.bind(this));\r\n    }.bind(this), 120);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.updateSelectedQrFromPanel = function (value) {\r\n    const qrObject = this.getSelectedObjectForKind('qr');\r\n    if (!qrObject) {\r\n      if (!String(value || '').trim()) return;\r\n      this.startNewQrFromPanel().then(function (created) {\r\n        if (created) this.updateSelectedQrFromPanel(value);\r\n      }.bind(this));\r\n      return;\r\n    }\r\n    const colorSelect = this.modal ? this.modal.querySelector('[data-qr-panel-color]') : null;\r\n    const nextColor = colorSelect ? String(colorSelect.value || '#111111') : '#111111';\r\n    const typedValue = String(value || '').trim();\r\n    const defaultValue = this.getQrDefaultValue();\r\n    const usesDefaultValue = !typedValue && !!defaultValue;\r\n    this.scheduleQrObjectRefresh(typedValue || defaultValue, nextColor, { usesDefaultValue: usesDefaultValue });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.updateSelectedQrStyleFromPanel = function (style) {\r\n    const qrObject = this.getSelectedObjectForKind('qr');\r\n    if (!qrObject || !this.modal) return;\r\n    const input = this.modal.querySelector('[data-qr-panel-input]');\r\n    const nextValue = input ? String(input.value || '').trim() : '';\r\n    const nextColor =\r\n      style && style.fill !== undefined && style.fill !== null && style.fill !== ''\r\n        ? String(style.fill)\r\n        : String(qrObject.personalizerQrColor || '#111111');\r\n    const typedValue = String(nextValue || '').trim();\r\n    const defaultValue = this.getQrDefaultValue();\r\n    const usesDefaultValue = !typedValue && !!defaultValue;\r\n    this.scheduleQrObjectRefresh(typedValue || defaultValue, nextColor, { usesDefaultValue: usesDefaultValue });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.clearSelectionForPanelSwitch = function () {\r\n    const previousApplyingFlag = this.isApplyingPlacement;\r\n    this.isApplyingPlacement = true;\r\n    if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\r\n      this.canvasEngine.clearSelection();\r\n    }\r\n    this.isApplyingPlacement = previousApplyingFlag;\r\n    this.selectedDesignObject = null;\r\n    this.selectedDesignKind = '';\r\n    this.syncTextPanelInputFromSelection();\r\n    this.syncQrPanelInputFromSelection();\r\n    this.syncDimensionsToolUi();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.prepareNewImageFromPanel = function () {\n    if (!this.modal) return;\n    this.pendingUserPlacement = this.getCurrentUserPlacement();\n    if (!this.canCreateInZone(this.pendingUserPlacement.zoneId)) {\n      this.pendingUserPlacement = null;\n      return;\n    }\n    this.setControlsPanel('image');\r\n    this.renderRecentUploadedImages();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getCurrentUserPlacement = function () {\r\n    const zones = this.getAvailableZonesForCurrentView();\r\n    const selectedZone = this.selectedZone && zones.some(function (zone) {\r\n      return zone.id === this.selectedZone.id && normalizeViewId(zone.view) === normalizeViewId(this.selectedZone.view);\r\n    }.bind(this)) ? this.selectedZone : (zones[0] || null);\r\n    const physicalViews = this.getPhysicalViewIdsForView(this.activeView);\r\n    const view = selectedZone && physicalViews.indexOf(normalizeViewId(selectedZone.view)) >= 0\r\n      ? normalizeViewId(selectedZone.view)\r\n      : normalizeViewId(physicalViews[0] || this.activeView);\r\n    return {\r\n      navigationViewId: normalizeViewId(this.activeView),\r\n      targetPhysicalViewId: view,\r\n      view: view,\r\n      zoneId: selectedZone ? selectedZone.id : '',\r\n      zone: selectedZone\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getRecentUploadedImages = function () {\r\n    try {\r\n      const raw = window.localStorage ? window.localStorage.getItem(RECENT_UPLOADED_IMAGES_KEY) : '';\r\n      const parsed = raw ? JSON.parse(raw) : [];\r\n      if (!Array.isArray(parsed)) return [];\r\n      return parsed\r\n        .filter(function (item) {\r\n          return item && typeof item.sourceDataUrl === 'string' && item.sourceDataUrl.indexOf('data:image/') === 0;\r\n        })\r\n        .slice(0, 8);\r\n    } catch (error) {\r\n      return [];\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.setRecentUploadedImages = function (items) {\r\n    this.recentUploadedImages = Array.isArray(items) ? items.slice(0, 8) : [];\r\n    try {\r\n      if (window.localStorage) {\r\n        window.localStorage.setItem(RECENT_UPLOADED_IMAGES_KEY, JSON.stringify(this.recentUploadedImages));\r\n      }\r\n    } catch (error) {\r\n      this.recentUploadedImages = this.recentUploadedImages.slice(0, Math.min(3, this.recentUploadedImages.length));\r\n      try {\r\n        if (window.localStorage) {\r\n          window.localStorage.setItem(RECENT_UPLOADED_IMAGES_KEY, JSON.stringify(this.recentUploadedImages));\r\n        }\r\n      } catch (storageError) {}\r\n    }\r\n    this.renderRecentUploadedImages();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.rememberUploadedImage = function (result, file) {\r\n    if (!result || !result.sourceDataUrl) return;\r\n    const sourceDataUrl = String(result.sourceDataUrl || '');\r\n    if (sourceDataUrl.indexOf('data:image/') !== 0 || sourceDataUrl.length > 950000) return;\r\n\r\n    const item = {\r\n      id: 'img_' + String(Date.now()) + '_' + String(Math.floor(Math.random() * 100000)),\r\n      sourceDataUrl: sourceDataUrl,\r\n      mimeType: String(result.mimeType || (file && file.type) || ''),\r\n      name: String(result.name || (file && file.name) || 'Image'),\r\n      createdAt: Date.now()\r\n    };\r\n    const existing = this.getRecentUploadedImages().filter(function (cached) {\r\n      return cached && cached.sourceDataUrl !== sourceDataUrl;\r\n    });\r\n    existing.unshift(item);\r\n    this.setRecentUploadedImages(existing);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderRecentUploadedImages = function () {\r\n    if (!this.modal) return;\r\n    const self = this;\r\n    const containers = Array.prototype.slice.call(this.modal.querySelectorAll('[data-recent-images-list]'));\r\n    if (!containers.length) return;\r\n    const images = this.getRecentUploadedImages();\r\n    this.recentUploadedImages = images;\r\n\r\n    containers.forEach(function (container) {\r\n      const wrapper = container.closest('[data-recent-images]');\r\n      if (wrapper) wrapper.hidden = !images.length;\r\n      container.innerHTML = images\r\n        .map(function (item) {\r\n          const id = String(item.id || '');\r\n          const name = String(item.name || 'Image');\r\n          const src = String(item.sourceDataUrl || '');\r\n          return (\r\n            '<button type=\"button\" class=\"personalizer-recent-image\" data-action=\"use-recent-image\" data-image-id=\"' +\r\n            self.escapeHtml(id) +\r\n            '\" title=\"' +\r\n            self.escapeHtml(name) +\r\n            '\">' +\r\n            '<img src=\"' +\r\n            self.escapeHtml(src) +\r\n            '\" alt=\"\">' +\r\n            '</button>'\r\n          );\r\n        })\r\n        .join('');\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.focusInControls = function (selector) {\r\n    if (!this.modal || !selector) return;\r\n    const target = this.modal.querySelector(selector);\r\n    if (!target) return;\r\n    if (typeof target.scrollIntoView === 'function') {\r\n      target.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\r\n    }\r\n    if (typeof target.focus === 'function') {\r\n      try {\r\n        target.focus({ preventScroll: true });\r\n      } catch (error) {\r\n        target.focus();\r\n      }\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openColorDropdownFromMobile = function () {\r\n    if (!this.modal) return;\r\n    const isMobile = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n    if (isMobile) {\r\n      this.setControlsPanel('default');\r\n      this.openFlyout('product-color');\r\n      this.focusInControls('[data-colors-mobile] [data-color-option][aria-selected=\"true\"]');\r\n      return;\r\n    }\r\n\r\n    const toggle = isMobile\r\n      ? this.modal.querySelector('[data-colors-mobile] [data-color-dropdown-toggle]')\r\n      : this.modal.querySelector('[data-color-dropdown-toggle]');\r\n    if (!toggle) return;\r\n    const dropdown = toggle.closest('[data-color-dropdown]');\r\n    if (!dropdown) return;\r\n\r\n    this.modal.querySelectorAll('[data-color-dropdown].is-open').forEach(function (node) {\r\n      if (node !== dropdown) {\r\n        node.classList.remove('is-open');\r\n        const otherToggle = node.querySelector('[data-color-dropdown-toggle]');\r\n        if (otherToggle) otherToggle.setAttribute('aria-expanded', 'false');\r\n      }\r\n    });\r\n    dropdown.classList.add('is-open');\r\n    toggle.setAttribute('aria-expanded', 'true');\r\n    this.focusInControls(\r\n      isMobile ? '[data-colors-mobile] [data-color-dropdown-toggle]' : '[data-color-dropdown-toggle]'\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openTextInputFlyout = function () {\r\n    if (!this.modal) return;\r\n    const isMobileTextMode = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n    if (isMobileTextMode) {\r\n      if (!this.getSelectedObjectForKind('text')) {\r\n        this.clearSelectionForPanelSwitch();\r\n      }\r\n      this.setControlsPanel('text');\r\n    } else if (this.activeControlsPanel !== 'text') {\r\n      this.clearSelectionForPanelSwitch();\r\n      this.setControlsPanel('text');\r\n      this.startNewTextFromPanel();\r\n    } else {\r\n      this.ensureTextObjectForPanel();\r\n    }\r\n\r\n    this.syncTextPanelInputFromSelection();\r\n    const sourceInput = this.modal.querySelector('[data-text-panel-input]');\r\n    const flyoutInput = this.modal.querySelector('[data-mobile-text-input]');\r\n    if (flyoutInput) {\r\n      flyoutInput.value = sourceInput ? String(sourceInput.value || '') : '';\r\n    }\r\n    this.openFlyout('text-input');\r\n    this.focusInControls('[data-mobile-text-input]');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyTextInputFlyoutValue = function () {\r\n    if (!this.modal) return;\r\n    const flyoutInput = this.modal.querySelector('[data-mobile-text-input]');\r\n    if (!flyoutInput) return;\r\n    const nextValue = String(flyoutInput.value || '');\r\n\r\n    const isMobileTextMode = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n    if (isMobileTextMode) {\r\n      if (!this.getSelectedObjectForKind('text')) {\r\n        this.clearSelectionForPanelSwitch();\r\n        this.startNewTextFromPanel();\r\n      } else {\r\n        this.ensureTextObjectForPanel();\r\n      }\r\n      this.setControlsPanel('text');\r\n    } else if (this.activeControlsPanel !== 'text') {\r\n      this.clearSelectionForPanelSwitch();\r\n      this.setControlsPanel('text');\r\n      this.startNewTextFromPanel();\r\n    } else {\r\n      this.ensureTextObjectForPanel();\r\n    }\r\n\r\n    this.updateSelectedTextFromPanel(nextValue);\r\n    const sourceInput = this.modal.querySelector('[data-text-panel-input]');\r\n    if (sourceInput) sourceInput.value = nextValue;\r\n    this.closeFlyout();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncMobileTextSelectOptions = function () {\r\n    if (!this.modal) return;\r\n    const fontSource = this.modal.querySelector('[data-text-panel-font]');\r\n    const colorSource = this.modal.querySelector('[data-text-panel-color]');\r\n    const mobileFont = this.modal.querySelector('[data-mobile-text-font-select]');\r\n    const mobileColor = this.modal.querySelector('[data-mobile-text-color-select]');\r\n\r\n    if (fontSource && mobileFont) {\r\n      mobileFont.innerHTML = fontSource.innerHTML;\r\n      mobileFont.value = fontSource.value;\r\n    }\r\n    if (colorSource && mobileColor) {\r\n      mobileColor.innerHTML = colorSource.innerHTML;\r\n      mobileColor.value = colorSource.value;\r\n      mobileColor.classList.toggle('personalizer-controls__input--light', String(mobileColor.value || '').toLowerCase() === '#ffffff');\r\n    }\r\n    this.renderMobileTextOptionLists();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderMobileTextOptionLists = function () {\r\n    if (!this.modal) return;\r\n\r\n    const fontSelect = this.modal.querySelector('[data-mobile-text-font-select]');\r\n    const colorSelect = this.modal.querySelector('[data-mobile-text-color-select]');\r\n    const fontContainer = this.modal.querySelector('[data-mobile-text-font-options]');\r\n    const colorContainer = this.modal.querySelector('[data-mobile-text-color-options]');\r\n\r\n    if (fontSelect && fontContainer) {\r\n      const selectedFont = String(fontSelect.value || '');\r\n      fontContainer.innerHTML = Array.from(fontSelect.options || [])\r\n        .map(\r\n          function (option) {\r\n            const value = String(option.value || '');\r\n            const label = String(option.textContent || value || '').trim();\r\n            if (!value) return '';\r\n            const selected = value === selectedFont;\r\n            return (\r\n              '<button type=\"button\" class=\"personalizer-mobile-select-option' +\r\n              (selected ? ' is-selected' : '') +\r\n              '\" data-mobile-select-option data-mobile-select-type=\"text-font\" data-value=\"' +\r\n              this.escapeHtml(value) +\r\n              '\" aria-selected=\"' +\r\n              (selected ? 'true' : 'false') +\r\n              '\">' +\r\n              this.escapeHtml(label) +\r\n              '</button>'\r\n            );\r\n          }.bind(this)\r\n        )\r\n        .join('');\r\n    }\r\n\r\n    if (colorSelect && colorContainer) {\r\n      const selectedColor = String(colorSelect.value || '').toLowerCase();\r\n      colorContainer.innerHTML = Array.from(colorSelect.options || [])\r\n        .map(\r\n          function (option) {\r\n            const value = String(option.value || '');\r\n            const label = String(option.textContent || value || '').trim();\r\n            if (!value) return '';\r\n            const selected = value.toLowerCase() === selectedColor;\r\n            const swatch = this.getColorSwatchHex(label || value);\r\n            const textColor = this.getContrastingTextColor(swatch);\r\n            const isLight = this.isLightColor(swatch);\r\n            return (\r\n              '<button type=\"button\" class=\"personalizer-mobile-select-option personalizer-mobile-select-option--color' +\r\n              (isLight ? ' personalizer-mobile-select-option--light' : '') +\r\n              (selected ? ' is-selected' : '') +\r\n              '\" data-mobile-select-option data-mobile-select-type=\"text-color\" data-value=\"' +\r\n              this.escapeHtml(value) +\r\n              '\" aria-selected=\"' +\r\n              (selected ? 'true' : 'false') +\r\n              '\" style=\"background:' +\r\n              swatch +\r\n              ';color:' +\r\n              textColor +\r\n              ';\">' +\r\n              this.escapeHtml(label) +\r\n              '</button>'\r\n            );\r\n          }.bind(this)\r\n        )\r\n        .join('');\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openTextFontFlyout = function () {\r\n    if (!this.modal) return;\r\n    const isMobileTextMode = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n    if (isMobileTextMode) {\r\n      if (!this.getSelectedObjectForKind('text')) {\r\n        this.clearSelectionForPanelSwitch();\r\n      }\r\n    } else if (!this.getSelectedObjectForKind('text')) {\r\n      this.clearSelectionForPanelSwitch();\r\n      this.startNewTextFromPanel();\r\n    } else {\r\n      this.ensureTextObjectForPanel();\r\n    }\r\n    this.setControlsPanel('text');\r\n    this.syncTextPanelInputFromSelection();\r\n    this.syncMobileTextSelectOptions();\r\n    this.openFlyout('text-font');\r\n    this.focusInControls('[data-mobile-text-font-options]');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openTextColorFlyout = function () {\r\n    if (!this.modal) return;\r\n    const isMobileTextMode = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n    if (isMobileTextMode) {\r\n      if (!this.getSelectedObjectForKind('text')) {\r\n        this.clearSelectionForPanelSwitch();\r\n      }\r\n    } else if (!this.getSelectedObjectForKind('text')) {\r\n      this.clearSelectionForPanelSwitch();\r\n      this.startNewTextFromPanel();\r\n    } else {\r\n      this.ensureTextObjectForPanel();\r\n    }\r\n    this.setControlsPanel('text');\r\n    this.syncTextPanelInputFromSelection();\r\n    this.syncMobileTextSelectOptions();\r\n    this.openFlyout('text-color');\r\n    this.focusInControls('[data-mobile-text-color-options]');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openTextFormatFlyout = function () {\r\n    if (!this.modal) return;\r\n    const isMobileTextMode = window.matchMedia && window.matchMedia('(max-width: 989px)').matches;\r\n    if (isMobileTextMode) {\r\n      if (!this.getSelectedObjectForKind('text')) {\r\n        this.clearSelectionForPanelSwitch();\r\n      }\r\n    } else if (!this.getSelectedObjectForKind('text')) {\r\n      this.clearSelectionForPanelSwitch();\r\n      this.startNewTextFromPanel();\r\n    } else {\r\n      this.ensureTextObjectForPanel();\r\n    }\r\n    this.setControlsPanel('text');\r\n    this.syncTextPanelInputFromSelection();\r\n\r\n    const desktopRange = this.modal.querySelector('[data-text-panel-size]');\r\n    const mobileRange = this.modal.querySelector('[data-mobile-text-size]');\r\n    if (desktopRange && mobileRange) {\r\n      mobileRange.value = desktopRange.value;\r\n    }\r\n\r\n    this.openFlyout('text-format');\r\n    this.focusInControls('[data-mobile-text-size]');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openImageUploadFlyout = function () {\r\n    if (!this.modal) return;\r\n    this.renderRecentUploadedImages();\r\n    if (window.matchMedia && window.matchMedia('(max-width: 989px)').matches) {\r\n      this.setControlsPanel('default');\r\n    }\r\n    this.openFlyout('image-upload');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.openImageAlignFlyout = function () {\r\n    if (!this.modal) return;\r\n    if (!this.getSelectedObjectForKind('image')) return;\r\n    this.setControlsPanel('image');\r\n    this.openFlyout('image-align');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.applyPlacementToActivePanelObject = function () {\r\n    if (!this.canvasEngine || !this.selectedZone) return;\r\n    if (typeof this.canvasEngine.getActiveDesignObject !== 'function') return;\r\n    if (typeof this.canvasEngine.reassignObjectToPlacement !== 'function') return;\r\n\r\n    const expectedKind = this.getExpectedPanelObjectKind();\r\n    if (!expectedKind) return;\r\n\r\n    const object = this.getSelectedObjectForKind(expectedKind);\r\n    if (!object) return;\r\n    if (!this.isZoneAllowedForObject(this.selectedZone.id, this.activeView, object)) return;\r\n    const previousObjectView = object && object.view ? String(object.view).toLowerCase() : this.activeView;\r\n\r\n    const wasApplyingPlacement = this.isApplyingPlacement;\r\n    this.isApplyingPlacement = true;\r\n    const moved = this.canvasEngine.reassignObjectToPlacement(object, this.selectedZone, this.activeView);\r\n    this.isApplyingPlacement = wasApplyingPlacement;\r\n    if (moved) {\r\n      this.selectedDesignObject = object;\r\n      this.selectedDesignKind = expectedKind;\r\n      this.applyActiveZoneToCanvas();\r\n      if (expectedKind === 'text') this.syncTextPanelInputFromSelection();\r\n      if (expectedKind === 'qr') this.syncQrPanelInputFromSelection();\r\n      if (typeof this.canvasEngine.selectDesignObject === 'function') {\r\n        this.canvasEngine.selectDesignObject(object);\r\n      }\r\n      this.renderPanelPlacementControls();\r\n      if (previousObjectView !== this.activeView) {\r\n        this.viewThumbnails[previousObjectView] = '';\r\n        this.viewThumbnailStateKeys[previousObjectView] = '';\r\n      }\r\n      this.scheduleActiveViewThumbnailCapture(90);\r\n      this.syncDimensionsToolUi();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getTechniqueAvailableViews = function () {\r\n    if (this.isPrintMode() && this.printDocument && Array.isArray(this.printDocument.views) && this.printDocument.views.length) {\r\n      return this.printDocument.views.map(function (view) { return normalizeViewId(view.id); });\r\n    }\r\n    const filteredZones = this.getTechniqueFilteredZones();\r\n    const views = [];\r\n    filteredZones.forEach(function (zone) {\r\n      const view = normalizeViewId(zone && zone.view);\r\n      if (views.indexOf(view) < 0) views.push(view);\r\n    });\r\n    if (!views.length) views.push('front');\r\n    return views;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getViewLabel = function (view) {\n    return this.getViewDisplay(view).label;\n  };\n\n  PersonalizerModalApp.prototype.canCreateInZone = function (zoneId) {\n    const maxActiveZones = Number(this.customizationRules && this.customizationRules.maxActiveZones) || 0;\n    if (maxActiveZones <= 0 || !this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return true;\n    const targetZoneId = String(zoneId || '');\n    const occupiedZoneIds = Array.from(new Set(\n      this.canvasEngine.getDesignObjects()\n        .map(function (object) { return String(object && object.zoneId || ''); })\n        .filter(Boolean)\n    ));\n    return occupiedZoneIds.length < maxActiveZones || occupiedZoneIds.indexOf(targetZoneId) >= 0;\n  };\n\n  PersonalizerModalApp.prototype.normalizeViewDisplayConfig = function (input) {\n    let config = input;\n    if (typeof config === 'string') {\n      try { config = JSON.parse(config); } catch (error) { return {}; }\n    }\n    if (!config || typeof config !== 'object' || Array.isArray(config)) return {};\n\n    return ['front', 'back'].reduce(function (result, viewId) {\n      const source = config[viewId];\n      if (!source || typeof source !== 'object' || Array.isArray(source)) return result;\n      const label = typeof source.label === 'string' ? source.label.trim() : '';\n      const icon = typeof source.icon === 'string' ? source.icon.trim().toLowerCase() : '';\n      const normalized = {};\n      if (label) normalized.label = label;\n      if (this.isKnownViewIcon(icon)) normalized.icon = icon;\n      if (Object.keys(normalized).length) result[viewId] = normalized;\n      return result;\n    }.bind(this), {});\n  };\n\n  PersonalizerModalApp.prototype.isKnownViewIcon = function (icon) {\n    return ['front-default', 'back-default', 'pen-clip', 'pen-side'].indexOf(String(icon || '')) >= 0;\n  };\n\n  PersonalizerModalApp.prototype.getViewDisplay = function (view) {\n    const viewId = normalizeViewId(view);\n    let fallbackLabel = viewId === 'back' ? 'Dos ou col' : 'Avant';\n    if (this.isPrintMode()) {\n      const configuredViews = this.printDocument\n        ? (Array.isArray(this.printDocument.views) ? this.printDocument.views : []).concat(\n            Array.isArray(this.printDocument.physicalViews) ? this.printDocument.physicalViews : []\n          )\n        : [];\n      const configuredView = configuredViews.find(function (item) { return item.id === viewId; }) || null;\n      fallbackLabel = configuredView ? configuredView.label : (viewId === 'back' ? 'Verso' : 'Recto');\n    }\n    const custom = this.viewDisplayConfig && this.viewDisplayConfig[viewId] || {};\n    const label = custom.label || fallbackLabel;\n    const zoneLabel = custom.label\n      ? 'Zone ' + label.charAt(0).toLocaleLowerCase('fr-FR') + label.slice(1)\n      : (viewId === 'back' ? 'Zone dos / col' : 'Zone avant');\n    return {\n      id: viewId,\n      label: label,\n      zoneLabel: zoneLabel,\n      icon: custom.icon || (viewId === 'back' ? 'back-default' : 'front-default')\n    };\n  };\n\n  PersonalizerModalApp.prototype.getCustomViewIconMarkup = function (icon) {\n    if (icon === 'pen-clip') {\n      return '<svg class=\"personalizer-zone-icon personalizer-zone-icon--pen\" viewBox=\"0 0 96 82\" focusable=\"false\" aria-hidden=\"true\"><path class=\"personalizer-zone-icon__shirt\" d=\"M19 47 65 17l12 18-46 30-16 2 4-20Z\"></path><path class=\"personalizer-zone-icon__seam\" d=\"m19 47 12 18M65 17l12 18M56 25l10 15M23 51l8 12M31 65l-16 2 4-20\"></path><path class=\"personalizer-zone-icon__marker\" d=\"M54 19c8-5 14-2 17 3l5 8\"></path></svg>';\n    }\n    if (icon === 'pen-side') {\n      return '<svg class=\"personalizer-zone-icon personalizer-zone-icon--pen\" viewBox=\"0 0 96 82\" focusable=\"false\" aria-hidden=\"true\"><path class=\"personalizer-zone-icon__shirt\" d=\"M14 50 69 19l12 17-55 31-14 1 2-18Z\"></path><path class=\"personalizer-zone-icon__seam\" d=\"m14 50 12 17M69 19l12 17M22 46l12 17M26 67l-14 1 2-18\"></path><path class=\"personalizer-zone-icon__marker\" d=\"m34 55 34-19\"></path></svg>';\n    }\n    return '';\n  };\n\n  PersonalizerModalApp.prototype.getViewIconMarkup = function (view) {\n    const display = this.getViewDisplay(view);\n    return this.getCustomViewIconMarkup(display.icon) || this.getZonePlacementIconMarkup(null, display.id, true);\n  };\n\n  PersonalizerModalApp.prototype.getCurrentPrintViewConfig = function () {\r\n    if (!this.isPrintMode() || !this.printDocument || !Array.isArray(this.printDocument.views)) return null;\r\n    const viewId = normalizeViewId(this.activeView);\r\n    return this.printDocument.views.find(function (view) { return view.id === viewId; }) || null;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getPhysicalViewIdsForView = function (view) {\r\n    const viewId = normalizeViewId(view || this.activeView);\r\n    if (!this.isPrintMode() || !this.printDocument || !Array.isArray(this.printDocument.views)) return [viewId];\r\n    const configured = this.printDocument.views.find(function (item) { return item.id === viewId; });\r\n    if (!configured || configured.type !== 'spread' || !Array.isArray(configured.pages)) return [viewId];\r\n    const pageIds = configured.pages.map(function (page) { return normalizeViewId(page && page.id); }).filter(Boolean);\r\n    return pageIds.length ? pageIds : [viewId];\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getNavigationViewForPhysicalView = function (view) {\r\n    const viewId = normalizeViewId(view);\r\n    if (!this.isPrintMode() || !this.printDocument || !Array.isArray(this.printDocument.views)) return viewId;\r\n    const owner = this.printDocument.views.find(function (candidate) {\r\n      if (!candidate) return false;\r\n      if (candidate.id === viewId) return true;\r\n      return candidate.type === 'spread' && Array.isArray(candidate.pages) && candidate.pages.some(function (page) {\r\n        return normalizeViewId(page && page.id) === viewId;\r\n      });\r\n    });\r\n    return owner ? owner.id : viewId;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getCurrentViewTools = function () {\r\n    const defaults = { image: true, qr: true, text: true, background: true, template: true };\r\n    const view = this.getCurrentPrintViewConfig();\r\n    return view && view.tools ? Object.assign(defaults, view.tools) : defaults;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isToolAllowedForCurrentView = function (tool) {\r\n    if (!this.isPrintMode()) return true;\r\n    const tools = this.getCurrentViewTools();\r\n    return tools[String(tool || '')] !== false;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getToolForAction = function (action) {\r\n    const value = String(action || '');\r\n    if (/template/.test(value)) return 'template';\r\n    if (/background/.test(value)) return 'background';\r\n    if (/qr/.test(value)) return 'qr';\r\n    if (/text/.test(value)) return 'text';\r\n    if (/image|upload/.test(value)) return 'image';\r\n    return '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isActionAllowedForCurrentView = function (action) {\r\n    const tool = this.getToolForAction(action);\r\n    return !tool || this.isToolAllowedForCurrentView(tool);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncCurrentViewToolsUi = function () {\r\n    if (!this.modal || !this.isPrintMode()) return;\r\n    const tools = this.getCurrentViewTools();\r\n    const selectors = {\r\n      image: '[data-action=\"open-image-panel\"], [data-action=\"open-image-picker\"], [data-action=\"open-image-upload-flyout\"]',\r\n      qr: '[data-action=\"open-qr-panel\"]',\r\n      text: '[data-action=\"open-text-panel\"]',\r\n      background: '[data-action=\"open-background-panel\"]',\r\n      template: '[data-action=\"open-template-panel\"]'\r\n    };\r\n    Object.keys(selectors).forEach(function (tool) {\r\n      this.modal.querySelectorAll(selectors[tool]).forEach(function (node) {\r\n        node.hidden = tools[tool] === false;\r\n        node.disabled = tools[tool] === false;\r\n        node.setAttribute('aria-disabled', tools[tool] === false ? 'true' : 'false');\r\n      });\r\n    }, this);\r\n    const activeTool = this.activeControlsPanel === 'template' ? 'template' : this.activeControlsPanel;\r\n    if (tools[activeTool] === false) this.setControlsPanel('default');\r\n    if (this.debugEnabled && typeof console !== 'undefined') console.log('[Print] current view tools:', tools);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderPanelPlacementControls = function () {\r\n    if (!this.modal) return;\r\n\r\n    const panelName = this.activeControlsPanel;\r\n    if (panelName !== 'text' && panelName !== 'qr' && panelName !== 'image') return;\r\n\r\n    const zoneContainers = this.modal.querySelectorAll(\r\n      '[data-' + panelName + '-panel-zones], [data-' + panelName + '-panel-zones-overlay]'\r\n    );\r\n    const viewContainers = this.modal.querySelectorAll(\r\n      '[data-' + panelName + '-panel-views], [data-' + panelName + '-panel-views-overlay]'\r\n    );\r\n    if (!zoneContainers.length || !viewContainers.length) return;\r\n\r\n    const activeZoneId = this.selectedZone ? this.selectedZone.id : '';\r\n    const currentView = this.activeView || 'front';\r\n    const zones = this.getAvailableZonesForCurrentView();\r\n\r\n    let zonesHtml = '<p>Aucune zone disponible.</p>';\r\n    if (zones.length) {\r\n      const panelObject = this.getPanelObjectForKind(panelName);\r\n      zonesHtml = zones\r\n        .map(function (zone) {\r\n           const active = zone.id === activeZoneId;\r\n           const canSelectZone = !panelObject || this.isZoneAllowedForObject(zone.id, currentView, panelObject);\r\n           const placementIcon = this.getZonePlacementIconMarkup(zone, currentView);\r\n           const placementThumb = this.isPrintMode()\r\n             ? ''\r\n             : '<span class=\"personalizer-position-card__thumb personalizer-position-card__thumb--vector\" aria-hidden=\"true\">' +\r\n               placementIcon +\r\n               '</span>';\r\n           return (\r\n             '<button type=\"button\" class=\"personalizer-position-card' +\r\n             (this.isPrintMode() ? ' personalizer-position-card--print-simple' : '') +\r\n             (active ? ' is-active' : '') +\r\n            (canSelectZone ? '' : ' is-disabled') +\r\n            '\" data-action=\"panel-select-zone\" data-zone-id=\"' +\r\n            zone.id +\r\n            '\"' +\r\n            (canSelectZone ? '' : ' disabled aria-disabled=\"true\" title=\"Zone indisponible pour cette personnalisation\"') +\r\n            '>' +\r\n             placementThumb +\r\n            '<span class=\"personalizer-position-card__top-label\">' +\r\n            (zone.label || zone.id) +\r\n            '</span>' +\r\n            '</button>'\r\n          );\r\n        }.bind(this))\r\n        .join('');\r\n    }\r\n    zoneContainers.forEach(function (container) {\r\n      container.innerHTML = zonesHtml;\r\n    });\r\n\r\n    const availableViews = this.getTechniqueAvailableViews();\r\n    const viewsHtml = availableViews\r\n      .map(\r\n        function (view) {\r\n           const label = this.getViewLabel(view);\r\n           const active = view === currentView;\r\n           const placementIcon = this.getViewIconMarkup(view);\n           const placementThumb = this.isPrintMode()\r\n             ? ''\r\n             : '<span class=\"personalizer-position-card__thumb personalizer-position-card__thumb--vector\" aria-hidden=\"true\">' +\r\n               placementIcon +\r\n               '</span>';\r\n           return (\r\n             '<button type=\"button\" class=\"personalizer-position-card' +\r\n             (this.isPrintMode() ? ' personalizer-position-card--print-simple' : '') +\r\n             (active ? ' is-active' : '') +\r\n            '\" data-action=\"panel-select-view\" data-view=\"' +\r\n            view +\r\n            '\">' +\r\n             placementThumb +\r\n            '<span class=\"personalizer-position-card__top-label\">' +\r\n            label +\r\n            '</span>' +\r\n            '</button>'\r\n          );\r\n        }.bind(this)\r\n      )\r\n      .join('');\r\n    viewContainers.forEach(function (container) {\r\n      container.innerHTML = viewsHtml;\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getZonePlacementIconMarkup = function (zone, view) {\n    const normalizedView = normalizeViewId(view);\n    const customIcon = arguments[2] === true ? '' : this.getCustomViewIconMarkup(this.getViewDisplay(normalizedView).icon);\n    if (customIcon) return customIcon;\n    const zoneKey = String(\r\n      (zone && (zone.label || zone.id)) || ''\r\n    ).toLowerCase();\r\n    const isCollar = /col|nuque|collar/.test(zoneKey);\r\n    const isHeart = /coeur|c\u0153ur|heart/.test(zoneKey);\r\n    const isAntiHeart = /anti/.test(zoneKey) && isHeart;\r\n    const isA3 = /a3/.test(zoneKey);\r\n    const isA4 = /a4/.test(zoneKey);\r\n    const isLarge = /grand|large|face|dos|avant|front|back/.test(zoneKey);\r\n    let marker = '';\r\n\r\n    if (isCollar) {\r\n      marker = '<rect class=\"personalizer-zone-icon__marker\" x=\"42\" y=\"14\" width=\"12\" height=\"5\" rx=\"1.5\"></rect>';\r\n    } else if (isHeart) {\r\n      marker =\r\n        '<rect class=\"personalizer-zone-icon__marker\" x=\"' +\r\n        (isAntiHeart ? '33' : '53') +\r\n        '\" y=\"29\" width=\"10\" height=\"9\" rx=\"1.5\"></rect>';\r\n    } else if (zone && isA3) {\r\n      marker = '<rect class=\"personalizer-zone-icon__marker\" x=\"34\" y=\"29\" width=\"28\" height=\"37\" rx=\"2\"></rect>';\r\n    } else if (zone && isA4) {\r\n      marker = '<rect class=\"personalizer-zone-icon__marker\" x=\"38\" y=\"31\" width=\"20\" height=\"29\" rx=\"2\"></rect>';\r\n    } else if (zone && isLarge) {\r\n      marker = '<rect class=\"personalizer-zone-icon__marker\" x=\"36\" y=\"30\" width=\"24\" height=\"34\" rx=\"2\"></rect>';\r\n    } else if (zone) {\r\n      marker = '<rect class=\"personalizer-zone-icon__marker\" x=\"41\" y=\"31\" width=\"13\" height=\"13\" rx=\"1.5\"></rect>';\r\n    }\r\n\r\n    return (\r\n      '<svg class=\"personalizer-zone-icon\" viewBox=\"0 0 96 82\" focusable=\"false\">' +\r\n        '<path class=\"personalizer-zone-icon__shirt\" d=\"M33 12 20 17 7 31l11 10 8-8v37h44V33l8 8 11-10-13-14-13-5c-3 6-8 9-15 9s-12-3-15-9Z\"></path>' +\r\n        '<path class=\"personalizer-zone-icon__seam\" d=\"M33 12c3 6 8 9 15 9s12-3 15-9M26 33 21 22M70 33l5-11\"></path>' +\r\n        marker +\r\n        (normalizedView === 'back'\r\n          ? '<path class=\"personalizer-zone-icon__view-mark\" d=\"M42 15h12\"></path>'\r\n          : '') +\r\n      '</svg>'\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.captureActiveViewThumbnail = function () {\r\n    this.captureThumbnailForView(this.activeView || 'front');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getViewThumbnailFallback = function (view) {\r\n    const normalizedView = normalizeViewId(view);\r\n\r\n    const colorMockupUrl =\r\n      window.PersonalizerMetafields &&\r\n      window.PersonalizerMetafields.getMockupForColor(this.activeColorName, normalizedView, this.colors);\r\n\r\n    if (colorMockupUrl) return colorMockupUrl;\r\n\r\n    const variantMockupUrl =\r\n      window.PersonalizerMetafields &&\r\n      window.PersonalizerMetafields.getMockupUrl(\r\n        this.mockups,\r\n        this.currentVariant,\r\n        this.config.options,\r\n        this.config.featuredImage\r\n      );\r\n\r\n    return variantMockupUrl || this.config.featuredImage || '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getZoneThumbnailStateKey = function (zone, view) {\r\n    const normalizedView = normalizeViewId(view);\r\n    const colorKey = String(this.activeColorName || '').trim().toLowerCase();\r\n    const variantId = this.currentVariant && this.currentVariant.id ? String(this.currentVariant.id) : '';\r\n    const zoneId = zone && zone.id ? String(zone.id) : '';\r\n    return normalizedView + '|' + colorKey + '|' + variantId + '|' + zoneId;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getZoneThumbnail = function (zone, view) {\r\n    const normalizedView = normalizeViewId(view);\r\n    const fallback = this.getViewThumbnailFallback(normalizedView) || '';\r\n    if (!zone || !zone.id || !this.canvasEngine || typeof this.canvasEngine.getCleanZonePreviewDataURL !== 'function') {\r\n      return fallback;\r\n    }\r\n\r\n    const cacheKey = normalizedView + ':' + String(zone.id);\r\n    const expectedStateKey = this.getZoneThumbnailStateKey(zone, normalizedView);\r\n    const cachedThumbnail = this.zoneThumbnails[cacheKey] || '';\r\n    if (cachedThumbnail && String(this.zoneThumbnailStateKeys[cacheKey] || '') === expectedStateKey) {\r\n      return cachedThumbnail;\r\n    }\r\n\r\n    let thumbnail = '';\r\n    try {\r\n      thumbnail = this.canvasEngine.getCleanZonePreviewDataURL(zone, { view: normalizedView }) || '';\r\n    } catch (error) {\r\n      thumbnail = '';\r\n    }\r\n\r\n    if (thumbnail) {\r\n      this.zoneThumbnails[cacheKey] = thumbnail;\r\n      this.zoneThumbnailStateKeys[cacheKey] = expectedStateKey;\r\n      return thumbnail;\r\n    }\r\n\r\n    return fallback;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderSidebarViewThumbnails = function () {\r\n    const sidebarButtons = this.modal.querySelectorAll('.personalizer-sidebar [data-view-switch]');\r\n\r\n    sidebarButtons.forEach(\r\n      function (button) {\r\n        const view = normalizeViewId(button.dataset.viewSwitch);\r\n        const label = this.getViewLabel(view);\n        button.setAttribute('aria-label', 'Passer \u00E0 ' + label);\n        const expectedStateKey = this.getViewThumbnailStateKey(view);\r\n        const hasFreshThumbnail =\r\n          !!this.viewThumbnails[view] && String(this.viewThumbnailStateKeys[view] || '') === expectedStateKey;\r\n        const thumbnail = (hasFreshThumbnail ? this.viewThumbnails[view] : '') || this.getViewThumbnailFallback(view) || '';\r\n\r\n        if (!button.dataset.thumbnailReady) {\r\n          button.classList.add('personalizer-view-choice');\r\n          button.innerHTML =\r\n            '<span class=\"personalizer-view-choice__thumb-wrap\">' +\r\n            '<img class=\"personalizer-view-choice__thumb\" alt=\"' +\r\n            label +\r\n            '\" draggable=\"false\" />' +\r\n            '</span>' +\r\n            '<span class=\"personalizer-view-choice__label\">' +\r\n            label +\r\n            '</span>';\r\n          button.dataset.thumbnailReady = 'true';\r\n        }\r\n\r\n        const imageNode = button.querySelector('.personalizer-view-choice__thumb');\r\n        if (!imageNode) return;\r\n\r\n        if (thumbnail) {\r\n          imageNode.src = thumbnail;\r\n          imageNode.classList.add('has-image');\r\n        } else {\r\n          imageNode.removeAttribute('src');\r\n          imageNode.classList.remove('has-image');\r\n        }\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderTechniques = function () {\r\n    const containers = this.modal.querySelectorAll('[data-techniques], [data-techniques-mobile]');\r\n    if (!containers.length) return;\r\n\r\n    if (!this.techniques.length) {\r\n      containers.forEach(function (container) {\r\n        container.innerHTML = '<p>Aucune technique disponible.</p>';\r\n      });\r\n      return;\r\n    }\r\n\r\n    const html =\r\n      '<div class=\"personalizer-technique-buttons\" role=\"group\" aria-label=\"Technique de marquage\">' +\r\n      this.techniques\r\n        .map(\r\n          function (technique) {\r\n            const active = this.selectedTechnique && this.selectedTechnique.id === technique.id;\r\n            return (\r\n              '<button type=\"button\" class=\"personalizer-technique-toggle__option' +\r\n              (active ? ' is-active' : '') +\r\n              '\" aria-pressed=\"' +\r\n              (active ? 'true' : 'false') +\r\n              '\" data-technique-id=\"' +\r\n              technique.id +\r\n              '\">' +\r\n              technique.label +\r\n              '</button>'\r\n            );\r\n          }.bind(this)\r\n        )\r\n        .join('') +\r\n      '</div>';\r\n    containers.forEach(function (container) {\r\n      container.innerHTML = html;\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.renderPositionPresets = function () {\r\n    const container = this.modal.querySelector('[data-position-presets]');\r\n    const zones = this.getAvailableZonesForCurrentView();\r\n    if (!zones.length) {\r\n      this.selectedZone = null;\r\n      if (container) container.innerHTML = '';\r\n      return;\r\n    }\r\n\r\n    if (!this.selectedZone || !zones.some(function (zone) { return zone.id === this.selectedZone.id; }.bind(this))) {\r\n      this.selectedZone = zones[0];\r\n    }\r\n\r\n    if (!container) return;\r\n\r\n    const uniqueZones = zones.filter(function (zone, index, list) {\r\n      return list.findIndex(function (candidate) { return candidate.id === zone.id; }) === index;\r\n    });\r\n\r\n    container.innerHTML = uniqueZones\r\n      .map(function (zone) {\r\n        const active = this.selectedZone && this.selectedZone.id === zone.id;\r\n        return (\r\n          '<button type=\"button\" class=\"personalizer-choice' +\r\n          (active ? ' is-active' : '') +\r\n          '\" data-position-zone-id=\"' +\r\n          zone.id +\r\n          '\">' +\r\n          (zone.label || zone.id) +\r\n          '</button>'\r\n        );\r\n      }.bind(this))\r\n      .join('');\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.normalizeCssColorValue = function (value) {\r\n    const raw = String(value || '').trim();\r\n    if (!raw) return '';\r\n    if (/^[0-9a-fA-F]{3}$/.test(raw) || /^[0-9a-fA-F]{4}$/.test(raw) || /^[0-9a-fA-F]{6}$/.test(raw) || /^[0-9a-fA-F]{8}$/.test(raw)) {\r\n      return '#' + raw;\r\n    }\r\n    if (/^#[0-9a-fA-F]{3}$/.test(raw) || /^#[0-9a-fA-F]{4}$/.test(raw) || /^#[0-9a-fA-F]{6}$/.test(raw) || /^#[0-9a-fA-F]{8}$/.test(raw)) {\r\n      return raw;\r\n    }\r\n    if (window.CSS && typeof window.CSS.supports === 'function' && window.CSS.supports('color', raw)) {\r\n      return raw;\r\n    }\r\n    return '';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getTextColorOptionDescriptor = function (value) {\r\n    const colorSelect = this.modal ? this.modal.querySelector('[data-text-panel-color]') : null;\r\n    const options = Array.from(colorSelect && colorSelect.options ? colorSelect.options : []).filter(function (option) {\r\n      return String(option.value || '').trim();\r\n    });\r\n    if (!options.length) {\r\n      return {\r\n        value: String(value || '').trim(),\r\n        label: String(value || '').trim()\r\n      };\r\n    }\r\n\r\n    const fallbackOption =\r\n      options.find(function (option) {\r\n        return String(option.value || '').trim().toLowerCase() === '#111111';\r\n      }) || options[0];\r\n\r\n    const normalized = this.normalizeCssColorValue(value);\r\n    if (!normalized) {\r\n      return {\r\n        value: String(fallbackOption.value || '').trim(),\r\n        label: String(fallbackOption.textContent || fallbackOption.label || fallbackOption.value || '').trim()\r\n      };\r\n    }\r\n\r\n    const exact = options.find(function (option) {\r\n      return String(option.value || '').trim().toLowerCase() === String(normalized).toLowerCase();\r\n    });\r\n    if (exact) {\r\n      return {\r\n        value: String(exact.value || '').trim(),\r\n        label: String(exact.textContent || exact.label || exact.value || '').trim()\r\n      };\r\n    }\r\n\r\n    const sourceChannels = this.getColorRgbChannels(normalized);\r\n    if (!sourceChannels) {\r\n      return {\r\n        value: String(fallbackOption.value || '').trim(),\r\n        label: String(fallbackOption.textContent || fallbackOption.label || fallbackOption.value || '').trim()\r\n      };\r\n    }\r\n\r\n    let bestOption = fallbackOption;\r\n    let bestDistance = Number.POSITIVE_INFINITY;\r\n    options.forEach(\r\n      function (option) {\r\n        const optionChannels = this.getColorRgbChannels(option.value);\r\n        if (!optionChannels) return;\r\n        const distance =\r\n          Math.abs(sourceChannels.r - optionChannels.r) +\r\n          Math.abs(sourceChannels.g - optionChannels.g) +\r\n          Math.abs(sourceChannels.b - optionChannels.b);\r\n        if (distance < bestDistance) {\r\n          bestDistance = distance;\r\n          bestOption = option;\r\n        }\r\n      }.bind(this)\r\n    );\r\n\r\n    return {\r\n      value: String(bestOption.value || '').trim(),\r\n      label: String(bestOption.textContent || bestOption.label || bestOption.value || '').trim()\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getColorRgbChannels = function (colorValue) {\r\n    const normalizedColor = this.normalizeCssColorValue(colorValue);\r\n    if (!normalizedColor) return null;\r\n\r\n    const parserCanvas = this._personalizerColorParserCanvas || document.createElement('canvas');\r\n    this._personalizerColorParserCanvas = parserCanvas;\r\n    const context = parserCanvas.getContext('2d');\r\n    if (!context) return null;\r\n\r\n    context.fillStyle = '#000000';\r\n    context.fillStyle = normalizedColor;\r\n    const parsed = String(context.fillStyle || '');\r\n    if (!parsed) return null;\r\n\r\n    if (parsed.charAt(0) === '#') {\r\n      let hex = parsed.slice(1);\r\n      if (hex.length === 3 || hex.length === 4) {\r\n        hex = hex\r\n          .split('')\r\n          .slice(0, 3)\r\n          .map(function (char) {\r\n            return char + char;\r\n          })\r\n          .join('');\r\n      } else if (hex.length === 8) {\r\n        hex = hex.slice(0, 6);\r\n      }\r\n      if (hex.length === 6 && /^[0-9a-fA-F]{6}$/.test(hex)) {\r\n        return {\r\n          r: parseInt(hex.slice(0, 2), 16),\r\n          g: parseInt(hex.slice(2, 4), 16),\r\n          b: parseInt(hex.slice(4, 6), 16)\r\n        };\r\n      }\r\n      return null;\r\n    }\r\n\r\n    const rgbMatch = parsed.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/i);\r\n    if (!rgbMatch) return null;\r\n    return {\r\n      r: Math.max(0, Math.min(255, Number(rgbMatch[1]) || 0)),\r\n      g: Math.max(0, Math.min(255, Number(rgbMatch[2]) || 0)),\r\n      b: Math.max(0, Math.min(255, Number(rgbMatch[3]) || 0))\r\n    };\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.isLightColor = function (colorValue) {\r\n    const channels = this.getColorRgbChannels(colorValue);\r\n    if (!channels) return false;\r\n    const luminance = (0.299 * channels.r + 0.587 * channels.g + 0.114 * channels.b) / 255;\r\n    return luminance > 0.68;\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getColorSwatchHex = function (colorName) {\r\n    const normalizeKey = function (value) {\r\n      return String(value || '')\r\n        .trim()\r\n        .toLowerCase()\r\n        .normalize('NFD')\r\n        .replace(/[\\u0300-\\u036f]/g, '')\r\n        .replace(/\\s+/g, ' ')\r\n        .replace(/[^a-z0-9 ]/g, '');\r\n    };\r\n\r\n    const key = normalizeKey(colorName);\r\n    const colorMatch = Array.isArray(this.colors)\r\n      ? this.colors.find(function (item) {\r\n          return normalizeKey(item && item.name) === key;\r\n        })\r\n      : null;\r\n    const matchedColor = this.normalizeCssColorValue(colorMatch && colorMatch.swatchHex);\r\n    if (matchedColor) {\r\n      return matchedColor;\r\n    }\r\n\r\n    const variantSwatchMatch = Array.isArray(this.variantColorSwatches)\r\n      ? this.variantColorSwatches.find(\r\n          function (item) {\r\n            return normalizeKey(item && item.name) === key;\r\n          }.bind(this)\r\n        )\r\n      : null;\r\n    const variantSwatchColor = this.normalizeCssColorValue(variantSwatchMatch && variantSwatchMatch.swatchHex);\r\n    if (variantSwatchColor) {\r\n      return variantSwatchColor;\r\n    }\r\n\r\n    const palette = {\r\n      blanc: '#ffffff',\r\n      white: '#ffffff',\r\n      beige: '#e5d2a5',\r\n      ecru: '#ede3c8',\r\n      'ecru naturel': '#ede3c8',\r\n      naturel: '#e8dcc1',\r\n      natural: '#e8dcc1',\r\n      sable: '#d7c39a',\r\n      sand: '#d7c39a',\r\n      creme: '#f2ead2',\r\n      cream: '#f2ead2',\r\n      noir: '#111111',\r\n      black: '#111111',\r\n      bleu: '#1e5db8',\r\n      blue: '#1e5db8',\r\n      rouge: '#c82a2a',\r\n      red: '#c82a2a',\r\n      vert: '#2f8a3f',\r\n      green: '#2f8a3f',\r\n      jaune: '#e9ba23',\r\n      yellow: '#e9ba23',\r\n      gris: '#8c8c8c',\r\n      'gris acier': '#7c8792',\r\n      grey: '#8c8c8c',\r\n      gray: '#8c8c8c',\r\n      fumee: '#6f747b',\r\n      'fumee foncee': '#5f656d',\r\n      fum\u00E9e: '#6f747b',\r\n      anthracite: '#4a4f57',\r\n      marine: '#1c2f5f',\r\n      navy: '#1c2f5f'\r\n    };\r\n    const paletteColor = palette[key] || '';\r\n    if (paletteColor) return paletteColor;\r\n\r\n    const directColor = this.normalizeCssColorValue(colorName);\r\n    return directColor || '#111111';\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.getContrastingTextColor = function (hexColor) {\n    return this.isLightColor(hexColor) ? '#111111' : '#ffffff';\n  };\n\n  PersonalizerModalApp.prototype.usesSharedMarkingColor = function () {\n    return !!(\n      this.selectedTechnique &&\n      this.selectedTechnique.colorMode === 'mono' &&\n      this.selectedTechnique.sharedMarkingColor === true\n    );\n  };\n\n  PersonalizerModalApp.prototype.applySharedMarkingColor = function (color) {\n    if (!this.usesSharedMarkingColor()) return Promise.resolve(false);\n    const nextColor = this.normalizeCssColorValue(color) || '#111111';\n    const renderColor = this.resolveCanvasRenderColor(nextColor);\n    this.sharedMarkingColor = nextColor;\n    if (this.modal) {\n      this.modal.querySelectorAll('[data-text-panel-color], [data-qr-panel-color], [data-mobile-text-color-select]').forEach(function (select) {\n        if (Array.from(select.options || []).some(function (option) { return String(option.value).toLowerCase() === nextColor.toLowerCase(); })) {\n          select.value = nextColor;\n        }\n      });\n    }\n    if (!this.canvasEngine || typeof this.canvasEngine.getDesignObjects !== 'function') return Promise.resolve(false);\n    const updates = this.canvasEngine.getDesignObjects().map(function (object) {\n      const kind = this.getSelectedObjectKind(object);\n      if (kind === 'text' && typeof this.canvasEngine.updateTextObjectStyle === 'function') {\n        this.canvasEngine.updateTextObjectStyle(object, { fill: renderColor });\n        return Promise.resolve(true);\n      }\n      if (kind === 'image' && typeof this.canvasEngine.applyMonochromeColorToImage === 'function') {\n        return this.canvasEngine.applyMonochromeColorToImage(object, renderColor);\n      }\n      if (kind === 'qr' && typeof this.canvasEngine.updateQrCodeObject === 'function') {\n        const value = String(object.personalizerQrValue || this.getQrDefaultValue());\n        return this.generateQrCodeDataUrl(value, renderColor).then(function (source) {\n          if (!source) return false;\n          return this.canvasEngine.updateQrCodeObject(object, source, {\n            value: value,\n            color: nextColor,\n            usesDefaultValue: !!object.personalizerQrUsesDefaultValue\n          });\n        }.bind(this));\n      }\n      return Promise.resolve(false);\n    }.bind(this));\n    return Promise.all(updates).then(function () { return true; });\n  };\n\r\n  PersonalizerModalApp.prototype.renderColors = function () {\r\n    const wrapper = this.modal.querySelector('[data-colors-wrapper]');\r\n    const desktopContainer = this.modal.querySelector('[data-colors]');\r\n    const mobileContainer = this.modal.querySelector('[data-colors-mobile]');\r\n    if (!wrapper || (!desktopContainer && !mobileContainer)) return;\r\n\r\n    if (!this.colors.length) {\r\n      wrapper.style.display = 'none';\r\n      if (desktopContainer) desktopContainer.innerHTML = '';\r\n      if (mobileContainer) mobileContainer.innerHTML = '';\r\n      return;\r\n    }\r\n\r\n    wrapper.style.display = '';\r\n    const activeColor = this.activeColorName || (this.colors[0] && this.colors[0].name) || '';\r\n    const activeHex = this.getColorSwatchHex(activeColor);\r\n    const activeTextColor = this.getContrastingTextColor(activeHex);\r\n    const activeIsWhite = this.isLightColor(activeHex);\r\n    this.debugColorState('render-colors', {\r\n      activeColor: activeColor,\r\n      activeHex: activeHex,\r\n      normalizedRows: this.colors.map(\r\n        function (item) {\r\n          const name = String(item && item.name ? item.name : '');\r\n          return {\r\n            name: name,\r\n            swatchHex: item && item.swatchHex ? item.swatchHex : '',\r\n            resolvedHex: this.getColorSwatchHex(name)\r\n          };\r\n        }.bind(this)\r\n      )\r\n    });\r\n    const activeColorLabel = this.escapeHtml(activeColor || 'Couleur');\r\n    const desktopDropdownHtml =\r\n      '<div class=\"personalizer-color-dropdown\" data-color-dropdown>' +\r\n      '<button type=\"button\" class=\"personalizer-color-dropdown__toggle' +\r\n      (activeIsWhite ? ' personalizer-color-dropdown__toggle--light' : '') +\r\n      '\" data-color-dropdown-toggle aria-haspopup=\"listbox\" aria-expanded=\"false\" style=\"background:' +\r\n      activeHex +\r\n      ';color:' +\r\n      activeTextColor +\r\n      ';\" aria-label=\"Choisir une couleur\">' +\r\n      '<span class=\"personalizer-color-dropdown__toggle-label\">' +\r\n      activeColorLabel +\r\n      '</span>' +\r\n      '<span class=\"personalizer-color-dropdown__toggle-caret\" aria-hidden=\"true\">' +\r\n      '<svg viewBox=\"0 0 20 20\" focusable=\"false\"><path d=\"M5 7.5 10 12.5 15 7.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg>' +\r\n      '</span>' +\r\n      '</button>' +\r\n      '<div class=\"personalizer-color-dropdown__menu\" role=\"listbox\" aria-label=\"Couleurs\">' +\r\n      this.colors\r\n        .map(function (colorItem) {\r\n          const selected = String(activeColor).toLowerCase() === String(colorItem.name || '').toLowerCase();\r\n          const optionHex = this.getColorSwatchHex(colorItem.name || '');\r\n          const optionTextColor = this.getContrastingTextColor(optionHex);\r\n          const optionIsWhite = this.isLightColor(optionHex);\r\n          return (\r\n            '<button type=\"button\" class=\"personalizer-color-dropdown__option' +\r\n            (optionIsWhite ? ' personalizer-color-dropdown__option--light' : '') +\r\n            (selected ? ' is-selected' : '') +\r\n            '\" data-color-option=\"' +\r\n            this.escapeHtml(colorItem.name || '') +\r\n            '\" role=\"option\" aria-selected=\"' +\r\n            (selected ? 'true' : 'false') +\r\n            '\" style=\"background:' +\r\n            optionHex +\r\n            ';color:' +\r\n            optionTextColor +\r\n            ';\">' +\r\n            '<span class=\"personalizer-color-dropdown__option-name\">' +\r\n            this.escapeHtml(colorItem.name || '') +\r\n            '</span>' +\r\n            '</button>'\r\n          );\r\n        }.bind(this))\r\n        .join('') +\r\n      '</div>' +\r\n      '</div>';\r\n\r\n    if (desktopContainer) {\r\n      desktopContainer.innerHTML = desktopDropdownHtml;\r\n    }\r\n\r\n    if (mobileContainer) {\r\n      mobileContainer.innerHTML =\r\n        '<div class=\"personalizer-mobile-color-preview' +\r\n        (activeIsWhite ? ' personalizer-mobile-color-preview--light' : '') +\r\n        '\" style=\"background:' +\r\n        activeHex +\r\n        ';color:' +\r\n        activeTextColor +\r\n        ';\">' +\r\n        activeColorLabel +\r\n        '</div>' +\r\n        '<p class=\"personalizer-mobile-color-sheet__label\">Par defaut</p>' +\r\n        '<div class=\"personalizer-mobile-select-list\">' +\r\n        this.colors\r\n          .map(\r\n            function (colorItem) {\r\n              const colorName = String(colorItem.name || '');\r\n              const selected = String(activeColor).toLowerCase() === colorName.toLowerCase();\r\n              const optionHex = this.getColorSwatchHex(colorName);\r\n              const optionTextColor = this.getContrastingTextColor(optionHex);\r\n              const optionIsWhite = this.isLightColor(optionHex);\r\n              return (\r\n                '<button type=\"button\" class=\"personalizer-mobile-select-option personalizer-mobile-select-option--color' +\r\n                (optionIsWhite ? ' personalizer-mobile-select-option--light' : '') +\r\n                (selected ? ' is-selected' : '') +\r\n                '\" data-color-option=\"' +\r\n                this.escapeHtml(colorName) +\r\n                '\" aria-selected=\"' +\r\n                (selected ? 'true' : 'false') +\r\n                '\" style=\"background:' +\r\n                optionHex +\r\n                ';color:' +\r\n                optionTextColor +\r\n                ';\">' +\r\n                this.escapeHtml(colorName) +\r\n                '</button>'\r\n              );\r\n            }.bind(this)\r\n          )\r\n          .join('') +\r\n        '</div>';\r\n    }\r\n\r\n    this.syncSizeQuantitiesWithAvailableVariants();\r\n    this.renderSizesUi();\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.syncVariantFromModalColor = function (colorName) {\r\n    if (!colorName || !window.PersonalizerMetafields) return;\r\n\r\n    const colorIndex = window.PersonalizerMetafields.getColorOptionIndex(this.config.options || []);\r\n    const nextColorKey = String(colorName || '').trim().toLowerCase();\r\n    const currentColorKey = String(this.activeColorName || '').trim().toLowerCase();\r\n    if (nextColorKey && nextColorKey === currentColorKey) return;\r\n    this.activeColorName = colorName;\r\n    this.renderColors();\r\n    this.syncBackgroundWithVariant();\r\n    this.scheduleActiveViewThumbnailCapture(100);\r\n\r\n    const productInfo =\r\n      document.querySelector('product-info[data-product-id=\"' + this.config.productId + '\"]') ||\r\n      document.querySelector('product-info');\r\n    if (!productInfo || colorIndex < 0) return;\r\n\r\n    let didTrigger = false;\r\n    const variantSelects = productInfo.querySelector('variant-selects');\r\n    if (variantSelects) {\r\n      const selects = variantSelects.querySelectorAll('select');\r\n      if (selects[colorIndex]) {\r\n        const select = selects[colorIndex];\r\n        const option = Array.from(select.options).find(function (item) {\r\n          return String(item.value).toLowerCase() === String(colorName).toLowerCase();\r\n        });\r\n        if (option) {\r\n          select.value = option.value;\r\n          select.dispatchEvent(new Event('change', { bubbles: true }));\r\n          didTrigger = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    const variantRadios = productInfo.querySelector('variant-radios');\r\n    if (variantRadios) {\r\n      const fieldsets = variantRadios.querySelectorAll('fieldset');\r\n      if (fieldsets[colorIndex]) {\r\n        const radios = fieldsets[colorIndex].querySelectorAll('input[type=\"radio\"]');\r\n        const radio = Array.from(radios).find(function (item) {\r\n          return String(item.value).toLowerCase() === String(colorName).toLowerCase();\r\n        });\r\n        if (radio) {\r\n          radio.click();\r\n          didTrigger = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!didTrigger) {\r\n      this.syncBackgroundWithVariant();\r\n    }\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.updatePrice = function () {\r\n    const priceNode = this.modal.querySelector('[data-personalizer-price]');\r\n    const basePriceNode = this.modal.querySelector('[data-personalizer-base-price]');\r\n    const discountNode = this.modal.querySelector('[data-personalizer-discount]');\r\n    const unitPriceNode = this.modal.querySelector('[data-personalizer-unit-price]');\r\n    if (!priceNode) return;\r\n    const displayPricing = this.getDisplayPricingSummary();\r\n    this.currentPricing = {\r\n      totalPriceCents: displayPricing.totalFinalCents,\r\n      totalPersonalizationBeforeDiscount: displayPricing.feeBaseCents,\r\n      totalPersonalizationPriceCents: displayPricing.feeFinalCents,\r\n      totalPersonalizationDiscountCents: displayPricing.feeDiscountCents\r\n    };\r\n    const selectedQuantity = Math.max(1, this.getTotalSelectedSizeQuantity());\r\n    priceNode.textContent = window.PersonalizerPricing.formatMoney(\r\n      displayPricing.totalFinalCents,\r\n      this.config.currencyCode\r\n    );\r\n    const totalBaseCents = Math.max(0, Math.round(Number(displayPricing.totalBaseCents) || 0));\r\n    const totalFinalCents = Math.max(0, Math.round(Number(displayPricing.totalFinalCents) || 0));\r\n    const hasTotalDiscount = totalBaseCents > totalFinalCents;\r\n    const totalDiscountPercent = totalBaseCents > 0\r\n      ? Math.round((totalBaseCents - totalFinalCents) * 100 / totalBaseCents)\r\n      : 0;\r\n    if (basePriceNode) {\r\n      basePriceNode.textContent = hasTotalDiscount\r\n        ? window.PersonalizerPricing.formatMoney(totalBaseCents, this.config.currencyCode)\r\n        : '';\r\n      basePriceNode.classList.toggle('is-hidden', !hasTotalDiscount);\r\n    }\r\n    if (discountNode) {\r\n      discountNode.textContent = hasTotalDiscount ? '-' + totalDiscountPercent + ' %' : '';\r\n      discountNode.classList.toggle('is-hidden', !hasTotalDiscount);\r\n    }\r\n    if (unitPriceNode) {\r\n      unitPriceNode.textContent = window.PersonalizerPricing.formatMoney(\r\n        Math.round(displayPricing.totalFinalCents / selectedQuantity),\r\n        this.config.currencyCode\r\n      ) + ' HT / pi\u00E8ce';\r\n    }\r\n    if (this.printOptions.length) this.renderPrintOptions();\r\n    this.renderSizesPriceSummary();\r\n  };\r\n\r\n  // Main add-to-cart pipeline for personalized products.\r\n  // Also used in cart-edit mode (\"Actualiser mon panier\"), where the existing\r\n  // group is replaced/updated instead of creating a new independent group.\r\n  PersonalizerModalApp.prototype.submitPersonalizedCart = function (options) {\r\n    if (this.isSubmittingCart) return;\r\n    const settings = options || {};\r\n    const selectedTotal = this.getTotalSelectedSizeQuantity();\r\n    if (!selectedTotal) {\n      this.setControlsPanel('sizes');\n      return;\n    }\n    const hasPersonalization = this.shouldGeneratePersonalizationBat();\n    if (!this.isPersonalizationQuantityValid()) {\n      this.syncCustomizationQuantityUi();\n      this.setControlsPanel('sizes');\n      window.alert(this.getCustomizationQuantityMessage());\n      return;\n    }\n    if (!settings.skipOutOfFrameConfirm && this.hasFullyOutOfFramePersonalizations()) {\r\n      this.openOutOfFrameConfirm();\r\n      return;\r\n    }\r\n\r\n    const personalizationJson = hasPersonalization ? this.canvasEngine.exportJSON() : '';\n    const selectedTechnique = this.selectedTechnique ? this.selectedTechnique.id : '';\r\n    const selectedZone = this.selectedZone ? this.selectedZone.id : '';\r\n    const usedZoneIds =\r\n      this.getBillableDesignObjects()\r\n            .map(function (object) {\r\n              return object.zoneId || '';\r\n            })\r\n            .filter(Boolean);\r\n    const selectedZones = JSON.stringify(hasPersonalization ?\n      Array.from(\n        new Set(\r\n          usedZoneIds.length\r\n            ? usedZoneIds\r\n            : selectedZone\r\n              ? [selectedZone]\r\n              : []\r\n        )\r\n      ) : []\n    );\n    const batData = hasPersonalization ? this.buildBatExportData() : null;\n    const selectedPrintOptions = this.isPrintMode() ? this.getSelectedPrintOptions() : [];\r\n    const printOptionsLabel = selectedPrintOptions.map(function (option) { return option.variantTitle; }).join(', ');\r\n    const batSummary = hasPersonalization ? this.buildBatSummaryForOrder(batData) : '';\n    const allDesignObjects = this.getBillableDesignObjects();\r\n    const techniquePrice = 0;\r\n    const usesConfiguredFeeProduct = !!String(this.selectedTechnique && this.selectedTechnique.feeProductHandle || '').trim();\n    const zonePrice =\n      !usesConfiguredFeeProduct && allDesignObjects.length > 0\n        ? Array.from(\r\n            new Set(\r\n              allDesignObjects\r\n                .map(function (object) {\r\n                  return object && object.zoneId ? String(object.zoneId) : '';\r\n                })\r\n                .filter(Boolean)\r\n            )\r\n          ).reduce(\r\n            function (total, zoneId) {\r\n              const zone = this.getZoneById(zoneId);\r\n              return total + (zone ? Number(zone.priceCents) || 0 : 0);\r\n            }.bind(this),\r\n            0\r\n          )\r\n        : 0;\r\n    const batPayload = hasPersonalization ? JSON.stringify({\n      generatedAt: batData.generatedAt,\r\n      productTitle: batData.productTitle,\r\n      technique: batData.technique,\r\n      color: batData.color,\r\n      print: this.isPrintMode() ? {\r\n        variantId: this.currentVariant && this.currentVariant.id ? String(this.currentVariant.id) : '',\r\n        format: String(this.printSelection.format || ''),\r\n        paper: String(this.printSelection.paper || ''),\r\n        sides: String(this.printSelection.sides || ''),\r\n        document: this.printDocument\r\n      } : null,\r\n      grouped_entries: batData.entries.map(function (entry) {\r\n        return {\r\n          type: entry.type,\r\n          view: entry.view,\r\n          zoneId: entry.zoneId,\r\n          zoneLabel: entry.zoneLabel,\r\n          zoneWidthCm: entry.zoneWidthCm,\r\n          zoneHeightCm: entry.zoneHeightCm,\r\n          objectWidthCm: entry.objectWidthCm,\r\n          objectHeightCm: entry.objectHeightCm,\r\n          croppedWidthCm: entry.croppedWidthCm,\r\n          croppedHeightCm: entry.croppedHeightCm,\r\n          text: entry.text,\r\n          textStyles: Array.isArray(entry.textStyles)\r\n            ? entry.textStyles.map(function (styleItem) {\r\n                return {\r\n                  text: styleItem && styleItem.text ? String(styleItem.text) : '',\r\n                  color: styleItem && styleItem.color ? String(styleItem.color) : '',\r\n                  colorLabel: styleItem && styleItem.colorLabel ? String(styleItem.colorLabel) : '',\r\n                  font: styleItem && styleItem.font ? String(styleItem.font) : ''\r\n                };\r\n              })\r\n            : []\r\n        };\r\n      }),\r\n      entries: (Array.isArray(batData.rawEntries) ? batData.rawEntries : []).map(function (entry) {\r\n        return {\r\n          type: entry.type,\r\n          view: entry.view,\r\n          zoneId: entry.zoneId,\r\n          zoneLabel: entry.zoneLabel,\r\n          zoneWidthCm: entry.zoneWidthCm,\r\n          zoneHeightCm: entry.zoneHeightCm,\r\n          objectWidthCm: entry.objectWidthCm,\r\n          objectHeightCm: entry.objectHeightCm,\r\n          text: entry.text,\r\n          color: entry.color,\r\n          colorLabel: entry.colorLabel,\r\n          font: entry.font\r\n        };\r\n      })\r\n    }) : '';\n\r\n    const available = this.getAvailableSizeVariants();\r\n    const variantCatalog = Array.isArray(this.config.variants) ? this.config.variants : [];\r\n    const variantPriceById = variantCatalog.reduce(function (acc, variant) {\r\n      const key = String(variant && variant.id ? variant.id : '');\r\n      if (!key) return acc;\r\n      acc[key] = Math.max(0, Math.round(Number(variant.price) || 0));\r\n      return acc;\r\n    }, {});\r\n    const personalizationGroupId =\n      this.isCartEditMode()\n        ? String(this.cartEditContext.groupId || '')\n        : this.assistancePending?.batId && this.assistanceProjectSnapshot === this.buildCartEditStateSnapshot()\n          ? this.assistancePending.customGroupId\n        : this.isPrintMode()\n          ? 'PRINT-' + String(Date.now()) + '-' + Math.random().toString(36).slice(2, 9).toUpperCase()\r\n          : generateCustomGroupId();\r\n    this.storeVariantStockCacheForCart();\r\n    const items = available\r\n      .map(\r\n        function (item) {\n          const qty = this.getSizeQuantityByVariantId(item.id);\n          if (!qty) return null;\n          const properties = hasPersonalization\n            ? {\n                personnalisation: batSummary,\n                _custom_group_id: personalizationGroupId,\n                _personalization_group: personalizationGroupId,\n                _personalized_product: 'true',\n                _pz_base_price_cents: String(Math.max(0, Math.round(Number(variantPriceById[String(item.id)]) || 0))),\n                _pz_technique_price_cents: String(Math.max(0, Math.round(Number(techniquePrice) || 0))),\n                _pz_zone_price_cents: String(Math.max(0, Math.round(Number(zonePrice) || 0))),\n                _selected_technique: selectedTechnique,\n                _selected_zone: selectedZone,\n                _selected_zones: selectedZones,\n                _print_format: this.isPrintMode() ? String(this.printSelection.format || '') : undefined,\n                _print_paper: this.isPrintMode() ? String(this.printSelection.paper || '') : undefined,\n                _print_sides: this.isPrintMode() ? String(this.printSelection.sides || '') : undefined,\n                _print_variant_id: this.isPrintMode() && this.currentVariant ? String(this.currentVariant.id || '') : undefined,\n                _print_config_version: this.isPrintMode() && this.printConfig ? String(this.printConfig.version || 1) : undefined,\n                _orion_line_role: this.isPrintMode() ? 'print_main' : undefined\n              }\n            : this.isSplitVariantQuantityMode()\n              ? { _custom_group_id: personalizationGroupId }\n              : {};\n          return {\n            id: String(item.id),\n            quantity: qty,\n            properties: properties\n          };\n        }.bind(this)\r\n      )\r\n      .filter(Boolean);\r\n\r\n    let feeItems = this.isPrintMode()\n      ? selectedPrintOptions.map(function (option) {\r\n          return {\r\n            id: String(option.variantId),\r\n            quantity: option.quantityMode === 'fixed' ? 1 : selectedTotal,\r\n            properties: {\r\n              ligne: option.displayLabel || option.variantTitle,\r\n              _custom_group_id: personalizationGroupId,\r\n              _personalization_group: personalizationGroupId,\r\n              _personalization_fee: 'true',\r\n              _print_option: 'true',\r\n              _print_option_key: option.key,\r\n              _print_option_label: option.displayLabel || option.variantTitle,\r\n              _print_option_quantity_mode: option.quantityMode,\r\n              _orion_line_role: 'print_option',\r\n              _option_product_handle: option.optionProductHandle,\r\n              _option_variant_sku: option.optionVariantSku,\r\n              _selected_technique: String((option.association && (option.association.optionType || option.association.option_type)) || option.displayLabel || ''),\r\n              _selected_zone: String((option.association && (option.association.zone || option.association.zoneKey || option.association.zone_key)) || ''),\r\n              _fee_variant_title: String(option.technicalVariantTitle || option.variantTitle || ''),\r\n              _fee_zone_label: String((option.association && (option.association.zoneLabel || option.association.zone_label)) || '')\r\n            }\r\n          };\r\n        })\r\n      : this.buildTechniqueFeeItems({\r\n          techniqueId: selectedTechnique,\r\n          quantity: selectedTotal,\r\n          personalizationGroupId: personalizationGroupId,\r\n          usedZoneIds: Array.from(new Set(usedZoneIds.filter(Boolean)))\n        });\n\n    const configuredFeeHandle = String(this.selectedTechnique && this.selectedTechnique.feeProductHandle || '').trim();\n    if (!this.isPrintMode() && configuredFeeHandle && usedZoneIds.length && !feeItems.length) {\n      const configuredFeeSku = String(this.selectedTechnique && this.selectedTechnique.feeVariantSku || '').trim();\n      window.alert(\n        configuredFeeSku\n          ? 'Le variant de frais SKU \"' + configuredFeeSku + '\" est introuvable ou indisponible dans \"' + configuredFeeHandle + '\".'\n          : 'Le produit de frais \"' + configuredFeeHandle +\n            '\" doit contenir exactement un variant disponible tant qu\\'aucun SKU n\\'est configure.'\n      );\n      return;\n    }\n\n    const personalizationFeeTotalCents = feeItems.reduce(\n      function (total, item) {\r\n        const variant = this.getFeeVariantById(item && item.id ? item.id : '');\r\n        const unitPrice = Math.max(0, Math.round(Number(variant && variant.price) || 0));\r\n        const quantity = Math.max(0, Math.floor(Number(item && item.quantity) || 0));\r\n        return total + unitPrice * quantity;\r\n      }.bind(this),\r\n      0\r\n    );\r\n\r\n    if (personalizationFeeTotalCents > 0 && !feeItems.length) {\r\n      const techniqueLabel = this.selectedTechnique && this.selectedTechnique.label ? String(this.selectedTechnique.label) : 'cette technique';\r\n      window.alert('Les frais de personnalisation pour ' + techniqueLabel + \" ne sont pas encore configures.\");\r\n      return;\r\n      if (!feeOneEuroVariantId || !feeOneCentVariantId) {\r\n        window.alert(\"Les variantes de frais de personnalisation ne sont pas configur\u00E9es.\");\r\n        return;\r\n      }\r\n\r\n      const eurosQty = Math.floor(personalizationFeeTotalCents / 100);\r\n      const centsQty = personalizationFeeTotalCents % 100;\r\n\r\n      if (eurosQty > 0) {\r\n        feeItems.push({\r\n          id: feeOneEuroVariantId,\r\n          quantity: eurosQty,\r\n          properties: {\r\n            ligne: 'Frais de personnalisation',\r\n            _custom_group_id: personalizationGroupId,\r\n            _personalization_group: personalizationGroupId,\r\n            _personalization_fee: 'true'\r\n          }\r\n        });\r\n      }\r\n\r\n      if (centsQty > 0) {\r\n        feeItems.push({\r\n          id: feeOneCentVariantId,\r\n          quantity: centsQty,\r\n          properties: {\r\n            ligne: 'Frais de personnalisation',\r\n            _custom_group_id: personalizationGroupId,\r\n            _personalization_group: personalizationGroupId,\r\n            _personalization_fee: 'true'\r\n          }\r\n        });\r\n      }\r\n    }\r\n\r\n    if (!items.length) {\r\n      this.setControlsPanel('sizes');\r\n      return;\r\n    }\r\n\r\n    const self = this;\r\n    const routesRoot =\r\n      window.Shopify && window.Shopify.routes && typeof window.Shopify.routes.root === 'string'\r\n        ? window.Shopify.routes.root\r\n        : '/';\r\n    const cartAddUrl = routesRoot + 'cart/add.js';\r\n    const cartUpdateUrl = routesRoot + 'cart/update.js';\r\n    this.setCartSubmissionLoading(true, hasPersonalization ? 'Pr\u00E9paration de votre BAT\u2026' : 'Ajout au panier\u2026');\n    var chain = Promise.resolve();\n    if (hasPersonalization) {\n      chain = chain.then(function () {\n        if (self.assistancePending?.batId && self.assistancePending.customGroupId === personalizationGroupId &&\n            self.assistanceProjectSnapshot === self.buildCartEditStateSnapshot()) return self.assistancePending.batId;\n        return self.uploadPersonalizationBat({\n          customGroupId: personalizationGroupId,\n          variantId: items[0] && items[0].id,\n          personalizationConfig: {\n            version: 1, personalizationJson: JSON.parse(personalizationJson), batPayload: JSON.parse(batPayload),\n            technique: selectedTechnique, selectedZone: selectedZone, selectedZones: JSON.parse(selectedZones),\n            printOptions: selectedPrintOptions.map(function (option) { return option.key; }),\n            printSelection: self.isPrintMode() ? self.printSelection : null\n          }\n        });\n      }).then(function (batUploadId) {\n        items.forEach(function (item) {\n          item.properties._bat_upload_id = batUploadId;\n          item.properties._personalization_config_id = batUploadId;\n        });\n        return self.storeCartGroupPreviewImages(personalizationGroupId);\n      });\n    }\n\r\n    const wasCartEditMode = this.isCartEditMode();\r\n    if (wasCartEditMode) {\r\n      const existingGroupId = String(this.cartEditContext.groupId || '');\r\n      chain = chain.then(function () {\r\n        return fetch(routesRoot + 'cart.js', {\r\n          headers: { Accept: 'application/json' }\r\n        }).then(function (response) {\r\n          if (!response.ok) throw new Error('HTTP ' + String(response.status || 0));\r\n          return response.json();\r\n        }).then(function (cart) {\r\n          const updates = {};\r\n          (cart.items || []).forEach(function (line) {\r\n            if (!line || !line.properties) return;\r\n            if (String(line.properties._custom_group_id || line.properties._personalization_group || '') !== existingGroupId) return;\r\n            if (line.key) updates[String(line.key)] = 0;\r\n          });\r\n          if (!Object.keys(updates).length) return null;\r\n          return fetch(cartUpdateUrl, {\r\n            method: 'POST',\r\n            headers: {\r\n              'Content-Type': 'application/json',\r\n              Accept: 'application/json'\r\n            },\r\n            body: JSON.stringify({ updates: updates })\r\n          }).then(function (response) {\r\n            if (response.ok) return response.json();\r\n            throw new Error(\"Impossible d'actualiser le panier pour le moment.\");\r\n          });\r\n        });\r\n      });\r\n    }\r\n\r\n    chain = chain.then(function () {\r\n      return fetch(cartAddUrl, {\r\n        method: 'POST',\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n          Accept: 'application/json'\r\n        },\r\n        body: JSON.stringify({\r\n          items: items.concat(feeItems).map(function (item) {\r\n            return {\r\n              id: item.id,\r\n              quantity: item.quantity,\r\n              properties: window.OrionPersonalizationStore.compactProperties(item.properties)\r\n            };\r\n          })\r\n        })\r\n      }).then(function (response) {\r\n        if (response.ok) return response.json();\r\n        return response\r\n          .json()\r\n          .catch(function () {\r\n            return {};\r\n          })\r\n          .then(function (payload) {\r\n            const baseMessage =\r\n              payload && payload.description ? payload.description : \"Impossible d'ajouter au panier pour le moment.\";\r\n            const message = baseMessage + ' (HTTP ' + String(response.status || 0) + ')';\r\n            throw new Error(message);\r\n          });\r\n      });\r\n    });\r\n\r\n    chain\r\n      .then(function () {\r\n        self.cartEditContext = null;\r\n        self.cartEditInitialStateSnapshot = '';\r\n        self.syncCartEditUi();\r\n        if (wasCartEditMode) self.resolveCartSuccessModal('go-cart');\r\n        else self.openCartSuccessModal();\r\n      })\r\n      .catch(function (error) {\r\n        const message = error && error.message\n          ? error.message\n          : hasPersonalization\n            ? \"Le BAT n'a pas pu \u00EAtre enregistr\u00E9. Veuillez r\u00E9essayer avant d'ajouter votre produit au panier.\"\n            : \"Le produit n'a pas pu \u00EAtre ajout\u00E9 au panier. Veuillez r\u00E9essayer.\";\n        window.alert(message);\r\n      })\r\n      .finally(function () {\r\n        self.setCartSubmissionLoading(false);\r\n      });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.removePersonalizationInputs = function () {\r\n    const oldInputs = this.form.querySelectorAll('input[data-personalizer-property=\"true\"]');\r\n    oldInputs.forEach(function (input) {\r\n      input.remove();\r\n    });\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.addPropertyInput = function (key, value) {\r\n    const input = document.createElement('input');\r\n    input.type = 'hidden';\r\n    input.name = 'properties[' + key + ']';\r\n    input.value = value || '';\r\n    input.setAttribute('data-personalizer-property', 'true');\r\n    this.form.appendChild(input);\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.open = function () {\r\n    if (this.closeTimeout) {\r\n      window.clearTimeout(this.closeTimeout);\r\n      this.closeTimeout = null;\r\n    }\r\n\r\n    this.syncFromProductState();\r\n    if (!this.canOpenConfiguredPrintCanvas()) return;\r\n    this.closeFlyout();\r\n    if (this.canvasEngine && typeof this.canvasEngine.clearSelection === 'function') {\r\n      this.canvasEngine.clearSelection();\r\n    }\r\n    this.selectedDesignObject = null;\r\n    this.selectedDesignKind = '';\r\n    this.setControlsPanel('default');\r\n    this.syncSizeQuantitiesWithAvailableVariants();\r\n    this.renderSizesUi();\r\n    this.renderImpressionsUi();\r\n    this.syncDimensionsToolUi();\r\n    this.syncBatPdfToolUi();\r\n    this.syncCartEditUi();\r\n    this.modal.classList.remove('hidden');\r\n    this.modal.setAttribute('aria-hidden', 'false');\r\n    this.lockBodyScroll();\r\n    this.enableZoomLock();\r\n\r\n    window.requestAnimationFrame(\r\n      function () {\r\n        this.modal.classList.add('is-open');\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  PersonalizerModalApp.prototype.close = function (options) {\r\n    const settings = options || {};\r\n    const forceClose = settings.force === true;\r\n    if (!forceClose && this.hasUnsavedCartEditChanges()) {\r\n      this.openCartEditCloseConfirm();\r\n      return;\r\n    }\r\n    if (!forceClose && !this.isCartEditMode()) {\r\n      this.openAbandonConfirm();\r\n      return;\r\n    }\r\n    this.closeFlyout();\r\n    if (this.modal) this.modal.querySelector('.personalizer-modal__content')?.classList.remove('is-technique-confirm-open');\r\n    if (this.techniqueConfirmModal) this.techniqueConfirmModal.classList.add('is-hidden');\r\n    if (this.entryDisclaimerModal) this.entryDisclaimerModal.classList.add('is-hidden');\r\n    if (this.cartSuccessModal) this.cartSuccessModal.classList.add('is-hidden');\r\n    if (this.abandonConfirmModal) this.abandonConfirmModal.classList.add('is-hidden');\r\n    if (this.cartEditCloseConfirmModal) this.cartEditCloseConfirmModal.classList.add('is-hidden');\r\n    if (this.previewModal) this.previewModal.classList.add('is-hidden');\r\n    if (this.previewBatInfoModal) this.previewBatInfoModal.classList.add('is-hidden');\r\n    if (this.zoneInfoModal) this.zoneInfoModal.classList.add('is-hidden');\r\n    this.pendingTechniqueChange = null;\r\n    this.modal.classList.remove('is-open');\r\n    this.modal.setAttribute('aria-hidden', 'true');\r\n    this.modal.style.setProperty('--pz-mobile-keyboard-offset', '0px');\r\n    this.disableZoomLock();\r\n    this.unlockBodyScroll();\r\n\r\n    this.closeTimeout = window.setTimeout(\r\n      function () {\r\n        this.modal.classList.add('hidden');\r\n        this.closeTimeout = null;\r\n      }.bind(this),\r\n      200\r\n    );\r\n  };\r\n\r\n  window.PersonalizerModalApp = PersonalizerModalApp;\r\n})();\r\n\r\n"],
  "mappings": "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",
  "names": ["quantityLabel", "unitFinal", "document", "summary", "count"]
}
