1 var module_70806122564=function(){!function(){"use strict";if(window.matchMedia&&window.matchMedia("(hover: hover) and (pointer: fine)").matches){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",init):init()}function setupRow(row,orientation){var children=Array.prototype.slice.call(row.children);if(!(children.length<2)){var mouseLocs=[],activeTrigger=null,activeSubmenu=null,timeoutId=null;children.forEach(function(child){child.addEventListener("mouseenter",function(){possiblyActivate(child)})}),row.addEventListener("mousemove",function(e){mouseLocs.push({x:e.clientX,y:e.clientY}),mouseLocs.length>4&&mouseLocs.shift()}),row.addEventListener("mouseleave",function(){clearTimeout(timeoutId),setActive(null)})}function setActive(trigger){trigger!==activeTrigger&&(activeSubmenu&&activeSubmenu.classList.remove("is-open"),activeTrigger=trigger,activeSubmenu=trigger?function(trigger){return trigger.querySelector(":scope > .nav__dropdown, :scope > .nav__subdropdown, :scope > .nav__subdropdown--accordion")}(trigger):null,activeSubmenu&&activeSubmenu.classList.add("is-open"))}function possiblyActivate(trigger){clearTimeout(timeoutId),activeTrigger&&trigger!==activeTrigger?!function(){if(!activeSubmenu||mouseLocs.length<2)return!1;var rect=activeSubmenu.getBoundingClientRect(),from=mouseLocs[0],to=mouseLocs[mouseLocs.length-1],dx=to.x-from.x,dy=to.y-from.y;if("down"===orientation){if(dy<=0)return!1;var distanceToTop=rect.top-to.y,projectedX=distanceToTop<=0?to.x:to.x+dx/dy*distanceToTop;return projectedX>=rect.left-80&&projectedX<=rect.right+80}if(dx<=0)return!1;var distanceToEdge=rect.left-to.x,projectedY=distanceToEdge<=0?to.y:to.y+dy/dx*distanceToEdge;return projectedY>=rect.top-20&&projectedY<=rect.bottom+20}()?setActive(trigger):timeoutId=setTimeout(function(){possiblyActivate(trigger)},200):setActive(trigger)}}function init(){var nav=document.querySelector(".nav");nav&&(Array.prototype.forEach.call(nav.querySelectorAll(".nav__items"),function(row){setupRow(row,"down")}),Array.prototype.forEach.call(nav.querySelectorAll(".nav__dropdown-items"),function(row){setupRow(row,"right")}),nav.setAttribute("data-hover-intent",""))}}(),function(){function clearCookie(name){document.cookie=`${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; Domain=ÌÇÐÄÔ´´; path=/;`}(function(name){const match=document.cookie.match(new RegExp("(?:^|; )"+name+"=([^;]*)"));return match?decodeURIComponent(match[1]):null})("bb_checkout_completed")&&(localStorage.removeItem("newData"),clearCookie("cartQty"),clearCookie("bb_checkout_completed"))}(),function(){function updateCartUI(){const storedData=JSON.parse(localStorage.getItem("newData"))||[],cartCount=document.querySelector(".nav__cart-count"),totalQuantity=storedData.reduce((accumulator,item)=>accumulator+parseInt(item.qty),0);cartCount.textContent=totalQuantity.toString();const cartClass=document.querySelector('[js-nav="right-side"]'),cartCountZero=document.querySelector('[js-cart="count"]');"0"===cartCountZero.textContent?cartClass.classList.remove("nav-display-ecom"):cartClass.classList.add("nav-display-ecom"),"0"===cartCountZero.textContent&&(cartCountZero.textContent="")}updateCartUI(),window.addEventListener("bb:cart-updated",updateCartUI)}(),window.bitbio={},window.bitbio.Currency=function(){async function get(){let localStorageData=null;try{const raw=localStorage.getItem("bitbio_currency");localStorageData=raw?JSON.parse(raw):null}catch(err){console.error(err),localStorageData=null}const now=new Date,isExpired=localStorageData&&localStorageData.expiry_date&&now>new Date(localStorageData.expiry_date),countryChanged=localStorageData&&localStorageData.country!==window.COUNTRY;if(!localStorageData||isExpired||countryChanged){await async function(){const headers=new Headers;headers.append("X-Shopify-Storefront-Access-Token","17fe9a0d48820944cf51b24b89d3a05a"),headers.append("Content-Type","application/graphql");const query=`\nquery ProductPricing @inContext(country: ${window.COUNTRY}) {\n products(first: 1) {\n edges {\n node {\n id\n priceRange {\n minVariantPrice {\n amount\n currencyCode\n }\n }\n }\n }\n }\n}\n `;try{const response=await fetch("https://bit-bio.myshopify.com/api/2025-04/graphql.json",{method:"POST",headers:headers,body:query}),pricesArray=(await response.json()).data.products.edges.map(product=>({currency:product.node.priceRange.minVariantPrice.currencyCode})),localStorageData={expiry_date:new Date(Date.now()+72e5).toISOString(),currency:pricesArray[0]?.currency,country:window.COUNTRY};localStorage.setItem("bitbio_currency",JSON.stringify(localStorageData))}catch(error){console.error("Error fetching currency:",error)}}();try{return JSON.parse(localStorage.getItem("bitbio_currency")).currency}catch(err){return void console.error(err)}}return localStorageData.currency}return{get:get,getSymbol:async function(){switch(await get()||"GBP"){case"GBP":return"£";case"EUR":return"â¬";case"USD":return"$"}}}}();const SearchHistory=function(){function get(){const history=localStorage.getItem("search-history");return""!==history&&JSON.parse(history)||[]}return{add:function(query){let history=get();history.length>=3&&history.splice(0,3),history.push(query),localStorage.setItem("search-history",JSON.stringify(history)
1)},get:get}}(),NavSuggestions=function(){const TABLE="search_suggestions";let loading=null;const skipCache=/[?&]hs_preview=/.test(window.location.search)||/\.hs-sites(-[a-z0-9]+)?\.com$/.test(window.location.hostname);function safeLink(value){const url=("string"==typeof value?value:value?.url||value?.href||"").trim();if(!url)return"";if(url.startsWith("/")&&!url.startsWith("//"))return url;try{const parsed=new URL(url);return/^https?:$/.test(parsed.protocol)?parsed.href:""}catch(e){return""}}function stem(word){return word.length>4&&word.endsWith("s")&&!word.endsWith("ss")?word.slice(0,-1):word}function words(str){return String(str).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g," ").trim().split(" ").filter(Boolean).map(stem)}function prepare(rows){return rows.map(row=>{const termWords=words(row.term),keywordPhrases=row.keywords.map(words).filter(w=>w.length);return{...row,termWords:termWords,termCompact:termWords.join(""),keywordWords:keywordPhrases.flat(),keywordCompacts:keywordPhrases.map(w=>w.join(""))}})}function editDistance(a,b,max){if(Math.abs(a.length-b.length)>max)return max+1;let prevPrev=null,prev=Array.from({length:b.length+1},(_,j)=>j);for(let i=1;i<=a.length;i++){const current=[i];let rowMin=i;for(let j=1;j<=b.length;j++){const cost=a[i-1]===b[j-1]?0:1;let value=Math.min(prev[j]+1,current[j-1]+1,prev[j-1]+cost);prevPrev&&i>1&&j>1&&a[i-1]===b[j-2]&&a[i-2]===b[j-1]&&(value=Math.min(value,prevPrev[j-2]+1)),current.push(value),rowMin=Math.min(rowMin,value)}if(rowMin>max)return max+1;prevPrev=prev,prev=current}return prev[b.length]}function fuzzyPrefix(typed,target){const max=(length=typed.length)>=8?2:length>=4?1:0;var length;if(!max)return!1;for(let len=Math.max(1,typed.length-max);len<=Math.min(target.length,typed.length+max);len++)if(editDistance(typed,target.slice(0,len),max)<=max)return!0;return!1}function matchWord(typed,targets){let best=-1;for(const target of targets){if(target.startsWith(typed))return 0;fuzzyPrefix(typed,target)?best=1:-1===best&&typed.length>=3&&target.includes(typed)&&(best=2)}return best}function matchAll(typedWords,targets){let worst=0;for(const word of typedWords){const tier=matchWord(word,targets);if(-1===tier)return-1;worst=Math.max(worst,tier)}return worst}function score(suggestion,typedWords,typedCompact){const termTiers=[matchAll(typedWords,suggestion.termWords),matchWord(typedCompact,[suggestion.termCompact])].filter(t=>-1!==t);if(termTiers.length)return Math.min(...termTiers);const keywordByWords=matchAll(typedWords,suggestion.keywordWords),keywordByPhrase=matchWord(typedCompact,suggestion.keywordCompacts);return-1!==keywordByWords||-1!==keywordByPhrase?3:-1}return{load:function(){if(loading)return loading;const cached=function(){if(skipCache)return null;try{const cached=JSON.parse(localStorage.getItem("bitbio_search_suggestions_v2"));if(cached&&Array.isArray(cached.rows)&&Date.now()<cached.expires)return cached.rows}catch(e){}return null}();return cached?loading=Promise.resolve(prepare(cached)):(loading=async function(){const portalId=window.HUB_ID;if(!portalId)throw new Error("window.HUB_ID is not set");const rows=[];let after="";for(let page=0;page<10;page++){const url=`https://api.hubapi.com/cms/v3/hubdb/tables/${TABLE}/rows?portalId=${encodeURIComponent(portalId)}&limit=1000`+(after?`&after=${encodeURIComponent(after)}`:""),response=await fetch(url);if(!response.ok)throw new Error(`HubDB ${TABLE} responded ${response.status}`);const data=await response.json();if(rows.push(...data.results||[]),after=data.paging?.next?.after,!after)break}const position=(row,fallback)=>Number.isFinite(Number(row.renderOrder))&&null!==row.renderOrder?Number(row.renderOrder):fallback;return rows.map((row,apiIndex)=>({row:row,order:position(row,Number.MAX_SAFE_INTEGER),apiIndex:apiIndex})).sort((a,b)=>a.order-b.order||a.apiIndex-b.apiIndex).map(({row:row})=>row.values||{}).filter(v=>{return!(!0===(value=v.hide)||1===value||"1"===value||"true"===value)&&String(v.search_term||"").trim();var value}).map((v,index)=>({term:String(v.search_term).trim(),keywords:String(v.keywords||"").split(",").map(k=>
1k.trim()).filter(Boolean),link:safeLink(v.link),index:index}))}().then(rows=>{try{localStorage.setItem("bitbio_search_suggestions_v2",JSON.stringify({rows:rows,expires:Date.now()+36e5}))}catch(e){}return prepare(rows)}).catch(err=>(console.error("Could not load search suggestions",err),loading=null,[])),loading)},match:function(all,query){const typedWords=words(query);if(!typedWords.length)return all.slice(0,5);const typedCompact=typedWords.join("");return all.map(suggestion=>({suggestion:suggestion,tier:score(suggestion,typedWords,typedCompact)})).filter(m=>-1!==m.tier).sort((a,b)=>a.tier-b.tier||a.suggestion.index-b.suggestion.index).slice(0,5).map(m=>m.suggestion)},render:function(container,suggestions,{emptyText:emptyText}={}){if(!container)return;const root=document.createElement("div");if(root.className="ais-Hits",!suggestions.length)return emptyText?(root.classList.add("ais-Hits--empty","nav__search-results-panel-list-li","nav__search-results-panel-list-li--magnifying-glass","ps-0","fw-normal"),root.textContent=emptyText,void container.replaceChildren(root)):void container.replaceChildren();const list=document.createElement("ol");list.className="ais-Hits-list",suggestions.forEach(suggestion=>{const li=document.createElement("li");li.className="ais-Hits-item nav__search-results-panel-list-li nav__search-results-panel-list-li--magnifying-glass";const anchor=document.createElement("a");anchor.href=suggestion.link||`/search?query=${encodeURIComponent(suggestion.term)}`,anchor.textContent=suggestion.term,li.append(anchor),list.append(li)}),root.append(list),container.replaceChildren(root)}}}();!function(){const searchContainer=document.querySelector('[js-algolia="search-container"]'),searchResults=document.querySelector('[js-algolia="search-results"]'),searchLanding=document.querySelector('[js-algolia="search-landing"]');if(!searchContainer)return;const currencyPromise=Promise.all([window.bitbio.Currency.get(),window.bitbio.Currency.getSymbol()]);if(currencyPromise.then(([currency])=>{[...document.querySelectorAll("[js-nav-advert-currency]")].forEach(advert=>{advert.getAttribute("js-nav-advert-currency")===currency&&advert.classList.remove("d-none")})}),document.querySelector("[js-search-results]"))return;const getSearchInput=()=>searchContainer.querySelector("input"),isSearchableQuery=query=>query.trim().length>=3,suggestionsPanel=document.querySelector('[js-algolia="search-suggestions-panel"]'),suggestionsPanelSearched=document.querySelector('[js-algolia="search-suggestions-panel-searched"]');let suggestionsReady=null;function loadSuggestions(){return suggestionsReady||(suggestionsReady=NavSuggestions.load().then(all=>(NavSuggestions.render(suggestionsPanel,NavSuggestions.match(all,"")),function(){const historyPanel=document.querySelector('[js-algolia="search-history-panel"]');SearchHistory.get().reverse().filter(item=>""!==item.trim()).map(item=>{if([...suggestionsPanel.querySelectorAll("a")].find(el=>el.innerText===item))return;const li=document.createElement("li");li.classList.add("nav__search-results-panel-list-li"),li.classList.add("nav__search-results-panel-list-li--magnifying-glass");const anchor=document.createElement("a");return anchor.href=`/search?query=${encodeURIComponent(item)}`,anchor.innerText=item,li.append(anchor),li}).map(suggestion=>{suggestion&&historyPanel.append(suggestion)})}(),all))),suggestionsReady}function updateViewAllLinks(query){const allResourcesLink=document.querySelector('[js-algolia="view-all-resources-link"]'),allProductsLink=document.querySelector('[js-algolia="view-all-products-link"]');return allResourcesLink.href=`/search?query=${encodeURIComponent(query)}&tab=resources`,allProductsLink.href=`/search?query=${encodeURIComponent(query)}&tab=products`,{allResourcesLink:allResourcesLink,allProductsLink:allProductsLink}}function handleShowSearchPanel(){const searchInput=getSearchInput();searchInput&&(document.querySelectorAll(".main-menu-item").forEach(navItem=>{navItem.querySelector(".main-menu-dropdown")?.dispatchEvent(new MouseEvent("mouseleave")),navItem.dispatchEvent(new MouseEvent("mouseleave"))}),isSearchableQuery(searchInput.value)?(searchLanding.classList.remove("is-active"),searchResults.classList.add("is-active"),function(){const searchInput=getSearchInput();if(!searchInput)return;const query=searchInput.value;loadSuggestions().then(all=>{getSearchInput()?.value===query&&NavSuggestions.render(suggestionsPanelSearched,NavSuggestions.match(all,query),{emptyText:"No results"})})}()):(searchLanding.classList.add("is-active"),searchResults.classList.remove("is-active")),updateViewAllLinks(searchInput.value))}searchContainer.addEventListener("focusin",handleShowSearchPanel),searchContainer.addEventListener("input",handleShowSearchPanel),document.addEventListener("click",e=>{searchContainer.contains(e.target)||searchLanding.contains(e.target)||searchResults.contains(e.target)||(searchLanding.classList.remove("is-active"),searchResults.classList.remove("is-active"))});let searchStarted=null;function startSearch(){return loadSuggestions(),searchStarted||(searchStarted=async function(){const[currency,currencySymbol]=await currencyPromise,{liteClient:algoliasearch}=window["algoliasearch/lite"],indexName="bitbio_products",baseClient=algoliasearch("MELH49BHG0","5702b389ffdf3559382b85fec79e04e1"),EMPTY_RESULT={hits:[],nbHits:0,nbPages:0,page:0,hitsPerPage:0,processingTimeMS:0,exhaustiveNbHits:!0,query:"",params:""},searchClient={...baseClient,search:requests=>requests.some(r=>isSearchableQuery(r.params?.query||""))?baseClient.search(requests):Promise.resolve({results:requests.map(r=>({...EMPTY_RESULT,index:r.indexName}))})},productResultsPanel=document.querySelector('[js-algolia="product-results-panel"]'),resourceResultsPanel=document.querySelector('[js-algolia="resource-results-panel"]');function withAlgoliaTracking(url,hit,forIndexName){if(!hit.__queryID)return url;try{const withParams=new URL(url,window.location.origin);return withParams.searchParams.set("algolia_qid",hit.__queryID),withParams.searchParams.set("algolia_oid",hit.objectID),withParams.searchParams.set("algolia_idx",forIndexName),withParams.toString()}catch(e){return url}}const typedQuery=placeholderInput?placeholderInput.value:"",hadFocus=placeholderInput&&document.activeElement===placeholderInput,search=instantsearch({indexName:indexName,searchClient:searchClient,initialUiState:typedQuery?{[indexName]:{query:typedQuery}}:void 0});let searchDebounceTimer;search.use(instantsearch.middlewares.createInsightsMiddleware({insightsClient:window.aa}));let lastSearchedQuery=isSearchableQuery(typedQuery)?typedQuery:"";search.addWidgets([instantsearch.widgets.searchBox({container:searchContainer,searchAsYouType:!0,placeholder:"Search products, protocols, and more",queryHook:(query,search)=>(clearTimeout(searchDebounceTimer),isSearchableQuery(query)?lastSearchedQuery?void(searchDebounceTimer=setTimeout(()=>{lastSearchedQuery=query,search(query)},350)):(lastSearchedQuery=query,void search(query)):(lastSearchedQuery="",void search(""))),cssClasse
1s:{form:["search","is-nonstandard-form"],submit:"search__button",input:"search__input",reset:"search__clear",resetIcon:"search__clear-inner"}}),instantsearch.widgets.hits({container:productResultsPanel,templates:{item:(hit,{html:html,components:components,sendEvent:sendEvent})=>html` 2 <div class="cat-item cat-item--full-height"> 3 <a 4 href="/hubfs/hub_generated/module_assets/1/70806122564/1790951929932/${withAlgoliaTracking(hit.url,hit,indexName)}" 5 class="cat-item" 6 onClick=${()=>sendEvent("click",hit,"Product Clicked")} 7 > 8 <div class="cat-card-info cat-card-info--flexible"> 9 <div class="cat-card-heading"> 10 <span class="cat-tag">${hit.type}</span> 11 <p class="cat-name cat-name--small"> 12 ${components.Highlight({attribute:"title",highlightedTagName:"mark",hit:hit})} 13 </p> 14 </div> 15 <div class="cat-details"> 16 <span class="cat-cat-number">cat no | ${hit.cat_number}</span> 17 <span class="cat-price">${hit.variant_count>1?"From ":""}${currencySymbol}${Object.values(hit.price_by_country).find(country=>country.price_currency===currency).price_from}</span> 18 </div> 19 </div> 20 <div class="cat-image-wrapper"> 21 <img src="/hubfs/hub_generated/module_assets/1/70806122564/1790951929932/${hit.image}" alt="${hit.title}"/> 22 </div> 23 </a> 24 </div> 25 `},cssClasses:{list:"nav__search-results-panel-grid",item:"nav__search-results-panel-grid-li"}}),instantsearch.widgets.configure({hitsPerPage:3,clickAnalytics:!0})]),search.addWidgets([instantsearch.widgets.index({indexName:"bitbio_content"}).addWidgets([instantsearch.widgets.configure({clickAnalytics:!0}),instantsearch.widgets.hits({container:resourceResultsPanel,templates:{item:(hit,{html:html,components:components,sendEvent:sendEvent})=>html` 26 <a href="/hubfs/hub_generated/module_assets/1/70806122564/1790951929932/${hit.url}" onClick=${()=>sendEvent("click",hit,"Resource Clicked")}> 27 ${components.Highlight({attribute:"title",highlightedTagName:"mark",hit:hit})} 28 </a> 29 `},cssClasses:{list:"nav__search-results-panel-list",item:"nav__search-results-panel-list-li"}})])]),searchContainer.innerHTML="",search.start();let searchInput=getSearchInput();searchInput||(await new Promise(resolve=>requestAnimationFrame(resolve)),searchInput=getSearchInput());if(!searchInput)return;if(hadFocus){searchInput.focus();const end=searchInput.value.length;try{searchInput.setSelectionRange(end,end)}catch(e){}}function handleSubmit(){SearchHistory.add(searchInput.value);const{allResourcesLink:allResourcesLink,allProductsLink:allProductsLink}=updateViewAllLinks(searchInput.value),isNoProducts=isSearchableQuery(searchInput.value)&&(document.querySelector('[js-algolia="product-results-panel"] .ais-Hits--empty')||document.querySelector('[js-algolia-results="products-list"] .ais-InfiniteHits--empty'));window.location.href=isNoProducts?allResourcesLink.href:allProductsLink.href}handleShowSearchPanel(),searchInput.addEventListener("keydown",e=>{"Enter"===e.key&&handleSubmit()}),searchContainer.querySelector(".search__button")?.addEventListener("click",e=>{""!==searchInput.value?searchInput.dispatchEvent(new KeyboardEvent("keydown",{key:"Enter"})):window.location="/search"})}().catch(err=>{console.error("Nav search failed to start",err)})),searchStarted}const placeholderInput=searchContainer.querySelector("[js-nav-search-placeholder] input");placeholderInput?(placeholderInput.addEventListener("focusin",startSearch,{once:!0}),document.activeElement===placeholderInput&&startSearch()):start
29Search()}()}(); 30//# sourceURL=https://14527135.fs1.hubspotusercontent-na1.net/hubfs/14527135/hub_generated/module_assets/1/70806122564/1790951929932/module_main-nav.js
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.