{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/search-scope.js?rev=6"],
  "sourcesContent": ["/* search-scope.js \u2014 one query builder for every way into storefront search.\n\n   Shopify's product index includes the description body, and a plain query\n   also gets a broad \"related words\" expansion that can return most of the\n   catalogue for a single word. The `options[fields]` param is silently\n   ignored (on /search and on /search/suggest alike), but field-scoped `q`\n   syntax is honoured, so every entry point submits the same scoped form:\n\n     Legions    ->  (title:legions OR title:legion OR tag:legions OR tag:legion\n                     OR product_type:legions OR product_type:legion)\n     Punic Wars ->  (title:punic OR ...) AND (title:wars OR ...)\n\n   What the results page does NOT do (measured 2026-10-20): `*` wildcards and\n   options[prefix]=last have no effect on field-scoped terms, and there is no\n   typo tolerance \u2014 \"colos\", \"ceasar\" and \"legoin\" all find 0. So:\n     - each word carries its singular and plural forms (tags are exact:\n       tag:legion and tag:legions match different pieces);\n     - filler words (\"wall art\", \"print\", \"the\") are dropped, because every\n       word must match and \"legion wall art\" finds only the few pieces whose\n       text has all three words;\n     - typos and half-words are corrected by correct() below, with\n       /search/suggest, which IS typo- and prefix-tolerant: at submit time\n       when the dropdown already saw no exact match, otherwise on the\n       results page (\"Showing results for caesar (you searched ceasar)\").\n\n   snippets/search-query.liquid is the Liquid twin of build() (trending chips,\n   format chips, and the redirect that scopes a plain ?q= arriving from a\n   link). Change one, change the other \u2014 they must produce identical strings.\n   Without JS the form submits the raw term and the results page redirects. */\n(function () {\n  'use strict';\n\n  /* Pax (2026-10-23): the description (body) is searched too. Pax's\n     descriptions are the piece's history (people, places, battles, sources),\n     which shoppers search for, and every word must still match. COA left\n     body out because its generic descriptions matched most of the catalogue.\n     Metafields are not in Shopify's search index; story text lives in the\n     description as well. */\n  var FIELDS = ['title', 'tag', 'product_type', 'body'];\n  var FILLER = '|a|an|the|of|and|or|not|for|in|on|to|with|by|my|wall|art|arts|artwork|decor|print|prints|picture|pictures|painting|paintings|';\n  var SYNONYMS = { metal: 'aluminum', aluminium: 'aluminum' };\n  var MAX_WORDS = 6;\n\n  /* Format and sale chips on the results page append one of these. They are\n     written without parentheses so they can never be mistaken for a word\n     clause, which always opens with \"(\". */\n  var FILTERS = {\n    framed: ' AND product_type:framed',\n    canvas: ' AND product_type:canvas',\n    poster: ' AND product_type:poster',\n    aluminum: ' AND product_type:aluminum',\n    sale: ' AND tag:on-sale'\n  };\n\n  function trimEdges(w) {\n    // A leading \"-\" reads as negation to Shopify; quotes and dashes at either\n    // end are noise. Three passes, like the Liquid twin.\n    for (var i = 0; i < 3; i++) {\n      if (w.charAt(0) === '-' || w.charAt(0) === \"'\") w = w.slice(1);\n      var c = w.charAt(w.length - 1);\n      if (c === '-' || c === \"'\") w = w.slice(0, -1);\n    }\n    return w;\n  }\n\n  function words(raw) {\n    var all = [];\n    String(raw == null ? '' : raw).toLowerCase()\n      .replace(/[\u2018\u2019]/g, \"'\")\n      .replace(/[()\"\u201C\u201D*~^,.!?;:&\\\\]/g, ' ')\n      .split(/\\s+/)\n      .forEach(function (w) {\n        if (w.slice(-2) === \"'s\") w = w.slice(0, -2);\n        w = trimEdges(w);\n        if (w) all.push(w);\n      });\n    var kept = all.filter(function (w) { return FILLER.indexOf('|' + w + '|') === -1; });\n    return (kept.length ? kept : all).slice(0, MAX_WORDS);\n  }\n\n  /* The word as typed first (the results page reads it back from there),\n     then at most two other singular/plural spellings. Junk spellings such as\n     \"hors\" for \"horses\" cost nothing: a term only matches a whole token. */\n  function forms(w) {\n    var out = [w];\n    var n = w.length;\n    if (/^[0-9]+$/.test(w) || n < 3) return out;\n    if (w.slice(-3) === 'ies' && n > 4) out.push(w.slice(0, -3) + 'y');\n    else if (w.slice(-2) === 'es' && n > 4) out.push(w.slice(0, -1), w.slice(0, -2));\n    else if (w.slice(-2) === 'ss') out.push(w + 'es');\n    else if (w.slice(-1) === 's' && n > 3) out.push(w.slice(0, -1));\n    else if (w.slice(-1) === 'y') out.push(w + 's', w.slice(0, -1) + 'ies');\n    else if (w.slice(-1) !== 's') out.push(w + 's');\n    return out;\n  }\n\n  /* Raw shopper text -> scoped query. Optional filter keys from FILTERS.\n     Returns '' when nothing usable is left, and callers then fall back to the\n     raw term rather than submitting a broken query. */\n  function build(raw, filters) {\n    var ws = words(raw);\n    if (!ws.length) return '';\n    var q = ws.map(function (w) {\n      var f = forms(SYNONYMS[w] || w);\n      var terms = [];\n      FIELDS.forEach(function (field) { f.forEach(function (x) { terms.push(field + ':' + x); }); });\n      return '(' + terms.join(' OR ') + ')';\n    }).join(' AND ');\n    (filters || []).forEach(function (k) { if (FILTERS[k]) q += FILTERS[k]; });\n    return q;\n  }\n\n  /* Text the shopper wrote with search syntax of their own is passed through\n     untouched: re-scoping it would corrupt it. Syntax means a field prefix at\n     the start of a word (after a space, \"(\", \"-\" or a quote; any case), or\n     parentheses together with an upper-case AND / OR / NOT. A plain colon\n     (\"Caesar: The Ides of March\", pasted from a title) is not syntax, and\n     neither are capitals alone: an all-caps title such as \"SENATE AND PEOPLE\n     OF ROME\" used to skip the scoping and list the whole catalogue.\n     sections/main-search.liquid applies the same rule (is_syntax) to a ?q=\n     arriving from a link; keep the two in step. */\n  var SYNTAX_FIELDS = ['title', 'tag', 'product_type', 'vendor', 'body', 'sku'];\n  function isAlreadyScoped(raw) {\n    raw = String(raw == null ? '' : raw);\n    var probe = ' ' + raw.toLowerCase().replace(/[(\\-\"]/g, ' ');\n    if (SYNTAX_FIELDS.some(function (f) { return probe.indexOf(' ' + f + ':') !== -1; })) return true;\n    if (!/[()]/.test(raw)) return false;\n    return / (AND|OR|NOT) /.test(' ' + raw.replace(/[()]/g, ' ') + ' ');\n  }\n\n  /* Scoped query -> the words to show the shopper (twin of the unwind mode of\n     snippets/search-query.liquid). */\n  function unwind(q) {\n    q = String(q || '');\n    if (q.indexOf('title:') === -1) return q;\n    Object.keys(FILTERS).forEach(function (k) { q = q.split(FILTERS[k]).join(''); });\n    return q.replace(/[()]/g, '').split(' AND ').map(function (clause) {\n      return clause.split(' OR ')[0].split(':').pop().replace(/\\*/g, '').trim();\n    }).join(' ').trim();\n  }\n\n  function searchRoute() {\n    var t = window.theme || {};\n    return (t.routes && t.routes.search) || '/search';\n  }\n\n  /* The results-page URL for a raw term \u2014 what the form, the dropdown's\n     \"See all\", recent searches and suggestion chips all link to. */\n  function url(raw) {\n    var q = isAlreadyScoped(raw) ? raw : (build(raw) || raw);\n    return searchRoute() + '?q=' + encodeURIComponent(q) + '&type=product';\n  }\n\n  /* ---- recent searches (this browser only) ---- */\n  var RECENT_KEY = 'pra-recent-searches';\n  // Until 2026-10-20 the results page saved Shopify's HTML-escaped terms\n  // (\"caesar&#39;s legions\"); read those back as the shopper typed them.\n  function unescapeOld(s) {\n    return s.replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&');\n  }\n  var recent = {\n    get: function () {\n      try {\n        var list = JSON.parse(localStorage.getItem(RECENT_KEY) || '[]');\n        return Array.isArray(list) ? list.filter(function (s) { return typeof s === 'string' && s; }).map(unescapeOld).slice(0, 5) : [];\n      } catch (e) { return []; }\n    },\n    add: function (term) {\n      term = String(term || '').trim();\n      if (term.length < 2 || term.length > 60) return;\n      var lower = term.toLowerCase();\n      var list = recent.get().filter(function (s) { return s.toLowerCase() !== lower; });\n      list.unshift(term);\n      try { localStorage.setItem(RECENT_KEY, JSON.stringify(list.slice(0, 5))); } catch (e) {}\n    },\n    clear: function () { try { localStorage.removeItem(RECENT_KEY); } catch (e) {} }\n  };\n\n  /* ---- spelling correction ----\n     The scoped search has no typo tolerance; /search/suggest has. correct()\n     finds the term a misspelled or half-typed search meant (\"ceasar\" ->\n     caesar, \"legoin\" -> legion, \"colos\" -> colosseum) and only returns one\n     whose own scoped search has results. Used at submit time (below) and by\n     the results page when a link or a fast Enter lands on nothing. */\n\n  // Optimal-string-alignment distance: \"legoin\" -> \"legion\" is 1 (a swap).\n  function distance(a, b) {\n    var d = [], i, j;\n    for (i = 0; i <= a.length; i++) { d[i] = [i]; }\n    for (j = 0; j <= b.length; j++) { d[0][j] = j; }\n    for (i = 1; i <= a.length; i++) {\n      for (j = 1; j <= b.length; j++) {\n        var cost = a.charAt(i - 1) === b.charAt(j - 1) ? 0 : 1;\n        d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);\n        if (i > 1 && j > 1 && a.charAt(i - 1) === b.charAt(j - 2) && a.charAt(i - 2) === b.charAt(j - 1)) {\n          d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n        }\n      }\n    }\n    return d[a.length][b.length];\n  }\n  function allowed(w) { return w.length <= 4 ? 1 : (w.length <= 8 ? 2 : 3); }\n  // A typed word \"is\" a candidate word when it is a close misspelling of it,\n  // or the start of it (a half-typed \"colos\" for \"colosseum\").\n  function near(w, c) { return (w.length >= 3 && c.indexOf(w) === 0) || distance(w, c) <= allowed(w); }\n  function tokens(s) {\n    return String(s || '').toLowerCase().replace(/[\u2018\u2019]/g, \"'\").split(/[^a-z0-9'-]+/)\n      .map(function (t) { return t.replace(/'s$/, '').replace(/^[-']+|[-']+$/g, ''); })\n      .filter(function (t) { return t.length > 1; });\n  }\n\n  /* Shopify's own corrections only count when every typed word is close to\n     one of their words, so an unrelated \"popular\" suggestion can't hijack a\n     search. */\n  function closeEnough(raw, cand) {\n    var cw = tokens(cand);\n    return words(raw).every(function (w) { return cw.some(function (c) { return near(w, c); }); });\n  }\n\n  /* No usable suggestion (\"legoin\" got none): fix each word against the words\n     in the titles Shopify's fuzzy search did return. */\n  function fixFromTitles(raw, titles) {\n    var freq = {};\n    titles.forEach(function (t) { tokens(t).forEach(function (k) { freq[k] = (freq[k] || 0) + 1; }); });\n    var vocab = Object.keys(freq);\n    var changed = false;\n    var fixed = words(raw).map(function (w) {\n      if (forms(w).some(function (f) { return freq[f]; })) return w;\n      var best = null, bestScore = Infinity;\n      vocab.forEach(function (k) {\n        if (!near(w, k)) return;\n        var score = (k.indexOf(w) === 0 ? 0 : distance(w, k)) * 100 - freq[k];\n        if (score < bestScore) { best = k; bestScore = score; }\n      });\n      if (best) { changed = true; return best; }\n      return w;\n    });\n    return changed ? fixed.join(' ') : null;\n  }\n\n  var counts = {};\n  function count(q) {\n    if (!counts[q]) {\n      counts[q] = fetch(searchRoute() + '?view=count&type=product&q=' + encodeURIComponent(q))\n        .then(function (r) { return r.ok ? r.text() : ''; })\n        .then(function (t) { var n = parseInt(String(t).trim(), 10); return isNaN(n) ? null : n; })\n        .catch(function () { return null; });\n    }\n    return counts[q];\n  }\n\n  /* /search/suggest, cached per URL for the page's lifetime. Shared with\n     predictive-search.js, so a correction at submit time reuses the answer\n     the dropdown already has instead of asking again. */\n  var suggestCache = {};\n  function suggest(q, types, signal) {\n    var t = window.theme || {};\n    var url = ((t.routes && t.routes.predictiveSearch) || '/search/suggest') +\n      '.json?q=' + encodeURIComponent(q) + '&resources[type]=' + types +\n      '&resources[limit]=6&resources[limit_scope]=each&resources[options][unavailable_products]=last';\n    if (suggestCache[url]) return Promise.resolve(suggestCache[url]);\n    return fetch(url, signal ? { signal: signal } : undefined)\n      .then(function (r) { return r.json(); })\n      .then(function (data) {\n        var r = (data.resources && data.resources.results) || {};\n        var out = { products: r.products || [], collections: r.collections || [], queries: r.queries || [] };\n        suggestCache[url] = out;\n        return out;\n      });\n  }\n\n  function correct(raw) {\n    return suggest(raw, 'query,product,collection').then(function (res) {\n      var lower = String(raw).trim().toLowerCase();\n      var cands = [];\n      function add(c) {\n        c = String(c || '').trim().toLowerCase();\n        if (c && c !== lower && cands.indexOf(c) === -1) cands.push(c);\n      }\n      (res.queries || []).forEach(function (q) { if (closeEnough(raw, q.text)) add(q.text); });\n      var titles = (res.products || []).map(function (p) { return p.title; })\n        .concat((res.collections || []).map(function (c) { return c.title; }));\n      add(fixFromTitles(raw, titles));\n      cands = cands.slice(0, 4);\n      if (!cands.length) return null;\n      // First candidate (in Shopify's order) whose own results aren't empty.\n      return Promise.all(cands.map(function (c) { return count(build(c)); })).then(function (ns) {\n        for (var i = 0; i < cands.length; i++) { if (ns[i] > 0) return cands[i]; }\n        return null;\n      });\n    });\n  }\n\n  function scopeForm(form) {\n    // Back from the results page (bfcache): the form must not stay \"busy\".\n    window.addEventListener('pageshow', function () { form.removeAttribute('aria-busy'); });\n    form.addEventListener('submit', function (e) {\n      var input = form.querySelector('input[name=\"q\"]');\n      if (!input) return;\n      // Products only, as the results grid renders nothing else. Without it\n      // the header bar counted pages and articles (\"20 results\", 19 cards).\n      if (!form.querySelector('input[name=\"type\"]')) {\n        var t = document.createElement('input');\n        t.type = 'hidden'; t.name = 'type'; t.value = 'product';\n        form.appendChild(t);\n      }\n      var raw = input.value.trim();\n      if (!raw || isAlreadyScoped(raw)) return;\n      /* The suggestions already showed that these exact words find nothing\n         (predictive-search.js marks the input): look for the correction\n         here and go straight to it, instead of loading an empty results page\n         that would do the same and then redirect (3.5s for one typo). */\n      if (input.getAttribute('data-no-exact') === raw.toLowerCase() && window.fetch) {\n        e.preventDefault();\n        if (form.getAttribute('aria-busy') === 'true') return;\n        form.setAttribute('aria-busy', 'true');\n        var gone = false;\n        var go = function (href) { if (!gone) { gone = true; window.location.href = href; } };\n        setTimeout(function () { go(url(raw)); }, 2500);\n        correct(raw).then(function (fix) {\n          go(fix ? url(fix) + '&corrected_from=' + encodeURIComponent(raw) : url(raw) + '&nocorrect=1');\n        }, function () { go(url(raw)); });\n        return;\n      }\n      var scoped = build(raw);\n      if (!scoped) return;\n      input.value = scoped;\n      // The form serialises synchronously, so putting the human term back on\n      // the next tick keeps the raw text in the box if the page is restored\n      // from bfcache instead of leaving the scoped expression on screen.\n      setTimeout(function () { input.value = raw; }, 0);\n    });\n  }\n\n  function init() {\n    document.querySelectorAll('form[role=\"search\"]').forEach(scopeForm);\n  }\n\n  window.theme = window.theme || {};\n  window.theme.searchScope = {\n    build: build, words: words, forms: forms, isAlreadyScoped: isAlreadyScoped,\n    unwind: unwind, url: url, filters: FILTERS, recent: recent,\n    correct: correct, count: count, tokens: tokens, suggest: suggest\n  };\n\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); }\n  else { init(); }\n})();\n"],
  "mappings": "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",
  "names": ["url"]
}
