{
  "version": 3,
  "sources": ["/cdn/shop/t/94/assets/florame-essential-upsell-guard.js?florame_guard=20260503a"],
  "sourcesContent": ["(function florameEssentialUpsellGuard() {\n  if (window.__florameEssentialUpsellGuardLoaded) return;\n  window.__florameEssentialUpsellGuardLoaded = true;\n  window.__florameEssentialUpsellGuardLoading = false;\n\n  const SELECTORS = {\n    container: 'div[data-essential-upsell-element=\"button-container\"]',\n    button: 'button[data-essential-upsell-element=\"add-to-cart-button\"]',\n    product: 'div[data-essential-upsell-element=\"product\"]',\n    variant: '[data-variant-id]',\n    funnel: '[data-essential-upsell-funnel-id]',\n  };\n\n  const VERIFY_DELAYS = [900, 1800, 3200];\n  const pendingByKey = new Map();\n\n  let cartCache = null;\n  let cartCacheAt = 0;\n  let cartRefreshPromise = null;\n\n  function rootPath() {\n    const root =\n      (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) ||\n      (window.routes && window.routes.root) ||\n      '/';\n    return root.endsWith('/') ? root : `${root}/`;\n  }\n\n  function cartUrl(path) {\n    return `${rootPath()}cart/${path}`;\n  }\n\n  function isEnabledButton(button) {\n    return !!button && !button.disabled && button.getAttribute('aria-disabled') !== 'true';\n  }\n\n  function normalizeId(value) {\n    const id = Number(value);\n    return Number.isFinite(id) && id > 0 ? String(Math.round(id)) : '';\n  }\n\n  function getFunnelId(element) {\n    const funnelElement = element && element.closest ? element.closest(SELECTORS.funnel) : null;\n    return funnelElement ? String(funnelElement.getAttribute('data-essential-upsell-funnel-id') || '') : '';\n  }\n\n  function getVariantId(container) {\n    const product = container && container.closest ? container.closest(SELECTORS.product) : null;\n    const variantElement = product ? product.querySelector(SELECTORS.variant) : null;\n    return normalizeId(variantElement && variantElement.getAttribute('data-variant-id'));\n  }\n\n  function getCartQuantity(cart, variantId) {\n    const id = normalizeId(variantId);\n    if (!id || !cart || !Array.isArray(cart.items)) return 0;\n\n    return cart.items.reduce((total, item) => {\n      const itemVariantId = normalizeId(item && (item.variant_id || item.id));\n      if (itemVariantId !== id) return total;\n      return total + Math.max(0, Number(item.quantity) || 0);\n    }, 0);\n  }\n\n  async function fetchCart(force) {\n    if (!force && cartCache && Date.now() - cartCacheAt < 4000) {\n      return cartCache;\n    }\n\n    if (!cartRefreshPromise) {\n      cartRefreshPromise = fetch(cartUrl('js'), {\n        credentials: 'same-origin',\n        cache: 'no-store',\n        headers: { Accept: 'application/json' },\n      })\n        .then((response) => {\n          if (!response.ok) throw new Error(`Cart fetch failed: ${response.status}`);\n          return response.json();\n        })\n        .then((cart) => {\n          cartCache = cart;\n          cartCacheAt = Date.now();\n          return cart;\n        })\n        .finally(() => {\n          cartRefreshPromise = null;\n        });\n    }\n\n    return cartRefreshPromise;\n  }\n\n  function getSectionNames(cartElement) {\n    if (!cartElement || typeof cartElement.getSectionsToRender !== 'function') return [];\n\n    try {\n      return cartElement\n        .getSectionsToRender()\n        .flatMap((section) => [section.section, section.id])\n        .filter(Boolean)\n        .filter((value, index, all) => all.indexOf(value) === index);\n    } catch (_) {\n      return [];\n    }\n  }\n\n  function getCartElement() {\n    return document.querySelector('cart-items') || document.querySelector('cart-drawer');\n  }\n\n  function publishThemeEvent(eventName, payload) {\n    const publishFn = typeof publish === 'function' ? publish : window.publish;\n    if (typeof publishFn !== 'function') return;\n\n    try {\n      publishFn(eventName, payload);\n    } catch (_) {}\n  }\n\n  function themeEvents() {\n    if (typeof PUB_SUB_EVENTS !== 'undefined') return PUB_SUB_EVENTS;\n    return window.PUB_SUB_EVENTS || {};\n  }\n\n  async function refreshCartUi(cart) {\n    const cartElement = getCartElement();\n\n    if (cartElement && typeof cartElement.refreshSectionsFromServer === 'function') {\n      cartElement.refreshSectionsFromServer();\n    } else if (cartElement && typeof cartElement.renderContents === 'function') {\n      const sections = getSectionNames(cartElement);\n      if (sections.length) {\n        const response = await fetch(`${rootPath()}?sections=${encodeURIComponent(sections.join(','))}`, {\n          credentials: 'same-origin',\n          cache: 'no-store',\n        });\n        const sectionHtml = await response.json();\n        cartElement.renderContents({\n          id: cart && cart.items && cart.items[0] ? cart.items[0].id : undefined,\n          key: cart && cart.items && cart.items[0] ? cart.items[0].key : undefined,\n          sections: sectionHtml,\n        });\n      }\n    }\n\n    const events = themeEvents();\n    if (events.cartUpdate) {\n      publishThemeEvent(events.cartUpdate, {\n        source: 'florame-essential-upsell-guard',\n        cartData: cart,\n      });\n    }\n\n    document.dispatchEvent(\n      new CustomEvent('florame:cart-updated', {\n        detail: { source: 'essential-upsell-guard', cartData: cart, at: Date.now() },\n      })\n    );\n    document.dispatchEvent(new CustomEvent('essential-upsell-cart-updated'));\n    document.dispatchEvent(\n      new CustomEvent('essential-upsell:cart-updated', {\n        bubbles: true,\n        detail: { cart },\n      })\n    );\n    window.dispatchEvent(\n      new CustomEvent('cart:updated', {\n        detail: { cart },\n      })\n    );\n  }\n\n  function publishCartError(variantId, error) {\n    const events = themeEvents();\n    if (!events.cartError) return;\n\n    publishThemeEvent(events.cartError, {\n      source: 'florame-essential-upsell-guard',\n      productVariantId: variantId,\n      errors: error && error.message ? error.message : String(error || ''),\n      message: error && error.message ? error.message : String(error || ''),\n    });\n  }\n\n  async function addMissingQuantity(intent, missingQuantity) {\n    const properties = intent.funnelId ? { __essential_upsell_funnel_id: intent.funnelId } : {};\n    const response = await fetch(cartUrl('add.js'), {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: {\n        'Content-Type': 'application/json',\n        Accept: 'application/json',\n      },\n      body: JSON.stringify({\n        items: [\n          {\n            id: Number(intent.variantId),\n            quantity: missingQuantity,\n            properties,\n          },\n        ],\n      }),\n    });\n    const data = await response.json();\n\n    if (!response.ok || data.status) {\n      throw new Error(data.description || data.message || 'Impossibile aggiungere il prodotto al carrello.');\n    }\n\n    const cart = await fetchCart(true);\n    await refreshCartUi(cart);\n    return cart;\n  }\n\n  function scheduleVerify(key, delayIndex) {\n    const delay = VERIFY_DELAYS[Math.min(delayIndex, VERIFY_DELAYS.length - 1)];\n\n    window.setTimeout(async () => {\n      const intent = pendingByKey.get(key);\n      if (!intent) return;\n\n      try {\n        const cart = await fetchCart(true);\n        const actualQuantity = getCartQuantity(cart, intent.variantId);\n        if (actualQuantity >= intent.expectedQuantity) {\n          pendingByKey.delete(key);\n          return;\n        }\n\n        if (delayIndex < VERIFY_DELAYS.length - 1) {\n          scheduleVerify(key, delayIndex + 1);\n          return;\n        }\n\n        const missingQuantity = Math.max(1, intent.expectedQuantity - actualQuantity);\n        const updatedCart = await addMissingQuantity(intent, missingQuantity);\n        if (getCartQuantity(updatedCart, intent.variantId) >= intent.expectedQuantity) {\n          pendingByKey.delete(key);\n        }\n      } catch (error) {\n        pendingByKey.delete(key);\n        publishCartError(intent.variantId, error);\n        console.warn('[Florame Essential Upsell Guard]', error);\n      }\n    }, delay);\n  }\n\n  function registerUpsellIntent(container, button) {\n    const variantId = getVariantId(container);\n    if (!variantId || !isEnabledButton(button)) return;\n\n    const funnelId = getFunnelId(container);\n    const key = `${variantId}:${funnelId}`;\n    const cachedQuantity = getCartQuantity(cartCache, variantId);\n    const previousIntent = pendingByKey.get(key);\n    const baseQuantity = previousIntent ? Math.max(previousIntent.expectedQuantity, cachedQuantity) : cachedQuantity;\n    const intent = {\n      variantId,\n      funnelId,\n      expectedQuantity: baseQuantity + 1,\n      createdAt: Date.now(),\n    };\n\n    pendingByKey.set(key, intent);\n    scheduleVerify(key, 0);\n  }\n\n  function handleUpsellClick(event) {\n    const target = event.target;\n    if (!target || !target.closest) return;\n\n    const container = target.closest(SELECTORS.container);\n    if (!container) return;\n\n    const button = target.closest(SELECTORS.button) || container.querySelector(SELECTORS.button);\n    if (!isEnabledButton(button)) return;\n\n    if (!target.closest(SELECTORS.button)) {\n      event.preventDefault();\n      event.stopPropagation();\n      button.click();\n      return;\n    }\n\n    registerUpsellIntent(container, button);\n  }\n\n  function scheduleCartCacheRefresh() {\n    window.setTimeout(() => fetchCart(true).catch(() => {}), 160);\n  }\n\n  document.addEventListener('click', handleUpsellClick, true);\n  document.addEventListener('florame:cart-updated', scheduleCartCacheRefresh);\n  document.addEventListener('essential-upsell:cart-updated', scheduleCartCacheRefresh);\n  document.addEventListener('essential-upsell-cart-updated', scheduleCartCacheRefresh);\n  window.addEventListener('cart:updated', scheduleCartCacheRefresh);\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () => fetchCart(true).catch(() => {}), { once: true });\n  } else {\n    fetchCart(true).catch(() => {});\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
