1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./CC0rzCep.js","./DK_4hUQZ.js","./TrC-AlYw.js","./JKntnBa8.js"])))=>i.map(i=>d[i]); 2import{i as ke}from"./BPfclWvH.js";import{e as At,u as Ct,r as Mt,a1 as Et,b3 as Bt,ah as Te,a2 as tt,aj as ht,s as G,al as Ee,a4 as B,ad as h,a9 as b,ae as c,a as i,a6 as T,a8 as x,a5 as Le,aa as Pe,af as V,ak as Qe,a3 as st,b4 as Dt,ap as Ft,_ as St,an as vt,b as It,ab as $e}from"./Vnp9ZWRY.js";import{e as we,s as X,i as _e}from"./BC_on0Uq.js";import{h as ot}from"./CaR3pRHG.js";import{s as se,r as Lt,b as zt}from"./Bf3u7tR4.js";import{s as Rt,a as jt}from"./YIQUrQ42.js";import{p as Pt}from"./CyLKv5XZ.js";import{_ as Ne}from"./PPVm8Dsz.js";import{s as Tt}from"./8BG9SRbI.js";import{b as at}from"./CdaDeJQt.js";import{p as Ot}from"./J3_ehdr7.js";function We(t,e,s){At(()=>{var r=Ct(()=>e(t,s?.())||{});if(s&&r?.update){var n=!1,o={};Mt(()=>{var a=s();Et(a),n&&Bt(o,a)&&(o=a,r.update(a))}),n=!0}if(r?.destroy)return()=>r.destroy()})}var $t=B('<a class="dropdown-link svelte-1elxaub"><span class="link-icon svelte-1elxaub"><!></span> <span class="link-content svelte-1elxaub"><span class="link-label svelte-1elxaub"> </span> <span class="link-desc svelte-1elxaub"> </span></span></a>'),Wt=B('<div class="dropdown-column svelte-1elxaub"><div class="column-header svelte-1elxaub"><span> </span> <span class="column-desc svelte-1elxaub"> </span></div> <!></div>'),Nt=B('<a> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"></polyline></svg></a> <div><div class="dropdown-content svelte-1elxaub"><div class="dropdown-header svelte-1elxaub"><a href="/services" class="dropdown-title svelte-1elxaub">All Services <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg></a> <span class="dropdown-subtitle svelte-1elxaub">Build. Grow. Automate.</span></div> <div class="dropdown-grid svelte-1elxaub"></div></div></div>',1),Ht=B('<a class="integration-card svelte-1elxaub"><span class="integration-icon svelte-1elxaub"><!></span> <span class="integration-content svelte-1elxaub"><span class="integration-label svelte-1elxaub"> </span> <span class="integration-desc svelte-1elxaub"> </span></span></a>'),Vt=B('<a> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"></polyline></svg></a> <div><div class="dropdown-content dropdown-content-wide svelte-1elxaub"><div class="dropdown-header svelte-1elxaub"><a href="/integrations" class="dropdown-title svelte-1elxaub">All Integrations <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg></a> <span class="dropdown-subtitle svelte-1elxaub">Connect your business systems</span></div> <div class="integrations-grid svelte-1elxaub"></div></div></div>',1),Gt=B("<a> </a>"),Yt=B("<li><!></li>"),Kt=B('<a class="svelte-1elxaub"> </a>'),Qt=B('<a class="svelte-1elxaub"> </a>'),Ut=B('<a class="svelte-1elxaub"> </a>'),qt=B('<a class="svelte-1elxaub"> </a>'),Xt=B('<a> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"></polyline></svg></a> <div><a href="/services" class="mobile-dropdown-title svelte-1elxaub">All Services</a> <div class="mobile-dropdown-grid svelte-1elxaub"><div class="mobile-dropdown-column svelte-1elxaub"><span class="column-label build svelte-1elxaub">Build</span> <!></div> <div class="mobile-dropdown-column svelte-1elxaub"><span class="column-label grow svelte-1elxaub">Grow</span> <!></div> <div class="mobile-dropdown-column svelte-1elxaub"><span class="column-label automate svelte-1elxaub">Automate</span> <!></div> <div class="mobile-dropdown-column svelte-1elxaub"><span class="column-label specialise svelte-1elxaub">Specialise</span> <!></div></div></div>',1),Zt=B('<a class="svelte-1elxaub"> </a>'),Jt=B('<a> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
2ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"></polyline></svg></a> <div><a href="/integrations" class="mobile-dropdown-title svelte-1elxaub">All Integrations</a> <div class="mobile-dropdown-list svelte-1elxaub"></div></div>',1),es=B("<a> </a>"),ts=B("<li><!></li>"),ss=B('<header><div class="container"><nav class="nav svelte-1elxaub"><a href="/" class="logo svelte-1elxaub"><img src="/images/webfootprint-logo-svg.svg" alt="WebFootprint" class="svelte-1elxaub"/></a> <button class="mobile-toggle svelte-1elxaub" aria-label="Toggle menu"><span></span></button> <ul class="nav-links desktop-nav svelte-1elxaub"></ul> <a href="/contact" class="btn btn-primary nav-cta svelte-1elxaub">Contact us</a></nav></div> <div><ul class="mobile-nav-links svelte-1elxaub"><!> <li class="mobile-contact svelte-1elxaub"><a href="/contact" class="mobile-contact-btn svelte-1elxaub">Contact us</a></li></ul></div></header>');function yr(t,e){tt(e,!0);const s=()=>jt(Pt,"$page",r),[r,n]=Rt();let o=Ee(!1),a=Ee(!1),l=Ee(!1),d=Ee(!1);ht(()=>{function g(){G(d,window.scrollY>40)}return window.addEventListener("scroll",g,{passive:!0}),g(),()=>window.removeEventListener("scroll",g)});function u(g){const w=s().url.pathname;return g==="/"?w==="/":w===g||w.startsWith(g+"/")}const v=[{label:"Website Design",href:"/services/website-design",category:"build",desc:"Custom responsive websites",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>'},{label:"App Development",href:"/services/app-development",category:"build",desc:"Web and mobile apps",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2"/><line x1="12" y1="18" x2="12.01" y2="18"/></svg>'},{label:"E-commerce",href:"/services/ecommerce",category:"build",desc:"Online stores that sell",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="21" r="1"/><circle cx="20" cy="21" r="1"/><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"/></svg>'},{label:"Shopify",href:"/services/shopify",category:"build",desc:"Shopify stores and themes",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"/><line x1="3" y1="6" x2="21" y2="6"/><path d="M16 10a4 4 0 0 1-8 0"/></svg>'},{label:"WordPress",href:"/services/wordpress",category:"build",desc:"WordPress development",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>'},{label:"Online Marketing",href:"/services/online-marketing",category:"grow",desc:"Full digital strategy",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>'},{label:"SEO",href:"/services/seo",category:"grow",desc:"Search engine rankings",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>'},{label:"GEO (AI Search)",href:"/services/geo",category:"grow",desc:"AI search optimisation",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>'},{label:"Paid Ads",href:"/services/paid-ads",category:"grow",desc:"Google and social ads",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 3l-4 4-4-4"/></svg>'},{label:"Explainer Videos",href:"/services/explainer-videos",category:"grow",desc:"Animated video content",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"/></svg>'},{label:"WhatsApp Automation",href:"/services/whatsapp-automation",category:"grow",desc:"Business messaging",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/></svg>'},{label:"Systems & Integrations",href:"/services/systems-integration",category:"automate",desc:"Connect your tools",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>'},{label:"AI Development",href:"/services/ai-development",category:"automate",desc:"Custom AI solutions",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3m9 0a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3"/></svg>'},{label:"AI Chatbots",href:"/services/ai-chatbots",category:"automate",desc:"Intelligent chat agents",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>'},{label:"CRM & Sales Systems",href:"/services/crm",category:"automate",desc:"Sales pipeline tools",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>'},{label:"Vehicle Configurator",href:"/services/vehicle-configurator",category:"specialise",desc:"3D product builders",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="3" width="15" height="13"/><polygon points="16 8 20 8 23 11 23 16 16 16 16 8"/><circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/></svg>'},{label:"Digital Consulting",href:"/services/consulting",category:"specialise",desc:"Strategy and advisory",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg>'},{label:"App Finishing",href:"/services/app-finishing",category:"specialise",desc:"Polish and ship apps",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>'},{label:"Data to API",href:"/services/data-to-api",category:"specialise",desc:"Turn data into APIs",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></svg>'}],p={build:"Websites, apps and online stores",grow:"Marketing, SEO and paid media",automate:"AI, integrations and CRM",specialise:"Configurators, consulting and niche builds"},f=[{label:"CRM",href:"/integrations/crm",desc:"Salesforce, HubSpot, Zoho",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>'},{label:"Payments & Billing",href:"/integrations/payments",desc:"Stripe, PayFast, Peach",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="4" width="22" height="16" rx="2"/><line x1="1" y1="10" x2="23" y2="10"/></svg>'},{label:"Accounting",href:"/integrations/accounting",desc:"Xero, Sage, QuickBooks",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>'},{label:"Workflow Automation",href:"/integrations/automation",desc:"Zapier, Make, n8n",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>'},{label:"Data & ETL",href:"/integrations/data",desc:"Pipelines and warehouses",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></svg>'},{label:"Microsoft",href:"/integrations/microsoft",desc:"365, Teams, Dynamics",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="8" height="8"/><rect x="13" y="3" width="8" height="8"/><rect x="3" y="13" width="8" height="8"/><rect x="13" y="13" width="8" height="8"/></svg>'},{label:"Compliance & Finance",href:"/integrations/compliance",desc:"FICA, POPIA, AML",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>'},{label:"Growth & Retention",href:"/integrations/growth",desc:"Email, loyalty, referrals",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 6 13.5 15.5 8.5 10.5 1 18"/><polyline points="17 6 23 6 23 12"/></svg>'},{label:"Legacy Modernisation",href:"/integrations/legacy",desc:"Migrate old systems",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="1 4 1 10 7 10"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/></svg>'},{label:"Education & Training",href:"/integrations/education",desc:"LMS and e-learning",icon:'<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg>'}],y=[{label:"Home",href:"/"},{label:"Services",href:"/services",hasDropdown:"services"},{label:"Integrations",href:"/integrations",hasDropdown:"integrations"},{label:"About",href:"/about"},{label:"Portfolio",href:"/portfolio"},{label:"Blog",href:"/blog"},{label:"FAQs",href:"/faqs"}];function D(){G(o,!i(o)),i(o)||G(a,!1)}function W(g){window.innerWidth<=900&&(g.preventDefault(),G(a,!i(a)),G(l,!1))}function ee(g){window.innerWidth<=900&&(g.preventDefault(),G(l,!i(l)),G(a,!1))}function F(){G(o,!1),G(a,!1),G(l,!1)}var N=ss();let J;var K=h(N),me=h(K),Ce=b(h(me),2);Ce.__click=D;var te=h(Ce);let ie;c(Ce);var de=b(Ce,2);we(de,21,()=>y,_e,(g,w)=>{var _=Yt();let S;var M=h(_);{var j=re=>{var A=Nt(),P=Le(A);let ye;P.__click=W;var fe=h(P),Y=b(fe);let z;c(P);var I=b(P,2);let $;var H=h(I),xe=h(H),he=h(xe);he.__click=F,Pe(2),c(xe);var oe=b(xe,2);we(oe,20,()=>["build","grow","automate","specialise"],_e,(R,ve)=>{var ce=Wt(),U=h(ce),ne=h(U),ue=h(ne,!0);c(ne);var L=b(ne,2),Z=h(L,!0);c(L),c(U);var E=b(U,2);we(E,17,()=>v.filter(ae=>ae.category===ve),_e,(ae,De)=>{var Me=$t();Me.__click=F;var Ie=h(Me),C=h(Ie);ot(C,()=>i(De).icon),c(Ie);var q=b(Ie,2),ge=h(q),Re=h(ge,!0);c(ge);var nt=b(ge,2),kt=h(nt,!0);c(nt),c(q),c(Me),T(()=>{se(Me,"href",i(De).href),V(Re,i(De).label),V(kt,i(De).desc)}),x(ae,Me)}),c(ce),T(ae=>{X(ne,1,`column-label ${ve??""}`,"svelte-1elxaub"),V(ue,ae),V(Z,p[ve])},[()=>ve.charAt(0).toUpperCase()+ve.slice(1)]),x(R,ce)}),c(oe),c(H),c(I),T(R=>{se(P,"href",i(w).href),ye=X(P,1,"nav-link-with-dropdown svelte-1elxaub",null,ye,R),V(fe,`${i(w).label??""} `),z=X(Y,0,"dropdown-arrow svelte-1elxaub",null,z,{open:i(a)}),$=X(I,1,"dropdown svelte-1elxaub",null,$,{open:i(a)})},[()=>({active:u(i(w).href)})]),x(re,A)},Q=re=>{var A=Qe(),P=Le(A);{var ye=Y=>{var z=Vt(),I=Le(z);let $;I.__click=ee;var H=h(I),xe=b(H);let he;c(I);var oe=b(I,2);let R;var ve=h(oe),ce=h(ve),U=h(ce);U.__click=F,Pe(2),c(ce);var ne=b(ce,2);we(ne,21,()=>f,_e,(ue,L)=>{var Z=Ht();Z.__click=F;var E=h(Z),ae=h(E);ot(ae,()=>i(L).icon),c(E);var De=b(E,2),Me=h(De),Ie=h(Me,!0);c(Me);var C=b(Me,2),q=h(C,!0);c(C),c(De),c(Z),T(()=>{se(Z,"href",i(L).href),V(Ie,i(L).label),V(q,i(L).desc)}),x(ue,Z)}),c(ne),c(ve),c(oe),T(ue=>{se(I,"href",i(w).href),$=X(I,1,"nav-link-with-dropdown svelte-1elxaub",null,$,ue),V(H,`${i(w).label??""} `),he=X(xe,0,"dropdown-arrow svelte-1elxaub",null,he,{open:i(l)}),R=X(oe,1,"dropdown integrations-dropdown svelte-1elxaub",null,R,{open:i(l)})},[()=>({active:u(i(w).href)})]),x(Y,z)},fe=Y=>{var z=Gt();z.__click=F;let I;var $=h(z,!0);c(z),T(H=>{se(z,"href",i(w).href),I=X(z,1,"svelte-1elxaub",null,I,H),V($,i(w).label)},[()=>({active:u(i(w).href)})]),x(Y,z)};ke(P,Y=>{i(w).hasDropdown==="integrations"?Y(ye):Y(fe,!1)},!0)}x(re,A)};ke(M,re=>{i(w).hasDropdown==="services"?re(j):re(Q,!1)})}c(_),T(()=>S=X(_,1,"svelte-1elxaub",null,S,{"has-dropdown":i(w).hasDropdown})),x(g,_)}),c(de),Pe(2),c(me),c(K);var Be=b(K,2);let pe;var be=h(Be),O=h(be);we(O,17,()=>y,_e,(g,w)=>{var _=ts();let S;var M=h(_);{var j=re=>{var A=Xt(),P=Le(A);let ye;P.__click=W;var fe=h(P),Y=b(fe);let z;c(P);var I=b(P,2);let
2$;var H=h(I);H.__click=F;var xe=b(H,2),he=h(xe),oe=b(h(he),2);we(oe,17,()=>v.filter(L=>L.category==="build"),_e,(L,Z)=>{var E=Kt();E.__click=F;var ae=h(E,!0);c(E),T(()=>{se(E,"href",i(Z).href),V(ae,i(Z).label)}),x(L,E)}),c(he);var R=b(he,2),ve=b(h(R),2);we(ve,17,()=>v.filter(L=>L.category==="grow"),_e,(L,Z)=>{var E=Qt();E.__click=F;var ae=h(E,!0);c(E),T(()=>{se(E,"href",i(Z).href),V(ae,i(Z).label)}),x(L,E)}),c(R);var ce=b(R,2),U=b(h(ce),2);we(U,17,()=>v.filter(L=>L.category==="automate"),_e,(L,Z)=>{var E=Ut();E.__click=F;var ae=h(E,!0);c(E),T(()=>{se(E,"href",i(Z).href),V(ae,i(Z).label)}),x(L,E)}),c(ce);var ne=b(ce,2),ue=b(h(ne),2);we(ue,17,()=>v.filter(L=>L.category==="specialise"),_e,(L,Z)=>{var E=qt();E.__click=F;var ae=h(E,!0);c(E),T(()=>{se(E,"href",i(Z).href),V(ae,i(Z).label)}),x(L,E)}),c(ne),c(xe),c(I),T(L=>{se(P,"href",i(w).href),ye=X(P,1,"nav-link-with-dropdown svelte-1elxaub",null,ye,L),V(fe,`${i(w).label??""} `),z=X(Y,0,"dropdown-arrow svelte-1elxaub",null,z,{open:i(a)}),$=X(I,1,"mobile-dropdown svelte-1elxaub",null,$,{open:i(a)})},[()=>({active:u(i(w).href)})]),x(re,A)},Q=re=>{var A=Qe(),P=Le(A);{var ye=Y=>{var z=Jt(),I=Le(z);let $;I.__click=ee;var H=h(I),xe=b(H);let he;c(I);var oe=b(I,2);let R;var ve=h(oe);ve.__click=F;var ce=b(ve,2);we(ce,21,()=>f,_e,(U,ne)=>{var ue=Zt();ue.__click=F;var L=h(ue,!0);c(ue),T(()=>{se(ue,"href",i(ne).href),V(L,i(ne).label)}),x(U,ue)}),c(ce),c(oe),T(U=>{se(I,"href",i(w).href),$=X(I,1,"nav-link-with-dropdown svelte-1elxaub",null,$,U),V(H,`${i(w).label??""} `),he=X(xe,0,"dropdown-arrow svelte-1elxaub",null,he,{open:i(l)}),R=X(oe,1,"mobile-dropdown svelte-1elxaub",null,R,{open:i(l)})},[()=>({active:u(i(w).href)})]),x(Y,z)},fe=Y=>{var z=es();z.__click=F;let I;var $=h(z,!0);c(z),T(H=>{se(z,"href",i(w).href),I=X(z,1,"svelte-1elxaub",null,I,H),V($,i(w).label)},[()=>({active:u(i(w).href)})]),x(Y,z)};ke(P,Y=>{i(w).hasDropdown==="integrations"?Y(ye):Y(fe,!1)},!0)}x(re,A)};ke(M,re=>{i(w).hasDropdown==="services"?re(j):re(Q,!1)})}c(_),T(()=>S=X(_,1,"svelte-1elxaub",null,S,{"has-dropdown":i(w).hasDropdown})),x(g,_)});var k=b(O,2),le=h(k);le.__click=F,c(k),c(be),c(Be),c(N),T(()=>{J=X(N,1,"header svelte-1elxaub",null,J,{scrolled:i(d)}),ie=X(te,1,"hamburger svelte-1elxaub",null,ie,{open:i(o)}),pe=X(Be,1,"mobile-nav svelte-1elxaub",null,pe,{open:i(o)})}),x(t,N),st(),n()}Te(["click"]);Dt();function Ve(t,e={}){const{direction:s="up",delay:r=0,duration:n=600,distance:o=30,threshold:a=.1,once:l=!0}=e;switch(t.style.opacity="0",t.style.transition=`opacity ${n}ms cubic-bezier(0.4, 0, 0.2, 1) ${r}ms, transform ${n}ms cubic-bezier(0.4, 0, 0.2, 1) ${r}ms`,s){case"up":t.style.transform=`translateY(${o}px)`;break;case"down":t.style.transform=`translateY(-${o}px)`;break;case"left":t.style.transform=`translateX(${o}px)`;break;case"right":t.style.transform=`translateX(-${o}px)`;break;case"scale":t.style.transform="scale(0.95)";break;default:t.style.transform="translateY(0)"}let d=!1;const u=new IntersectionObserver(v=>{v.forEach(p=>{if(p.isIntersecting&&(!l||!d))t.style.opacity="1",t.style.transform="translateY(0) translateX(0) scale(1)",d=!0,l&&u.unobserve(t);else if(!p.isIntersecting&&!l){switch(s){case"up":t.style.transform=`translateY(${o}px)`;break;case"down":t.style.transform=`translateY(-${o}px)`;break;case"left":t.style.transform=`translateX(${o}px)`;break;case"right":t.style.transform=`translateX(-${o}px)`;break;case"scale":t.style.transform="scale(0.95)";break}t.style.opacity="0"}})},{threshold:a});return u.observe(t),{destroy(){u.unobserve(t)},update(v){}}}function rs(t,e={}){const{delay:s=0,stagger:r=100}=e,n=Array.from(t.children);n.forEach((a,l)=>{a.style.opacity="0",a.style.transform="translateY(20px)",a.style.transition=`opacity 500ms cubic-bezier(0.4, 0, 0.2, 1) ${s+l*r}ms, transform 500ms cubic-bezier(0.4, 0, 0.2, 1) ${s+l*r}ms`});const o=new IntersectionObserver(a=>{a.forEach(l=>{l.isIntersecting&&(n.forEach(d=>{d.style.opacity="1",d.style.transform="translateY(0)"}),o.unobserve(t))})},{threshold:.1});return o.observe(t),{destroy(){o.unobserve(t)}}}const ns=[{slug:"toyota-configurator",client:"Toyota South Africa",industry:"Automotive",image:"/images/portfolio/toyota-configurator-hero.webp",challenge:"Needed a highly interactive 3D vehicle configurator that could handle dozens of models with real-time colour and accessory changes.",delivered:"Custom WebGL configurator powering Rav4, Fortuner, Hilux and more for 6+ years, integrated into their dealer network.",metric:"6+ years in production",category:"configurator",featured:!0},{slug:"front-runner-outfitters",client:"Front Runner Outfitters",industry:"E-commerce / Automotive",image:"/images/portfolio/front-runner-hero.webp",challenge:"An extensive vehicle accessories catalogue needed fast search, fitment guides and a seamless checkout.",delivered:"Full e-commerce platform with advanced product filtering, vehicle fitment database and streamlined ordering.",metric:"1,000+ SKUs catalogued",category:"ecommerce",featured:!0},{slug:"discovery-leadership-summit",client:"Discovery",industry:"Financial Services",image:"/images/portfolio/discovery-hero.webp",challenge:"Annual Leadership Summit needed a polished event site with registration, speaker profiles and live-day agenda.",delivered:"Event website with registration flow, speaker bios, dynamic agenda and post-event content hub.",metric:"Delivered in 3 weeks",category:"website",featured:!0},{slug:"parkupp",client:"ParkUpp",industry:"PropTech",image:"/images/portfolio/parkupp-hero.webp",challenge:"Monthly parking marketplace needed a booking engine, payment processing and landlord dashboard.",delivered:"End-to-end booking platform with recurring payments, occupancy management and mobile-first UX.",category:"app"},{slug:"waz-furniture",client:"Waz Furniture",industry:"Retail / Furniture",image:"/images/portfolio/waz-hero.webp",challenge:"Premium furniture brand needed a website that matched the quality of their handcrafted products.",delivered:"Custom website with product galleries, room visualiser and trade enquiry system.",category:"website"},{slug:"times-of-eswatini",client:"Times of Eswatini",industry:"Media / Publishing",image:"/images/portfolio/times-eswatini-hero.webp",challenge:"National newspaper needed a modern digital presence with real-time content publishing.",delivered:"Full news platform with CMS, categorised feeds, breaking news alerts and advertising integration.",category:"website"},{slug:"diy-hardware",client:"DIY Hardware",industry:"E-commerce / Retail",image:"/images/portfolio/diy-hardware-hero.webp",challenge:"Hardware store needed to bring their full product range online with inventory sync.",delivered:"Complete e-commerce store with product catalogue, search, inventory management and delivery tracking.",category:"ecommerce"},{slug:"mysky-networks",client:"MySky Networks",industry:"Telecoms",image:"/images/portfolio/mysky-hero.webp",challenge:"ISP needed a CRM with item tracking, state management and customer lifecycle automation.",delivered:"Custom CRM system with asset tracking, automated provisioning workflows and reporting dashboard.",category:"app"},{slug:"tjhoko-paint",client:"Tjhoko Paint",industry:"E-commerce / Retail",image:"/images/portfolio/tjhoko-hero.webp",challenge:"Paint brand needed an online store with colour browsing, ordering and stockist finder.",delivered:"E-commerce store with visual colour selector, stockist locator and trade account management.",category:"ecommerce"},{slug:"amcham",client:"American Chamber of Commerce",industry:"Non-profit / Business",image:"/images/portfolio/amcham-hero.webp",challenge:"Long-term partner needing ongoing website management, event listings and member communications.",delivered:"Managed website with event calendar, member directory and newsletter integration.",category:"website"},{slug:"dstv",client:"DStv",industry:"Media / Entertainment",image:"/images/portfolio/dstv-hero.webp",challenge:"Email marketing campaigns needed to engage millions of subscribers with personalised content.",delivered:"Templated email campaign system with dynamic content blocks, A/B testing and performance analytics.",category:"marketing"},{slug:"tttfp",client:"TTTFP - European Union",industry:"Government / Development",image:"/images/portfolio/tttfp-hero.webp",challenge:"EU-funded programme needed a public-facing website for project updates and stakeholder communication.",delivered:"Multi-language website with project tracking, document library and stakeholder portal.",category:"website"},{slug:"finova",client:"Finova",industry:"Finance / Investment",image:"/images/portfolio/finova-hero.webp",challenge:"Financial services firm needed a professional digital presence with compliance-ready content.",delivered:"Corporate website with service pages, team profiles and regulatory document management.",category:"website"},{slug:"vehicle-configurator-demo",client:"WebFootprint",industry:"Automotive",image:"/images/portfolio/vehicle-demo-hero.webp",challenge:"Internal showcase demonstrating our 3D vehicle configuration technology.",delivered:"Interactive 3D demo with real-time paint, wheel and accessory customisation.",category:"configurator"}],xr=ns.filter(t=>t.featured),os=[{name:"James M.",company:"Front Runner Outfitters",role:"Digital Manager",text:"WebFootprint built our entire e-commerce platform and it has been rock solid. The team is responsive, knows their stuff, and delivers on time. Best agency decision we have made.",rating:5,featured:!0},{name:"Thabo K.",company:"ParkUpp",role:"Founder",text:"From concept to launch in under two months. The booking platform they built handles thousands of transactions without a hiccup. Direct access to the developers made all the difference.",rating:5},{name:"Sarah L.",company:"Tjhoko Paint",role:"Marketing Director",text:"Our online store looks beautiful and our customers love using it. The colour selector tool was exactly what we needed. Sales have gone up significantly since launch.",rating:5},{name:"Michael R.",company:"MySky Networks",role:"Operations Lead",text:"The CRM system they built replaced three separate tools we were using. Everything is now in one place and our team saves hours every week. Brilliant execution.",rating:5},{name:"Linda D.",company:"Waz Furniture",role:"Owner",text:"They understood our brand immediately. The website captures the premium feel of our furniture perfectly. We get compliments from customers all the time.",rating:5,featured:!0},{name:"David P.",company:"DIY Hardware",role:"Managing Director",text:"Taking our full product range online seemed impossible until we started working with WebFootprint. The store runs smoothly and inventory stays in sync.",rating:5},{name:"Nomsa T.",company:"Discovery",role:"Events Coordinator",text:"They turned our Leadership Summit site around in three weeks. Professional, fast, and the end result looked incredible. Will definitely use them again.",rating:5},{name:"Chris V.",company:"Finova",role:"CEO",text:"Clean, professional website that reflects the trust and credibility we need in financial services. The ongoing support has been excellent.",rating:5},{name:"Andrew B.",company:"AmCham SA",role:"Director",text:"WebFootprint has managed our website for years. They are reliable, responsive and always proactive about improvements. A true long-term partner.",rating:5},{name:"Peter S.",company:"Times of Eswatini",role:"Digital Editor",text:"Our news platform handles heavy traffic and the CMS is easy for our journalists to use. The team understood media publishing requirements from day one.",rating:5}],_r=os.filter(t=>t.featured);var as=B('<p class="faq-answer svelte-jfcp4g"> </p>'),is=B('<button><div class="faq-question svelte-jfcp4g"><span class="svelte-jfcp4g"> </span> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-jfcp4g"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg></div> <!></button>'),ls=B('<section class="faq-teaser svelte-jfcp4g"><div class="container"><div class="teaser-layout svelte-jfcp4g"><div class="teaser-header svelte-jfcp4g"><span class="kicker">FAQs</span> <h2>Questions we hear most</h2> <p class="measure svelte-jfcp4g">Quick answers to the things decision-makers ask before getting started.</p> <a href="/faqs" class="btn btn-secondary">View all FAQs</a></div> <div class="teaser-list svelte-jfcp4g"></div></div></div></section>');function kr(t){const e=[{q:"How much does a website cost?",a:"Projects range from R25k for a brochure site to R150k+ for a full custom platform. We scope and quote before any work begins."},{q:"How long does a project take?",a:"Most websites launch in 4 to 8 weeks. Apps and complex integrations may take 8 to 16 weeks."},{q:"Do I own the code and content?",a:"Yes. Code, design files, content and data are yours. No lock-in, no hidden licensing."},{q:"What happens after launch?",a:"We offer ongoing support plans or hand everything over so you can run it independently. Your choice."},{q:"Can you work with our existing systems?",a:"Absolutely. We integrate with Xero, HubSpot, Salesforce, Shopify, WordPress and dozens more."},{q:"Where is your team based?",a:"Johannesburg, South Africa. We work with clients across Southern Africa and internationally."}];let s=Ee(null);function r(u){G(s,i(s)===u?null:u,!0)}var n=ls(),o=h(n),a=h(o),l=h(a);We(l,(u,v)=>Ve?.(u,v),()=>({direction:"up"}));var d=b(l,2);we(d,21,()=>e,_e,(u,v,p)=>{var f=is();let y;f.__click=()=>r(p);var D=h(f),W=h(D),ee=h(W,!0);c(W),Pe(2),c(D);var F=b(D,2);{var N=J=>{var K=as(),me=h(K,!0);c(K),T(()=>V(me,i(v).a)),x(J,K)};ke(F,J=>{i(s)===p&&J(N)})}c(f),T(()=>{y=X(f,1,"faq-item svelte-jfcp4g",null,y,{open:i(s)===p}),se(f,"aria-expanded",i(s)===p),V(ee,i(v).q)}),x(u,f)}),c(d),We(d,(u,v)=>rs?.(u,v),()=>({stagger:60})),c(a),c(o),c(n),x(t,n)}Te(["click"]);Te(["click"]);Te(["click","keydown"]);var cs=B('<div class="loader svelte-1wtn28z"><div class="loader-spinner svelte-1wtn28z"></div> <p class="svelte-1wtn28z"> </p></div>'),us=vt('<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3"></path></svg>'),ds=vt('<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"></path></svg>'),hs=B("<button></button>"),vs=B('<div><div class="viewer svelte-1wtn28z"><!></div>
2 <div class="zoom-controls svelte-1wtn28z"><button class="zoom-btn svelte-1wtn28z" aria-label="Zoom in" title="Zoom in"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg></button> <button class="zoom-btn svelte-1wtn28z" aria-label="Zoom out" title="Zoom out"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"></line></svg></button> <button class="zoom-btn svelte-1wtn28z" aria-label="Reset view" title="Reset view"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="1 4 1 10 7 10"></polyline><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"></path></svg></button> <button class="zoom-btn fullscreen-btn svelte-1wtn28z"><!></button></div> <div class="color-selector svelte-1wtn28z"></div> <div class="viewer-hint svelte-1wtn28z"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1wtn28z"><path d="M5 9l4 4 4-4"></path></svg> <span>Click & drag to rotate ⢠Scroll or use buttons to zoom</span></div></div>');function Ar(t,e){tt(e,!0);let s,r=Ee(!0),n=Ee(0),o=Ee("blue");const a=[{id:"black",hex:"#000000",material:"Body_Black"},{id:"blue",hex:"#0066cc",material:"Body_Blue"},{id:"grey",hex:"#808080",material:"Body_Grey"},{id:"red",hex:"#cc0000",material:"Body_Red"},{id:"white",hex:"#ffffff",material:"Body_White"},{id:"yellow",hex:"#ffd700",material:"Body_Yellow"}];let l=null,d=null,u=null,v=null,p,f=Ee(!1);ht(async()=>{const g=await Ne(()=>import("./DK_4hUQZ.js"),[],import.meta.url),{GLTFLoader:w}=await Ne(async()=>{const{GLTFLoader:C}=await import("./CC0rzCep.js");return{GLTFLoader:C}},__vite__mapDeps([0,1]),import.meta.url),{DRACOLoader:_}=await Ne(async()=>{const{DRACOLoader:C}=await import("./TrC-AlYw.js");return{DRACOLoader:C}},__vite__mapDeps([2,1]),import.meta.url),{OrbitControls:S}=await Ne(async()=>{const{OrbitControls:C}=await import("./JKntnBa8.js");return{OrbitControls:C}},__vite__mapDeps([3,1]),import.meta.url),M=new g.Scene;M.background=new g.Color(657930);const j=new g.PerspectiveCamera(40,s.clientWidth/s.clientHeight,.1,1e3),Q=new g.WebGLRenderer({antialias:!0}),re=2e3;Math.min(s.clientWidth,re),Math.min(s.clientHeight,re),Q.setSize(s.clientWidth,s.clientHeight),Q.setPixelRatio(Math.min(window.devicePixelRatio,2.5)),Q.outputColorSpace=g.SRGBColorSpace,Q.toneMapping=g.ACESFilmicToneMapping,Q.toneMappingExposure=1,Q.shadowMap.enabled=!0,Q.shadowMap.type=g.PCFSoftShadowMap,s.appendChild(Q.domElement);const A=new S(j,Q.domElement);A.enableDamping=!0,A.dampingFactor=.08,A.rotateSpeed=.8,A.panSpeed=0,A.enablePan=!1,A.zoomSpeed=1.2,A.minDistance=3,A.maxDistance=15,A.minPolarAngle=Math.PI/6,A.maxPolarAngle=Math.PI/2.2,A.target.set(0,.3,0);const P={x:-3.5,y:1.5,z:4};j.position.set(P.x,P.y,P.z),d=()=>{const C=new g.Vector3;C.subVectors(A.target,j.position).normalize(),j.position.distanceTo(A.target)>A.minDistance+.5&&j.position.addScaledVector(C,1)},u=()=>{const C=new g.Vector3;C.subVectors(j.position,A.target).normalize(),j.position.distanceTo(A.target)<A.maxDistance-.5&&j.position.addScaledVector(C,1)},v=()=>{j.position.set(P.x,P.y,P.z),A.target.set(0,.3,0)};const ye=new g.PlaneGeometry(80,80,1,1),fe=new g.MeshStandardMaterial({color:1381655,roughness:.95,metalness:0}),Y=new g.Mesh(ye,fe);Y.rotation.x=-Math.PI/2,Y.position.y=0,Y.receiveShadow=!0,M.add(Y);const z=new g.CircleGeometry(12,64),I=new g.MeshStandardMaterial({color:1973794,roughness:.9,metalness:0,transparent:!0,opacity:.8}),$=new g.Mesh(z,I);$.rotation.x=-Math.PI/2,$.position.y=.001,$.receiveShadow=!0,M.add($),M.fog=new g.Fog(657930,15,40);const H=new g.PMREMGenerator(Q);H.compileEquirectangularShader(),new g.TextureLoader().load("/bg.webp",C=>{const q=H.fromEquirectangular(C).texture;M.environment=q,C.dispose(),H.dispose()});const he=new g.AmbientLight(16777215,.3);M.add(he);const oe=new g.HemisphereLight(16777215,2236962,.5);M.add(oe);const R=new g.DirectionalLight(16775920,1.5);R.position.set(5,10,8),R.castShadow=!0,R.shadow.mapSize.width=2048,R.shadow.mapSize.height=2048,R.shadow.camera.near=1,R.shadow.camera.far=30,R.shadow.camera.left=-8,R.shadow.camera.right=8,R.shadow.camera.top=8,R.shadow.camera.bottom=-8,R.shadow.bias=-5e-4,R.shadow.radius=4,M.add(R);const ve=new g.DirectionalLight(15791615,.7);ve.position.set(-6,5,4),M.add(ve);const ce=new g.DirectionalLight(16777215,.6);ce.position.set(0,4,-8),M.add(ce);const U=new g.SpotLight(16777215,1.5);U.position.set(0,15,0),U.angle=Math.PI/5,U.penumbra=.5,U.decay=1.5,U.distance=40,U.castShadow=!0,U.shadow.mapSize.width=1024,U.shadow.mapSize.height=1024,M.add(U),U.target.position.set(0,0,0),M.add(U.target);let ne=null,ue=null;const L=new Map,Z=new w,E=new _;E.setDecoderPath("https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/libs/draco/gltf/"),Z.setDRACOLoader(E),Z.load("/audi.glb",C=>{ne=C.scene,ne.scale.set(1.5,1.5,1.5),M.add(ne),C.parser.json.materials&&C.parser.json.materials.forEac
2h((q,ge)=>{C.parser.getDependency("material",ge).then(Re=>{L.set(q.name,Re)})}),ne.traverse(q=>{if(q.isMesh){q.castShadow=!0,q.receiveShadow=!0;const ge=q;ge.name.toLowerCase()==="body"&&(ue=ge)}}),ne.traverse(q=>{if(q.isMesh){const ge=q;ge.material&&(Array.isArray(ge.material)?ge.material.forEach(Re=>{Re.envMap=M.environment,Re.envMapIntensity=1,Re.needsUpdate=!0}):(ge.material.envMap=M.environment,ge.material.envMapIntensity=1,ge.material.needsUpdate=!0))}}),setTimeout(()=>{ae("Body_Blue")},500),G(r,!1)},C=>{G(n,Math.round(C.loaded/C.total*100),!0)},C=>{console.error("Error loading model:",C),G(r,!1)});const ae=C=>{if(ue&&L.has(C)){const q=L.get(C).clone();M.environment&&(q.envMap=M.environment,q.envMapIntensity=1,q.needsUpdate=!0),ue.material=q}};window.changeCarColor=C=>{ae(C)};const De=()=>{j.aspect=s.clientWidth/s.clientHeight,j.updateProjectionMatrix(),Q.setSize(s.clientWidth,s.clientHeight)};window.addEventListener("resize",De);let Me;const Ie=()=>{Me=requestAnimationFrame(Ie),A.update(),Q.render(M,j)};Ie(),l=()=>{cancelAnimationFrame(Me),window.removeEventListener("resize",De),Q.dispose(),E.dispose()}}),Ft(()=>{l&&l()});function y(g){G(o,g.id,!0),window.changeCarColor&&window.changeCarColor(g.material)}function D(){d&&d()}function W(){u&&u()}function ee(){v&&v()}async function F(){try{document.fullscreenElement?(await document.exitFullscreen(),G(f,!1)):(await p.requestFullscreen(),G(f,!0))}catch(g){console.error("Fullscreen error:",g)}}St(()=>{const g=()=>{G(f,!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",g),()=>{document.removeEventListener("fullscreenchange",g)}});var N=vs();let J;var K=h(N),me=h(K);{var Ce=g=>{var w=cs(),_=b(h(w),2),S=h(_);c(_),c(w),T(()=>V(S,`Loading 3D Model... ${i(n)??""}%`)),x(g,w)};ke(me,g=>{i(r)&&g(Ce)})}c(K),at(K,g=>s=g,()=>s);var te=b(K,2),ie=h(te);ie.__click=D;var de=b(ie,2);de.__click=W;var Be=b(de,2);Be.__click=ee;var pe=b(Be,2);pe.__click=F;var be=h(pe);{var O=g=>{var w=us();x(g,w)},k=g=>{var w=ds();x(g,w)};ke(be,g=>{i(f)?g(O):g(k,!1)})}c(pe),c(te);var le=b(te,2);we(le,21,()=>a,_e,(g,w)=>{var _=hs();let S;_.__click=()=>y(i(w)),T(()=>{S=X(_,1,"color-button svelte-1wtn28z",null,S,{active:i(o)===i(w).id}),Tt(_,`background-color: ${i(w).hex??""};`),se(_,"aria-label",`Select ${i(w).id??""} color`)}),x(g,_)}),c(le),Pe(2),c(N),at(N,g=>p=g,()=>p),T(()=>{J=X(N,1,"viewer-container svelte-1wtn28z",null,J,{fullscreen:i(f)}),se(pe,"aria-label",i(f)?"Exit fullscreen":"Fullscreen"),se(pe,"title",i(f)?"Exit fullscreen":"Fullscreen")}),x(t,N),st()}Te(["click"]);function Se(t){return Array.isArray?Array.isArray(t):ft(t)==="[object Array]"}function gs(t){if(typeof t=="string")return t;let e=t+"";return e=="0"&&1/t==-1/0?"-0":e}function ps(t){return t==null?"":gs(t)}function Fe(t){return typeof t=="string"}function gt(t){return typeof t=="number"}function fs(t){return t===!0||t===!1||ws(t)&&ft(t)=="[object Boolean]"}function pt(t){return typeof t=="object"}function ws(t){return pt(t)&&t!==null}function Ae(t){return t!=null}function Ke(t){return!t.trim().length}function ft(t){return t==null?t===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}const ms="Incorrect 'index' type",bs=t=>`Invalid value for key ${t}`,ys=t=>`Pattern length exceeds max of ${t}.`,xs=t=>`Missing ${t} property in key`,_s=t=>`Property 'weight' in key '${t}' must be a positive integer`,it=Object.prototype.hasOwnProperty;class ks{constructor(e){this._keys=[],this._keyMap={};let s=0;e.forEach(r=>{let n=wt(r);this._keys.push(n),this._keyMap[n.id]=n,s+=n.weight}),this._keys.forEach(r=>{r.weight/=s})}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function wt(t){let e=null,s=null,r=null,n=1,o=null;if(Fe(t)||Se(t))r=t,e=lt(t),s=Ue(t);else{if(!it.call(t,"name"))throw new Error(xs("name"));const a=t.name;if(r=a,it.call(t,"weight")&&(n=t.weight,n<=0))throw new Error(_s(a));e=lt(a),s=Ue(a),o=t.getFn}return{path:e,id:s,weight:n,src:r,getFn:o}}function lt(t){return Se(t)?t:t.split(".")}function Ue(t){return Se(t)?t.join("."):t}function As(t,e){let s=[],r=!1;const n=(o,a,l)=>{if(Ae(o))if(!a[l])s.push(o);else{let d=a[l];const u=o[d];if(!Ae(u))return;if(l===a.length-1&&(Fe(u)||gt(u)||fs(u)))s.push(ps(u));else if(Se(u)){r=!0;for(let v=0,p=u.length;v<p;v+=1)n(u[v],a,l+1)}else a.length&&n(u,a,l+1)}};return n(t,Fe(e)?e.split("."):e,0),r?s:s[0]}const Cs={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},Ms={isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(t,e)=>
2t.score===e.score?t.idx<e.idx?-1:1:t.score<e.score?-1:1},Es={location:0,threshold:.6,distance:100},Bs={useExtendedSearch:!1,getFn:As,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1};var m={...Ms,...Cs,...Es,...Bs};const Ds=/[^ ]+/g;function Fs(t=1,e=3){const s=new Map,r=Math.pow(10,e);return{get(n){const o=n.match(Ds).length;if(s.has(o))return s.get(o);const a=1/Math.pow(o,.5*t),l=parseFloat(Math.round(a*r)/r);return s.set(o,l),l},clear(){s.clear()}}}class rt{constructor({getFn:e=m.getFn,fieldNormWeight:s=m.fieldNormWeight}={}){this.norm=Fs(s,3),this.getFn=e,this.isCreated=!1,this.setIndexRecords()}setSources(e=[]){this.docs=e}setIndexRecords(e=[]){this.records=e}setKeys(e=[]){this.keys=e,this._keysMap={},e.forEach((s,r)=>{this._keysMap[s.id]=r})}create(){this.isCreated||!this.docs.length||(this.isCreated=!0,Fe(this.docs[0])?this.docs.forEach((e,s)=>{this._addString(e,s)}):this.docs.forEach((e,s)=>{this._addObject(e,s)}),this.norm.clear())}add(e){const s=this.size();Fe(e)?this._addString(e,s):this._addObject(e,s)}removeAt(e){this.records.splice(e,1);for(let s=e,r=this.size();s<r;s+=1)this.records[s].i-=1}
vendor: 16,472 bytes, line 2
2getValueForItemAtKeyId(e,s){return e[this._keysMap[s]]}size(){return this.records.length}_addString(e,s){if(!Ae(e)||Ke(e))return;let r={v:e,i:s,n:this.norm.get(e)};this.records.push(r)}_addObject(e,s){let r={i:s,$:{}};this.keys.forEach((n,o)=>{let a=n.getFn?n.getFn(e):this.getFn(e,n.path);if(Ae(a)){if(Se(a)){let l=[];const d=[{nestedArrIndex:-1,value:a}];for(;d.length;){const{nestedArrIndex:u,value:v}=d.pop();if(Ae(v))if(Fe(v)&&!Ke(v)){let p={v,i:u,n:this.norm.get(v)};l.push(p)}else Se(v)&&v.forEach((p,f)=>{d.push({nestedArrIndex:f,value:p})})}r.$[o]=l}else if(Fe(a)&&!Ke(a)){let l={v:a,n:this.norm.get(a)};r.$[o]=l}}}),this.records.push(r)}toJSON(){return{keys:this.keys,records:this.records}}}function mt(t,e,{getFn:s=m.getFn,fieldNormWeight:r=m.fieldNormWeight}={}){const n=new rt({getFn:s,fieldNormWeight:r});return n.setKeys(t.map(wt)),n.setSources(e),n.create(),n}function Ss(t,{getFn:e=m.getFn,fieldNormWeight:s=m.fieldNormWeight}={}){const{keys:r,records:n}=t,o=new rt({getFn:e,fieldNormWeight:s});return o.setKeys(r),o.setIndexRecords(n),o}function He(t,{errors:e=0,currentLocation:s=0,expectedLocation:r=0,distance:n=m.distance,ignoreLocation:o=m.ignoreLocation}={}){const a=e/t.length;if(o)return a;const l=Math.abs(r-s);return n?a+l/n:l?1:a}function Is(t=[],e=m.minMatchCharLength){let s=[],r=-1,n=-1,o=0;for(let a=t.length;o<a;o+=1){let l=t[o];l&&r===-1?r=o:!l&&r!==-1&&(n=o-1,n-r+1>=e&&s.push([r,n]),r=-1)}return t[o-1]&&o-r>=e&&s.push([r,o-1]),s}const je=32;function Ls(t,e,s,{location:r=m.location,distance:n=m.distance,threshold:o=m.threshold,findAllMatches:a=m.findAllMatches,minMatchCharLength:l=m.minMatchCharLength,includeMatches:d=m.includeMatches,ignoreLocation:u=m.ignoreLocation}={}){if(e.length>je)throw new Error(ys(je));const v=e.length,p=t.length,f=Math.max(0,Math.min(r,p));let y=o,D=f;const W=l>1||d,ee=W?Array(p):[];let F;for(;(F=t.indexOf(e,D))>-1;){let te=He(e,{currentLocation:F,expectedLocation:f,distance:n,ignoreLocation:u});if(y=Math.min(te,y),D=F+v,W){let ie=0;for(;ie<v;)ee[F+ie]=1,ie+=1}}D=-1;let N=[],J=1,K=v+p;const me=1<<v-1;for(let te=0;te<v;te+=1){let ie=0,de=K;for(;ie<de;)He(e,{errors:te,currentLocation:f+de,expectedLocation:f,distance:n,ignoreLocation:u})<=y?ie=de:K=de,de=Math.floor((K-ie)/2+ie);K=de;let Be=Math.max(1,f-de+1),pe=a?p:Math.min(f+de,p)+v,be=Array(pe+2);be[pe+1]=(1<<te)-1;for(let k=pe;k>=Be;k-=1){let le=k-1,g=s[t.charAt(le)];if(W&&(ee[le]=+!!g),be[k]=(be[k+1]<<1|1)&g,te&&(be[k]|=(N[k+1]|N[k])<<1|1|N[k+1]),be[k]&me&&(J=He(e,{errors:te,currentLocation:le,expectedLocation:f,distance:n,ignoreLocation:u}),J<=y)){if(y=J,D=le,D<=f)break;Be=Math.max(1,2*f-D)}}if(He(e,{errors:te+1,currentLocation:f,expectedLocation:f,distance:n,ignoreLocation:u})>y)break;N=be}const Ce={isMatch:D>=0,score:Math.max(.001,J)};if(W){const te=Is(ee,l);te.length?d&&(Ce.indices=te):Ce.isMatch=!1}return Ce}function zs(t){let e={};for(let s=0,r=t.length;s<r;s+=1){const n=t.charAt(s);e[n]=(e[n]||0)|1<<r-s-1}return e}const Ge=String.prototype.normalize?(t=>t.normalize("NFD").replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,"")):(t=>t);class bt{constructor(e,{location:s=m.location,threshold:r=m.threshold,distance:n=m.distance,includeMatches:o=m.includeMatches,findAllMatches:a=m.findAllMatches,minMatchCharLength:l=m.minMatchCharLength,isCaseSensitive:d=m.isCaseSensitive,ignoreDiacritics:u=m.ignoreDiacritics,ignoreLocation:v=m.ignoreLocation}={}){if(this.options={location:s,threshold:r,distance:n,includeMatches:o,findAllMatches:a,minMatchCharLength:l,isCaseSensitive:d,ignoreDiacritics:u,ignoreLocation:v},e=d?e:e.toLowerCase(),e=u?Ge(e):e,this.pattern=e,this.chunks=[],!this.pattern.length)return;const p=(y,D)=>{this.chunks.push({pattern:y,alphabet:zs(y),startIndex:D})},f=this.pattern.length;if(f>je){let y=0;const D=f%je,W=f-D;for(;y<W;)p(this.pattern.substr(y,je),y),y+=je;if(D){const ee=f-je;p(this.pattern.substr(ee),ee)}}else p(this.pattern,0)}searchIn(e){const{isCaseSensitive:s,ignoreDiacritics:r,includeMatches:n}=this.options;if(e=s?e:e.toLowerCase(),e=r?Ge(e):e,this.pattern===e){let W={isMatch:!0,score:0};return n&&(W.indices=[[0,e.length-1]]),W}const{location:o,distance:a,threshold:l,findAllMatches:d,minMatchCharLength:u,ignoreLocation:v}=this.options;let p=[],f=0,y=!1;this.chunks.forEach(({pattern:W,alphabet:ee,startIndex:F})=>{const{isMatch:N,score:J,indices:K}=Ls(e,W,ee,{location:o+F,distance:a,threshold:l,findAllMatches:d,minMatchCharLength:u,includeMatches:n,ignoreLocation:v});N&&(y=!0),f+=J,N&&K&&(p=[...p,...K])});let D={isMatch:y,score:y?f/this.chunks.length:1};return y&&n&&(D.indices=p),D}}class ze{constructor(e){this.pattern=e}static isMultiMatch(e){return ct(e,this.multiRegex)}static isSingleMatch(e){return ct(e,this.singleRegex)}search(){}}function ct(t,e){const s=t.match(e);return s?s[1]:null}class Rs extends ze{constructor(e){super(e)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(e){const s=e===this.pattern;return{isMatch:s,score:s?0:1,indices:[0,this.pattern.length-1]}}}class js extends ze{constructor(e){super(e)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(e){const r=e.indexOf(this.pattern)===-1;return{isMatch:r,score:r?0:1,indices:[0,e.length-1]}}}class Ps extends ze{constructor(e){super(e)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(e){const s=e.startsWith(this.pattern);return{isMatch:s,score:s?0:1,indices:[0,this.pattern.length-1]}}}class Ts extends ze{constructor(e){super(e)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(e){const s=!e.startsWith(this.pattern);return{isMatch:s,score:s?0:1,indices:[0,e.length-1]}}}class Os extends ze{constructor(e){super(e)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(e){const s=e.endsWith(this.pattern);return{isMatch:s,score:s?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}class $s extends ze{constructor(e){super(e)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(e){const s=!e.endsWith(this.pattern);return{isMatch:s,score:s?0:1,indices:[0,e.length-1]}}}class yt extends ze{constructor(e,{location:s=m.location,threshold:r=m.threshold,distance:n=m.distance,includeMatches:o=m.includeMatches,findAllMatches:a=m.findAllMatches,minMatchCharLength:l=m.minMatchCharLength,isCaseSensitive:d=m.isCaseSensitive,ignoreDiacritics:u=m.ignoreDiacritics,ignoreLocation:v=m.ignoreLocation}={}){super(e),this._bitapSearch=new bt(e,{location:s,threshold:r,distance:n,includeMatches:o,findAllMatches:a,minMatchCharLength:l,isCaseSensitive:d,ignoreDiacritics:u,ignoreLocation:v})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(e){return this._bitapSearch.searchIn(e)}}class xt extends ze{constructor(e){super(e)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(e){let s=0,r;const n=[],o=this.pattern.length;for(;(r=e.indexOf(this.pattern,s))>-1;)s=r+o,n.push([r,s-1]);const a=!!n.length;return{isMatch:a,score:a?0:1,indices:n}}}const qe=[Rs,xt,Ps,Ts,$s,Os,js,yt],ut=qe.length,Ws=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,Ns="|";function Hs(t,e={}){return t.split(Ns).map(s=>{let r=s.trim().split(Ws).filter(o=>o&&!!o.trim()),n=[];for(let o=0,a=r.length;o<a;o+=1){const l=r[o];let d=!1,u=-1;for(;!d&&++u<ut;){const v=qe[u];let p=v.isMultiMatch(l);p&&(n.push(new v(p,e)),d=!0)}if(!d)for(u=-1;++u<ut;){const v=qe[u];let p=v.isSingleMatch(l);if(p){n.push(new v(p,e));break}}}return n})}const Vs=new Set([yt.type,xt.type]);class Gs{constructor(e,{isCaseSensitive:s=m.isCaseSensitive,ignoreDiacritics:r=m.ignoreDiacritics,includeMatches:n=m.includeMatches,minMatchCharLength:o=m.minMatchCharLength,ignoreLocation:a=m.ignoreLocation,findAllMatches:l=m.findAllMatches,location:d=m.location,threshold:u=m.threshold,distance:v=m.distance}={}){this.query=null,this.options={isCaseSensitive:s,ignoreDiacritics:r,includeMatches:n,minMatchCharLength:o,findAllMatches:l,ignoreLocation:a,location:d,threshold:u,distance:v},e=s?e:e.toLowerCase(),e=r?Ge(e):e,this.pattern=e,this.query=Hs(this.pattern,this.options)}static condition(e,s){return s.useExtendedSearch}searchIn(e){const s=this.query;if(!s)return{isMatch:!1,score:1};const{includeMatches:r,isCaseSensitive:n,ignoreDiacritics:o}=this.options;e=n?e:e.toLowerCase(),e=o?Ge(e):e;let a=0,l=[],d=0;for(let u=0,v=s.length;u<v;u+=1){const p=s[u];l.length=0,a=0;for(let f=0,y=p.length;f<y;f+=1){const D=p[f],{isMatch:W,indices:ee,score:F}=D.search(e);if(W){if(a+=1,d+=F,r){const N=D.constructor.type;Vs.has(N)?l=[...l,...ee]:l.push(ee)}}else{d=0,a=0,l.length=0;break}}if(a){let f={isMatch:!0,score:d/a};return r&&(f.indices=l),f}}return{isMatch:!1,score:1}}}const Xe=[];function Ys(...t){Xe.push(...t)}function Ze(t,e){for(let s=0,r=Xe.length;s<r;s+=1){let n=Xe[s];if(n.condition(t,e))return new n(t,e)}return new bt(t,e)}const Ye={AND:"$and",OR:"$or"},Je={PATH:"$path",PATTERN:"$val"},et=t=>!!(t[Ye.AND]||t[Ye.OR]),Ks=t=>!!t[Je.PATH],Qs=t=>!Se(t)&&pt(t)&&!et(t),dt=t=>({[Ye.AND]:Object.keys(t).map(e=>({[e]:t[e]}))});function _t(t,e,{auto:s=!0}={}){const r=n=>{let o=Object.keys(n);const a=Ks(n);if(!a&&o.length>1&&!et(n))return r(dt(n));if(Qs(n)){const d=a?n[Je.PATH]:o[0],u=a?n[Je.PATTERN]:n[d];if(!Fe(u))throw new Error(bs(d));const v={keyId:Ue(d),pattern:u};return s&&(v.searcher=Ze(u,e)),v}let l={children:[],operator:o[0]};return o.forEach(d=>{const u=n[d];Se(u)&&u.forEach(v=>{l.children.push(r(v))})}),l};return et(t)||(t=dt(t)),r(t)}function Us(t,{ignoreFieldNorm:e=m.ignoreFieldNorm}){t.forEach(s=>{let r=1;s.matches.forEach(({key:n,norm:o,score:a})=>{const l=n?n.weight:null;r*=Math.pow(a===0&&l?Number.EPSILON:a,(l||1)*(e?1:o))}),s.score=r})}function qs(t,e){const s=t.matches;e.matches=[],Ae(s)&&s.forEach(r=>{if(!Ae(r.indices)||!r.indices.length)return;const{indices:n,value:o}=r;let a={indices:n,value:o};r.key&&(a.key=r.key.src),r.idx>-1&&(a.refIndex=r.idx),e.matches.push(a)})}function Xs(t,e){e.score=t.score}function Zs(t,e,{includeMatches:s=m.includeMatches,includeScore:r=m.includeScore}={}){const n=[];return s&&n.push(qs),r&&n.push(Xs),t.map(o=>{const{idx:a}=o,l={item:e[a],refIndex:a};return n.length&&n.forEach(d=>{d(o,l)}),l})}class Oe{constructor(e,s={},r){this.options={...m,...s},this.options.useExtendedSearch,this._keyStore=new ks(this.options.keys),this.setCollection(e,r)}setCollection(e,s){if(this._docs=e,s&&!(s instanceof rt))throw new Error(ms);this._myIndex=s||mt(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(e){Ae(e)&&(this._docs.push(e),this._myIndex.add(e))}remove(e=()=>!1){const s=[];for(let r=0,n=this._docs.length;r<n;r+=1){const o=this._docs[r];e(o,r)&&(this.removeAt(r),r-=1,n-=1,s.push(o))}return s}removeAt(e){this._docs.splice(e,1),this._myIndex.removeAt(e)}getIndex(){return this._myIndex}search(e,{limit:s=-1}={}){const{includeMatches:r,includeScore:n,shouldSort:o,sortFn:a,ignoreFieldNorm:l}=this.options;let d=Fe(e)?Fe(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return Us(d,{ignoreFieldNorm:l}),o&&d.sort(a),gt(s)&&s>-1&&(d=d.slice(0,s)),Zs(d,this._docs,{includeMatches:r,includeScore:n})}_searchStringList(e){const s=Ze(e,this.options),{records:r}=this._myIndex,n=[];return r.forEach(({v:o,i:a,n:l})=>{if(!Ae(o))return;const{isMatch:d,score:u,indices:v}=s.searchIn(o);d&&n.push({item:o,idx:a,matches:[{score:u,value:o,norm:l,indices:v}]})}),n}_searchLogical(e){const s=_t(e,this.options),r=(l,d,u)=>{if(!l.children){const{keyId:p,searcher:f}=l,y=this._findMatches({key:this._keyStore.get(p),value:this._myIndex.getValueForItemAtKeyId(d,p),searcher:f});return y&&y.length?[{idx:u,item:d,matches:y}]:[]}const v=[];for(let p=0,f=l.children.length;p<f;p+=1){const y=l.children[p],D=r(y,d,u);if(D.length)v.push(...D);else if(l.operator===Ye.AND)return[]}return v},n=this._myIndex.records,o={},a=[];return n.forEach(({$:l,i:d})=>{if(Ae(l)){let u=r(s,l,d);u.length&&(o[d]||(o[d]={idx:d,item:l,matches:[]},a.push(o[d])),u.forEach(({matches:v})=>{o[d].matches.push(...v)}))}}),a}_searchObjectList(e){const s=Ze(e,this.options),{keys:r,records:n}=this._myIndex,o=[];return n.forEach(({$:a,i:l})=>{if(!Ae(a))return;let d=[];r.forEach((u,v)=>{d.push(...this._findMatches({key:u,value:a[v],searcher:s}))}),d.length&&o.push({idx:l,item:a,matches:d})}),o}_findMatches({key:e,value:s,searcher:r}){if(!Ae(s))return[];let n=[];if(Se(s))s.forEach(({v:o,i:a,n:l})=>{if(!Ae(o))return;const{isMatch:d,score:u,indices:v}=r.searchIn(o);d&&n.push({score:u,key:e,value:o,idx:a,norm:l,indices:v})});else{const{v:o,n:a}=s,{isMatch:l,score:d,indices:u}=r.searchIn(o);l&&n.push({score:d,key:e,value:o,norm:a,indices:u})}return n}}Oe.version="7.1.0";Oe.createIndex=mt;Oe.parseIndex=Ss;Oe.config=m;Oe.parseQuery=_t;Ys(Gs);var Js=B('<button class="clear-btn svelte-1dzmlvo" aria-label="Clear search"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></button>'),er=B('<p class="result-count svelte-1dzmlvo"> </p>'),tr=B('<span class="badge svelte-1dzmlvo"> </span>'),sr=B('<div class="category-badges svelte-1dzmlvo"></div>'),rr=B('<a class="article-card svelte-1dzmlvo"><div class="article-thumb svelte-1dzmlvo"><img loading="lazy" class="svelte-1dzmlvo"/></div> <div class="article-body svelte-1dzmlvo"><h3 class="svelte-1dzmlvo"> </h3> <!> <p class="svelte-1dzmlvo"> </p></div></a>'),nr=B('<div class="load-more-wrap svelte-1dzmlvo"><button class="load-more-btn svelte-1dzmlvo"> </button></div>'),or=B('<div class="articles-grid svelte-1dzmlvo"></div> <!>',1),ar=B('<div class="no-results svelte-1dzmlvo"><p>No articles match your search. Try different keywords or <button class="link-btn svelte-1dzmlvo">clear the search</button>.</p></div>'),ir=B('<div class="coming-soon-box svelte-1dzmlvo"><p class="svelte-1dzmlvo">
2Articles coming soon. In the meantime, get in touch to discuss your integration needs.</p> <a href="/contact" class="btn btn-primary">Contact Us</a></div>'),lr=B('<section class="articles-section svelte-1dzmlvo"><div class="container"><div class="articles-header svelte-1dzmlvo"><h2 class="svelte-1dzmlvo">Related Articles</h2> <div class="search-bar svelte-1dzmlvo"><svg class="search-icon svelte-1dzmlvo" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg> <input type="text" placeholder="Search all integrations..." class="svelte-1dzmlvo"/> <!></div></div> <!> <!></div></section>');function Cr(t,e){tt(e,!0);let s=Ot(e,"pageSize",3,12),r=Ee(It(s())),n=Ee(""),o=Ee(""),a;const l={crm:"CRM",payments:"Payments",accounting:"Accounting",automation:"Automation",data:"Data & ETL"},d=new Oe(e.allArticles,{keys:[{name:"headline",weight:2},{name:"description",weight:1}],threshold:.35,includeScore:!0,ignoreLocation:!0});function u(O){const k=O.target.value;G(n,k,!0),clearTimeout(a),a=setTimeout(()=>{G(o,k,!0),G(r,s())},200)}function v(){G(n,""),G(o,""),G(r,s())}let p=$e(()=>i(o).trim().length>0),f=$e(()=>i(p)?d.search(i(o).trim()).map(O=>O.item):[]),y=$e(()=>i(p)?i(f):e.articles),D=$e(()=>i(y).slice(0,i(r))),W=$e(()=>i(y).length-i(r));function ee(){G(r,i(r)+s())}var F=lr(),N=h(F),J=h(N),K=b(h(J),2),me=b(h(K),2);Lt(me),me.__input=u;var Ce=b(me,2);{var te=O=>{var k=Js();k.__click=v,x(O,k)};ke(Ce,O=>{i(n)&&O(te)})}c(K),c(J),We(J,(O,k)=>Ve?.(O,k),()=>({direction:"up"}));var ie=b(J,2);{var de=O=>{var k=er(),le=h(k);c(k),T(()=>V(le,`${i(f).length??""} result${i(f).length!==1?"s":""} across all categories`)),x(O,k)};ke(ie,O=>{i(p)&&O(de)})}var Be=b(ie,2);{var pe=O=>{var k=or(),le=Le(k);we(le,23,()=>i(D),_=>_.slug,(_,S,M)=>{var j=rr(),Q=h(j),re=h(Q);c(Q);var A=b(Q,2),P=h(A),ye=h(P,!0);c(P);var fe=b(P,2);{var Y=$=>{var H=sr();we(H,21,()=>i(S).categories,_e,(xe,he)=>{var oe=tr(),R=h(oe,!0);c(oe),T(()=>V(R,l[i(he)]??i(he))),x(xe,oe)}),c(H),x($,H)};ke(fe,$=>{i(p)&&i(S).categories.length>0&&$(Y)})}var z=b(fe,2),I=h(z,!0);c(z),c(A),c(j),We(j,($,H)=>Ve?.($,H),()=>({direction:"up",delay:Math.min(i(M),11)*60})),T(()=>{se(j,"href",i(S).slug),se(re,"src",i(S).image),se(re,"alt",i(S).imageAlt),V(ye,i(S).headline),V(I,i(S).description)}),x(_,j)}),c(le);var g=b(le,2);{var w=_=>{var S=nr(),M=h(S);M.__click=ee;var j=h(M);c(M),c(S),T(Q=>V(j,`Show ${Q??""} more (${i(W)??""} remaining)`),[()=>Math.min(i(W),s())]),x(_,S)};ke(g,_=>{i(W)>0&&_(w)})}x(O,k)},be=O=>{var k=Qe(),le=Le(k);{var g=_=>{var S=ar(),M=h(S),j=b(h(M));j.__click=v,Pe(),c(M),c(S),x(_,S)},w=_=>{var S=ir();We(S,(M,j)=>Ve?.(M,j),()=>({direction:"up"})),x(_,S)};ke(le,_=>{i(p)?_(g):_(w,!1)},!0)}x(O,k)};ke(Be,O=>{i(y).length>0?O(pe):O(be,!1)})}c(N),c(F),T(()=>zt(me,i(n))),x(t,F),st()}Te(["input","click"]);export{Ar as C,Oe as F,yr as H,Cr as I,We as a,rs as b,ns as c,_r as d,kr as e,xr as f,Ve as s,os as t};
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.