{
  "version": 3,
  "sources": ["/cdn/shop/t/49/assets/realfut-nano-customizer.js?rfv=29"],
  "sourcesContent": ["(() => {\n  const VERSION = '29';\n  const WIDTH = 330;\n  const HEIGHT = 460;\n  const EXPORT_WIDTH = 2000;\n  const EXPORT_HEIGHT = 1413;\n  const GREEN = '#10b981';\n  const DESIGN_PROPERTY = 'Dise\\u00F1o personalizado';\n  const SIZE_PROPERTY = 'Talla';\n\n  const MODEL_CONFIG = {\n    NANO: {\n      crop: { left: 33, top: 60, width: 264, height: 340 },\n      logo: { left: 165, top: 365, width: 82 },\n      export: {\n        left: { x: 130, y: 150, width: 830, height: 1070 },\n        right: { x: 1030, y: 150, width: 830, height: 1070 },\n      },\n    },\n    ARMOUR: {\n      // Includes the complete original Armour contour plus a small transparent\n      // margin, so neither side is trimmed in the HD file.\n      crop: { left: 18, top: 12, width: 294, height: 436 },\n      // leftBySide centra el logo en cada silueta (son asim\\u00E9tricas): la\n      // izquierda cae un poco a la izquierda y la derecha un poco a la derecha.\n      logo: { left: 165, top: 390, width: 92, leftBySide: { left: 156, right: 174 } },\n      export: {\n        left: { x: 100, y: 80, width: 840, height: 1250 },\n        right: { x: 1060, y: 80, width: 840, height: 1250 },\n      },\n    },\n    CARBON: {\n      // Conserva la forma exacta de la plantilla Carbon en talla \\u00FAnica y\n      // utiliza el mismo lienzo HD del personalizador.\n      crop: { left: 18, top: 12, width: 294, height: 436 },\n      logo: { left: 165, top: 390, width: 92, leftBySide: { left: 171, right: 165 } },\n      export: {\n        left: { x: 100, y: 80, width: 840, height: 1250 },\n        right: { x: 1060, y: 80, width: 840, height: 1250 },\n      },\n    },\n  };\n\n  function renderResetIcon(ctx, left, top, _styleOverride, fabricObject) {\n    const size = 24;\n    ctx.save();\n    ctx.translate(left, top);\n    ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle));\n    ctx.beginPath();\n    ctx.arc(0, 0, size / 2, 0, Math.PI * 2);\n    ctx.fillStyle = GREEN;\n    ctx.fill();\n    ctx.strokeStyle = '#ffffff';\n    ctx.lineWidth = 2;\n    ctx.lineCap = 'round';\n    ctx.beginPath();\n    ctx.arc(1, 0, 6, -Math.PI * 0.75, Math.PI * 0.65);\n    ctx.stroke();\n    ctx.beginPath();\n    ctx.moveTo(-6, -5);\n    ctx.lineTo(-7, 1);\n    ctx.lineTo(-1, 0);\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  function resetObject(_eventData, transform) {\n    const target = transform.target;\n    if (target._rfCustomizer) target._rfCustomizer.resetObject(target);\n    return true;\n  }\n\n  function waitForImage(src) {\n    return new Promise((resolve, reject) => {\n      const image = new Image();\n      image.crossOrigin = 'anonymous';\n      image.onload = () => resolve(image);\n      image.onerror = reject;\n      image.src = src;\n    });\n  }\n\n  function canvasToBlob(canvas) {\n    return new Promise((resolve, reject) => {\n      canvas.toBlob((blob) => blob ? resolve(blob) : reject(new Error('No se ha podido generar el archivo.')), 'image/png');\n    });\n  }\n\n  class RealfutNanoCustomizer extends HTMLElement {\n    query(selector) {\n      const local = HTMLElement.prototype.querySelector.call(this, selector);\n      if (local) return local;\n      return this.modal ? this.modal.querySelector(selector) : null;\n    }\n\n    queryAll(selector) {\n      const local = Array.from(HTMLElement.prototype.querySelectorAll.call(this, selector));\n      if (!this.modal || this.contains(this.modal)) return local;\n      return local.concat(Array.from(this.modal.querySelectorAll(selector)));\n    }\n\n    async connectedCallback() {\n      if (this.initialized || this.initializing) return;\n      this.dataset.runtimeVersion = VERSION;\n\n      if (!window.fabric) {\n        this.fabricAttempts = (this.fabricAttempts || 0) + 1;\n        if (this.fabricAttempts <= 100) {\n          window.setTimeout(() => this.connectedCallback(), 50);\n          return;\n        }\n        const launcher = this.query('[data-action=\"open-modal\"]');\n        if (launcher) launcher.disabled = true;\n        this.setStatus('No se ha podido cargar el editor. Recarga la p\\u00E1gina.', true);\n        return;\n      }\n\n      this.initializing = true;\n\n      try {\n        const [maskLeft, maskRight, outlineLeft, outlineRight] = await Promise.all([\n          waitForImage(this.dataset.maskLeftUrl),\n          waitForImage(this.dataset.maskRightUrl),\n          waitForImage(this.dataset.outlineLeftUrl),\n          waitForImage(this.dataset.outlineRightUrl),\n        ]);\n        this.shapeAssets = {\n          left: { mask: maskLeft, outline: outlineLeft },\n          right: { mask: maskRight, outline: outlineRight },\n        };\n      } catch (error) {\n        console.error(error);\n        const launcher = this.query('[data-action=\"open-modal\"]');\n        if (launcher) launcher.disabled = true;\n        this.setStatus(`No se ha podido cargar la plantilla ${this.dataset.modelName || 'de espinilleras'}. Recarga la p\\u00E1gina.`, true);\n        this.initializing = false;\n        return;\n      }\n\n      this.initialized = true;\n      this.initializing = false;\n\n      this.formId = this.dataset.productFormId;\n      this.model = ['ARMOUR', 'CARBON'].includes(this.dataset.model) ? this.dataset.model : 'NANO';\n      this.modelName = this.dataset.modelName || this.model;\n      this.modelConfig = MODEL_CONFIG[this.model];\n      this.selectedSize = this.model === 'ARMOUR'\n        ? ''\n        : this.model === 'CARBON'\n          ? '\\u00DAnica \\u00B7 16,3 \\u00D7 8,9 cm'\n          : '\\u00DAnica';\n      this.currentAvailable = this.dataset.available === 'true';\n      this.activeSide = 'left';\n      this.currentStep = this.model === 'ARMOUR' ? 1 : 2;\n      this.logoColor = 'black';\n      this.orderBlob = null;\n      this.orderFilename = '';\n      this.baseScale = new WeakMap();\n      this.canvases = {};\n      this.layers = {};\n      this.logoLoads = {};\n      this.logoReady = { left: false, right: false };\n      this.layerSequence = 0;\n      this.liveTextObjects = { left: null, right: null };\n      this.variants = this.readVariants();\n\n      this.configureFabricControls();\n      this.canvases.left = this.createCanvas(this.query('canvas[id*=\"left\"]'), 'left');\n      this.canvases.right = this.createCanvas(this.query('canvas[id*=\"right\"]'), 'right');\n      this.loadLogo('left');\n      this.loadLogo('right');\n      this.modal = this.query('[data-modal]');\n      this.launcher = this.query('[data-action=\"open-modal\"]');\n      this.bindUI();\n      this.mountModalAtDocumentRoot();\n      this.syncCanvasDisplaySize();\n      this.updateSelectionPanel(null);\n      this.updateStepUI();\n      this.updateProgress();\n      this.renderLayers();\n      document.body.classList.add('rf-nano-customizer-ready');\n    }\n\n    mountModalAtDocumentRoot() {\n      if (!this.modal || this.modal.parentElement === document.body) return;\n      document.body.appendChild(this.modal);\n    }\n\n    configureFabricControls() {\n      fabric.Object.prototype.transparentCorners = false;\n      fabric.Object.prototype.cornerColor = GREEN;\n      fabric.Object.prototype.cornerStrokeColor = '#ffffff';\n      fabric.Object.prototype.cornerStyle = 'circle';\n      fabric.Object.prototype.cornerSize = 22;\n      fabric.Object.prototype.touchCornerSize = 48;\n      fabric.Object.prototype.borderColor = GREEN;\n      fabric.Object.prototype.borderScaleFactor = 2;\n      fabric.Object.prototype.padding = 9;\n      fabric.Object.prototype.centeredScaling = true;\n      fabric.Object.prototype.controls.mtr.offsetY = -34;\n      fabric.Object.prototype.controls.mtr.withConnection = true;\n      fabric.Object.prototype.controls.resetControl = new fabric.Control({\n        x: -0.5,\n        y: -0.5,\n        offsetX: -18,\n        offsetY: -18,\n        cursorStyle: 'pointer',\n        mouseUpHandler: resetObject,\n        render: renderResetIcon,\n        cornerSize: 34,\n      });\n\n      // Fabric normally draws and hit-tests a control at the real corner of\n      // the object. When a photo is enlarged beyond the canvas, those points\n      // end up outside the interactive area and the user cannot reduce it\n      // again. Keep the REAL Fabric controls inside the canvas so they remain\n      // visible and draggable at every zoom level (desktop and mobile).\n      Object.values(fabric.Object.prototype.controls).forEach((control) => {\n        if (!control || control.rfViewportClamped) return;\n        const originalPositionHandler = control.positionHandler;\n        if (typeof originalPositionHandler !== 'function') return;\n\n        control.positionHandler = function rfVisibleControlPosition(dim, finalMatrix, object, currentControl) {\n          const point = originalPositionHandler.call(this, dim, finalMatrix, object, currentControl);\n          const canvas = object?.canvas;\n          if (!point || !canvas || object.rfRole !== 'user') return point;\n\n          const margin = Math.max(13, (Number(this.cornerSize) || 22) / 2 + 2);\n          const maxX = Math.max(margin, canvas.getWidth() - margin);\n          const maxY = Math.max(margin, canvas.getHeight() - margin);\n          return new fabric.Point(\n            Math.max(margin, Math.min(maxX, point.x)),\n            Math.max(margin, Math.min(maxY, point.y)),\n          );\n        };\n        control.rfViewportClamped = true;\n      });\n    }\n\n    logoLeftFor(side) {\n      const s = this.modelConfig.logo;\n      if (s.leftBySide && s.leftBySide[side] != null) return s.leftBySide[side];\n      return s.left;\n    }\n\n    createShapeImage(side, type, options = {}) {\n      const source = this.shapeAssets[side][type];\n      const sourceWidth = source.naturalWidth || source.width || WIDTH;\n      const sourceHeight = source.naturalHeight || source.height || HEIGHT;\n      return new fabric.Image(source, {\n        left: 0,\n        top: 0,\n        scaleX: WIDTH / sourceWidth,\n        scaleY: HEIGHT / sourceHeight,\n        selectable: false,\n        evented: false,\n        objectCaching: false,\n        ...options,\n      });\n    }\n\n    createClipPath(side) {\n      return this.createShapeImage(side, 'mask', {\n        absolutePositioned: true,\n      });\n    }\n\n    createCanvas(element, side) {\n      const canvas = new fabric.Canvas(element, {\n        width: WIDTH,\n        height: HEIGHT,\n        preserveObjectStacking: true,\n        selection: false,\n        allowTouchScrolling: false,\n        stopContextMenu: true,\n      });\n\n      // La zona segura es una gu\u00EDa de interfaz colocada sobre el canvas. Al\n      // no ser un objeto Fabric, nunca se incluye en el PNG de producci\u00F3n.\n      const safeGuideUrl = side === 'right' ? this.dataset.safeRightUrl : this.dataset.safeLeftUrl;\n      if (safeGuideUrl && canvas.wrapperEl) {\n        const safeGuide = document.createElement('img');\n        safeGuide.className = 'rf-nano__safe-guide';\n        safeGuide.src = safeGuideUrl;\n        safeGuide.alt = '';\n        safeGuide.setAttribute('aria-hidden', 'true');\n        safeGuide.draggable = false;\n        canvas.wrapperEl.appendChild(safeGuide);\n      }\n\n      const background = new fabric.Rect({\n        left: 0,\n        top: 0,\n        width: WIDTH,\n        height: HEIGHT,\n        fill: '#ffffff',\n        selectable: false,\n        evented: false,\n        objectCaching: false,\n        clipPath: this.createClipPath(side),\n      });\n      background.rfRole = 'background';\n\n      const outline = this.createShapeImage(side, 'outline');\n      outline.rfRole = 'outline';\n\n      const logoSettings = this.modelConfig.logo;\n      const logoLeft = this.logoLeftFor(side);\n      const logo = new fabric.Rect({\n        left: logoLeft,\n        top: logoSettings.top,\n        originX: 'center',\n        originY: 'center',\n        width: logoSettings.width,\n        height: 27,\n        fill: 'transparent',\n        selectable: false,\n        evented: false,\n        objectCaching: false,\n      });\n      logo.rfRole = 'logo';\n\n      canvas.add(background, outline, logo);\n      this.layers[side] = { background, outline, logo };\n      this.keepFixedLayers(canvas, side);\n\n      canvas.on('mouse:down', () => this.setActiveSide(side));\n      canvas.on('selection:created', (event) => this.updateSelectionPanel(event.selected && event.selected[0]));\n      canvas.on('selection:updated', (event) => this.updateSelectionPanel(event.selected && event.selected[0]));\n      canvas.on('selection:cleared', () => this.updateSelectionPanel(null));\n      canvas.on('object:modified', (event) => {\n        this.keepUserObjectReachable(event.target);\n        this.updateMobileSelectionOutline(event.target);\n        this.markDesignChanged();\n        this.keepFixedLayers(canvas, side);\n      });\n      canvas.on('object:moving', (event) => {\n        this.keepUserObjectReachable(event.target);\n        this.updateMobileSelectionOutline(event.target);\n      });\n      canvas.on('object:scaling', (event) => {\n        this.keepUserObjectReachable(event.target);\n        this.updateMobileSelectionOutline(event.target);\n      });\n      canvas.on('object:rotating', (event) => {\n        this.keepUserObjectReachable(event.target);\n        this.updateMobileSelectionOutline(event.target);\n      });\n      canvas.on('text:changed', (event) => {\n        const object = event.target;\n        if (!object || !['name', 'text', 'number'].includes(object.rfKind)) return;\n        this.applyTextShape(object);\n        this.renderLayers();\n        this.markDesignChanged();\n      });\n\n      canvas.requestRenderAll();\n      return canvas;\n    }\n\n    syncCanvasDisplaySize() {\n      if (!this.canvases) return;\n\n      const mobile = window.matchMedia('(max-width: 989px)').matches;\n      const viewportHeight = window.visualViewport?.height || window.innerHeight || 700;\n      const viewportWidth = window.visualViewport?.width || window.innerWidth || 390;\n      const previewMode = this.currentStep === 5;\n      const displayHeight = Math.max(210, Math.min(285, Math.round(viewportHeight * 0.33)));\n      const singleWidth = Math.max(148, Math.min(204, Math.round(displayHeight * WIDTH / HEIGHT), Math.round(viewportWidth * 0.54)));\n      const previewWidth = Math.max(112, Math.min(175, Math.floor((viewportWidth - 30) / 2)));\n      const displayWidth = mobile && previewMode ? previewWidth : singleWidth;\n      const exactHeight = Math.round(displayWidth * HEIGHT / WIDTH);\n\n      Object.values(this.canvases).forEach((canvas) => {\n        if (!canvas?.wrapperEl) return;\n        const wrapper = canvas.wrapperEl;\n        const surfaces = [canvas.lowerCanvasEl, canvas.upperCanvasEl].filter(Boolean);\n\n        if (!mobile) {\n          ['width', 'height', 'max-width', 'max-height'].forEach((property) => wrapper.style.removeProperty(property));\n          surfaces.forEach((surface) => {\n            surface.style.removeProperty('width');\n            surface.style.removeProperty('height');\n            surface.style.removeProperty('max-width');\n            surface.style.removeProperty('max-height');\n          });\n          return;\n        }\n\n        wrapper.style.setProperty('width', `${displayWidth}px`, 'important');\n        wrapper.style.setProperty('height', `${exactHeight}px`, 'important');\n        wrapper.style.setProperty('max-width', `${displayWidth}px`, 'important');\n        wrapper.style.setProperty('max-height', `${exactHeight}px`, 'important');\n        surfaces.forEach((surface) => {\n          surface.style.setProperty('width', `${displayWidth}px`, 'important');\n          surface.style.setProperty('height', `${exactHeight}px`, 'important');\n          surface.style.setProperty('max-width', `${displayWidth}px`, 'important');\n          surface.style.setProperty('max-height', `${exactHeight}px`, 'important');\n        });\n      });\n\n      this.queryAll('[data-stage]').forEach((stage) => {\n        if (mobile) {\n          const stageExtra = previewMode ? 8 : 26;\n          stage.style.setProperty('width', `${displayWidth + stageExtra}px`, 'important');\n          stage.style.setProperty('max-width', `${displayWidth + stageExtra}px`, 'important');\n        } else {\n          stage.style.removeProperty('width');\n          stage.style.removeProperty('max-width');\n        }\n      });\n\n      this.updateMobileSelectionOutline(this.getSelectedObject());\n    }\n\n    updateMobileSelectionOutline(object) {\n      const outlines = this.queryAll('[data-selection-outline]');\n      outlines.forEach((outline) => { outline.hidden = true; });\n\n      if (this.currentStep === 5) return;\n      if (!object || object.rfRole !== 'user' || !object.canvas) return;\n\n      const side = object.canvas === this.canvases.right ? 'right' : 'left';\n      const outline = this.query(`[data-selection-outline=\"${side}\"]`);\n      const stage = outline?.closest('[data-stage]');\n      const wrapper = object.canvas.wrapperEl;\n      if (!outline || !stage || !wrapper || !stage.classList.contains('is-active')) return;\n\n      object.setCoords();\n      const bounds = object.getBoundingRect(true, true);\n      const stageBox = stage.getBoundingClientRect();\n      const canvasBox = wrapper.getBoundingClientRect();\n      const scaleX = canvasBox.width / WIDTH;\n      const scaleY = canvasBox.height / HEIGHT;\n      const visibleLeft = Math.max(0, Math.min(WIDTH, bounds.left));\n      const visibleTop = Math.max(0, Math.min(HEIGHT, bounds.top));\n      const visibleRight = Math.max(0, Math.min(WIDTH, bounds.left + bounds.width));\n      const visibleBottom = Math.max(0, Math.min(HEIGHT, bounds.top + bounds.height));\n\n      if (visibleRight <= visibleLeft || visibleBottom <= visibleTop) return;\n\n      const clipped = visibleLeft !== bounds.left\n        || visibleTop !== bounds.top\n        || visibleRight !== bounds.left + bounds.width\n        || visibleBottom !== bounds.top + bounds.height;\n\n      outline.style.left = `${canvasBox.left - stageBox.left + visibleLeft * scaleX}px`;\n      outline.style.top = `${canvasBox.top - stageBox.top + visibleTop * scaleY}px`;\n      outline.style.width = `${Math.max(1, (visibleRight - visibleLeft) * scaleX)}px`;\n      outline.style.height = `${Math.max(1, (visibleBottom - visibleTop) * scaleY)}px`;\n      outline.classList.toggle('is-clipped', clipped);\n      outline.classList.toggle('is-locked', Boolean(object.rfLocked));\n      outline.hidden = false;\n    }\n\n    loadLogo(side) {\n      const canvas = this.canvases[side];\n      const layer = this.layers[side];\n      if (!canvas || !layer) return Promise.resolve(false);\n      this.logoReady[side] = false;\n      const requestedColor = this.logoColor;\n      const source = requestedColor === 'white'\n        ? this.dataset.logoWhiteUrl\n        : this.dataset.logoBlackUrl;\n      if (!source) return Promise.resolve(false);\n\n      const pending = new Promise((resolve) => {\n        fabric.Image.fromURL(source, (image) => {\n          if (!image || requestedColor !== this.logoColor) {\n            resolve(false);\n            return;\n          }\n\n          const previous = layer.logo;\n          const logoSettings = this.modelConfig.logo;\n          image.set({\n            left: this.logoLeftFor(side),\n            top: logoSettings.top,\n            originX: 'center',\n            originY: 'center',\n            scaleX: logoSettings.width / image.width,\n            scaleY: logoSettings.width / image.width,\n            selectable: false,\n            evented: false,\n            objectCaching: false,\n          });\n          image.rfRole = 'logo';\n          canvas.remove(previous);\n          canvas.add(image);\n          layer.logo = image;\n          this.logoReady[side] = true;\n          this.keepFixedLayers(canvas, side);\n          this.orderBlob = null;\n          this.updateProgress();\n          resolve(true);\n        }, { crossOrigin: 'anonymous' });\n      });\n      this.logoLoads[side] = pending;\n      return pending;\n    }\n\n    keepFixedLayers(canvas, side) {\n      const layer = this.layers[side];\n      if (!layer) return;\n      canvas.sendToBack(layer.background);\n      canvas.bringToFront(layer.outline);\n      canvas.bringToFront(layer.logo);\n      canvas.requestRenderAll();\n    }\n\n    softConstrain(object) {\n      if (!object || object.rfRole !== 'user') return;\n      const margin = 120;\n      const rect = object.getBoundingRect(true, true);\n      if (rect.left > WIDTH - 30) object.left -= rect.left - (WIDTH - 30);\n      if (rect.top > HEIGHT - 30) object.top -= rect.top - (HEIGHT - 30);\n      if (rect.left + rect.width < 30) object.left += 30 - (rect.left + rect.width);\n      if (rect.top + rect.height < 30) object.top += 30 - (rect.top + rect.height);\n      object.left = Math.max(-margin, Math.min(WIDTH + margin, object.left));\n      object.top = Math.max(-margin, Math.min(HEIGHT + margin, object.top));\n    }\n\n    keepUserObjectReachable(object) {\n      if (!object || object.rfRole !== 'user') return;\n      this.softConstrain(object);\n    }\n\n    readVariants() {\n      const source = this.query('[data-variants-json]');\n      if (!source) return [];\n      try {\n        const variants = JSON.parse(source.textContent || '[]');\n        return Array.isArray(variants) ? variants : [];\n      } catch (error) {\n        console.warn('[Realfut] No se han podido leer las variantes de talla.', error);\n        return [];\n      }\n    }\n\n    variantForSize(size) {\n      const expected = String(size || '').trim().toUpperCase();\n      if (!expected) return null;\n      return this.variants.find((variant) => {\n        const candidates = [\n          variant.title,\n          variant.option1,\n          variant.option2,\n          variant.option3,\n          ...(Array.isArray(variant.options) ? variant.options : []),\n        ];\n        return candidates.some((candidate) => {\n          const value = String(candidate || '').trim().toUpperCase();\n          return value === expected || value.startsWith(`${expected}:`) || value.startsWith(`${expected} `);\n        });\n      }) || null;\n    }\n\n    selectSize(button) {\n      if (!button) return;\n      const size = button.dataset.size || '';\n      const dimensions = button.dataset.dimensions || '';\n      const explicitVariantId = button.dataset.variantId || '';\n      const variant = this.variants.find((item) => String(item.id) === explicitVariantId) || this.variantForSize(size);\n      this.selectedSize = size;\n      const sizeRow = this.query('[data-size-row]');\n      if (sizeRow) sizeRow.classList.remove('has-error');\n\n      this.queryAll('[data-size]').forEach((item) => {\n        const active = item === button;\n        item.classList.toggle('is-active', active);\n        item.setAttribute('aria-pressed', active ? 'true' : 'false');\n      });\n\n      const summary = this.query('[data-summary-size]');\n      if (summary) summary.textContent = dimensions ? `${size} \\u00B7 ${dimensions}` : size;\n      const note = this.query('[data-size-note]');\n      if (note) note.textContent = dimensions\n        ? `Talla ${size} seleccionada \\u00B7 ${dimensions}. La plantilla de dise\\u00F1o no cambia.`\n        : `Talla ${size} seleccionada.`;\n\n      if (variant || explicitVariantId) {\n        const variantId = explicitVariantId || variant.id;\n        const variantAvailable = variant\n          ? variant.available !== false\n          : button.dataset.variantAvailable !== 'false';\n        const form = document.getElementById(this.formId);\n        const variantInput = form && form.querySelector('[name=\"id\"]');\n        if (variantInput) {\n          variantInput.value = String(variantId);\n          variantInput.disabled = !variantAvailable;\n          variantInput.dispatchEvent(new Event('change', { bubbles: true }));\n        }\n        this.currentAvailable = variantAvailable;\n      } else {\n        // La talla sigue siendo obligatoria aunque el tema no exponga sus variantes en el editor.\n        this.currentAvailable = this.dataset.available === 'true';\n      }\n\n      const addButton = this.query('[data-action=\"add-to-cart\"]');\n      if (addButton) {\n        addButton.disabled = !this.currentAvailable;\n        addButton.textContent = this.currentAvailable ? 'A\\u00F1adir al carrito' : 'Agotado';\n      }\n      this.markDesignChanged();\n      this.updateStepUI();\n      this.setStatus(this.currentAvailable ? `Talla ${size} seleccionada.` : `La talla ${size} est\\u00E1 agotada.`, !this.currentAvailable);\n    }\n\n    markDesignChanged() {\n      this.orderBlob = null;\n      if (this.modal) this.updateStepUI();\n    }\n\n    bindUI() {\n      this.launcher.addEventListener('click', () => this.openModal());\n      this.queryAll('[data-action=\"close-modal\"]').forEach((button) => {\n        button.addEventListener('click', () => this.closeModal());\n      });\n\n      this.queryAll('[data-side]').forEach((button) => {\n        button.addEventListener('click', () => this.setActiveSide(button.dataset.side));\n      });\n\n      this.queryAll('[data-mobile-side]').forEach((button) => {\n        button.addEventListener('click', () => this.setActiveSide(button.dataset.mobileSide));\n      });\n\n      this.queryAll('[data-size]').forEach((button) => {\n        button.addEventListener('click', () => this.selectSize(button));\n      });\n\n      this.queryAll('[data-step-target]').forEach((button) => {\n        button.addEventListener('click', () => this.setStep(Number(button.dataset.stepTarget), false));\n      });\n\n      this.queryAll('[data-tool]').forEach((button) => {\n        button.addEventListener('click', () => this.openTool(button.dataset.tool));\n      });\n\n      this.query('[data-photo-input]').addEventListener('change', (event) => this.addPhoto(event));\n      const liveTextInput = this.query('[data-text-input]');\n      const liveTextFont = this.query('[data-text-font]');\n      const addAnotherText = this.query('[data-action=\"add-another-text\"]');\n      liveTextInput.addEventListener('input', () => {\n        this.updateLiveText(liveTextInput.value, liveTextFont.value);\n        addAnotherText.disabled = !liveTextInput.value.trim();\n      });\n      liveTextFont.addEventListener('change', () => {\n        this.updateLiveText(liveTextInput.value, liveTextFont.value);\n      });\n      addAnotherText.addEventListener('click', () => this.startAnotherText());\n\n      this.queryAll('[data-flag]').forEach((button) => {\n        button.addEventListener('click', () => this.addFlag(button.dataset.flagUrl, button.dataset.flag));\n      });\n      this.queryAll('[data-bg]').forEach((button) => {\n        button.addEventListener('click', () => this.setBackground(button.dataset.bg, button));\n      });\n      this.queryAll('[data-logo-color]').forEach((button) => {\n        button.addEventListener('click', () => this.setLogoColor(button.dataset.logoColor, button));\n      });\n      this.query('[data-action=\"delete-selected\"]').addEventListener('click', () => this.deleteSelected());\n      this.query('[data-action=\"delete-canvas-selected\"]').addEventListener('click', () => this.deleteSelected());\n      this.query('[data-action=\"toggle-lock\"]').addEventListener('click', () => this.toggleSelectedLock());\n      this.query('[data-action=\"reset-selected\"]').addEventListener('click', () => this.resetSelected());\n      this.query('[data-selected-color]').addEventListener('input', (event) => this.changeSelectedColor(event.target.value));\n      this.query('[data-selected-font]').addEventListener('change', (event) => this.changeSelectedFont(event.target.value));\n      this.query('[data-selected-zoom]').addEventListener('input', (event) => this.changeSelectedZoom(Number(event.target.value)));\n      this.query('[data-action=\"zoom-out\"]').addEventListener('click', () => this.nudgeSelectedZoom(-10));\n      this.query('[data-action=\"zoom-in\"]').addEventListener('click', () => this.nudgeSelectedZoom(10));\n      this.query('[data-action=\"download\"]').addEventListener('click', () => this.downloadDesign());\n      this.query('[data-action=\"add-to-cart\"]').addEventListener('click', () => this.submitProduct());\n      this.query('[data-action=\"step-next\"]').addEventListener('click', () => this.nextStep());\n      this.query('[data-action=\"step-back\"]').addEventListener('click', () => this.previousStep());\n      this.query('[data-layers-list]').addEventListener('click', (event) => {\n        const button = event.target.closest('[data-layer-action]');\n        if (button) this.handleLayerAction(button.dataset.layerAction, button.dataset.layerId);\n      });\n\n      this.handleDocumentKeydown = (event) => {\n        if (this.modal.hidden) return;\n        if (event.key === 'Escape') {\n          this.closeModal();\n          return;\n        }\n        const target = event.target;\n        const isTyping = target && (\n          /INPUT|TEXTAREA|SELECT/.test(target.tagName) ||\n          target.isContentEditable ||\n          target.closest?.('[contenteditable=\"true\"]')\n        );\n        if ((event.key === 'Delete' || event.key === 'Backspace') && !isTyping) {\n          const selected = this.getSelectedObject();\n          if (selected && selected.rfRole === 'user') {\n            event.preventDefault();\n            this.deleteSelected();\n          }\n        }\n      };\n      document.addEventListener('keydown', this.handleDocumentKeydown);\n      this.handleViewportResize = () => {\n        if (this.modal && !this.modal.hidden) {\n          if (window.matchMedia('(max-width: 989px)').matches) this.lockMobileViewport();\n          else this.unlockMobileViewport();\n        }\n        this.syncCanvasDisplaySize();\n        Object.values(this.canvases || {}).forEach((canvas) => {\n          canvas.calcOffset();\n          canvas.requestRenderAll();\n        });\n      };\n      window.addEventListener('resize', this.handleViewportResize, { passive: true });\n      if (window.visualViewport) window.visualViewport.addEventListener('resize', this.handleViewportResize, { passive: true });\n    }\n\n    disconnectedCallback() {\n      if (this.handleDocumentKeydown) document.removeEventListener('keydown', this.handleDocumentKeydown);\n      if (this.handleViewportResize) window.removeEventListener('resize', this.handleViewportResize);\n      if (this.handleViewportResize && window.visualViewport) window.visualViewport.removeEventListener('resize', this.handleViewportResize);\n      document.body.classList.remove('rf-nano-modal-open');\n      document.documentElement.classList.remove('rf-nano-modal-open');\n      this.unlockMobileViewport();\n      if (this.modal && this.modal.parentElement === document.body) this.modal.remove();\n    }\n\n    lockMobileViewport() {\n      if (!window.matchMedia('(max-width: 989px)').matches || this.mobileViewportLocked) return;\n      let viewport = document.querySelector('meta[name=\"viewport\"]');\n      this.createdViewportMeta = !viewport;\n      if (!viewport) {\n        viewport = document.createElement('meta');\n        viewport.name = 'viewport';\n        document.head.appendChild(viewport);\n      }\n      this.viewportMeta = viewport;\n      this.viewportMetaOriginalContent = viewport.getAttribute('content');\n      viewport.setAttribute('content', 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover');\n\n      this.preventPageZoom = (event) => {\n        if ((event.touches && event.touches.length > 1) || event.type === 'gesturestart' || event.type === 'gesturechange') {\n          event.preventDefault();\n        }\n      };\n      document.addEventListener('touchmove', this.preventPageZoom, { passive: false });\n      document.addEventListener('gesturestart', this.preventPageZoom, { passive: false });\n      document.addEventListener('gesturechange', this.preventPageZoom, { passive: false });\n      this.mobileViewportLocked = true;\n    }\n\n    unlockMobileViewport() {\n      if (!this.mobileViewportLocked) return;\n      document.removeEventListener('touchmove', this.preventPageZoom);\n      document.removeEventListener('gesturestart', this.preventPageZoom);\n      document.removeEventListener('gesturechange', this.preventPageZoom);\n      if (this.viewportMeta) {\n        if (this.createdViewportMeta) this.viewportMeta.remove();\n        else if (this.viewportMetaOriginalContent == null) this.viewportMeta.removeAttribute('content');\n        else this.viewportMeta.setAttribute('content', this.viewportMetaOriginalContent);\n      }\n      this.mobileViewportLocked = false;\n      this.preventPageZoom = null;\n      this.viewportMeta = null;\n    }\n\n    openModal() {\n      this.mountModalAtDocumentRoot();\n      this.modal.hidden = false;\n      document.body.classList.add('rf-nano-modal-open');\n      document.documentElement.classList.add('rf-nano-modal-open');\n      this.lockMobileViewport();\n      this.setStep(this.model === 'ARMOUR' ? 1 : 2);\n      this.syncCanvasDisplaySize();\n      requestAnimationFrame(() => {\n        this.syncCanvasDisplaySize();\n        Object.values(this.canvases).forEach((canvas) => {\n          canvas.calcOffset();\n          canvas.requestRenderAll();\n        });\n        const closeButton = this.query('.rf-nano__modal-bar [data-action=\"close-modal\"]');\n        if (closeButton) closeButton.focus();\n      });\n    }\n\n    closeModal() {\n      this.modal.hidden = true;\n      document.body.classList.remove('rf-nano-modal-open');\n      document.documentElement.classList.remove('rf-nano-modal-open');\n      this.unlockMobileViewport();\n      if (this.launcher) this.launcher.focus();\n    }\n\n    sizeIsReady() {\n      return this.model !== 'ARMOUR' || Boolean(this.selectedSize);\n    }\n\n    setStep(step) {\n      const firstStep = this.model === 'ARMOUR' ? 1 : 2;\n      const target = Math.max(firstStep, Math.min(5, Number(step) || firstStep));\n      this.currentStep = target;\n      this.updateStepUI();\n      this.setStatus('');\n      if (window.matchMedia('(max-width: 989px)').matches) {\n        const editor = this.query('.rf-nano__editor');\n        if (editor) editor.scrollTop = 0;\n      }\n      requestAnimationFrame(() => {\n        this.syncCanvasDisplaySize();\n        Object.values(this.canvases).forEach((canvas) => {\n          canvas.calcOffset();\n          canvas.requestRenderAll();\n        });\n        const editor = this.query('.rf-nano__editor');\n        if (editor && window.innerWidth < 990) editor.scrollTo({ top: 0, behavior: 'smooth' });\n      });\n      return true;\n    }\n\n    nextStep() {\n      if (this.currentStep < 5) this.setStep(this.currentStep + 1);\n    }\n\n    previousStep() {\n      const firstStep = this.model === 'ARMOUR' ? 1 : 2;\n      if (this.currentStep > firstStep) this.setStep(this.currentStep - 1);\n    }\n\n    updateStepUI() {\n      if (!this.modal) return;\n      const step = this.currentStep || 1;\n      this.modal.dataset.currentStep = String(step);\n      this.modal.dataset.model = this.model;\n\n      this.queryAll('[data-step-target]').forEach((button) => {\n        const number = Number(button.dataset.stepTarget);\n        if (this.model !== 'ARMOUR' && number === 1) {\n          button.hidden = true;\n          return;\n        }\n        const isCurrent = number === step;\n        button.classList.toggle('is-current', isCurrent);\n        button.classList.remove('is-complete');\n        button.setAttribute('aria-current', isCurrent ? 'step' : 'false');\n        button.disabled = false;\n        const marker = button.querySelector('.rf-nano__step-number');\n        if (marker) marker.textContent = button.dataset.stepDisplay || String(number);\n      });\n\n      const headings = {\n        1: 'Selecciona la talla',\n        2: 'A\\u00F1ade una foto',\n        3: 'Texto o dorsal',\n        4: 'Bandera, color y logo',\n        5: 'Previsualiza y compra',\n      };\n      const helps = {\n        1: this.model === 'ARMOUR' ? 'Elige S, M o L. Las espinilleras permanecen visibles mientras personalizas.' : 'Este modelo utiliza talla \\u00FAnica.',\n        2: 'Sube una imagen y col\\u00F3cala en la espinillera activa.',\n        3: 'Escribe un nombre, una frase o un dorsal. Aparecer\\u00E1 directamente en la espinillera.',\n        4: 'A\\u00F1ade una bandera, elige el color de fondo y selecciona el color del logo REALF\\u00DAT.',\n        5: 'Revisa ambas espinilleras y, cuando est\\u00E9n listas, desc\\u00E1rgalas o a\\u00F1\\u00E1delas al carrito.',\n      };\n      const heading = this.query('[data-step-heading]');\n      const help = this.query('[data-step-help]');\n      if (heading) heading.textContent = headings[step];\n      if (help) help.textContent = helps[step];\n\n      this.queryAll('[data-step-section]').forEach((section) => {\n        const visible = section.dataset.stepSection === 'size' ? step === 1 : step >= 2;\n        section.hidden = !visible;\n      });\n\n      const tools = { 2: 'photo', 3: 'text', 4: 'flag' };\n      this.openTool(tools[step] || null);\n      if (step === 4) {\n        const backgroundPanel = this.query('[data-panel=\"background\"]');\n        if (backgroundPanel) {\n          backgroundPanel.hidden = false;\n          backgroundPanel.classList.add('is-active');\n        }\n      }\n      const logoStep = this.query('[data-logo-step]');\n      if (logoStep) logoStep.hidden = step !== 4;\n\n      const canvasInstruction = this.query('[data-canvas-instruction]');\n      if (canvasInstruction) canvasInstruction.textContent = step === 5 ? 'Previsualizaci\\u00F3n final' : `Editando espinillera ${this.activeSide === 'right' ? 'derecha' : 'izquierda'}`;\n\n      const navigation = this.query('[data-step-navigation]');\n      const finalActions = this.query('[data-final-actions]');\n      if (navigation) navigation.hidden = step === 5;\n      if (finalActions) finalActions.hidden = step !== 5;\n      const back = this.query('[data-action=\"step-back\"]');\n      const next = this.query('[data-action=\"step-next\"]');\n      if (back) back.hidden = step === (this.model === 'ARMOUR' ? 1 : 2);\n      if (next) {\n        const labels = {\n          1: 'Continuar con la foto',\n          2: 'Continuar con texto o dorsal',\n          3: 'Continuar con bandera, color y logo',\n          4: 'Previsualizar y comprar',\n        };\n        next.textContent = labels[step] || 'Continuar';\n      }\n\n      if (step === 5) {\n        Object.values(this.canvases).forEach((canvas) => canvas.discardActiveObject().requestRenderAll());\n        this.updateSelectionPanel(null);\n      }\n\n      this.queryAll('[data-stage]').forEach((stage) => {\n        const active = stage.dataset.stage === this.activeSide;\n        stage.classList.toggle('is-preview', step === 5);\n        stage.classList.toggle('is-step-active', step !== 5 && active);\n        stage.classList.toggle('is-step-muted', step !== 5 && !active);\n      });\n      this.updateProgress();\n    }\n\n    setActiveSide(side) {\n      this.activeSide = side;\n      this.queryAll('[data-side]').forEach((button) => {\n        const active = button.dataset.side === side;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-selected', active ? 'true' : 'false');\n      });\n      this.queryAll('[data-mobile-side]').forEach((button) => {\n        const active = button.dataset.mobileSide === side;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-selected', active ? 'true' : 'false');\n      });\n      this.queryAll('[data-stage]').forEach((stage) => stage.classList.toggle('is-active', stage.dataset.stage === side));\n      Object.entries(this.canvases).forEach(([key, canvas]) => {\n        if (key !== side) canvas.discardActiveObject().requestRenderAll();\n      });\n      this.updateSelectionPanel(this.canvases[side].getActiveObject());\n      this.renderLayers();\n      this.syncLiveTextInput();\n      this.updateStepUI();\n      this.syncCanvasDisplaySize();\n    }\n\n    openTool(tool) {\n      this.queryAll('[data-tool]').forEach((button) => button.classList.toggle('is-active', button.dataset.tool === tool));\n      this.queryAll('[data-panel]').forEach((panel) => {\n        const active = panel.dataset.panel === tool;\n        panel.hidden = !active;\n        panel.classList.toggle('is-active', active);\n      });\n    }\n\n    layerLabel(object) {\n      if (object.rfLayerLabel) return object.rfLayerLabel;\n      if (object.rfKind === 'photo') return 'Foto';\n      if (object.rfKind === 'flag') return 'Bandera';\n      if (object.rfKind === 'number') return `Dorsal \u00B7 ${object.text || ''}`;\n      if (object.rfKind === 'name' || object.rfKind === 'text') return `Texto \u00B7 ${object.text || ''}`;\n      return 'Elemento';\n    }\n\n    userLayers(side = this.activeSide) {\n      const canvas = this.canvases[side];\n      return canvas ? canvas.getObjects().filter((object) => object.rfRole === 'user') : [];\n    }\n\n    renderLayers() {\n      const list = this.query('[data-layers-list]');\n      const count = this.query('[data-layers-count]');\n      const title = this.query('[data-layers-title]');\n      if (!list || !count || !title || !this.canvases[this.activeSide]) return;\n\n      const canvas = this.canvases[this.activeSide];\n      const layers = this.userLayers().slice().reverse();\n      const selected = canvas.getActiveObject();\n      title.textContent = `Capas \u00B7 ${this.activeSide === 'right' ? 'Derecha' : 'Izquierda'}`;\n      count.textContent = String(layers.length);\n      list.replaceChildren();\n\n      if (!layers.length) {\n        const empty = document.createElement('p');\n        empty.className = 'rf-nano__layers-empty';\n        empty.textContent = 'A\u00F1ade una foto, un nombre, un dorsal o una bandera.';\n        list.appendChild(empty);\n        return;\n      }\n\n      layers.forEach((object) => {\n        const row = document.createElement('div');\n        row.className = 'rf-nano__layer-row';\n        row.classList.toggle('is-active', selected === object);\n        row.classList.toggle('is-locked', Boolean(object.rfLocked));\n        row.classList.toggle('is-hidden', object.visible === false);\n\n        const select = document.createElement('button');\n        select.type = 'button';\n        select.className = 'rf-nano__layer-select';\n        select.dataset.layerAction = 'select';\n        select.dataset.layerId = object.rfLayerId;\n        select.textContent = this.layerLabel(object);\n\n        const actions = [\n          ['up', '\u2191', 'Subir capa'],\n          ['down', '\u2193', 'Bajar capa'],\n          ['visibility', object.visible === false ? '\u25CB' : '\u25C9', object.visible === false ? 'Mostrar capa' : 'Ocultar capa'],\n          ['lock', object.rfLocked ? '\uD83D\uDD12' : '\uD83D\uDD13', object.rfLocked ? 'Desbloquear capa' : 'Bloquear capa'],\n        ];\n\n        row.appendChild(select);\n        actions.forEach(([action, icon, label]) => {\n          const button = document.createElement('button');\n          button.type = 'button';\n          button.className = `rf-nano__layer-action rf-nano__layer-action--${action}`;\n          button.dataset.layerAction = action;\n          button.dataset.layerId = object.rfLayerId;\n          button.textContent = icon;\n          button.setAttribute('aria-label', label);\n          button.title = label;\n          row.appendChild(button);\n        });\n        list.appendChild(row);\n      });\n    }\n\n    findLayerObject(layerId) {\n      return this.userLayers().find((object) => object.rfLayerId === layerId) || null;\n    }\n\n    handleLayerAction(action, layerId) {\n      const object = this.findLayerObject(layerId);\n      if (!object) return;\n      const canvas = object.canvas;\n\n      if (action === 'select') {\n        if (object.visible === false) {\n          object.set('visible', true);\n          this.markDesignChanged();\n        }\n        canvas.setActiveObject(object);\n        this.updateSelectionPanel(object);\n      } else if (action === 'lock') {\n        this.setObjectLocked(object, !object.rfLocked);\n      } else if (action === 'visibility') {\n        object.set('visible', object.visible === false);\n        if (object.visible === false && canvas.getActiveObject() === object) {\n          canvas.discardActiveObject();\n          this.updateSelectionPanel(null);\n        }\n        this.markDesignChanged();\n      } else if (action === 'up' || action === 'down') {\n        this.moveLayer(object, action === 'up' ? 1 : -1);\n      }\n\n      canvas.requestRenderAll();\n      this.renderLayers();\n    }\n\n    moveLayer(object, direction) {\n      const canvas = object.canvas;\n      const layers = this.userLayers();\n      const index = layers.indexOf(object);\n      const target = Math.max(0, Math.min(layers.length - 1, index + direction));\n      if (index === -1 || target === index) return;\n      [layers[index], layers[target]] = [layers[target], layers[index]];\n      layers.forEach((layer, layerIndex) => canvas.moveTo(layer, layerIndex + 1));\n      this.keepFixedLayers(canvas, this.activeSide);\n      this.markDesignChanged();\n    }\n\n    setObjectLocked(object, locked) {\n      if (!object || object.rfRole !== 'user') return;\n      object.rfLocked = Boolean(locked);\n      if (object.isEditing && object.exitEditing) object.exitEditing();\n      object.set({\n        lockMovementX: object.rfLocked,\n        lockMovementY: object.rfLocked,\n        lockScalingX: object.rfLocked,\n        lockScalingY: object.rfLocked,\n        lockRotation: object.rfLocked,\n        lockSkewingX: object.rfLocked,\n        lockSkewingY: object.rfLocked,\n        hasControls: !object.rfLocked,\n        editable: !object.rfLocked,\n        hoverCursor: object.rfLocked ? 'not-allowed' : 'move',\n      });\n      object.setCoords();\n      object.canvas.setActiveObject(object);\n      object.canvas.requestRenderAll();\n      this.updateSelectionPanel(object);\n      this.renderLayers();\n      this.setStatus(object.rfLocked ? 'Elemento bloqueado.' : 'Elemento desbloqueado.');\n    }\n\n    toggleSelectedLock() {\n      const object = this.getSelectedObject();\n      if (!object || object.rfRole !== 'user') return;\n      this.setObjectLocked(object, !object.rfLocked);\n    }\n\n    addUserObject(object, kind) {\n      const canvas = this.canvases[this.activeSide];\n      object.rfRole = 'user';\n      object.rfKind = kind;\n      object.rfLayerId = `rf-layer-${++this.layerSequence}`;\n      object.rfLocked = false;\n      object.set({\n        originX: 'center',\n        originY: 'center',\n        left: WIDTH / 2,\n        top: HEIGHT / 2,\n        lockUniScaling: true,\n        objectCaching: false,\n        clipPath: this.createClipPath(this.activeSide),\n      });\n      Object.defineProperty(object, '_rfCustomizer', { value: this, configurable: true });\n      Object.defineProperty(object, '_rfInitialState', {\n        value: {\n          left: object.left,\n          top: object.top,\n          scaleX: object.scaleX || 1,\n          scaleY: object.scaleY || 1,\n          angle: object.angle || 0,\n          skewX: object.skewX || 0,\n          skewY: object.skewY || 0,\n          flipX: Boolean(object.flipX),\n          flipY: Boolean(object.flipY),\n          fill: object.fill,\n          fontFamily: object.fontFamily,\n          textShape: object.rfTextShape || 'straight',\n        },\n        writable: true,\n        configurable: true,\n      });\n      canvas.add(object);\n      this.baseScale.set(object, { x: object.scaleX || 1, y: object.scaleY || 1 });\n      canvas.setActiveObject(object);\n      this.keepFixedLayers(canvas, this.activeSide);\n      this.updateSelectionPanel(object);\n      this.renderLayers();\n      this.markDesignChanged();\n    }\n\n    addPhoto(event) {\n      const file = event.target.files && event.target.files[0];\n      if (!file) return;\n      if (file.size > 12 * 1024 * 1024) {\n        this.setStatus('La imagen supera los 12 MB. Elige una m\\u00E1s ligera.', true);\n        event.target.value = '';\n        return;\n      }\n      const reader = new FileReader();\n      reader.onload = () => {\n        fabric.Image.fromURL(reader.result, (image) => {\n          const scale = Math.min(260 / image.width, 360 / image.height);\n          image.set({ scaleX: scale, scaleY: scale });\n          this.addUserObject(image, 'photo');\n          this.setStatus('Foto a\\u00F1adida. Arr\\u00E1strala y usa los puntos de las esquinas para ajustarla.');\n        });\n      };\n      reader.onerror = () => this.setStatus('No se ha podido leer esta imagen.', true);\n      reader.readAsDataURL(file);\n      event.target.value = '';\n    }\n\n    addText(value, fontFamily, kind, fontSize) {\n      const object = new fabric.IText(value.trim(), {\n        fontFamily,\n        fontSize,\n        fontWeight: kind === 'number' ? 900 : 800,\n        fill: '#111111',\n        textAlign: 'center',\n        editable: true,\n        strokeWidth: 0,\n        shadow: null,\n      });\n      this.applyTextShape(object);\n      this.addUserObject(object, kind);\n    }\n\n    updateLiveText(value, fontFamily) {\n      const canvas = this.canvases[this.activeSide];\n      if (!canvas) return;\n      const cleanValue = String(value || '').slice(0, 30);\n      const trimmedValue = cleanValue.trim();\n      let object = this.liveTextObjects[this.activeSide];\n\n      if (object && !canvas.getObjects().includes(object)) {\n        object = null;\n        this.liveTextObjects[this.activeSide] = null;\n      }\n\n      if (!trimmedValue) {\n        if (object) {\n          canvas.remove(object);\n          this.liveTextObjects[this.activeSide] = null;\n          this.updateSelectionPanel(null);\n          this.renderLayers();\n          this.markDesignChanged();\n          canvas.requestRenderAll();\n        }\n        return;\n      }\n\n      const isDorsal = /^\\d{1,2}$/.test(trimmedValue);\n      const kind = isDorsal ? 'number' : 'text';\n      const fontSize = isDorsal ? 48 : 26;\n\n      if (!object) {\n        object = new fabric.IText(trimmedValue, {\n          fontFamily,\n          fontSize,\n          fontWeight: isDorsal ? 900 : 800,\n          fill: '#111111',\n          textAlign: 'center',\n          editable: true,\n          strokeWidth: 0,\n          shadow: null,\n        });\n        object.rfLayerLabel = `${isDorsal ? 'Dorsal' : 'Texto'} \u00B7 ${trimmedValue}`;\n        this.applyTextShape(object);\n        this.addUserObject(object, kind);\n        this.liveTextObjects[this.activeSide] = object;\n        this.setStatus('Texto a\\u00F1adido. Ya puedes moverlo y cambiar su tama\\u00F1o.');\n        return;\n      }\n\n      object.rfKind = kind;\n      object.rfLayerLabel = `${isDorsal ? 'Dorsal' : 'Texto'} \u00B7 ${trimmedValue}`;\n      object.set({\n        text: trimmedValue,\n        fontFamily,\n        fontSize,\n        fontWeight: isDorsal ? 900 : 800,\n      });\n      this.applyTextShape(object);\n      object.setCoords();\n      canvas.setActiveObject(object);\n      canvas.requestRenderAll();\n      this.updateSelectionPanel(object);\n      this.renderLayers();\n      this.markDesignChanged();\n    }\n\n    syncLiveTextInput() {\n      const input = this.query('[data-text-input]');\n      const font = this.query('[data-text-font]');\n      const addAnother = this.query('[data-action=\"add-another-text\"]');\n      if (!input || !font) return;\n      const canvas = this.canvases[this.activeSide];\n      let object = this.liveTextObjects[this.activeSide];\n      if (object && canvas && !canvas.getObjects().includes(object)) {\n        object = null;\n        this.liveTextObjects[this.activeSide] = null;\n      }\n      input.value = object ? object.text || '' : '';\n      if (object && object.fontFamily) font.value = object.fontFamily;\n      if (addAnother) addAnother.disabled = !input.value.trim();\n    }\n\n    startAnotherText() {\n      const input = this.query('[data-text-input]');\n      const button = this.query('[data-action=\"add-another-text\"]');\n      const object = this.liveTextObjects[this.activeSide];\n      if (!input || !input.value.trim() || !object) {\n        this.setStatus('Escribe primero un texto o dorsal.', true);\n        if (input) input.focus();\n        return;\n      }\n\n      this.liveTextObjects[this.activeSide] = null;\n      input.value = '';\n      if (button) button.disabled = true;\n      const canvas = this.canvases[this.activeSide];\n      canvas.discardActiveObject().requestRenderAll();\n      this.updateSelectionPanel(null);\n      this.renderLayers();\n      this.setStatus('Escribe el siguiente texto: se a\\u00F1adir\\u00E1 autom\\u00E1ticamente.');\n      input.focus();\n    }\n\n    applyTextShape(object) {\n      if (!object || !['name', 'text', 'number'].includes(object.rfKind || 'text')) return;\n      object.rfTextShape = 'straight';\n      object.set({ path: null, pathStartOffset: 0 });\n      object.setCoords();\n    }\n\n    addFlag(url, name) {\n      if (!url) return;\n      fabric.Image.fromURL(url, (image) => {\n        if (!image) {\n          this.setStatus(`No se ha podido cargar la bandera de ${name}.`, true);\n          return;\n        }\n        image.scaleToWidth(125);\n        image.rfLayerLabel = `Bandera \u00B7 ${name}`;\n        this.addUserObject(image, 'flag');\n        this.setStatus(`Bandera de ${name} a\\u00F1adida.`);\n      }, { crossOrigin: 'anonymous' });\n    }\n\n    setBackground(color, button) {\n      const layer = this.layers[this.activeSide];\n      layer.background.set('fill', color === 'none' ? '#ffffff' : color);\n      this.queryAll('[data-bg]').forEach((item) => item.classList.toggle('is-active', item === button));\n      this.canvases[this.activeSide].requestRenderAll();\n      this.markDesignChanged();\n    }\n\n    setLogoColor(color, selectedButton) {\n      const normalized = String(color || '').trim().toLowerCase();\n      this.logoColor = ['white', '#fff', '#ffffff'].includes(normalized) ? 'white' : 'black';\n      const logoLoads = Object.keys(this.canvases).map((side) => this.loadLogo(side));\n      this.queryAll('[data-logo-color]').forEach((button) => {\n        const active = button === selectedButton;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', active ? 'true' : 'false');\n      });\n      const feedback = this.query('[data-logo-feedback]');\n      if (feedback) {\n        feedback.textContent = this.logoColor === 'white'\n          ? 'Blanco seleccionado \\u00B7 visible sobre fondos oscuros'\n          : 'Negro seleccionado';\n      }\n      Promise.all(logoLoads).then(() => {\n        this.setStatus(this.logoColor === 'white'\n          ? 'Logo blanco aplicado a las dos espinilleras.'\n          : 'Logo negro aplicado a las dos espinilleras.');\n      });\n      this.markDesignChanged();\n    }\n\n    getSelectedObject() {\n      return this.canvases[this.activeSide] && this.canvases[this.activeSide].getActiveObject();\n    }\n\n    updateSelectionPanel(object) {\n      const panel = this.query('[data-selected-panel]');\n      const isUser = object && object.rfRole === 'user';\n      panel.hidden = !isUser;\n      const canvasDeleteButton = this.query('[data-action=\"delete-canvas-selected\"]');\n      if (canvasDeleteButton) {\n        canvasDeleteButton.hidden = !isUser;\n        canvasDeleteButton.disabled = !isUser || Boolean(object.rfLocked);\n      }\n      this.updateMobileSelectionOutline(isUser ? object : null);\n      if (!isUser) {\n        this.renderLayers();\n        return;\n      }\n\n      const lockButton = this.query('[data-action=\"toggle-lock\"]');\n      lockButton.classList.toggle('is-active', Boolean(object.rfLocked));\n      lockButton.setAttribute('aria-pressed', object.rfLocked ? 'true' : 'false');\n      lockButton.textContent = object.rfLocked ? '\uD83D\uDD12 Desbloquear' : '\uD83D\uDD13 Bloquear';\n\n      const isText = ['name', 'text', 'number'].includes(object.rfKind);\n      const colorWrap = this.query('[data-selected-color-wrap]');\n      const fontWrap = this.query('[data-selected-font-wrap]');\n      const zoomWrap = this.query('[data-selected-zoom-wrap]');\n      colorWrap.hidden = !isText;\n      fontWrap.hidden = !isText;\n      zoomWrap.hidden = false;\n      this.query('[data-selected-color]').disabled = Boolean(object.rfLocked);\n      this.query('[data-selected-font]').disabled = Boolean(object.rfLocked);\n      this.query('[data-selected-zoom]').disabled = Boolean(object.rfLocked);\n      this.query('[data-action=\"zoom-out\"]').disabled = Boolean(object.rfLocked);\n      this.query('[data-action=\"zoom-in\"]').disabled = Boolean(object.rfLocked);\n      this.query('[data-action=\"reset-selected\"]').disabled = Boolean(object.rfLocked);\n      this.query('[data-action=\"delete-selected\"]').disabled = Boolean(object.rfLocked);\n\n      if (isText) {\n        this.query('[data-selected-color]').value = this.normalizeColor(object.fill || '#111111');\n        this.query('[data-selected-font]').value = object.fontFamily || 'Arial Black';\n      }\n      const base = this.baseScale.get(object) || { x: object.scaleX || 1 };\n      const percent = Math.round(((object.scaleX || 1) / (base.x || 1)) * 100);\n      this.query('[data-selected-zoom]').value = Math.max(15, Math.min(300, percent));\n      this.renderLayers();\n    }\n\n    normalizeColor(color) {\n      if (/^#[0-9a-f]{6}$/i.test(color)) return color;\n      const probe = document.createElement('canvas').getContext('2d');\n      probe.fillStyle = color;\n      const normalized = probe.fillStyle;\n      if (normalized.startsWith('#')) return normalized.length === 4\n        ? `#${normalized[1]}${normalized[1]}${normalized[2]}${normalized[2]}${normalized[3]}${normalized[3]}`\n        : normalized;\n      return '#111111';\n    }\n\n    changeSelectedColor(color) {\n      const object = this.getSelectedObject();\n      if (!object || object.rfLocked || !['name', 'text', 'number'].includes(object.rfKind)) return;\n      object.set({ fill: color, strokeWidth: 0, shadow: null });\n      object.canvas.requestRenderAll();\n      this.markDesignChanged();\n    }\n\n    changeSelectedFont(fontFamily) {\n      const object = this.getSelectedObject();\n      if (!object || object.rfLocked || !['name', 'text', 'number'].includes(object.rfKind)) return;\n      object.set('fontFamily', fontFamily);\n      this.applyTextShape(object);\n      object.setCoords();\n      this.keepUserObjectReachable(object);\n      this.updateMobileSelectionOutline(object);\n      object.canvas.requestRenderAll();\n      this.markDesignChanged();\n    }\n\n    changeSelectedZoom(percent) {\n      const object = this.getSelectedObject();\n      if (!object || object.rfRole !== 'user' || object.rfLocked) return;\n      const base = this.baseScale.get(object) || { x: object.scaleX || 1, y: object.scaleY || 1 };\n      object.set({ scaleX: base.x * percent / 100, scaleY: base.y * percent / 100 });\n      object.setCoords();\n      this.keepUserObjectReachable(object);\n      this.updateMobileSelectionOutline(object);\n      object.canvas.requestRenderAll();\n      this.markDesignChanged();\n    }\n\n    nudgeSelectedZoom(delta) {\n      const input = this.query('[data-selected-zoom]');\n      if (!input || input.disabled) return;\n      const next = Math.max(Number(input.min) || 15, Math.min(Number(input.max) || 300, Number(input.value || 100) + delta));\n      input.value = String(next);\n      this.changeSelectedZoom(next);\n    }\n\n    removeObject(object) {\n      if (!object || object.rfRole !== 'user') return;\n      if (object.rfLocked) {\n        this.setStatus('Desbloquea el elemento antes de eliminarlo.', true);\n        return;\n      }\n      const canvas = object.canvas;\n      const removedSide = Object.keys(this.canvases).find((side) => this.canvases[side] === canvas);\n      if (removedSide && this.liveTextObjects[removedSide] === object) {\n        this.liveTextObjects[removedSide] = null;\n      }\n      canvas.remove(object);\n      canvas.discardActiveObject().requestRenderAll();\n      this.syncLiveTextInput();\n      this.updateSelectionPanel(null);\n      this.renderLayers();\n      this.markDesignChanged();\n      this.setStatus('Elemento eliminado.');\n    }\n\n    deleteSelected() {\n      this.removeObject(this.getSelectedObject());\n    }\n\n    resetObject(object) {\n      if (!object || object.rfRole !== 'user' || object.rfLocked || !object._rfInitialState) return;\n      const initial = object._rfInitialState;\n      object.set({\n        left: initial.left,\n        top: initial.top,\n        scaleX: initial.scaleX,\n        scaleY: initial.scaleY,\n        angle: initial.angle,\n        skewX: initial.skewX,\n        skewY: initial.skewY,\n        flipX: initial.flipX,\n        flipY: initial.flipY,\n      });\n      if (['name', 'text', 'number'].includes(object.rfKind)) {\n        object.set({ fill: initial.fill, fontFamily: initial.fontFamily });\n        this.applyTextShape(object);\n      }\n      object.setCoords();\n      object.canvas.setActiveObject(object);\n      object.canvas.requestRenderAll();\n      this.updateSelectionPanel(object);\n      this.markDesignChanged();\n      this.setStatus('Elemento restablecido a su estado original.');\n    }\n\n    resetSelected() {\n      this.resetObject(this.getSelectedObject());\n    }\n\n    sideHasDesign(side) {\n      const canvas = this.canvases[side];\n      if (!canvas) return false;\n      const hasUserElement = canvas.getObjects().some((object) => object.rfRole === 'user');\n      const background = this.layers[side] && this.layers[side].background;\n      return hasUserElement || (background && background.fill !== '#ffffff');\n    }\n\n    updateProgress() {\n      if (!this.modal) return;\n      const state = {\n        size: this.sizeIsReady(),\n        left: this.sideHasDesign('left'),\n        right: this.sideHasDesign('right'),\n      };\n      Object.entries(state).forEach(([key, complete]) => {\n        const item = this.query(`[data-progress-item=\"${key}\"]`);\n        if (!item) return;\n        item.classList.toggle('is-complete', complete);\n        const icon = item.querySelector('.rf-nano__progress-icon');\n        if (icon) icon.textContent = complete ? '\\u2713' : key === 'size' ? '1' : key === 'left' ? '2' : '3';\n        const detail = item.querySelector('small');\n        if (detail) {\n          if (key === 'size') detail.textContent = complete ? this.selectedSize : 'Pendiente';\n          else detail.textContent = complete ? 'Completada' : 'Pendiente';\n        }\n      });\n\n      const sizeValue = this.query('[data-requirement-size]');\n      if (sizeValue) sizeValue.textContent = state.size ? this.selectedSize : 'Pendiente';\n      const sizeRequirement = this.query('[data-requirement=\"size\"]');\n      if (sizeRequirement) sizeRequirement.classList.toggle('is-complete', state.size);\n      const logoValue = this.query('[data-requirement-logo]');\n      if (logoValue) logoValue.textContent = this.logoColor === 'white' ? 'Blanco' : 'Negro';\n      const logoRequirement = this.query('[data-requirement=\"logo\"]');\n      if (logoRequirement) logoRequirement.classList.toggle('is-complete', this.logoReady.left && this.logoReady.right);\n    }\n\n    ensureBothSidesDesigned() {\n      const missing = ['left', 'right'].filter((side) => !this.sideHasDesign(side));\n      if (!missing.length) return true;\n      const side = missing[0];\n      this.setActiveSide(side);\n      const label = side === 'left' ? 'izquierda' : 'derecha';\n      this.setStatus(`Falta personalizar la espinillera ${label}. A\\u00F1ade una foto, nombre, texto, bandera o color.`, true);\n      return false;\n    }\n\n    ensureRequirements() {\n      if (this.model === 'ARMOUR' && !this.selectedSize) {\n        const sizeRow = this.query('[data-size-row]');\n        if (sizeRow) sizeRow.classList.add('has-error');\n        this.lastRequirementError = `Selecciona una talla ${this.modelName}: S, M o L.`;\n        this.setStatus(this.lastRequirementError, true);\n        this.setStep(1, false);\n        return false;\n      }\n\n      if (!this.ensureBothSidesDesigned()) return false;\n\n      if (!this.logoReady.left || !this.logoReady.right) {\n        this.lastRequirementError = 'El logo Realf\\u00FAt es obligatorio en ambas espinilleras. Espera a que termine de cargar.';\n        this.setStatus(this.lastRequirementError, true);\n        return false;\n      }\n\n      const sizeRow = this.query('[data-size-row]');\n      if (sizeRow) sizeRow.classList.remove('has-error');\n      this.lastRequirementError = '';\n      return true;\n    }\n\n    async renderSide(side) {\n      const canvas = this.canvases[side];\n      canvas.discardActiveObject();\n      canvas.requestRenderAll();\n      const dataUrl = canvas.toDataURL({\n        format: 'png',\n        left: this.modelConfig.crop.left,\n        top: this.modelConfig.crop.top,\n        width: this.modelConfig.crop.width,\n        height: this.modelConfig.crop.height,\n        multiplier: 4,\n        enableRetinaScaling: false,\n      });\n      canvas.requestRenderAll();\n      return waitForImage(dataUrl);\n    }\n\n    async generateProductionBlob() {\n      await Promise.all(Object.values(this.logoLoads));\n      const [left, right] = await Promise.all([this.renderSide('left'), this.renderSide('right')]);\n      const output = document.createElement('canvas');\n      output.width = EXPORT_WIDTH;\n      output.height = EXPORT_HEIGHT;\n      const ctx = output.getContext('2d');\n      ctx.fillStyle = '#ffffff';\n      ctx.fillRect(0, 0, EXPORT_WIDTH, EXPORT_HEIGHT);\n      ctx.imageSmoothingEnabled = true;\n      ctx.imageSmoothingQuality = 'high';\n\n      const leftPlacement = this.modelConfig.export.left;\n      const rightPlacement = this.modelConfig.export.right;\n      ctx.drawImage(left, leftPlacement.x, leftPlacement.y, leftPlacement.width, leftPlacement.height);\n      ctx.drawImage(right, rightPlacement.x, rightPlacement.y, rightPlacement.width, rightPlacement.height);\n      return canvasToBlob(output);\n    }\n\n    createDesignId() {\n      const stamp = Date.now().toString(36).toUpperCase();\n      const random = Math.random().toString(36).slice(2, 6).toUpperCase();\n      return `RF-${this.model}-${stamp}-${random}`;\n    }\n\n    async prepareOrderFile() {\n      if (!this.ensureRequirements()) throw new Error(this.lastRequirementError || 'Falta completar un requisito obligatorio del dise\\u00F1o.');\n      this.setStatus('Preparando el archivo final para el pedido\\u2026');\n      const designId = this.createDesignId();\n      this.orderBlob = await this.generateProductionBlob();\n      this.orderFilename = `${designId}.png`;\n      return this.orderBlob;\n    }\n\n    appendOrderFile(formData) {\n      if (!this.orderBlob) throw new Error('Falta el archivo del dise\\u00F1o.');\n      const filename = this.orderFilename || `diseno-${this.model.toLowerCase()}.png`;\n      const orderFile = new File([this.orderBlob], filename, {\n        type: 'image/png',\n        lastModified: Date.now(),\n      });\n      formData.delete('properties[_Modelo]');\n      formData.delete('properties[_ID del dise\\u00F1o]');\n      formData.delete(`properties[${DESIGN_PROPERTY}]`);\n      formData.delete('properties[_Archivo de producci\\u00F3n NANO]');\n      formData.delete('properties[_Archivo de producci\\u00F3n ARMOUR]');\n      formData.delete('properties[_Archivo de producci\\u00F3n CARBON]');\n      formData.delete(`properties[${SIZE_PROPERTY}]`);\n\n      // Shopify uploads File values from multipart line-item properties and\n      // replaces them with a durable /uploads/ URL in the cart and order.\n      // A single visible property is enough for EGO and the Shopify order.\n      formData.set(`properties[${DESIGN_PROPERTY}]`, orderFile);\n\n      // Armour guarda la talla elegida y Carbon informa su talla \\u00FAnica\n      // como propiedad visible del art\\u00EDculo.\n      // en el carrito y en el pedido. NANO es talla \\u00FAnica y no la a\\u00F1ade.\n      if (this.model !== 'NANO' && this.selectedSize) {\n        formData.set(`properties[${SIZE_PROPERTY}]`, this.selectedSize);\n      }\n    }\n\n    async downloadDesign() {\n      if (!this.ensureRequirements()) return;\n      const button = this.query('[data-action=\"download\"]');\n      button.disabled = true;\n      this.setStatus('Generando tu dise\\u00F1o\\u2026');\n      try {\n        const blob = await this.generateProductionBlob();\n        const url = URL.createObjectURL(blob);\n        const link = document.createElement('a');\n        link.href = url;\n        link.download = `${this.createDesignId()}.png`;\n        document.body.appendChild(link);\n        link.click();\n        link.remove();\n        setTimeout(() => URL.revokeObjectURL(url), 2000);\n        this.setStatus('Dise\\u00F1o descargado correctamente.');\n      } catch (error) {\n        console.error(error);\n        this.setStatus('No se ha podido descargar el dise\\u00F1o. Int\\u00E9ntalo de nuevo.', true);\n      } finally {\n        button.disabled = false;\n      }\n    }\n\n    cartRoot() {\n      const root = window.Shopify?.routes?.root || '/';\n      return root.endsWith('/') ? root : `${root}/`;\n    }\n\n    cartAddUrl() {\n      return window.routes?.cart_add_url || `${this.cartRoot()}cart/add.js`;\n    }\n\n    responseLineItem(response) {\n      if (Array.isArray(response?.items)) return response.items[0] || null;\n      return response && (response.variant_id || response.key) ? response : null;\n    }\n\n    responseDesignUrl(response) {\n      const item = this.responseLineItem(response);\n      const value = item?.properties?.[DESIGN_PROPERTY];\n      if (typeof value !== 'string') return '';\n      const trimmed = value.trim();\n      if (trimmed.startsWith('//')) return `${window.location.protocol}${trimmed}`;\n      if (trimmed.startsWith('/')) return `${window.location.origin}${trimmed}`;\n      return /^https?:\\/\\//i.test(trimmed) ? trimmed : '';\n    }\n\n    async undoBrokenCartAdd(response) {\n      const item = this.responseLineItem(response);\n      if (!item?.key) return;\n      const currentQuantity = Number(item.quantity) || 1;\n      try {\n        await fetch(`${this.cartRoot()}cart/change.js`, {\n          method: 'POST',\n          credentials: 'same-origin',\n          headers: {\n            Accept: 'application/json',\n            'Content-Type': 'application/json',\n          },\n          body: JSON.stringify({ id: item.key, quantity: Math.max(0, currentQuantity - 1) }),\n        });\n      } catch (error) {\n        console.warn('[Realfut] No se ha podido revertir el art\\u00EDculo sin dise\\u00F1o.', error);\n      }\n    }\n\n    notifyCart(response, variantId, designUrl) {\n      const detail = {\n        productVariantId: String(variantId),\n        cartData: response,\n        designUrl,\n      };\n      document.dispatchEvent(new CustomEvent('realfut:nano-added', { detail }));\n      document.dispatchEvent(new CustomEvent('cart:refresh', { bubbles: true, detail }));\n      window.dispatchEvent(new CustomEvent('cart:refresh', { detail }));\n\n      if (typeof publish === 'function' && typeof PUB_SUB_EVENTS !== 'undefined' && PUB_SUB_EVENTS.cartUpdate) {\n        publish(PUB_SUB_EVENTS.cartUpdate, {\n          source: 'realfut-nano-customizer',\n          productVariantId: String(variantId),\n          cartData: response,\n        });\n      }\n    }\n\n    async submitProduct() {\n      const form = document.getElementById(this.formId);\n      const addButton = this.query('[data-action=\"add-to-cart\"]');\n      if (!form || !addButton) {\n        this.setStatus('No se ha encontrado el formulario de compra.', true);\n        return;\n      }\n\n      if (addButton.disabled || addButton.getAttribute('aria-busy') === 'true') return;\n      const originalLabel = addButton.textContent;\n      addButton.disabled = true;\n      addButton.setAttribute('aria-busy', 'true');\n      addButton.textContent = 'Guardando dise\\u00F1o\\u2026';\n\n      try {\n        await this.prepareOrderFile();\n        const formData = new FormData(form);\n        this.appendOrderFile(formData);\n\n        const variantId = formData.get('id');\n        if (!variantId) throw new Error('No se ha encontrado la variante del producto.');\n\n        const cart = document.querySelector('cart-notification') || document.querySelector('cart-drawer');\n        if (cart?.getSectionsToRender) {\n          const sectionIds = cart.getSectionsToRender().map((section) => section.id).filter(Boolean);\n          if (sectionIds.length) {\n            formData.set('sections', sectionIds.join(','));\n            formData.set('sections_url', window.location.pathname);\n          }\n          if (cart.setActiveElement) cart.setActiveElement(document.activeElement);\n        }\n\n        const request = await fetch(this.cartAddUrl(), {\n          method: 'POST',\n          credentials: 'same-origin',\n          headers: {\n            Accept: 'application/json',\n            'X-Requested-With': 'XMLHttpRequest',\n          },\n          body: formData,\n        });\n        const response = await request.json();\n\n        if (!request.ok || response.status) {\n          throw new Error(response.description || response.message || 'Shopify no ha podido a\\u00F1adir el producto.');\n        }\n\n        const designUrl = this.responseDesignUrl(response);\n        if (!designUrl) {\n          await this.undoBrokenCartAdd(response);\n          throw new Error('Shopify no ha guardado el archivo del dise\\u00F1o. El producto no se ha a\\u00F1adido para evitar un pedido incompleto.');\n        }\n\n        this.lastDesignUrl = designUrl;\n        if (cart?.renderContents && response.sections) cart.renderContents(response);\n        this.notifyCart(response, variantId, designUrl);\n        this.setStatus('Dise\\u00F1o guardado y a\\u00F1adido al carrito. Ya puedes abrir su enlace de previsualizaci\\u00F3n.');\n      } catch (error) {\n        console.error(error);\n        this.setStatus(error.message || 'No se ha podido a\\u00F1adir el dise\\u00F1o. Int\\u00E9ntalo de nuevo.', true);\n      } finally {\n        addButton.disabled = !this.currentAvailable;\n        addButton.removeAttribute('aria-busy');\n        addButton.textContent = originalLabel;\n      }\n    }\n\n    setStatus(message, isError = false) {\n      const status = this.query('[data-status]');\n      if (!status) return;\n      status.textContent = message;\n      status.classList.toggle('is-error', isError);\n    }\n  }\n\n  if (!customElements.get('realfut-customizer-v29')) {\n    customElements.define('realfut-customizer-v29', RealfutNanoCustomizer);\n  }\n})();\n(function(){if(window.__rfxNano)return;window.__rfxNano=1;var hid=[],raf=0;function price(){var e=document.querySelector('.product__info-container .price-item--sale')||document.querySelector('.product__info-container .price-item--regular');if(!e)return'';var m=(e.textContent||'').match(/\\d[\\d.,]*/);return m?m[0]+' \u20AC':''}function floats(on){if(on){if(hid.length)return;var roots=[document.body];var o=document.getElementById('opus-shadow-container');if(o&&o.shadowRoot)roots.push(o.shadowRoot);roots.forEach(function(r){r.querySelectorAll('div,button,a,aside').forEach(function(e){if(e.closest('.rf-nano__modal'))return;var b=e.getBoundingClientRect();if(!b.width||b.width>160||b.height>160||b.bottom<innerHeight-240)return;if(getComputedStyle(e).position!=='fixed')return;hid.push([e,e.style.visibility]);e.style.visibility='hidden'})})}else{hid.forEach(function(p){p[0].style.visibility=p[1]});hid=[]}}function upd(){raf=0;var m=document.querySelector('.rf-nano__modal');if(!m)return;var open=document.documentElement.classList.contains('rf-nano-modal-open');floats(open);if(!open)return;var t=m.querySelector('[data-layers-title]');if(t&&/^Capas/.test(t.textContent))t.textContent=t.textContent.replace(/^Capas/,'Tus elementos');['left','right'].forEach(function(s){var p=m.querySelector('[data-progress-item=\"'+s+'\"]'),b=m.querySelector('[data-mobile-side=\"'+s+'\"]');if(b)b.classList.toggle('rfx-done',!!(p&&p.classList.contains('is-complete')))});var a=m.querySelector('.rf-nano__add'),pr=price();if(a&&pr&&a.getAttribute('data-rfx-price')!==pr)a.setAttribute('data-rfx-price',pr)}function q(){if(!raf)raf=requestAnimationFrame(upd)}var ho=0;function init(){var m=document.querySelector('.rf-nano__modal');if(!ho){ho=1;new MutationObserver(q).observe(document.documentElement,{attributes:true,attributeFilter:['class']})}if(m)new MutationObserver(q).observe(m,{attributes:true,subtree:true,childList:true,characterData:true,attributeFilter:['class','data-current-step','hidden']});else setTimeout(init,800);q()}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',function(){setTimeout(init,300)});else setTimeout(init,300)})();(function(){if(window.__rfxNano)return;window.__rfxNano=1;var hid=[],raf=0;function price(){var e=document.querySelector('.product__info-container .price-item--sale')||document.querySelector('.product__info-container .price-item--regular');if(!e)return'';var m=(e.textContent||'').match(/\\d[\\d.,]*/);return m?m[0]+' \u20AC':''}function floats(on){if(on){if(hid.length)return;var roots=[document.body];var o=document.getElementById('opus-shadow-container');if(o&&o.shadowRoot)roots.push(o.shadowRoot);roots.forEach(function(r){r.querySelectorAll('div,button,a,aside').forEach(function(e){if(e.closest('.rf-nano__modal'))return;var b=e.getBoundingClientRect();if(!b.width||b.width>160||b.height>160||b.bottom<innerHeight-240)return;if(getComputedStyle(e).position!=='fixed')return;hid.push([e,e.style.visibility]);e.style.visibility='hidden'})})}else{hid.forEach(function(p){p[0].style.visibility=p[1]});hid=[]}}function upd(){raf=0;var m=document.querySelector('.rf-nano__modal');if(!m)return;var open=document.documentElement.classList.contains('rf-nano-modal-open');floats(open);if(!open)return;var t=m.querySelector('[data-layers-title]');if(t&&/^Capas/.test(t.textContent))t.textContent=t.textContent.replace(/^Capas/,'Tus elementos');['left','right'].forEach(function(s){var p=m.querySelector('[data-progress-item=\"'+s+'\"]'),b=m.querySelector('[data-mobile-side=\"'+s+'\"]');if(b)b.classList.toggle('rfx-done',!!(p&&p.classList.contains('is-complete')))});var a=m.querySelector('.rf-nano__add'),pr=price();if(a&&pr&&a.getAttribute('data-rfx-price')!==pr)a.setAttribute('data-rfx-price',pr)}function q(){if(!raf)raf=requestAnimationFrame(upd)}var ho=0;function init(){var m=document.querySelector('.rf-nano__modal');if(!ho){ho=1;new MutationObserver(q).observe(document.documentElement,{attributes:true,attributeFilter:['class']})}if(m)new MutationObserver(q).observe(m,{attributes:true,subtree:true,childList:true,characterData:true,attributeFilter:['class','data-current-step','hidden']});else setTimeout(init,800);q()}if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',function(){setTimeout(init,300)});else setTimeout(init,300)})();"],
  "mappings": "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",
  "names": ["outline", "side", "sizeRow"]
}
