1import{c as m,j as s,r}from"./index-6TajI-n9.js";const b=[["path",{d:"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5",key:"mvr1a0"}]],g=m("heart",b),p=[{value:11,suffix:"+",label:"Years Experience"},{value:19195,suffix:"+",label:"Happy Clients"},{value:4089,suffix:"+",label:"Satisfied Toilets"},{value:201,suffix:"+",label:"Sewer Installs"},{value:1189,suffix:"+",label:"Leaky Faucets Repaired"},{value:20,suffix:"+",label:"Years of Combined Experience"}],v=({target:e,suffix:t})=>{const[f,i]=r.useState(0),c=r.useRef(null),[a,d]=r.useState(!1);return r.useEffect(()=>{const n=new IntersectionObserver(([l])=>{l.isIntersecting&&!a&&d(!0)},{threshold:.3});return c.current&&n.observe(c.current),()=>n.disconnect()},[a]),r.useEffect(()=>{if(!a)return;const n=2e3,l=60,x=e/l;let o=0;const u=setInterval(()=>{o+=x,o>=e?(i(e),clearInterval(u)):i(Math.floor(o))},n/l);return()=>clearInterval(u)},[a,e]),s.jsxs("div",{ref:c,className:"text-4xl md:text-5xl font-heading font-black text-brand-cyan",children:[f.toLocaleString(),t]})},j=({dark:e=!1})=>s.jsx("section",{className:e?"py-16 bg-hero":"py-16 bg-secondary",children:s.jsx("div",{className:"container mx-auto px-4",children:s.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-8",children:p.map(t=>s.jsxs("div",{className:"text-center",children:[s.jsx(v,{target:t.value,suffix:t.suffix}),s.jsx("p",{className:`mt-2 font-semibold ${e?"text-primary-foreground/70":"text-muted-foreground"}`,children:t.label})]},t.label))})})});export{g as H,j as S};
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.