{
  "version": 3,
  "sources": ["/cdn/shop/t/137/assets/oli.js?version=1.0.0"],
  "sourcesContent": ["// ==========================================================================\n// Oli \u2014 Chatbot popup + Greeting screen drawer\n// ==========================================================================\n\n(function () {\n\n  // ===== Chatbot Floating Widget =====\n\n  var trigger = document.getElementById('oli-chatbot-trigger');\n  var popup = document.getElementById('oli-chatbot-popup');\n  var closeBtn = document.getElementById('oli-chatbot-close');\n  var csBtn = document.getElementById('oli-chatbot-cs');\n  var csIcon = document.getElementById('oli-chatbot-cs-icon');\n  var csStatus = document.getElementById('oli-chatbot-cs-status');\n  var resetIcon = document.getElementById('oli-greeting-back')\n\n  if (!trigger || !popup) return;\n\n  // Disable Kustomer CS option by default until we confirm it's available\n  if (csBtn) {\n    csBtn.style.display = 'none';\n  }\n\n  // Show trigger only if Oli AI is enabled or Kustomer is available\n  // @ts-ignore\n  if (window.OLI_VISIBLE) {\n    trigger.style.display = '';\n  }\n\n  // Poll for Kustomer to load (it initialises asynchronously)\n  var KUSTOMER_POLL_INTERVAL = 500; // ms\n  var KUSTOMER_MAX_WAIT = 10000;    // 10 s\n  var kustomerReady = false;\n\n  function waitForKustomer(callback) {\n    var elapsed = 0;\n    if (window.Kustomer && typeof window.Kustomer.open === 'function') {\n      kustomerReady = true;\n      callback(true);\n      return;\n    }\n    var poll = setInterval(function () {\n      elapsed += KUSTOMER_POLL_INTERVAL;\n      if (window.Kustomer && typeof window.Kustomer.open === 'function') {\n        clearInterval(poll);\n        kustomerReady = true;\n        callback(true);\n      } else if (elapsed >= KUSTOMER_MAX_WAIT) {\n        clearInterval(poll);\n        kustomerReady = false;\n        callback(false);\n      }\n    }, KUSTOMER_POLL_INTERVAL);\n  }\n\n  // Show / hide the Kustomer iframe (chat window).\n  // The iframe is hidden by default via CSS (opacity:0 + pointer-events:none)\n  // so the launcher icon is invisible but the widget stays functional.\n  function showKustomerChat() {\n    var iframe = document.getElementById('kustomer-ui-sdk-iframe');\n    if (iframe) {\n      iframe.style.setProperty('opacity', '1', 'important');\n      iframe.style.setProperty('pointer-events', 'auto', 'important');\n    }\n  }\n\n  function hideKustomerChat() {\n    var iframe = document.getElementById('kustomer-ui-sdk-iframe');\n    if (iframe) {\n      iframe.style.setProperty('opacity', '0', 'important');\n      iframe.style.setProperty('pointer-events', 'none', 'important');\n    }\n  }\n\n  // Once Kustomer is ready, show the trigger (if not already visible)\n  waitForKustomer(function (ready) {\n    if (ready) {\n      trigger.style.display = '';\n      checkKustomerAvailability();\n\n      // Listen for Kustomer close event to re-hide the iframe\n      if (window.Kustomer && typeof window.Kustomer.addListener === 'function') {\n        window.Kustomer.addListener('onClose', function () {\n          hideKustomerChat();\n        });\n      }\n    } else {\n      // Kustomer not available \u2014 hide the CS option entirely\n      disableKustomer();\n\n      // If Oli is also not available, hide the trigger completely\n      // @ts-ignore\n      if (!window.OLI_VISIBLE) {\n        trigger.style.display = 'none';\n      }\n    }\n  });\n\n  var isOpen = false;\n\n  function openPopup() {\n    isOpen = true;\n    popup.classList.add('oli-chatbot__popup--open');\n    trigger.classList.add('oli-chatbot__trigger--hidden');\n    trigger.setAttribute('aria-expanded', 'true');\n    // Re-check only if polling has already completed; otherwise waitForKustomer handles it\n    if (kustomerReady) {\n      checkKustomerAvailability();\n    }\n  }\n\n  function closePopup() {\n    isOpen = false;\n    popup.classList.remove('oli-chatbot__popup--open');\n    trigger.classList.remove('oli-chatbot__trigger--hidden');\n    trigger.setAttribute('aria-expanded', 'false');\n  }\n\n  function checkKustomerAvailability() {\n    if (!kustomerReady || !window.Kustomer) {\n      disableKustomer();\n      return;\n    }\n\n    // Widget is loaded \u2014 enable the button (Kustomer.open will work)\n    enableKustomer();\n  }\n\n  function enableKustomer() {\n    if (csBtn) {\n      csBtn.style.display = '';\n      csBtn.classList.remove('oli-chatbot__option--disabled');\n      csBtn.removeAttribute('disabled');\n    }\n    if (csStatus) csStatus.textContent = 'Chat with our support team';\n    if (csIcon) csIcon.classList.add('oli-chatbot__option-icon--enabled');\n  }\n\n  function disableKustomer() {\n    if (csBtn) {\n      csBtn.style.display = 'none';\n      csBtn.classList.add('oli-chatbot__option--disabled');\n      csBtn.setAttribute('disabled', '');\n    }\n  }\n\n  // Auto-open popup once per browser session.\n  // Rules:\n  //   - Landing page (first page in session): never auto-open, even after 15 s.\n  //   - Second page in session: auto-open after 25 s on that page.\n  //   - Once auto-opened, never open again this session (session cookie guard).\n  // A session cookie (no expires) clears automatically when the browser closes.\n  var OLI_AUTO_POPUP_KEY = 'oli_auto_popup_shown';\n  var OLI_SESSION_PAGE_COUNT_KEY = 'oli_session_page_count';\n  var AUTO_POPUP_DELAY = 25000;\n\n  /** @param {string} name @returns {string|null} */\n  function getSessionCookie(name) {\n    var match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n    return match ? match[1] ?? null : null;\n  }\n\n  /** @param {string} name @param {string} value */\n  function setSessionCookie(name, value) {\n    document.cookie = name + '=' + value + '; path=/; SameSite=Lax';\n  }\n  /** @type {ReturnType<typeof setTimeout> | null} */\n  var autoPopupTimer = null;\n  var userHasInteracted = false;\n  var pendingAutoPopup = false;\n\n  function tryOpenAutoPopup() {\n    if (userHasInteracted || isOpen || getSessionCookie(OLI_AUTO_POPUP_KEY)) return;\n    // @ts-ignore \u2014 trigger null-checked at top of IIFE\n    if (trigger.style.display === 'none') trigger.style.display = '';\n    setSessionCookie(OLI_AUTO_POPUP_KEY, '1');\n    openPopup();\n  }\n\n  function scheduleAutoPopup() {\n    if (getSessionCookie(OLI_AUTO_POPUP_KEY)) return;\n\n    // Increment the session page count; skip auto-popup on the landing page (first page).\n    var pageCount = parseInt(sessionStorage.getItem(OLI_SESSION_PAGE_COUNT_KEY) || '0', 10) + 1;\n    sessionStorage.setItem(OLI_SESSION_PAGE_COUNT_KEY, String(pageCount));\n    if (pageCount < 2) return;\n\n    autoPopupTimer = setTimeout(function () {\n      var searchModalEl = document.getElementById('search-modal');\n      var searchModalOpen = searchModalEl && searchModalEl.querySelector('dialog[open]');\n      var navOverlay = document.querySelector('.gm-custom-overlay.gm-active');\n      var mobileNav = document.querySelector('.menu-drawer-container.menu-open');\n      if (searchModalOpen || navOverlay || mobileNav) {\n        // Defer: show popup once the blocking overlay closes instead\n        pendingAutoPopup = true;\n        return;\n      }\n      tryOpenAutoPopup();\n    }, AUTO_POPUP_DELAY);\n  }\n\n  // If the popup was deferred because the search modal was open, show it after it closes\n  (function listenForSearchModalClose() {\n    var searchModalEl = document.getElementById('search-modal');\n    if (!searchModalEl) return;\n    searchModalEl.addEventListener('dialog:close', function () {\n      if (!pendingAutoPopup) return;\n      pendingAutoPopup = false;\n      setTimeout(tryOpenAutoPopup, 400);\n    });\n  })();\n\n  // If the popup was deferred because the desktop nav menu was open, watch for gm-active being removed\n  (function listenForNavMenuClose() {\n    var navOverlay = document.querySelector('.gm-custom-overlay');\n    if (!navOverlay) return;\n    var observer = new MutationObserver(function () {\n      if (!pendingAutoPopup) return;\n      // @ts-ignore \u2014 navOverlay is non-null: guarded by the enclosing if (!navOverlay) return\n      if (!navOverlay.classList.contains('gm-active')) {\n        pendingAutoPopup = false;\n        observer.disconnect();\n        setTimeout(tryOpenAutoPopup, 400);\n      }\n    });\n    observer.observe(navOverlay, { attributes: true, attributeFilter: ['class'] });\n  })();\n\n  // If the popup was deferred because the mobile nav drawer was open, watch for menu-open being removed\n  (function listenForMobileNavClose() {\n    var menuDrawer = document.querySelector('.menu-drawer-container');\n    if (!menuDrawer) return;\n    var observer = new MutationObserver(function () {\n      if (!pendingAutoPopup) return;\n      // @ts-ignore \u2014 menuDrawer is non-null: guarded by the enclosing if (!menuDrawer) return\n      if (!menuDrawer.classList.contains('menu-open')) {\n        pendingAutoPopup = false;\n        observer.disconnect();\n        setTimeout(tryOpenAutoPopup, 400);\n      }\n    });\n    observer.observe(menuDrawer, { attributes: true, attributeFilter: ['class'] });\n  })();\n\n  scheduleAutoPopup();\n\n  // Toggle popup on trigger click\n  trigger.addEventListener('click', function (e) {\n    e.stopPropagation();\n    userHasInteracted = true;\n    if (autoPopupTimer) {\n      clearTimeout(autoPopupTimer);\n      autoPopupTimer = null;\n    }\n    setSessionCookie(OLI_AUTO_POPUP_KEY, '1');\n    isOpen ? closePopup() : openPopup();\n  });\n\n  // Close button\n  if (closeBtn) {\n    closeBtn.addEventListener('click', function () {\n      closePopup();\n    });\n  }\n\n  // Close on outside click\n  document.addEventListener('click', function (e) {\n    if (!isOpen) return;\n    if (!popup.contains(e.target) && !trigger.contains(e.target)) {\n      closePopup();\n    }\n  });\n\n  // Close on Escape\n  document.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape' && isOpen) {\n      closePopup();\n    }\n  });\n\n  // Kustomer option\n  if (csBtn) {\n    csBtn.addEventListener('click', function () {\n      if (csBtn.disabled) return;\n      if (kustomerReady && window.Kustomer && typeof window.Kustomer.open === 'function') {\n        showKustomerChat();\n        window.Kustomer.open();\n        closePopup();\n      }\n    });\n  }\n\n  // Oli option \u2014 opens greeting drawer (visibility controlled by olivela_ai metaobject)\n  var oliBtn = document.getElementById('oli-chatbot-oli');\n  if (oliBtn) {\n    // @ts-ignore\n    if (!window.OLI_VISIBLE) {\n      oliBtn.style.display = 'none';\n    } else {\n      oliBtn.addEventListener('click', function () {\n        openGreetingDrawer();\n        closePopup();\n      });\n    }\n  }\n\n\n  // ===== Ask Oli Greeting Drawer =====\n\n  var netlifyDomain = window.netlify_function_domain || '';\n  var OLI_API_URL = netlifyDomain + '/.netlify/functions/chat-mcp-v2';\n\n  var greetingComponent = document.getElementById('oli-greeting');\n  var greetingInput = document.getElementById('oli-greeting-input');\n  var greetingPrompts = document.querySelectorAll('.oli-greeting__prompt');\n  var welcomeView = document.getElementById('oli-greeting-welcome');\n  var chatView = document.getElementById('oli-greeting-chat');\n  var messagesContainer = document.getElementById('oli-greeting-messages');\n\n  var OLI_HISTORY_KEY = 'oli_chat_session';\n  var OLI_SESSION_FLAG = 'oli_session_active';\n  var OLI_NEW_TAB_KEY = 'oli_new_tab';\n  var NEW_TAB_TTL_MS = 5000; // 5 seconds\n  var MAX_STORED_TURNS = 20;\n  var MAX_RESULTS = 10;\n\n  var conversationHistory = [];\n  var currentCursors = {};\n  var lastSearchState = null;\n  var messageLog = [];\n  var lastQueryText = '';\n  var messagesRestored = false;\n\n  // Placeholder-to-CTA configuration for API response messages\n  var OLI_CTA_MAP = {\n    '[[Jewelry]]': { label: 'Ask a jewelry expert', type: 'jewelry_concierge', mailTo: 'jewelryconcierge@olivela.com' },\n    '[[Jewelry_STREAK]]': { label: 'Ask a jewelry expert', type: 'jewelry_concierge', mailTo: 'jewelryconcierge@olivela.com' },\n    '[[Stylist]]': { label: 'Ask a Stylist', type: 'stylist', mailTo: 'help@olivela.com' },\n    '[[Stylist_STREAK]]': { label: 'Ask a Stylist', type: 'stylist', mailTo: 'help@olivela.com' },\n    '[[Support]]': { label: 'Contact Customer care', type: 'customerCare', mailTo: 'help@olivela.com' },\n    '[[Support_STREAK]]': { label: 'Contact Customer care', type: 'customerCare', mailTo: 'help@olivela.com' },\n    '[[Shipping information]]': { label: 'Shipping information', type: 'shipping_info', link: 'https://help.olivela.com/en_us/categories/shipping-r1nyaemXA' },\n    '[[Payment information]]': { label: 'Payment information', type: 'payment_info', link: 'https://help.olivela.com/en_us/categories/payment-SJllTx7XC' },\n    '[[Returns and exchanges]]': { label: 'Returns and exchanges', type: 'returns_exchanges', link: 'https://help.olivela.com/en_us/categories/returns-exchanges-Sk3yalm70' }\n  };\n  var oliLoading = false;\n\n  // ----- Session storage -----\n\n  function initSession() {\n    var hasFlag = sessionStorage.getItem(OLI_SESSION_FLAG);\n    if (!hasFlag) {\n      var newTabTs = localStorage.getItem(OLI_NEW_TAB_KEY);\n      var isNewTab = newTabTs && (Date.now() - parseInt(newTabTs, 10)) < NEW_TAB_TTL_MS;\n      if (isNewTab) {\n        localStorage.removeItem(OLI_NEW_TAB_KEY);\n      }\n      sessionStorage.setItem(OLI_SESSION_FLAG, '1');\n    }\n  }\n\n  function loadSession() {\n    try {\n      var raw = localStorage.getItem(OLI_HISTORY_KEY);\n      if (!raw) return false;\n      var s = JSON.parse(raw);\n      if (!s.messageLog || !s.messageLog.length) return false;\n\n      conversationHistory = s.conversationHistory || [];\n      currentCursors = s.currentCursors || {};\n      lastSearchState = s.lastSearchState || null;\n      messageLog = s.messageLog || [];\n      return true;\n    } catch (e) {\n      localStorage.removeItem(OLI_HISTORY_KEY);\n      return false;\n    }\n  }\n\n  function saveSession() {\n    try {\n      var trimmedLog = messageLog.slice(-(MAX_STORED_TURNS * 3));\n      localStorage.setItem(OLI_HISTORY_KEY, JSON.stringify({\n        conversationHistory: conversationHistory,\n        currentCursors: currentCursors,\n        lastSearchState: lastSearchState,\n        messageLog: trimmedLog\n      }));\n    } catch (e) {\n      localStorage.removeItem(OLI_HISTORY_KEY);\n    }\n  }\n\n  // Restore previous messages into the DOM on load\n  function restoreMessages() {\n    if (!messageLog.length || !messagesContainer) return;\n    var location = getPageLocation();\n    messageLog.forEach(function (msg) {\n      switch (msg.type) {\n        case 'user':\n          addUserMessage(msg.text, true);\n          break;\n        case 'assistant':\n          addOliTextMessage(msg.text, true);\n          break;\n        case 'products':\n          addProductCards(msg.products || [], location, true);\n          break;\n      }\n    });\n  }\n\n  initSession();\n  loadSession();\n\n\n  // ----- Helpers -----\n\n  function getPageLocation() {\n    var path = window.location.pathname;\n    if (path === '/') return 'Home';\n    if (path.indexOf('/collections/') !== -1) return 'PLP';\n    if (path.indexOf('/products/') !== -1) return 'PDP';\n    if (path.indexOf('/designer') !== -1) return 'Designer';\n    return 'Other';\n  }\n\n  function getOliPdpGaClass() {\n    var path = window.location.pathname;\n    if (path === '/') return 'ga-home-oli-pdp-click';\n    if (path.indexOf('/collections/') !== -1) return 'ga-plp-oli-pdp-click';\n    if (path.indexOf('/products/') !== -1) return 'ga-pdp-oli-pdp-click';\n    if (path.indexOf('/designer') !== -1) return 'ga-designer-oli-pdp-click';\n    return 'ga-oli-pdp-click';\n  }\n\n  function trackOliEvent(eventName, data) {\n    document.dispatchEvent(new CustomEvent('oli:track', {\n      detail: { event: eventName, data: data || {} }\n    }));\n  }\n\n  // ----- View toggling -----\n\n  function showChatView() {\n    if (welcomeView) welcomeView.hidden = true;\n    if (chatView) chatView.hidden = false;\n    if(resetIcon) resetIcon.style.display = 'flex';\n  }\n\n  function showWelcomeView() {\n    if (welcomeView) welcomeView.hidden = false;\n    if (chatView) chatView.hidden = true;\n    if(resetIcon) resetIcon.style.display = 'none';\n  }\n\n  function openGreetingDrawer() {\n    if (!greetingComponent || typeof greetingComponent.showDialog !== 'function') return;\n    if (messageLog.length > 0) {\n      if (!messagesRestored) {\n        messagesRestored = true;\n        restoreMessages();\n      }\n      showChatView();\n    } else {\n      showWelcomeView();\n    }\n    greetingComponent.showDialog();\n    if (greetingInput) {\n      setTimeout(function () { greetingInput.focus(); }, 100);\n    }\n    // Trigger Nosto product recommendations\n    initNostoLoad();\n  }\n\n  var nostoTriggered = false;\n\n  function triggerNostoLoad() {\n    if (nostoTriggered) return;\n    if (window.nostojs) {\n      window.nostojs(function (api) {\n        api.loadRecommendations();\n      });\n      nostoTriggered = true;\n      // Watch for swiper to render and wire up trackpad/wheel scrolling\n      watchNostoSwiper();\n    }\n  }\n\n  function watchNostoSwiper() {\n    var watchTarget = document.getElementById('oli-rec-nosto');\n    if (!watchTarget) return;\n\n    // Wire up swiper wheel handler when it appears\n    var swiperObserver = new MutationObserver(function () {\n      var swiper = watchTarget.querySelector('swiper-container.nosto-swiper');\n      if (swiper) {\n        swiperObserver.disconnect();\n        setTimeout(function () { attachSwiperWheelHandler(swiper); }, 800);\n      }\n    });\n    swiperObserver.observe(watchTarget, { childList: true, subtree: true });\n\n    var existingSwiper = watchTarget.querySelector('swiper-container.nosto-swiper');\n    if (existingSwiper) {\n      setTimeout(function () { attachSwiperWheelHandler(existingSwiper); }, 300);\n    }\n  }\n\n  function attachSwiperWheelHandler(swiperEl) {\n    if (!swiperEl || swiperEl._nostoWheelBound) return;\n    swiperEl._nostoWheelBound = true;\n\n    // Disable Swiper's built-in mousewheel module if active (prevents double-handling)\n    var s0 = swiperEl.swiper;\n    if (s0 && s0.mousewheel && typeof s0.mousewheel.disable === 'function') {\n      s0.mousewheel.disable();\n    }\n\n    var COOLDOWN = 500;    // ms to ignore events after a slide fires\n    var coolingDown = false;\n\n    // Use CAPTURE phase + stopImmediatePropagation so Swiper's own handler never sees the event\n    swiperEl.addEventListener('wheel', function (e) {\n      var s = swiperEl.swiper;\n      if (!s) return;\n      // Only intercept dominant horizontal movement\n      if (Math.abs(e.deltaX) <= Math.abs(e.deltaY)) return;\n      e.preventDefault();\n      e.stopImmediatePropagation();\n\n      // Ignore all events during cooldown\n      if (coolingDown) return;\n\n      // Any horizontal swipe triggers exactly one slide, then locks\n      coolingDown = true;\n      if (e.deltaX > 0) {\n        s.slideNext();\n      } else {\n        s.slidePrev();\n      }\n      setTimeout(function () { coolingDown = false; }, COOLDOWN);\n    }, { passive: false, capture: true });\n  }\n\n  function initNostoLoad() {\n    if (window.nostojs) {\n      triggerNostoLoad();\n    } else {\n      var poll = setInterval(function () {\n        if (window.nostojs) {\n          clearInterval(poll);\n          triggerNostoLoad();\n        }\n      }, 500);\n      setTimeout(function () { clearInterval(poll); }, 10000);\n    }\n  }\n\n  // ----- Chat message rendering -----\n\n  function scrollToBottom() {\n    if (!messagesContainer) return;\n    messagesContainer.scrollTop = messagesContainer.scrollHeight;\n  }\n\n  function escapeHtml(s) {\n    return String(s)\n      .replace(/&/g, '&amp;').replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;');\n  }\n\n  function formatCurrency(value, currency) {\n    var num = Number(value);\n    if (isNaN(num)) return value;\n    try {\n      return new Intl.NumberFormat('en-US', {\n        style: 'currency', currency: currency || 'USD', minimumFractionDigits: 0, maximumFractionDigits: 2\n      }).format(num);\n    } catch (e) {\n      return '$' + (Number.isInteger(num) ? num : num.toFixed(2));\n    }\n  }\n\n  function addUserMessage(text, skipLog) {\n    if (!messagesContainer) return;\n    var msgEl = document.createElement('div');\n    msgEl.className = 'oli-greeting__msg oli-greeting__msg--user';\n    msgEl.textContent = text;\n    messagesContainer.appendChild(msgEl);\n    scrollToBottom();\n    if (!skipLog) {\n      messageLog.push({ type: 'user', text: text });\n    }\n  }\n\n  function getOliCtaGaClass(ctaType) {\n    var path = window.location.pathname;\n    var isHomePage = path === '/';\n    var isDesigner = path.indexOf('/collections/designer-') !== -1;\n    var isPLP = !isDesigner && path.indexOf('/collections/') !== -1;\n    var isPDP = path.indexOf('/products/') !== -1;\n    var isJewelry = path.indexOf('jewelry') !== -1 || path.indexOf('watches') !== -1;\n    var isClothing = path.indexOf('clothing') !== -1;\n\n    if (ctaType === 'stylist') {\n      if (isPDP && isJewelry) return 'ga-oli-ask-stylist-jewelry-pdp';\n      if (isPDP && isClothing) return 'ga-oli-ask-stylist-clothing-pdp';\n      if (isPDP) return 'ga-oli-ask-stylist-pdp';\n      if (isDesigner) return 'ga-oli-ask-stylist-designer';\n      if (isPLP && isJewelry) return 'ga-oli-ask-stylist-jewelry-plp';\n      if (isPLP && isClothing) return 'ga-oli-ask-stylist-clothing-plp';\n      if (isPLP) return 'ga-oli-ask-stylist-plp';\n      if (isHomePage) return 'ga-oli-ask-stylist-home';\n    } else if (ctaType === 'customerCare') {\n      if (isPDP && isJewelry) return 'ga-oli-ask-customer-care-jewelry-pdp';\n      if (isPDP && isClothing) return 'ga-oli-ask-customer-care-clothing-pdp';\n      if (isPDP) return 'ga-oli-ask-customer-care-pdp';\n      if (isDesigner) return 'ga-oli-ask-customer-care-designer';\n      if (isPLP && isJewelry) return 'ga-oli-ask-customer-care-jewelry-plp';\n      if (isPLP && isClothing) return 'ga-oli-ask-customer-care-clothing-plp';\n      if (isPLP) return 'ga-oli-ask-customer-care-plp';\n      if (isHomePage) return 'ga-oli-ask-customer-care-home';\n    } else if (ctaType === 'jewelry_concierge') {\n      if (isPDP && isJewelry) return 'ga-oli-contact-a-jewelry-expert-jewelry-pdp';\n      if (isPDP && isClothing) return 'ga-oli-contact-a-jewelry-expert-clothing-pdp';\n      if (isPDP) return 'ga-oli-contact-a-jewelry-expert-pdp';\n      if (isDesigner) return 'ga-oli-contact-a-jewelry-expert-designer';\n      if (isPLP && isJewelry) return 'ga-oli-contact-a-jewelry-expert-jewelry-plp';\n      if (isPLP && isClothing) return 'ga-oli-contact-a-jewelry-expert-clothing-plp';\n      if (isPLP) return 'ga-oli-contact-a-jewelry-expert-plp';\n      if (isHomePage) return 'ga-oli-contact-a-jewelry-expert-home';\n    } else if (ctaType === 'shipping_info') {\n      return 'ga-oli-shipping-info';\n    } else if (ctaType === 'payment_info') {\n      return 'ga-oli-payment-info';\n    } else if (ctaType === 'returns_exchanges') {\n      return 'ga-oli-returns-exchanges';\n    }\n    return '';\n  }\n\n  function handleOliCtaEmail(type, mailTo) {\n    var pageTitle = document && document.title ? document.title : '';\n    var searchText = lastQueryText || '';\n    var url = window.location.href;\n    var productName = '';\n    var isPDP = window.location.pathname.indexOf('/products/') !== -1;\n    if (isPDP) {\n      var nameEl = document.querySelector('#productName');\n      productName = nameEl ? nameEl.innerHTML : '';\n    }\n    var subject = '';\n    var body = '';\n    if (type === 'stylist') {\n      subject = 'I have a question about an Olivela product';\n      if (isPDP && productName) subject += ': ' + productName;\n    } else if (type === 'customerCare') {\n      subject = 'Olivela support query';\n    } else if (type === 'jewelry_concierge') {\n      subject = 'I have a question about an Olivela jewelry product';\n      if (isPDP && productName) subject += ': ' + productName;\n    } else {\n      return;\n    }\n    // Build conversation history transcript\n    var chatHistory = '';\n    if (messageLog.length > 0) {\n      chatHistory = '\\n\\n--- Conversation History ---\\n';\n      for (var i = 0; i < messageLog.length; i++) {\n        var entry = messageLog[i];\n        if (entry.type === 'user') {\n          chatHistory += 'Customer: ' + entry.text + '\\n';\n        } else if (entry.type === 'assistant' && entry.text) {\n          chatHistory += 'Oli: ' + entry.text + '\\n';\n        }\n        // Skip 'products' entries \u2014 they don't have text content\n      }\n      chatHistory += '--- End of Conversation ---';\n    }\n    body = encodeURIComponent(\n      'Hi there,\\nI was just talking to Oli and wanted to know \"' + searchText + '\". \\n\\nHere\\'s the page I was on: ' + pageTitle + '.\\n\\nMany thanks' + chatHistory + '\\n\\nReference: ' + url\n    );\n    window.location.href = 'mailto:' + mailTo + '?subject=' + encodeURIComponent(subject) + '&body=' + body;\n  }\n\n  function addOliTextMessage(text, skipLog) {\n    if (!messagesContainer || !text) return;\n    var wrapper = document.createElement('div');\n    wrapper.className = 'oli-greeting__msg oli-greeting__msg--oli';\n\n    // Check if text contains any CTA placeholders\n    var hasPlaceholder = false;\n    var placeholderKeys = Object.keys(OLI_CTA_MAP);\n    for (var i = 0; i < placeholderKeys.length; i++) {\n      if (text.indexOf(placeholderKeys[i]) !== -1) {\n        hasPlaceholder = true;\n        break;\n      }\n    }\n\n    if (hasPlaceholder) {\n      // Split text around placeholders and build mixed content\n      var remaining = text;\n      var fragment = document.createDocumentFragment();\n      var placeholderPattern = /\\[\\[(Jewelry|Jewelry_STREAK|Stylist|Stylist_STREAK|Support|Support_STREAK|Shipping information|Payment information|Returns and exchanges)\\]\\]/g;\n      var match;\n      var lastIndex = 0;\n\n      while ((match = placeholderPattern.exec(remaining)) !== null) {\n        // Add text before the placeholder\n        if (match.index > lastIndex) {\n          var textBefore = document.createElement('p');\n          textBefore.className = 'oli-greeting__msg-text';\n          textBefore.textContent = remaining.substring(lastIndex, match.index);\n          fragment.appendChild(textBefore);\n        }\n        // Add the CTA button\n        var ctaConfig = OLI_CTA_MAP[match[0]];\n        if (ctaConfig) {\n          if (ctaConfig.link) {\n            var anchor = document.createElement('a');\n            var gaClass = getOliCtaGaClass(ctaConfig.type);\n            anchor.className = 'btn-primary oli-greeting__cta-btn oli-contcat-placeholder' + (gaClass ? ' ' + gaClass : '');\n            anchor.textContent = ctaConfig.label;\n            anchor.href = ctaConfig.link;\n            anchor.target = '_blank';\n            anchor.rel = 'noopener noreferrer';\n            anchor.setAttribute('data-oli-cta-type', ctaConfig.type);\n            fragment.appendChild(anchor);\n          } else {\n            var btn = document.createElement('button');\n            var gaClass = getOliCtaGaClass(ctaConfig.type);\n            btn.className = 'btn-primary oli-greeting__cta-btn oli-contcat-placeholder' + (gaClass ? ' ' + gaClass : '');\n            btn.textContent = ctaConfig.label;\n            btn.setAttribute('data-oli-cta-type', ctaConfig.type);\n            btn.setAttribute('data-oli-cta-mailto', ctaConfig.mailTo);\n            btn.addEventListener('click', (function (type, mailTo) {\n              return function () { handleOliCtaEmail(type, mailTo); };\n            })(ctaConfig.type, ctaConfig.mailTo));\n            fragment.appendChild(btn);\n          }\n        }\n        lastIndex = match.index + match[0].length;\n      }\n      // Add any remaining text after the last placeholder\n      if (lastIndex < remaining.length) {\n        var textAfter = document.createElement('p');\n        textAfter.className = 'oli-greeting__msg-text';\n        textAfter.textContent = remaining.substring(lastIndex);\n        fragment.appendChild(textAfter);\n      }\n      wrapper.appendChild(fragment);\n    } else {\n      var textEl = document.createElement('p');\n      textEl.className = 'oli-greeting__msg-text';\n      textEl.textContent = text;\n      wrapper.appendChild(textEl);\n    }\n\n    messagesContainer.appendChild(wrapper);\n    scrollToBottom();\n    if (!skipLog) {\n      messageLog.push({ type: 'assistant', text: text });\n    }\n  }\n\n  function addLoadingMessage() {\n    if (!messagesContainer) return null;\n    var el = document.createElement('div');\n    el.className = 'oli-greeting__msg oli-greeting__msg--oli oli-greeting__msg--loading';\n    el.innerHTML =\n      '<span class=\"oli-greeting__loading-dots\">' +\n        '<span></span><span></span><span></span>' +\n      '</span>';\n    messagesContainer.appendChild(el);\n    scrollToBottom();\n    return el;\n  }\n\n  function removeElement(el) {\n    if (el && el.parentNode) el.parentNode.removeChild(el);\n  }\n\n  // ----- Product normalization (handles various API shapes) -----\n\n  function normalizeProduct(p) {\n    // Handles price_range.min/max as either:\n    //   { amount: 28000, currency: \"USD\" }  \u2190 new UCP format (cents)\n    //   280.00                              \u2190 old flat format (dollars)\n    function parsePriceField(val) {\n      if (!val && val !== 0) return NaN;\n      if (typeof val === 'object' && val.amount != null) return val.amount / 100;\n      return parseFloat(val);\n    }\n\n    var priceMin = p.price_range && p.price_range.min;\n    var priceMax = p.price_range && p.price_range.max;\n\n    var price = priceMin\n      ? parsePriceField(priceMin)\n      : (p.price ? parseFloat(p.price) : 0);\n\n    var maxVal = priceMax ? parsePriceField(priceMax) : NaN;\n    var compareAtPrice = (!isNaN(maxVal) && maxVal > price)\n      ? maxVal\n      : (p.compareAtPrice || p.compare_at_price\n          ? parseFloat(p.compareAtPrice || p.compare_at_price)\n          : null);\n\n    // UCP nests currency inside price_range.min; legacy had it flat on price_range\n    var currency = (p.price_range && p.price_range.min && p.price_range.min.currency)\n      || (p.price_range && p.price_range.currency)\n      || p.currency\n      || 'USD';\n\n    var image = p.image_url\n      || (p.images && p.images[0])\n      || p.image\n      || '';\n\n    var url = p.url\n      || (p.handle ? '/products/' + p.handle : '#');\n\n    var rawId = String(p.id || p.admin_graphql_api_id || p.product_id || p.gid || '');\n\n    return {\n      title: p.title || 'Untitled',\n      vendor: p.vendor || '',\n      price: price,\n      compareAtPrice: compareAtPrice,\n      currency: currency,\n      image: image,\n      url: url,\n      handle: p.handle || '',\n      available: p.available !== false,\n      variants: p.variants || [],\n      id: rawId\n    };\n  }\n\n\n  // ----- Product card strip (horizontal scroll) -----\n\n  function addProductCards(rawProducts, location, skipLog) {\n    if (!messagesContainer || !rawProducts || !rawProducts.length) return;\n\n    var wrapper = document.createElement('div');\n    wrapper.className = 'oli-greeting__msg oli-greeting__msg--oli oli-greeting__msg--products';\n\n    var cardsWrap = document.createElement('div');\n    cardsWrap.className = 'oli-greeting__cards-wrap';\n\n    var btnLeft = document.createElement('button');\n    btnLeft.className = 'oli-greeting__scroll-btn oli-greeting__scroll-btn--left oli-greeting__scroll-btn--hidden';\n    btnLeft.innerHTML = '<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 1L1 6L6 11\" stroke=\"#111111\" stroke-width=\"0.83\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n    btnLeft.setAttribute('aria-label', 'Scroll left');\n    btnLeft.type = 'button';\n\n    var btnRight = document.createElement('button');\n    btnRight.className = 'oli-greeting__scroll-btn oli-greeting__scroll-btn--right';\n    btnRight.innerHTML = '<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L6 6L1 11\" stroke=\"#111111\" stroke-width=\"0.83\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n    btnRight.setAttribute('aria-label', 'Scroll right');\n    btnRight.type = 'button';\n\n    var strip = document.createElement('div');\n    strip.className = 'oli-greeting__cards-strip';\n\n    var oliPdpGaClass = getOliPdpGaClass();\n\n    rawProducts.forEach(function (rawProduct) {\n      var p = normalizeProduct(rawProduct);\n\n      var card = document.createElement('a');\n      card.className = 'oli-greeting__card';\n      var cardUrl = new URL(p.url, window.location.origin);\n      cardUrl.searchParams.set('search_source', 'oli_pdp');\n      card.href = cardUrl.toString();\n      card.target = '_blank';\n      card.rel = 'noopener';\n\n      // Image wrapper\n      var imgWrap = document.createElement('div');\n      imgWrap.className = 'oli-greeting__card-img-wrap';\n      if (p.image) {\n        var img = document.createElement('img');\n        img.src = p.image;\n        img.alt = p.title;\n        img.loading = 'lazy';\n        img.classList.add(oliPdpGaClass);\n        imgWrap.appendChild(img);\n      }\n\n      card.appendChild(imgWrap);\n\n      // Card body\n      var body = document.createElement('div');\n      body.className = 'oli-greeting__card-body';\n\n      if (p.vendor) {\n        var brand = document.createElement('div');\n        brand.className = 'oli-greeting__card-brand ' + oliPdpGaClass;\n        brand.textContent = p.vendor.toUpperCase();\n        body.appendChild(brand);\n      }\n\n      var title = document.createElement('div');\n      title.className = 'oli-greeting__card-title ' + oliPdpGaClass;\n      title.textContent = p.title;\n      body.appendChild(title);\n\n      var prices = document.createElement('div');\n      prices.className = 'oli-greeting__card-prices ' + oliPdpGaClass;\n      if (p.compareAtPrice && p.compareAtPrice > p.price) {\n        var compareEl = document.createElement('span');\n        compareEl.className = 'oli-greeting__card-compare';\n        compareEl.textContent = formatCurrency(p.compareAtPrice, p.currency);\n        prices.appendChild(compareEl);\n\n        var saleEl = document.createElement('span');\n        saleEl.className = 'oli-greeting__card-sale';\n        saleEl.textContent = formatCurrency(p.price, p.currency);\n        prices.appendChild(saleEl);\n      } else {\n        var priceEl = document.createElement('span');\n        priceEl.className = 'oli-greeting__card-price';\n        priceEl.textContent = formatCurrency(p.price, p.currency);\n        prices.appendChild(priceEl);\n      }\n      body.appendChild(prices);\n      card.appendChild(body);\n\n      // Track PDP click (navigation handled by <a> href)\n      card.addEventListener('click', function () {\n        localStorage.setItem(OLI_NEW_TAB_KEY, Date.now().toString());\n        trackOliEvent(location + ' - Oli PDP click', {\n          product_id: p.id,\n          product_url: p.url\n        });\n      });\n\n      strip.appendChild(card);\n    });\n\n    function updateArrows() {\n      var atStart = strip.scrollLeft <= 4;\n      var atEnd = strip.scrollLeft + strip.clientWidth >= strip.scrollWidth - 4;\n      btnLeft.classList.toggle('oli-greeting__scroll-btn--hidden', atStart);\n      btnRight.classList.toggle('oli-greeting__scroll-btn--hidden', atEnd || rawProducts.length <= 3);\n    }\n\n    btnLeft.addEventListener('click', function () { strip.scrollBy({ left: -300, behavior: 'smooth' }); });\n    btnRight.addEventListener('click', function () { strip.scrollBy({ left: 300, behavior: 'smooth' }); });\n    strip.addEventListener('scroll', updateArrows);\n\n    cardsWrap.appendChild(btnLeft);\n    cardsWrap.appendChild(strip);\n    cardsWrap.appendChild(btnRight);\n    wrapper.appendChild(cardsWrap);\n\n    messagesContainer.appendChild(wrapper);\n    requestAnimationFrame(updateArrows);\n    scrollToBottom();\n\n    if (!skipLog) {\n      var slimProducts = rawProducts.map(function (rp) {\n        var n = normalizeProduct(rp);\n        return {\n          title: n.title, vendor: n.vendor, price: n.price,\n          compareAtPrice: n.compareAtPrice, currency: n.currency,\n          image: n.image, url: n.url, handle: n.handle, id: n.id\n        };\n      });\n      messageLog.push({ type: 'products', products: slimProducts });\n    }\n  }\n\n  // ----- Product filtering -----\n\n  function filterProducts(products, query) {\n    if (!products || !products.length) return [];\n\n    var sizeMatch = query.match(/\\bsize\\s+(\\S+)/i);\n    var requestedSize = sizeMatch ? sizeMatch[1].toLowerCase() : null;\n\n    var filtered = products.filter(function (product) {\n      if (product.available === false) return false;\n\n      if (requestedSize && product.variants && product.variants.length) {\n        var hasSizeInStock = product.variants.some(function (v) {\n          var variantTitle = (v.title || '').toLowerCase();\n          return variantTitle.indexOf(requestedSize) !== -1 && v.available;\n        });\n        if (!hasSizeInStock) return false;\n      }\n\n      return true;\n    });\n\n    return filtered.slice(0, MAX_RESULTS);\n  }\n\n  function getCookie(name) {\n    var match = document.cookie.match(new RegExp('(?:^|; )' + name.replace(/[$()*+./?[\\\\\\]^{|}-]/g, '\\\\$&') + '=([^;]*)'));\n    return match ? decodeURIComponent(match[1]) : null;\n  }\n\n  function getGA4SessionId() {\n    // adjust if your env flag is exposed differently in theme runtime\n    var gaCookieName = window.APP_MODE === 'production' ? '_ga_7YBDDD5RP7' : '_ga_EZQ6LM9EQB';\n    var gaCookie = getCookie(gaCookieName);\n    if (!gaCookie) return null;\n\n    var parts = gaCookie.split('.');\n    if (parts.length > 2 && parts[2]) {\n      var sessionPart = parts[2].split('$')[0];\n      if (sessionPart && sessionPart.length > 1) {\n        return sessionPart.substring(1);\n      }\n    }\n    return null;\n  }\n\n  function getLoggedInCustomerId() {\n    // set this in Liquid globally if available: window.CUSTOMER_ID = \"{{ customer.id }}\";\n    return window.CUSTOMER_ID || null;\n  }\n\n  function getDeviceType() {\n    var isDesktop = window.matchMedia('(min-width: 1024px)').matches;\n    var isMobile = window.matchMedia('(max-width: 767px)').matches;\n    return isMobile ? 'mobile' : isDesktop ? 'desktop' : 'unknown';\n  }\n\n  // ----- API call -----\n\n  function callOliAPI(query) {\n    var payload = {\n      message: query,\n      conversationHistory: conversationHistory,\n      cursors: currentCursors,\n      lastSearchState: query === 'show me more' ? lastSearchState : null,\n      device: getDeviceType(),\n      url: typeof window !== \"undefined\" ? window.location.href : \"\",\n      pageContext: window.oliPageContext || null\n    };\n\n    // Send extra fields only for logged-in user\n    if (window.IS_LOGGED_IN) {\n      var customerId = getLoggedInCustomerId();\n      if (customerId) payload.user_id = String(customerId);\n    }\n\n    var gaSessionId = getGA4SessionId();\n    if (gaSessionId) payload.ga_session_id = gaSessionId;\n\n\n\n    return fetch(OLI_API_URL, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload)\n    }).then(function (res) {\n      if (!res.ok) throw new Error('API request failed');\n      return res.json();\n    });\n  }\n\n  // ----- Send query -----\n\n  function sendOliQuery(isPreset) {\n    if (!greetingInput || oliLoading) return;\n    var query = greetingInput.value.trim();\n    if (!query) return;\n\n    oliLoading = true;\n    lastQueryText = query;\n    var location = getPageLocation();\n\n    // Tracking\n    if (isPreset) {\n      trackOliEvent('Oli preset search click', { query: query });\n    } else {\n      trackOliEvent(location + ' - Oli search CTA click', { query: query });\n    }\n\n    showChatView();\n    addUserMessage(query);\n    greetingInput.value = '';\n\n    var loadingEl = addLoadingMessage();\n\n    callOliAPI(query)\n      .then(function (data) {\n        removeElement(loadingEl);\n\n        // Update state from API response\n        conversationHistory = data.nextHistory || conversationHistory;\n        currentCursors = data.nextCursors || {};\n\n        if (data.intent !== 'show_more' && data.lastSearchState) {\n          lastSearchState = data.lastSearchState;\n        } else if (data.intent !== 'show_more') {\n          lastSearchState = null;\n        }\n\n        // Route by intent\n        var responseText = data.responseText || data.message || '';\n        var products = filterProducts(data.products || [], query);\n\n        if (responseText) {\n          addOliTextMessage(responseText);\n        }\n\n        if (products.length) {\n          addProductCards(products, location);\n        }\n\n        saveSession();\n      })\n      .catch(function () {\n        removeElement(loadingEl);\n        addOliTextMessage('Sorry, I encountered an error. Please try again.');\n        saveSession();\n      })\n      .finally(function () {\n        oliLoading = false;\n        if (greetingInput) greetingInput.focus();\n      });\n  }\n\n  // ----- Event listeners -----\n\n  // Preset prompt clicks \u2014 submit the prompt text immediately\n  greetingPrompts.forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      if (!greetingInput) return;\n      greetingInput.value = btn.dataset.prompt || '';\n      sendOliQuery(true);\n    });\n  });\n\n  // Send on Enter\n  if (greetingInput) {\n    greetingInput.addEventListener('keydown', function (e) {\n      if (e.key === 'Enter') {\n        e.preventDefault();\n        sendOliQuery(false);\n      }\n    });\n  }\n\n  // Send button\n  var sendBtn = document.getElementById('oli-greeting-send');\n  if (sendBtn) {\n    sendBtn.addEventListener('click', function () {\n      sendOliQuery(false);\n    });\n  }\n\n  // Close button\n  var greetingCloseBtn = document.getElementById('oli-greeting-close');\n  if (greetingCloseBtn && greetingComponent) {\n    greetingCloseBtn.addEventListener('click', function () {\n      if (typeof greetingComponent.closeDialog === 'function') {\n        greetingComponent.closeDialog();\n      }\n    });\n  }\n\n  // Back button \u2014 reset chat and return to welcome view\n  var greetingBackBtn = document.getElementById('oli-greeting-back');\n  if (greetingBackBtn) {\n    greetingBackBtn.addEventListener('click', function () {\n      // Clear conversation state\n      conversationHistory = [];\n      currentCursors = {};\n      lastSearchState = null;\n      messageLog = [];\n      localStorage.removeItem(OLI_HISTORY_KEY);\n\n      // Clear rendered messages\n      if (messagesContainer) messagesContainer.innerHTML = '';\n\n      showWelcomeView();\n    });\n  }\n\n  // ===== ADA: Focus trap inside greeting dialog =====\n  if (greetingComponent) {\n    var greetingDialog = greetingComponent.querySelector('dialog');\n    if (greetingDialog) {\n      greetingDialog.addEventListener('keydown', function (e) {\n        if (e.key !== 'Tab') return;\n\n        var focusableEls = greetingDialog.querySelectorAll(\n          'button:not([disabled]):not([tabindex=\"-1\"]), ' +\n          'input:not([disabled]):not([tabindex=\"-1\"]), ' +\n          'a[href]:not([tabindex=\"-1\"]), ' +\n          '[tabindex=\"0\"]'\n        );\n        if (!focusableEls.length) return;\n\n        var firstEl = focusableEls[0];\n        var lastEl = focusableEls[focusableEls.length - 1];\n\n        if (e.shiftKey) {\n          if (document.activeElement === firstEl) {\n            e.preventDefault();\n            lastEl.focus();\n          }\n        } else {\n          if (document.activeElement === lastEl) {\n            e.preventDefault();\n            firstEl.focus();\n          }\n        }\n      });\n    }\n  }\n\n})();"],
  "mappings": "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",
  "names": []
}
