{
  "version": 3,
  "sources": ["/cdn/shop/t/34/assets/lumi-widget.js?cb=20260627-2"],
  "sourcesContent": ["(function () {\n  \"use strict\";\n  var CFG = window.LUMI_CONFIG || {};\n  var API = CFG.apiUrl;            // e.g. https://<project>.vercel.app/api/chat\n  var AVATAR = CFG.avatar || \"\";   // Lumi avatar image URL (optional)\n  if (!API) { console.warn(\"[Lumi] no apiUrl configured\"); return; }\n\n  var history = [];                // [{role, content}]\n  var sending = false;\n  var GREETING = \"Hi, I am Lumi. I can help you pick the right red light therapy device, answer questions, or check an order. What are you after?\";\n\n  // ---------- styles ----------\n  var css = \"\" +\n    \"#lumi-launcher{position:fixed;right:20px;bottom:20px;width:60px;height:60px;border-radius:50%;background:#000;border:1px solid #2a2a2a;cursor:pointer;z-index:99999;display:flex;align-items:center;justify-content:center;box-shadow:0 6px 24px rgba(0,0,0,.4)}\" +\n    \"#lumi-launcher img{width:60px;height:60px;border-radius:50%;object-fit:cover}\" +\n    \"#lumi-launcher span{color:#ff3b3b;font-size:24px}\" +\n    \"#lumi-panel{position:fixed;right:20px;bottom:90px;width:300px;max-width:calc(100vw - 40px);height:400px;max-height:calc(100vh - 160px);background:#0d0d0d;border:1px solid #2a2a2a;border-radius:16px;z-index:99999;display:none;flex-direction:column;overflow:hidden;font-family:Inter,system-ui,sans-serif}\" +\n    \"#lumi-panel.open{display:flex}\" +\n    \"#lumi-head{padding:14px 16px;background:#000;color:#fff;display:flex;align-items:center;gap:10px;border-bottom:1px solid #1c1c1c;flex-shrink:0}\" +\n    \"#lumi-head img{width:32px;height:32px;border-radius:50%;object-fit:cover}\" +\n    \"#lumi-head b{font-size:15px}\" +\n    \"#lumi-head small{color:#9a9a9a;display:block;font-size:11px}\" +\n    \"#lumi-clear{margin-left:auto;background:none;border:1px solid #2a2a2a;color:#9a9a9a;font-size:12px;cursor:pointer;border-radius:12px;padding:4px 10px}\" +\n    \"#lumi-clear:hover{color:#fff;border-color:#444}\" +\n    \"#lumi-close{margin-left:8px;background:none;border:none;color:#9a9a9a;font-size:20px;cursor:pointer}\" +\n    \"#lumi-msgs{flex:1;min-height:0;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px}\" +\n    \".lumi-row{display:flex;gap:8px;align-items:flex-end}\" +\n    \".lumi-row.user{flex-direction:row-reverse}\" +\n    \".lumi-av{width:26px;height:26px;border-radius:50%;object-fit:cover;flex:0 0 26px}\" +\n    \".lumi-bub{max-width:78%;padding:10px 12px;border-radius:14px;font-size:14px;line-height:1.45;white-space:pre-wrap;word-wrap:break-word}\" +\n    \".lumi-row.bot .lumi-bub{background:#1a1a1a;color:#eee;border-bottom-left-radius:4px}\" +\n    \".lumi-row.user .lumi-bub{background:#ff3b3b;color:#fff;border-bottom-right-radius:4px}\" +\n    \".lumi-dots{display:inline-flex;gap:4px}.lumi-dots i{width:6px;height:6px;border-radius:50%;background:#888;animation:lumiB 1s infinite}.lumi-dots i:nth-child(2){animation-delay:.2s}.lumi-dots i:nth-child(3){animation-delay:.4s}\" +\n    \"@keyframes lumiB{0%,60%,100%{opacity:.3}30%{opacity:1}}\" +\n    \"#lumi-foot{padding:12px;border-top:1px solid #1c1c1c;display:flex;gap:8px;flex-shrink:0;align-items:flex-end}\" +\n    // font-size MUST be >=16px or iOS Safari auto-zooms the page when the input is focused.\n    \"#lumi-input{flex:1;min-width:0;box-sizing:border-box;background:#1a1a1a;border:1px solid #2a2a2a;border-radius:16px;color:#fff;padding:9px 12px;font-size:16px;line-height:1.3;font-family:inherit;outline:none;resize:none;max-height:96px;overflow-y:auto}\" +\n    \"#lumi-send{background:#ff3b3b;border:none;color:#fff;border-radius:20px;padding:10px 16px;cursor:pointer;font-weight:600;white-space:nowrap}\" +\n    \"#lumi-send:disabled{opacity:.5;cursor:default}\" +\n    \"#lumi-nudge{position:fixed;right:20px;bottom:90px;z-index:99998;background:#1a1a1a;color:#fff;border:1px solid #2a2a2a;border-radius:16px;padding:9px 14px;font-family:Inter,system-ui,sans-serif;font-size:13px;line-height:1;box-shadow:0 4px 18px rgba(0,0,0,.4);cursor:pointer;white-space:nowrap;display:flex;align-items:center;gap:8px;animation:lumiNudgeIn .4s ease}\" +\n    \"#lumi-nudge.lumi-hidden{display:none}\" +\n    \"#lumi-nudge .lumi-x{opacity:.45;font-size:15px}\" +\n    \"#lumi-nudge .lumi-x:hover{opacity:.9}\" +\n    \"@keyframes lumiNudgeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\" +\n    \".lumi-qa{display:flex;flex-wrap:wrap;gap:6px;padding:2px 12px 2px 14px}\" +\n    \".lumi-qa button{background:#1a1a1a;border:1px solid #333;color:#eee;border-radius:16px;padding:6px 10px;font-size:12px;cursor:pointer;text-align:center;font-family:inherit;white-space:nowrap}\" +\n    \".lumi-qa button:hover{border-color:#ff3b3b;color:#fff}\" +\n    \"#lumi-qa-toggle{flex-shrink:0;margin:0 12px 6px;background:#141414;border:1px solid #2a2a2a;color:#9a9a9a;border-radius:14px;padding:6px 12px;font-size:12px;cursor:pointer;font-family:inherit}\" +\n    \"#lumi-qa-toggle:hover{color:#fff;border-color:#444}\" +\n    \"#lumi-qa-toggle.lumi-hidden{display:none}\" +\n    \"@media (max-width:600px){#lumi-panel{top:auto;right:10px;bottom:84px;left:10px;width:auto;max-width:none;height:auto;max-height:55vh;border-radius:16px}}\";\n  var style = document.createElement(\"style\");\n  style.textContent = css;\n  document.head.appendChild(style);\n\n  // ---------- DOM ----------\n  var launcher = el(\"div\", { id: \"lumi-launcher\" });\n  launcher.innerHTML = AVATAR ? '<img src=\"' + AVATAR + '\" alt=\"Lumi\">' : \"<span>&#9679;</span>\";\n  var panel = el(\"div\", { id: \"lumi-panel\" });\n  panel.innerHTML =\n    '<div id=\"lumi-head\">' + (AVATAR ? '<img src=\"' + AVATAR + '\">' : \"\") +\n    '<div><b>Lumi</b><small>Lumovex assistant</small></div>' +\n    '<button id=\"lumi-clear\" aria-label=\"Clear chat\" title=\"Clear chat\">Clear</button>' +\n    '<button id=\"lumi-close\" aria-label=\"Close\">&times;</button></div>' +\n    '<div id=\"lumi-msgs\"></div>' +\n    '<div id=\"lumi-foot\"><textarea id=\"lumi-input\" rows=\"1\" placeholder=\"Ask me anything...\" autocomplete=\"off\"></textarea><button id=\"lumi-send\">Send</button></div>';\n  var nudge = el(\"div\", { id: \"lumi-nudge\" });\n  nudge.innerHTML = 'Ask me anything <span class=\"lumi-x\" aria-label=\"Dismiss\">&times;</span>';\n  document.body.appendChild(launcher);\n  document.body.appendChild(nudge);\n  document.body.appendChild(panel);\n\n  var msgs = panel.querySelector(\"#lumi-msgs\");\n  var input = panel.querySelector(\"#lumi-input\");\n  var sendBtn = panel.querySelector(\"#lumi-send\");\n\n  // Quick-action buttons (shown under the greeting, tuck away once chatting).\n  var toggleBtn = el(\"button\", { id: \"lumi-qa-toggle\", class: \"lumi-hidden\" });\n  toggleBtn.textContent = \"Quick actions\";\n  panel.insertBefore(toggleBtn, panel.querySelector(\"#lumi-foot\"));\n  toggleBtn.addEventListener(\"click\", function () { renderQuickActions(); });\n\n  var QUICK_ACTIONS = [\n    { label: \"Explore products\", local: function () { botSay(\"Happy to help you find the right device. What are you mainly looking to support? For example: facial skin and anti-ageing, muscle or joint recovery, full-body sessions, or targeted spot treatment.\"); } },\n    { label: \"Track my order\", send: \"I'd like to track my order.\" },\n    { label: \"FAQs & enquiries\", local: function () { botSay(\"Sure - ask me anything about Lumovex: products, shipping, returns, warranty, or how red light therapy works.\"); } },\n    { label: \"Contact support\", local: function () {\n        var bub = addBubble(\"bot\", \"\");\n        bub.innerHTML = 'No problem - I\\'ll open an email to our support team for you. If nothing opens, you can email <a href=\"mailto:hello@lumovex.co.uk\" style=\"color:#ff6b6b\">hello@lumovex.co.uk</a> or use the <a href=\"https://www.lumovex.co.uk/pages/contact\" style=\"color:#ff6b6b\">contact page</a>.';\n        history.push({ role: \"assistant\", content: \"To contact support, email hello@lumovex.co.uk or visit https://www.lumovex.co.uk/pages/contact\" });\n        persist();\n        var a = document.createElement(\"a\");\n        a.href = \"mailto:hello@lumovex.co.uk?subject=\" + encodeURIComponent(\"Lumovex support enquiry\");\n        a.style.display = \"none\";\n        document.body.appendChild(a);\n        a.click();\n        a.remove();\n      } },\n  ];\n\n  function renderQuickActions() {\n    hideQuickActions();\n    var row = el(\"div\", { class: \"lumi-qa\", id: \"lumi-qa\" });\n    QUICK_ACTIONS.forEach(function (a) {\n      var b = document.createElement(\"button\");\n      b.textContent = a.label;\n      b.addEventListener(\"click\", function () {\n        hideQuickActions();\n        toggleBtn.classList.remove(\"lumi-hidden\");\n        if (a.send) sendText(a.send);\n        else if (a.local) a.local();\n        scroll();\n      });\n      row.appendChild(b);\n    });\n    msgs.appendChild(row);\n    scroll();\n    toggleBtn.classList.add(\"lumi-hidden\");\n  }\n  function hideQuickActions() {\n    var ex = document.getElementById(\"lumi-qa\");\n    if (ex) ex.remove();\n  }\n\n  var nudgeDismissed = false;\n  try { nudgeDismissed = sessionStorage.getItem(\"lumi_nudge_x\") === \"1\"; } catch (e) {}\n  function updateNudge() {\n    nudge.classList.toggle(\"lumi-hidden\", panel.classList.contains(\"open\") || nudgeDismissed);\n  }\n  function isMobile() { return window.innerWidth <= 600; }\n  var inputFocused = false;\n  // On mobile, when the keyboard opens it shrinks the visual viewport. Anchor the\n  // panel to BOTH the top and bottom of the visible area (letting the browser work\n  // out the height) so the greeting is never cropped at the top and the Send button\n  // is always pinned just above the keyboard. When the keyboard is down we clear the\n  // inline styles and fall back to the compact CSS layout. This is more robust than\n  // setting a fixed pixel height, which iOS mis-reports mid keyboard-animation.\n  // Anchor the panel's BOTTOM to the bottom of the visible area and cap its height,\n  // using ONLY visualViewport.height + offsetTop (never window.innerHeight, which iOS\n  // reports inconsistently). visualViewport.height always excludes the keyboard, so\n  // the panel bottom (and the input/Send button) sits just above the keyboard when\n  // open, or above the launcher when closed. Capping the height means the top can\n  // never run off the screen, so the greeting is always visible.\n  function fitPanelToKeyboard() {\n    var vv = window.visualViewport;\n    if (!vv || !isMobile() || !panel.classList.contains(\"open\")) return;\n    var avail = vv.height;                       // visible height (excludes keyboard)\n    var bottomGap = inputFocused ? 8 : 84;       // above keyboard while typing, above launcher otherwise\n    var h = Math.min(avail - bottomGap - 8, 440);\n    if (h < 160) h = Math.max(avail - bottomGap - 8, 120); // tiny-viewport safety\n    panel.style.height = h + \"px\";\n    panel.style.top = (vv.offsetTop + avail - h - bottomGap) + \"px\";\n    panel.style.bottom = \"auto\";\n    panel.style.maxHeight = \"none\";\n    scroll();\n  }\n  function clearPanelStyles() {\n    panel.style.top = panel.style.height = panel.style.bottom = panel.style.maxHeight = \"\";\n  }\n  // Lock the background page while the chat is open on mobile. This stops iOS from\n  // scrolling the page when the keyboard opens (which is what shifts the fixed panel\n  // and crops it). With the page locked, visualViewport.offsetTop stays 0 and the\n  // top/bottom anchoring in fitPanelToKeyboard lines up exactly.\n  var savedScrollY = 0;\n  function lockBody(lock) {\n    if (!isMobile()) return;\n    var b = document.body;\n    if (lock) {\n      savedScrollY = window.scrollY || window.pageYOffset || 0;\n      b.style.position = \"fixed\";\n      b.style.top = -savedScrollY + \"px\";\n      b.style.left = \"0\";\n      b.style.right = \"0\";\n      b.style.width = \"100%\";\n    } else {\n      b.style.position = b.style.top = b.style.left = b.style.right = b.style.width = \"\";\n      window.scrollTo(0, savedScrollY);\n    }\n  }\n  if (window.visualViewport) {\n    window.visualViewport.addEventListener(\"resize\", fitPanelToKeyboard);\n    window.visualViewport.addEventListener(\"scroll\", fitPanelToKeyboard);\n  }\n  var suppressGreetingOnce = false;   // set true to open straight into a proactive state (skip the greeting)\n  function openPanel() {\n    panel.classList.add(\"open\");\n    lockBody(true);\n    updateNudge();\n    if (!msgs.childElementCount && !suppressGreetingOnce) { botSay(GREETING); renderQuickActions(); }\n    else if (!document.getElementById(\"lumi-qa\")) { toggleBtn.classList.remove(\"lumi-hidden\"); }\n    suppressGreetingOnce = false;\n    fitPanelToKeyboard();\n    // Only auto-focus on desktop. On mobile, focusing pops the keyboard and\n    // scrolls the viewport, which pushes the fixed panel up and crops it.\n    if (!isMobile()) input.focus();\n  }\n  function closePanel() { panel.classList.remove(\"open\"); clearPanelStyles(); lockBody(false); updateNudge(); }\n\n  launcher.addEventListener(\"click\", function () {\n    if (panel.classList.contains(\"open\")) closePanel(); else { markInteracted(); openPanel(); }\n  });\n  panel.querySelector(\"#lumi-close\").addEventListener(\"click\", closePanel);\n  panel.querySelector(\"#lumi-clear\").addEventListener(\"click\", function () {\n    history = [];\n    try { sessionStorage.removeItem(\"lumi_history\"); } catch (e) {}\n    msgs.innerHTML = \"\";\n    botSay(GREETING);\n    renderQuickActions();\n    if (!isMobile()) input.focus();\n  });\n  nudge.addEventListener(\"click\", function (e) {\n    if (e.target && e.target.classList.contains(\"lumi-x\")) {\n      nudgeDismissed = true;\n      try { sessionStorage.setItem(\"lumi_nudge_x\", \"1\"); } catch (er) {}\n      updateNudge();\n      return;\n    }\n    openPanel();\n  });\n  updateNudge();\n  sendBtn.addEventListener(\"click\", send);\n  // Enter sends; Shift+Enter inserts a new line. Grow the box as you type.\n  function autoGrow() {\n    input.style.height = \"auto\";\n    input.style.height = Math.min(input.scrollHeight, 96) + \"px\";\n  }\n  input.addEventListener(\"input\", autoGrow);\n  // Re-fit after the keyboard finishes animating (visualViewport resize alone can\n  // fire mid-animation with stale values), and again when it closes.\n  input.addEventListener(\"focus\", function () {\n    inputFocused = true;\n    if (isMobile()) { fitPanelToKeyboard(); setTimeout(fitPanelToKeyboard, 200); setTimeout(fitPanelToKeyboard, 500); }\n  });\n  input.addEventListener(\"blur\", function () {\n    inputFocused = false;\n    if (isMobile()) { fitPanelToKeyboard(); setTimeout(fitPanelToKeyboard, 150); }\n  });\n  input.addEventListener(\"keydown\", function (e) {\n    if (e.key === \"Enter\" && !e.shiftKey) { e.preventDefault(); send(); }\n  });\n\n  // Session transcript is restored at the very end (after the card renderer is wired).\n  function sessionRestore() {\n    try {\n      var saved = sessionStorage.getItem(\"lumi_history\");\n      if (!saved) return;\n      history = JSON.parse(saved);\n      history.forEach(function (m) {\n        if (m.card) { renderCard(m.card); }\n        else if (m.role === \"user\") { addBubble(\"user\", m.content); }\n        else { var b = addBubble(\"bot\", \"\"); b.innerHTML = linkify(m.content); }\n      });\n    } catch (e) {}\n  }\n\n  // ---------- helpers ----------\n  function el(tag, attrs) { var n = document.createElement(tag); if (attrs) for (var k in attrs) n.setAttribute(k, attrs[k]); return n; }\n  function scroll() { msgs.scrollTop = msgs.scrollHeight; }\n  function persist() { try { sessionStorage.setItem(\"lumi_history\", JSON.stringify(history.slice(-20))); } catch (e) {} }\n\n  function addBubble(who, text) {\n    var row = el(\"div\", { class: \"lumi-row \" + who });\n    if (who === \"bot\" && AVATAR) { var av = el(\"img\", { class: \"lumi-av\", src: AVATAR }); row.appendChild(av); }\n    var bub = el(\"div\", { class: \"lumi-bub\" });\n    bub.textContent = text || \"\";\n    row.appendChild(bub);\n    msgs.appendChild(row);\n    scroll();\n    return bub;\n  }\n  function botSay(text) { history.push({ role: \"assistant\", content: text }); persist(); return addBubble(\"bot\", text); }\n\n  function showTyping() {\n    var row = el(\"div\", { class: \"lumi-row bot\", id: \"lumi-typing\" });\n    if (AVATAR) row.appendChild(el(\"img\", { class: \"lumi-av\", src: AVATAR }));\n    var bub = el(\"div\", { class: \"lumi-bub\" });\n    bub.innerHTML = '<span class=\"lumi-dots\"><i></i><i></i><i></i></span>';\n    row.appendChild(bub);\n    msgs.appendChild(row);\n    scroll();\n    return row;\n  }\n\n  function sendText(text) {\n    text = (text || \"\").trim();\n    if (!text || sending) return;\n    markInteracted();\n    hideQuickActions();\n    toggleBtn.classList.remove(\"lumi-hidden\");\n    addBubble(\"user\", text);\n    history.push({ role: \"user\", content: text });\n    persist();\n    stream(text);\n  }\n  function send() { var t = input.value; input.value = \"\"; autoGrow(); sendText(t); }\n\n  function stream(text) {\n    sending = true; sendBtn.disabled = true;\n    var typing = showTyping();\n    var bub = null;            // becomes the streaming bot bubble on first text\n    var acc = \"\";\n\n    fetch(API, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ messages: history.filter(function (m) { return m.content; }).slice(-20) }),\n    }).then(function (resp) {\n      if (!resp.ok || !resp.body) throw new Error(\"bad response \" + resp.status);\n      var reader = resp.body.getReader();\n      var dec = new TextDecoder();\n      var buf = \"\";\n      function pump() {\n        return reader.read().then(function (r) {\n          if (r.done) { finish(); return; }\n          buf += dec.decode(r.value, { stream: true });\n          var parts = buf.split(\"\\n\\n\");\n          buf = parts.pop();\n          parts.forEach(function (p) {\n            var line = p.replace(/^data: /, \"\").trim();\n            if (!line) return;\n            var ev; try { ev = JSON.parse(line); } catch (e) { return; }\n            handleEvent(ev);\n          });\n          return pump();\n        });\n      }\n      function handleEvent(ev) {\n        if (ev.type === \"text\") {\n          if (typing) { typing.remove(); typing = null; }\n          if (!bub) bub = addBubble(\"bot\", \"\");\n          acc += ev.value; bub.textContent = acc; scroll();\n        } else if (ev.type === \"card\") {\n          if (typing) { typing.remove(); typing = null; }\n          renderCard(ev.value);\n          history.push({ role: \"assistant\", card: ev.value });\n          persist();\n        } else if (ev.type === \"error\") {\n          if (typing) { typing.remove(); typing = null; }\n          addBubble(\"bot\", ev.value);\n        }\n      }\n      function finish() {\n        if (typing) { typing.remove(); typing = null; }\n        if (bub && acc) bub.innerHTML = linkify(acc);\n        if (acc) { history.push({ role: \"assistant\", content: acc }); persist(); }\n        sending = false; sendBtn.disabled = false;\n        if (!isMobile()) input.focus();\n      }\n      return pump();\n    }).catch(function () {\n      if (typing) typing.remove();\n      addBubble(\"bot\", \"Sorry, I could not connect just now. Please try again.\");\n      sending = false; sendBtn.disabled = false;\n    });\n  }\n\n  // append card styles\n  var cardCss = document.createElement(\"style\");\n  cardCss.textContent =\n    \".lumi-card{background:#161616;border:1px solid #2a2a2a;border-radius:12px;padding:10px;display:flex;gap:10px;align-items:center;max-width:90%}\" +\n    \".lumi-card img{width:56px;height:56px;border-radius:8px;object-fit:cover;flex:0 0 56px}\" +\n    \".lumi-card .ttl{color:#fff;font-size:13px;font-weight:600}\" +\n    \".lumi-card .pr{color:#ff6b6b;font-size:13px}\" +\n    \".lumi-card .pr s{color:#888;margin-left:6px;font-weight:400}\" +\n    \".lumi-card .acts{display:flex;gap:6px;margin-top:6px}\" +\n    \".lumi-card button{background:#ff3b3b;border:none;color:#fff;border-radius:14px;padding:5px 10px;font-size:12px;cursor:pointer}\" +\n    \".lumi-card a{color:#bbb;font-size:12px;align-self:center;text-decoration:none}\";\n  document.head.appendChild(cardCss);\n\n  window.__lumiRenderCard = function (card, ctx) {\n    var row = document.createElement(\"div\");\n    row.className = \"lumi-row bot\";\n    if (ctx.AVATAR) { var av = document.createElement(\"img\"); av.className = \"lumi-av\"; av.src = ctx.AVATAR; row.appendChild(av); }\n    var c = document.createElement(\"div\");\n    c.className = \"lumi-card\";\n    var img = card.image ? '<img src=\"' + card.image + '\" alt=\"\">' : \"\";\n    var price = '<span class=\"pr\">' + (card.price || \"\") + (card.compareAt ? \" <s>\" + card.compareAt + \"</s>\" : \"\") + \"</span>\";\n    c.innerHTML = img +\n      '<div><div class=\"ttl\">' + esc(card.title) + \"</div>\" + price +\n      '<div class=\"acts\"><button class=\"lumi-add\">Add to cart</button>' +\n      '<a href=\"' + card.productUrl + '\">View</a></div></div>';\n    row.appendChild(c);\n    ctx.msgs.appendChild(row);\n    ctx.scroll();\n\n    c.querySelector(\".lumi-add\").addEventListener(\"click\", function () {\n      var btn = this; btn.disabled = true; btn.textContent = \"Adding...\";\n      assistantAdding = Date.now();\n      fetch(\"/cart/add.js\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ items: [{ id: Number(card.variantId), quantity: card.qty || 1 }] }),\n      }).then(function (r) {\n        if (!r.ok) throw new Error(\"add failed\");\n        btn.textContent = \"Added \u2713\";\n        refreshCartCount();\n        ctx.addBubble(\"bot\", \"Added to your cart. You can keep shopping or head to checkout.\");\n        var go = document.createElement(\"a\");\n        go.href = \"/cart\"; go.textContent = \"Go to cart\"; go.target = \"_top\";\n        go.style.cssText = \"display:inline-block;margin-top:4px;color:#ff6b6b;font-size:13px\";\n        ctx.msgs.lastChild.querySelector(\".lumi-bub\").appendChild(document.createElement(\"br\"));\n        ctx.msgs.lastChild.querySelector(\".lumi-bub\").appendChild(go);\n        ctx.scroll();\n      }).catch(function () {\n        btn.disabled = false; btn.textContent = \"Add to cart\";\n        ctx.addBubble(\"bot\", \"Sorry, I could not add that. Please try the product page.\");\n      });\n    });\n  };\n\n  function esc(s) { var d = document.createElement(\"div\"); d.textContent = s || \"\"; return d.innerHTML; }\n  function renderCard(card) { window.__lumiRenderCard(card, { msgs: msgs, addBubble: addBubble, scroll: scroll, AVATAR: AVATAR }); }\n\n  // Escape, then turn markdown links and bare URLs into clickable anchors.\n  function linkify(text) {\n    var html = esc(text);\n    html = html.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, function (m, label, url) {\n      return '<a href=\"' + url + '\" style=\"color:#ff6b6b;text-decoration:underline\">' + label + '</a>';\n    });\n    html = html.replace(/(^|[^\"'>=])(https?:\\/\\/[^\\s<]+)/g, function (m, pre, url) {\n      return pre + '<a href=\"' + url + '\" style=\"color:#ff6b6b;text-decoration:underline\">' + url + '</a>';\n    });\n    return html;\n  }\n\n  // Refresh the theme's header cart count after an add (so the trolley updates).\n  function refreshCartCount() {\n    fetch(\"/cart.js\", { headers: { Accept: \"application/json\" } })\n      .then(function (r) { return r.json(); })\n      .then(function (cart) {\n        var n = cart.item_count;\n        document.querySelectorAll(\".header__cart-count, [data-cart-count], .cart-count, .cart-count-bubble\").forEach(function (el) {\n          el.textContent = n;\n          el.setAttribute(\"data-cart-count\", n);\n          el.hidden = false;\n          el.style.display = \"\";\n          el.classList.remove(\"hidden\", \"is-empty\", \"count-is-empty\");\n        });\n        try { document.dispatchEvent(new CustomEvent(\"cart:refresh\", { bubbles: true })); } catch (e) {}\n        try { document.dispatchEvent(new CustomEvent(\"cart:updated\", { bubbles: true, detail: { cart: cart } })); } catch (e) {}\n      })\n      .catch(function () {});\n  }\n\n  // ============ Phase 1: proactive add-to-cart bundle upsell (rule-based, no GPT) ============\n  var assistantAdding = 0;      // timestamp of an assistant-card-initiated add\n  var internalCartOp = false;   // true while WE drive cart writes (upgrade) so the interceptor ignores them\n\n  // Approved single -> bundle upsell map (real Shopify handles + live bundle variant IDs).\n  // Mask+Neck, Portable Panel and Wrist Strap are intentionally UNMAPPED (no honest kit upsell exists).\n  var BUNDLE_MAP = {\n    \"lumovex-spectrum-pro-mask\": { bundleHandle: \"complete-face-kit\", bundleVariantId: 53724140339546,\n      message: \"Nice choice. If you're building a full facial routine, you may want to look at the Complete Face Kit. It includes the Face Mask + Sculpt Wand and saves \u00A310.99 compared with buying separately.\",\n      upgrade: \"Upgrade to Kit\", view: \"View Complete Face Kit\", keep: \"Keep Mask Only\" },\n    \"lumovex-sculpt-wand\": { bundleHandle: \"complete-face-kit\", bundleVariantId: 53724140339546,\n      message: \"The Sculpt Wand is great for targeted areas. Many customers pair it with the Face Mask for a fuller face routine. Want to see the Complete Face Kit?\",\n      upgrade: \"Upgrade to Kit\", view: \"View Complete Face Kit\", keep: \"Keep Wand Only\" },\n    \"lumovex-red-light-therapy-belt\": { bundleHandle: \"recovery-kit\", bundleVariantId: 53724137783642,\n      message: \"Want a fuller recovery setup? The Recovery Kit includes the Recovery Belt + Total Recovery Mat and saves \u00A321.99 versus buying separately.\",\n      upgrade: \"Upgrade to Kit\", view: \"View Recovery Kit\", keep: \"No Thanks\" },\n    \"lumovex-total-recovery-mat\": { bundleHandle: \"recovery-kit\", bundleVariantId: 53724137783642,\n      message: \"A lot of customers use the Recovery Mat with the Recovery Belt for more targeted recovery. The Recovery Kit includes both and saves \u00A321.99.\",\n      upgrade: \"Upgrade Basket\", view: \"View Recovery Kit\", keep: \"No Thanks\" },\n    \"lumovex-pro-panel-540\": { bundleHandle: \"home-clinic\", bundleVariantId: 53724139159898,\n      message: \"Building a fuller home red light setup? The Home Clinic bundle includes the Face Mask + Pro Panel 540 + Recovery Belt and saves \u00A354.98.\",\n      upgrade: \"Upgrade to Home Clinic\", view: \"View Home Clinic\", keep: \"No Thanks\" }\n  };\n\n  var pStyle = document.createElement(\"style\");\n  pStyle.textContent =\n    \"#lumi-proactive{position:fixed;right:20px;bottom:90px;z-index:2147483000;max-width:260px;background:#1a1a1a;color:#fff;border:1px solid #2a2a2a;border-radius:16px;padding:12px 14px;font-family:Inter,system-ui,sans-serif;font-size:13px;line-height:1.4;box-shadow:0 4px 18px rgba(0,0,0,.45);animation:lumiNudgeIn .4s ease;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}\" +\n    \"#lumi-proactive .lumi-pmsg{margin-bottom:8px}\" +\n    \"#lumi-proactive .lumi-pacts{display:flex;gap:8px;align-items:center}\" +\n    \"#lumi-proactive .lumi-pshow{display:inline-block;background:#ff3b3b;color:#fff;border-radius:14px;padding:7px 14px;font-size:12px;font-weight:600}\" +\n    \"#lumi-proactive .lumi-px{margin-left:auto;opacity:.6;font-size:18px;padding:2px 8px;touch-action:manipulation}\" +\n    \"@media (max-width:600px){#lumi-proactive{right:10px;left:10px;max-width:none;bottom:84px}}\";\n  document.head.appendChild(pStyle);\n\n  function ssGet(k) { try { return sessionStorage.getItem(k); } catch (e) { return null; } }\n  function ssSet(k, v) { try { sessionStorage.setItem(k, v); } catch (e) {} }\n  function sessionId() { var s = ssGet(\"lumi_session_id\"); if (!s) { s = \"lumi_\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 8); ssSet(\"lumi_session_id\", s); } return s; }\n  function markInteracted() { ssSet(\"lumi_interacted\", \"1\"); }\n\n  // central proactive gate\n  function canShowProactive(triggerKey) {\n    if (ssGet(\"lumi_proactive_dismissed\") === \"1\") return false;        // dismissal kills proactive for the session\n    var fired; try { fired = JSON.parse(ssGet(\"lumi_triggers_fired\") || \"[]\"); } catch (e) { fired = []; }\n    if (triggerKey && fired.indexOf(triggerKey) >= 0) return false;     // never repeat the same trigger\n    if (ssGet(\"lumi_proactive_shown\") === \"1\" && ssGet(\"lumi_interacted\") !== \"1\") return false; // one per session unless they interact\n    return true;\n  }\n  function recordShown(triggerKey) {\n    ssSet(\"lumi_proactive_shown\", \"1\");\n    ssSet(\"lumi_interacted\", \"0\");\n    var fired; try { fired = JSON.parse(ssGet(\"lumi_triggers_fired\") || \"[]\"); } catch (e) { fired = []; }\n    if (triggerKey && fired.indexOf(triggerKey) < 0) { fired.push(triggerKey); ssSet(\"lumi_triggers_fired\", JSON.stringify(fired)); }\n  }\n  function dismissProactive() { ssSet(\"lumi_proactive_dismissed\", \"1\"); }\n\n  function money(pence) { if (pence == null || pence === \"\") return \"\"; var n = Number(pence); if (!isFinite(n)) return \"\"; return \"\u00A3\" + (n / 100).toFixed(2); }\n  function fixImg(u) { if (!u) return \"\"; return u.indexOf(\"//\") === 0 ? \"https:\" + u : u; }\n  function getCart() { return fetch(\"/cart.js\", { headers: { Accept: \"application/json\" } }).then(function (r) { return r.json(); }).catch(function () { return null; }); }\n\n  // analytics scaffold: fires to dataLayer + Klaviyo + a DOM event (reporting wired later)\n  function lumiTrack(event, props) {\n    var p = { page_url: location.href, session_id: sessionId(), device_type: isMobile() ? \"mobile\" : \"desktop\", timestamp: new Date().toISOString() };\n    if (props) for (var k in props) p[k] = props[k];\n    try { (window.dataLayer = window.dataLayer || []).push(Object.assign({ event: \"lumi_\" + event }, p)); } catch (e) {}\n    try { if (window.klaviyo && window.klaviyo.push) window.klaviyo.push([\"track\", \"Lumi \" + event, p]); } catch (e) {}\n    try { document.dispatchEvent(new CustomEvent(\"lumi:track\", { detail: { event: event, props: p } })); } catch (e) {}\n    try { if (window.console && console.debug) console.debug(\"[Lumi]\", event, p); } catch (e) {}\n  }\n\n  // ---- cart-add interception (theme-agnostic: fetch + XHR), debounced ----\n  function matchesCartAdd(url) { return /\\/cart\\/add(\\.js)?(\\?|$)/.test(url || \"\"); }\n  var pendingAdd = null, addTimer = null;\n  function onCartAdd(data) {\n    if (internalCartOp) return;                          // ignore our own upgrade-driven cart writes\n    var items = [];\n    if (data && Array.isArray(data.items)) items = data.items;\n    else if (data && (data.id || data.variant_id || data.handle)) items = [data];\n    if (!items.length) return;\n    var primary = null;\n    for (var i = 0; i < items.length; i++) { if (items[i] && items[i].handle && BUNDLE_MAP[items[i].handle]) { primary = items[i]; break; } }\n    if (!primary) primary = items[0];\n    pendingAdd = { item: primary, fromAssistant: (Date.now() - assistantAdding < 4000) };\n    if (addTimer) clearTimeout(addTimer);\n    addTimer = setTimeout(processPendingAdd, 800);       // debounce rapid cart updates\n  }\n  function processPendingAdd() {\n    var rec = pendingAdd; pendingAdd = null;\n    if (!rec || !rec.item) return;\n    var it = rec.item, handle = it.handle, variantId = it.variant_id || it.id;\n    if (rec.fromAssistant) {\n      lumiTrack(\"add_to_cart_from_assistant\", { trigger_type: \"assistant_card\", original_product_handle: handle, original_variant_id: variantId });\n      return;                                            // already engaged in the assistant; no proactive prompt\n    }\n    var map = handle ? BUNDLE_MAP[handle] : null;\n    if (!map) return;                                    // unmapped product -> do nothing\n    var triggerKey = \"addtocart:\" + handle;\n    if (!canShowProactive(triggerKey)) return;\n    triggerUpsell({ handle: handle, variantId: variantId, productId: it.product_id, map: map, triggerKey: triggerKey });\n  }\n  function installCartIntercept() {\n    var of = window.fetch;\n    if (of && !of.__lumiWrapped) {\n      var wf = function (input) {\n        var url = (typeof input === \"string\") ? input : (input && input.url) || \"\";\n        var pr = of.apply(this, arguments);\n        if (matchesCartAdd(url)) { pr.then(function (res) { try { res.clone().json().then(onCartAdd).catch(function () {}); } catch (e) {} }).catch(function () {}); }\n        return pr;\n      };\n      wf.__lumiWrapped = true; window.fetch = wf;\n    }\n    var XO = window.XMLHttpRequest;\n    if (XO && XO.prototype && !XO.prototype.__lumiWrapped) {\n      var oOpen = XO.prototype.open, oSend = XO.prototype.send;\n      XO.prototype.open = function (m, url) { this.__lumiUrl = url; return oOpen.apply(this, arguments); };\n      XO.prototype.send = function () {\n        var xhr = this;\n        if (matchesCartAdd(xhr.__lumiUrl)) { xhr.addEventListener(\"load\", function () { try { onCartAdd(JSON.parse(xhr.responseText)); } catch (e) {} }); }\n        return oSend.apply(this, arguments);\n      };\n      XO.prototype.__lumiWrapped = true;\n    }\n  }\n\n  // ---- upsell rendering ----\n  function triggerUpsell(u) {\n    Promise.all([\n      fetch(\"/products/\" + u.map.bundleHandle + \".js\").then(function (r) { return r.json(); }).catch(function () { return null; }),\n      getCart()\n    ]).then(function (res) {\n      var prod = res[0], cart = res[1];\n      if (!prod) return;                                 // can't build the card -> bail quietly\n      var v = (prod.variants && prod.variants[0]) || {};\n      var card = {\n        title: prod.title, price: money(v.price),\n        compareAt: v.compare_at_price ? money(v.compare_at_price) : \"\",\n        image: fixImg(prod.featured_image || (prod.images && prod.images[0]) || \"\"),\n        productUrl: \"/products/\" + prod.handle, variantId: (v.id || u.map.bundleVariantId)\n      };\n      recordShown(u.triggerKey);\n      lumiTrack(\"proactive_bundle_upsell_shown\", {\n        trigger_type: \"add_to_cart\", original_product_handle: u.handle, original_variant_id: u.variantId,\n        recommended_bundle_handle: u.map.bundleHandle, recommended_bundle_variant_id: u.map.bundleVariantId,\n        cart_value: cart ? money(cart.total_price) : \"\"\n      });\n      var upsell = { origHandle: u.handle, origVariantId: u.variantId, map: u.map, card: card };\n      if (isMobile()) showProactiveBubble(upsell);       // mobile: bubble first\n      else openPanelToUpsell(upsell);                    // desktop: strong intent -> open the panel directly\n    }).catch(function () {});\n  }\n\n  function showProactiveBubble(upsell) {\n    removeProactiveBubble();\n    try { nudge.classList.add(\"lumi-hidden\"); } catch (e) {}\n    var b = el(\"div\", { id: \"lumi-proactive\", role: \"button\", tabindex: \"0\" });\n    b.innerHTML = '<div class=\"lumi-pmsg\">Nice pick. Want to see a bundle that saves you money?</div>' +\n      '<div class=\"lumi-pacts\"><span class=\"lumi-pshow\">Show me</span><span class=\"lumi-px\" aria-label=\"Dismiss\">&times;</span></div>';\n    document.body.appendChild(b);\n    var opened = false;\n    // The WHOLE bubble opens the upsell (big tap target). The X stops propagation and dismisses.\n    function openIt(e) { if (e) { e.preventDefault(); e.stopPropagation(); } if (opened) return; opened = true; markInteracted(); removeProactiveBubble(); openPanelToUpsell(upsell); }\n    function dismissIt(e) { if (e) { e.preventDefault(); e.stopPropagation(); } removeProactiveBubble(); dismissProactive(); updateNudge(); lumiTrack(\"proactive_bundle_upsell_dismissed\", { trigger_type: \"add_to_cart\", source: \"bubble\", recommended_bundle_handle: upsell.map.bundleHandle }); }\n    b.addEventListener(\"click\", openIt);\n    b.querySelector(\".lumi-px\").addEventListener(\"click\", dismissIt);\n  }\n  function removeProactiveBubble() { var x = document.getElementById(\"lumi-proactive\"); if (x) x.remove(); }\n\n  function openPanelToUpsell(upsell) {\n    removeProactiveBubble();\n    suppressGreetingOnce = true;\n    openPanel();\n    botSay(upsell.map.message);\n    renderCard(upsell.card);\n    history.push({ role: \"assistant\", card: upsell.card }); persist();\n    renderUpsellButtons(upsell);\n  }\n\n  function renderUpsellButtons(upsell) {\n    removeUpsellButtons();\n    var row = el(\"div\", { class: \"lumi-qa\", id: \"lumi-upsell-acts\" });\n    var defs = [\n      { label: upsell.map.upgrade, act: function () { doUpgrade(upsell); } },\n      { label: upsell.map.view, act: function () {\n          lumiTrack(\"proactive_bundle_upsell_view_clicked\", { trigger_type: \"add_to_cart\", recommended_bundle_handle: upsell.map.bundleHandle, recommended_bundle_variant_id: upsell.map.bundleVariantId });\n          location.href = upsell.card.productUrl;\n        } },\n      { label: upsell.map.keep, act: function () {\n          removeUpsellButtons(); dismissProactive();\n          lumiTrack(\"proactive_bundle_upsell_dismissed\", { trigger_type: \"add_to_cart\", source: \"keep\", recommended_bundle_handle: upsell.map.bundleHandle });\n          botSay(\"No problem - I'll leave your cart as it is. Shout if you need help choosing.\");\n        } }\n    ];\n    defs.forEach(function (d) {\n      var btn = document.createElement(\"button\");\n      btn.textContent = d.label;\n      btn.addEventListener(\"click\", function () { markInteracted(); d.act(); });\n      row.appendChild(btn);\n    });\n    msgs.appendChild(row); scroll();\n  }\n  function removeUpsellButtons() { var x = document.getElementById(\"lumi-upsell-acts\"); if (x) x.remove(); }\n\n  function appendCartLink() {\n    var bub = msgs.querySelector(\".lumi-row.bot:last-child .lumi-bub\"); if (!bub) return;\n    var go = document.createElement(\"a\"); go.href = \"/cart\"; go.textContent = \"Go to cart\"; go.target = \"_top\";\n    go.style.cssText = \"display:inline-block;margin-top:4px;color:#ff6b6b;font-size:13px\";\n    bub.appendChild(document.createElement(\"br\")); bub.appendChild(go); scroll();\n  }\n\n  // Upgrade: add the bundle (duplicate-guarded), remove the single line via /cart/change.js, fallback if removal isn't confirmed.\n  function doUpgrade(upsell) {\n    removeUpsellButtons();\n    lumiTrack(\"proactive_bundle_upsell_upgrade_clicked\", {\n      trigger_type: \"add_to_cart\", original_product_handle: upsell.origHandle, original_variant_id: upsell.origVariantId,\n      recommended_bundle_handle: upsell.map.bundleHandle, recommended_bundle_variant_id: upsell.map.bundleVariantId\n    });\n    var working = addBubble(\"bot\", \"Updating your cart...\");\n    var bundleVid = Number(upsell.card.variantId || upsell.map.bundleVariantId);\n    internalCartOp = true;\n    getCart().then(function (cart) {\n      var bundleInCart = cart && cart.items && cart.items.some(function (li) { return Number(li.variant_id) === bundleVid; });\n      var addP = bundleInCart ? Promise.resolve(true)\n        : fetch(\"/cart/add.js\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ items: [{ id: bundleVid, quantity: 1 }] }) }).then(function (r) { return r.ok; });\n      return addP.then(function (added) {\n        if (!added) throw new Error(\"add-failed\");\n        return getCart().then(function (c2) {\n          var line = c2 && c2.items && c2.items.filter(function (li) { return Number(li.variant_id) === Number(upsell.origVariantId); })[0];\n          if (!line) return { removed: true };           // single already gone -> treat as clean\n          return fetch(\"/cart/change.js\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ id: line.key, quantity: 0 }) })\n            .then(function (r) { return r.ok ? r.json() : null; })\n            .then(function (c3) {\n              var still = c3 && c3.items && c3.items.some(function (li) { return Number(li.variant_id) === Number(upsell.origVariantId); });\n              return { removed: !!c3 && !still };\n            });\n        });\n      });\n    }).then(function (result) {\n      internalCartOp = false;\n      try { fetch(\"/cart/update.js\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ attributes: { lumi_assist: \"addtocart_\" + upsell.origHandle + \"_to_\" + upsell.map.bundleHandle } }) }); } catch (e) {}\n      refreshCartCount();\n      working.remove();\n      if (result && result.removed) {\n        botSay(\"Done. I've swapped that into the \" + upsell.card.title + \" for you.\");\n        appendCartLink();\n        lumiTrack(\"proactive_bundle_upsell_upgrade_success\", { trigger_type: \"add_to_cart\", original_product_handle: upsell.origHandle, recommended_bundle_handle: upsell.map.bundleHandle });\n      } else {\n        botSay(\"I've added the \" + upsell.card.title + \" to your cart. You may want to remove the single product before checkout.\");\n        appendCartLink();\n        lumiTrack(\"proactive_bundle_upsell_upgrade_failed\", { trigger_type: \"add_to_cart\", reason: \"removal_unconfirmed\", original_product_handle: upsell.origHandle, recommended_bundle_handle: upsell.map.bundleHandle });\n      }\n    }).catch(function () {\n      internalCartOp = false;\n      working.remove();\n      botSay(\"Sorry, I couldn't update your cart automatically. Please try from the cart page.\");\n      lumiTrack(\"proactive_bundle_upsell_upgrade_failed\", { trigger_type: \"add_to_cart\", reason: \"add_failed\", original_product_handle: upsell.origHandle, recommended_bundle_handle: upsell.map.bundleHandle });\n    });\n  }\n\n  installCartIntercept();\n  sessionRestore();\n})();\n"],
  "mappings": "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",
  "names": ["el", "input"]
}
