{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/theme.js?nocache=1794402952598"],
  "sourcesContent": ["(() => {\n  const routes = window.themeRoutes || {};\n\n  // Components are registered by selector and mounted on the page, then again\n  // on every section the theme editor re-renders.\n  const components = [];\n  const register = (selector, init) => components.push([selector, init]);\n  const header = document.querySelector('[data-site-header]');\n  const headerGroup = document.querySelector('.site-header-group');\n\n  const setHeaderHeight = () => {\n    if (!headerGroup) return;\n    document.documentElement.style.setProperty('--header-height', `${headerGroup.offsetHeight}px`);\n  };\n  setHeaderHeight();\n  if (headerGroup && 'ResizeObserver' in window) new ResizeObserver(setHeaderHeight).observe(headerGroup);\n\n  const updateHeaderState = () => {\n    if (!header || !header.classList.contains('site-header--overlay')) return;\n    const anyOpen = document.querySelector('dialog.drawer[open]');\n    header.classList.toggle('is-solid', window.scrollY > 40 || Boolean(anyOpen));\n  };\n  window.addEventListener('scroll', updateHeaderState, { passive: true });\n  updateHeaderState();\n\n  const openDialog = (dialog) => {\n    if (!dialog || dialog.open) return;\n    document.querySelectorAll('dialog.drawer[open], dialog.cart-notification[open]').forEach((d) => d.close());\n    dialog.showModal();\n    updateHeaderState();\n    const focusTarget = dialog.querySelector('[data-predictive-input]');\n    if (focusTarget) setTimeout(() => focusTarget.focus(), 50);\n  };\n\n  document.addEventListener('click', (event) => {\n    const opener = event.target.closest('[data-open-drawer]');\n    if (opener) {\n      const dialog = document.getElementById(opener.dataset.openDrawer);\n      if (dialog) {\n        event.preventDefault();\n        openDialog(dialog);\n      }\n      return;\n    }\n    const closer = event.target.closest('[data-close-drawer]');\n    if (closer) {\n      closer.closest('dialog')?.close();\n      return;\n    }\n    if (event.target instanceof HTMLDialogElement && event.target.open) {\n      const rect = event.target.getBoundingClientRect();\n      const inside =\n        event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;\n      if (!inside) event.target.close();\n    }\n  });\n\n  register('dialog', (dialog) => {\n    dialog.addEventListener('close', updateHeaderState);\n  });\n\n  // Striscia promo a tempo: \"data\" AAAA-MM-GG e orari HH:MM in ora italiana.\n  const romeTime = (date, time) => {\n    const [y, mo, d] = date.split('-').map(Number);\n    const [h, mi] = time.split(':').map(Number);\n    if (!y || !mo || !d || Number.isNaN(h)) return NaN;\n    const guess = Date.UTC(y, mo - 1, d, h, mi || 0);\n    const parts = Object.fromEntries(new Intl.DateTimeFormat('en-US', {\n      timeZone: 'Europe/Rome', hourCycle: 'h23',\n      year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit',\n    }).formatToParts(new Date(guess)).map((p) => [p.type, p.value]));\n    const shown = Date.UTC(+parts.year, parts.month - 1, +parts.day, +parts.hour, +parts.minute);\n    return guess - (shown - guess);\n  };\n\n  register('[data-promo-bar]', (bar) => {\n    const { date, start, end } = bar.dataset;\n    const from = romeTime(date || '', start || '');\n    const to = romeTime(date || '', end || '');\n    if (Number.isNaN(from) || Number.isNaN(to)) return;\n    const update = () => {\n      const now = Date.now();\n      bar.hidden = !(now >= from && now < to);\n      if (now < to) setTimeout(update, Math.min(Math.max((now < from ? from : to) - now, 1000), 600000));\n    };\n    update();\n  });\n\n  register('[data-announcement]', (bar) => {\n    const messages = bar.querySelectorAll('.announcement-bar__message');\n    if (messages.length < 2) return;\n    let index = 0;\n    setInterval(() => {\n      messages[index].classList.remove('is-active');\n      index = (index + 1) % messages.length;\n      messages[index].classList.add('is-active');\n    }, 4500);\n  });\n\n  register('[data-carousel]', (carousel) => {\n    const track = carousel.querySelector('[data-carousel-track]');\n    const prev = carousel.querySelector('[data-carousel-prev]');\n    const next = carousel.querySelector('[data-carousel-next]');\n    if (!track) return;\n    const step = () => {\n      const slide = track.querySelector('.product-carousel__slide');\n      return slide ? slide.getBoundingClientRect().width + 8 : track.clientWidth;\n    };\n    const update = () => {\n      if (prev) prev.disabled = track.scrollLeft <= 4;\n      if (next) next.disabled = track.scrollLeft + track.clientWidth >= track.scrollWidth - 4;\n    };\n    prev?.addEventListener('click', () => track.scrollBy({ left: -step(), behavior: 'smooth' }));\n    next?.addEventListener('click', () => track.scrollBy({ left: step(), behavior: 'smooth' }));\n    track.addEventListener('scroll', update, { passive: true });\n    update();\n  });\n\n  register('.hero__video', (video) => {\n    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) video.pause();\n  });\n\n  register('[data-reels]', (reels) => {\n    const videos = Array.from(reels.querySelectorAll('video'));\n    const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    if ('IntersectionObserver' in window && !reduceMotion) {\n      const observer = new IntersectionObserver(\n        (entries) => {\n          entries.forEach((entry) => {\n            const video = entry.target;\n            if (entry.isIntersecting) video.play().catch(() => {});\n            else video.pause();\n          });\n        },\n        { threshold: 0.6 }\n      );\n      videos.forEach((video) => observer.observe(video));\n    }\n    reels.querySelectorAll('[data-reel-sound]').forEach((button) => {\n      button.addEventListener('click', (event) => {\n        event.preventDefault();\n        const video = button.closest('.reel__media').querySelector('video');\n        const enable = video.muted;\n        videos.forEach((other) => {\n          other.muted = true;\n          const otherButton = other.closest('.reel__media').querySelector('[data-reel-sound]');\n          otherButton.setAttribute('aria-pressed', 'false');\n          otherButton.querySelector('[data-label-off]').hidden = false;\n          otherButton.querySelector('[data-label-on]').hidden = true;\n        });\n        video.muted = !enable;\n        if (enable) video.play().catch(() => {});\n        button.setAttribute('aria-pressed', String(enable));\n        button.querySelector('[data-label-off]').hidden = enable;\n        button.querySelector('[data-label-on]').hidden = !enable;\n      });\n    });\n  });\n\n  register('[data-video-banner]', (banner) => {\n    const video = banner.querySelector('video');\n    const toggle = banner.querySelector('[data-video-toggle]');\n    if (!video || !toggle) return;\n    toggle.addEventListener('click', () => {\n      const paused = video.paused;\n      if (paused) video.play();\n      else video.pause();\n      toggle.setAttribute('aria-pressed', String(!paused));\n      toggle.querySelector('[data-label-pause]').hidden = !paused;\n      toggle.querySelector('[data-label-play]').hidden = paused;\n    });\n  });\n\n  document.addEventListener('change', (event) => {\n    const select = event.target.closest('[data-autosubmit]');\n    if (select && select.form) select.form.requestSubmit();\n  });\n\n  register('[data-facets-form]', (form) => {\n    form.addEventListener('submit', (event) => {\n      event.preventDefault();\n      const params = new URLSearchParams();\n      new FormData(form).forEach((value, key) => {\n        if (value !== '') params.append(key, value);\n      });\n      window.location.search = params.toString();\n    });\n  });\n\n  const cartCount = (count) => {\n    document.querySelectorAll('[data-cart-count]').forEach((el) => {\n      el.textContent = count;\n      el.hidden = Number(count) === 0;\n    });\n    document.querySelectorAll('[data-cart-count-text]').forEach((el) => {\n      el.textContent = count;\n    });\n  };\n\n  const refreshCart = async () => {\n    const response = await fetch(`${routes.cart}?view=drawer`, { headers: { Accept: 'text/html' } });\n    const html = await response.text();\n    document.querySelectorAll('[data-cart-drawer-content], [data-cart-page]').forEach((container) => {\n      container.innerHTML = html;\n    });\n    const inner = document.querySelector('[data-cart-count-value]');\n    if (inner) cartCount(inner.dataset.cartCountValue);\n  };\n\n  document.addEventListener('click', async (event) => {\n    const button = event.target.closest('[data-cart-quantity]');\n    if (!button) return;\n    const line = button.closest('[data-line]');\n    if (!line) return;\n    const inner = button.closest('.cart-drawer__inner');\n    inner?.setAttribute('aria-busy', 'true');\n    try {\n      await fetch(routes.cartChange, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({ line: Number(line.dataset.line), quantity: Number(button.dataset.cartQuantity) }),\n      });\n      await refreshCart();\n    } finally {\n      inner?.removeAttribute('aria-busy');\n    }\n  });\n\n  const formatMoney = (cents) => {\n    const { moneyFormat = '\u20AC{{amount_with_comma_separator}}' } = window.themeLocale || {};\n    const value = Number(cents || 0) / 100;\n    const group = (number, decimals, thousands, decimal) => {\n      const [whole, fraction] = number.toFixed(decimals).split('.');\n      const withThousands = whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousands);\n      return fraction ? `${withThousands}${decimal}${fraction}` : withThousands;\n    };\n    return moneyFormat.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/, (match, key) => {\n      switch (key) {\n        case 'amount_no_decimals':\n          return group(value, 0, ',', '.');\n        case 'amount_with_comma_separator':\n          return group(value, 2, '.', ',');\n        case 'amount_no_decimals_with_comma_separator':\n          return group(value, 0, '.', ',');\n        case 'amount_with_apostrophe_separator':\n          return group(value, 2, \"'\", '.');\n        default:\n          return group(value, 2, ',', '.');\n      }\n    });\n  };\n\n  let notificationTimer;\n  const showCartNotification = (added) => {\n    const panel = document.querySelector('[data-cart-notification]');\n    const items = (Array.isArray(added) ? added : [added]).filter(Boolean);\n    if (!panel || items.length === 0) {\n      openDialog(document.getElementById('cart-drawer'));\n      return;\n    }\n    const list = panel.querySelector('[data-notification-items]');\n    const summary = panel.querySelector('[data-notification-summary]');\n    const strings = window.themeStrings || {};\n    list.innerHTML = '';\n    items.forEach((item) => {\n      const li = document.createElement('li');\n      li.className = 'cart-notification__item';\n      const media = document.createElement('div');\n      media.className = 'cart-notification__media';\n      if (item.image) {\n        const img = document.createElement('img');\n        const src = new URL(item.image, window.location.origin);\n        src.searchParams.set('width', '160');\n        img.src = src.toString();\n        img.alt = item.product_title || '';\n        media.appendChild(img);\n      }\n      const details = document.createElement('div');\n      details.className = 'cart-notification__details';\n      const name = document.createElement('p');\n      name.className = 'cart-notification__name';\n      name.textContent = item.product_title || item.title || '';\n      details.appendChild(name);\n      if (!item.product_has_only_default_variant && item.variant_title) {\n        const variant = document.createElement('p');\n        variant.className = 'cart-notification__meta';\n        variant.textContent = item.variant_title;\n        details.appendChild(variant);\n      }\n      const price = document.createElement('p');\n      price.className = 'cart-notification__meta';\n      price.textContent = `${item.quantity} \u00D7 ${formatMoney(item.final_price)}`;\n      details.appendChild(price);\n      li.append(media, details);\n      list.appendChild(li);\n    });\n    const totalQty = items.reduce((sum, item) => sum + Number(item.quantity || 0), 0);\n    list.classList.toggle('is-multiple', items.length > 1);\n    summary.hidden = items.length < 2;\n    summary.textContent = (strings.addedCount || '').replace('%count%', totalQty);\n    if (!panel.open) panel.show();\n    clearTimeout(notificationTimer);\n    notificationTimer = setTimeout(() => panel.open && panel.close(), 7000);\n  };\n\n  register('[data-product]', (root) => {\n    const variantsEl = root.querySelector('[data-product-variants]');\n    const variants = variantsEl ? JSON.parse(variantsEl.textContent) : [];\n    const form = root.querySelector('[data-product-form]');\n    const idInput = root.querySelector('[data-variant-id]');\n    const priceEl = root.querySelector('[data-product-price]');\n    const addButton = root.querySelector('[data-add-to-cart]');\n    const addLabel = root.querySelector('[data-add-label]');\n    const errorEl = root.querySelector('[data-product-error]');\n    const picker = root.querySelector('[data-variant-picker]');\n    const track = root.querySelector('[data-gallery-track]');\n    const counter = root.querySelector('[data-gallery-current]');\n    const strings = window.themeStrings || {};\n\n    const selectedOptions = () =>\n      Array.from(root.querySelectorAll('[data-option-position]')).map(\n        (fieldset) => fieldset.querySelector('input:checked')?.value\n      );\n\n    const markAvailability = (selected) => {\n      root.querySelectorAll('[data-option-position]').forEach((fieldset) => {\n        const position = Number(fieldset.dataset.optionPosition) - 1;\n        fieldset.querySelectorAll('input').forEach((input) => {\n          const candidate = [...selected];\n          candidate[position] = input.value;\n          const match = variants.find((v) => v.options.every((o, i) => o === candidate[i]));\n          input.nextElementSibling?.classList.toggle('is-unavailable', !match || !match.available);\n        });\n        const label = fieldset.querySelector('[data-selected-value]');\n        if (label) label.textContent = selected[position] || '';\n      });\n    };\n\n    const variantMedia = new Set((track?.dataset.variantMedia || '').split(',').filter(Boolean));\n    const totalEl = root.querySelector('[data-gallery-total]');\n    const counterWrap = root.querySelector('[data-gallery-counter]');\n\n    const applyVariantMedia = (variant) => {\n      if (!track || !variant || !variant.featured_media_id || variantMedia.size === 0) return;\n      const selectedId = String(variant.featured_media_id);\n      const items = Array.from(track.children);\n      items.forEach((li) => {\n        const id = li.dataset.mediaId;\n        li.hidden = variantMedia.has(id) && id !== selectedId;\n      });\n      const selected = track.querySelector(`[data-media-id=\"${selectedId}\"]`);\n      if (selected) {\n        selected.querySelector('img')?.setAttribute('loading', 'eager');\n        if (selected !== track.firstElementChild) track.prepend(selected);\n      }\n      const visible = items.filter((li) => !li.hidden).length;\n      track.classList.toggle('is-single', visible === 1);\n      if (totalEl) totalEl.textContent = visible;\n      if (counterWrap) counterWrap.hidden = visible < 2;\n      if (counter) counter.textContent = 1;\n      track.scrollTo({ left: 0 });\n      const top = track.getBoundingClientRect().top;\n      if (top < 0) window.scrollBy({ top: top - 120, behavior: 'smooth' });\n    };\n\n    const onVariantChange = () => {\n      const selected = selectedOptions();\n      markAvailability(selected);\n      const variant = variants.find((v) => v.options.every((o, i) => o === selected[i]));\n      if (errorEl) errorEl.hidden = true;\n      if (!variant) {\n        if (addButton) addButton.disabled = true;\n        if (addLabel) addLabel.textContent = strings.unavailable;\n        return;\n      }\n      idInput.value = variant.id;\n      if (priceEl) priceEl.innerHTML = variant.price_html;\n      if (addButton) addButton.disabled = !variant.available;\n      if (addLabel) addLabel.textContent = variant.available ? strings.addToCart : strings.soldOut;\n      applyVariantMedia(variant);\n      const url = new URL(window.location.href);\n      url.searchParams.set('variant', variant.id);\n      window.history.replaceState({}, '', url.toString());\n    };\n\n    if (picker) {\n      picker.addEventListener('change', onVariantChange);\n      markAvailability(selectedOptions());\n    }\n\n    root.querySelectorAll('[data-quantity-step]').forEach((button) => {\n      button.addEventListener('click', () => {\n        const input = button.parentElement.querySelector('input');\n        input.value = Math.max(1, Number(input.value || 1) + Number(button.dataset.quantityStep));\n        input.dispatchEvent(new Event('change', { bubbles: true }));\n      });\n    });\n\n    if (track && counter) {\n      track.addEventListener(\n        'scroll',\n        () => {\n          const index = Math.round(track.scrollLeft / track.clientWidth) + 1;\n          counter.textContent = index;\n        },\n        { passive: true }\n      );\n    }\n\n    form?.addEventListener('submit', async (event) => {\n      event.preventDefault();\n      if (!addButton) return;\n      addButton.setAttribute('aria-busy', 'true');\n      if (errorEl) errorEl.hidden = true;\n      try {\n        const response = await fetch(routes.cartAdd, {\n          method: 'POST',\n          headers: { Accept: 'application/json' },\n          body: new FormData(form),\n        });\n        const data = await response.json();\n        if (!response.ok) {\n          if (errorEl) {\n            errorEl.textContent = data.description || data.message || strings.error;\n            errorEl.hidden = false;\n          }\n          return;\n        }\n        await refreshCart();\n        showCartNotification(data.items ? data.items : data);\n      } catch (error) {\n        if (errorEl) {\n          errorEl.textContent = strings.error;\n          errorEl.hidden = false;\n        }\n      } finally {\n        addButton.removeAttribute('aria-busy');\n      }\n    });\n  });\n\n  let noteTimer;\n  document.addEventListener('input', (event) => {\n    const note = event.target.closest('[data-cart-note]');\n    if (!note) return;\n    clearTimeout(noteTimer);\n    noteTimer = setTimeout(() => {\n      fetch(routes.cartUpdate, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({ note: note.value }),\n      }).catch(() => {});\n    }, 500);\n  });\n\n  document.addEventListener('change', async (event) => {\n    const giftBox = event.target.closest('[data-gift-box]');\n    if (!giftBox) return;\n    const inner = giftBox.closest('.cart-drawer__inner');\n    inner?.setAttribute('aria-busy', 'true');\n    try {\n      if (giftBox.checked) {\n        await fetch(routes.cartAdd, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({ items: [{ id: Number(giftBox.dataset.variantId), quantity: 1 }] }),\n        });\n      } else if (Number(giftBox.dataset.line) > 0) {\n        await fetch(routes.cartChange, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({ line: Number(giftBox.dataset.line), quantity: 0 }),\n        });\n      }\n      await refreshCart();\n    } finally {\n      inner?.removeAttribute('aria-busy');\n    }\n  });\n\n  register('[data-lightbox]', (lightbox) => {\n    const root = lightbox.closest('[data-product]');\n    const track = root?.querySelector('[data-gallery-track]');\n    const stage = lightbox.querySelector('[data-lightbox-stage]');\n    const img = lightbox.querySelector('[data-lightbox-img]');\n    let sources = [];\n    let index = 0;\n\n    const zoomables = () =>\n      Array.from(track?.querySelectorAll('[data-zoom-src]') || []).filter((li) => !li.hidden);\n\n    const show = (i) => {\n      index = (i + sources.length) % sources.length;\n      stage.classList.remove('is-zoomed');\n      img.src = sources[index].dataset.zoomSrc;\n      img.alt = sources[index].querySelector('img')?.alt || '';\n      lightbox.querySelectorAll('[data-lightbox-prev], [data-lightbox-next]').forEach((b) => (b.hidden = sources.length < 2));\n    };\n\n    track?.addEventListener('click', (event) => {\n      const item = event.target.closest('[data-zoom-src]');\n      if (!item) return;\n      sources = zoomables();\n      show(Math.max(0, sources.indexOf(item)));\n      lightbox.showModal();\n    });\n\n    stage.addEventListener('click', (event) => {\n      if (event.target !== img) return;\n      const rect = img.getBoundingClientRect();\n      const px = (event.clientX - rect.left) / rect.width;\n      const py = (event.clientY - rect.top) / rect.height;\n      const zoomed = stage.classList.toggle('is-zoomed');\n      if (zoomed) {\n        requestAnimationFrame(() => {\n          stage.scrollLeft = px * stage.scrollWidth - stage.clientWidth / 2;\n          stage.scrollTop = py * stage.scrollHeight - stage.clientHeight / 2;\n        });\n      }\n    });\n\n    stage.addEventListener('mousemove', (event) => {\n      if (!stage.classList.contains('is-zoomed')) return;\n      const rect = stage.getBoundingClientRect();\n      stage.scrollLeft = ((event.clientX - rect.left) / rect.width) * (stage.scrollWidth - stage.clientWidth);\n      stage.scrollTop = ((event.clientY - rect.top) / rect.height) * (stage.scrollHeight - stage.clientHeight);\n    });\n\n    lightbox.querySelector('[data-lightbox-prev]')?.addEventListener('click', () => show(index - 1));\n    lightbox.querySelector('[data-lightbox-next]')?.addEventListener('click', () => show(index + 1));\n    lightbox.addEventListener('keydown', (event) => {\n      if (event.key === 'ArrowLeft') show(index - 1);\n      if (event.key === 'ArrowRight') show(index + 1);\n    });\n    lightbox.addEventListener('close', () => stage.classList.remove('is-zoomed'));\n  });\n\n  register('[data-perfume-set]', (set) => {\n    const root = set.closest('[data-product]');\n    const strings = window.themeStrings || {};\n    const position = Number(set.dataset.formatPosition);\n    const tiers = (set.dataset.tiers || '')\n      .split(',')\n      .map((tier) => tier.split(':').map((n) => Number(n.trim())))\n      .filter(([qty, pct]) => qty > 0 && pct > 0)\n      .sort((a, b) => a[0] - b[0]);\n    const items = Array.from(set.querySelectorAll('[data-set-item]')).map((el) => ({\n      el,\n      qty: el.querySelector('[data-set-qty]'),\n      steps: el.querySelectorAll('[data-set-step]'),\n      price: el.querySelector('[data-set-price]'),\n      variants: JSON.parse(el.dataset.variants || '{}'),\n    }));\n    const formatLabel = set.querySelector('[data-set-format]');\n    const progress = set.querySelector('[data-set-progress]');\n    const addButton = set.querySelector('[data-set-add]');\n    const mainQty = root?.querySelector('#product-quantity');\n\n    const currentFormat = () => {\n      const input = root?.querySelector(`[data-option-position=\"${position}\"] input:checked`);\n      return input ? input.value : '';\n    };\n    const qtyOf = (input) => Math.max(0, Math.min(Number(input.max) || 99, parseInt(input.value, 10) || 0));\n    const mainQuantity = () => (mainQty ? Math.max(1, parseInt(mainQty.value, 10) || 1) : 1);\n\n    const update = () => {\n      const format = currentFormat();\n      const key = format.toLowerCase().trim();\n      if (formatLabel) formatLabel.textContent = format;\n      let extra = 0;\n      items.forEach((item) => {\n        const variant = item.variants[key];\n        const usable = Boolean(variant && variant.available);\n        item.el.hidden = !variant;\n        item.el.classList.toggle('is-unavailable', !usable);\n        item.qty.disabled = !usable;\n        item.steps.forEach((b) => (b.disabled = !usable));\n        item.qty.value = usable ? qtyOf(item.qty) : 0;\n        item.price.textContent = variant ? (variant.available ? variant.price : strings.soldOut) : '';\n        extra += Number(item.qty.value);\n      });\n      const selected = mainQuantity() + extra;\n      const reached = tiers.filter(([qty]) => selected >= qty).pop();\n      const next = tiers.find(([qty]) => selected < qty);\n      set.querySelectorAll('[data-tier]').forEach((li) => {\n        li.classList.toggle('is-active', Boolean(reached) && Number(li.dataset.tier) === reached[0]);\n      });\n      let text = '';\n      if (next) {\n        const missing = next[0] - selected;\n        text = ((missing === 1 ? strings.setMissingOne : strings.setMissing) || '')\n          .replace('%count%', missing)\n          .replace('%discount%', next[1]);\n      }\n      if (reached) {\n        text = `${(strings.setReached || '').replace('%discount%', reached[1])}${text ? ' \u00B7 ' + text : ''}`;\n      }\n      progress.textContent = text;\n      addButton.disabled = extra === 0;\n    };\n\n    set.addEventListener('click', (event) => {\n      const step = event.target.closest('[data-set-step]');\n      if (!step || step.disabled) return;\n      const input = step.parentElement.querySelector('[data-set-qty]');\n      input.value = qtyOf(input) + Number(step.dataset.setStep);\n      input.value = qtyOf(input);\n      update();\n    });\n    set.addEventListener('input', update);\n    set.addEventListener('change', update);\n    mainQty?.addEventListener('change', update);\n    mainQty?.addEventListener('input', update);\n    root?.querySelector('[data-variant-picker]')?.addEventListener('change', update);\n    update();\n\n    addButton.addEventListener('click', async () => {\n      const key = currentFormat().toLowerCase().trim();\n      const mainId = Number(root.querySelector('[data-variant-id]').value);\n      const payload = [{ id: mainId, quantity: mainQuantity() }];\n      items.forEach((item) => {\n        const quantity = Number(item.qty.value);\n        if (quantity > 0 && item.variants[key]) payload.push({ id: item.variants[key].id, quantity });\n      });\n      addButton.setAttribute('aria-busy', 'true');\n      try {\n        const response = await fetch(routes.cartAdd, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({ items: payload }),\n        });\n        const data = await response.json();\n        if (!response.ok) {\n          progress.textContent = data.description || data.message || strings.error;\n          return;\n        }\n        items.forEach((item) => (item.qty.value = 0));\n        update();\n        await refreshCart();\n        showCartNotification(data.items ? data.items : data);\n      } finally {\n        addButton.removeAttribute('aria-busy');\n      }\n    });\n  });\n\n  register('[data-charm-builder]', (builder) => {\n    const root = builder.closest('[data-product]');\n    const strings = window.themeStrings || {};\n    const local = JSON.parse(builder.querySelector('[data-charm-strings]')?.textContent || '{}');\n    const max = Number(builder.dataset.max) || 5;\n    const variantsEl = root?.querySelector('[data-product-variants]');\n    const necklaceVariants = variantsEl ? JSON.parse(variantsEl.textContent) : [];\n    const idInput = root?.querySelector('[data-variant-id]');\n    const finishInputs = Array.from(builder.querySelectorAll('[data-charm-finish]'));\n    const slots = Array.from(builder.querySelectorAll('[data-charm-slot]'));\n    const limitEl = builder.querySelector('[data-charm-limit]');\n    const addButton = builder.querySelector('[data-charm-add]');\n    const errorEl = builder.querySelector('[data-charm-error]');\n    const tiles = Array.from(builder.querySelectorAll('[data-charm-tile]')).map((el) => ({\n      el,\n      name: el.dataset.name,\n      category: el.dataset.category,\n      variants: JSON.parse(el.dataset.variants || '{}'),\n      image: el.querySelector('[data-charm-image]'),\n      count: el.querySelector('[data-charm-count]'),\n      note: el.querySelector('[data-charm-note]'),\n      pick: el.querySelector('[data-charm-pick]'),\n    }));\n    const selected = [];\n    let finishTouched = false;\n    const onlyToggle = builder.querySelector('[data-charm-only]');\n    onlyToggle?.addEventListener('change', () => render());\n    const stage = root?.querySelector('[data-charm-stage]');\n    const chainCanvas = stage?.querySelector('[data-charm-chain]');\n    const hanging = stage?.querySelector('[data-charm-hanging]');\n    const chainImages = {};\n\n    const finishLabel = (key) =>\n      finishInputs.find((input) => input.value.toLowerCase() === key)?.value || key.charAt(0).toUpperCase() + key.slice(1);\n    const currentFinish = () => (finishInputs.find((input) => input.checked)?.value || 'default').toLowerCase();\n    const variantFor = (tile) => {\n      const wanted = currentFinish();\n      if (tile.variants[wanted]?.available) return { key: wanted, variant: tile.variants[wanted] };\n      const fallback = Object.entries(tile.variants).find(([, v]) => v.available);\n      return fallback ? { key: fallback[0], variant: fallback[1] } : null;\n    };\n    const necklace = () => necklaceVariants.find((v) => String(v.id) === String(idInput?.value));\n\n    // Cut-out charm images live in the theme files; until one is confirmed to\n    // exist the variant photo is shown, and it stays if the cut-out is missing.\n    const cutouts = {};\n    const shown = (variant) => {\n      if (!variant.fallback || variant.image === variant.fallback) return variant.image;\n      if (!(variant.image in cutouts)) {\n        cutouts[variant.image] = null;\n        const probe = new Image();\n        probe.addEventListener('load', () => {\n          cutouts[variant.image] = true;\n          render();\n        });\n        probe.addEventListener('error', () => (cutouts[variant.image] = false));\n        probe.src = variant.image;\n      }\n      return cutouts[variant.image] ? variant.image : variant.fallback;\n    };\n\n    // Necklace preview: the straight chain photo is bent along a U-shaped curve\n    // and the chosen charms hang from evenly spaced points at the bottom.\n    const necklaceFinish = () => {\n      const values = (necklace()?.options || []).map((o) => String(o).toLowerCase());\n      return values.some((v) => v.includes('silver') || v.includes('argento')) ? 'silver' : 'gold';\n    };\n    const curvePoint = (u, w, h) => {\n      const angle = (u * Math.PI) / 2;\n      return { x: w / 2 + w * 0.37 * Math.sin(angle), y: -h * 0.06 + h * 0.66 * Math.cos(angle) };\n    };\n    // Real necklace photos: when the chosen base variant has one, it replaces the\n    // drawn chain and the charms hang along its lower edge, found from the pixels.\n    const baseImg = stage?.querySelector('[data-charm-base]');\n    let previews = {};\n    try {\n      previews = JSON.parse(stage?.querySelector('[data-necklace-previews]')?.textContent || '{}');\n    } catch (error) {\n      previews = {};\n    }\n    const basePreview = () => {\n      const variant = necklace();\n      if (!variant) return null;\n      const title = (variant.options || []).join(' / ').toLowerCase().trim();\n      const entry = previews[title] || previews['*'];\n      if (!entry) return null;\n      if (typeof entry === 'string') return { src: entry, fixed: '', hook: previews.hook || null, scale: previews.scale || 1, lift: previews.lift || 0 };\n      const finish = necklaceFinish();\n      const name = String(variant.options?.[0] || '').split(' ')[0].toLowerCase();\n      const fixed = entry.pattern && name ? entry.fixed + entry.pattern.replace('%name%', name).replace('%finish%', finish) : '';\n      // `extra`: a second piece always on the necklace next to the fixed one (Icona: the heart).\n      const extra = entry.extra && entry.fixed ? entry.fixed + entry.extra.replace('%finish%', finish) : '';\n      return { src: entry[finish] || entry.gold, fixed, extra, row: entry.row || null, hook: entry.hook || previews.hook || null, scale: entry.scale || previews.scale || 1, lift: entry.lift || previews.lift || 0 };\n    };\n    const contours = {};\n    const loadContour = (src) => {\n      if (contours[src]) return contours[src];\n      contours[src] = { pending: true };\n      const img = new Image();\n      img.crossOrigin = 'anonymous';\n      img.addEventListener('load', () => {\n        try {\n          const size = 300;\n          const canvas = document.createElement('canvas');\n          canvas.width = size;\n          canvas.height = size;\n          const ctx = canvas.getContext('2d', { willReadFrequently: true });\n          ctx.drawImage(img, 0, 0, size, size);\n          const { data } = ctx.getImageData(0, 0, size, size);\n          const cols = [];\n          for (let x = 0; x < size; x++) {\n            let y2 = -1;\n            for (let y = size - 1; y >= 0; y--) {\n              if (data[(y * size + x) * 4 + 3] > 100) {\n                y2 = y;\n                break;\n              }\n            }\n            if (y2 < 0) continue;\n            let y1 = y2;\n            while (y1 > 0 && data[((y1 - 1) * size + x) * 4 + 3] > 100) y1--;\n            cols.push({ x, y1, y2 });\n          }\n          // Clasps and fixed pendants make much thicker runs: the chain line is\n          // carried across them from the neighbouring columns.\n          const thick = cols.map((c) => c.y2 - c.y1).sort((a, b) => a - b);\n          const limit = Math.max(6, (thick[Math.floor(thick.length / 2)] || 2) * 3);\n          const thin = cols.filter((c) => c.y2 - c.y1 <= limit);\n          const points = cols.map((c) => {\n            if (c.y2 - c.y1 <= limit) return { x: c.x, y: (c.y1 + c.y2) / 2 };\n            const left = [...thin].reverse().find((t) => t.x < c.x);\n            const right = thin.find((t) => t.x > c.x);\n            const ly = left ? (left.y1 + left.y2) / 2 : null;\n            const ry = right ? (right.y1 + right.y2) / 2 : null;\n            const y = ly !== null && ry !== null ? ly + ((ry - ly) * (c.x - left.x)) / (right.x - left.x) : ly ?? ry ?? c.y1;\n            return { x: c.x, y };\n          });\n          const path = points.map((p) => ({ x: ((p.x + 0.5) / size) * 100, y: ((p.y + 0.5) / size) * 100 }));\n          let length = 0;\n          path.forEach((p, i) => {\n            if (i) length += Math.hypot(p.x - path[i - 1].x, p.y - path[i - 1].y);\n            p.s = length;\n          });\n          const centre = path.reduce((best, p) => (Math.abs(p.x - 50) < Math.abs(best.x - 50) ? p : best), path[0]);\n          // Chain thickness (% of the stage): charms are sized from it.\n          const median = thick[Math.floor(thick.length / 2)] || 2;\n          // The necklace's own pendant (horseshoe, point\u2026): the thick columns\n          // around the middle. Charms are kept clear of it.\n          let pendant = null;\n          const mid = cols.filter((c) => c.y2 - c.y1 > limit && Math.abs(((c.x + 0.5) / size) * 100 - 50) < 14);\n          if (mid.length) {\n            const xs = mid.map((c) => ((c.x + 0.5) / size) * 100);\n            pendant = { x1: Math.min(...xs) - 2.5, x2: Math.max(...xs) + 2.5 };\n          }\n          // Opaque pixels of the necklace: a charm must not cover them.\n          // Only what is not the chain itself counts (pendants, clasps, rings):\n          // opaque pixels farther from the chain line than its thickness.\n          const lineY = new Float32Array(size).fill(-1);\n          points.forEach((p) => (lineY[p.x] = p.y));\n          const reachPx = Math.max(3, median * 1.2);\n          const span = Math.ceil(reachPx);\n          const mask = new Uint8Array(size * size);\n          for (let y = 0; y < size; y++) {\n            for (let x = 0; x < size; x++) {\n              if (data[(y * size + x) * 4 + 3] <= 100) continue;\n              let near = false;\n              for (let dx = -span; dx <= span && !near; dx++) {\n                const ly = lineY[x + dx];\n                if (ly >= 0 && Math.hypot(dx, y - ly) <= reachPx) near = true;\n              }\n              if (!near) mask[y * size + x] = 1;\n            }\n          }\n          contours[src] = { path, centre: centre ? centre.s : 0, thick: ((median + 1) / size) * 100, pendant, mask, size };\n        } catch (error) {\n          contours[src] = { failed: true };\n        }\n        renderHanging();\n      });\n      img.addEventListener('error', () => (contours[src] = { failed: true }));\n      img.src = src;\n      return contours[src];\n    };\n    const contourPoint = (contour, offset) => {\n      const path = contour.path;\n      const target = Math.min(Math.max(contour.centre + offset, 0), path[path.length - 1].s);\n      const i = Math.max(1, path.findIndex((p) => p.s >= target));\n      const a = path[i - 1];\n      const b = path[i] || a;\n      const t = b.s > a.s ? (target - a.s) / (b.s - a.s) : 0;\n      return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };\n    };\n    let shownBase = '';\n    const syncBase = () => {\n      const preview = basePreview();\n      const src = preview?.src || '';\n      if (src === shownBase) return;\n      shownBase = src;\n      if (baseImg) {\n        baseImg.hidden = !src;\n        if (src) baseImg.src = src;\n      }\n      if (chainCanvas) chainCanvas.hidden = Boolean(src);\n      if (src) loadContour(src);\n      else drawChain();\n    };\n    const chainImage = (finish) => {\n      if (!chainImages[finish]) {\n        const img = new Image();\n        img.addEventListener('load', () => drawChain());\n        img.src = finish === 'silver' ? stage.dataset.chainSilver : stage.dataset.chainGold;\n        chainImages[finish] = img;\n      }\n      return chainImages[finish];\n    };\n    const drawChain = () => {\n      if (!chainCanvas) return;\n      const w = stage.clientWidth;\n      const h = stage.clientHeight;\n      if (!w || !h) return;\n      // Drawn at the zoomed scale so the chain stays sharp when the preview zooms in.\n      const ratio = (window.devicePixelRatio || 1) * 1.3;\n      chainCanvas.width = Math.round(w * ratio);\n      chainCanvas.height = Math.round(h * ratio);\n      const ctx = chainCanvas.getContext('2d');\n      ctx.setTransform(ratio, 0, 0, ratio, 0, 0);\n      ctx.clearRect(0, 0, w, h);\n      const img = chainImage(necklaceFinish());\n      if (!img.complete || !img.naturalWidth) return;\n      const chainWidth = Math.max(4, w * (Number(stage.dataset.chainWidth) || 0.032));\n      const scale = chainWidth / img.naturalWidth;\n      const steps = 480;\n      let previous = curvePoint(-1, w, h);\n      let travelled = 0;\n      for (let i = 1; i <= steps; i++) {\n        const point = curvePoint(-1 + (2 * i) / steps, w, h);\n        const dx = point.x - previous.x;\n        const dy = point.y - previous.y;\n        const length = Math.hypot(dx, dy);\n        const sourceHeight = Math.min(img.naturalHeight, length / scale);\n        const sourceY = Math.min((travelled / scale) % img.naturalHeight, img.naturalHeight - sourceHeight);\n        ctx.save();\n        ctx.translate(previous.x, previous.y);\n        ctx.rotate(Math.atan2(dy, dx) - Math.PI / 2);\n        ctx.drawImage(img, 0, sourceY, img.naturalWidth, sourceHeight, -chainWidth / 2, 0, chainWidth, length + 0.6);\n        ctx.restore();\n        travelled += length;\n        previous = point;\n      }\n    };\n    // Where each charm hangs from (the top of its ring, its centre of mass) and\n    // how much of the image the charm really fills, read from the transparency.\n    // Opaque images (product photos) report no box.\n    const anchors = {};\n    const DEFAULT_ANCHOR = { x: 50, y: 7, l: 20, r: 80, t: 5, b: 85, ar: 1 };\n    const findAnchor = (src) => {\n      if (anchors[src]) return anchors[src];\n      anchors[src] = { ...DEFAULT_ANCHOR, pending: true };\n      const img = new Image();\n      img.crossOrigin = 'anonymous';\n      img.addEventListener('load', () => {\n        try {\n          const size = 120;\n          const canvas = document.createElement('canvas');\n          canvas.width = size;\n          canvas.height = size;\n          const ctx = canvas.getContext('2d', { willReadFrequently: true });\n          ctx.drawImage(img, 0, 0, size, size);\n          const { data } = ctx.getImageData(0, 0, size, size);\n          let top = -1;\n          let bottom = 0;\n          let left = size;\n          let right = 0;\n          let sumX = 0;\n          let count = 0;\n          let clear = 0;\n          for (let y = 0; y < size; y++) {\n            for (let x = 0; x < size; x++) {\n              const alpha = data[(y * size + x) * 4 + 3];\n              if (alpha < 20) clear += 1;\n              if (alpha > 110) {\n                if (top < 0) top = y;\n                bottom = y;\n                left = Math.min(left, x);\n                right = Math.max(right, x);\n                sumX += x;\n                count += 1;\n              }\n            }\n          }\n          const pct = (v) => (v / size) * 100;\n          const ar = img.naturalWidth ? img.naturalHeight / img.naturalWidth : 1;\n          if (count && clear > size * size * 0.05) {\n            anchors[src] = { x: pct(sumX / count + 0.5), y: pct(top) + 2, l: pct(left), r: pct(right + 1), t: pct(top), b: pct(bottom + 1), ar };\n          } else {\n            anchors[src] = { ...DEFAULT_ANCHOR, photo: true, ar };\n          }\n        } catch (error) {\n          anchors[src] = { ...DEFAULT_ANCHOR };\n        }\n        renderHanging();\n      });\n      img.addEventListener('error', () => (anchors[src] = { ...DEFAULT_ANCHOR }));\n      img.src = src;\n      return anchors[src];\n    };\n\n    // Charms on a necklace photo: all shown at the same visible height and laid\n    // out from the centre of the chain outwards, each one far enough from its\n    // neighbour that they never overlap; when they don't fit they get smaller.\n    // `scale`: per-necklace size of the charms (necklace-previews), e.g. on chunky chains.\n    // `lift` (% of the stage): chunky chains (Myself), the clasp goes up onto the link.\n    const layoutOnPhoto = (contour, input, scale = 1, lift = 0) => {\n      const length = contour.path[contour.path.length - 1].s;\n      // Icona pieces slide on the chain and sit almost touching.\n      const margin = scale > 1 ? 0.6 : input.some((m) => m.entry?.sequence) ? 0.3 : 1.6;\n      // The necklace's own pendant is an obstacle pinned to the centre.\n      let metrics = input;\n      if (contour.pendant) {\n        const half = Math.floor(input.length / 2);\n        metrics = [...input.slice(0, half), { obstacle: true, width: contour.pendant.x2 - contour.pendant.x1 }, ...input.slice(half)];\n      }\n      // Sequential pieces (Icona: letter, heart, then the added charms) are not pinned.\n      const pinned = metrics.findIndex((m) => m.obstacle || (m.entry?.fixed && !m.entry.sequence));\n      // Charms are about as tall as 1.6 chain thicknesses, never smaller than on\n      // a fine chain; with many charms they start a little smaller.\n      const count = input.length;\n      const base = count <= 3 ? 9.5 : count <= 5 ? 9 : 8.5;\n      let height = Math.min(16, Math.max(base, (contour.thick || 0) * 1.6)) * scale;\n      // Thick chains: the ring goes through the lower half of the link.\n      const drop = (contour.thick || 0) * 0.3 - lift;\n      const ends = [contourPoint(contour, -length), contourPoint(contour, length)];\n      const lowest = contourPoint(contour, 0).y;\n      // Charms stay on the lower part of the necklace.\n      const top = Math.max(ends[0].y, ends[1].y);\n      let reach = 0.55;\n      // Scaled necklaces (Myself) may shrink further, but stay bigger than unscaled ones.\n      const minHeight = scale > 1 ? (height / scale) * 0.85 : height * 0.7;\n      // Share of a charm's body (below its ring) that would cover the necklace.\n      const covers = (p, w, h) => {\n        if (!contour.mask) return 0;\n        const { mask, size } = contour;\n        let hit = 0;\n        let all = 0;\n        for (let gy = 0; gy < 12; gy++) {\n          for (let gx = 0; gx < 12; gx++) {\n            const x = p.x - w * 0.45 + (w * 0.9 * (gx + 0.5)) / 12;\n            const y = p.y + drop + h * 0.25 + (h * 0.75 * (gy + 0.5)) / 12;\n            const px = Math.floor((x / 100) * size);\n            const py = Math.floor((y / 100) * size);\n            if (px < 0 || py < 0 || px >= size || py >= size) continue;\n            all += 1;\n            hit += mask[py * size + px];\n          }\n        }\n        return all ? hit / all : 0;\n      };\n      const widthOf = (m) => {\n        if (m.obstacle) return m.width;\n        return (m.photo ? 0.6 : Math.max(0.25, (m.a.r - m.a.l) / Math.max(1, m.a.b - m.a.t))) * height;\n      };\n      // Lifted necklaces (Myself): charms keep their size and sit symmetrically around the\n      // centre; the preview zooms out instead of shrinking them.\n      if (lift && !contour.pendant && pinned < 0) {\n        const n = metrics.length;\n        // Same size up to 6 charms; from 7 on a little smaller each, so 10 still fit.\n        const H = n <= 6 ? 18 : Math.max(13, 18 - (n - 6) * 1.25);\n        height = H;\n        const widths = metrics.map(widthOf);\n        const offsets = new Array(n).fill(0);\n        const gap = (a, b) => (a + b) / 2 + 0.2;\n        // Pairs from the middle outwards: k-th pair = indices (mid - k, mid + k).\n        const pairs = [];\n        if (n % 2) {\n          const c = (n - 1) / 2;\n          offsets[c] = 0;\n          for (let k = 1; k <= c; k++) pairs.push([c - k, c + k, c - k + 1, c + k - 1]);\n        } else {\n          const a0 = n / 2 - 1;\n          let o = 0;\n          while (o < length && Math.abs(contourPoint(contour, o).x - contourPoint(contour, -o).x) < gap(widths[a0], widths[a0 + 1])) o += 0.25;\n          offsets[a0] = -o;\n          offsets[a0 + 1] = o;\n          for (let k = 1; k <= a0; k++) pairs.push([a0 - k, a0 + 1 + k, a0 - k + 1, a0 + k]);\n        }\n        pairs.forEach(([l, r, pl, pr]) => {\n          let o = offsets[pr];\n          const start = contourPoint(contour, o).x;\n          const startL = contourPoint(contour, -o).x;\n          const need = Math.max(gap(widths[r], widths[pr]), gap(widths[l], widths[pl]));\n          while (o < length) {\n            o += 0.25;\n            if (contourPoint(contour, o).x - start >= need && startL - contourPoint(contour, -o).x >= need) break;\n          }\n          offsets[r] = o;\n          offsets[l] = -o;\n        });\n        const placedSym = metrics.map((m, i) => {\n          const p = contourPoint(contour, offsets[i]);\n          return { ...m, point: { x: p.x, y: p.y + drop }, height };\n        });\n        // Zoom that keeps every charm inside the stage (origin 50% 66%), at most 1.3.\n        let zoom = 1.7;\n        placedSym.forEach((m, i) => {\n          const half = widths[i] / 2 + 1;\n          const dx = Math.max(Math.abs(m.point.x - half - 50), Math.abs(m.point.x + half - 50));\n          if (dx > 0) zoom = Math.min(zoom, 48 / dx);\n          const bottom = m.point.y + height * 1.05 - 66;\n          if (bottom > 0) zoom = Math.min(zoom, 32 / bottom);\n        });\n        placedSym.zoom = Math.max(0.55, zoom);\n        return placedSym;\n      }\n      for (let attempt = 0; attempt < 30; attempt++) {\n        const widths = metrics.map(widthOf);\n        const n = metrics.length;\n        const offsets = new Array(n);\n        const need = (i, j) => (widths[i] + widths[j]) / 2 + margin;\n        // Lifted charms (Myself) hang in front of the chain: only spacing between charms counts.\n        const walk = (from, i, dir, strict = !lift) => {\n          const start = contourPoint(contour, offsets[from]);\n          let o = offsets[from];\n          while (Math.abs(o) < length) {\n            o += dir * 0.25;\n            const p = contourPoint(contour, o);\n            if (Math.abs(p.x - start.x) >= need(from, i) && (!strict || metrics[i].obstacle || covers(p, widths[i], height) < 0.03)) return o;\n          }\n          return strict ? walk(from, i, dir, false) : null;\n        };\n        let ok = true;\n        let right;\n        let left;\n        if (pinned >= 0) {\n          offsets[pinned] = 0;\n          right = pinned + 1;\n          left = pinned - 1;\n        } else if (n % 2) {\n          // The middle charm goes to the centre, or the nearest free spot.\n          const c = (n - 1) / 2;\n          let o0 = 0;\n          for (let d = 0; d < length; d += 0.25) {\n            if (lift || covers(contourPoint(contour, d), widths[c], height) < 0.03) { o0 = d; break; }\n            if (covers(contourPoint(contour, -d), widths[c], height) < 0.03) { o0 = -d; break; }\n          }\n          offsets[c] = o0;\n          right = (n + 1) / 2;\n          left = (n - 3) / 2;\n        } else {\n          // Two middle charms sit symmetrically around the centre.\n          const a = n / 2 - 1;\n          let o = 0;\n          while (o < length && Math.abs(contourPoint(contour, o).x - contourPoint(contour, -o).x) < need(a, a + 1)) o += 0.25;\n          offsets[a] = -o;\n          offsets[a + 1] = o;\n          right = a + 2;\n          left = a - 1;\n        }\n        for (let i = right; i < n; i++) {\n          const o = walk(i - 1, i, 1);\n          if (o === null) ok = false;\n          offsets[i] = o ?? offsets[i - 1];\n        }\n        for (let i = left; i >= 0; i--) {\n          const o = walk(i + 1, i, -1);\n          if (o === null) ok = false;\n          offsets[i] = o ?? offsets[i + 1];\n        }\n        const limitY = lowest - (lowest - top) * reach;\n        if ((ok && offsets.every((o) => contourPoint(contour, o).y >= limitY)) || attempt === 29) {\n          return metrics\n            .map((m, i) => {\n              if (m.obstacle) return null;\n              const p = contourPoint(contour, offsets[i]);\n              return { ...m, point: { x: p.x, y: p.y + drop }, height };\n            })\n            .filter(Boolean);\n        }\n        // Smaller first, down to a limit; then the charms may climb higher.\n        // As a last resort they get smaller still, rather than overlapping.\n        // Scaled necklaces: first climb a little up the sides, then shrink.\n        if (scale > 1 && reach < 0.75) reach += 0.1;\n        else if (height * 0.9 >= minHeight) height *= 0.9;\n        else if (reach < 0.9) reach = Math.min(0.9, reach + 0.1);\n        else height *= 0.92;\n      }\n      return [];\n    };\n\n    const renderHanging = () => {\n      if (!hanging) return;\n      hanging.innerHTML = '';\n      // Up to 5 charms keep their full size; more charms get smaller and spread\n      // further along the chain, and the preview zooms in less.\n      const count = Math.max(1, selected.length);\n      const spread = count <= 5 ? 0.22 : Math.min(0.22, (count > 10 ? 1.6 : 1.4) / (count - 1));\n      const size = count <= 5 ? 19 : Math.max(8, 19 * Math.sqrt(5 / count));\n      stage?.style.setProperty('--charm-size', `${size}%`);\n      stage?.style.setProperty('--charm-zoom', count <= 4 ? 1.3 : count <= 7 ? 1.15 : 1);\n      const preview = basePreview();\n      // Bracelets (Identity): letters and symbols slide side by side on the strap.\n      stage?.classList.toggle('is-bracelet', Boolean(preview?.row));\n      if (preview?.row) {\n        const { x1, x2, y, h } = preview.row;\n        const per = h * 0.82 + 0.4;\n        const height = h * Math.min(1, (x2 - x1) / (count * per));\n        stage?.style.setProperty('--charm-zoom', 1);\n        const row = document.createElement('div');\n        row.className = 'charm-builder__row';\n        row.style.left = `${x1}%`;\n        row.style.width = `${x2 - x1}%`;\n        row.style.top = `${y}%`;\n        row.style.height = `${height}%`;\n        selected.forEach((item, index) => {\n          const button = document.createElement('button');\n          button.type = 'button';\n          button.className = `charm-builder__slide${index === justAdded ? ' is-new' : ''}`;\n          button.dataset.charmRemove = index;\n          button.setAttribute('aria-label', (local.remove || '').replace('%name%', `${item.tile.name} ${finishLabel(item.key)}`));\n          const img = document.createElement('img');\n          img.src = shown(item.variant);\n          img.alt = '';\n          button.appendChild(img);\n          row.appendChild(button);\n        });\n        hanging.appendChild(row);\n        return;\n      }\n      const contour = preview ? loadContour(preview.src) : null;\n      const onPhoto = contour && contour.path && contour.path.length > 1;\n      const items = selected.map((item, index) => ({ item, index }));\n      if (onPhoto && preview.fixed && preview.extra) {\n        // Icona: the letter/number and the heart first, then the added charms in order.\n        items.unshift({ fixed: preview.fixed, sequence: true }, { fixed: preview.extra, sequence: true });\n      } else if (onPhoto && preview.fixed) {\n        items.splice(Math.floor(items.length / 2), 0, { fixed: preview.fixed });\n      }\n      const metrics = items.map((entry) => {\n        const src = entry.fixed || shown(entry.item.variant);\n        const a = findAnchor(src);\n        const photo = Boolean(a.photo || (!entry.fixed && entry.item.variant.fallback && src === entry.item.variant.fallback && a.pending));\n        return { entry, src, a, photo };\n      });\n      // `hook`: necklaces with a single charm hooked to the clasp (Timone): x, y and\n      // charm height in % of the stage.\n      const hook = preview?.hook;\n      const placed = hook\n        ? metrics.map((m, i) => {\n            // hook.points: one clasp per charm (Libera: left and right clasp).\n            const p = hook.points ? hook.points[Math.min(i, hook.points.length - 1)] : hook;\n            return { ...m, point: { x: p.x, y: p.y }, height: hook.h, tilt: p.tilt ?? hook.tilt, front: hook.points ? p.front : null };\n          })\n        : onPhoto\n        ? layoutOnPhoto(contour, metrics, preview.scale, preview.lift)\n        : metrics.map((m, position) => ({ ...m, point: curvePoint((m.entry.index - (selected.length - 1) / 2) * spread, 100, 100), height: null }));\n      // hook.zoom < 1: close-up photos (Fusion) are shown a little smaller.\n      stage?.classList.toggle('is-zoomed-out', Boolean((hook?.zoom && hook.zoom < 1) || (placed.zoom && placed.zoom < 1)));\n      stage?.style.setProperty('--charm-zoom', hook ? hook.zoom || 1 : placed.zoom ? placed.zoom : onPhoto ? (placed.length <= 3 ? 1.3 : placed.length <= 6 ? 1.15 : 1) : count <= 4 ? 1.3 : count <= 7 ? 1.15 : 1);\n      placed.forEach(({ entry, src, a, photo, point, height, tilt }) => {\n        const { item, index } = entry;\n        const el = document.createElement(entry.fixed ? 'span' : 'button');\n        el.className = `charm-builder__hung${entry.fixed ? ' charm-builder__hung--fixed' : ''}${photo ? ' charm-builder__hung--photo' : ''}${!entry.fixed && index === justAdded ? ' is-new' : ''}`;\n        el.style.left = `${point.x}%`;\n        el.style.top = `${point.y}%`;\n        if (tilt) el.style.setProperty('--tilt', `${tilt}deg`);\n        if (height) {\n          // Image width so that the visible charm is `height` % of the stage tall.\n          const width = photo ? height * 0.6 : height / (((a.b - a.t) / 100) * a.ar);\n          el.style.width = `${width}%`;\n        }\n        el.style.setProperty('--ax', photo ? '50%' : `${a.x}%`);\n        el.style.setProperty('--ay', photo ? '0%' : `${a.y}%`);\n        if (!entry.fixed) {\n          el.type = 'button';\n          el.dataset.charmRemove = index;\n          el.setAttribute('aria-label', (local.remove || '').replace('%name%', `${item.tile.name} ${finishLabel(item.key)}`));\n        }\n        if (photo && item) {\n          // No cut-out yet: a small gold or silver token with the charm's name.\n          const token = document.createElement('span');\n          token.className = `charm-builder__token charm-builder__token--${item.key === 'silver' ? 'silver' : 'gold'}`;\n          token.textContent = item.tile.name;\n          if (item.tile.name.length > 2) token.style.fontSize = `${Math.max(9, 60 / Math.sqrt(item.tile.name.length))}cqi`;\n          el.appendChild(token);\n        } else {\n          const img = document.createElement('img');\n          img.src = src;\n          img.alt = '';\n          img.width = 300;\n          img.height = 300;\n          el.appendChild(img);\n        }\n        hanging.appendChild(el);\n      });\n      // hook.front [x1, y1, x2, y2]: the part of the clasp ring drawn again in front of\n      // the charm's bail, so the ring passes through it.\n      // front [x1, y1, x2, y2]: part of the clasp drawn again in front of a charm's bail,\n      // so the bail passes through it (per hook, or per point on necklaces with two clasps).\n      const fronts = [hook?.front, ...placed.map((m) => m.front)].filter((f, i) => f && (i > 0 || placed.length));\n      fronts.forEach(([x1, y1, x2, y2]) => {\n        const front = document.createElement('img');\n        front.className = 'charm-builder__base charm-builder__front';\n        front.src = preview.src;\n        front.alt = '';\n        front.style.clipPath = `inset(${y1}% ${100 - x2}% ${100 - y2}% ${x1}%)`;\n        hanging.appendChild(front);\n      });\n    };\n    let drawnFinish = '';\n    let justAdded = -1;\n    if (stage && 'ResizeObserver' in window) new ResizeObserver(() => drawChain()).observe(stage);\n\n    const render = () => {\n      const wanted = currentFinish();\n      const full = selected.length >= max;\n      tiles.forEach((tile) => {\n        const match = variantFor(tile);\n        if (match && tile.image && tile.image.dataset.src !== shown(match.variant)) {\n          tile.image.dataset.src = shown(match.variant);\n          tile.image.removeAttribute('srcset');\n          tile.image.src = shown(match.variant);\n        }\n        const fallback = match && match.key !== wanted && match.key !== 'default' && finishInputs.length > 0;\n        tile.note.hidden = !fallback;\n        if (fallback) tile.note.textContent = (local.onlyFinish || '').replace('%finish%', finishLabel(match.key));\n        const count = selected.filter((s) => s.tile === tile).length;\n        tile.count.hidden = count === 0;\n        tile.count.textContent = count;\n        tile.el.classList.toggle('is-selected', count > 0);\n        tile.pick.disabled = !match || full;\n      });\n      slots.forEach((slot, index) => {\n        const item = selected[index];\n        slot.classList.toggle('is-filled', Boolean(item));\n        slot.innerHTML = '';\n        if (!item) {\n          const number = document.createElement('span');\n          number.className = 'charm-builder__slot-number';\n          number.textContent = index + 1;\n          slot.appendChild(number);\n          return;\n        }\n        const button = document.createElement('button');\n        button.type = 'button';\n        button.className = 'charm-builder__slot-remove';\n        button.dataset.charmRemove = index;\n        button.setAttribute('aria-label', (local.remove || '').replace('%name%', `${item.tile.name} ${finishLabel(item.key)}`));\n        const img = document.createElement('img');\n        img.src = shown(item.variant);\n        img.alt = '';\n        img.width = 150;\n        img.height = 150;\n        button.appendChild(img);\n        slot.appendChild(button);\n      });\n      limitEl.hidden = !full;\n      renderHanging();\n      justAdded = -1;\n      stage?.classList.toggle('is-zoomed', selected.length > 0 || stage.classList.contains('is-zoomed-out'));\n      syncBase();\n      if (!shownBase && necklaceFinish() !== drawnFinish) {\n        drawnFinish = necklaceFinish();\n        drawChain();\n      }\n      const base = necklace();\n      const charmsOnly = Boolean(onlyToggle?.checked);\n      const necklacePrice = base && !charmsOnly ? base.price : 0;\n      const charmsTotal = selected.reduce((sum, s) => sum + s.variant.price, 0);\n      builder.querySelector('[data-charm-necklace-price]').textContent = charmsOnly ? '\u2014' : base ? formatMoney(base.price) : '';\n      builder.querySelector('[data-charm-charms-price]').textContent = formatMoney(charmsTotal);\n      builder.querySelector('[data-charm-total-count]').textContent = `(${selected.length})`;\n      builder.querySelector('[data-charm-total]').textContent = formatMoney(necklacePrice + charmsTotal);\n      addButton.disabled = charmsOnly ? selected.length === 0 : !base || !base.available;\n      const barEl = builder.querySelector('[data-charm-bar]');\n      if (barEl) {\n        barEl.querySelector('[data-charm-bar-count]').textContent = `(${selected.length})`;\n        barEl.querySelector('[data-charm-bar-total]').textContent = formatMoney(necklacePrice + charmsTotal);\n        barEl.querySelector('[data-charm-bar-add]').disabled = addButton.disabled;\n      }\n    };\n\n    const syncFinish = () => {\n      if (finishTouched) return;\n      const base = necklace();\n      if (!base) return;\n      const values = base.options.map((o) => o.toLowerCase());\n      const input = finishInputs.find((i) => values.includes(i.value.toLowerCase()));\n      if (input) input.checked = true;\n    };\n\n    builder.addEventListener('click', (event) => {\n      const pick = event.target.closest('[data-charm-pick]');\n      if (pick && !pick.disabled && selected.length < max) {\n        const tile = tiles.find((t) => t.pick === pick);\n        const match = variantFor(tile);\n        if (match) justAdded = selected.push({ tile, key: match.key, variant: match.variant }) - 1;\n        render();\n        return;\n      }\n      const remove = event.target.closest('[data-charm-remove]');\n      if (remove) {\n        selected.splice(Number(remove.dataset.charmRemove), 1);\n        render();\n        return;\n      }\n      const filter = event.target.closest('[data-charm-filter]');\n      if (filter) {\n        builder.querySelectorAll('[data-charm-filter]').forEach((b) => {\n          b.classList.toggle('is-active', b === filter);\n          b.setAttribute('aria-pressed', String(b === filter));\n        });\n        tiles.forEach((tile) => (tile.el.hidden = Boolean(filter.dataset.charmFilter) && tile.category !== filter.dataset.charmFilter));\n      }\n    });\n    finishInputs.forEach((input) =>\n      input.addEventListener('change', () => {\n        finishTouched = true;\n        render();\n      })\n    );\n    root?.querySelector('[data-variant-picker]')?.addEventListener('change', () => {\n      requestAnimationFrame(() => {\n        syncFinish();\n        render();\n      });\n    });\n    syncFinish();\n    render();\n\n    // Mobile bar: shown while the real button is off screen, it presses that button.\n    const bar = builder.querySelector('[data-charm-bar]');\n    if (bar) {\n      const mobile = window.matchMedia('(max-width: 749px)');\n      // Shown from when the builder comes into view until the real button does.\n      const syncBar = () => {\n        const b = builder.getBoundingClientRect();\n        const a = addButton.getBoundingClientRect();\n        const show = mobile.matches && b.top < window.innerHeight && a.top > window.innerHeight - 20;\n        if (bar.hidden === !show) return;\n        bar.hidden = !show;\n        document.body.classList.toggle('has-charm-bar', show);\n      };\n      bar.querySelector('[data-charm-bar-add]').addEventListener('click', () => addButton.click());\n      window.addEventListener('scroll', syncBar, { passive: true });\n      window.addEventListener('resize', syncBar);\n      mobile.addEventListener?.('change', syncBar);\n      syncBar();\n    }\n\n    addButton.addEventListener('click', async () => {\n      const base = necklace();\n      const charmsOnly = Boolean(onlyToggle?.checked);\n      if (!base && !charmsOnly) return;\n      const code = Math.random().toString(36).slice(2, 7).toUpperCase();\n      const composition = local.composition || 'Composizione';\n      const names = selected.map((s) => `${s.tile.name} (${finishLabel(s.key)})`).join(', ');\n      const necklaceProperties = { [composition]: code, _base: '1' };\n      if (names) necklaceProperties[local.charmList || 'Charm'] = names;\n      const grouped = new Map();\n      selected.forEach((s) => grouped.set(s.variant.id, (grouped.get(s.variant.id) || 0) + 1));\n      // \"Charms only\": the customer already owns the necklace, so the charms go to the cart on their own.\n      const payload = charmsOnly ? [] : [{ id: base.id, quantity: 1, properties: necklaceProperties }];\n      grouped.forEach((quantity, id) => payload.push(charmsOnly ? { id, quantity } : { id, quantity, properties: { [composition]: code } }));\n      errorEl.hidden = true;\n      addButton.setAttribute('aria-busy', 'true');\n      try {\n        const response = await fetch(routes.cartAdd, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({ items: payload }),\n        });\n        const data = await response.json();\n        if (!response.ok) {\n          errorEl.textContent = data.description || data.message || strings.error;\n          errorEl.hidden = false;\n          return;\n        }\n        selected.length = 0;\n        render();\n        await refreshCart();\n        showCartNotification(data.items ? data.items : data);\n      } finally {\n        addButton.removeAttribute('aria-busy');\n      }\n    });\n  });\n\n  document.addEventListener('click', async (event) => {\n    const button = event.target.closest('[data-cart-remove-set]');\n    if (!button) return;\n    const inner = button.closest('.cart-drawer__inner');\n    inner?.setAttribute('aria-busy', 'true');\n    try {\n      const cart = await fetch(`${routes.cart}.js`, { headers: { Accept: 'application/json' } }).then((r) => r.json());\n      const updates = {};\n      cart.items.forEach((item) => {\n        if ((item.properties || {})[button.dataset.setKey] === button.dataset.cartRemoveSet) updates[item.key] = 0;\n      });\n      await fetch(routes.cartUpdate, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({ updates }),\n      });\n      await refreshCart();\n    } finally {\n      inner?.removeAttribute('aria-busy');\n    }\n  });\n\n  register('[data-complementary]', async (section) => {\n    if (section.children.length || !section.dataset.url) return;\n    try {\n      const html = await fetch(section.dataset.url).then((response) => response.text());\n      const fresh = new DOMParser().parseFromString(html, 'text/html').querySelector('[data-complementary]');\n      if (!fresh || !fresh.children.length) return;\n      section.innerHTML = fresh.innerHTML;\n      mount(section);\n    } catch (error) {\n      section.hidden = true;\n    }\n  });\n\n  register('[data-product-family]', async (section) => {\n    const track = section.querySelector('[data-family-track]');\n    const current = new URL(section.dataset.currentUrl, window.location.origin).pathname;\n    const params = new URLSearchParams({\n      q: section.dataset.productFamily,\n      type: 'product',\n      'options[prefix]': 'none',\n      view: 'family',\n    });\n    try {\n      const response = await fetch(`${section.dataset.searchUrl}?${params}`);\n      track.innerHTML = await response.text();\n      track.querySelectorAll('[data-family-url]').forEach((slide) => {\n        const path = new URL(slide.dataset.familyUrl, window.location.origin).pathname;\n        if (path === current) slide.remove();\n      });\n      if (track.children.length > 0) {\n        section.hidden = false;\n        track.dispatchEvent(new Event('scroll'));\n      }\n    } catch (error) {\n      section.hidden = true;\n    }\n  });\n\n  register('[data-predictive-search]', (form) => {\n    const input = form.querySelector('[data-predictive-input]');\n    const results = form.parentElement.querySelector('[data-predictive-results]');\n    let controller;\n    let timer;\n    input.addEventListener('input', () => {\n      clearTimeout(timer);\n      const query = input.value.trim();\n      if (query.length < 2) {\n        results.innerHTML = '';\n        return;\n      }\n      timer = setTimeout(async () => {\n        controller?.abort();\n        controller = new AbortController();\n        results.setAttribute('aria-busy', 'true');\n        const params = new URLSearchParams({ q: query, type: 'product', 'options[prefix]': 'last', view: 'predictive' });\n        try {\n          const response = await fetch(`${form.dataset.searchUrl}?${params}`, { signal: controller.signal });\n          results.innerHTML = await response.text();\n        } catch (error) {\n          if (error.name !== 'AbortError') results.innerHTML = '';\n        } finally {\n          results.removeAttribute('aria-busy');\n        }\n      }, 250);\n    });\n  });\n\n  const popup = document.querySelector('[data-newsletter-popup]');\n  if (popup) {\n    const key = 'giabix-newsletter-popup';\n    let dismissed = false;\n    try {\n      dismissed = window.localStorage.getItem(key) === '1';\n    } catch (error) {\n      dismissed = false;\n    }\n    const hasFeedback = popup.querySelector('[data-newsletter-success], [data-newsletter-error]');\n    const isFromPopup = window.location.hash === '#popup-newsletter' || window.location.href.includes('form_type=customer');\n    popup.addEventListener('close', () => {\n      try {\n        window.localStorage.setItem(key, '1');\n      } catch (error) {\n        return;\n      }\n    });\n    if (hasFeedback && isFromPopup) {\n      popup.showModal();\n    } else if (!dismissed && !window.Shopify?.designMode) {\n      setTimeout(() => {\n        let seen = false;\n        try {\n          seen = window.localStorage.getItem(key) === '1';\n        } catch (error) {\n          seen = false;\n        }\n        if (!seen && !document.querySelector('dialog[open]')) popup.showModal();\n      }, Number(popup.dataset.delay || 6) * 1000);\n    }\n  }\n\n  const mount = (root) =>\n    components.forEach(([selector, init]) => root.querySelectorAll(selector).forEach((el) => init(el)));\n  mount(document);\n\n  document.addEventListener('shopify:section:load', (event) => {\n    // Header and announcement bar keep page-level state: reload the preview.\n    if (event.target.querySelector('[data-site-header], [data-announcement]')) {\n      window.location.reload();\n      return;\n    }\n    mount(event.target);\n    // The newsletter popup stays open in the editor while it is being edited.\n    event.target.querySelector('[data-newsletter-popup]')?.showModal();\n  });\n\n  document.addEventListener('shopify:section:select', (event) => {\n    const popup = event.target.querySelector('[data-newsletter-popup]');\n    if (popup && !popup.open) popup.showModal();\n  });\n\n  document.addEventListener('shopify:section:deselect', (event) => {\n    event.target.querySelector('[data-newsletter-popup]')?.close();\n  });\n})();\n"],
  "mappings": "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",
  "names": ["popup"]
}
