{
  "version": 3,
  "sources": ["/cdn/shop/t/1064/assets/ai-search.js?auto=format%2Ccompress"],
  "sourcesContent": ["/* ai-search.js \u2014 AI search host bridge + seamless sizing for Ninja Transfers\n   (gated by settings.enable_ai_search). Loaded ONLY by sections/main-search.liquid\n   inside the ON branch \u2014 i.e. only on the /search page where the AI surface iframe\n   actually mounts. OFF ships zero bytes and native search is 100% untouched.\n\n   Header search is NOT touched by this file. The three header search forms submit\n   natively (GET \u2192 /search?q=<term>); when the setting is ON, /search renders the\n   AI surface in-page via main-search.liquid. No overlay, no submit intercept \u2014\n   header search is a normal full-page navigation.\n\n   Two jobs, both scoped to the in-page /search iframe (iframe.ai-search-page-frame):\n   1) HOST / CART BRIDGE \u2014 the standalone AI surface has no visitor identity and no\n      cart, so add-to-cart there would hit an email gate. This is the parent/host\n      side of the Shinobi postMessage contract (the same role\n      printflyone.com/livechat/loader.js plays for the chat widget): answer the\n      iframe's `hello` with canAddToCart + the logged-in customer identity\n      (window.ShinobiChat), serve `get-cart` from /cart.js, and fulfil `add-to-cart`\n      against Shopify's /cart/add.js so items land in the REAL cart and cart state\n      flows back.\n   2) SEAMLESS SIZING \u2014 the surface's shinobi-search protocol drives the iframe's\n      size so it embeds without a nested scrollbar (auto = content height, page\n      scrolls; viewport = AI Mode fills the screen below the header). One\n      window-level `message` listener serves both protocols. */\n(function () {\n  \"use strict\";\n  if (window.__aiSearch) return;\n  window.__aiSearch = true;\n\n  var SURFACE_ORIGIN = \"https://main.dswnj5q837rc8.amplifyapp.com\";\n\n  /* ---------- one-time styles (self-injected; unique ids so Yottaa /\n     CDN-layer optimizers can't match + collapse them) ---------- */\n  function injectStyles() {\n    if (document.getElementById(\"nt-ai-search-style\")) return;\n    var s = document.createElement(\"style\");\n    s.id = \"nt-ai-search-style\";\n    /* seamless embed (in-page /search mount): auto mode grows the iframe to\n       content height and the PAGE scrolls (transition = smooth-ish); viewport\n       mode (AI Mode) pins the iframe below the sticky header to the screen\n       bottom (inline `top` set from stickyTopInset) and locks page scroll so\n       the surface's sticky follow-up bar sits at the bottom of the screen. */\n    s.textContent =\n      \".ai-search-page-frame{transition:min-height .12s ease-out,height .12s ease-out;}\" +\n      \".ai-search-page-frame.nt-ai-vp{position:fixed !important;left:0;right:0;width:100% !important;z-index:900;transition:none;}\" +\n      \"html.nt-ai-vp-lock,html.nt-ai-vp-lock body{overflow:hidden !important;}\";\n    document.head.appendChild(s);\n  }\n\n  /* ---------- host / cart bridge (parent side of the Shinobi contract) ----------\n     Serves the /search-page AI surface iframe. Only trusts messages from the\n     surface origin. */\n  function reply(win, msg) {\n    if (win && typeof win.postMessage === \"function\") win.postMessage(msg, SURFACE_ORIGIN);\n  }\n\n  function pushCartState(win) {\n    fetch(\"/cart.js\", { headers: { Accept: \"application/json\" }, credentials: \"same-origin\" })\n      .then(function (r) { return r.ok ? r.json() : null; })\n      .then(function (cart) {\n        if (!cart) return;\n        reply(win, {\n          source: \"shinobi-host\",\n          type: \"cart-state\",\n          itemCount: cart.item_count || 0,\n          total: (cart.total_price || 0) / 100,\n        });\n      })\n      .catch(function () { /* transient \u2014 surface keeps its last snapshot */ });\n  }\n\n  function addToCart(win, rid, items) {\n    var lines = (items || [])\n      .map(function (it) {\n        if (!it || it.id == null) return null;\n        var line = { id: it.id, quantity: it.quantity || 1 };\n        if (it.properties && typeof it.properties === \"object\") line.properties = it.properties;\n        return line;\n      })\n      .filter(Boolean);\n    if (!lines.length) {\n      reply(win, { source: \"shinobi-host\", type: \"cart-added\", rid: rid, ok: false, error: \"No items\" });\n      return;\n    }\n    fetch(\"/cart/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n      credentials: \"same-origin\",\n      body: JSON.stringify({ items: lines }),\n    })\n      .then(function (r) { return r.json().then(function (b) { return { ok: r.ok, body: b }; }); })\n      .then(function (res) {\n        if (res.ok) {\n          var count = Array.isArray(res.body && res.body.items) ? res.body.items.length : lines.length;\n          reply(win, { source: \"shinobi-host\", type: \"cart-added\", rid: rid, ok: true, count: count });\n          pushCartState(win); // refresh the surface's cart badge\n        } else {\n          var msg = (res.body && (res.body.description || res.body.message)) || \"Add to cart failed\";\n          reply(win, { source: \"shinobi-host\", type: \"cart-added\", rid: rid, ok: false, error: msg });\n        }\n      })\n      .catch(function () {\n        reply(win, { source: \"shinobi-host\", type: \"cart-added\", rid: rid, ok: false, error: \"Network error\" });\n      });\n  }\n\n  /* ---------- seamless embed: sizing / scroll host (shinobi-search) ----------\n     Paired with the surface's shinobi-search protocol (ninjaforce /p/search).\n     Handshake: the surface posts {source:\"shinobi-search\",type:\"ready\"} on\n     mount and we reply {source:\"shinobi-search-host\",type:\"host-ready\"} \u2014 the\n     surface only flips OUT of its self-contained (own-scroll) layout into\n     seamless mode after that ack, so a non-cooperating host never clips it.\n\n     auto (All tab): iframe height = posted content height, page scrolls, body\n     unlocked. viewport (AI Mode): iframe fixed below the sticky header to the\n     screen bottom + body scroll locked. This is additive to the cart bridge\n     above \u2014 both share the one window `message` listener. */\n  function pageFrameFor(win) {\n    var fs = document.querySelectorAll(\"iframe.ai-search-page-frame\");\n    for (var i = 0; i < fs.length; i++) {\n      if (fs[i].contentWindow === win) return fs[i];\n    }\n    return null;\n  }\n\n  // Bottom edge (in viewport px) of the top-docked site chrome (header + any\n  // sticky announcement bar), so AI Mode fills the viewport *below the header*.\n  // applyViewport scrolls to top first, so the header \u2014 whether sticky or\n  // relative (measured `position:relative`, bottom ~206 on this store) \u2014 sits at\n  // the top and its full height counts. Takes the lowest bottom among candidates\n  // that start near the top and aren't more than ~60% of the viewport tall.\n  // Falls back to 0 (full viewport) when nothing matches.\n  function stickyTopInset() {\n    var cands = [\"#site-header\", \"main-header\", \".mount-announcement-bar\"];\n    var bottom = 0;\n    for (var i = 0; i < cands.length; i++) {\n      var el = document.querySelector(cands[i]);\n      if (!el) continue;\n      var r = el.getBoundingClientRect();\n      if (r.top <= 60 && r.bottom > bottom && r.bottom < window.innerHeight * 0.6) bottom = r.bottom;\n    }\n    return Math.max(0, Math.round(bottom));\n  }\n\n  var vpFrame = null; // the page frame currently holding viewport mode (body lock)\n\n  function lockPageScroll() {\n    document.documentElement.classList.add(\"nt-ai-vp-lock\");\n  }\n  function unlockPageScroll() {\n    document.documentElement.classList.remove(\"nt-ai-vp-lock\");\n  }\n\n  // Set the iframe's rendered height. The storefront runs Yottaa \"smart-sizing\",\n  // which pins an iframe's `height` property \u2014 an author `height` (even inline\n  // `!important`) is overridden and the frame stays at its first-measured size.\n  // `min-height` is NOT clamped by Yottaa and wins the used-height resolution, so\n  // we drive the size with `min-height !important` (verified in-browser on the\n  // Yottaa-optimized storefront: `min-height:1500px` rendered 1500 while\n  // `height:1500px !important` rendered 563). `height` is set too so the frame\n  // is exact when Yottaa is absent (harness) and can shrink back.\n  function setFrameHeight(frame, px) {\n    frame.style.setProperty(\"height\", px + \"px\", \"important\");\n    frame.style.setProperty(\"min-height\", px + \"px\", \"important\");\n  }\n\n  function applyAuto(frame, height) {\n    if (frame === vpFrame) { vpFrame = null; unlockPageScroll(); }\n    frame.classList.remove(\"nt-ai-vp\");\n    frame.style.top = \"\";\n    if (typeof height === \"number\" && isFinite(height) && height > 0) {\n      // clamp to a sane range; only rewrite when it actually moved (no feedback loop)\n      var h = Math.min(Math.max(Math.round(height), 200), 20000);\n      var cur = parseInt(frame.style.minHeight, 10) || 0;\n      if (Math.abs(cur - h) > 1) setFrameHeight(frame, h);\n    }\n  }\n\n  function viewportFillHeight() {\n    return Math.max(320, window.innerHeight - stickyTopInset());\n  }\n\n  function applyViewport(frame) {\n    // Pin to top so the (relative) site header stays visible and the inset is\n    // deterministic, THEN measure + lock.\n    window.scrollTo(0, 0);\n    frame.classList.add(\"nt-ai-vp\");\n    frame.style.top = stickyTopInset() + \"px\";\n    setFrameHeight(frame, viewportFillHeight()); // min-height beats Yottaa's height clamp here too\n    vpFrame = frame;\n    lockPageScroll();\n  }\n\n  // Open the theme's native blanks quick-buy modal (GRT global singleton) for a\n  // product handle. The surface's product cards post a `quick-view` message\n  // instead of rendering their own in-iframe builder; we translate it into the\n  // modal's documented open event. The modal + its JS/CSS are rendered on this\n  // /search page by sections/main-search.liquid (ON branch). It opens via\n  // <dialog>.showModal() on the PARENT page, so it sits above the iframe (top\n  // layer) and is correctly positioned regardless of the iframe's coordinates.\n  /* CURRENT collection-card quick-buy (2026-07-08): fetch the per-product\n     dialog (?view=bh_qb_modal \u2014 bh-quick-buy.liquid verbatim), inject it into\n     the parent page, and open it through the COLLECTION flow (a synthetic\n     .grt-qv-btn click, so bh-quick-buy-assets' delegated handler owns the\n     whole lifecycle: is-opening state, parent-child color init,\n     buildSizeQtyGrid, bindDialogClose, scroll lock/unlock).\n\n     Lifecycle across repeated opens:\n      - one dialog per handle, cached + reused (no re-fetch, no duplicates \u2014\n        ids are product-scoped bh-modal-<id>);\n      - any OTHER open grt-product-modal is closed first (never two open;\n        closing syncs the scroll lock via the assets' close handler);\n      - in-flight guard drops double-clicks while a fetch is pending;\n      - FAIL SOFT: any fetch/parse error navigates to the PDP instead.\n     The GRT singleton path below (openNativeQuickBuy) is KEPT one release as\n     the emergency fallback \u2014 repoint the quick-view branch to revert. */\n  var bhQbDialogs = {}; // handle -> injected <dialog>\n  var bhQbPending = false;\n  function bhQbOpenDialog(dlg) {\n    var open = document.querySelector(\"dialog.grt-product-modal[open]\");\n    if (open && open !== dlg && open.close) open.close();\n    var btn = document.createElement(\"button\");\n    btn.type = \"button\";\n    btn.className = \"grt-qv-btn\";\n    btn.setAttribute(\"data-open-modal\", dlg.id);\n    btn.style.display = \"none\";\n    document.body.appendChild(btn);\n    btn.click(); // routes through the collection open flow (delegated handler)\n    btn.remove();\n  }\n  function openCollectionQuickBuy(handle) {\n    var h = String(handle || \"\").trim();\n    if (!h || bhQbPending) return;\n    var cached = bhQbDialogs[h];\n    if (cached && document.body.contains(cached)) {\n      bhQbOpenDialog(cached);\n      return;\n    }\n    bhQbPending = true;\n    fetch(\"/products/\" + encodeURIComponent(h) + \"?view=bh_qb_modal\", { credentials: \"same-origin\" })\n      .then(function (r) {\n        if (!r.ok) throw new Error(\"bh_qb_modal \" + r.status);\n        return r.text();\n      })\n      .then(function (html) {\n        var host = document.createElement(\"div\");\n        host.innerHTML = html;\n        var dlg = host.querySelector(\"dialog.grt-product-modal\");\n        if (!dlg) throw new Error(\"bh_qb_modal: no dialog in response\");\n        document.body.appendChild(dlg);\n        bhQbDialogs[h] = dlg;\n        bhQbPending = false;\n        bhQbOpenDialog(dlg);\n      })\n      .catch(function () {\n        bhQbPending = false;\n        window.location.href = \"/products/\" + encodeURIComponent(h);\n      });\n  }\n\n  function openNativeQuickBuy(handle, color, variantId) {\n    var h = String(handle || \"\").trim();\n    if (!h) return;\n    var detail = { handle: h };\n    if (color) detail.initialColorName = String(color).trim();\n    if (variantId != null && variantId !== \"\") detail.variantId = String(variantId).trim();\n    document.dispatchEvent(new CustomEvent(\"grt-global-quick-buy:open\", { detail: detail }));\n  }\n\n  // Open-redirect guard for the surface's `navigate` message (GA4 attribution\n  // fix): the AI-search cards no longer break out of the iframe with\n  // target=\"_top\" (which stamped the amplify origin as the referrer) \u2014 they post\n  // the destination here so the PARENT navigates from its own context (referrer =\n  // storefront). We only honor a same-store relative path or an absolute URL on\n  // THIS store's domain \u2014 never a foreign origin. (Cross-store patch links open\n  // in a NEW tab on the surface via target=\"_blank\" \u2014 Brian's call \u2014 so they\n  // never reach this same-tab handler.)\n  function safeNavUrl(raw) {\n    var u = String(raw == null ? \"\" : raw).trim();\n    if (!u) return null;\n    // Relative same-store path (reject protocol-relative \"//evil.com\").\n    if (u.charAt(0) === \"/\" && u.charAt(1) !== \"/\") return u;\n    try {\n      var url = new URL(u);\n      if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null;\n      if (url.hostname.replace(/^www\\./, \"\") === \"ninjatransfers.com\") return url.href;\n    } catch (err) {\n      /* not a parseable URL \u2192 reject */\n    }\n    return null;\n  }\n\n  // Keep the viewport-mode inset + fill height correct across header collapse /\n  // rotate / resize.\n  window.addEventListener(\"resize\", function () {\n    if (vpFrame && vpFrame.classList.contains(\"nt-ai-vp\")) {\n      vpFrame.style.top = stickyTopInset() + \"px\";\n      setFrameHeight(vpFrame, viewportFillHeight());\n    }\n  });\n\n  window.addEventListener(\"message\", function (e) {\n    if (e.origin !== SURFACE_ORIGIN) return;\n    var d = e.data;\n    if (!d) return;\n\n    // Seamless sizing/scroll protocol \u2014 in-page mount only.\n    if (d.source === \"shinobi-search\") {\n      // Quick-view: open the native parent-page modal for a product handle.\n      // Handled before the frame gate \u2014 it needs no iframe reference, only the\n      // handle, and the origin check above already scopes it to the surface.\n      if (d.type === \"quick-view\") {\n        openCollectionQuickBuy(d.handle);\n        return;\n      }\n      // Card navigation (GA4 attribution fix): the surface posts the destination\n      // instead of a target=\"_top\" breakout, so WE navigate from the storefront's\n      // own context (referrer = storefront, not the amplify iframe). Origin-gated\n      // above; URL validated here (open-redirect guard). Like quick-view, needs\n      // no iframe reference, so it's handled before the frame gate.\n      if (d.type === \"navigate\") {\n        var nav = safeNavUrl(d.url);\n        if (nav) window.location.href = nav;\n        return;\n      }\n      var pf = pageFrameFor(e.source);\n      if (!pf) return;\n      if (d.type === \"ready\") {\n        reply(e.source, { source: \"shinobi-search-host\", type: \"host-ready\" });\n      } else if (d.type === \"scrollmode\") {\n        if (d.mode === \"viewport\") applyViewport(pf);\n        else applyAuto(pf);\n      } else if (d.type === \"resize\") {\n        applyAuto(pf, d.height);\n      }\n      return;\n    }\n\n    if (d.source !== \"shinobi-widget\") return;\n    if (d.type === \"hello\") {\n      var id = window.ShinobiChat || {};\n      reply(e.source, {\n        source: \"shinobi-host\",\n        type: \"host\",\n        canAddToCart: true, // this store can add to the real cart (below) \u2192 no email gate\n        tokens: false,\n        // identity for order context (surface uses when it supports it; harmless otherwise)\n        email: id.email || undefined,\n        sid: id.sid != null ? id.sid : undefined,\n        name: id.name || undefined,\n      });\n      pushCartState(e.source);\n    } else if (d.type === \"get-cart\") {\n      pushCartState(e.source);\n    } else if (d.type === \"add-to-cart\" && typeof d.rid === \"string\") {\n      addToCart(e.source, d.rid, d.items);\n    }\n  });\n\n  injectStyles();\n})();\n"],
  "mappings": "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",
  "names": []
}
