{
  "version": 3,
  "sources": ["/cdn/shop/t/16/assets/ai-search-session.js?verify=1779766200"],
  "sourcesContent": ["/* ================================================================\n   AI Search \u2014 Niimbot SG\n   Session-aware release asset to avoid stale storefront compiled assets.\n   Drives the Search \u2194 Ask AI mode toggle, AI conversation,\n   product recommendations and the results-page AI summary.\n\n   Configuration:\n     window.AI_SEARCH_ENDPOINT          \u2014 POST URL of your secure AI proxy.\n     window.AI_SEARCH_PROVIDER_BASE_URL \u2014 OpenAI-compatible provider base URL.\n     window.AI_SEARCH_MODEL             \u2014 Provider model identifier.\n     window.AI_SEARCH_STORE             \u2014 Optional store name shown in replies.\n     window.AI_SEARCH_DEBUG             \u2014 Set false to silence diagnostic logs.\n   If the endpoint is not set, falls back to a mock response that uses\n   live predictive-search products so the UI still demos correctly.\n   ================================================================ */\n\n(function () {\n  'use strict';\n\n  var STORE_NAME = window.AI_SEARCH_STORE || 'labelcraft AI';\n  var ENDPOINT = window.AI_SEARCH_ENDPOINT || null;\n  var PROVIDER_BASE_URL = window.AI_SEARCH_PROVIDER_BASE_URL || '';\n  var PROVIDER_MODEL = window.AI_SEARCH_MODEL || '';\n  var DEBUG = window.AI_SEARCH_DEBUG !== false;\n  var MODE_KEY = 'sr-mode';\n  var SUMMARY_KEY = 'sr-ai-summary-dismissed';\n  var recommendedCombinations = {};\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Utilities\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function esc(s) {\n    return String(s == null ? '' : s)\n      .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n  }\n\n  function fmtMoney(cents) {\n    if (typeof cents !== 'number' || isNaN(cents)) return '';\n    var v = (cents / 100).toFixed(2).replace(/\\.00$/, '');\n    return 'S$' + v;\n  }\n\n  // Shopify's /search/suggest.json returns price as a formatted string like\n  // \"$31.00\". Convert any incoming price (number or string) to a numeric\n  // cents value so totals/subtractions don't end up as NaN.\n  function priceToCents(p) {\n    if (typeof p === 'number' && !isNaN(p)) return p;\n    if (typeof p !== 'string') return 0;\n    var n = parseFloat(p.replace(/[^0-9.]/g, ''));\n    if (isNaN(n)) return 0;\n    return Math.round(n * 100);\n  }\n\n  function getCard() {\n    return document.querySelector('[data-sr-card]');\n  }\n\n  function dbg() {\n    if (!DEBUG || !window.console || !console.log) return;\n    var args = Array.prototype.slice.call(arguments);\n    args.unshift('[AI Search][Debug]');\n    console.log.apply(console, args);\n  }\n\n  function noteFallback(reason, meta) {\n    var detail = {\n      reason: reason,\n      meta: meta || {},\n      at: new Date().toISOString()\n    };\n    window.__AI_SEARCH_LAST_FALLBACK__ = detail;\n    dbg('Fallback -> mock:', detail);\n  }\n\n  function getInput() {\n    return document.querySelector('#sr-overlay [data-sr-input]');\n  }\n\n  function clearAIComposer() {\n    var input = getInput();\n    if (!input) return;\n    input.value = '';\n    input.dispatchEvent(new Event('input', { bubbles: true }));\n    if (input.setSelectionRange) input.setSelectionRange(0, 0);\n  }\n\n  function openOverlay() {\n    var overlay = document.getElementById('sr-overlay');\n    if (!overlay) return;\n    if (!overlay.classList.contains('is-open')) {\n      overlay.style.display = 'flex';\n      overlay.classList.add('is-open');\n      overlay.removeAttribute('aria-hidden');\n      document.body.classList.add('sr-overlay-open');\n    }\n  }\n\n  function closeOverlayForCart() {\n    var overlay = document.getElementById('sr-overlay');\n    if (!overlay) return;\n    overlay.classList.remove('is-open');\n    overlay.setAttribute('aria-hidden', 'true');\n    overlay.style.display = '';\n    document.body.classList.remove('sr-overlay-open');\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Mode toggle (Search \u2194 Ask AI)\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function readMode() {\n    try { return localStorage.getItem(MODE_KEY) || 'search'; }\n    catch (_) { return 'search'; }\n  }\n\n  function writeMode(m) {\n    try { localStorage.setItem(MODE_KEY, m); } catch (_) {}\n  }\n\n  function applyMode(mode) {\n    var card = getCard();\n    if (!card) return;\n    card.dataset.mode = mode;\n\n    document.querySelectorAll('[data-sr-mode]').forEach(function (btn) {\n      btn.setAttribute('aria-pressed', btn.dataset.srMode === mode ? 'true' : 'false');\n    });\n\n    var input = getInput();\n    if (input) {\n      input.placeholder = mode === 'ai'\n        ? 'Describe what you want to label, organize, or gift\u2026'\n        : 'Search products, templates, guides\u2026';\n    }\n\n    // Swap the header icon (search \u2194 sparkle)\n    var hdrIcon = card.querySelector('[data-sr-header-icon]');\n    if (hdrIcon) {\n      hdrIcon.innerHTML = mode === 'ai'\n        ? '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275Z\"/></svg>'\n        : '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/></svg>';\n    }\n  }\n\n  function switchMode(mode) {\n    writeMode(mode);\n    applyMode(mode);\n\n    // When switching to AI, refocus + clear predictive open state if any\n    if (mode === 'ai') {\n      var ps = document.querySelector('#sr-overlay predictive-search');\n      if (ps) {\n        ps.removeAttribute('open');\n        ps.removeAttribute('loading');\n      }\n    }\n    var input = getInput();\n    if (input) {\n      try { input.focus(); } catch (_) {}\n    }\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     AI request \u2014 calls configured endpoint, falls back to mock\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  // Cached catalog snapshot \u2014 /products.json is the same response for every\n  // shopper, so fetching it once per page-load is enough.\n  var catalogCache = null;\n  var catalogPromise = null;\n\n  function normalizeProductVariant(v) {\n    var image = v && v.featured_image;\n    return {\n      id: v.id,\n      title: v.title || 'Default Title',\n      available: !!v.available,\n      price: v.price || '',\n      image: (typeof image === 'string' ? image : (image && (image.src || image.url))) || ''\n    };\n  }\n\n  function normalizeStorefrontProduct(p) {\n    var variants = p.variants || [];\n    var firstVariant = variants[0] || {};\n    var availableVariants = variants.filter(function (v) { return v.available; }).map(normalizeProductVariant);\n    var variant = availableVariants[0] || null;\n    var img = (p.images && p.images[0]) || null;\n    var bodyText = (p.body_html || '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n    var desc = bodyText.slice(0, 160);\n    return {\n      id: p.id,\n      variantId: variant ? variant.id : null,\n      variants: availableVariants,\n      handle: p.handle,\n      title: p.title,\n      url: '/products/' + p.handle,\n      image: (variant && variant.image) || (typeof img === 'string' ? img : (img ? img.src : '')),\n      // /products.json gives price as a string like \"31.00\" \u2014 keep as-is,\n      // priceToCents() handles both numbers and strings.\n      price: (variant || firstVariant).price || '',\n      vendor: p.vendor || '',\n      type: p.product_type || '',\n      desc: desc,\n      description: desc,\n      compatibilityText: [p.title || '', p.handle || '', p.product_type || '', bodyText].join(' ')\n    };\n  }\n\n  function fetchCatalogSnapshot() {\n    if (catalogCache) return Promise.resolve(catalogCache);\n    if (catalogPromise) return catalogPromise;\n    catalogPromise = (async function () {\n      try {\n        var res = await fetch('/products.json?limit=250');\n        if (!res.ok) {\n          console.warn('[AI Search] /products.json returned', res.status);\n          return [];\n        }\n        var data = await res.json();\n        var arr = Array.isArray(data.products) ? data.products : [];\n        catalogCache = arr.map(normalizeStorefrontProduct);\n        return catalogCache;\n      } catch (e) {\n        console.error('[AI Search] fetchCatalogSnapshot failed:', e);\n        return [];\n      }\n    })();\n    return catalogPromise;\n  }\n\n  async function fetchPredictiveProducts(query) {\n    var searchUrl = (window.routes && window.routes.predictive_search_url) || '/search/suggest';\n    try {\n      var res = await fetch(\n        searchUrl +\n        '?q=' + encodeURIComponent(query) +\n        '&resources[type]=product&resources[limit]=8&section_id=predictive-search'\n      );\n      if (!res.ok) return [];\n      var html = await res.text();\n      var doc = new DOMParser().parseFromString(html, 'text/html');\n      var jsonEl = doc.getElementById('sr-product-context');\n      if (!jsonEl) return [];\n      var products = JSON.parse(jsonEl.textContent.trim());\n      return Array.isArray(products) ? products : [];\n    } catch (e) {\n      console.error('[AI Search] fetchPredictiveProducts failed:', e);\n      return [];\n    }\n  }\n\n  async function enrichProductVariants(product) {\n    if (product && Array.isArray(product.variants) && product.variants.length) return product;\n    var handle = product && (product.handle || productHandleFromUrl(product.url));\n    if (!handle) return product;\n    try {\n      var res = await fetch('/products/' + handle + '.js');\n      if (!res.ok) return product;\n      return normalizeStorefrontProduct(await res.json());\n    } catch (_) {\n      return product;\n    }\n  }\n\n  // Ask-AI queries are natural-language sentences (\"Gift for my mum, budget\n  // S$80, she likes baking\") whose words almost never appear in product\n  // titles, so /search/suggest token-matching comes back empty and the AI has\n  // nothing to recommend. Pull the storefront catalog instead and let the LLM\n  // do the semantic match \u2014 it is far better at that than Shopify's\n  // predictive index. Fall back to predictive search only if /products.json\n  // is unavailable (e.g. disabled by the store).\n  async function fetchProductContext(query, preferSearchMatches) {\n    if (preferSearchMatches) {\n      var matchingProducts = await fetchPredictiveProducts(query);\n      if (matchingProducts && matchingProducts.length) {\n        return await Promise.all(matchingProducts.map(enrichProductVariants));\n      }\n    }\n    var catalog = await fetchCatalogSnapshot();\n    if (catalog && catalog.length) return catalog;\n    return await fetchPredictiveProducts(query);\n  }\n\n  async function callAIEndpoint(query, products, history, shopperQuery, pinnedProducts) {\n    if (!ENDPOINT) {\n      noteFallback('endpoint_not_configured', {\n        query: query,\n        productsCount: (products || []).length\n      });\n      return null;\n    }\n    var endpointProducts = prepareEndpointProducts(shopperQuery || query, products, pinnedProducts);\n    dbg('POST endpoint', ENDPOINT, {\n      query: query,\n      providerBaseUrl: PROVIDER_BASE_URL,\n      model: PROVIDER_MODEL,\n      productsCount: endpointProducts.length,\n      products: endpointProducts\n    });\n    var res = await fetch(ENDPOINT, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        query: query,\n        shopperQuery: shopperQuery || query,\n        products: endpointProducts,\n        history: history || [],\n        store: STORE_NAME,\n        provider: {\n          baseUrl: PROVIDER_BASE_URL,\n          model: PROVIDER_MODEL\n        }\n      })\n    });\n    if (!res.ok) {\n      var errorBody = await res.text().catch(function () { return ''; });\n      noteFallback('endpoint_http_error', {\n        status: res.status,\n        statusText: res.statusText,\n        body: errorBody.slice(0, 500)\n      });\n      var httpError = new Error('AI endpoint returned ' + res.status);\n      httpError._aiFallbackNoted = true;\n      throw httpError;\n    }\n    var data = await res.json();\n    // If the response looks like an error object or has no usable content,\n    // return null so the caller falls through to the mock response.\n    if (!data || data.error || (!data.text && !data.products)) {\n      noteFallback('endpoint_empty_payload', { payload: data });\n      return null;\n    }\n    dbg('Endpoint response', data);\n    return data;\n  }\n\n\n\n  function tokenize(text) {\n    return String(text || '')\n      .toLowerCase()\n      .replace(/[^a-z0-9\\s]/g, ' ')\n      .split(/\\s+/)\n      .filter(function (w) { return w && w.length > 1; });\n  }\n\n  function responseLanguageForQuery(query) {\n    var text = String(query || '');\n    if (/[\\u3400-\\u9fff]/.test(text)) return 'zh';\n    if (/\\b(saya|mahu|untuk|boleh|cari|sesuai|pencetak|pelekat|botol|sekolah|harga|murah)\\b/i.test(text)) return 'ms';\n    return 'en';\n  }\n\n  function languageDirectiveForQuery(query) {\n    var language = responseLanguageForQuery(query);\n    if (language === 'zh') {\n      return 'Reply in Chinese because the shopper wrote in Chinese. Keep product names and model codes exactly as listed in the catalog.';\n    }\n    if (language === 'ms') {\n      return 'Reply in Bahasa Melayu because the shopper wrote in Malay. Keep product names and model codes exactly as listed in the catalog.';\n    }\n    return 'Reply in English only because the shopper wrote in English. Do not include Chinese characters or mix in another language. Keep product names and model codes exactly as listed in the catalog.';\n  }\n\n  function localizedRecommendationCopy(language) {\n    if (language === 'zh') {\n      return {\n        bestMatch: '\u6700\u4F73\u5339\u914D',\n        compatibleLabel: '\u517C\u5BB9\u6807\u7B7E\u7EB8',\n        bundleTitle: '\u7EC4\u5408\u5957\u88C5',\n        bundleSavings: function (count, saving) { return count + ' \u4EF6\u5546\u54C1 \u00B7 \u6BD4\u5355\u72EC\u8D2D\u4E70\u8282\u7701 ' + saving; }\n      };\n    }\n    if (language === 'ms') {\n      return {\n        bestMatch: 'PADANAN TERBAIK',\n        compatibleLabel: 'LABEL SERASI',\n        bundleTitle: 'Set Permulaan',\n        bundleSavings: function (count, saving) { return count + ' item \u00B7 jimat ' + saving + ' berbanding beli berasingan'; }\n      };\n    }\n    return {\n      bestMatch: 'BEST MATCH',\n      compatibleLabel: 'COMPATIBLE LABEL',\n      bundleTitle: 'Compatible Bundle',\n      bundleSavings: function (count, saving) { return count + ' items \u00B7 save ' + saving + ' vs. buying separately'; }\n    };\n  }\n\n  function scoreProductForQuery(query, p) {\n    var qTokens = tokenize(query);\n    if (!qTokens.length || !p) return 0;\n\n    var hayTitle = String(p.title || '').toLowerCase();\n    var hayType = String(p.type || '').toLowerCase();\n    var hayDesc = String(p.description || p.desc || '').toLowerCase();\n    var score = 0;\n\n    qTokens.forEach(function (t) {\n      if (hayTitle.indexOf(t) !== -1) score += 5;\n      if (hayType.indexOf(t) !== -1) score += 3;\n      if (hayDesc.indexOf(t) !== -1) score += 2;\n\n      // Lightweight intent mapping for common Ask-AI prompts.\n      if ((t === 'gift' || t === 'mum' || t === 'mom' || t === 'present') && /printer|bundle|starter/.test(hayTitle + ' ' + hayDesc)) score += 3;\n      if ((t === 'baking' || t === 'kitchen' || t === 'food' || t === 'pantry') && /waterproof|sticker|label/.test(hayTitle + ' ' + hayDesc)) score += 3;\n      if ((t === 'budget' || t === 'cheap' || t === 'price') && /printer|sticker|roll/.test(hayTitle + ' ' + hayDesc)) score += 1;\n    });\n\n    return score;\n  }\n\n  function productSearchText(product) {\n    return String([\n      product && product.title,\n      product && product.handle,\n      product && product.type,\n      product && product.compatibilityText,\n      product && product.description,\n      product && product.desc\n    ].join(' ')).toLowerCase();\n  }\n\n  function productIdentityText(product) {\n    return String([\n      product && product.title,\n      product && product.handle,\n      product && product.type\n    ].join(' ')).toLowerCase();\n  }\n\n  function isPrinterProduct(product) {\n    var identity = productIdentityText(product);\n    if (/\\bribbon\\b|sticker|refill|paper|roll|tape/.test(identity)) return false;\n    return /\\blabel maker\\b|\\blabel makers\\b|\\blabel printer\\b/.test(identity);\n  }\n\n  function isLabelSupplyProduct(product) {\n    var type = String((product && product.type) || '').toLowerCase();\n    return !isPrinterProduct(product) && /label stickers|sticker/.test(type + ' ' + productSearchText(product));\n  }\n\n  var MODEL_PATTERNS = [\n    { id: 'b21 pro', re: /\\bb21[\\s-]*pro\\b/i },\n    { id: 'b2 pro', re: /\\bb2[\\s-]*pro\\b/i },\n    { id: 'b1 pro', re: /\\bb1[\\s-]*pro\\b/i },\n    { id: 'd110', re: /\\bd110\\b/i },\n    { id: 'd101', re: /\\bd101\\b/i },\n    { id: 'b21', re: /\\bb21\\b/i },\n    { id: 'b31', re: /\\bb31\\b/i },\n    { id: 'h1s', re: /\\bh1s\\b/i },\n    { id: 'b18', re: /\\bb18\\b/i },\n    { id: 'd11', re: /\\bd11\\b/i },\n    { id: 'b4', re: /\\bb4\\b/i },\n    { id: 'k3', re: /\\bk3\\b/i },\n    { id: 'm3', re: /\\bm3\\b/i },\n    { id: 'm2', re: /\\bm2\\b/i },\n    { id: 'n1', re: /\\bn1\\b/i },\n    { id: 'b2', re: /\\bb2\\b/i },\n    { id: 'b1', re: /\\bb1\\b/i }\n  ];\n\n  function canonicalModelId(modelId) {\n    if (modelId === 'b18') return 'n1';\n    return modelId || '';\n  }\n\n  function modelPatternForId(modelId) {\n    var canonical = canonicalModelId(modelId);\n    if (!canonical) return null;\n    if (canonical === 'n1') return /\\b(?:n1|b18)\\b/i;\n    var match = MODEL_PATTERNS.find(function (model) { return canonicalModelId(model.id) === canonical; });\n    return match ? match.re : null;\n  }\n\n  function printerModel(product) {\n    var identity = String([(product && product.title) || '', (product && product.handle) || ''].join(' ')).toLowerCase();\n    var match = MODEL_PATTERNS.find(function (model) { return model.re.test(identity); });\n    if (!match) {\n      match = MODEL_PATTERNS.find(function (model) { return model.re.test(productSearchText(product)); });\n    }\n    return match ? canonicalModelId(match.id) : '';\n  }\n\n  function requestedPrinterModel(query) {\n    var text = String(query || '').toLowerCase();\n    var match = MODEL_PATTERNS.find(function (model) { return model.re.test(text); });\n    return match ? canonicalModelId(match.id) : '';\n  }\n\n  function responsePrinterModel(response) {\n    var text = String(response && response.text || '');\n    return requestedPrinterModel(text);\n  }\n\n  function labelSupportsPrinter(label, printer) {\n    var modelId = printerModel(printer);\n    if (!modelId) return false;\n    var pattern = modelPatternForId(modelId);\n    return !!(pattern && pattern.test(productSearchText(label)));\n  }\n\n  function labelPrimarySupportsPrinter(label, printer) {\n    var modelId = printerModel(printer);\n    if (!modelId) return false;\n    var pattern = modelPatternForId(modelId);\n    return !!(pattern && pattern.test(productIdentityText(label)));\n  }\n\n  function pickBestProducts(query, products, maxCount) {\n    var arr = Array.isArray(products) ? products.slice() : [];\n    if (!arr.length) return [];\n    var scored = arr.map(function (p, idx) {\n      return { p: p, idx: idx, score: scoreProductForQuery(query, p) };\n    });\n\n    scored.sort(function (a, b) {\n      if (b.score !== a.score) return b.score - a.score;\n      return a.idx - b.idx; // deterministic fallback\n    });\n\n    var top = scored.slice(0, maxCount || 3).map(function (x) { return x.p; });\n    if (!top.length) return arr.slice(0, maxCount || 3);\n\n    // If everything scored 0 (query unrelated to catalog tokens), avoid always\n    // showing exact same first three by rotating with a stable query hash.\n    var anySignal = scored[0] && scored[0].score > 0;\n    if (!anySignal) {\n      var h = 0;\n      String(query || '').split('').forEach(function (ch) { h = (h * 31 + ch.charCodeAt(0)) >>> 0; });\n      var start = arr.length ? (h % arr.length) : 0;\n      var rotated = arr.slice(start).concat(arr.slice(0, start));\n      return rotated.slice(0, maxCount || 3);\n    }\n\n    return top;\n  }\n\n  function rankedProducts(query, products) {\n    return (products || []).map(function (product, index) {\n      return { product: product, index: index, score: scoreProductForQuery(query, product) };\n    }).sort(function (a, b) {\n      return b.score - a.score || a.index - b.index;\n    }).map(function (entry) {\n      return entry.product;\n    });\n  }\n\n  function productContextKey(product) {\n    return String(product && (product.handle || normalizedProductPath(product.url) || product.id || product.title) || '')\n      .toLowerCase()\n      .trim();\n  }\n\n  function mergeProductContext(pinnedProducts, products) {\n    var merged = [];\n    var seen = {};\n    (pinnedProducts || []).concat(products || []).forEach(function (product) {\n      var key = productContextKey(product);\n      if (!key || seen[key]) return;\n      seen[key] = true;\n      merged.push(product);\n    });\n    return merged;\n  }\n\n  function recentRecommendedProducts() {\n    for (var i = conversation.length - 1; i >= 0; i -= 1) {\n      var turn = conversation[i];\n      if (turn.role === 'ai' && turn.content && Array.isArray(turn.content.products) && turn.content.products.length) {\n        return turn.content.products.slice(0, 3);\n      }\n    }\n    return [];\n  }\n\n  function prepareEndpointProducts(query, products, pinnedProducts) {\n    var ranked = pickBestProducts(query, products, 12);\n    return mergeProductContext(pinnedProducts, ranked).slice(0, 12).map(function (p) {\n      var desc = String(p.description || p.desc || '')\n        .replace(/<[^>]*>/g, '')\n        .replace(/\\s+/g, ' ')\n        .trim()\n        .slice(0, 120);\n\n      return {\n        id: p.id,\n        handle: p.handle,\n        title: p.title,\n        url: p.url || (p.handle ? '/products/' + p.handle : ''),\n        image: p.image || (p.featured_image && p.featured_image.url) || '',\n        price: priceToCents(p.price),\n        type: p.type || '',\n        vendor: p.vendor || '',\n        description: desc\n      };\n    });\n  }\n\n  function normalizedProductPath(url) {\n    if (!url) return '';\n    try {\n      return new URL(url, window.location.origin).pathname.replace(/\\/$/, '').toLowerCase();\n    } catch (_) {\n      return String(url).split('?')[0].replace(/\\/$/, '').toLowerCase();\n    }\n  }\n\n  function productHandleFromUrl(url) {\n    var path = normalizedProductPath(url);\n    var match = path.match(/\\/products\\/([^/?#]+)/);\n    return match ? match[1] : '';\n  }\n\n  function matchCatalogProduct(product, catalog) {\n    var path = normalizedProductPath(product && product.url);\n    var title = String((product && product.title) || '').toLowerCase().trim();\n    var handle = String((product && product.handle) || productHandleFromUrl(product && product.url) || '').toLowerCase().trim();\n\n    return (catalog || []).find(function (candidate) {\n      if (handle && String(candidate.handle || '').toLowerCase() === handle) return true;\n      if (path && normalizedProductPath(candidate.url) === path) return true;\n      return title && String(candidate.title || '').toLowerCase().trim() === title;\n    }) || null;\n  }\n\n  function selectPreferredVariant(query, product) {\n    var variants = (product && product.variants) || [];\n    if (!variants.length) return null;\n    var qTokens = tokenize(query);\n    var best = variants[0];\n    var bestScore = 0;\n    variants.forEach(function (variant) {\n      var title = String(variant.title || '').toLowerCase();\n      var score = 0;\n      qTokens.forEach(function (token) {\n        if (title.indexOf(token) !== -1) score += token.length >= 3 ? 2 : 1;\n      });\n      if (score > bestScore) {\n        best = variant;\n        bestScore = score;\n      }\n    });\n    return best;\n  }\n\n  function syncBundlePricing(response) {\n    if (!response || !response.bundle || !response.products || response.products.length < 2) return response;\n    var copy = localizedRecommendationCopy(response._language || 'en');\n    var sum = response.products.reduce(function (total, product) {\n      return total + (typeof product.price === 'number' ? product.price : priceToCents(product.price));\n    }, 0);\n    var bundlePrice = Math.round(sum * 0.88);\n    response.bundle.price = bundlePrice;\n    response.bundle.sub = copy.bundleSavings(response.products.length, fmtMoney(sum - bundlePrice));\n    return response;\n  }\n\n  function hydrateProduct(product, source, query) {\n    var selectedVariant = selectPreferredVariant(query, source);\n    return Object.assign({}, product || {}, {\n      id: source.id,\n      variantId: selectedVariant ? selectedVariant.id : source.variantId,\n      selectedVariantId: selectedVariant ? selectedVariant.id : source.variantId,\n      selectedVariantTitle: selectedVariant ? selectedVariant.title : '',\n      variants: source.variants || [],\n      handle: source.handle,\n      title: (product && product.title) || source.title,\n      desc: (product && product.desc) || source.desc,\n      type: source.type,\n      compatibilityText: source.compatibilityText,\n      url: source.url,\n      image: (selectedVariant && selectedVariant.image) || (product && product.image) || source.image,\n      price: selectedVariant ? priceToCents(selectedVariant.price) : priceToCents(source.price)\n    });\n  }\n\n  function hydrateResponseProducts(response, catalog, query) {\n    if (!response || !Array.isArray(response.products)) return response;\n    var requestedCount = response.products.length;\n    response.products = response.products.map(function (product) {\n      var source = matchCatalogProduct(product, catalog);\n      if (!source) {\n        dbg('Omitting AI product not found in provided catalog:', product);\n        return null;\n      }\n      return hydrateProduct(product, source, query);\n    }).filter(Boolean);\n    if (response.bundle && (response.products.length < 2 || response.products.length !== requestedCount)) {\n      response.bundle = null;\n    }\n    return syncBundlePricing(response);\n  }\n\n  function constrainRecommendationProducts(response, catalog, query) {\n    if (!response || !Array.isArray(response.products)) return response;\n    var copy = localizedRecommendationCopy(response._language || responseLanguageForQuery(query));\n    var shown = response.products;\n    var requestedModelId = requestedPrinterModel(query);\n    var preferredModelId = requestedModelId || responsePrinterModel(response);\n    var printer = shown.find(function (product) {\n      return isPrinterProduct(product) && (!preferredModelId || printerModel(product) === preferredModelId);\n    });\n    if (!printer) {\n      var printerSource = rankedProducts(query, (catalog || []).filter(function (product) {\n        return isPrinterProduct(product) && (!preferredModelId || printerModel(product) === preferredModelId);\n      }))[0];\n      if (printerSource) printer = hydrateProduct({ tag: copy.bestMatch }, printerSource, query);\n    }\n    if (!printer) {\n      response.products = shown.filter(function (product) { return !isPrinterProduct(product); }).slice(0, 2);\n      response.bundle = null;\n      return response;\n    }\n\n    var seen = {};\n    seen[printer.handle || printer.id] = true;\n    var candidateLabels = shown.filter(function (product) {\n      return isLabelSupplyProduct(product) && labelSupportsPrinter(product, printer);\n    });\n    rankedProducts(query, (catalog || []).filter(function (product) {\n      return isLabelSupplyProduct(product) && labelSupportsPrinter(product, printer);\n    })).forEach(function (source) {\n      candidateLabels.push(hydrateProduct({ tag: copy.compatibleLabel }, source, query));\n    });\n    var primaryLabels = candidateLabels.filter(function (label) {\n      return labelPrimarySupportsPrinter(label, printer);\n    });\n    var labelPool = primaryLabels.length ? primaryLabels : candidateLabels;\n    var labels = labelPool.filter(function (label) {\n      var key = label.handle || label.id;\n      if (seen[key]) return false;\n      seen[key] = true;\n      return true;\n    }).slice(0, 2);\n\n    printer.tag = printer.tag || copy.bestMatch;\n    labels.forEach(function (label) {\n      label.tag = label.tag || copy.compatibleLabel;\n    });\n    response.products = [printer].concat(labels);\n    if (response.products.length < 2) {\n      response.bundle = null;\n    } else if (!response.bundle) {\n      response.bundle = { title: copy.bundleTitle, price: 0 };\n    }\n    dbg('Constrained recommendation set', {\n      printer: printer.handle,\n      model: printerModel(printer),\n      requestedModel: requestedModelId,\n      preferredModel: preferredModelId,\n      labels: labels.map(function (label) { return label.handle; })\n    });\n    return syncBundlePricing(response);\n  }\n\n  function combinationKey(products) {\n    var keys = (products || []).map(function (product) {\n      return String(product.handle || normalizedProductPath(product.url) || product.id || product.title || '')\n        .toLowerCase()\n        .trim();\n    }).filter(Boolean).sort();\n    return keys.length ? keys.join('|') : '';\n  }\n\n  function suppressRepeatedCombination(response) {\n    if (!response || !response.products || !response.products.length) return response;\n    var key = combinationKey(response.products);\n    if (!key) return response;\n    if (recommendedCombinations[key]) {\n      dbg('Repeated product combination omitted:', key);\n      var repeatNotice = response._language === 'zh'\n        ? ' \u5546\u54C1\u7EC4\u5408\u4E0E\u4E0A\u65B9\u63A8\u8350\u76F8\u540C\uFF0C\u60A8\u53EF\u4EE5\u76F4\u63A5\u70B9\u51FB\u4E0A\u65B9\u94FE\u63A5\u4E0B\u5355\u3002'\n        : (response._language === 'ms'\n          ? ' Gabungan produk ini sama seperti cadangan di atas; anda boleh membuat pesanan melalui pautan di atas.'\n          : ' This is the same product set shown above; you can order directly from the links above.');\n      return Object.assign({}, response, {\n        text: String(response.text || '') + repeatNotice,\n        products: [],\n        bundle: null\n      });\n    }\n    recommendedCombinations[key] = true;\n    return response;\n  }\n\n  function buildMockResponse(query, products) {\n    var picks = pickBestProducts(query, products, 3);\n    var lower = query.toLowerCase();\n    var language = responseLanguageForQuery(query);\n    var introBits = [];\n\n    if (language === 'zh') {\n      introBits.push('\u4EE5\u4E0B\u662F\u9002\u5408\u60A8\u9700\u6C42\u7684\u6807\u7B7E\u673A\u548C\u517C\u5BB9\u6807\u7B7E\u7EB8\u7EC4\u5408\u3002');\n    } else if (language === 'ms') {\n      introBits.push('Berikut ialah pencetak label dan kertas label serasi yang sesuai untuk keperluan anda.');\n    } else if (/wet|water|kitchen|pantry|food|oil/.test(lower)) {\n      introBits.push('For wet or oily surfaces, choose <strong>waterproof PET labels</strong> rather than paper \u2014 they survive wipe-downs.');\n    } else if (/gift|present/.test(lower)) {\n      introBits.push('A compact <strong>Bluetooth printer</strong> bundled with starter rolls makes a great gift \u2014 under S$100 and printable from any phone.');\n    } else if (/bakery|business|barcode|shop/.test(lower)) {\n      introBits.push('For small-business use, look for a <strong>304 dpi</strong> printer that handles barcodes, dates and a small logo on the same label.');\n    } else if (/kid|school|name/.test(lower)) {\n      introBits.push('Name labels for kids should be <strong>waterproof</strong> and dishwasher-safe \u2014 paper labels peel off bottles within a week.');\n    } else {\n      introBits.push('Based on \"' + esc(query) + '\", here are our most popular picks. The first one is usually the best fit for most homes.');\n    }\n\n    var text = introBits.join(' ');\n    if (picks.length) {\n      text += language === 'zh' ? ' \u6211\u5EFA\u8BAE\u642D\u914D\uFF1A' : (language === 'ms' ? ' Padanan yang saya syorkan:' : ' Here\\'s what I\\'d pair:');\n    }\n\n    var followups = language === 'zh'\n      ? ['\u8FD9\u4E9B\u6807\u7B7E\u9632\u6C34\u5417\uFF1F', '\u54EA\u4E00\u6B3E\u6807\u7B7E\u673A\u9002\u5408\u8FD9\u4E9B\u6807\u7B7E\u7EB8\uFF1F', '\u663E\u793A\u66F4\u4FBF\u5B9C\u7684\u9009\u9879']\n      : (language === 'ms'\n        ? ['Adakah label ini kalis air?', 'Pencetak mana sesuai untuk label ini?', 'Tunjukkan pilihan lebih murah']\n        : ['What about freezer-safe labels?', 'Show me cheaper printers', 'Can it print Chinese characters?']);\n\n    // Bundle savings = ~12% of sum. Always work in cents (numbers).\n    var sum = picks.reduce(function (a, p) { return a + priceToCents(p.price); }, 0);\n    var bundlePrice = Math.round(sum * 0.88);\n\n    return {\n      text: text,\n      products: picks.map(function (p, i) {\n        return {\n          id: p.id,\n          variantId: p.variantId,\n          handle: p.handle,\n          url: p.url,\n          title: p.title,\n          image: (p.image || (p.featured_image && p.featured_image.url) || null),\n          price: priceToCents(p.price),\n          tag: language === 'zh'\n            ? (i === 0 ? '\u6700\u4F73\u5339\u914D' : '\u517C\u5BB9\u6807\u7B7E\u7EB8')\n            : (language === 'ms'\n              ? (i === 0 ? 'PADANAN TERBAIK' : 'LABEL SERASI')\n              : (i === 0 ? 'BEST MATCH' : (i === 1 ? 'SURVIVES WIPE-DOWNS' : 'FREE WITH BUNDLE'))),\n          desc: language === 'zh'\n            ? '\u9002\u5408\u6B64\u9700\u6C42\u7684\u517C\u5BB9\u4EA7\u54C1\u3002'\n            : (language === 'ms'\n              ? 'Produk serasi yang sesuai untuk keperluan ini.'\n              : (p.description || '').replace(/<[^>]*>/g, '').slice(0, 80))\n        };\n      }),\n      bundle: picks.length >= 2 ? {\n        title: language === 'zh' ? '\u7EC4\u5408\u5957\u88C5' : (language === 'ms' ? 'Set Permulaan' : 'Starter Bundle'),\n        sub: language === 'zh'\n          ? picks.length + ' \u4EF6\u5546\u54C1 \u00B7 \u6BD4\u5355\u72EC\u8D2D\u4E70\u8282\u7701 ' + fmtMoney(sum - bundlePrice)\n          : (language === 'ms'\n            ? picks.length + ' item \u00B7 jimat ' + fmtMoney(sum - bundlePrice) + ' berbanding beli berasingan'\n            : picks.length + ' items \u00B7 save ' + fmtMoney(sum - bundlePrice) + ' vs. buying separately'),\n        price: bundlePrice\n      } : null,\n      followups: followups,\n      _mock: true\n    };\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     AI conversation rendering\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var conversation = []; // {role, content}\n\n  function getBody() { return document.querySelector('[data-sr-ai-body]'); }\n  function getThread() { return document.querySelector('[data-sr-ai-thread]'); }\n\n  function renderConversation(extraMsg) {\n    var thread = getThread();\n    var body = getBody();\n    if (!thread || !body) return;\n    body.setAttribute('data-state', 'thread');\n\n    // Force-close the predictive-search dropdown so its results don't\n    // show above the AI thread (its [open] CSS otherwise wins on specificity).\n    var ps = document.querySelector('#sr-overlay predictive-search');\n    if (ps) {\n      ps.removeAttribute('open');\n      ps.removeAttribute('loading');\n    }\n\n    var html = '';\n    conversation.forEach(function (turn, index) {\n      if (turn.role === 'user') {\n        html += renderUserMsg(turn.content);\n      } else if (turn.role === 'ai') {\n        html += renderAIMsg(turn.content, index);\n      }\n    });\n    if (extraMsg) html += extraMsg;\n\n    thread.innerHTML = html;\n\n    // Scroll the latest message into view. The scroll container is\n    // .sr-card__body (overflow-y:auto), so scrollIntoView on the last\n    // element bubbles up to the right ancestor.\n    requestAnimationFrame(function () {\n      var last = thread.lastElementChild;\n      if (last && last.scrollIntoView) {\n        last.scrollIntoView({ block: 'end', behavior: 'smooth' });\n      }\n    });\n  }\n\n  function renderUserMsg(text) {\n    return (\n      '<div class=\"sr-ai-msg sr-ai-msg--user\">' +\n        '<div class=\"sr-ai-msg__avatar sr-ai-msg__avatar--user\">u</div>' +\n        '<div class=\"sr-ai-msg__body\">' +\n          '<div class=\"sr-ai-msg__name\">You</div>' +\n          '<div class=\"sr-ai-msg__text\">' + esc(text) + '</div>' +\n        '</div>' +\n      '</div>'\n    );\n  }\n\n  function renderThinking() {\n    return (\n      '<div class=\"sr-ai-msg\">' +\n        '<div class=\"sr-ai-msg__avatar\">' +\n          '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275Z\"/></svg>' +\n        '</div>' +\n        '<div class=\"sr-ai-msg__body\">' +\n          '<div class=\"sr-ai-msg__name\">' + esc(STORE_NAME) + '</div>' +\n          '<div class=\"sr-thinking\"><span></span><span></span><span></span></div>' +\n        '</div>' +\n      '</div>'\n    );\n  }\n\n  function isDefaultVariantTitle(title) {\n    return !title || /^default title$/i.test(String(title).trim());\n  }\n\n  function renderVariantControl(product, turnIndex, productIndex) {\n    var variants = Array.isArray(product.variants) ? product.variants : [];\n    if (!variants.length) return '';\n    var selectedId = String(product.selectedVariantId || product.variantId || '');\n    if (variants.length > 1) {\n      return (\n        '<label class=\"sr-ai-product__variant\">' +\n          '<select class=\"sr-ai-product__select\" data-sr-variant-select data-sr-turn-index=\"' + esc(turnIndex) + '\" data-sr-product-index=\"' + esc(productIndex) + '\" aria-label=\"Choose option for ' + esc(product.title || '') + '\">' +\n            variants.map(function (variant) {\n              var selected = String(variant.id) === selectedId ? ' selected' : '';\n              return '<option value=\"' + esc(variant.id) + '\"' + selected + '>' + esc(variant.title) + ' - ' + esc(fmtMoney(priceToCents(variant.price))) + '</option>';\n            }).join('') +\n          '</select>' +\n          '<span class=\"sr-ai-product__selection\" data-sr-selected-variant>' + esc(product.selectedVariantTitle || variants[0].title) + '</span>' +\n        '</label>'\n      );\n    }\n    if (!isDefaultVariantTitle(variants[0].title)) {\n      return (\n        '<div class=\"sr-ai-product__choice\">' +\n          '<span>' + esc(variants[0].title) + '</span>' +\n        '</div>'\n      );\n    }\n    return '';\n  }\n\n  function renderAIMsg(payload, turnIndex) {\n    var p = payload || {};\n    var productsHtml = '';\n    if (p.products && p.products.length) {\n      productsHtml = '<div class=\"sr-ai-products\">' +\n        p.products.map(function (pr, i) {\n          var tag = '<span class=\"sr-ai-product__tag' + (i === 0 ? '' : ' sr-ai-product__tag--neutral') + '\">' +\n            (pr.tag ? esc(pr.tag) : '&nbsp;') + '</span>';\n          var img = pr.image\n            ? '<img src=\"' + esc(pr.image) + '\" alt=\"' + esc(pr.title || '') + '\" loading=\"lazy\">'\n            : '';\n          var priceHtml = (typeof pr.price === 'number')\n            ? '<span class=\"sr-ai-product__price\" data-sr-product-price>' + esc(fmtMoney(pr.price)) + '</span>'\n            : '<span class=\"sr-ai-product__included\">Included</span>';\n          var url = pr.url || (pr.handle ? '/products/' + pr.handle : '#');\n          var variantsHtml = renderVariantControl(pr, turnIndex, i);\n          return (\n            '<article class=\"sr-ai-product\" data-sr-product-index=\"' + esc(i) + '\">' +\n              '<a class=\"sr-ai-product__media\" href=\"' + esc(url) + '\">' + img + '</a>' +\n              '<div class=\"sr-ai-product__body\">' +\n                tag +\n                '<h4 class=\"sr-ai-product__name\"><a href=\"' + esc(url) + '\">' + esc(pr.title || '') + '</a></h4>' +\n                '<p class=\"sr-ai-product__desc\">' + (pr.desc ? esc(pr.desc) : '&nbsp;') + '</p>' +\n                '<div class=\"sr-ai-product__purchase\">' +\n                  variantsHtml +\n                  priceHtml +\n                '</div>' +\n              '</div>' +\n            '</article>'\n          );\n        }).join('') +\n      '</div>';\n    }\n\n    var bundleHtml = '';\n    if (p.bundle) {\n      bundleHtml = (\n        '<div class=\"sr-ai-bundle\" data-sr-turn-index=\"' + esc(turnIndex) + '\">' +\n          '<div class=\"sr-ai-bundle__info\">' +\n            '<div class=\"sr-ai-bundle__title\">' + esc(p.bundle.title || 'Bundle') + '</div>' +\n            (p.bundle.sub ? '<div class=\"sr-ai-bundle__sub\" data-sr-bundle-sub>' + esc(p.bundle.sub) + '</div>' : '') +\n          '</div>' +\n          '<div class=\"sr-ai-bundle__cta\">' +\n            '<span class=\"sr-ai-bundle__price\" data-sr-bundle-price>' + esc(fmtMoney(p.bundle.price)) + '</span>' +\n            '<button type=\"button\" class=\"sr-ai-bundle__btn\" data-sr-add-bundle data-sr-turn-index=\"' + esc(turnIndex) + '\">' +\n              'Add bundle ' +\n              '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12,5 19,12 12,19\"/></svg>' +\n            '</button>' +\n          '</div>' +\n        '</div>'\n      );\n    }\n\n    var followupsHtml = '';\n    if (p.followups && p.followups.length) {\n      followupsHtml = (\n        '<div class=\"sr-ai-followup\">' +\n          '<h4 class=\"sr-section__title\" style=\"margin: 8px 0;\">Follow up</h4>' +\n          '<div class=\"sr-chips\">' +\n            p.followups.map(function (f) {\n              return '<button type=\"button\" class=\"sr-chip\" data-sr-ai-prompt=\"' + esc(f) + '\">' + esc(f) + '</button>';\n            }).join('') +\n          '</div>' +\n        '</div>'\n      );\n    }\n\n    return (\n      '<div class=\"sr-ai-msg\">' +\n        '<div class=\"sr-ai-msg__avatar\">' +\n          '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275Z\"/></svg>' +\n        '</div>' +\n        '<div class=\"sr-ai-msg__body\">' +\n          '<div class=\"sr-ai-msg__name\">' + esc(STORE_NAME) + '</div>' +\n          '<div class=\"sr-ai-msg__text\">' + (p.text || '') + '</div>' +\n          productsHtml +\n          bundleHtml +\n          followupsHtml +\n        '</div>' +\n      '</div>'\n    );\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Main askAI flow\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  async function askAI(query, searchContext) {\n    query = (query || '').trim();\n    if (!query) return;\n    searchContext = (searchContext || '').trim();\n    var requestQuery = searchContext\n      ? query + '\\nThe shopper came from search results for \"' + searchContext +\n        '\". Recommend only products relevant or compatible with \"' + searchContext + '\".'\n      : query;\n    requestQuery += '\\nRecommend exactly one label printer and one or two label sticker products compatible with that printer. Never recommend two printers together.';\n    requestQuery += '\\n' + languageDirectiveForQuery(query);\n\n    openOverlay();\n    if (readMode() !== 'ai') {\n      switchMode('ai');\n    } else {\n      applyMode('ai');\n    }\n\n    clearAIComposer();\n\n    conversation.push({ role: 'user', content: query });\n    renderConversation(renderThinking());\n\n    var pinnedProducts = recentRecommendedProducts();\n    var products = await fetchProductContext(searchContext || query, !!searchContext);\n    products = mergeProductContext(pinnedProducts, products);\n\n    var response;\n    try {\n      response = await callAIEndpoint(requestQuery, products, conversation.slice(0, -1), query, pinnedProducts);\n    } catch (e) {\n      if (!e || !e._aiFallbackNoted) {\n        noteFallback('endpoint_exception', {\n          message: e && e.message ? e.message : String(e),\n          name: e && e.name ? e.name : ''\n        });\n      }\n      response = null;\n    }\n    if (!response) {\n      response = buildMockResponse(searchContext ? query + ' for ' + searchContext : query, products);\n    }\n    response._language = responseLanguageForQuery(query);\n    response = hydrateResponseProducts(response, products, searchContext || query);\n    response = constrainRecommendationProducts(response, products, searchContext || query);\n    response = suppressRepeatedCombination(response);\n\n    conversation.push({ role: 'ai', content: response });\n    renderConversation();\n  }\n\n  function resetConversation() {\n    conversation = [];\n    recommendedCombinations = {};\n    var body = getBody();\n    var thread = getThread();\n    if (body) body.removeAttribute('data-state');\n    if (thread) thread.innerHTML = '';\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Bundle add (multi-item add to cart)\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n  // Confirm the shopper-selected variant is still available before adding.\n  async function resolveVariantId(product) {\n    var selectedId = String(product.selectedVariantId || product.variantId || '');\n    var handle = product.handle || productHandleFromUrl(product.url);\n    if (!handle) return selectedId || null;\n    try {\n      var r = await fetch('/products/' + handle + '.js');\n      if (!r.ok) return selectedId || null;\n      var data = await r.json();\n      var variants = data.variants || [];\n      var variant = selectedId\n        ? variants.find(function (v) { return String(v.id) === selectedId && v.available; })\n        : variants.find(function (v) { return v.available; });\n      return variant ? variant.id : null;\n    } catch (_) {\n      return selectedId || null;\n    }\n  }\n\n  function updateSelectedVariant(select) {\n    var turnIndex = parseInt(select.getAttribute('data-sr-turn-index'), 10);\n    var productIndex = parseInt(select.getAttribute('data-sr-product-index'), 10);\n    var turn = conversation[turnIndex];\n    var product = turn && turn.role === 'ai' && turn.content.products && turn.content.products[productIndex];\n    if (!product) return;\n    var selectedId = String(select.value);\n    var variant = (product.variants || []).find(function (option) {\n      return String(option.id) === selectedId;\n    });\n    if (!variant) return;\n\n    product.selectedVariantId = variant.id;\n    product.variantId = variant.id;\n    product.selectedVariantTitle = variant.title;\n    product.price = priceToCents(variant.price);\n    if (variant.image) product.image = variant.image;\n    syncBundlePricing(turn.content);\n\n    var card = select.closest('.sr-ai-product');\n    var price = card && card.querySelector('[data-sr-product-price]');\n    var image = card && card.querySelector('.sr-ai-product__media img');\n    var selection = card && card.querySelector('[data-sr-selected-variant]');\n    if (price) price.textContent = fmtMoney(product.price);\n    if (image && variant.image) image.src = variant.image;\n    if (selection) selection.textContent = variant.title;\n\n    var thread = getThread();\n    var bundle = thread && thread.querySelector('.sr-ai-bundle[data-sr-turn-index=\"' + turnIndex + '\"]');\n    var bundlePrice = bundle && bundle.querySelector('[data-sr-bundle-price]');\n    var bundleSub = bundle && bundle.querySelector('[data-sr-bundle-sub]');\n    if (bundlePrice && turn.content.bundle) bundlePrice.textContent = fmtMoney(turn.content.bundle.price);\n    if (bundleSub && turn.content.bundle) bundleSub.textContent = turn.content.bundle.sub;\n  }\n\n  async function addBundleToCart(payload, btn) {\n    if (!payload || !payload.products || !payload.products.length) return;\n\n    // Button loading state\n    if (btn) { btn.disabled = true; btn.textContent = 'Adding\u2026'; }\n\n    try {\n      // Resolve variant IDs for all products in parallel\n      var variantIds = await Promise.all(payload.products.map(function (p) {\n        return resolveVariantId(p);\n      }));\n\n      var items = variantIds\n        .filter(function (id) { return id; })\n        .map(function (id) { return { id: id, quantity: 1 }; });\n\n      if (!items.length) throw new Error('No variant IDs resolved');\n      if (items.length !== payload.products.length) throw new Error('One or more bundle products are unavailable');\n\n      var cartAddUrl = ((window.routes && window.routes.cart_add_url) || '/cart/add') + '.js';\n      var r = await fetch(cartAddUrl, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n        credentials: 'same-origin',\n        body: JSON.stringify({ items: items })\n      });\n      if (!r.ok) {\n        var err = await r.json().catch(function () { return {}; });\n        throw new Error(err.description || 'Add to cart failed');\n      }\n\n      // The cart drawer otherwise opens underneath the full-screen search overlay.\n      closeOverlayForCart();\n\n      // Refresh NbCart drawer and open it (no page navigation)\n      if (window.NbCart) {\n        await window.NbCart.refresh();\n        window.NbCart.open();\n      } else {\n        document.dispatchEvent(new CustomEvent('cart:refresh'));\n      }\n\n      // Reset button so user can re-add\n      if (btn) { btn.disabled = false; btn.textContent = 'Added \u2713'; }\n      setTimeout(function () {\n        if (btn) btn.textContent = 'Add bundle';\n      }, 2500);\n\n    } catch (e) {\n      console.error('[AI Search] addBundleToCart error:', e);\n      if (btn) {\n        btn.disabled = false;\n        btn.textContent = 'Could not add - try again';\n        setTimeout(function () { btn.textContent = 'Add bundle'; }, 3000);\n      }\n    }\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Event bindings\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  document.addEventListener('click', function (e) {\n    // Mode toggle\n    var modeBtn = e.target.closest('[data-sr-mode]');\n    if (modeBtn) {\n      e.preventDefault();\n      switchMode(modeBtn.dataset.srMode);\n      return;\n    }\n\n    // AI prompt (suggested prompts, use case chips, follow-ups, nudge button)\n    var aiTrigger = e.target.closest('[data-sr-ai-prompt]');\n    if (aiTrigger) {\n      e.preventDefault();\n      askAI(aiTrigger.dataset.srAiPrompt, aiTrigger.dataset.srAiContext || '');\n      return;\n    }\n\n    // Refine with AI button (on results page)\n    var refineAI = e.target.closest('[data-sr-refine-ai]');\n    if (refineAI) {\n      e.preventDefault();\n      var q = refineAI.dataset.srAiPrompt || '';\n      askAI(q || (document.querySelector('.sr-results-hero__title') || {}).textContent || '');\n      return;\n    }\n\n    // \"Best printer for my home kitchen\" accent chips \u2192 ai mode if marked\n    var aiSuggested = e.target.closest('[data-sr-ai-suggested]');\n    if (aiSuggested) {\n      e.preventDefault();\n      askAI(aiSuggested.dataset.srQuery || aiSuggested.textContent.trim());\n      return;\n    }\n\n    // Bundle add\n    var addBundle = e.target.closest('[data-sr-add-bundle]');\n    if (addBundle) {\n      e.preventDefault();\n      if (addBundle.disabled) return;\n      var turnIndex = parseInt(addBundle.getAttribute('data-sr-turn-index'), 10);\n      var turn = isNaN(turnIndex) ? conversation[conversation.length - 1] : conversation[turnIndex];\n      if (turn && turn.role === 'ai') addBundleToCart(turn.content, addBundle);\n      return;\n    }\n\n    // Mobile close button\n    var mobClose = e.target.closest('[data-sr-mobile-close]');\n    if (mobClose) {\n      e.preventDefault();\n      var overlay = document.getElementById('sr-overlay');\n      if (overlay) {\n        overlay.classList.remove('is-open');\n        overlay.setAttribute('aria-hidden', 'true');\n        document.body.classList.remove('sr-overlay-open');\n      }\n      return;\n    }\n\n    // AI summary dismiss\n    var summClose = e.target.closest('[data-sr-ai-summary-close]');\n    if (summClose) {\n      e.preventDefault();\n      var box = document.querySelector('[data-sr-ai-summary]');\n      if (box) box.hidden = true;\n      try { sessionStorage.setItem(SUMMARY_KEY + '-' + window.location.search, '1'); } catch (_) {}\n      return;\n    }\n  });\n\n  document.addEventListener('change', function (e) {\n    var variantSelect = e.target.closest && e.target.closest('[data-sr-variant-select]');\n    if (variantSelect) updateSelectedVariant(variantSelect);\n  });\n\n  /* AI form submit (Enter in AI mode \u2192 askAI) */\n  document.addEventListener('submit', function (e) {\n    var form = e.target.closest('#sr-overlay [data-sr-form]');\n    if (!form) return;\n    if (readMode() === 'ai') {\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      var input = form.querySelector('[data-sr-input]');\n      if (input) askAI(input.value);\n    }\n  });\n\n  /* Enter / Ctrl+Enter on the search input \u2014 wired directly on the element so\n     it fires before predictive-search's bubble handlers and the form submit. */\n  function wireInputKeydown() {\n    var srInput = document.getElementById('sr-overlay-input');\n    if (!srInput || srInput._aiKeydownWired) return;\n    srInput._aiKeydownWired = true;\n    srInput.addEventListener('keydown', function (e) {\n      if (e.key !== 'Enter') return;\n\n      if (e.metaKey || e.ctrlKey) {\n        // \u2318+Enter / Ctrl+Enter: always send to AI regardless of current mode\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        askAI(srInput.value);\n        return;\n      }\n\n      if (e.shiftKey || e.altKey) return;\n\n      // Plain Enter: only intercept when in AI mode\n      if (readMode() !== 'ai') return;\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      askAI(srInput.value);\n    });\n  }\n\n  // Wire immediately (input is in the DOM even when overlay is hidden)\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', wireInputKeydown);\n  } else {\n    wireInputKeydown();\n  }\n\n  /* Clearing or replacing draft text must retain the current AI context.\n     Closing the overlay remains the boundary for a fresh session. */\n  /* When the overlay closes, reset the AI thread for a fresh next-open */\n  (function() {\n    var overlayEl = document.getElementById('sr-overlay');\n    if (!overlayEl) return;\n    var observer = new MutationObserver(function (mutations) {\n      mutations.forEach(function (m) {\n        if (m.attributeName === 'class' && !overlayEl.classList.contains('is-open')) {\n          resetConversation();\n        }\n      });\n    });\n    observer.observe(overlayEl, { attributes: true, attributeFilter: ['class'] });\n  }());\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Results page: AI summary (auto-generate on load)\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  async function generateResultsSummary() {\n    var box = document.querySelector('[data-sr-ai-summary]');\n    if (!box) return;\n\n    var dismissedKey = SUMMARY_KEY + '-' + window.location.search;\n    try {\n      if (sessionStorage.getItem(dismissedKey) === '1') {\n        box.hidden = true;\n        return;\n      }\n    } catch (_) {}\n\n    var titleEl = document.querySelector('.sr-results-hero__title em');\n    var query = titleEl ? titleEl.textContent.replace(/\"/g, '').trim() : '';\n    if (!query) return;\n\n    var products = await fetchProductContext(query, true);\n\n    var response;\n    try {\n      response = await callAIEndpoint(\n        'Give a short shopping summary for: ' + query + '\\n' + languageDirectiveForQuery(query),\n        products,\n        [],\n        query\n      );\n    } catch (e) {\n      if (!e || !e._aiFallbackNoted) {\n        noteFallback('summary_endpoint_exception', {\n          message: e && e.message ? e.message : String(e),\n          name: e && e.name ? e.name : ''\n        });\n      }\n      response = null;\n    }\n    if (!response) response = buildMockResponse(query, products);\n\n    var textEl = box.querySelector('[data-sr-ai-summary-text]');\n    var chipsEl = box.querySelector('[data-sr-ai-summary-chips]');\n    if (textEl) textEl.innerHTML = response.text || textEl.innerHTML;\n    if (chipsEl && response.followups) {\n      chipsEl.innerHTML = response.followups.map(function (f) {\n        return '<button type=\"button\" class=\"sr-chip\" data-sr-ai-prompt=\"' + esc(f) +\n          '\" data-sr-ai-context=\"' + esc(query) + '\">' +\n          '<span class=\"sr-chip__icon\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275Z\"/></svg></span>' +\n          esc(f) +\n          '</button>';\n      }).join('');\n    }\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Bootstrap\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function init() {\n    applyMode(readMode());\n    if (document.querySelector('[data-sr-ai-summary]')) {\n      generateResultsSummary();\n    }\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
