{
  "version": 3,
  "sources": ["/cdn/shop/t/218/assets/custom-search.js?custom-search-v=6"],
  "sourcesContent": ["import { Component } from '@theme/component';\nimport { DialogOpenEvent } from '@theme/dialog';\nimport { debounce } from '@theme/utilities';\n\nconst MIN_QUERY_LENGTH = 3;\nconst CACHE_VERSION = 'v8';\nconst METAOBJECT_PAGE_SIZE = 50;\nconst MAX_METAOBJECT_PAGES_PER_TYPE = 10;\nconst PRODUCT_PAGE_SIZE = 100;\nconst PRODUCT_VARIANT_PAGE_SIZE = 250;\nconst PATENTS_AND_TRADEMARKS_URL = '/pages/patents-and-trademarks';\n\nconst PRIORITY_PRODUCT_HANDLES = ['umma-diamond-sonic-toothbrush', 'umma-diamond-sonic-toothbrush-int'];\nconst PRIORITY_PRODUCT_IDS = ['6544775577702', '7790864367718'];\n\nconst TYPE_GROUPS = {\n    faqs: 'faqs',\n    patents: 'legal',\n    trademarks: 'legal',\n    product_support_assets: 'support',\n    testimonials: 'testimonials',\n    press_awards: 'press',\n    videos: 'videos',\n};\n\nconst TYPE_LABELS = {\n    faqs: 'FAQ',\n    patents: 'Patent',\n    trademarks: 'Trademark',\n    product_support_assets: 'Support',\n    testimonials: 'Testimonial',\n    press_awards: 'Press',\n    videos: 'Video',\n};\n\nconst TYPE_ICONS = {\n    faqs: '?',\n    patents: 'TM',\n    trademarks: 'TM',\n    product_support_assets: 'i',\n    testimonials: 'Q',\n    press_awards: '*',\n    videos: 'V',\n    pages: 'P',\n    articles: 'A',\n    collections: 'C',\n};\n\nconst TYPE_ICON_CLASSES = {\n    faqs: 'custom-search-results__media--teal',\n    patents: 'custom-search-results__media--blue',\n    trademarks: 'custom-search-results__media--blue',\n    product_support_assets: 'custom-search-results__media--green',\n    testimonials: 'custom-search-results__media--purple',\n    press_awards: 'custom-search-results__media--gold',\n    videos: 'custom-search-results__media--coral',\n    pages: 'custom-search-results__media--gray',\n    articles: 'custom-search-results__media--gray',\n    collections: 'custom-search-results__media--gray',\n};\n\nconst FIELD_WEIGHTS = {\n    title: 100,\n    subtitle: 75,\n    summary: 65,\n    description: 50,\n    metaDescription: 45,\n    content: 25,\n    context: 12,\n};\n\nconst SHOPIFY_GROUP_SCORES = {\n    products: 360,\n    pages: 180,\n    articles: 190,\n    collections: 170,\n};\n\nconst METAOBJECT_CONFIG = {\n    faq_categories: {\n        searchable: false,\n        fields: {\n            title: ['title'],\n            description: ['description'],\n            context: ['display_eligible'],\n        },\n    },\n    video_categories: {\n        searchable: false,\n        fields: {\n            title: ['title'],\n            description: ['meta_description'],\n        },\n    },\n    faqs: {\n        fields: {\n            title: ['question'],\n            summary: ['summary'],\n            content: ['answer'],\n            context: ['categories', 'products'],\n        },\n    },\n    patents: {\n        fields: {\n            title: ['product_name'],\n            subtitle: ['page_title', 'code'],\n            content: ['description'],\n            context: ['products'],\n        },\n    },\n    trademarks: {\n        fields: {\n            title: ['name'],\n            subtitle: ['code'],\n            content: ['description'],\n            context: ['products'],\n        },\n    },\n    product_support_assets: {\n        fields: {\n            title: ['product_name'],\n            context: ['products'],\n        },\n    },\n    testimonials: {\n        fields: {\n            title: ['title', 'attribution'],\n            content: ['content'],\n            context: ['products', 'rating'],\n        },\n    },\n    press_awards: {\n        fields: {\n            title: ['title'],\n            subtitle: ['subtitle', 'publication'],\n            summary: ['summary'],\n            content: ['content'],\n            context: ['categories', 'products', 'published_at'],\n        },\n    },\n    videos: {\n        fields: {\n            title: ['title'],\n            metaDescription: ['description'],\n            content: ['content'],\n            context: ['name', 'categories', 'subcategory', 'products'],\n        },\n    },\n};\n\n/**\n * @typedef {object} SearchField\n * @property {string} key\n * @property {string} tier\n * @property {string} value\n * @property {number} weight\n */\n\n/**\n * @typedef {object} SearchResult\n * @property {string} id\n * @property {string} type\n * @property {string} group\n * @property {string} label\n * @property {string} [handle]\n * @property {string} [productId]\n * @property {string} [variantId]\n * @property {string} title\n * @property {string} [subtitle]\n * @property {string} [excerpt]\n * @property {string} [url]\n * @property {{ url: string, alt: string } | null} [image]\n * @property {SearchField[]} fields\n * @property {number} [score]\n * @property {SearchResult[]} [variants]\n * @property {boolean} [available] Variant results only: false when the variant is sold out.\n */\n\nlet memoryIndex = null;\nlet indexPromise = null;\nlet memoryProductIndex = null;\nlet productIndexPromise = null;\nlet iconMap = null;\n\n/**\n * @typedef {object} Refs\n * @property {HTMLInputElement} searchInput\n * @property {HTMLElement} customSearchResults\n * @property {HTMLElement} customSearchStatus\n * @property {HTMLButtonElement} [resetButton]\n *\n * @extends {Component<Refs>}\n */\nclass CustomSearchComponent extends Component {\n    requiredRefs = ['searchInput', 'customSearchResults', 'customSearchStatus'];\n\n    /** @type {AbortController | null} */\n    #activeSearch = null;\n\n    /** @type {SearchResult[]} */\n    #currentResults = [];\n\n    #selectedIndex = -1;\n\n    connectedCallback() {\n        super.connectedCallback();\n\n        this.dialog?.addEventListener(DialogOpenEvent.eventName, this.handleDialogOpen);\n        this.addEventListener('click', this.handleResultsClick);\n    }\n\n    disconnectedCallback() {\n        super.disconnectedCallback();\n\n        this.dialog?.removeEventListener(DialogOpenEvent.eventName, this.handleDialogOpen);\n        this.#activeSearch?.abort();\n    }\n\n    get dialog() {\n        return this.closest('dialog-component');\n    }\n\n    get config() {\n        const configElement = this.querySelector('[data-custom-search-config]');\n        if (!(configElement instanceof HTMLScriptElement)) return null;\n\n        try {\n            return JSON.parse(configElement.textContent || '{}');\n        } catch (error) {\n            console.warn('Custom search config could not be parsed.', error);\n            return null;\n        }\n    }\n\n    handleDialogOpen = () => {\n        this.refs.searchInput.focus();\n        this.#warmIndex();\n    };\n\n    handleInput = debounce(() => {\n        this.#search();\n    }, 180);\n\n    handleReset = () => {\n        this.refs.searchInput.value = '';\n        this.#currentResults = [];\n        this.#selectedIndex = -1;\n        this.#activeSearch?.abort();\n        this.#renderPrompt();\n        this.refs.searchInput.focus();\n    };\n\n    /**\n     * @param {KeyboardEvent} event\n     */\n    handleKeyDown = async (event) => {\n        if (event.key === 'Escape') {\n            this.handleReset();\n            return;\n        }\n\n        if (!this.#currentResults.length) return;\n\n        if (event.key === 'ArrowDown') {\n            event.preventDefault();\n            this.#selectedIndex = this.#selectedIndex < this.#currentResults.length - 1 ? this.#selectedIndex + 1 : 0;\n            this.#updateSelection();\n        }\n\n        if (event.key === 'ArrowUp') {\n            event.preventDefault();\n            this.#selectedIndex = this.#selectedIndex > 0 ? this.#selectedIndex - 1 : this.#currentResults.length - 1;\n            this.#updateSelection();\n        }\n\n        if (event.key === 'Enter') {\n            const result = this.#currentResults[this.#selectedIndex] || this.#currentResults[0];\n\n            if (result) {\n                event.preventDefault();\n                await openResult(result, this.dialog);\n            }\n        }\n    };\n\n    /**\n     * @param {MouseEvent} event\n     */\n    handleResultsClick = async (event) => {\n        const target = event.target;\n        if (!(target instanceof HTMLElement)) return;\n\n        const item = target.closest('[data-custom-search-result]');\n        if (!(item instanceof HTMLElement)) return;\n\n        const result = this.#currentResults.find((entry) => entry.id === item.dataset.resultId) || createResultFromElement(item);\n        if (!result) return;\n\n        event.preventDefault();\n        await openResult(result, this.dialog);\n    };\n\n    async #warmIndex() {\n        const config = this.config;\n        if (!config) return;\n\n        try {\n            await Promise.all([getMetaobjectIndex(config), getProductIndex(config)]);\n            this.#renderPrompt();\n        } catch (error) {\n            console.warn('Custom search index could not be loaded.', error);\n            this.#setStatus('Custom content search is unavailable right now.');\n        }\n    }\n\n    async #search() {\n        const query = this.refs.searchInput.value.trim();\n\n        this.#activeSearch?.abort();\n        this.#selectedIndex = -1;\n\n        if (query.length < MIN_QUERY_LENGTH) {\n            this.#currentResults = [];\n            this.#renderPrompt();\n            return;\n        }\n\n        const config = this.config;\n        if (!config) return;\n\n        const controller = new AbortController();\n        this.#activeSearch = controller;\n        this.#setLoadingStatus();\n\n        try {\n            const [shopifyResults, metaobjectIndex, productIndex] = await Promise.all([\n                fetchShopifyResults(query, config, controller.signal),\n                getMetaobjectIndex(config),\n                getProductIndex(config),\n            ]);\n\n            if (controller.signal.aborted) return;\n\n            const metaobjectResults = searchMetaobjects(query, metaobjectIndex);\n            const indexedProductResults = searchProducts(query, productIndex, {\n                hideSoldOutVariants: config.hideSoldOutVariants === true,\n            });\n\n            this.#currentResults = mergeResults(query, shopifyResults, indexedProductResults, metaobjectResults)\n                .filter((result) => checkResultMarketProduct(result, config))\n                .map((result) => ({ ...result, url: normalizeResultMarketUrl(result.url, config) }));\n            this.#renderResults();\n        } catch (error) {\n            if (controller.signal.aborted) return;\n            console.warn('Custom search failed.', error);\n            this.#currentResults = [];\n            this.#setStatus('Search is unavailable right now.');\n        }\n    }\n\n    #renderPrompt() {\n        const query = this.refs.searchInput.value.trim();\n        this.refs.customSearchResults.innerHTML = '';\n        this.#setStatus(query.length ? `Please enter at least ${MIN_QUERY_LENGTH} characters.` : 'Start typing to search.');\n        this.refs.resetButton?.toggleAttribute('hidden', query.length === 0);\n    }\n\n    #renderResults() {\n        this.refs.resetButton?.toggleAttribute('hidden', this.refs.searchInput.value.trim().length === 0);\n\n        if (!this.#currentResults.length) {\n            this.refs.customSearchResults.innerHTML = '';\n            this.#setStatus('No results found.');\n            return;\n        }\n\n        this.#setStatus(`${this.#currentResults.length} results found.`);\n        this.refs.customSearchResults.innerHTML = renderResultGroups(this.#currentResults);\n    }\n\n    #updateSelection() {\n        const items = Array.from(this.refs.customSearchResults.querySelectorAll('[data-custom-search-result]'));\n\n        items.forEach((item, index) => {\n            item.toggleAttribute('aria-selected', index === this.#selectedIndex);\n\n            if (index === this.#selectedIndex) {\n                item.scrollIntoView({ block: 'nearest' });\n            }\n        });\n    }\n\n    /**\n     * @param {string} message\n     */\n    #setStatus(message) {\n        this.refs.customSearchStatus.textContent = message;\n    }\n\n    #setLoadingStatus() {\n        this.refs.customSearchStatus.innerHTML = `\n            <span class=\"pending--loader custom-search-results__loader\" aria-hidden=\"true\"></span>\n            <span class=\"visually-hidden\">Searching...</span>\n        `;\n    }\n}\n\nif (!customElements.get('custom-search-component')) {\n    customElements.define('custom-search-component', CustomSearchComponent);\n}\n\n/**\n * @param {Record<string, any>} config\n * @returns {Promise<SearchResult[]>}\n */\nasync function getMetaobjectIndex(config) {\n    if (memoryIndex) return memoryIndex;\n    if (indexPromise) return indexPromise;\n\n    const cached = readCache(config);\n    if (cached) {\n        memoryIndex = cached;\n        return cached;\n    }\n\n    indexPromise = fetchMetaobjectIndex(config)\n        .then((index) => {\n            memoryIndex = index;\n            writeCache(config, index);\n            return index;\n        })\n        .finally(() => {\n            indexPromise = null;\n        });\n\n    return indexPromise;\n}\n\n/**\n * Keep API/cache destinations in the active market without changing explicit locale paths,\n * external URLs, fragments, or query parameters. Liquid supplies the market root and shop URL.\n * @param {string} value\n * @param {Record<string, any>} config\n * @returns {string}\n */\nfunction normalizeResultMarketUrl(value, config) {\n    if (!value || value.startsWith('#') || value.startsWith('?')) return value;\n    try {\n        const url = new URL(value, window.location.origin);\n        const shopOrigin = new URL(config.shopUrl || window.location.origin).origin;\n        const origins = [window.location.origin, shopOrigin, 'https://taoclean.com', 'https://www.taoclean.com'];\n        if (!['http:', 'https:'].includes(url.protocol) || !origins.includes(url.origin)) return value;\n        const root = (config.routesRoot || '/').replace(/\\/$/, '');\n        const path = url.pathname;\n        if (path !== '/' && !/^\\/(products|collections|pages|blogs|policies|cart|search|account)(?:\\/|$)/.test(path)) {\n            return value;\n        }\n        return `${root}${path}${url.search}${url.hash}`;\n    } catch {\n        return value;\n    }\n}\n\n/**\n * Search should offer the country's Diamond product, never relabel a US variant as international.\n * Filtering occurs after cache reads so earlier cached indexes cannot bypass this rule.\n * @param {SearchResult} result\n * @param {Record<string, any>} config\n * @returns {boolean}\n */\nfunction checkResultMarketProduct(result, config) {\n    if (!config.diamondHandle) return true;\n    const diamondHandles = ['umma-diamond-sonic-toothbrush', 'umma-diamond-sonic-toothbrush-int'];\n    let handle = result.handle;\n    if (!handle && result.url) {\n        try {\n            handle = new URL(result.url, window.location.origin).pathname.match(/\\/products\\/([^/]+)\\/?$/)?.[1];\n        } catch {\n            return true;\n        }\n    }\n    if (diamondHandles.includes(handle)) return handle === config.diamondHandle;\n    return true;\n}\n\n/**\n * @param {Record<string, any>} config\n * @returns {Promise<SearchResult[]>}\n */\nasync function fetchMetaobjectIndex(config) {\n    const types = Object.keys(METAOBJECT_CONFIG);\n    const allEntries = [];\n\n    for (const type of types) {\n        const entries = await fetchMetaobjectsByType(type, config);\n        allEntries.push(...entries);\n    }\n\n    return allEntries\n        .map(normalizeMetaobject)\n        .filter((entry) => entry && entry.fields.some((field) => field.value));\n}\n\n/**\n * @param {Record<string, any>} config\n * @returns {Promise<SearchResult[]>}\n */\nasync function getProductIndex(config) {\n    if (memoryProductIndex) return memoryProductIndex;\n    if (productIndexPromise) return productIndexPromise;\n\n    const cached = readCache(config, 'products');\n    if (cached) {\n        memoryProductIndex = cached;\n        return cached;\n    }\n\n    productIndexPromise = fetchProductIndex(config)\n        .then((index) => {\n            memoryProductIndex = index;\n            writeCache(config, index, 'products');\n            return index;\n        })\n        .finally(() => {\n            productIndexPromise = null;\n        });\n\n    return productIndexPromise;\n}\n\n/**\n * @param {Record<string, any>} config\n * @returns {Promise<SearchResult[]>}\n */\nasync function fetchProductIndex(config) {\n    const products = [];\n    let cursor = null;\n\n    do {\n        const response = await fetch(config.storefrontApiUrl, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n                'X-Shopify-Storefront-Access-Token': config.storefrontAccessToken,\n            },\n            body: JSON.stringify({\n                query: PRODUCT_INDEX_QUERY,\n                variables: {\n                    first: PRODUCT_PAGE_SIZE,\n                    after: cursor,\n                    variantsFirst: PRODUCT_VARIANT_PAGE_SIZE,\n                    country: config.country,\n                },\n            }),\n        });\n\n        if (!response.ok) {\n            throw new Error(`Storefront product index request failed with HTTP ${response.status}`);\n        }\n\n        const payload = await response.json();\n        if (payload.errors?.length) {\n            throw new Error(payload.errors.map((error) => error.message).join(', '));\n        }\n\n        const connection = payload.data?.products;\n        products.push(...(connection?.nodes || []));\n\n        cursor = connection?.pageInfo?.hasNextPage ? connection.pageInfo.endCursor : null;\n    } while (cursor);\n\n    return products.filter((product) => !checkShopifyResultExcluded(product, 'products', config)).map(normalizeIndexedProduct);\n}\n\nconst PRODUCT_INDEX_QUERY = `\n  query CustomSearchProductIndex($first: Int!, $after: String, $variantsFirst: Int!, $country: CountryCode) @inContext(country: $country) {\n    products(first: $first, after: $after, sortKey: TITLE) {\n      nodes {\n        id\n        title\n        handle\n        vendor\n        productType\n        description\n        onlineStoreUrl\n        featuredImage {\n          url\n          altText\n        }\n        searchExclude: metafield(namespace: \"site_search\", key: \"exclude\") {\n          value\n        }\n        seoHidden: metafield(namespace: \"seo\", key: \"hidden\") {\n          value\n        }\n        variants(first: $variantsFirst) {\n          nodes {\n            id\n            title\n            sku\n            availableForSale\n            image {\n              url\n              altText\n            }\n            selectedOptions {\n              name\n              value\n            }\n          }\n        }\n      }\n      pageInfo {\n        hasNextPage\n        endCursor\n      }\n    }\n  }\n`;\n\n/**\n * @param {string} type\n * @param {Record<string, any>} config\n */\nasync function fetchMetaobjectsByType(type, config) {\n    const results = [];\n    let cursor = null;\n\n    for (let page = 0; page < MAX_METAOBJECT_PAGES_PER_TYPE; page += 1) {\n        const response = await fetch(config.storefrontApiUrl, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n                'X-Shopify-Storefront-Access-Token': config.storefrontAccessToken,\n            },\n            body: JSON.stringify({\n                query: METAOBJECTS_QUERY,\n                variables: { type, first: METAOBJECT_PAGE_SIZE, after: cursor },\n            }),\n        });\n\n        if (!response.ok) {\n            throw new Error(`Storefront API request failed with HTTP ${response.status}`);\n        }\n\n        const payload = await response.json();\n        if (payload.errors?.length) {\n            throw new Error(payload.errors.map((error) => error.message).join(', '));\n        }\n\n        const connection = payload.data?.metaobjects;\n        const nodes = connection?.nodes || [];\n        results.push(...nodes);\n\n        if (!connection?.pageInfo?.hasNextPage) break;\n        cursor = connection.pageInfo.endCursor;\n    }\n\n    return results;\n}\n\nconst REFERENCE_FRAGMENT = `\n  __typename\n  ... on Product {\n    id\n    title\n    handle\n    onlineStoreUrl\n    featuredImage {\n      url\n      altText\n    }\n  }\n  ... on GenericFile {\n    id\n    url\n  }\n  ... on MediaImage {\n    id\n    image {\n      url\n      altText\n    }\n  }\n  ... on Video {\n    id\n    sources {\n      url\n      mimeType\n      format\n    }\n  }\n  ... on Metaobject {\n    id\n    type\n    handle\n    onlineStoreUrl\n    fields {\n      key\n      type\n      value\n    }\n  }\n`;\n\nconst METAOBJECTS_QUERY = `\n  query CustomSearchMetaobjects($type: String!, $first: Int!, $after: String) {\n    metaobjects(type: $type, first: $first, after: $after) {\n      nodes {\n        id\n        type\n        handle\n        onlineStoreUrl\n        fields {\n          key\n          type\n          value\n          reference {\n            ${REFERENCE_FRAGMENT}\n          }\n          references(first: 20) {\n            nodes {\n              ${REFERENCE_FRAGMENT}\n            }\n          }\n        }\n      }\n      pageInfo {\n        hasNextPage\n        endCursor\n      }\n    }\n  }\n`;\n\n/**\n * @param {any} metaobject\n * @returns {SearchResult | null}\n */\nfunction normalizeMetaobject(metaobject) {\n    const config = METAOBJECT_CONFIG[metaobject.type];\n    if (!config || config.searchable === false) return null;\n\n    const fieldsByKey = new Map((metaobject.fields || []).map((field) => [field.key, field]));\n    const title = getFirstValue(fieldsByKey, config.fields.title) || metaobject.handle || metaobject.id;\n    const subtitle = getFirstValue(fieldsByKey, config.fields.subtitle || config.fields.summary || []);\n    const excerpt = getFirstValue(fieldsByKey, [\n        ...(config.fields.summary || []),\n        ...(config.fields.metaDescription || []),\n        ...(config.fields.description || []),\n        ...(config.fields.content || []),\n    ]);\n\n    return {\n        id: metaobject.id,\n        type: metaobject.type,\n        group: TYPE_GROUPS[metaobject.type] || 'top',\n        label: TYPE_LABELS[metaobject.type] || metaobject.type,\n        handle: metaobject.handle || '',\n        title,\n        subtitle,\n        excerpt: checkSameText(subtitle, excerpt) ? '' : truncateText(excerpt, 120),\n        url: getResultUrl(metaobject, fieldsByKey),\n        image: null,\n        fields: createSearchFields(fieldsByKey, config.fields),\n    };\n}\n\n/**\n * @param {Map<string, any>} fieldsByKey\n * @param {Record<string, string[]>} fieldConfig\n * @returns {SearchField[]}\n */\nfunction createSearchFields(fieldsByKey, fieldConfig) {\n    return Object.entries(fieldConfig).flatMap(([tier, keys]) => {\n        const weight = FIELD_WEIGHTS[tier] || FIELD_WEIGHTS.context;\n\n        return keys\n            .map((key) => {\n                const field = fieldsByKey.get(key);\n                const value = extractFieldText(field);\n\n                return value ? { key, tier, value, weight } : null;\n            })\n            .filter(Boolean);\n    });\n}\n\n/**\n * @param {Map<string, any>} fieldsByKey\n * @param {string[]} keys\n * @returns {string}\n */\nfunction getFirstValue(fieldsByKey, keys = []) {\n    for (const key of keys) {\n        const value = extractFieldText(fieldsByKey.get(key));\n        if (value) return value;\n    }\n\n    return '';\n}\n\n/**\n * @param {Record<string, any>} product\n * @returns {SearchResult}\n */\nfunction normalizeIndexedProduct(product) {\n    const title = product.title || product.handle || 'Product';\n    const productUrl = product.onlineStoreUrl || '';\n    const variants = (product.variants?.nodes || []).map((variant) => normalizeIndexedVariant(variant, product));\n\n    return {\n        id: product.id || `products-${product.handle || title}`,\n        productId: product.id || '',\n        type: 'products',\n        group: 'products',\n        label: 'Product',\n        handle: product.handle || '',\n        title,\n        subtitle: getShopifySubtitle(product, 'products'),\n        excerpt: truncateText(stripHtml(product.description || ''), 120),\n        url: productUrl,\n        image: getShopifyResultImage(product),\n        score: 0,\n        fields: [\n            createLiteralSearchField('title', 'title', title),\n            createLiteralSearchField('vendor', 'context', product.vendor),\n            createLiteralSearchField('productType', 'context', product.productType),\n            createLiteralSearchField('description', 'description', product.description),\n        ].filter(Boolean),\n        variants,\n    };\n}\n\n/**\n * @param {Record<string, any>} variant\n * @param {Record<string, any>} product\n * @returns {SearchResult}\n */\nfunction normalizeIndexedVariant(variant, product) {\n    const optionText = (variant.selectedOptions || []).map((option) => option.value).filter(Boolean).join(' ');\n    const variantTitle = [variant.title, optionText].filter(Boolean).join(' ');\n    const title = product.title || product.handle || 'Product';\n\n    return {\n        id: variant.id || `${product.id || product.handle}-${variantTitle}`,\n        productId: product.id || '',\n        variantId: variant.id || '',\n        type: 'products',\n        group: 'products',\n        label: 'Product',\n        handle: product.handle || '',\n        title,\n        subtitle: variant.title && variant.title !== 'Default Title' ? variant.title : '',\n        excerpt: truncateText(stripHtml(product.description || ''), 120),\n        url: createVariantUrl(product.onlineStoreUrl || '', variant.id),\n        image: getVariantResultImage(variant, product),\n        available: variant.availableForSale !== false,\n        score: 0,\n        fields: [\n            createLiteralSearchField('variantTitle', 'title', variantTitle),\n            createLiteralSearchField('sku', 'subtitle', variant.sku),\n        ].filter(Boolean),\n    };\n}\n\n/**\n * @param {string} key\n * @param {string} tier\n * @param {string} value\n * @returns {SearchField | null}\n */\nfunction createLiteralSearchField(key, tier, value) {\n    const normalized = normalizeWhitespace(value);\n    if (!normalized) return null;\n\n    return {\n        key,\n        tier,\n        value: normalized,\n        weight: FIELD_WEIGHTS[tier] || FIELD_WEIGHTS.context,\n    };\n}\n\n/**\n * @param {string} productUrl\n * @param {string} variantId\n * @returns {string}\n */\nfunction createVariantUrl(productUrl, variantId) {\n    if (!productUrl || !variantId) return productUrl;\n\n    const variantNumericId = getNumericId(variantId);\n    if (!variantNumericId) return productUrl;\n\n    try {\n        const url = new URL(productUrl, window.location.origin);\n        url.searchParams.set('variant', variantNumericId);\n        return url.href;\n    } catch (_error) {\n        const separator = productUrl.includes('?') ? '&' : '?';\n        return `${productUrl}${separator}variant=${encodeURIComponent(variantNumericId)}`;\n    }\n}\n\n/**\n * @param {string} id\n * @returns {string}\n */\nfunction getNumericId(id) {\n    return String(id || '').split('/').pop() || '';\n}\n\n/**\n * @param {any} metaobject\n * @param {Map<string, any>} fieldsByKey\n * @returns {string}\n */\nfunction getResultUrl(metaobject, fieldsByKey) {\n    if (metaobject.type === 'patents' || metaobject.type === 'trademarks') {\n        return PATENTS_AND_TRADEMARKS_URL;\n    }\n\n    if (metaobject.type === 'product_support_assets') {\n        if (metaobject.onlineStoreUrl) return metaobject.onlineStoreUrl;\n\n        const supportAssetUrl = getFileReferenceUrl(fieldsByKey.get('product_support_document'));\n        if (supportAssetUrl) return supportAssetUrl;\n    }\n\n    const externalUrl = extractFieldText(fieldsByKey.get('url_external'));\n    if (externalUrl) return externalUrl;\n    if (metaobject.onlineStoreUrl) return metaobject.onlineStoreUrl;\n\n    const productField = fieldsByKey.get('products');\n    const firstProduct = getReferenceNodes(productField).find((node) => node?.onlineStoreUrl);\n\n    return firstProduct?.onlineStoreUrl || '';\n}\n\n/**\n * @param {any} field\n * @returns {string}\n */\nfunction getFileReferenceUrl(field) {\n    const fileReference = getReferenceNodes(field).find(Boolean);\n\n    if (fileReference?.url) return fileReference.url;\n    if (fileReference?.image?.url) return fileReference.image.url;\n    if (fileReference?.sources?.[0]?.url) return fileReference.sources[0].url;\n\n    return '';\n}\n\n/**\n * @param {any} field\n * @returns {string}\n */\nfunction extractFieldText(field) {\n    if (!field) return '';\n\n    const referenceText = getReferenceNodes(field).map(getReferenceText).filter(Boolean).join(' ');\n    const valueText = flattenValue(field.value, field.type);\n\n    return normalizeWhitespace([valueText, referenceText].filter(Boolean).join(' '));\n}\n\n/**\n * @param {any} field\n * @returns {any[]}\n */\nfunction getReferenceNodes(field) {\n    return [field?.reference, ...(field?.references?.nodes || [])].filter(Boolean);\n}\n\n/**\n * @param {any} reference\n * @returns {string}\n */\nfunction getReferenceText(reference) {\n    if (!reference) return '';\n\n    if (reference.title) return reference.title;\n    if (reference.type === 'Metaobject') {\n        return (reference.fields || [])\n            .filter((field) => ['title', 'name', 'question', 'meta_description', 'description'].includes(field.key))\n            .map((field) => flattenValue(field.value, field.type))\n            .join(' ');\n    }\n\n    return '';\n}\n\n/**\n * @param {string | null} value\n * @param {string} type\n * @returns {string}\n */\nfunction flattenValue(value, type = '') {\n    if (!value) return '';\n\n    if (type.includes('rich_text_field')) {\n        try {\n            const parsed = JSON.parse(value);\n            return collectRichText(parsed).join(' ');\n        } catch (_error) {\n            return value;\n        }\n    }\n\n    if (type === 'rating') {\n        try {\n            const parsed = JSON.parse(value);\n            return parsed?.value ? String(parsed.value) : value;\n        } catch (_error) {\n            return value;\n        }\n    }\n\n    return value;\n}\n\n/**\n * @param {any} node\n * @returns {string[]}\n */\nfunction collectRichText(node) {\n    if (!node || typeof node !== 'object') return [];\n\n    const values = [];\n    if (typeof node.value === 'string') values.push(node.value);\n    if (typeof node.text === 'string') values.push(node.text);\n\n    for (const child of node.children || []) {\n        values.push(...collectRichText(child));\n    }\n\n    return values;\n}\n\n/**\n * @param {string} query\n * @param {SearchResult[]} index\n * @param {{ hideSoldOutVariants?: boolean }} [options] hideSoldOutVariants mirrors the\n *   \"Hide sold-out variants (US)\" theme setting: sold-out variants get no result row of their own.\n * @returns {SearchResult[]}\n */\nfunction searchProducts(query, index, { hideSoldOutVariants = false } = {}) {\n    const normalizedQuery = normalizeSearchValue(query);\n    const tokens = normalizedQuery.split(' ').filter(Boolean);\n\n    return index\n        .flatMap((product) => {\n            const productScore = getResultFieldScore(normalizedQuery, tokens, product.fields);\n            const ruleScore = getProductRuleScore(normalizedQuery, product);\n            const productResult =\n                productScore > 0 || ruleScore > 0 ? { ...product, score: productScore + ruleScore } : null;\n            const variantResults = (product.variants || [])\n                .map((variant) => {\n                    if (hideSoldOutVariants && variant.available === false) return null;\n\n                    const score = getResultFieldScore(normalizedQuery, tokens, variant.fields);\n\n                    return score > 0 ? { ...variant, score: score + 20 } : null;\n                })\n                .filter(Boolean);\n\n            return [productResult, ...variantResults].filter(Boolean);\n        })\n        .sort(compareResults);\n}\n\n/**\n * @param {string} query\n * @param {SearchResult} product\n * @returns {number}\n */\nfunction getProductRuleScore(query, product) {\n    let score = 0;\n    const title = normalizeSearchValue(product.title);\n\n    if (checkToothbrushQuery(query) && checkToothbrushTitle(title)) {\n        score += checkHeadsTitle(title) ? 700000 : 850000;\n\n        if (checkSanitizerTitle(title)) {\n            score -= 200000;\n        }\n    }\n\n    if (checkHeadsQuery(query) && checkToothbrushTitle(title)) score += 700000;\n    if (checkSanitizerQuery(query) && title.includes('sonic toothbrush')) score += 650000;\n\n    return score;\n}\n\n/**\n * @param {string} query\n * @param {string[]} tokens\n * @param {SearchField[]} fields\n * @returns {number}\n */\nfunction getResultFieldScore(query, tokens, fields) {\n    return fields.reduce((total, field) => total + getFieldScore(query, tokens, field), 0);\n}\n\n/**\n * @param {string} query\n * @param {SearchResult[]} index\n * @returns {SearchResult[]}\n */\nfunction searchMetaobjects(query, index) {\n    const normalizedQuery = normalizeSearchValue(query);\n    const tokens = normalizedQuery.split(' ').filter(Boolean);\n\n    return index\n        .map((result) => {\n            const score = getResultFieldScore(normalizedQuery, tokens, result.fields);\n\n            return score > 0 ? { ...result, score } : null;\n        })\n        .filter(Boolean)\n        .sort(compareResults);\n}\n\n/**\n * @param {string} query\n * @param {string[]} tokens\n * @param {SearchField} field\n */\nfunction getFieldScore(query, tokens, field) {\n    const value = normalizeSearchValue(field.value);\n    if (!value) return 0;\n\n    let score = 0;\n\n    if (value === query) score += field.weight * 8;\n    if (value.startsWith(query)) score += field.weight * 5;\n    if (value.includes(query)) score += field.weight * 3;\n\n    const words = value.split(' ');\n    const matchedTokens = tokens.filter((token) => words.some((word) => word === token || word.startsWith(token)));\n    score += matchedTokens.length * field.weight;\n\n    if (tokens.length > 1 && matchedTokens.length === tokens.length) {\n        score += field.weight * tokens.length * 4;\n\n        if (field.tier === 'title') {\n            score += field.weight * tokens.length * 6;\n        }\n    }\n\n    return score;\n}\n\n/**\n * @param {SearchResult} a\n * @param {SearchResult} b\n */\nfunction compareResults(a, b) {\n    if ((b.score || 0) !== (a.score || 0)) return (b.score || 0) - (a.score || 0);\n    return a.title.localeCompare(b.title);\n}\n\n/**\n * @param {string} query\n * @param {Record<string, any>} config\n * @param {AbortSignal} signal\n * @returns {Promise<SearchResult[]>}\n */\nasync function fetchShopifyResults(query, config, signal) {\n    const response = await fetch(config.storefrontApiUrl, {\n        method: 'POST',\n        headers: {\n            'Content-Type': 'application/json',\n            'X-Shopify-Storefront-Access-Token': config.storefrontAccessToken,\n        },\n        body: JSON.stringify({\n            query: SHOPIFY_SEARCH_QUERY,\n            variables: { query, country: config.country },\n        }),\n        signal,\n    });\n\n    if (!response.ok) throw new Error(`Storefront predictive search failed with HTTP ${response.status}`);\n\n    const payload = await response.json();\n    if (payload.errors?.length) {\n        throw new Error(payload.errors.map((error) => error.message).join(', '));\n    }\n\n    const results = payload?.data?.predictiveSearch || {};\n\n    return [\n        ...normalizeShopifyGroup(results.products || [], 'products', 'Product', config),\n        ...normalizeShopifyGroup(results.pages || [], 'pages', 'Page'),\n        ...normalizeShopifyGroup(results.articles || [], 'articles', 'Article'),\n        ...normalizeShopifyGroup(results.collections || [], 'collections', 'Collection'),\n    ];\n}\n\nconst SHOPIFY_SEARCH_QUERY = `\n  query CustomStandardSearch($query: String!, $country: CountryCode) @inContext(country: $country) {\n    predictiveSearch(\n      query: $query,\n      types: [PRODUCT, PAGE, ARTICLE, COLLECTION],\n      limit: 4,\n      limitScope: EACH\n    ) {\n      products {\n        id\n        title\n        handle\n        vendor\n        productType\n        description\n        onlineStoreUrl\n        featuredImage {\n          url\n          altText\n        }\n        searchExclude: metafield(namespace: \"site_search\", key: \"exclude\") {\n          value\n        }\n        seoHidden: metafield(namespace: \"seo\", key: \"hidden\") {\n          value\n        }\n      }\n      pages {\n        id\n        title\n        handle\n        bodySummary\n        onlineStoreUrl\n        searchExclude: metafield(namespace: \"site_search\", key: \"exclude\") {\n          value\n        }\n        seoHidden: metafield(namespace: \"seo\", key: \"hidden\") {\n          value\n        }\n      }\n      articles {\n        id\n        title\n        handle\n        excerpt\n        onlineStoreUrl\n        searchExclude: metafield(namespace: \"site_search\", key: \"exclude\") {\n          value\n        }\n        seoHidden: metafield(namespace: \"seo\", key: \"hidden\") {\n          value\n        }\n      }\n      collections {\n        id\n        title\n        handle\n        description\n        onlineStoreUrl\n        searchExclude: metafield(namespace: \"site_search\", key: \"exclude\") {\n          value\n        }\n        seoHidden: metafield(namespace: \"seo\", key: \"hidden\") {\n          value\n        }\n      }\n    }\n  }\n`;\n\n/**\n * @param {any[]} items\n * @param {string} group\n * @param {string} label\n * @returns {SearchResult[]}\n */\nfunction normalizeShopifyGroup(items, group, label, config = {}) {\n    return items\n        .filter((item) => !checkShopifyResultExcluded(item, group, config))\n        .map((item, index) => ({\n            id: item.id || `${group}-${item.onlineStoreUrl || item.url || item.handle || index}`,\n            productId: group === 'products' ? item.id || '' : '',\n            type: group,\n            group,\n            label,\n            title: item.title || item.name || item.handle || label,\n            subtitle: getShopifySubtitle(item, group),\n            excerpt: truncateText(stripHtml(item.bodySummary || item.excerpt || item.description || ''), 120),\n            url: item.onlineStoreUrl || item.url || item.online_store_url || '',\n            image: getShopifyResultImage(item),\n            score: (SHOPIFY_GROUP_SCORES[group] || 150) - index,\n            fields: [],\n        }));\n}\n\n/**\n * @param {Record<string, any>} item\n * @returns {{ url: string, alt: string } | null}\n */\nfunction getShopifyResultImage(item) {\n    if (!item.featuredImage?.url) return null;\n\n    return {\n        url: item.featuredImage.url,\n        alt: item.featuredImage.altText || item.title || '',\n    };\n}\n\n/**\n * @param {Record<string, any>} variant\n * @param {Record<string, any>} product\n * @returns {{ url: string, alt: string } | null}\n */\nfunction getVariantResultImage(variant, product) {\n    if (variant.image?.url) {\n        return {\n            url: variant.image.url,\n            alt: variant.image.altText || variant.title || product.title || '',\n        };\n    }\n\n    return getShopifyResultImage(product);\n}\n\n/**\n * @param {Record<string, any>} item\n * @param {string} group\n * @returns {boolean}\n */\nfunction checkShopifyResultExcluded(item, group, config = {}) {\n    if (group === 'products' && !item.onlineStoreUrl) return true;\n\n    if (checkMetafieldBoolean(item.searchExclude)) return true;\n    // The international Diamond is SEO-hidden to avoid duplicate indexing, but is\n    // the explicitly selected storefront replacement for non-US custom search.\n    if (group === 'products' && item.handle === config.diamondHandle) return false;\n    return checkMetafieldBoolean(item.seoHidden);\n}\n\n/**\n * @param {Record<string, any> | null | undefined} metafield\n * @returns {boolean}\n */\nfunction checkMetafieldBoolean(metafield) {\n    const value = metafield?.value;\n\n    return value === true || value === 'true' || value === 1 || value === '1';\n}\n\n/**\n * @param {any} item\n * @param {string} group\n * @returns {string}\n */\nfunction getShopifySubtitle(item, group) {\n    return '';\n}\n\n/**\n * @param {string} query\n * @param {SearchResult[]} shopifyResults\n * @param {SearchResult[]} indexedProductResults\n * @param {SearchResult[]} metaobjectResults\n * @returns {SearchResult[]}\n */\nfunction mergeResults(query, shopifyResults, indexedProductResults, metaobjectResults) {\n    const products = dedupeResults([\n        ...indexedProductResults,\n        ...shopifyResults.filter((result) => result.group === 'products'),\n    ]).sort(compareResults);\n    const nonProducts = [...shopifyResults.filter((result) => result.group !== 'products'), ...metaobjectResults].sort(\n        compareResults\n    );\n\n    return applyRankingOverrides(query, [...products, ...nonProducts]);\n}\n\n/**\n * @param {SearchResult[]} results\n * @returns {SearchResult[]}\n */\nfunction dedupeResults(results) {\n    const resultByKey = new Map();\n\n    for (const result of results) {\n        const key = result.variantId || result.productId || result.id || result.url;\n        const existing = resultByKey.get(key);\n\n        if (!existing || (result.score || 0) > (existing.score || 0)) {\n            resultByKey.set(key, result);\n        }\n    }\n\n    return Array.from(resultByKey.values());\n}\n\n/**\n * @param {string} query\n * @param {SearchResult[]} results\n * @returns {SearchResult[]}\n */\nfunction applyRankingOverrides(query, results) {\n    const normalizedQuery = normalizeSearchValue(query);\n\n    return results\n        .map((result, index) => ({\n            result,\n            index,\n            priority: getRankingPriority(normalizedQuery, result),\n        }))\n        .sort((a, b) => {\n            if (b.priority !== a.priority) return b.priority - a.priority;\n            if ((b.result.score || 0) !== (a.result.score || 0)) return (b.result.score || 0) - (a.result.score || 0);\n            return a.index - b.index;\n        })\n        .map((entry) => entry.result);\n}\n\n/**\n * @param {string} query\n * @param {SearchResult} result\n * @returns {number}\n */\nfunction getRankingPriority(query, result) {\n    if (result.group !== 'products') return 0;\n\n    const title = normalizeSearchValue(result.title);\n    let priority = 100;\n\n    if (checkPriorityProduct(result)) priority += 1000000;\n    if (checkToothbrushQuery(query) && checkToothbrushTitle(title)) {\n        priority += checkHeadsTitle(title) ? 700000 : 850000;\n\n        if (checkSanitizerTitle(title)) {\n            priority -= 200000;\n        }\n    }\n\n    if (checkHeadsQuery(query) && checkToothbrushTitle(title)) priority += 700000;\n    if (checkSanitizerQuery(query) && title.includes('sonic toothbrush')) priority += 650000;\n\n    return priority;\n}\n\n/**\n * @param {SearchResult} result\n * @returns {boolean}\n */\nfunction checkPriorityProduct(result) {\n    const handle = normalizeSearchValue(result.handle);\n    const productId = getNumericId(result.productId || result.id);\n\n    return PRIORITY_PRODUCT_HANDLES.includes(handle) || PRIORITY_PRODUCT_IDS.includes(productId);\n}\n\n/**\n * @param {string} query\n * @returns {boolean}\n */\nfunction checkToothbrushQuery(query) {\n    return checkQueryMatchesPhrase(query, 'toothbrush');\n}\n\n/**\n * @param {string} title\n * @returns {boolean}\n */\nfunction checkToothbrushTitle(title) {\n    return title.includes('toothbrush');\n}\n\n/**\n * @param {string} title\n * @returns {boolean}\n */\nfunction checkHeadsTitle(title) {\n    return /\\bheads?\\b/.test(title);\n}\n\n/**\n * @param {string} title\n * @returns {boolean}\n */\nfunction checkSanitizerTitle(title) {\n    return title.includes('sanitizer');\n}\n\n/**\n * @param {string} query\n * @returns {boolean}\n */\nfunction checkHeadsQuery(query) {\n    return checkQueryMatchesAnyPhrase(query, ['heads', 'brush heads']);\n}\n\n/**\n * @param {string} query\n * @returns {boolean}\n */\nfunction checkSanitizerQuery(query) {\n    return checkQueryMatchesAnyPhrase(query, ['sanitizer', 'germ shield']);\n}\n\n/**\n * @param {string} query\n * @param {string[]} phrases\n * @returns {boolean}\n */\nfunction checkQueryMatchesAnyPhrase(query, phrases) {\n    return phrases.some((phrase) => checkQueryMatchesPhrase(query, phrase));\n}\n\n/**\n * @param {string} query\n * @param {string} phrase\n * @returns {boolean}\n */\nfunction checkQueryMatchesPhrase(query, phrase) {\n    const normalizedPhrase = normalizeSearchValue(phrase);\n\n    return query.includes(normalizedPhrase) || normalizedPhrase.startsWith(query);\n}\n\n/**\n * @param {SearchResult[]} results\n * @returns {string}\n */\nfunction renderResultGroups(results) {\n    return `\n        <ul class=\"custom-search-results__list custom-search-results__list--flat list-unstyled\">\n            ${results.map(renderResult).join('')}\n        </ul>\n    `;\n}\n\n/**\n * @param {SearchResult} result\n * @returns {string}\n */\nfunction renderResult(result) {\n    const media = renderResultMedia(result);\n    const action = result.url ? '<span class=\"custom-search-results__action\">View</span>' : '';\n    const resultAttributes = renderResultAttributes(result);\n    const content = `\n        ${media}\n        <span class=\"custom-search-results__item-content\">\n            <span class=\"custom-search-results__item-label\">${escapeHtml(result.label)}</span>\n            <span class=\"custom-search-results__item-title\">${escapeHtml(result.title)}</span>\n            ${result.subtitle ? `<span class=\"custom-search-results__item-subtitle\">${escapeHtml(result.subtitle)}</span>` : ''}\n            ${result.excerpt ? `<span class=\"custom-search-results__item-excerpt\">${escapeHtml(result.excerpt)}</span>` : ''}\n        </span>\n        ${action}\n    `;\n\n    if (result.url) {\n        return `\n            <li>\n                <a\n                    class=\"custom-search-results__item\"\n                    href=\"${escapeAttribute(result.url)}\"\n                    data-custom-search-result\n                    ${resultAttributes}\n                >\n                    ${content}\n                </a>\n            </li>\n        `;\n    }\n\n    return `\n        <li>\n            <div\n                class=\"custom-search-results__item custom-search-results__item--static\"\n                data-custom-search-result\n                ${resultAttributes}\n            >\n                ${content}\n            </div>\n        </li>\n    `;\n}\n\n/**\n * @param {SearchResult} result\n * @returns {string}\n */\nfunction renderResultAttributes(result) {\n    return `\n        data-result-id=\"${escapeAttribute(result.id)}\"\n        data-result-type=\"${escapeAttribute(result.type)}\"\n        data-result-handle=\"${escapeAttribute(result.handle || '')}\"\n        data-result-url=\"${escapeAttribute(result.url || '')}\"\n    `;\n}\n\n/**\n * @param {HTMLElement} element\n * @returns {SearchResult | null}\n */\nfunction createResultFromElement(element) {\n    if (!element.dataset.resultType) return null;\n\n    return {\n        id: element.dataset.resultId || '',\n        type: element.dataset.resultType,\n        group: '',\n        label: '',\n        handle: element.dataset.resultHandle || '',\n        title: '',\n        url: element.dataset.resultUrl || '',\n        image: null,\n        fields: [],\n    };\n}\n\n/**\n * @param {SearchResult} result\n * @returns {string}\n */\nfunction renderResultMedia(result) {\n    if (result.image?.url) {\n        return `\n            <span class=\"custom-search-results__media custom-search-results__media--image\">\n                <img\n                    src=\"${escapeAttribute(result.image.url)}\"\n                    alt=\"${escapeAttribute(result.image.alt)}\"\n                    loading=\"lazy\"\n                >\n            </span>\n        `;\n    }\n\n    const iconSvg = getIconSvg(result);\n    if (iconSvg) {\n        const iconClass = TYPE_ICON_CLASSES[result.type] || TYPE_ICON_CLASSES[result.group] || TYPE_ICON_CLASSES.pages;\n\n        return `\n            <span class=\"custom-search-results__media ${iconClass}\" aria-hidden=\"true\">\n                ${iconSvg}\n            </span>\n        `;\n    }\n\n    const icon = TYPE_ICONS[result.type] || TYPE_ICONS[result.group] || '?';\n    const iconClass = TYPE_ICON_CLASSES[result.type] || TYPE_ICON_CLASSES[result.group] || TYPE_ICON_CLASSES.pages;\n\n    return `\n        <span class=\"custom-search-results__media ${iconClass}\" aria-hidden=\"true\">\n            ${escapeHtml(icon)}\n        </span>\n    `;\n}\n\n/**\n * @param {SearchResult} result\n * @returns {string}\n */\nfunction getIconSvg(result) {\n    if (iconMap) return iconMap[result.type] || iconMap[result.group] || '';\n\n    const configElement = document.querySelector('[data-custom-search-config]');\n    if (!(configElement instanceof HTMLScriptElement)) return '';\n\n    try {\n        const config = JSON.parse(configElement.textContent || '{}');\n        iconMap = config.icons || {};\n        return iconMap[result.type] || iconMap[result.group] || '';\n    } catch (_error) {\n        return '';\n    }\n}\n\n/**\n * @param {SearchResult} result\n * @param {Element | null} dialog\n */\nasync function openResult(result, dialog = null) {\n    if (await activatePageResult(result, dialog)) return;\n    if (!result.url) return;\n\n    window.location.href = result.url;\n}\n\n/**\n * @param {SearchResult} result\n * @param {Element | null} dialog\n * @returns {Promise<boolean>}\n */\nasync function activatePageResult(result, dialog = null) {\n    const target = findPageTarget(result);\n    if (!target) return false;\n\n    await closeSearchDialog(dialog);\n\n    if (result.type === 'faqs') {\n        activateFaqResult(target);\n        return true;\n    }\n\n    if (result.type === 'videos') {\n        activateVideoResult(target);\n        return true;\n    }\n\n    if (result.type === 'product_support_assets') {\n        await activateSupportAssetResult(target, result);\n        return true;\n    }\n\n    scrollTargetIntoView(target);\n    return true;\n}\n\n/**\n * @param {SearchResult} result\n * @returns {HTMLElement | null}\n */\nfunction findPageTarget(result) {\n    if (!result.type || !result.handle) return null;\n\n    return Array.from(document.querySelectorAll('[data-custom-search-target]')).find((target) => {\n        if (!(target instanceof HTMLElement)) return false;\n        return target.dataset.searchResultType === result.type && target.dataset.searchResultHandle === result.handle;\n    }) || null;\n}\n\n/**\n * @param {Element | null} dialog\n * @returns {Promise<void>}\n */\nasync function closeSearchDialog(dialog) {\n    if (!dialog || typeof dialog.closeDialog !== 'function') return;\n\n    await dialog.closeDialog();\n}\n\n/**\n * @param {HTMLElement} target\n */\nfunction activateFaqResult(target) {\n    const section = target.closest('[data-section-type=\"mo-faq-list\"]');\n    if (section instanceof HTMLElement) {\n        section.querySelector('[data-action=\"mo-faq-list:reset-filters\"]:not(:disabled)')?.click();\n    }\n\n    const details = target.querySelector('details') || target.closest('details');\n    if (details instanceof HTMLDetailsElement) {\n        details.open = true;\n    }\n\n    scrollTargetIntoView(target);\n}\n\n/**\n * @param {HTMLElement} target\n */\nfunction activateVideoResult(target) {\n    scrollTargetIntoView(target);\n\n    requestAnimationFrame(() => {\n        target.click();\n    });\n}\n\n/**\n * @param {HTMLElement} target\n * @param {SearchResult} result\n */\nasync function activateSupportAssetResult(target, result) {\n    scrollTargetIntoView(target);\n    await waitForScroll();\n\n    if (target.matches('[data-action=\"modal:open\"]')) {\n        target.click();\n        return;\n    }\n\n    const modalTrigger = target.querySelector('[data-action=\"modal:open\"]');\n    if (modalTrigger instanceof HTMLElement) {\n        modalTrigger.click();\n        return;\n    }\n\n    const link = target.querySelector('.product-support-documents__button');\n    const url = link?.href || result.url;\n    if (!url) return;\n\n    window.location.href = url;\n}\n\n/**\n * @param {HTMLElement} target\n * @param {ScrollBehavior} [behavior]\n */\nfunction scrollTargetIntoView(target, behavior = 'smooth') {\n    const prefersReducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches;\n\n    target.scrollIntoView({\n        behavior: prefersReducedMotion ? 'auto' : behavior,\n        block: 'center',\n    });\n}\n\n/**\n * @returns {Promise<void>}\n */\nfunction waitForScroll() {\n    const prefersReducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches;\n\n    return new Promise((resolve) => {\n        window.setTimeout(resolve, prefersReducedMotion ? 0 : 450);\n    });\n}\n\n/**\n * @param {Record<string, any>} config\n * @param {string} namespace\n * @returns {SearchResult[] | null}\n */\nfunction readCache(config, namespace = 'metaobjects') {\n    try {\n        const cached = window.localStorage.getItem(getCacheKey(config, namespace));\n        if (!cached) return null;\n\n        const payload = JSON.parse(cached);\n        if (!payload.expiresAt || payload.expiresAt < Date.now()) return null;\n        if (payload.version !== CACHE_VERSION) return null;\n\n        return Array.isArray(payload.index) ? payload.index : null;\n    } catch (_error) {\n        return null;\n    }\n}\n\n/**\n * @param {Record<string, any>} config\n * @param {SearchResult[]} index\n * @param {string} namespace\n */\nfunction writeCache(config, index, namespace = 'metaobjects') {\n    try {\n        window.localStorage.setItem(\n            getCacheKey(config, namespace),\n            JSON.stringify({\n                version: CACHE_VERSION,\n                expiresAt: Date.now() + Number(config.cacheTtlMs || 3600000),\n                index,\n            })\n        );\n    } catch (_error) {\n        // Storage can be unavailable or full; the in-memory cache still covers this page view.\n    }\n}\n\n/**\n * @param {Record<string, any>} config\n * @param {string} namespace\n * @returns {string}\n */\nfunction getCacheKey(config, namespace = 'metaobjects') {\n    return ['taoCustomSearch', namespace, CACHE_VERSION, config.locale || 'default', config.country || 'default'].join(\n        ':'\n    );\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction normalizeSearchValue(value) {\n    return normalizeWhitespace(value)\n        .toLowerCase()\n        .normalize('NFKD')\n        .replace(/[\\u0300-\\u036f]/g, '')\n        .replace(/\\btooth\\s+brush\\b/g, 'toothbrush');\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction normalizeWhitespace(value) {\n    return String(value || '').replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction stripHtml(value) {\n    const div = document.createElement('div');\n    div.innerHTML = value;\n    return div.textContent || div.innerText || '';\n}\n\n/**\n * @param {string} value\n * @param {number} length\n * @returns {string}\n */\nfunction truncateText(value, length) {\n    const normalized = normalizeWhitespace(stripHtml(value));\n    if (normalized.length <= length) return normalized;\n\n    return `${normalized.slice(0, length - 1).trim()}...`;\n}\n\n/**\n * @param {string} first\n * @param {string} second\n * @returns {boolean}\n */\nfunction checkSameText(first, second) {\n    const normalizedFirst = normalizeSearchValue(first);\n    const normalizedSecond = normalizeSearchValue(second);\n\n    return Boolean(normalizedFirst && normalizedSecond && normalizedFirst === normalizedSecond);\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction escapeHtml(value) {\n    return String(value || '')\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;')\n        .replace(/'/g, '&#039;');\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction escapeAttribute(value) {\n    return escapeHtml(value).replace(/`/g, '&#096;');\n}\n"],
  "mappings": "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",
  "names": []
}
