PageSourceSearch

https://startsafety.uk/cdn/shop/t/114/assets/snippet-layout-comple…?v=140355770329447727221785331348

js startsafety.uk collected 2026-09-26 06:12:41 UTC 10,970 bytes, 1 lines download raw bytes

1(()=>{"use strict";function t(t){return t&&t.length?t.reduce((t,e)=>(e.price||0)<(t.price||0)?e:t,t[0]):null}function e(t,e=""){const r=t.querySelector(".variant-details");if(!e)return t.removeAttribute("data-fbt-error"),r&&r.removeAttribute("data-fbt-error-message"),void t.querySelectorAll("[data-fbt-select-error]").forEach(t=>t.removeAttribute("data-fbt-select-error"));t.setAttribute("data-fbt-error",""),r&&r.setAttribute("data-fbt-error-message",e)}function r(t,e,r="bundle-add"){const a=t.querySelector("[data-fbt-item-checkbox]");if(!a)return;const n=t.querySelector("[data-fbt-item-price]");if(!e)return a.dataset.fbtItem="",a.setAttribute("data-fbt-item",""),a.dataset.fbtPricePence="0",a.setAttribute("data-fbt-price-pence","0"),a.dataset.fbtAvailable="false",a.setAttribute("data-fbt-available","false"),void(n&&(n.textContent=""));a.dataset.fbtItem=String(e.id),a.setAttribute("data-fbt-item",String(e.id)),a.dataset.fbtPricePence=String(e.price||0),a.setAttribute("data-fbt-price-pence",String(e.price||0)),a.dataset.fbtAvailable="true",a.setAttribute("data-fbt-available","true"),a.id=`${r}-${e.id}`,n&&(n.textContent=window.Herd.utils.formatMoney(e.price||0,"£{{amount}}"))}function a(t,e){const r=t.querySelector(".featured-img");if(!r)return;r.dataset.fbtDefaultSrc||(r.dataset.fbtDefaultSrc=r.currentSrc||r.src||"",r.dataset.fbtDefaultAlt=r.alt||"");const a=e?.featured_image;if(a?.src)return r.src=function(t,e=550){return t?t.replace(/_(\d+x\d*|\d*x\d+)(\.[a-z]+)(\?.*)?$/i,"$2$3").replace(/(\.[a-z]+)(\?.*)?$/i,`_${e}x$1$2`):t}(a.src,550),r.removeAttribute("srcset"),void(r.alt=a.alt||r.dataset.fbtDefaultAlt||"");r.dataset.fbtDefaultSrc&&(r.src=r.dataset.fbtDefaultSrc,r.removeAttribute("srcset"),r.alt=r.dataset.fbtDefaultAlt||"")}function n(t,e){const r={};Array.from(t.querySelectorAll("[data-fbt-option-select]")).forEach(t=>{const e=Number(t.dataset.fbtOptionIndex);t.value&&(r[e]=t.value)}),Array.from(t.querySelectorAll("[data-fbt-option-select]")).forEach(t=>{const a=Number(t.dataset.fbtOptionIndex);Array.from(t.options).forEach(t=>{if(""===t.value)return void(t.disabled=!1);const n=e.some(e=>{if(!Array.isArray(e.options))return!1;if(e.options[a]!==t.value)return!1;for(const[t,n]of Object.entries(r))if(Number(t)!==a&&e.options[Number(t)]!==n)return!1;return!0});t.disabled=!n})})}function i(t){return t.toLowerCase().replace(/[/\\]/g,"-").replace(/[^a-z0-9-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}async function o(t){try{const e=await fetch(`/products/${t}`);if(!e.ok)return[];const r=await e.text(),a=(new DOMParser).parseFromString(r,"text/html"),n=[];return a.querySelectorAll("[data-product-url]").forEach(t=>{const e=t.getAttribute("data-product-url")||"",r=e.split("/products/")[1]?.split("?")[0];r&&!n.includes(r)&&n.push(r)}),n}catch(t){return[]}}class s extends HTMLElement{constructor(){super(),this._hasBeenInitialised=!1}connectedCallback(){this._hasBeenInitialised||(this._hasBeenInitialised=!0,this.initCompProducts())}initCompProducts(){new IntersectionObserver((t,e)=>{if(!t[0].isIntersecting)return;e.unobserve(this);const r=this.dataset.url;fetch(r).then(t=>t.text()).then(t=>{const e=document.createElement("div");e.innerHTML=t;const r=e.querySelector("complementary-products");r&&r.innerHTML.trim().length&&(this.innerHTML=r.innerHTML),"fbt-style"===this.dataset.type?(this.initFbtStyleItems(),this.initShowMore(),this.initAddButtons()):this.loadSlider(),d(this)}).catch(t=>{console.error(t)})},{rootMargin:"0px",threshold:1}).observe(this)}initFbtStyleItems(){Array.from(this.querySelectorAll("[data-comp-items] .fbt-item")).forEach(s=>{const c=s.dataset.fbtVariants;if(!c)return;let d;try{d=JSON.parse(c)}catch(t){return}if(s.querySelector("[data-fbt-option-select]")){const e=t(d);r(s,e,"comp-item");const i=s.querySelector("[data-fbt-item-checkbox]");i&&(i.dataset.fbtItem="",i.setAttribute("data-fbt-item","")),a(s,null),n(s,d)}else{const t=s.querySelector("[data-fbt-item-checkbox]"),e=s.querySelector("[data-fbt-item-price]");if(t&&e){const r=Number(t.dataset.fbtPricePence||0);e.textContent=window.Herd.utils.formatMoney(r,"£{{amount}}")}}Array.from(s.querySelectorAll("[data-fbt-option-select]")).forEac
1h(i=>{i._fbtOptBound||(i._fbtOptBound=!0,i.addEventListener("change",()=>{i.removeAttribute("data-fbt-select-error"),n(s,d),function(n,i,o,s){const c=i[0]?.options?.length??0,d=new Array(c).fill(null);if(Array.from(n.querySelectorAll("[data-fbt-option-select]")).forEach(t=>{const e=Number(t.dataset.fbtOptionIndex);d[e]=""!==t.value?t.value:null}),d.some(t=>null===t)){r(n,t(i),s);const o=n.querySelector("[data-fbt-item-checkbox]");return o&&(o.dataset.fbtItem="",o.setAttribute("data-fbt-item","")),e(n,""),a(n,i.find(t=>Array.isArray(t.options)&&d.every((e,r)=>null===e||t.options[r]===e)&&t.featured_image)||null),null}const l=function(t,e){return t.find(t=>Array.isArray(t.options)&&t.options.every((t,r)=>t===e[r]))||null}(i,d);if(r(n,l,s),l){const t=n.querySelector("[data-fbt-item-checkbox]");t&&(t.disabled=!1,t.checked||(t.checked=!0)),e(n,"")}else{const t=n.querySelector("[data-fbt-item-price]");t&&(t.textContent="Unavailable")}a(n,l)}(s,d,0,"comp-item")},{passive:!0}))}),(s.dataset.fbtSiblings||s.querySelector("[data-fbt-option-select]"))&&async function(t){if(t.dataset.fbtVariantsMerged)try{return JSON.parse(t.dataset.fbtVariants)}catch(t){return null}const e=t.querySelector("a.title"),r=e&&(e.getAttribute("href")||"").split("/products/")[1]?.split("?")[0]||"";let a=[];const n=t.dataset.fbtSiblings;if(n)try{a=JSON.parse(n).map(t=>t.handle).filter(Boolean)}catch(t){}if(!a.length){let e;try{e=JSON.parse(t.dataset.fbtVariants)}catch(t){return null}const n=t.querySelector('[data-fbt-option-select][data-fbt-option-index="0"]');if(!n)return null;const s=new Set(e.map(t=>t.options?.[0]).filter(Boolean)),c=Array.from(n.options).map(t=>t.value).filter(t=>""!==t);if(!c.filter(t=>!s.has(t)).length)return null;if(!r)return null;const d=e[0]?.options?.[0];if(!d)return null;const l=i(d).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),u=new RegExp("(-)"+l+"(-|$)");a=u.test(r)?c.map(t=>r.replace(u,"$1"+i(t)+"$2")):await o(r)}if(!a.length)return null;const s=async t=>{try{const e=await fetch(`/products/${t}.json`);if(!e.ok)return{handle:t,variants:[],ok:!1};const{product:r}=await e.json(),a=r?.image?{src:r.image.src,alt:r.image.alt||r.title||""}:null;return{handle:t,variants:(r?.variants||[]).map(t=>({id:t.id,title:t.title||"",options:[t.option1,t.option2,t.option3].filter(Boolean),price:Math.round(100*parseFloat(t.price)),available:t.available,featured_image:t.featured_image||a})),ok:!0}}catch(e){return{handle:t,variants:[],ok:!1}}};let c=await Promise.all(a.map(s));if(c.filter(t=>!t.ok).map(t=>t.handle).length)try{const t=await o(r);if(t.length){const e=[];for(const r of t)c.some(t=>t.ok&&t.handle===r)||e.push(s(r));if(e.length){const t=await Promise.all(e);c=c.filter(t=>t.ok).concat(t)}}}catch(t){}const d=c.flatMap(t=>t.variants);if(!d.length)return null;const l=new Set,u=d.filter(t=>!l.has(t.id)&&(l.add(t.id),!0));return t.dataset.fbtVariants=JSON.stringify(u),t.dataset.fbtVariantsMerged="true",u}(s).then(e=>{if(!e||!e.length)return;d=e,n(s,d);const a=t(e);r(s,a,"comp-item");const i=s.querySelector("[data-fbt-item-checkbox]");i&&(i.dataset.fbtItem="",i.setAttribute("data-fbt-item",""))})})}initShowMore(){const t=this.querySelector("[data-comp-items]"),e=this.querySelector("[data-comp-show-more]");if(!t||!e||e._compShowMoreBound)return;e._compShowMoreBound=!0;const r=Array.from(t.querySelectorAll("[data-comp-item-index]")),a=()=>{const t=r.some(t=>t.hidden||"none"===getComputedStyle(t).display);e.hidden=!t};e.addEventListener("click",()=>{r.forEach(t=>t.removeAttribute("hidden")),t.classList.add("comp-items-expanded"),e.hidden=!0}),a(),window.addEventListener("resize",a,{passive:!0})}initAddButtons(){Array.from(this.querySelectorAll("[data-comp-item-add]")).forEach(t=>{t._compAddBound||(t._compAddBound=!0,t.addEventListener("click",()=>this.handleCompItemAdd(t)))})}async handleCompItemAdd(t){if(t.disabled)return;const r=t.closest(".fbt-item");if(!r)return;const a=r.querySelector("[data-fbt-item-checkbox]"),n=Array.from(r.querySelectorAll("[data-fbt-option-select]"));if(n.some(t=>!t.value))return n.forEach(t=>{t.value?t.removeAttribute("data-fbt-select-error"):t.setAttribute("data-fbt-select-error","")}),void e(r,"Please select all options");const i=Number(a?.dataset.fbtItem);if(i){e(r,""),t.disabled=!0;try{const e=window.Herd.utils.sectionRenderer.popoutCartSections.filter(t=>"data-add-to-cart-focus-product"!==t.id).map(t=>
1t.section),r=await window.Herd.Cart.addItem({id:i,quantity:1},null,{sections:e,sectionsUrl:window.location.pathname+window.location.search}),a=t.querySelector("[data-comp-item-add-text]"),n=t.querySelector("[data-atc-icon-added]"),o=a?a.textContent.trim():null,s=t.dataset.addedText;a&&s&&(a.textContent=s),n&&(n.hidden=!1),r&&r.items?c(r.items):d(),setTimeout(()=>{a&&o&&(a.textContent=o),n&&(n.hidden=!0),t.disabled=!1},2e3)}catch(a){console.error("Complementary product add to cart error:",a),e(r,"Sorry, something went wrong. Please try again."),t.disabled=!1}}else e(r,"This option combination is unavailable")}loadSlider(){window.theme.Swiper?this.initSlider():document.addEventListener("theme:inititialised",()=>{this.initSlider()},{once:!0})}initSlider(){const t=this.querySelector("[data-lcp-slider]"),e=this.querySelector("[data-lcp-slider-prev]"),r=this.querySelector("[data-lcp-slider-next]");new window.theme.Swiper(t,{slidesPerView:"auto",spaceBetween:16,navigation:{prevEl:e,nextEl:r}})}}function c(t,e){(e||document).querySelectorAll("[data-item-quantity][data-product-id]").forEach(e=>{const r=Number(e.dataset.productId),a=t.filter(t=>t.product_id===r).reduce((t,e)=>t+e.quantity,0);a>0?(e.textContent=a,e.hidden=!1):(e.textContent="",e.hidden=!0)})}function d(t){fetch("/cart.js").then(t=>t.json()).then(e=>c(e.items,t)).catch(()=>{})}customElements.get("complementary-products")||customElements.define("complementary-products",s),window._cardProductATC||(window._cardProductATC=!0,document.addEventListener("click",async function(t){const e=t.target.closest("[data-card-atc]");if(!e)return;if(e.disabled)return;const r=Number(e.dataset.variantId);if(r){e.disabled=!0;try{const t=window.Herd.utils.sectionRenderer.popoutCartSections.filter(t=>"data-add-to-cart-focus-product"!==t.id).map(t=>t.section),a=await window.Herd.Cart.addItem({id:r,quantity:1},null,{sections:t,sectionsUrl:window.location.pathname+window.location.search}),n=e.querySelector("[data-product-add-to-cart-text]"),i=e.querySelector("[data-atc-icon-default]"),o=e.querySelector("[data-atc-icon-added]"),s=n?n.textContent.trim():null,l=e.dataset.addedText;n&&l&&(n.textContent=l),i&&(i.hidden=!0),o&&(o.hidden=!1),a&&a.items?c(a.items):d(),setTimeout(()=>{n&&s&&(n.textContent=s),i&&(i.hidden=!1),o&&(o.hidden=!0),e.disabled=!1},2e3)}catch(t){console.error("Card product add to cart error:",t),e.disabled=!1}}}))})();

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.