{
  "version": 3,
  "sources": ["/cdn/shop/t/5/assets/bkv-catalog.js?nocache=1793812312381"],
  "sourcesContent": ["import { formatMoney } from '@theme/money-formatting';\n\n/**\n * \u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u0437 \u0444\u0430\u0441\u0435\u0442\u0430\u043C\u0438 \u0437\u0430 \u0456\u043D\u0434\u0435\u043A\u0441\u043E\u043C (bookva.cz).\n *\n * \u0427\u043E\u043C\u0443 \u043D\u0435 \u0448\u0442\u0430\u0442\u043D\u0438\u0439 \u043F\u043E\u0448\u0443\u043A \u0456 \u043D\u0435 Storefront API \u2014 \u0434\u0438\u0432. local_scripts/bk-catalog-index.mjs.\n * \u041A\u043E\u0440\u043E\u0442\u043A\u043E: \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u043D\u0438\u0439 \u043F\u043E\u0448\u0443\u043A Shopify \u043E\u0431\u0440\u0456\u0437\u0430\u0454 \u0432\u0438\u0434\u0430\u0447\u0443 \u0434\u043E 1000 \u0456 \u0433\u0443\u0431\u0438\u0442\u044C \u0442\u043E\u0432\u0430\u0440\u0438,\n * \u043A\u043E\u043B\u0435\u043A\u0446\u0456\u0457 \u043F\u043E\u043D\u0430\u0434 5000 \u043B\u0438\u0448\u0430\u044E\u0442\u044C\u0441\u044F \u0431\u0435\u0437 \u0444\u0430\u0441\u0435\u0442\u0456\u0432, \u043F\u0430\u0433\u0456\u043D\u0430\u0446\u0456\u044F Storefront `search`\n * \u043D\u0435\u0434\u0435\u0442\u0435\u0440\u043C\u0456\u043D\u043E\u0432\u0430\u043D\u0430, \u0430 \u0442\u043E\u0432\u0430\u0440\u0438 \u0432 \u043D\u0430\u044F\u0432\u043D\u043E\u0441\u0442\u0456 \u0436\u043E\u0434\u043D\u0435 \u0441\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0435\u0440\u0448\u0438\u043C\u0438 \u043D\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u044C.\n *\n * \u0422\u0443\u0442 \u0443\u0441\u0435 \u0440\u0430\u0445\u0443\u0454\u0442\u044C\u0441\u044F \u0437 \u0456\u043D\u0434\u0435\u043A\u0441\u0443 `bk-catalog-index.json` (Files): \u0444\u0456\u043B\u044C\u0442\u0440, \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0438\n * \u0444\u0430\u0441\u0435\u0442\u0456\u0432, \u0441\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F (\u0432 \u043D\u0430\u044F\u0432\u043D\u043E\u0441\u0442\u0456 \u2014 \u0437\u0430\u0432\u0436\u0434\u0438 \u043F\u0435\u0440\u0448\u0438\u043C\u0438), \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438. \u0420\u043E\u0437\u043C\u0456\u0442\u043A\u0430 \u0444\u0430\u0441\u0435\u0442\u0456\u0432,\n * \u0447\u0438\u043F\u0456\u0432 \u0456 \u043F\u0430\u0433\u0456\u043D\u0430\u0446\u0456\u0457 \u2014 \u0442\u0430 \u0441\u0430\u043C\u0430, \u0449\u043E \u0432 `bkv-facet*.liquid` \u0456 `pagination-controls`,\n * \u0442\u043E\u043C\u0443 \u0441\u0442\u0438\u043B\u0456, `bkv-facets.js` \u0456 \u0430\u043D\u0430\u043B\u0456\u0442\u0438\u043A\u0430 \u043F\u0440\u0430\u0446\u044E\u044E\u0442\u044C \u0431\u0435\u0437 \u0437\u043C\u0456\u043D. \u041A\u0430\u0440\u0442\u043A\u0438 \u0440\u0435\u043D\u0434\u0435\u0440\u0438\u0442\u044C\n * \u0442\u0435\u043C\u0430: `/search?q=id:\u2026&section_id=bkv-catalog-cards`.\n *\n * \u0420\u0435\u0436\u0438\u043C\u0438 (`config.mode`, \u0432\u0438\u0440\u0456\u0448\u0443\u0454 Liquid):\n *   all         `q=*` \u0430\u0431\u043E \u043A\u043E\u043B\u0435\u043A\u0446\u0456\u044F \u00AB\u0432\u0435\u0441\u044C \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u00BB\n *   collection  \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F \u0437\u0430 \u0442\u0435\u0433\u043E\u043C `cat:<handle>`\n *   text        \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u0438\u0439 \u0437\u0430\u043F\u0438\u0442. \u041E\u0431\u0441\u044F\u0433 \u2014 id \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u043D\u043E\u0433\u043E \u043F\u043E\u0448\u0443\u043A\u0443 \u0432 \u0439\u043E\u0433\u043E \u043F\u043E\u0440\u044F\u0434\u043A\u0443\n *               (\u0441\u0435\u043A\u0446\u0456\u044F bkv-search-ids), \u0434\u0430\u043B\u0456 \u044F\u043A \u0441\u043A\u0440\u0456\u0437\u044C: \u0443 \u043D\u0430\u044F\u0432\u043D\u043E\u0441\u0442\u0456 \u043F\u0435\u0440\u0448\u0438\u043C\u0438.\n *               \u0412\u0438\u0449\u0435 \u0437\u0430 \u0432\u0441\u0435 \u2014 \u0442\u043E\u0432\u0430\u0440\u0438 \u0437 \u0443\u0441\u0456\u043C\u0430 \u0441\u043B\u043E\u0432\u0430\u043C\u0438 \u0437\u0430\u043F\u0438\u0442\u0443 \u0432 \u043D\u0430\u0437\u0432\u0456 (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u0438\u0439\n *               \u0456\u043D\u0434\u0435\u043A\u0441), \u0437\u043E\u043A\u0440\u0435\u043C\u0430 \u0442\u0456, \u044F\u043A\u0438\u0445 \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430 \u043D\u0435 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u043B\u0430.\n *               `wide` \u2014 \u0447\u0435\u0441\u044C\u043A\u0438\u0439 \u043F\u043E\u0448\u0443\u043A \u0443\u043F\u0435\u0440\u0441\u044F \u0432 1000: \u0441\u043F\u0435\u0440\u0448\u0443 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u0438\u0439 \u0456\u043D\u0434\u0435\u043A\u0441, \u0430\n *               \u044F\u043A\u0449\u043E \u0432\u0456\u043D \u0437\u043D\u0430\u0439\u0434\u0435 \u043C\u0435\u043D\u0448\u0435, \u043D\u0456\u0436 \u0441\u0442\u0435\u043B\u044F, \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0456\u0448\u0430 \u2014 \u0431\u0435\u0440\u0435\u043C\u043E \u0457\u0457.\n *               \u0428\u0442\u0430\u0442\u043D\u0430 \u0432\u0438\u0434\u0430\u0447\u0430 \u043B\u0435\u0436\u0438\u0442\u044C \u0443 \u0440\u043E\u0437\u043C\u0456\u0442\u0446\u0456 \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u043E\u044E (`[data-bkv-native]`)\n *               \u0456 \u043F\u043E\u043A\u0430\u0437\u0443\u0454\u0442\u044C\u0441\u044F, \u044F\u043A\u0449\u043E \u0441\u043A\u0440\u0438\u043F\u0442 \u0432\u0456\u0434\u043C\u043E\u0432\u0438\u0432\u0441\u044F.\n *\n * \u0429\u043E \u0432\u0441\u0442\u0438\u0433\u0430\u0454 \u0437\u0440\u043E\u0431\u0438\u0442\u0438 Liquid \u0449\u0435 \u0434\u043E \u0446\u044C\u043E\u0433\u043E \u0441\u043A\u0440\u0438\u043F\u0442\u0430 \u2014 \u0434\u0438\u0432. bkv-catalog-skeleton:\n * \u043F\u0435\u0440\u0448\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0431\u0435\u0437 \u0444\u0456\u043B\u044C\u0442\u0440\u0456\u0432 \u0443\u0436\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0430 (\u043C\u0435\u0442\u0430\u043F\u043E\u043B\u0435 \u043A\u043E\u043B\u0435\u043A\u0446\u0456\u0457), \u0456\u043D\u0430\u043A\u0448\u0435 \u043D\u0430 \u0457\u0457\n * \u043C\u0456\u0441\u0446\u0456 \u0441\u043A\u0435\u043B\u0435\u0442\u043E\u043D\u0438, \u0430 \u0456\u043D\u0434\u0435\u043A\u0441 \u043F\u043E\u0447\u0438\u043D\u0430\u0454 \u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438\u0441\u044C \u0437 inline-\u043A\u043E\u0434\u0443 \u0432 bkv-catalog-config.\n */\n\n/** \u0421\u0442\u0456\u043B\u044C\u043A\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u044C \u0444\u0430\u0441\u0435\u0442\u0430 \u0432\u0456\u0434\u0434\u0430\u0454 \u0456 Shopify \u2014 \u0431\u0456\u043B\u044C\u0448\u0435 \u0432 DOM \u043D\u0435 \u0442\u044F\u0433\u043D\u0435\u043C\u043E. */\nconst MAX_FACET_VALUES = 100;\n\n/**\n * \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u0430 \u0440\u043E\u0437\u0431\u0456\u0436\u043D\u0456\u0441\u0442\u044C \u043C\u0456\u0436 \u0456\u043D\u0434\u0435\u043A\u0441\u043E\u043C \u0456 `collection.all_products_count`. \u0411\u0456\u043B\u044C\u0448\u0430 \u2014\n * \u043E\u0437\u043D\u0430\u043A\u0430, \u0449\u043E \u0456\u043D\u0434\u0435\u043A\u0441 \u0437\u0430\u0441\u0442\u0430\u0440\u0456\u0432 \u0430\u0431\u043E \u043A\u043E\u043B\u0435\u043A\u0446\u0456\u044F \u0437\u0456\u0431\u0440\u0430\u043D\u0430 \u043D\u0435 \u0437\u0430 \u0442\u0435\u0433\u043E\u043C `cat:`, \u0456 \u0442\u043E\u0434\u0456\n * \u043A\u0440\u0430\u0449\u0435 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443, \u043D\u0456\u0436 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043A\u0430\u0442\u0430\u043B\u043E\u0433.\n */\nconst COUNT_TOLERANCE = 0.02;\n/** \u0424\u0430\u0441\u0435\u0442 \u0430\u0432\u0442\u043E\u0440\u0430 \u2014 \u0443 \u043D\u044C\u043E\u0433\u043E \u043E\u043A\u0440\u0435\u043C\u0438\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u0437\u043D\u0430\u0447\u0435\u043D\u044C (author_values_sort). */\nconst AUTHOR_PARAM = 'filter.p.m.book.author';\n\n/** \u0421\u043A\u0456\u043B\u044C\u043A\u0438 id \u0437\u0430 \u043E\u0434\u0438\u043D \u0437\u0430\u043F\u0438\u0442 \u043A\u0430\u0440\u0442\u043E\u043A \u2014 \u043C\u0430\u0454 \u0437\u0431\u0456\u0433\u0430\u0442\u0438\u0441\u044F \u0437 `paginate` \u0443 bkv-catalog-cards. */\nconst CARDS_CHUNK = 50;\n\n/** \u0421\u0442\u0435\u043B\u044F \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u043D\u043E\u0433\u043E \u043F\u043E\u0448\u0443\u043A\u0443: \u0434\u0430\u043B\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A bkv-search-ids \u043D\u0435 \u043F\u0438\u0442\u0430\u0454\u043C\u043E. */\nconst SEMANTIC_CAP = 1000;\n\n/** \u041F\u0456\u0434\u043F\u0438\u0441\u0438 \u0444\u0430\u0441\u0435\u0442\u0456\u0432 \u0437\u043C\u0456\u043D\u044E\u044E\u0442\u044C\u0441\u044F \u0440\u0456\u0434\u043A\u043E; \u0434\u0435\u043D\u044C \u0443 \u043A\u0435\u0448\u0456 \u2014 \u043E\u0434\u0438\u043D \u0437\u0430\u043F\u0438\u0442 \u043D\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440. */\nconst LABELS_TTL_MS = 24 * 60 * 60 * 1000;\n\nconst PARAM_AVAILABILITY = 'filter.v.availability';\nconst PARAM_PRICE = 'filter.v.price';\nconst PARAM_PRICE_GTE = 'filter.v.price.gte';\nconst PARAM_PRICE_LTE = 'filter.v.price.lte';\n\nconst root = /** @type {HTMLElement | null} */ (document.querySelector('.bkv-search[data-bkv-catalog]'));\nconst configElement = root?.querySelector('script[data-bkv-catalog-config]');\n\nif (root && configElement) {\n  init(root, JSON.parse(configElement.textContent ?? '{}'));\n}\n\n/**\n * \u041D\u043E\u0440\u043C\u0430\u043B\u0456\u0437\u0430\u0446\u0456\u044F \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u043E\u0433\u043E \u043F\u043E\u0448\u0443\u043A\u0443. \u26A0 \u0422\u0430 \u0441\u0430\u043C\u0430 \u0444\u0443\u043D\u043A\u0446\u0456\u044F \u0454 \u0432\n * local_scripts/bk-catalog-index.mjs \u0456 bk-header-search.js \u2014 \u0437\u0430\u043F\u0438\u0442 \u0456 \u0456\u043D\u0434\u0435\u043A\u0441 \u043C\u0430\u044E\u0442\u044C \u043D\u043E\u0440\u043C\u0430\u043B\u0456\u0437\u0443\u0432\u0430\u0442\u0438\u0441\u044F\n * \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u043E, \u0437\u043C\u0456\u043D\u044E\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0442\u0440\u0438 \u0440\u0430\u0437\u043E\u043C.\n * @param {string} value\n */\nfunction normalizeText(value) {\n  return value\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(/\\p{M}/gu, '')\n    .replace(/[^\\p{L}\\p{N}]+/gu, ' ')\n    .trim();\n}\n\n/**\n * @param {HTMLElement} root\n * @param {any} config\n */\nasync function init(root, config) {\n  /** @type {string | null} URL, \u0437\u0430\u043F\u0438\u0442\u0430\u043D\u0438\u0439 \u0434\u043E \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0456 \u0456\u043D\u0434\u0435\u043A\u0441\u0443. */\n  let queuedUrl = null;\n  /** @type {((url: string) => void) | null} */\n  let navigate = null;\n  let stopped = false;\n\n  const go = (/** @type {string} */ url) => (navigate ? navigate(url) : (queuedUrl = url));\n\n  // \u041F\u0435\u0440\u0435\u0445\u043E\u043F\u043B\u044E\u0454\u043C\u043E, \u0449\u043E\u0439\u043D\u043E `facets-form-component` \u0432\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E, \u0430\u043B\u0435 \u0440\u0435\u043D\u0434\u0435\u0440 \u043D\u0430 \u0446\u0435\n  // \u043D\u0435 \u0447\u0435\u043A\u0430\u0454: facets.js \u043F\u043E\u0442\u0440\u0456\u0431\u0435\u043D \u043B\u0438\u0448\u0435 \u0434\u043B\u044F \u043A\u043B\u0456\u043A\u0456\u0432, \u0430 \u043D\u0435 \u0434\u043B\u044F \u043F\u0435\u0440\u0448\u043E\u0433\u043E \u043C\u0430\u043B\u044E\u0432\u0430\u043D\u043D\u044F.\n  const forms = /** @type {any[]} */ (Array.from(root.querySelectorAll('facets-form-component')));\n  /** @type {Map<any, { updateFilters: Function, updateFiltersByURL: Function }>} */\n  const originals = new Map();\n  customElements.whenDefined('facets-form-component').then(() => {\n    if (stopped) return;\n    for (const form of forms) {\n      originals.set(form, { updateFilters: form.updateFilters, updateFiltersByURL: form.updateFiltersByURL });\n      form.updateFilters = () => go(urlFromForm(form));\n      form.updateFiltersByURL = (/** @type {string} */ url) => go(url);\n    }\n  });\n\n  /** @param {string} reason */\n  const restore = (reason) => {\n    stopped = true;\n    root.dataset.bkvCatalog = 'off';\n    console.warn(`[bkv-catalog] \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430: ${reason}`);\n\n    if (config.mode === 'text') {\n      revealNative(root);\n      // \u0428\u0442\u0430\u0442\u043D\u0430 \u043F\u0435\u0440\u0435\u043C\u0430\u043B\u044C\u043E\u0432\u043A\u0430 \u0441\u0435\u043A\u0446\u0456\u0457 \u0437\u043D\u043E\u0432\u0443 \u043F\u0440\u0438\u0439\u0448\u043B\u0430 \u0431 \u0456\u0437 \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u043E\u044E \u0432\u0438\u0434\u0430\u0447\u0435\u044E \u2014\n      // \u0434\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u0437\u0430\u043F\u0438\u0442\u0443 \u0444\u0456\u043B\u044C\u0442\u0440\u0438 \u0439\u0434\u0443\u0442\u044C \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u0438\u043C \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u043E\u043C.\n      for (const form of forms) {\n        form.updateFilters = () => location.assign(urlFromForm(form));\n        form.updateFiltersByURL = (/** @type {string} */ url) => location.assign(url);\n      }\n    } else {\n      for (const [form, o] of originals) {\n        form.updateFilters = o.updateFilters;\n        form.updateFiltersByURL = o.updateFiltersByURL;\n      }\n      showUnavailable(root, config);\n    }\n    if (queuedUrl) location.assign(queuedUrl);\n  };\n\n  const wide = config.mode === 'text' && config.wide;\n  // \u0417\u0432\u0438\u0447\u0430\u0439\u043D\u043E\u043C\u0443 \u0437\u0430\u043F\u0438\u0442\u0443 \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430 \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0430 \u043D\u0430\u043F\u0435\u0432\u043D\u043E \u2014 \u043F\u0438\u0442\u0430\u0454\u043C\u043E \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u044C\u043D\u043E \u0437 \u0456\u043D\u0434\u0435\u043A\u0441\u043E\u043C.\n  const semantic = config.mode === 'text' && !wide ? loadSemantic(config) : null;\n  semantic?.catch(() => {});\n  // \u0422\u0435\u043A\u0441\u0442\u043E\u0432\u0438\u0439 \u0456\u043D\u0434\u0435\u043A\u0441 \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0446\u0456 \u2014 \u043B\u0438\u0448\u0435 \u0434\u043B\u044F \u0437\u0431\u0456\u0433\u0456\u0432 \u0443 \u043D\u0430\u0437\u0432\u0456: \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0432\u0441\u044F, \u0442\u043E \u0439 \u0431\u0435\u0437 \u043D\u0438\u0445.\n  const titles = semantic ? early('text', config.textUrl).catch(() => null) : null;\n\n  let index;\n  let labels;\n  let text = null;\n  try {\n    [index, labels, text] = await Promise.all([\n      early('index', config.indexUrl),\n      loadLabels(config),\n      wide ? early('text', config.textUrl) : null,\n    ]);\n  } catch (error) {\n    restore(`\u0456\u043D\u0434\u0435\u043A\u0441 \u0430\u0431\u043E \u043F\u0456\u0434\u043F\u0438\u0441\u0438 \u0444\u0430\u0441\u0435\u0442\u0456\u0432 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u043B\u0438\u0441\u044C (${error})`);\n    return;\n  }\n  if (index.v !== 1) {\n    restore(`\u0456\u043D\u0434\u0435\u043A\u0441 \u0432\u0435\u0440\u0441\u0456\u0457 ${index.v}`);\n    return;\n  }\n\n  let catalog = wide ? createCatalog(index, config, labels, text, null) : null;\n  if (config.mode === 'text' && (catalog === null || typeof catalog === 'string')) {\n    if (catalog) console.info(`[bkv-catalog] \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430: ${catalog}`);\n    try {\n      const ids = await (semantic ?? loadSemantic(config));\n      catalog = createCatalog(index, config, labels, wide ? text : await titles, ids);\n    } catch (error) {\n      restore(`id \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u043D\u043E\u0433\u043E \u043F\u043E\u0448\u0443\u043A\u0443 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u043B\u0438\u0441\u044C (${error})`);\n      return;\n    }\n  }\n  catalog ??= createCatalog(index, config, labels, null, null);\n  if (typeof catalog === 'string') {\n    restore(catalog);\n    return;\n  }\n\n  // \u0414\u0430\u043B\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0442\u043E\u0447\u043D\u043E \u043D\u0430\u0448\u0430: \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u0430 \u0448\u0442\u0430\u0442\u043D\u0430 \u0432\u0438\u0434\u0430\u0447\u0430 \u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0435 \u0437\u043D\u0430\u0434\u043E\u0431\u0438\u0442\u044C\u0441\u044F.\n  for (const node of root.querySelectorAll('[data-bkv-native]')) node.remove();\n\n  let token = 0;\n  navigate = (url) => {\n    history.pushState({ bkvCatalog: true }, '', url);\n    render(url);\n  };\n\n  window.addEventListener('popstate', () => render(location.href));\n\n  root.addEventListener('click', (event) => {\n    if (!(event.target instanceof Element)) return;\n    const link = event.target.closest('.bkv-results .pagination a');\n    if (!(link instanceof HTMLAnchorElement)) return;\n    if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0) return;\n    event.preventDefault();\n    navigate?.(link.href);\n    root.querySelector('.bkv-search__main')?.scrollIntoView({ block: 'start' });\n  });\n\n  // \u0427\u0435\u043A\u0431\u043E\u043A\u0441\u0438, \u044F\u043A\u0456 \u043C\u0430\u043B\u044E\u0454 \u0446\u0435\u0439 \u0441\u043A\u0440\u0438\u043F\u0442, \u043D\u0435 \u043C\u0430\u044E\u0442\u044C `on:change` \u2014 \u0434\u0435\u043A\u043B\u0430\u0440\u0430\u0442\u0438\u0432\u043D\u0456\n  // \u043E\u0431\u0440\u043E\u0431\u043D\u0438\u043A\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0456\u0432 Horizon \u043D\u0430 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0443 \u043F\u0456\u0437\u043D\u0456\u0448\u0435 \u0440\u043E\u0437\u043C\u0456\u0442\u043A\u0443 \u043D\u0435\n  // \u0440\u043E\u0437\u0440\u0430\u0445\u043E\u0432\u0430\u043D\u0456. \u0417\u043C\u0456\u043D\u0443 \u043B\u043E\u0432\u0438\u043C\u043E \u0442\u0443\u0442 \u0456 \u0432\u0456\u0434\u043F\u0440\u0430\u0432\u043B\u044F\u0454\u043C\u043E \u0443 \u0444\u043E\u0440\u043C\u0443, \u0434\u043E \u044F\u043A\u043E\u0457 \u043D\u0430\u043B\u0435\u0436\u0438\u0442\u044C \u043F\u043E\u043B\u0435.\n  root.addEventListener('change', (event) => {\n    const input = event.target;\n    if (!(input instanceof HTMLInputElement) || !input.classList.contains('bkv-facet__checkbox')) return;\n    if (input.closest('facet-inputs-component[on\\\\:change]')) return;\n    const form = input.closest('facets-form-component') ?? forms[0];\n    go(urlFromForm(form));\n  });\n\n  /** @param {string} url */\n  async function render(url) {\n    const current = ++token;\n    const results = root.querySelector('.bkv-results');\n    results?.classList.add('bkv-results--busy');\n    results?.setAttribute('aria-busy', 'true');\n\n    const view = catalog.query(new URL(url, location.origin));\n    renderChrome(root, config, view);\n\n    // \u041F\u0435\u0440\u0448\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0437 \u043C\u0435\u0442\u0430\u043F\u043E\u043B\u044F \u0432\u0436\u0435 \u0432 \u0440\u043E\u0437\u043C\u0456\u0442\u0446\u0456. \u042F\u043A\u0449\u043E \u0456\u043D\u0434\u0435\u043A\u0441 \u0434\u0430\u0454 \u0442\u0456 \u0441\u0430\u043C\u0456 \u0442\u043E\u0432\u0430\u0440\u0438\n    // \u0432 \u0442\u043E\u043C\u0443 \u0436 \u043F\u043E\u0440\u044F\u0434\u043A\u0443, \u043A\u0430\u0440\u0442\u043E\u043A \u043D\u0435 \u0447\u0456\u043F\u0430\u0454\u043C\u043E: \u043D\u0456 \u0437\u0430\u043F\u0438\u0442\u0443, \u043D\u0456 \u043F\u0435\u0440\u0435\u043C\u0430\u043B\u044C\u043E\u0432\u043A\u0438.\n    const grid = root.querySelector('[data-bkv-grid]');\n    const shownIds = grid\n      ? Array.from(grid.querySelectorAll(':scope > li[data-product-id]'), (li) => Number(/** @type {HTMLElement} */ (li).dataset.productId))\n      : [];\n\n    if (grid && shownIds.length > 0 && shownIds.join() === view.pageIds.join()) {\n      for (const li of grid.children) cardCache.set(Number(/** @type {HTMLElement} */ (li).dataset.productId), li.outerHTML);\n      results?.querySelector(':scope > .pagination')?.remove();\n      results?.insertAdjacentHTML('beforeend', paginationHtml(config, view));\n    } else {\n      try {\n        const cards = await loadCards(config, view.pageIds);\n        if (current !== token) return;\n        renderResults(root, config, view, cards);\n      } catch (error) {\n        if (current !== token) return;\n        console.warn('[bkv-catalog] \u043A\u0430\u0440\u0442\u043A\u0438 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u043B\u0438\u0441\u044C, \u043F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0443\u044E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443', error);\n        location.assign(url);\n        return;\n      }\n    }\n\n    results?.classList.remove('bkv-results--busy');\n    results?.setAttribute('aria-busy', 'false');\n    root.dataset.bkvCatalog = 'ready';\n  }\n\n  await render(queuedUrl ?? location.href);\n  if (queuedUrl) history.pushState({ bkvCatalog: true }, '', queuedUrl);\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 \u0434\u0430\u043D\u0456 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\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/**\n * \u0424\u0430\u0439\u043B, \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u044F\u043A\u043E\u0433\u043E inline-\u043A\u043E\u0434 \u0443 bkv-catalog-config \u043F\u043E\u0447\u0430\u0432 \u0449\u0435 \u043F\u0456\u0434 \u0447\u0430\u0441\n * \u0440\u043E\u0437\u0431\u043E\u0440\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438. \u042F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u0442\u0430\u043C \u043D\u0435\u043C\u0430\u0454 (\u043A\u0435\u0448\u043E\u0432\u0430\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0431\u0435\u0437 inline-\u043A\u043E\u0434\u0443),\n * \u043A\u0430\u0447\u0430\u0454\u043C\u043E \u0441\u0430\u043C\u0456.\n * @param {'index' | 'text'} key\n * @param {string} url\n */\nfunction early(key, url) {\n  const started = /** @type {any} */ (window).bkvCatalog?.[key];\n  if (started) return started;\n  return fetch(url).then((response) => {\n    if (!response.ok) throw new Error(`${key} HTTP ${response.status}`);\n    return response.json();\n  });\n}\n\n/**\n * \u041D\u0430\u0437\u0432\u0438 \u0433\u0440\u0443\u043F \u0444\u0430\u0441\u0435\u0442\u0456\u0432 \u0456 \u0457\u0445\u043D\u0456\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u2014 \u0437 Search & Discovery. \u041A\u043E\u043B\u0438 Liquid \u0443\u0436\u0435\n * \u043C\u0430\u0432 `filters`, \u0431\u0435\u0440\u0435\u043C\u043E \u0437\u0432\u0456\u0434\u0442\u0438 \u0456 \u043A\u043B\u0430\u0434\u0435\u043C\u043E \u0432 \u043A\u0435\u0448: \u0432\u0435\u043B\u0438\u043A\u0456 \u043A\u043E\u043B\u0435\u043A\u0446\u0456\u0457 \u0444\u0430\u0441\u0435\u0442\u0456\u0432 \u0443\n * Liquid \u043D\u0435 \u043C\u0430\u044E\u0442\u044C, \u0456 \u0457\u043C \u0434\u0456\u0441\u0442\u0430\u043D\u0435\u0442\u044C\u0441\u044F \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0435. \u0411\u0435\u0437 \u043A\u0435\u0448\u0443 \u2014 \u043E\u0434\u0438\u043D \u0437\u0430\u043F\u0438\u0442 \u0434\u043E\n * Storefront API \u0443 \u043C\u043E\u0432\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.\n *\n * @param {any} config\n * @returns {Promise<{ param: string, label: string }[]>}\n */\nasync function loadLabels(config) {\n  const key = `bkv-catalog-labels:${config.storefront.language}`;\n\n  if (config.labels?.length) {\n    try {\n      localStorage.setItem(key, JSON.stringify({ at: Date.now(), labels: config.labels }));\n    } catch {}\n    return config.labels;\n  }\n\n  try {\n    const cached = JSON.parse(localStorage.getItem(key) ?? 'null');\n    if (cached && Date.now() - cached.at < LABELS_TTL_MS) return cached.labels;\n  } catch {}\n\n  const { language, country, apiVersion } = config.storefront;\n  const response = await fetch(`/api/${apiVersion}/graphql.json`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      query: `query @inContext(language: ${language}, country: ${country}) {\n        search(query: \"*\", first: 1, types: PRODUCT) { productFilters { id label } }\n      }`,\n    }),\n  });\n  if (!response.ok) throw new Error(`labels HTTP ${response.status}`);\n  const json = await response.json();\n  const filters = json.data?.search?.productFilters;\n  if (!filters) throw new Error('labels: \u043F\u043E\u0440\u043E\u0436\u043D\u044F \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C');\n\n  const labels = filters.map((/** @type {any} */ f) => ({ param: f.id, label: f.label }));\n  try {\n    localStorage.setItem(key, JSON.stringify({ at: Date.now(), labels }));\n  } catch {}\n  return labels;\n}\n\n/**\n * \u041A\u0430\u0440\u0442\u043A\u0438 \u0432 \u043F\u043E\u0440\u044F\u0434\u043A\u0443 `ids`. \u0423\u0436\u0435 \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u0456 \u0442\u0440\u0438\u043C\u0430\u0454\u043C\u043E \u0432 \u043F\u0430\u043C'\u044F\u0442\u0456: \u043F\u043E\u0432\u0435\u0440\u043D\u0435\u043D\u043D\u044F \u043D\u0430\n * \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u0440\u043E\u0431\u0438\u0442\u044C \u0437\u0430\u043F\u0438\u0442\u0443.\n */\nconst cardCache = new Map();\n\n/**\n * @param {any} config\n * @param {number[]} ids\n * @returns {Promise<string[]>}\n */\nasync function loadCards(config, ids) {\n  const missing = ids.filter((id) => !cardCache.has(id));\n\n  for (let i = 0; i < missing.length; i += CARDS_CHUNK) {\n    const chunk = missing.slice(i, i + CARDS_CHUNK);\n    const url = new URL(config.cardsUrl, location.origin);\n    url.searchParams.set('q', chunk.map((id) => `id:${id}`).join(' OR '));\n    url.searchParams.set('type', 'product');\n    url.searchParams.set('section_id', 'bkv-catalog-cards');\n\n    const response = await fetch(url);\n    if (!response.ok) throw new Error(`cards HTTP ${response.status}`);\n    const doc = new DOMParser().parseFromString(await response.text(), 'text/html');\n    for (const item of doc.querySelectorAll('li[data-product-id]')) {\n      cardCache.set(Number(/** @type {HTMLElement} */ (item).dataset.productId), item.outerHTML);\n    }\n    // \u0422\u043E\u0432\u0430\u0440, \u044F\u043A\u043E\u0433\u043E \u043D\u0435\u043C\u0430\u0454 \u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 (\u0437\u043D\u044F\u043B\u0438 \u0437 \u043F\u0443\u0431\u043B\u0456\u043A\u0430\u0446\u0456\u0457 \u043F\u0456\u0441\u043B\u044F \u0437\u0431\u0438\u0440\u0430\u043D\u043D\u044F\n    // \u0456\u043D\u0434\u0435\u043A\u0441\u0443), \u043F\u043E\u0437\u043D\u0430\u0447\u0430\u0454\u043C\u043E \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u043C \u2014 \u0449\u043E\u0431 \u043D\u0435 \u043F\u0438\u0442\u0430\u0442\u0438 \u043F\u0440\u043E \u043D\u044C\u043E\u0433\u043E \u0437\u043D\u043E\u0432\u0443.\n    for (const id of chunk) if (!cardCache.has(id)) cardCache.set(id, '');\n  }\n\n  return ids.map((id) => cardCache.get(id)).filter(Boolean);\n}\n\n/**\n * \u0423\u0441\u044F \u0432\u0438\u0434\u0430\u0447\u0430 \u0448\u0442\u0430\u0442\u043D\u043E\u0433\u043E \u043F\u043E\u0448\u0443\u043A\u0443, \u043B\u0438\u0448\u0435 id \u0443 \u043F\u043E\u0440\u044F\u0434\u043A\u0443 \u0440\u0435\u043B\u0435\u0432\u0430\u043D\u0442\u043D\u043E\u0441\u0442\u0456, \u0431\u0435\u0437 \u0444\u0456\u043B\u044C\u0442\u0440\u0456\u0432 \u0456\n * \u0441\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u2014 \u0457\u0445 \u0440\u0430\u0445\u0443\u0454 \u0456\u043D\u0434\u0435\u043A\u0441. \u041F\u0435\u0440\u0448\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043A\u0430\u0436\u0435 \u0440\u043E\u0437\u043C\u0456\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0456 \u0441\u043A\u0456\u043B\u044C\u043A\u0438\n * \u0432\u0441\u044C\u043E\u0433\u043E, \u0440\u0435\u0448\u0442\u0443 \u043F\u0438\u0442\u0430\u0454\u043C\u043E \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u044C\u043D\u043E.\n *\n * \u26A0 \u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u043C\u0430\u044E\u0442\u044C \u0437\u0431\u0456\u0433\u0430\u0442\u0438\u0441\u044F \u0437 \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u0438\u043C\u0438 \u043F\u043E\u043B\u044F\u043C\u0438 \u0444\u043E\u0440\u043C\u0438 \u0432 bkv-search-results:\n * \u0456\u043D\u0448\u0438\u0439 `options[prefix]` \u2014 \u0456\u043D\u0448\u0430 \u0432\u0438\u0434\u0430\u0447\u0430.\n * @param {any} config\n * @returns {Promise<number[]>}\n */\nasync function loadSemantic(config) {\n  const fetchPage = async (/** @type {number} */ page) => {\n    const url = new URL(config.cardsUrl, location.origin);\n    url.searchParams.set('q', config.query);\n    url.searchParams.set('type', 'product');\n    url.searchParams.set('options[prefix]', 'last');\n    url.searchParams.set('section_id', 'bkv-search-ids');\n    url.searchParams.set('page', String(page));\n\n    const response = await fetch(url);\n    if (!response.ok) throw new Error(`search ids HTTP ${response.status}`);\n    const doc = new DOMParser().parseFromString(await response.text(), 'text/html');\n    const data = JSON.parse(doc.querySelector('script[data-bkv-search-ids]')?.textContent ?? 'null');\n    if (!Array.isArray(data?.ids) || !(data.pageSize > 0)) throw new Error('search ids: \u043F\u043E\u0440\u043E\u0436\u043D\u044F \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C');\n    return data;\n  };\n\n  const first = await fetchPage(1);\n  const pages = Math.ceil(Math.min(first.total, SEMANTIC_CAP) / first.pageSize);\n  const rest = await Promise.all(Array.from({ length: Math.max(0, pages - 1) }, (_, n) => fetchPage(n + 2)));\n  // \u041F\u0430\u0433\u0456\u043D\u0430\u0446\u0456\u044F \u043F\u043E\u0448\u0443\u043A\u0443 \u043C\u043E\u0436\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u0442\u043E\u0432\u0430\u0440 \u043D\u0430 \u0441\u0443\u0441\u0456\u0434\u043D\u0456\u0445 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430\u0445 \u2014 \u043B\u0438\u0448\u0430\u0454\u043C\u043E \u043F\u0435\u0440\u0448\u0438\u0439.\n  return [...new Set([first, ...rest].flatMap((d) => d.ids))];\n}\n\n/**\n * @param {any} index\n * @param {any} config\n * @param {{ param: string, label: string }[]} labels\n * @param {any} textIndex\n * @param {number[] | null} semanticIds\n */\nfunction createCatalog(index, config, labels, textIndex, semanticIds) {\n  const { items, dict } = index;\n  const total = items.id.length;\n\n  // \u2500\u2500 \u041E\u0431\u0441\u044F\u0433: \u0432\u0435\u0441\u044C \u043A\u0430\u0442\u0430\u043B\u043E\u0433, \u043E\u0434\u043D\u0430 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F \u0430\u0431\u043E \u0437\u0431\u0456\u0433\u0438 \u0442\u0435\u043A\u0441\u0442\u0443 \u2500\u2500\n  /** @type {number[]} */\n  const scope = [];\n  /** 1 \u2014 \u0443\u0441\u0456 \u0441\u043B\u043E\u0432\u0430 \u0437\u0430\u043F\u0438\u0442\u0443 \u0437\u043D\u0430\u0439\u0448\u043B\u0438\u0441\u044F \u0432 \u043D\u0430\u0437\u0432\u0456: \u0442\u0430\u043A\u0456 \u0442\u043E\u0432\u0430\u0440\u0438 \u0432\u0438\u0449\u0435 \u0432 \u00ABRelevantnost\u00BB. */\n  const titleHit = new Uint8Array(total);\n\n  if (config.mode === 'text' && semanticIds) {\n    // \u041F\u043E\u0440\u044F\u0434\u043E\u043A \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0438 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454 \u0441\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043D\u0438\u0436\u0447\u0435: \u043F\u043E\u0437\u0438\u0446\u0456\u044F \u0432 `scope` \u2014 \u043E\u0441\u0442\u0430\u043D\u043D\u0456\u0439 \u043A\u043B\u044E\u0447.\n    const at = new Map(items.id.map((/** @type {number} */ id, /** @type {number} */ i) => [id, i]));\n    for (const id of semanticIds) {\n      const i = at.get(id);\n      if (i !== undefined) scope.push(i);\n    }\n    // \u0422\u043E\u0432\u0430\u0440, \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u0439 \u043F\u0456\u0441\u043B\u044F \u0437\u0431\u0438\u0440\u0430\u043D\u043D\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0443, \u0441\u044E\u0434\u0438 \u043D\u0435 \u043F\u043E\u0442\u0440\u0430\u043F\u0438\u0442\u044C. \u041F\u043E\u043E\u0434\u0438\u043D\u043E\u043A\u0456\n    // \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 \u0442\u0435\u0440\u043F\u0438\u043C\u043E, \u0431\u0430\u0433\u0430\u0442\u043E \u2014 \u0456\u043D\u0434\u0435\u043A\u0441 \u0437\u0430\u0441\u0442\u0430\u0440\u0456\u0432, \u043A\u0440\u0430\u0449\u0435 \u0448\u0442\u0430\u0442\u043D\u0430 \u0432\u0438\u0434\u0430\u0447\u0430.\n    const missing = semanticIds.length - scope.length;\n    if (missing > 0 && missing / semanticIds.length > COUNT_TOLERANCE) {\n      return `\u0432 \u0456\u043D\u0434\u0435\u043A\u0441\u0456 \u043D\u0435\u043C\u0430\u0454 ${missing} \u0437 ${semanticIds.length} \u0442\u043E\u0432\u0430\u0440\u0456\u0432 \u043F\u043E\u0448\u0443\u043A\u0443`;\n    }\n    // \u0421\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430 \u043D\u0430\u0437\u0432\u0443 \u043C\u0430\u0439\u0436\u0435 \u043D\u0435 \u0446\u0456\u043D\u0443\u0454: \u043D\u0430 \u00AB\u0411\u043E\u0433 \u0437\u0430\u0432\u0436\u0434\u0438\u00BB \u0441\u0430\u043C\u0430 \u043A\u043D\u0438\u0433\u0430 \u0432 \u043D\u0435\u0457 51-\u0448\u0430 \u0437\u0456\n    // 145, \u0430 \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0438 \u0457\u0457 \u043D\u0435 \u043F\u043E\u0432\u0435\u0440\u0442\u0430\u044E\u0442\u044C \u0437\u043E\u0432\u0441\u0456\u043C. \u0423\u0441\u0456 \u0441\u043B\u043E\u0432\u0430 \u0437\u0430\u043F\u0438\u0442\u0443 \u0432 \u043D\u0430\u0437\u0432\u0456 \u2014 \u0442\u043E\u0432\u0430\u0440\n    // \u0456\u0434\u0435 \u043D\u0430\u0433\u043E\u0440\u0443, \u043D\u0430\u0432\u0456\u0442\u044C \u044F\u043A\u0449\u043E \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430 \u0439\u043E\u0433\u043E \u043D\u0435 \u0437\u043D\u0430\u0439\u0448\u043B\u0430.\n    const tokens = normalizeText(config.query).split(' ').filter(Boolean);\n    if (textIndex?.count === total && tokens.length > 0) {\n      const inScope = new Set(scope);\n      for (let i = 0; i < total; i++) {\n        const haystack = ' ' + textIndex.text[i];\n        const title = haystack.slice(0, haystack.indexOf(' | '));\n        if (!tokens.every((t) => title.includes(' ' + t))) continue;\n        titleHit[i] = 1;\n        if (!inScope.has(i)) scope.push(i);\n      }\n    }\n  } else if (config.mode === 'text') {\n    if (textIndex?.count !== total) return `\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u0438\u0439 \u0456\u043D\u0434\u0435\u043A\u0441 (${textIndex?.count}) \u043D\u0435 \u0437\u0431\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F \u0437 \u0456\u043D\u0434\u0435\u043A\u0441\u043E\u043C (${total})`;\n    const tokens = normalizeText(config.query).split(' ').filter(Boolean);\n    for (let i = 0; i < total; i++) {\n      const haystack = ' ' + textIndex.text[i];\n      if (!tokens.every((t) => haystack.includes(' ' + t))) continue;\n      scope.push(i);\n      const title = haystack.slice(0, haystack.indexOf(' | '));\n      titleHit[i] = tokens.every((t) => title.includes(' ' + t)) ? 1 : 0;\n    }\n    if (scope.length < config.cap) {\n      return `\u0456\u043D\u0434\u0435\u043A\u0441 \u0437\u043D\u0430\u0439\u0448\u043E\u0432 ${scope.length}, \u0448\u0442\u0430\u0442\u043D\u0438\u0439 \u043F\u043E\u0448\u0443\u043A \u2014 \u043D\u0435 \u043C\u0435\u043D\u0448\u0435 ${config.cap}`;\n    }\n  } else if (config.scope.type === 'all') {\n    for (let i = 0; i < total; i++) scope.push(i);\n  } else {\n    const catIndex = dict.cat.indexOf(config.scope.handle);\n    if (catIndex === -1) return `\u043A\u043E\u043B\u0435\u043A\u0446\u0456\u0457 ${config.scope.handle} \u043D\u0435\u043C\u0430\u0454 \u0432 \u0456\u043D\u0434\u0435\u043A\u0441\u0456`;\n    for (let i = 0; i < total; i++) if (items.cat[i].includes(catIndex)) scope.push(i);\n  }\n\n  const expected = Number(config.scope.expectedCount);\n  // \u0420\u043E\u0437\u0431\u0456\u0436\u043D\u0456\u0441\u0442\u044C \u2014 \u0446\u0435 \u0456\u043D\u0434\u0435\u043A\u0441, \u0449\u043E \u0432\u0456\u0434\u0441\u0442\u0430\u0454 \u0432\u0456\u0434 \u043F\u0440\u0430\u0432\u043A\u0438 \u043A\u043E\u043B\u0435\u043A\u0446\u0456\u0457 \u0432 \u0430\u0434\u043C\u0456\u043D\u0446\u0456 (cron\n  // \u043A\u043E\u0436\u043D\u0456 30 \u0445\u0432). \u0412\u0456\u0434\u043C\u043E\u0432\u0438\u0442\u0438\u0441\u044C \u0442\u0443\u0442 \u0433\u0456\u0440\u0448\u0435: \u0448\u0442\u0430\u0442\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u0456\u043D\u0434\u0435\u043A\u0441\u0443 \u2014\n  // \u043B\u0438\u0448\u0435 \u043F\u0435\u0440\u0448\u0456 \u0442\u043E\u0432\u0430\u0440\u0438 \u0437 \u043C\u0435\u0442\u0430\u043F\u043E\u043B\u044F, \u0431\u0435\u0437 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0456 \u0444\u0456\u043B\u044C\u0442\u0440\u0456\u0432. \u0422\u043E\u0436 \u043F\u043E\u043A\u0430\u0437\u0443\u0454\u043C\u043E\n  // \u0456\u043D\u0434\u0435\u043A\u0441 \u044F\u043A \u0454 \u0456 \u043B\u0438\u0448\u0435 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0430\u0454\u043C\u043E.\n  if (config.mode !== 'text' && expected > 0 && Math.abs(scope.length - expected) / expected > COUNT_TOLERANCE) {\n    console.warn(`[bkv-catalog] \u0432 \u0456\u043D\u0434\u0435\u043A\u0441\u0456 ${scope.length} \u0442\u043E\u0432\u0430\u0440\u0456\u0432, \u0443 Shopify ${expected} \u2014 \u0456\u043D\u0434\u0435\u043A\u0441 \u0432\u0456\u0434\u0441\u0442\u0430\u0454`);\n  }\n\n  let rangeMaxMinor = 0;\n  for (const i of scope) rangeMaxMinor = Math.max(rangeMaxMinor, items.price[i]);\n  const rangeMax = Math.ceil(rangeMaxMinor / 100);\n\n  // \u2500\u2500 \u0413\u0440\u0443\u043F\u0438 \u0444\u0430\u0441\u0435\u0442\u0456\u0432: \u0442\u0456, \u0449\u043E \u0432\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u0456 \u0432 S&D \u0456 \u0454 \u0432 \u0456\u043D\u0434\u0435\u043A\u0441\u0456 \u2500\u2500\n  const metaParam = (/** @type {string} */ key) => `filter.p.m.${index.namespace}.${key}`;\n  /** @type {Map<string, { kind: 'availability' | 'price' | 'meta', key?: string }>} */\n  const supported = new Map([\n    [PARAM_AVAILABILITY, { kind: 'availability' }],\n    [PARAM_PRICE, { kind: 'price' }],\n  ]);\n  for (const key of index.facets) supported.set(metaParam(key), { kind: 'meta', key });\n\n  const presentationOf = new Map(config.order.map((/** @type {any} */ o) => [o.param, o.presentation]));\n  const known = labels.filter((l) => supported.has(l.param));\n  const ordered = [\n    ...config.order\n      .map((/** @type {any} */ o) => known.find((l) => l.param === o.param))\n      .filter(Boolean),\n    ...known.filter((l) => !presentationOf.has(l.param)),\n  ];\n\n  const groups = ordered.map((l) => ({\n    ...l,\n    ...supported.get(l.param),\n    presentation: presentationOf.get(l.param) ?? 'auto',\n  }));\n\n  return {\n    /** @param {URL} url */\n    query(url) {\n      const params = url.searchParams;\n\n      // \u2500\u2500 \u0412\u0438\u0431\u0456\u0440 \u0456\u0437 URL \u2500\u2500\n      const selected = groups.map((g) => {\n        if (g.kind === 'price') {\n          const gte = parseFloat(params.get(PARAM_PRICE_GTE) ?? '');\n          const lte = parseFloat(params.get(PARAM_PRICE_LTE) ?? '');\n          return { gte: Number.isFinite(gte) ? gte : null, lte: Number.isFinite(lte) ? lte : null };\n        }\n        const values = params.getAll(g.param);\n        if (g.kind === 'availability') return new Set(values);\n        // \u0417\u043D\u0430\u0447\u0435\u043D\u043D\u044F, \u044F\u043A\u043E\u0433\u043E \u043D\u0435\u043C\u0430\u0454 \u0432 \u0441\u043B\u043E\u0432\u043D\u0438\u043A\u0443, \u0434\u0430\u0454 -1 \u0456 \u043D\u0443\u043B\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0456\u0432 \u2014 \u044F\u043A \u0443 Shopify.\n        return new Set(values.map((v) => dict[g.key].indexOf(v)));\n      });\n\n      /** @param {number} i @param {number} g */\n      const matches = (i, g) => {\n        const sel = selected[g];\n        const group = groups[g];\n        if (group.kind === 'price') {\n          const p = items.price[i];\n          return (sel.gte === null || p >= sel.gte * 100) && (sel.lte === null || p <= sel.lte * 100);\n        }\n        if (sel.size === 0) return true;\n        if (group.kind === 'availability') return sel.has(String(items.available[i]));\n        return items[group.key][i].some((/** @type {number} */ v) => sel.has(v));\n      };\n\n      // \u2500\u2500 \u041E\u0434\u0438\u043D \u043F\u0440\u043E\u0445\u0456\u0434: \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0438 + \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0438 \u2500\u2500\n      // \u041B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0433\u0440\u0443\u043F\u0438 \u0440\u0430\u0445\u0443\u0454\u0442\u044C\u0441\u044F \u043F\u043E \u0442\u043E\u0432\u0430\u0440\u0430\u0445, \u0449\u043E \u043F\u0440\u043E\u0445\u043E\u0434\u044F\u0442\u044C \u0443\u0441\u0456 \u0406\u041D\u0428\u0406\n      // \u0433\u0440\u0443\u043F\u0438: \u0432\u0438\u0431\u0456\u0440 \u0443\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456 \u0433\u0440\u0443\u043F\u0438 \u2014 \u0446\u0435 \u0410\u0411\u041E, \u0456 \u0441\u0443\u0441\u0456\u0434\u043D\u0456 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u043D\u0435 \u043C\u0430\u044E\u0442\u044C\n      // \u043E\u0431\u043D\u0443\u043B\u044F\u0442\u0438\u0441\u044F \u0432\u0456\u0434 \u0432\u043B\u0430\u0441\u043D\u043E\u0433\u043E \u0432\u0438\u0431\u043E\u0440\u0443.\n      const counts = groups.map(() => new Map());\n      /** @type {number[]} */\n      const matched = [];\n      const addCounts = (/** @type {number} */ i, /** @type {number} */ g) => {\n        const group = groups[g];\n        if (group.kind === 'price') return;\n        const values = group.kind === 'availability' ? [String(items.available[i])] : items[group.key][i];\n        for (const v of values) counts[g].set(v, (counts[g].get(v) ?? 0) + 1);\n      };\n\n      for (const i of scope) {\n        let fails = 0;\n        let failed = -1;\n        for (let g = 0; g < groups.length && fails < 2; g++) {\n          if (!matches(i, g)) {\n            fails++;\n            failed = g;\n          }\n        }\n        if (fails === 0) {\n          matched.push(i);\n          for (let g = 0; g < groups.length; g++) addCounts(i, g);\n        } else if (fails === 1) {\n          addCounts(i, failed);\n        }\n      }\n\n      // \u2500\u2500 \u0421\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F: \u0443 \u043D\u0430\u044F\u0432\u043D\u043E\u0441\u0442\u0456 \u043F\u0435\u0440\u0448\u0438\u043C\u0438, \u0434\u0430\u043B\u0456 \u0437\u0430 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u043C \u043A\u043B\u044E\u0447\u0435\u043C \u2500\u2500\n      // \u0423 \u00ABRelevantnost\u00BB \u0437\u0431\u0456\u0433 \u043D\u0430\u0437\u0432\u0438 \u0432\u0430\u0436\u0438\u0442\u044C \u0431\u0456\u043B\u044C\u0448\u0435 \u0437\u0430 \u043D\u0430\u044F\u0432\u043D\u0456\u0441\u0442\u044C: \u0448\u0443\u043A\u0430\u043D\u0443\n      // \u0440\u043E\u0437\u043F\u0440\u043E\u0434\u0430\u043D\u0443 \u043A\u043D\u0438\u0433\u0443 \u043F\u043E\u043A\u0443\u043F\u0435\u0446\u044C \u043C\u0430\u0454 \u043F\u043E\u0431\u0430\u0447\u0438\u0442\u0438 \u043E\u0434\u0440\u0430\u0437\u0443, \u0449\u043E\u0431 \u043F\u0456\u0434\u043F\u0438\u0441\u0430\u0442\u0438\u0441\u044F \u043D\u0430 \u043D\u0435\u0457.\n      // \u26A0 \u041F\u043E\u0440\u044F\u0434\u043E\u043A \u0431\u0435\u0437 \u0441\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043C\u0430\u0454 \u0437\u0431\u0456\u0433\u0430\u0442\u0438\u0441\u044F \u0437 firstPages() \u0443\n      // bk-catalog-index.mjs, \u0456\u043D\u0430\u043A\u0448\u0435 \u043F\u0435\u0440\u0448\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0437 \u043C\u0435\u0442\u0430\u043F\u043E\u043B\u044F \u00AB\u0441\u0442\u0440\u0438\u0431\u043D\u0435\u00BB.\n      const sortBy = params.get('sort_by') ?? '';\n      const position = new Map(matched.map((i, n) => [i, n]));\n      const direction = sortBy === 'price-ascending' ? 1 : sortBy === 'price-descending' ? -1 : 0;\n      matched.sort(\n        (a, b) =>\n          (direction === 0 ? titleHit[b] - titleHit[a] : 0) ||\n          items.available[b] - items.available[a] ||\n          direction * (items.price[a] - items.price[b]) ||\n          /** @type {number} */ (position.get(a)) - /** @type {number} */ (position.get(b))\n      );\n\n      // \u2500\u2500 \u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u2500\u2500\n      const perPage = config.perPage;\n      const pages = Math.max(1, Math.ceil(matched.length / perPage));\n      const page = Math.min(Math.max(1, parseInt(params.get('page') ?? '1', 10) || 1), pages);\n      const pageIds = matched.slice((page - 1) * perPage, page * perPage).map((i) => items.id[i]);\n\n      // \u2500\u2500 \u041C\u043E\u0434\u0435\u043B\u044C \u0444\u0430\u0441\u0435\u0442\u0456\u0432 \u0434\u043B\u044F \u0440\u043E\u0437\u043C\u0456\u0442\u043A\u0438 \u2500\u2500\n      const facets = groups.map((group, g) => {\n        if (group.kind === 'price') {\n          return { ...group, rangeMax, gte: selected[g].gte, lte: selected[g].lte };\n        }\n        const sel = selected[g];\n        /** @type {{ value: string, label: string, count: number, active: boolean }[]} */\n        let values;\n        if (group.kind === 'availability') {\n          values = ['1', '0'].map((v) => ({\n            value: v,\n            label: v === '1' ? config.t.inStock : config.t.outOfStock,\n            count: counts[g].get(v) ?? 0,\n            active: sel.has(v),\n          }));\n        } else {\n          const entries = new Map(counts[g]);\n          for (const v of sel) if (v >= 0 && !entries.has(v)) entries.set(v, 0);\n          values = [...entries]\n            .map(([v, count]) => ({ value: dict[group.key][v], label: dict[group.key][v], count, active: sel.has(v) }))\n            .sort((a, b) => b.count - a.count);\n          if (values.length > MAX_FACET_VALUES) {\n            values = values.filter((v, n) => n < MAX_FACET_VALUES || v.active);\n          }\n        }\n        return { ...group, values };\n      });\n\n      return { url, params, facets, total: matched.length, page, pages, pageIds };\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 \u0440\u043E\u0437\u043C\u0456\u0442\u043A\u0430 \u2500\u2500\u2500\u2500\u2500\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/** @param {unknown} value */\nconst escapeHtml = (value) =>\n  String(value).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c] ?? c);\n\n/**\n * \u0428\u0442\u0430\u0442\u043D\u0430 \u0432\u0438\u0434\u0430\u0447\u0430, \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u0430 \u043D\u0430 \u0447\u0430\u0441 \u0440\u0456\u0448\u0435\u043D\u043D\u044F (\u0440\u0435\u0436\u0438\u043C text): \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0457\u0457 \u0456\n * \u043F\u0440\u0438\u0431\u0440\u0430\u0442\u0438 \u0441\u043A\u0435\u043B\u0435\u0442\u043E\u043D\u0438.\n * @param {HTMLElement} root\n */\nfunction revealNative(root) {\n  for (const node of root.querySelectorAll('[data-bkv-native]')) /** @type {HTMLElement} */ (node).hidden = false;\n  for (const node of root.querySelectorAll('[data-bkv-skeleton-node]')) node.remove();\n}\n\n/**\n * \u0406\u043D\u0434\u0435\u043A\u0441 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0432\u0441\u044F, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0457 \u0432\u0438\u0434\u0430\u0447\u0456 \u0432 \u0440\u043E\u0437\u043C\u0456\u0442\u0446\u0456 \u043D\u0435\u043C\u0430\u0454 (\u0441\u043A\u0435\u043B\u0435\u0442\u043E\u043D\u0438).\n * \u041F\u043E\u0440\u043E\u0436\u043D\u044E \u0441\u0456\u0442\u043A\u0443 \u043D\u0435 \u043B\u0438\u0448\u0430\u0454\u043C\u043E: \u043A\u0430\u0436\u0435\u043C\u043E, \u0449\u043E \u0441\u0442\u0430\u043B\u043E\u0441\u044F, \u0456 \u0434\u0430\u0454\u043C\u043E \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430\n * \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0431\u0435\u0437 \u0444\u0456\u043B\u044C\u0442\u0440\u0456\u0432.\n * @param {HTMLElement} root\n * @param {any} config\n */\nfunction showUnavailable(root, config) {\n  const grid = root.querySelector('[data-bkv-grid]');\n  if (!grid || grid.querySelector('li[data-product-id]')) return;\n  for (const node of root.querySelectorAll('[data-bkv-skeleton-node]')) node.remove();\n  if (!root.querySelector('.bkv-facets-col .bkv-facet')) root.classList.add('bkv-search--no-facets');\n  const results = root.querySelector('.bkv-results');\n  if (results) {\n    results.innerHTML = `<div class=\"bkv-empty\">\n      <p class=\"bkv-empty__title\">${escapeHtml(config.t.noProducts)}</p>\n      <p class=\"bkv-empty__text\">${config.t.useFewerFiltersHtml.replace('__LINK__', escapeHtml(config.baseUrl))}</p>\n    </div>`;\n  }\n}\n\n/**\n * \u0420\u044F\u0434\u043E\u043A \u0456\u0437 \u043F\u043B\u044E\u0440\u0430\u043B\u0456\u0437\u0430\u0446\u0456\u0454\u044E: Liquid \u0432\u0456\u0434\u0434\u0430\u0432 \u0448\u0430\u0431\u043B\u043E\u043D\u0438 \u0434\u043B\u044F 1, 2 \u0456 5, \u0430 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044E\n * \u0432\u0438\u0431\u0438\u0440\u0430\u0454 `Intl.PluralRules` \u043C\u043E\u0432\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.\n * @param {any} config\n * @param {{ one: string, few: string, other: string }} forms\n * @param {number} count\n */\nfunction plural(config, forms, count) {\n  const category = new Intl.PluralRules(config.locale).select(count);\n  const template = category === 'one' ? forms.one : category === 'few' ? forms.few : forms.other;\n  return template.replace('__N__', String(count));\n}\n\n/**\n * URL \u0431\u0435\u0437 \u043E\u0434\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F / \u0431\u0435\u0437 \u0433\u0440\u0443\u043F\u0438 / \u0431\u0435\u0437 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.\n * @param {URL} url\n * @param {(key: string, value: string) => boolean} drop\n */\nfunction urlWithout(url, drop) {\n  const next = new URL(url);\n  next.search = '';\n  for (const [key, value] of url.searchParams) {\n    if (key === 'page' || drop(key, value)) continue;\n    next.searchParams.append(key, value);\n  }\n  return next.pathname + next.search;\n}\n\n/**\n * @param {any} form\n * @returns {string}\n */\nfunction urlFromForm(form) {\n  const params = form.createURLParameters();\n  const url = new URL(location.pathname, location.origin);\n  for (const [key, value] of params) url.searchParams.append(key, value);\n  return url.pathname + url.search;\n}\n\n/**\n * \u0424\u0430\u0441\u0435\u0442\u0438, \u0447\u0438\u043F\u0438, \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A \u0456 \u0431\u0435\u0439\u0434\u0436\u0456 \u2014 \u0443\u0441\u0435, \u0449\u043E \u043D\u0435 \u0437\u0430\u043B\u0435\u0436\u0438\u0442\u044C \u0432\u0456\u0434 \u043A\u0430\u0440\u0442\u043E\u043A.\n * @param {HTMLElement} root\n * @param {any} config\n * @param {any} view\n */\nfunction renderChrome(root, config, view) {\n  const activeCount = view.facets.reduce((/** @type {number} */ sum, /** @type {any} */ f) => {\n    if (f.kind === 'price') return sum + (f.gte !== null || f.lte !== null ? 1 : 0);\n    return sum + f.values.filter((/** @type {any} */ v) => v.active).length;\n  }, 0);\n\n  const sidebar = root.querySelector('.bkv-facets-col .bkv-facets');\n  if (sidebar) sidebar.innerHTML = view.facets.map((/** @type {any} */ f) => facetHtml(config, f, 'sidebar')).join('');\n  const drawer = root.querySelector('.bkv-facets-drawer__body .bkv-facets');\n  if (drawer) drawer.innerHTML = view.facets.map((/** @type {any} */ f) => facetHtml(config, f, 'drawer')).join('');\n  for (const node of root.querySelectorAll('.bkv-facets[data-bkv-skeleton-node]')) node.removeAttribute('data-bkv-skeleton-node');\n\n  root.classList.toggle('bkv-search--no-facets', view.facets.length === 0);\n\n  // \u0427\u0438\u043F\u0438\n  const main = root.querySelector('.bkv-search__main');\n  main?.querySelector('.bkv-chips')?.remove();\n  if (config.settings.show_active_filters && activeCount > 0) {\n    main?.querySelector('.bkv-toolbar')?.insertAdjacentHTML('beforebegin', chipsHtml(config, view));\n  }\n\n  // \u041B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A, \u0431\u0435\u0439\u0434\u0436\u0456, \u043A\u043D\u043E\u043F\u043A\u0430 \u0448\u0443\u0445\u043B\u044F\u0434\u0438, \u00AB\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u0432\u0441\u0435\u00BB\n  const count = root.querySelector('.bkv-toolbar__count');\n  if (count) count.textContent = plural(config, config.t.itemCount, view.total);\n\n  for (const toggle of root.querySelectorAll('.bkv-toolbar__drawer-toggle')) {\n    toggle.querySelector('.bkv-toolbar__badge')?.remove();\n    if (activeCount > 0) toggle.insertAdjacentHTML('beforeend', `<span class=\"bkv-toolbar__badge\">${activeCount}</span>`);\n  }\n  for (const badge of root.querySelectorAll('.theme-drawer__badge')) badge.textContent = String(activeCount);\n\n  const seeItems = root.querySelector('.bkv-facets-drawer__actions .button');\n  if (seeItems) seeItems.textContent = plural(config, config.t.seeItems, view.total);\n  const clearAll = root.querySelector('.bkv-facets-drawer__actions .button-secondary');\n  if (clearAll instanceof HTMLAnchorElement) clearAll.href = config.baseUrl;\n\n  // \u0421\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F: \u043F\u0456\u0433\u0443\u043B\u043A\u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u043C\u0430\u043B\u044C\u043E\u0432\u0443\u0454\u043C\u043E, \u043B\u0438\u0448\u0435 \u0437\u0432\u0456\u0440\u044F\u0454\u043C\u043E \u0437 URL (popstate).\n  const sortBy = view.params.get('sort_by');\n  for (const radio of root.querySelectorAll('.bkv-sort__input')) {\n    if (radio instanceof HTMLInputElement) radio.checked = sortBy ? radio.value === sortBy : radio.value === config.defaultSort;\n  }\n  for (const hidden of root.querySelectorAll('input[type=\"hidden\"][name=\"sort_by\"]')) {\n    if (hidden instanceof HTMLInputElement && sortBy) hidden.value = sortBy;\n  }\n}\n\n/**\n * @param {HTMLElement} root\n * @param {any} config\n * @param {any} view\n * @param {string[]} cards\n */\nfunction renderResults(root, config, view, cards) {\n  const results = root.querySelector('.bkv-results');\n  if (!results) return;\n\n  if (view.total === 0 || cards.length === 0) {\n    const hasFilters = view.facets.some((/** @type {any} */ f) =>\n      f.kind === 'price' ? f.gte !== null || f.lte !== null : f.values.some((/** @type {any} */ v) => v.active)\n    );\n    results.innerHTML = `<div class=\"bkv-empty\">\n      <p class=\"bkv-empty__title\">${escapeHtml(config.t.noProducts)}</p>\n      ${hasFilters ? `<p class=\"bkv-empty__text\">${config.t.useFewerFiltersHtml.replace('__LINK__', escapeHtml(config.baseUrl))}</p>` : ''}\n    </div>`;\n    return;\n  }\n\n  results.innerHTML =\n    `<ul class=\"${escapeHtml(config.gridClass)}\" role=\"list\" data-bkv-grid>${cards.join('')}</ul>` +\n    paginationHtml(config, view);\n}\n\n/**\n * @param {any} config\n * @param {any} facet\n * @param {'sidebar' | 'drawer'} context\n */\nfunction facetHtml(config, facet, context) {\n  const s = config.settings;\n  const uid = `${config.sectionId}-${context}-${facet.param}`.replace(/[.%]/g, '-');\n  // \u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u044C (top): \u0444\u0430\u0441\u0435\u0442\u0438 \u2014 \u0434\u0440\u043E\u043F\u0434\u0430\u0443\u043D\u0438, \u0443\u0441\u0456 \u0437\u0430\u043A\u0440\u0438\u0442\u0456, \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0439 \u0442\u0440\u0438\u043C\u0430\u0454 bkv-facets.js.\n  const open = context === 'drawer' || (s.facets_open && s.facets_position !== 'top') ? ' open' : '';\n  const formAttr = context === 'sidebar' ? ` form=\"${escapeHtml(config.formId)}\"` : '';\n  const summary = (/** @type {string} */ label) => `<summary class=\"bkv-facet__summary\">\n      <span class=\"bkv-facet__label\">${escapeHtml(label)}</span>\n      <span class=\"bkv-facet__caret svg-wrapper\">${config.icons.caret}</span>\n    </summary>`;\n\n  if (facet.kind === 'price') return priceHtml(config, facet, uid, open, formAttr, summary);\n\n  const values = [...facet.values];\n  // \u0410\u0432\u0442\u043E\u0440\u0438 \u043C\u0430\u044E\u0442\u044C \u0432\u043B\u0430\u0441\u043D\u0438\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A (author_values_sort): \u0437\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044E \u0457\u0445 \u0441\u043F\u0438\u0441\u043E\u043A\n  // \u0432\u0438\u0433\u043B\u044F\u0434\u0430\u0454 \u0445\u0430\u043E\u0442\u0438\u0447\u043D\u0438\u043C. \u0406\u043C\u0435\u043D\u0430 \u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0456, \u0442\u043E\u0436 \u0456 \u0430\u0431\u0435\u0442\u043A\u0430 \u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 \u2014 \u0456\u043D\u0430\u043A\u0448\u0435\n  // \u0404, \u0406, \u0407, \u0490 \u0441\u0442\u0430\u043B\u0438 \u0431 \u043D\u0435 \u043D\u0430 \u0441\u0432\u043E\u0457 \u043C\u0456\u0441\u0446\u044F \u043D\u0430 \u0447\u0435\u0441\u044C\u043A\u0456\u0439 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456.\n  if (facet.param === AUTHOR_PARAM && s.author_values_sort === 'alphabetical') {\n    values.sort((a, b) => a.label.localeCompare(b.label, 'uk', { numeric: true }));\n  } else if (s.values_sort === 'alphabetical') {\n    values.sort((a, b) => a.label.localeCompare(b.label, config.locale, { numeric: true }));\n  }\n  const visible = values.filter((v) => !(s.hide_zero_counts && v.count === 0 && !v.active));\n  const limit = s.values_before_collapse;\n  const showSearch =\n    facet.presentation === 'list_search' ||\n    ((facet.presentation === 'auto' || facet.presentation === 'list') && visible.length > s.search_threshold);\n  const extra = visible.length - limit;\n\n  let shown = 0;\n  const items = visible\n    .map((v, n) => {\n      shown++;\n      const isExtra = shown > limit && !v.active;\n      const inputId = `BkvFacetValue-${uid}-${n + 1}`;\n      return `<li class=\"bkv-facet__value${isExtra ? ' bkv-facet__value--extra' : ''}\" data-label=\"${escapeHtml(v.label.toLowerCase())}\"${isExtra ? ' hidden' : ''}>\n        <input type=\"checkbox\" class=\"bkv-facet__checkbox\" id=\"${inputId}\" name=\"${escapeHtml(facet.param)}\" value=\"${escapeHtml(v.value)}\"${v.active ? ' checked' : ''}${v.count === 0 && !v.active ? ' disabled' : ''}${formAttr}>\n        <label class=\"bkv-facet__value-label\" for=\"${inputId}\">\n          <span class=\"bkv-facet__value-text\">${escapeHtml(v.label)}</span>\n          ${s.show_counts ? `<span class=\"bkv-facet__count\">${v.count}</span>` : ''}\n        </label>\n      </li>`;\n    })\n    .join('');\n\n  const step = s.values_step || 10;\n  const body =\n    visible.length === 0\n      ? `<p class=\"bkv-facet__empty\">${escapeHtml(config.t.noFilterOptions)}</p>`\n      : `${\n          showSearch\n            ? `<div class=\"bkv-facet__search\">\n              <label class=\"visually-hidden\" for=\"BkvFacetSearch-${uid}\">${escapeHtml(config.t.search)} \u2014 ${escapeHtml(facet.label)}</label>\n              <input type=\"search\" id=\"BkvFacetSearch-${uid}\" class=\"bkv-facet__search-input\" placeholder=\"${escapeHtml(config.t.searchPlaceholder)}\" autocomplete=\"off\" ref=\"search\">\n            </div>`\n            : ''\n        }\n        <facet-inputs-component>\n          <ul class=\"bkv-facet__values${facet.presentation === 'grid' ? ' bkv-facet__values--grid' : ''}\" role=\"list\">${items}</ul>\n        </facet-inputs-component>\n        ${\n          extra > 0\n            ? `<button type=\"button\" class=\"bkv-facet__more\" ref=\"moreButton\" aria-expanded=\"false\" aria-controls=\"BkvFacet-${uid}\" data-step=\"${step}\" data-more-label=\"${escapeHtml(config.t.showMore)}\" data-less-label=\"${escapeHtml(config.t.showLess)}\">${escapeHtml(config.t.showMore)} (${Math.min(step, extra)})</button>`\n            : ''\n        }\n        <p class=\"bkv-facet__no-matches\" hidden ref=\"noMatches\">${escapeHtml(config.t.noResultsFound)}</p>`;\n\n  return `<details class=\"bkv-facet\" id=\"BkvFacet-${uid}\"${open}>\n    ${summary(facet.label)}\n    <bkv-facet-panel class=\"bkv-facet__body\">${body}</bkv-facet-panel>\n  </details>`;\n}\n\n/**\n * \u0422\u043E\u0439 \u0441\u0430\u043C\u0438\u0439 \u0444\u0430\u0441\u0435\u0442, \u0449\u043E `bkv-facet-price.liquid`: \u043F\u043E\u043B\u044F \u0432 \u043C\u0430\u0436\u043E\u0440\u043D\u0438\u0445 \u043E\u0434\u0438\u043D\u0438\u0446\u044F\u0445,\n * \u0437\u0430\u043B\u0438\u0432\u043A\u0430 \u0441\u043B\u0430\u0439\u0434\u0435\u0440\u0430 \u043F\u043E\u0440\u0430\u0445\u043E\u0432\u0430\u043D\u0430 \u043E\u0434\u0440\u0430\u0437\u0443.\n */\nfunction priceHtml(\n  /** @type {any} */ config,\n  /** @type {any} */ facet,\n  /** @type {string} */ uid,\n  /** @type {string} */ open,\n  /** @type {string} */ formAttr,\n  /** @type {(label: string) => string} */ summary\n) {\n  const max = facet.rangeMax;\n  const lo = facet.gte ?? 0;\n  const hi = facet.lte ?? max;\n  const fillStart = max > 0 ? (lo * 100) / max : 0;\n  const fillEnd = max > 0 ? 100 - (hi * 100) / max : 0;\n\n  return `<details class=\"bkv-facet bkv-facet--price\" id=\"BkvFacet-${uid}\"${open}>\n    ${summary(`${facet.label}, ${config.currencySymbol}`)}\n    <bkv-price-facet class=\"bkv-facet__body bkv-price\" data-range-max=\"${max}\">\n      <div class=\"bkv-price__fields\">\n        <div class=\"bkv-price__field\">\n          <label class=\"visually-hidden\" for=\"BkvPriceMin-${uid}\">${escapeHtml(config.t.priceLow)}</label>\n          <input type=\"number\" inputmode=\"numeric\" id=\"BkvPriceMin-${uid}\" class=\"bkv-price__input\" name=\"${PARAM_PRICE_GTE}\"${facet.gte !== null ? ` value=\"${facet.gte}\"` : ''} placeholder=\"0\" min=\"0\" max=\"${max}\" step=\"1\" autocomplete=\"off\"${formAttr} ref=\"minInput\">\n        </div>\n        <span class=\"bkv-price__separator\" aria-hidden=\"true\">\u2014</span>\n        <div class=\"bkv-price__field\">\n          <label class=\"visually-hidden\" for=\"BkvPriceMax-${uid}\">${escapeHtml(config.t.priceHigh)}</label>\n          <input type=\"number\" inputmode=\"numeric\" id=\"BkvPriceMax-${uid}\" class=\"bkv-price__input\" name=\"${PARAM_PRICE_LTE}\"${facet.lte !== null ? ` value=\"${facet.lte}\"` : ''} placeholder=\"${max}\" min=\"0\" max=\"${max}\" step=\"1\" autocomplete=\"off\"${formAttr} ref=\"maxInput\">\n        </div>\n      </div>\n      <div class=\"bkv-price__slider\">\n        <div class=\"bkv-price__track\">\n          <div class=\"bkv-price__fill\" ref=\"fill\" style=\"inset-inline: ${fillStart}% ${fillEnd}%;\"></div>\n        </div>\n        <input type=\"range\" class=\"bkv-price__range bkv-price__range--min\" min=\"0\" max=\"${max}\" step=\"1\" value=\"${lo}\" aria-label=\"${escapeHtml(config.t.priceLow)}\" ref=\"minRange\">\n        <input type=\"range\" class=\"bkv-price__range bkv-price__range--max\" min=\"0\" max=\"${max}\" step=\"1\" value=\"${hi}\" aria-label=\"${escapeHtml(config.t.priceHigh)}\" ref=\"maxRange\">\n      </div>\n    </bkv-price-facet>\n  </details>`;\n}\n\n/**\n * @param {any} config\n * @param {any} view\n */\nfunction chipsHtml(config, view) {\n  const chip = (/** @type {string} */ href, /** @type {string} */ label) => `<a class=\"bkv-chip\" href=\"${escapeHtml(href)}\">\n      <span class=\"bkv-chip__label\">${escapeHtml(label)}</span>\n      <span class=\"bkv-chip__x svg-wrapper\" aria-hidden=\"true\">${config.icons.close}</span>\n      <span class=\"visually-hidden\">${escapeHtml(config.t.remove)}</span>\n    </a>`;\n  const money = (/** @type {number} */ major) => formatMoney(Math.round(major * 100), config.moneyFormat, config.currency);\n\n  const chips = view.facets.flatMap((/** @type {any} */ f) => {\n    if (f.kind === 'price') {\n      if (f.gte === null && f.lte === null) return [];\n      const href = urlWithout(view.url, (key) => key === PARAM_PRICE_GTE || key === PARAM_PRICE_LTE);\n      return [chip(href, `${money(f.gte ?? 0)} \u2013 ${money(f.lte ?? f.rangeMax)}`)];\n    }\n    return f.values\n      .filter((/** @type {any} */ v) => v.active)\n      .map((/** @type {any} */ v) => chip(urlWithout(view.url, (key, value) => key === f.param && value === v.value), v.label));\n  });\n\n  return `<div class=\"bkv-chips\" aria-label=\"${escapeHtml(config.t.filters)}\">\n    ${chips.join('')}\n    <a class=\"bkv-chips__clear\" href=\"${escapeHtml(config.baseUrl)}\">${escapeHtml(config.t.clearAll)}</a>\n  </div>`;\n}\n\n/**\n * \u0420\u043E\u0437\u043C\u0456\u0442\u043A\u0430 `pagination-controls`: \u0442\u0456 \u0441\u0430\u043C\u0456 \u043A\u043B\u0430\u0441\u0438, \u043C\u043E\u0431\u0456\u043B\u044C\u043D\u0456 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 \u0456 \u0432\u0456\u043A\u043D\u043E\n * \u043D\u0430\u0432\u043A\u043E\u043B\u043E \u043F\u043E\u0442\u043E\u0447\u043D\u043E\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438, \u0449\u043E \u0432 `paginate.parts`.\n * @param {any} config\n * @param {any} view\n */\nfunction paginationHtml(config, view) {\n  const { page: current, pages } = view;\n  if (pages <= 1) return '';\n\n  const pageUrl = (/** @type {number} */ n) => {\n    const url = new URL(view.url);\n    if (n === 1) url.searchParams.delete('page');\n    else url.searchParams.set('page', String(n));\n    return url.pathname + url.search;\n  };\n\n  /** @type {(number | '\u2026')[]} */\n  const parts = [];\n  const around = 2;\n  for (let n = 1; n <= pages; n++) {\n    if (n === 1 || n === pages || Math.abs(n - current) <= around) parts.push(n);\n    else if (parts[parts.length - 1] !== '\u2026') parts.push('\u2026');\n  }\n\n  let lastVisible = 0;\n  let sawEllipsis = false;\n  const items = parts\n    .map((part) => {\n      if (part === '\u2026') {\n        sawEllipsis = true;\n        return `<li class=\"pagination__item pagination__item--gap\"><span class=\"pagination__link pagination__link--gap\" aria-hidden=\"true\">&hellip;</span></li>`;\n      }\n      const hideOnMobile = part !== 1 && part !== pages && Math.abs(part - current) > 1;\n      let gap = '';\n      if (!hideOnMobile) {\n        if (lastVisible > 0 && part > lastVisible + 1 && !sawEllipsis) {\n          gap = `<li class=\"pagination__item pagination__item--mobile-only pagination__item--gap\"><span class=\"pagination__link pagination__link--gap\" aria-hidden=\"true\">&hellip;</span></li>`;\n        }\n        lastVisible = part;\n        sawEllipsis = false;\n      }\n      const li = `pagination__item${hideOnMobile ? ' pagination__item--mobile-hide' : ''}`;\n      const inner =\n        part === current\n          ? `<span class=\"pagination__link pagination__link--page pagination__link--current\" aria-current=\"page\">${part}</span>`\n          : `<a href=\"${escapeHtml(pageUrl(part))}\" aria-label=\"${escapeHtml(config.t.page.replace('__N__', String(part)))}\" class=\"pagination__link pagination__link--page\">${part}</a>`;\n      return `${gap}<li class=\"${li}\">${inner}</li>`;\n    })\n    .join('');\n\n  const arrow = (/** @type {number} */ n, /** @type {boolean} */ enabled, /** @type {string} */ label, /** @type {string} */ icon) =>\n    enabled\n      ? `<a href=\"${escapeHtml(pageUrl(n))}\" aria-label=\"${escapeHtml(label)}\" class=\"pagination__link pagination__link--arrow\">${icon}</a>`\n      : `<span aria-label=\"${escapeHtml(label)}\" class=\"pagination__link pagination__link--arrow pagination__link--disabled\" aria-disabled=\"true\">${icon}</span>`;\n\n  return `<nav class=\"pagination\" aria-label=\"${escapeHtml(config.t.pageNav)}\" data-current_page=\"${current}\">\n    <ul class=\"pagination__list\" role=\"list\">\n      <li class=\"pagination__item\">${arrow(current - 1, current > 1, config.t.previous, config.icons.chevronLeft)}</li>\n      ${items}\n      <li class=\"pagination__item\">${arrow(current + 1, current < pages, config.t.next, config.icons.chevronRight)}</li>\n    </ul>\n  </nav>`;\n}\n"],
  "mappings": "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",
  "names": ["root"]
}
