{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/journal-search.js?cb=32398"],
  "sourcesContent": ["/* Journal search.\n   Shopify's own search ORs the words and reads the whole article body, so\n   \"how to clean\" returned 39 articles because nearly every one mentions\n   cleaning somewhere. This searches a small index of title, topics and\n   summary instead: every word must appear, and title matches rank first.\n   The form still works without JavaScript - it falls back to /search. */\n(function () {\n  var form = document.querySelector('.om-blog-search');\n  if (!form) return;\n  var input = document.getElementById('om-journal-q');\n  var panel = document.getElementById('om-jres');\n  var list = document.getElementById('om-jres-list');\n  var countEl = document.getElementById('om-jres-count');\n  var noneEl = document.getElementById('om-jres-none');\n  var fullLink = document.getElementById('om-jres-full');\n  if (!input || !panel || !list) return;\n\n  var topics = document.querySelector('.om-blog-topics .m-tabs__wrapper');\n  // The wrapper holds both the article list AND the pagination; hiding only\n  // .m-blog__list left the page numbers dangling under the search results.\n  var posts = document.querySelector('.m-blog__wrapper') || document.querySelector('.m-blog__list');\n  var index = null;\n  var pending = null;\n\n  function load() {\n    // One shared promise: typing a second letter while the index is still on\n    // the wire used to get an immediate null back and render nothing at all.\n    if (index) return Promise.resolve(index);\n    if (pending) return pending;\n    pending = fetch(form.dataset.index)\n      .then(function (r) {\n        return r.json();\n      })\n      .then(function (data) {\n        index = data.map(function (a) {\n          var title = a.t.toLowerCase();\n          var hay = (a.t + ' ' + (a.g || '') + ' ' + (a.s || '')).toLowerCase();\n          return {\n            h: a.h,\n            t: a.t,\n            i: a.i,\n            s: a.s,\n            hay: hay,\n            title: title,\n            // padded and punctuation-stripped, so a whole-word match can be\n            // told apart from a substring: \"rings\" must not rank \"earrings\"\n            // above \"Why Are Antique Rings So Small\".\n            titleWords: ' ' + title.replace(/[^a-z0-9]+/g, ' ').trim() + ' ',\n            hayWords: ' ' + hay.replace(/[^a-z0-9]+/g, ' ').trim() + ' ',\n          };\n        });\n        return index;\n      })\n      .catch(function () {\n        pending = null;\n        return null;\n      });\n    return pending;\n  }\n\n  function cdn(file) {\n    // Article images live on the Shopify files path; entries with their own\n    // subpath (e.g. \"articles/...\") are used as-is\n    var path = file.indexOf('/') > -1 ? file : 'files/' + file;\n    return 'https://cdn.shopify.com/s/files/1/1050/3775/8798/' + path + '?width=220';\n  }\n\n  function score(a, words) {\n    var s = 0;\n    for (var i = 0; i < words.length; i++) {\n      var w = words[i];\n      var pad = ' ' + w + ' ';\n      // every word must appear somewhere, at least as part of a longer word\n      if (a.hay.indexOf(w) === -1) return -1;\n      if (a.titleWords.indexOf(pad) > -1) s += 12; // whole word in the title\n      else if (a.title.indexOf(w) > -1) s += 3; // only inside a longer word\n      if (a.hayWords.indexOf(pad) > -1) s += 2; // whole word in topics or summary\n      else s += 1;\n    }\n    // a title that opens with the whole query is the obvious answer\n    if (a.title.indexOf(words.join(' ')) === 0) s += 10;\n    return s;\n  }\n\n  function render(hits, query) {\n    list.innerHTML = hits\n      .map(function (a) {\n        return (\n          '<li class=\"om-jres__item\"><a href=\"/blogs/journal/' +\n          a.h +\n          '\">' +\n          (a.i ? '<span class=\"om-jres__thumb\"><img src=\"' + cdn(a.i) + '\" alt=\"\" loading=\"lazy\"></span>' : '') +\n          '<span class=\"om-jres__text\"><span class=\"om-jres__title\">' +\n          a.t +\n          '</span><span class=\"om-jres__excerpt\">' +\n          (a.s || '') +\n          '</span></span></a></li>'\n        );\n      })\n      .join('');\n    countEl.textContent = hits.length\n      ? hits.length + (hits.length === 1 ? ' article' : ' articles') + ' for \"' + query + '\"'\n      : '';\n    noneEl.hidden = hits.length !== 0;\n    // The full-text route stays available at all times: this index covers\n    // titles, topics and summaries, so a word used only deep inside an\n    // article is found through Shopify's own search instead.\n    if (fullLink) fullLink.href = '/search?q=' + encodeURIComponent(query) + '&type=article';\n  }\n\n  function show(on) {\n    panel.hidden = !on;\n    if (topics) topics.style.display = on ? 'none' : '';\n    if (posts) posts.style.display = on ? 'none' : '';\n  }\n\n  function run() {\n    var query = input.value.trim();\n    var words = query.toLowerCase().split(/\\s+/).filter(Boolean);\n    if (!words.length) {\n      show(false);\n      return;\n    }\n    load().then(function (data) {\n      if (!data) return; // index unavailable: leave the plain form submit as the fallback\n      var hits = [];\n      for (var i = 0; i < data.length; i++) {\n        var s = score(data[i], words);\n        if (s > 0) hits.push({ a: data[i], s: s });\n      }\n      hits.sort(function (x, y) {\n        return y.s - x.s;\n      });\n      render(\n        hits.map(function (x) {\n          return x.a;\n        }),\n        query\n      );\n      show(true);\n    });\n  }\n\n  var timer;\n  input.addEventListener('input', function () {\n    clearTimeout(timer);\n    timer = setTimeout(run, 120);\n  });\n  input.addEventListener('focus', load);\n  input.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape') {\n      input.value = '';\n      show(false);\n    }\n  });\n  form.addEventListener('submit', function (e) {\n    // With the index loaded there is nothing to submit to; without it, let the\n    // browser go to /search as it did before.\n    if (index) {\n      e.preventDefault();\n      run();\n    }\n  });\n})();\n"],
  "mappings": "CAMC,UAAY,CACX,IAAI,KAAO,SAAS,cAAc,iBAAiB,EACnD,GAAI,CAAC,KAAM,OACX,IAAI,MAAQ,SAAS,eAAe,cAAc,EAC9C,MAAQ,SAAS,eAAe,SAAS,EACzC,KAAO,SAAS,eAAe,cAAc,EAC7C,QAAU,SAAS,eAAe,eAAe,EACjD,OAAS,SAAS,eAAe,cAAc,EAC/C,SAAW,SAAS,eAAe,cAAc,EACrD,GAAI,CAAC,OAAS,CAAC,OAAS,CAAC,KAAM,OAE/B,IAAI,OAAS,SAAS,cAAc,kCAAkC,EAGlE,MAAQ,SAAS,cAAc,kBAAkB,GAAK,SAAS,cAAc,eAAe,EAC5F,MAAQ,KACR,QAAU,KAEd,SAAS,MAAO,CAGd,OAAI,MAAc,QAAQ,QAAQ,KAAK,EACnC,UACJ,QAAU,MAAM,KAAK,QAAQ,KAAK,EAC/B,KAAK,SAAU,EAAG,CACjB,OAAO,EAAE,KAAK,CAChB,CAAC,EACA,KAAK,SAAU,KAAM,CACpB,aAAQ,KAAK,IAAI,SAAU,EAAG,CAC5B,IAAI,MAAQ,EAAE,EAAE,YAAY,EACxB,KAAO,EAAE,EAAI,KAAO,EAAE,GAAK,IAAM,KAAO,EAAE,GAAK,KAAK,YAAY,EACpE,MAAO,CACL,EAAG,EAAE,EACL,EAAG,EAAE,EACL,EAAG,EAAE,EACL,EAAG,EAAE,EACL,IAAK,IACL,MAAO,MAIP,WAAY,IAAM,MAAM,QAAQ,cAAe,GAAG,EAAE,KAAK,EAAI,IAC7D,SAAU,IAAM,IAAI,QAAQ,cAAe,GAAG,EAAE,KAAK,EAAI,GAC3D,CACF,CAAC,EACM,KACT,CAAC,EACA,MAAM,UAAY,CACjB,eAAU,KACH,IACT,CAAC,EACI,QACT,CAEA,SAAS,IAAI,KAAM,CAGjB,IAAI,KAAO,KAAK,QAAQ,GAAG,EAAI,GAAK,KAAO,SAAW,KACtD,MAAO,oDAAsD,KAAO,YACtE,CAEA,SAAS,MAAM,EAAG,MAAO,CAEvB,QADI,EAAI,EACC,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CACrC,IAAI,EAAI,MAAM,CAAC,EACX,IAAM,IAAM,EAAI,IAEpB,GAAI,EAAE,IAAI,QAAQ,CAAC,IAAM,GAAI,MAAO,GAChC,EAAE,WAAW,QAAQ,GAAG,EAAI,GAAI,GAAK,GAChC,EAAE,MAAM,QAAQ,CAAC,EAAI,KAAI,GAAK,GACnC,EAAE,SAAS,QAAQ,GAAG,EAAI,GAAI,GAAK,EAClC,GAAK,CACZ,CAEA,OAAI,EAAE,MAAM,QAAQ,MAAM,KAAK,GAAG,CAAC,IAAM,IAAG,GAAK,IAC1C,CACT,CAEA,SAAS,OAAO,KAAM,MAAO,CAC3B,KAAK,UAAY,KACd,IAAI,SAAU,EAAG,CAChB,MACE,qDACA,EAAE,EACF,MACC,EAAE,EAAI,0CAA4C,IAAI,EAAE,CAAC,EAAI,kCAAoC,IAClG,4DACA,EAAE,EACF,0CACC,EAAE,GAAK,IACR,yBAEJ,CAAC,EACA,KAAK,EAAE,EACV,QAAQ,YAAc,KAAK,OACvB,KAAK,QAAU,KAAK,SAAW,EAAI,WAAa,aAAe,SAAW,MAAQ,IAClF,GACJ,OAAO,OAAS,KAAK,SAAW,EAI5B,WAAU,SAAS,KAAO,aAAe,mBAAmB,KAAK,EAAI,gBAC3E,CAEA,SAAS,KAAK,GAAI,CAChB,MAAM,OAAS,CAAC,GACZ,SAAQ,OAAO,MAAM,QAAU,GAAK,OAAS,IAC7C,QAAO,MAAM,MAAM,QAAU,GAAK,OAAS,GACjD,CAEA,SAAS,KAAM,CACb,IAAI,MAAQ,MAAM,MAAM,KAAK,EACzB,MAAQ,MAAM,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAC3D,GAAI,CAAC,MAAM,OAAQ,CACjB,KAAK,EAAK,EACV,MACF,CACA,KAAK,EAAE,KAAK,SAAU,KAAM,CAC1B,GAAK,KAEL,SADI,KAAO,CAAC,EACH,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,IAAI,EAAI,MAAM,KAAK,CAAC,EAAG,KAAK,EACxB,EAAI,GAAG,KAAK,KAAK,CAAE,EAAG,KAAK,CAAC,EAAG,EAAG,CAAE,CAAC,CAC3C,CACA,KAAK,KAAK,SAAU,EAAG,EAAG,CACxB,OAAO,EAAE,EAAI,EAAE,CACjB,CAAC,EACD,OACE,KAAK,IAAI,SAAU,EAAG,CACpB,OAAO,EAAE,CACX,CAAC,EACD,KACF,EACA,KAAK,EAAI,EACX,CAAC,CACH,CAEA,IAAI,MACJ,MAAM,iBAAiB,QAAS,UAAY,CAC1C,aAAa,KAAK,EAClB,MAAQ,WAAW,IAAK,GAAG,CAC7B,CAAC,EACD,MAAM,iBAAiB,QAAS,IAAI,EACpC,MAAM,iBAAiB,UAAW,SAAU,EAAG,CACzC,EAAE,MAAQ,WACZ,MAAM,MAAQ,GACd,KAAK,EAAK,EAEd,CAAC,EACD,KAAK,iBAAiB,SAAU,SAAU,EAAG,CAGvC,QACF,EAAE,eAAe,EACjB,IAAI,EAER,CAAC,CACH,GAAG",
  "names": []
}
