import{c as Oe,a as pe,b as xe,j as e,f as L,u as I,ac as Ue,P as D,Z as fe,Y as ge,ad as be,d as He}from"./vendor-radix-DNxwLykc.js";import{c as Ye,d as ae,R as Ge,u as ye,l as We,a7 as Qe,m as A,q as V,a3 as Xe,n as ce,o as ue,v as Ze,B as H,C as Je,M as et,y as tt,a4 as at,a8 as st,I as Y,L as rt,a9 as nt,s as lt,S as ot,N as it,r as ct,i as ut,F as dt}from"./index-E4maWKVN.js";import{r as h}from"./vendor-react-BsBmf7g_.js";import{L as mt}from"./vendor-router-CYowL1Ry.js";import{L as E}from"./label-BpCQ9mKn.js";import{S as G,a as W,b as Q,c as X,d as Z}from"./select-DoeRsXHR.js";import{T as ht}from"./trash-2-DhvcVeTp.js";import{P as pt}from"./plus-BeLLse9x.js";import{T as xt}from"./triangle-alert-dM4tsUfu.js";import"./vendor-supabase-DZNfQC5M.js";import"./vendor-charts-CaDQ2cwY.js";import"./vendor-data-D4F9-7cQ.js";/** * @license lucide-react v0.462.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. */const ft=Ye("Ruler",[["path",{d:"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z",key:"icamh8"}],["path",{d:"m14.5 12.5 2-2",key:"inckbg"}],["path",{d:"m11.5 9.5 2-2",key:"fmmyf7"}],["path",{d:"m8.5 6.5 2-2",key:"vc6u1g"}],["path",{d:"m17.5 15.5 2-2",key:"wo5hmg"}]]);var ve=["PageUp","PageDown"],je=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],Ne={"from-left":["Home","PageDown","ArrowDown","ArrowLeft"],"from-right":["Home","PageDown","ArrowDown","ArrowRight"],"from-bottom":["Home","PageDown","ArrowDown","ArrowLeft"],"from-top":["Home","PageDown","ArrowUp","ArrowLeft"]},z="Slider",[se,gt,bt]=Oe(z),[we,aa]=pe(z,[bt]),[yt,J]=we(z),Se=h.forwardRef((t,r)=>{const{name:n,min:o=0,max:u=100,step:l=1,orientation:c="horizontal",disabled:a=!1,minStepsBetweenThumbs:m=0,defaultValue:b=[o],value:y,onValueChange:i=()=>{},onValueCommit:f=()=>{},inverted:S=!1,form:C,...j}=t,N=h.useRef(new Set),p=h.useRef(0),v=c==="horizontal"?vt:jt,[w=[],M]=xe({prop:y,defaultProp:b,onChange:d=>{var k;(k=[...N.current][p.current])==null||k.focus(),i(d)}}),K=h.useRef(w);function B(d){const x=kt(w,d);s(d,x)}function te(d){s(d,p.current)}function O(){const d=K.current[p.current];w[p.current]!==d&&f(w)}function s(d,x,{commit:k}={commit:!1}){const P=Rt(l),F=Tt(Math.round((d-o)/l)*l+o,P),R=be(F,[o,u]);M((T=[])=>{const q=St(T,R,x);if(Mt(q,m*l)){p.current=q.indexOf(R);const U=String(q)!==String(T);return U&&k&&f(q),U?q:T}else return T})}return e.jsx(yt,{scope:t.__scopeSlider,name:n,disabled:a,min:o,max:u,valueIndexToChangeRef:p,thumbs:N.current,values:w,orientation:c,form:C,children:e.jsx(se.Provider,{scope:t.__scopeSlider,children:e.jsx(se.Slot,{scope:t.__scopeSlider,children:e.jsx(v,{"aria-disabled":a,"data-disabled":a?"":void 0,...j,ref:r,onPointerDown:L(j.onPointerDown,()=>{a||(K.current=w)}),min:o,max:u,inverted:S,onSlideStart:a?void 0:B,onSlideMove:a?void 0:te,onSlideEnd:a?void 0:O,onHomeKeyDown:()=>!a&&s(o,0,{commit:!0}),onEndKeyDown:()=>!a&&s(u,w.length-1,{commit:!0}),onStepKeyDown:({event:d,direction:x})=>{if(!a){const F=ve.includes(d.key)||d.shiftKey&&je.includes(d.key)?10:1,R=p.current,T=w[R],q=l*F*x;s(T+q,R,{commit:!0})}}})})})})});Se.displayName=z;var[Ce,ke]=we(z,{startEdge:"left",endEdge:"right",size:"width",direction:1}),vt=h.forwardRef((t,r)=>{const{min:n,max:o,dir:u,inverted:l,onSlideStart:c,onSlideMove:a,onSlideEnd:m,onStepKeyDown:b,...y}=t,[i,f]=h.useState(null),S=I(r,v=>f(v)),C=h.useRef(void 0),j=Ue(u),N=j==="ltr",p=N&&!l||!N&&l;function g(v){const w=C.current||i.getBoundingClientRect(),M=[0,w.width],B=le(M,p?[n,o]:[o,n]);return C.current=w,B(v-w.left)}return e.jsx(Ce,{scope:t.__scopeSlider,startEdge:p?"left":"right",endEdge:p?"right":"left",direction:p?1:-1,size:"width",children:e.jsx(Pe,{dir:j,"data-orientation":"horizontal",...y,ref:S,style:{...y.style,"--radix-slider-thumb-transform":"translateX(-50%)"},onSlideStart:v=>{const w=g(v.clientX);c==null||c(w)},onSlideMove:v=>{const w=g(v.clientX);a==null||a(w)},onSlideEnd:()=>{C.current=void 0,m==null||m()},onStepKeyDown:v=>{const M=Ne[p?"from-left":"from-right"].includes(v.key);b==null||b({event:v,direction:M?-1:1})}})})}),jt=h.forwardRef((t,r)=>{const{min:n,max:o,inverted:u,onSlideStart:l,onSlideMove:c,onSlideEnd:a,onStepKeyDown:m,...b}=t,y=h.useRef(null),i=I(r,y),f=h.useRef(void 0),S=!u;function C(j){const N=f.current||y.current.getBoundingClientRect(),p=[0,N.height],v=le(p,S?[o,n]:[n,o]);return f.current=N,v(j-N.top)}return e.jsx(Ce,{scope:t.__scopeSlider,startEdge:S?"bottom":"top",endEdge:S?"top":"bottom",size:"height",direction:S?1:-1,children:e.jsx(Pe,{"data-orientation":"vertical",...b,ref:i,style:{...b.style,"--radix-slider-thumb-transform":"translateY(50%)"},onSlideStart:j=>{const N=C(j.clientY);l==null||l(N)},onSlideMove:j=>{const N=C(j.clientY);c==null||c(N)},onSlideEnd:()=>{f.current=void 0,a==null||a()},onStepKeyDown:j=>{const p=Ne[S?"from-bottom":"from-top"].includes(j.key);m==null||m({event:j,direction:p?-1:1})}})})}),Pe=h.forwardRef((t,r)=>{const{__scopeSlider:n,onSlideStart:o,onSlideMove:u,onSlideEnd:l,onHomeKeyDown:c,onEndKeyDown:a,onStepKeyDown:m,...b}=t,y=J(z,n);return e.jsx(D.span,{...b,ref:r,onKeyDown:L(t.onKeyDown,i=>{i.key==="Home"?(c(i),i.preventDefault()):i.key==="End"?(a(i),i.preventDefault()):ve.concat(je).includes(i.key)&&(m(i),i.preventDefault())}),onPointerDown:L(t.onPointerDown,i=>{const f=i.target;f.setPointerCapture(i.pointerId),i.preventDefault(),y.thumbs.has(f)?f.focus():o(i)}),onPointerMove:L(t.onPointerMove,i=>{i.target.hasPointerCapture(i.pointerId)&&u(i)}),onPointerUp:L(t.onPointerUp,i=>{const f=i.target;f.hasPointerCapture(i.pointerId)&&(f.releasePointerCapture(i.pointerId),l(i))})})}),qe="SliderTrack",Me=h.forwardRef((t,r)=>{const{__scopeSlider:n,...o}=t,u=J(qe,n);return e.jsx(D.span,{"data-disabled":u.disabled?"":void 0,"data-orientation":u.orientation,...o,ref:r})});Me.displayName=qe;var re="SliderRange",Re=h.forwardRef((t,r)=>{const{__scopeSlider:n,...o}=t,u=J(re,n),l=ke(re,n),c=h.useRef(null),a=I(r,c),m=u.values.length,b=u.values.map(f=>Fe(f,u.min,u.max)),y=m>1?Math.min(...b):0,i=100-Math.max(...b);return e.jsx(D.span,{"data-orientation":u.orientation,"data-disabled":u.disabled?"":void 0,...o,ref:a,style:{...t.style,[l.startEdge]:y+"%",[l.endEdge]:i+"%"}})});Re.displayName=re;var ne="SliderThumb",Te=h.forwardRef((t,r)=>{const n=gt(t.__scopeSlider),[o,u]=h.useState(null),l=I(r,a=>u(a)),c=h.useMemo(()=>o?n().findIndex(a=>a.ref.current===o):-1,[n,o]);return e.jsx(Nt,{...t,ref:l,index:c})}),Nt=h.forwardRef((t,r)=>{const{__scopeSlider:n,index:o,name:u,...l}=t,c=J(ne,n),a=ke(ne,n),[m,b]=h.useState(null),y=I(r,g=>b(g)),i=m?c.form||!!m.closest("form"):!0,f=fe(m),S=c.values[o],C=S===void 0?0:Fe(S,c.min,c.max),j=Ct(o,c.values.length),N=f==null?void 0:f[a.size],p=N?Pt(N,C,a.direction):0;return h.useEffect(()=>{if(m)return c.thumbs.add(m),()=>{c.thumbs.delete(m)}},[m,c.thumbs]),e.jsxs("span",{style:{transform:"var(--radix-slider-thumb-transform)",position:"absolute",[a.startEdge]:`calc(${C}% + ${p}px)`},children:[e.jsx(se.ItemSlot,{scope:t.__scopeSlider,children:e.jsx(D.span,{role:"slider","aria-label":t["aria-label"]||j,"aria-valuemin":c.min,"aria-valuenow":S,"aria-valuemax":c.max,"aria-orientation":c.orientation,"data-orientation":c.orientation,"data-disabled":c.disabled?"":void 0,tabIndex:c.disabled?void 0:0,...l,ref:y,style:S===void 0?{display:"none"}:t.style,onFocus:L(t.onFocus,()=>{c.valueIndexToChangeRef.current=o})})}),i&&e.jsx(Ee,{name:u??(c.name?c.name+(c.values.length>1?"[]":""):void 0),form:c.form,value:S},o)]})});Te.displayName=ne;var wt="RadioBubbleInput",Ee=h.forwardRef(({__scopeSlider:t,value:r,...n},o)=>{const u=h.useRef(null),l=I(u,o),c=ge(r);return h.useEffect(()=>{const a=u.current;if(!a)return;const m=window.HTMLInputElement.prototype,y=Object.getOwnPropertyDescriptor(m,"value").set;if(c!==r&&y){const i=new Event("input",{bubbles:!0});y.call(a,r),a.dispatchEvent(i)}},[c,r]),e.jsx(D.input,{style:{display:"none"},...n,ref:l,defaultValue:r})});Ee.displayName=wt;function St(t=[],r,n){const o=[...t];return o[n]=r,o.sort((u,l)=>u-l)}function Fe(t,r,n){const l=100/(n-r)*(t-r);return be(l,[0,100])}function Ct(t,r){return r>2?`Value ${t+1} of ${r}`:r===2?["Minimum","Maximum"][t]:void 0}function kt(t,r){if(t.length===1)return 0;const n=t.map(u=>Math.abs(u-r)),o=Math.min(...n);return n.indexOf(o)}function Pt(t,r,n){const o=t/2,l=le([0,50],[0,o]);return(o-l(r)*n)*n}function qt(t){return t.slice(0,-1).map((r,n)=>t[n+1]-r)}function Mt(t,r){if(r>0){const n=qt(t);return Math.min(...n)>=r}return!0}function le(t,r){return n=>{if(t[0]===t[1]||r[0]===r[1])return r[0];const o=(r[1]-r[0])/(t[1]-t[0]);return r[0]+o*(n-t[0])}}function Rt(t){return(String(t).split(".")[1]||"").length}function Tt(t,r){const n=Math.pow(10,r);return Math.round(t*n)/n}var Le=Se,Et=Me,Ft=Re,Lt=Te;const _e=h.forwardRef(({className:t,...r},n)=>e.jsxs(Le,{ref:n,className:ae("relative flex w-full touch-none select-none items-center px-[10px]",t),...r,children:[e.jsx(Et,{className:"relative h-2 w-full grow overflow-hidden rounded-full bg-secondary",children:e.jsx(Ft,{className:"absolute h-full bg-primary"})}),e.jsx(Lt,{className:"block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"})]}));_e.displayName=Le.displayName;var ee="Checkbox",[_t,sa]=pe(ee),[It,oe]=_t(ee);function Dt(t){const{__scopeCheckbox:r,checked:n,children:o,defaultChecked:u,disabled:l,form:c,name:a,onCheckedChange:m,required:b,value:y="on",internal_do_not_use_render:i}=t,[f,S]=xe({prop:n,defaultProp:u??!1,onChange:m,caller:ee}),[C,j]=h.useState(null),[N,p]=h.useState(null),g=h.useRef(!1),v=C?!!c||!!C.closest("form"):!0,w={checked:f,disabled:l,setChecked:S,control:C,setControl:j,name:a,form:c,value:y,hasConsumerStoppedPropagationRef:g,required:b,defaultChecked:_(u)?!1:u,isFormControl:v,bubbleInput:N,setBubbleInput:p};return e.jsx(It,{scope:r,...w,children:Kt(i)?i(w):o})}var Ie="CheckboxTrigger",De=h.forwardRef(({__scopeCheckbox:t,onKeyDown:r,onClick:n,...o},u)=>{const{control:l,value:c,disabled:a,checked:m,required:b,setControl:y,setChecked:i,hasConsumerStoppedPropagationRef:f,isFormControl:S,bubbleInput:C}=oe(Ie,t),j=I(u,y),N=h.useRef(m);return h.useEffect(()=>{const p=l==null?void 0:l.form;if(p){const g=()=>i(N.current);return p.addEventListener("reset",g),()=>p.removeEventListener("reset",g)}},[l,i]),e.jsx(D.button,{type:"button",role:"checkbox","aria-checked":_(m)?"mixed":m,"aria-required":b,"data-state":$e(m),"data-disabled":a?"":void 0,disabled:a,value:c,...o,ref:j,onKeyDown:L(r,p=>{p.key==="Enter"&&p.preventDefault()}),onClick:L(n,p=>{i(g=>_(g)?!0:!g),C&&S&&(f.current=p.isPropagationStopped(),f.current||p.stopPropagation())})})});De.displayName=Ie;var ie=h.forwardRef((t,r)=>{const{__scopeCheckbox:n,name:o,checked:u,defaultChecked:l,required:c,disabled:a,value:m,onCheckedChange:b,form:y,...i}=t;return e.jsx(Dt,{__scopeCheckbox:n,checked:u,defaultChecked:l,disabled:a,required:c,onCheckedChange:b,name:o,form:y,value:m,internal_do_not_use_render:({isFormControl:f})=>e.jsxs(e.Fragment,{children:[e.jsx(De,{...i,ref:r,__scopeCheckbox:n}),f&&e.jsx(Ve,{__scopeCheckbox:n})]})})});ie.displayName=ee;var Ke="CheckboxIndicator",Be=h.forwardRef((t,r)=>{const{__scopeCheckbox:n,forceMount:o,...u}=t,l=oe(Ke,n);return e.jsx(He,{present:o||_(l.checked)||l.checked===!0,children:e.jsx(D.span,{"data-state":$e(l.checked),"data-disabled":l.disabled?"":void 0,...u,ref:r,style:{pointerEvents:"none",...t.style}})})});Be.displayName=Ke;var Ae="CheckboxBubbleInput",Ve=h.forwardRef(({__scopeCheckbox:t,...r},n)=>{const{control:o,hasConsumerStoppedPropagationRef:u,checked:l,defaultChecked:c,required:a,disabled:m,name:b,value:y,form:i,bubbleInput:f,setBubbleInput:S}=oe(Ae,t),C=I(n,S),j=ge(l),N=fe(o);h.useEffect(()=>{const g=f;if(!g)return;const v=window.HTMLInputElement.prototype,M=Object.getOwnPropertyDescriptor(v,"checked").set,K=!u.current;if(j!==l&&M){const B=new Event("click",{bubbles:K});g.indeterminate=_(l),M.call(g,_(l)?!1:l),g.dispatchEvent(B)}},[f,j,l,u]);const p=h.useRef(_(l)?!1:l);return e.jsx(D.input,{type:"checkbox","aria-hidden":!0,defaultChecked:c??p.current,required:a,disabled:m,name:b,value:y,form:i,...r,tabIndex:-1,ref:C,style:{...r.style,...N,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});Ve.displayName=Ae;function Kt(t){return typeof t=="function"}function _(t){return t==="indeterminate"}function $e(t){return _(t)?"indeterminate":t?"checked":"unchecked"}const ze=h.forwardRef(({className:t,...r},n)=>e.jsx(ie,{ref:n,className:ae("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",t),...r,children:e.jsx(Be,{className:ae("flex items-center justify-center text-current"),children:e.jsx(Ge,{className:"h-4 w-4"})})}));ze.displayName=ie.displayName;const Bt={office:.055,retail:.07,industrial:.04,warehouse:.035,restaurant:.1,medical:.12,school:.05},At={daily:20,"3x-week":12,"2x-week":8,weekly:4,biweekly:2,monthly:1},Vt={windows:100,carpet:150,floor:125,disinfection:85,pressure:200,postConstruction:350},de={toronto:.9,vancouver:.95,mississauga:.85,vaughan:.85,brampton:.82,montreal:.65,other:.85},$=.12,me=5e5,he=()=>({id:crypto.randomUUID(),spaceType:"",squareFootage:5e3});function $t(){const{t}=ye(),{toast:r}=We(),[n,o]=h.useState(!1),u=h.useRef(null),[l,c]=h.useState(!1),[a,m]=h.useState({buildings:[he()],frequency:"",additionalServices:[],name:"",email:"",company:"",city:"",customCity:""}),[b,y]=h.useState("professional"),[i,f]=h.useState("monthly");h.useEffect(()=>{l&&Qe()},[l]);const S=()=>{m(s=>({...s,buildings:[...s.buildings,he()]}))},C=s=>{a.buildings.length<=1||m(d=>({...d,buildings:d.buildings.filter(x=>x.id!==s)}))},j=(s,d,x)=>{m(k=>({...k,buildings:k.buildings.map(P=>P.id===s?{...P,[d]:x}:P)}))},N=a.buildings.every(s=>s.spaceType!==""),p=a.buildings.reduce((s,d)=>s+d.squareFootage,0),g=h.useMemo(()=>{if(!N||!a.frequency||!a.city)return null;const s=At[a.frequency]||1,d=a.city?de[a.city]||de.other:1,x=a.buildings.reduce((T,q)=>{const U=Bt[q.spaceType]||.08;return T+q.squareFootage*U*d},0),k=a.additionalServices.reduce((T,q)=>T+(Vt[q]||0),0)*d*a.buildings.length,P=Math.round(x*.75*s+k*.5),F=Math.round(x*s+k),R=Math.round(x*1.35*s+k*1.25);return{essential:{monthly:P,annual:Math.round(P*12*(1-$)),annualMonthly:Math.round(P*(1-$)),perVisit:Math.round(P/s),visitsPerMonth:s},professional:{monthly:F,annual:Math.round(F*12*(1-$)),annualMonthly:Math.round(F*(1-$)),perVisit:Math.round(F/s),visitsPerMonth:s},premium:{monthly:R,annual:Math.round(R*12*(1-$)),annualMonthly:Math.round(R*(1-$)),perVisit:Math.round(R/s),visitsPerMonth:s}}},[a.buildings,a.frequency,a.additionalServices,a.city,N]),v=g?g[b]:null,w=s=>{m(d=>({...d,additionalServices:d.additionalServices.includes(s)?d.additionalServices.filter(x=>x!==s):[...d.additionalServices,s]}))},M=async s=>{var d;if(s.preventDefault(),!((d=u.current)!=null&&d.value)){if(!a.name||!a.email||!a.company){r({title:t("calculator.error"),description:t("calculator.fillRequired"),variant:"destructive"});return}o(!0);try{const{data:x,error:k}=await lt.functions.invoke("send-contact-email",{body:{type:"quote",name:a.name,email:a.email,company:a.company,city:a.city||a.customCity,buildings:a.buildings.map(P=>({spaceType:P.spaceType,squareFootage:P.squareFootage})),totalSquareFootage:p,frequency:a.frequency,additionalServices:a.additionalServices,tier:b,paymentPeriod:i,estimatedMonthly:v==null?void 0:v.monthly,estimatedAnnual:v==null?void 0:v.annual}});if(k)throw new Error(k.message||"Failed to send quote request");if(!(x!=null&&x.success))throw new Error((x==null?void 0:x.error)||"Failed to send quote request");c(!0),r({title:t("calculator.successTitle"),description:t("calculator.successMessage")})}catch(x){console.error("Error sending quote request:",x),r({title:t("calculator.error"),description:x instanceof Error?x.message:"Failed to send quote request. Please try again.",variant:"destructive"})}finally{o(!1)}}},K=[{value:"office",labelKey:"calculator.spaceType.office"},{value:"retail",labelKey:"calculator.spaceType.retail"},{value:"industrial",labelKey:"calculator.spaceType.industrial"},{value:"warehouse",labelKey:"calculator.spaceType.warehouse"},{value:"restaurant",labelKey:"calculator.spaceType.restaurant"},{value:"medical",labelKey:"calculator.spaceType.medical"},{value:"school",labelKey:"calculator.spaceType.school"}],B=[{value:"daily",labelKey:"calculator.frequency.daily"},{value:"3x-week",labelKey:"calculator.frequency.3xWeek"},{value:"2x-week",labelKey:"calculator.frequency.2xWeek"},{value:"weekly",labelKey:"calculator.frequency.weekly"},{value:"biweekly",labelKey:"calculator.frequency.biweekly"},{value:"monthly",labelKey:"calculator.frequency.monthly"}],te=[{value:"windows",labelKey:"calculator.service.windows"},{value:"carpet",labelKey:"calculator.service.carpet"},{value:"floor",labelKey:"calculator.service.floor"},{value:"disinfection",labelKey:"calculator.service.disinfection"},{value:"pressure",labelKey:"calculator.service.pressure"},{value:"postConstruction",labelKey:"calculator.service.postConstruction"}],O=[{value:"toronto",labelKey:"city.toronto"},{value:"montreal",labelKey:"city.montreal"},{value:"vancouver",labelKey:"city.vancouver"},{value:"mississauga",labelKey:"city.mississauga"},{value:"brampton",labelKey:"city.brampton"},{value:"vaughan",labelKey:"city.vaughan"},{value:"other",labelKey:"city.other"}];return l?e.jsx("section",{className:"section-padding pb-24",children:e.jsx("div",{className:"container-custom max-w-2xl",children:e.jsx(A,{className:"border-accent-blue/20",children:e.jsxs(V,{className:"pt-12 pb-12 text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-accent-blue/10 rounded-full flex items-center justify-center mx-auto mb-6",children:e.jsx(Xe,{className:"w-8 h-8 text-accent-blue"})}),e.jsx("h2",{className:"text-2xl font-light mb-4",children:t("calculator.thankYouTitle")}),e.jsx("p",{className:"text-silver mb-6",children:t("calculator.thankYouMessage")}),v&&e.jsxs("div",{className:"bg-muted/50 rounded-xl p-6 mb-6",children:[e.jsx("p",{className:"text-sm text-silver mb-2",children:t(`calculator.tier.${b}`)}),e.jsxs("p",{className:"text-3xl font-semibold text-accent-blue",children:["$",v.monthly.toLocaleString(),e.jsxs("span",{className:"text-lg font-normal text-silver",children:["/",t("calculator.month")]})]})]}),e.jsx("p",{className:"text-sm text-silver",children:t("calculator.contactSoon")})]})})})}):e.jsx("section",{className:"section-padding pb-24",children:e.jsx("div",{className:"container-custom",children:e.jsxs("div",{className:"grid lg:grid-cols-5 gap-8",children:[e.jsx("div",{className:"lg:col-span-3",children:e.jsxs(A,{children:[e.jsx(ce,{children:e.jsx(ue,{className:"text-xl font-light",children:t("calculator.buildEstimate")})}),e.jsxs(V,{className:"space-y-8",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(Ze,{className:"w-4 h-4 text-accent-blue"}),t("calculator.buildingsLabel")]}),a.buildings.length>1&&e.jsxs("span",{className:"text-sm text-silver",children:[t("calculator.totalSqFt"),": ",p.toLocaleString()," sq ft"]})]}),a.buildings.map((s,d)=>e.jsxs("div",{className:"p-4 rounded-lg border border-border bg-muted/30 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm font-medium",children:[t("calculator.building")," ",d+1]}),a.buildings.length>1&&e.jsx(H,{type:"button",variant:"ghost",size:"sm",onClick:()=>C(s.id),className:"h-8 w-8 p-0 text-destructive hover:text-destructive",children:e.jsx(ht,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{className:"text-sm",children:t("calculator.spaceTypeLabel")}),e.jsxs(G,{value:s.spaceType,onValueChange:x=>j(s.id,"spaceType",x),children:[e.jsx(W,{children:e.jsx(Q,{placeholder:t("calculator.selectSpaceType")})}),e.jsx(X,{children:K.map(x=>e.jsx(Z,{value:x.value,children:t(x.labelKey)},x.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{className:"flex items-center gap-2 text-sm",children:[e.jsx(ft,{className:"w-3 h-3 text-accent-blue"}),t("calculator.squareFootageLabel"),": ",e.jsxs("span",{className:"font-semibold",children:[s.squareFootage.toLocaleString()," sq ft"]})]}),e.jsx(_e,{value:[s.squareFootage],onValueChange:x=>j(s.id,"squareFootage",x[0]),min:500,max:me,step:500,className:"py-4"}),e.jsxs("div",{className:"flex justify-between text-xs text-silver",children:[e.jsx("span",{children:"500 sq ft"}),e.jsxs("span",{children:[me.toLocaleString()," sq ft"]})]})]})]},s.id)),e.jsxs(H,{type:"button",variant:"outline",onClick:S,className:"w-full border-dashed",children:[e.jsx(pt,{className:"w-4 h-4 mr-2"}),t("calculator.addBuilding")]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(Je,{className:"w-4 h-4 text-accent-blue"}),t("calculator.frequencyLabel")]}),e.jsxs(G,{value:a.frequency,onValueChange:s=>m(d=>({...d,frequency:s})),children:[e.jsx(W,{children:e.jsx(Q,{placeholder:t("calculator.selectFrequency")})}),e.jsx(X,{children:B.map(s=>e.jsx(Z,{value:s.value,children:t(s.labelKey)},s.value))})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(et,{className:"w-4 h-4 text-accent-blue"}),t("calculator.cityLabel")]}),e.jsxs(G,{value:a.city,onValueChange:s=>m(d=>({...d,city:s})),children:[e.jsx(W,{children:e.jsx(Q,{placeholder:t("calculator.selectCity")})}),e.jsx(X,{children:O.filter(s=>s.value!=="other").map(s=>e.jsx(Z,{value:s.value,children:t(s.labelKey)},s.value))})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs(E,{className:"flex items-center gap-2",children:[e.jsx(tt,{className:"w-4 h-4 text-accent-blue"}),t("calculator.additionalServicesLabel")]}),e.jsx("div",{className:"grid grid-cols-2 gap-3",children:te.map(s=>e.jsxs("div",{className:`flex items-center gap-3 p-3 rounded-lg border cursor-pointer transition-all ${a.additionalServices.includes(s.value)?"border-accent-blue bg-accent-blue/5":"border-border hover:border-accent-blue/50"}`,onClick:()=>w(s.value),children:[e.jsx(ze,{checked:a.additionalServices.includes(s.value),onCheckedChange:()=>w(s.value)}),e.jsx("span",{className:"text-sm",children:t(s.labelKey)})]},s.value))})]})]})]})}),e.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[e.jsxs("div",{className:"flex rounded-full bg-muted p-1",children:[e.jsx("button",{type:"button",onClick:()=>f("monthly"),className:`flex-1 py-2 px-4 rounded-full text-sm font-medium transition-all ${i==="monthly"?"bg-foreground text-background":"text-silver hover:text-foreground"}`,children:t("calculator.paymentMonthly")}),e.jsxs("button",{type:"button",onClick:()=>f("annual"),className:`flex-1 py-2 px-4 rounded-full text-sm font-medium transition-all ${i==="annual"?"bg-foreground text-background":"text-silver hover:text-foreground"}`,children:[t("calculator.paymentAnnual"),e.jsx("span",{className:"ml-1 text-xs text-accent-blue",children:t("calculator.save12")})]})]}),e.jsx("div",{className:"space-y-4",children:g?e.jsxs(e.Fragment,{children:[e.jsx(A,{className:`cursor-pointer transition-all ${b==="essential"?"border-accent-blue ring-2 ring-accent-blue/20":"border-border hover:border-accent-blue/50"}`,onClick:()=>y("essential"),children:e.jsxs(V,{className:"p-4",children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",children:t("calculator.tier.essential")}),e.jsx("p",{className:"text-xs text-silver",children:t("calculator.tier.essentialDesc")})]}),e.jsx("div",{className:"text-right",children:i==="monthly"?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xl font-semibold text-foreground",children:["$",g.essential.monthly.toLocaleString()]}),e.jsxs("p",{className:"text-xs text-silver",children:["/",t("calculator.month")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xl font-semibold text-foreground",children:["$",g.essential.annual.toLocaleString()]}),e.jsxs("p",{className:"text-xs text-silver",children:["/",t("calculator.year")]}),e.jsxs("p",{className:"text-xs text-accent-blue",children:["($",g.essential.annualMonthly.toLocaleString(),"/",t("calculator.month"),")"]})]})})]}),e.jsxs("ul",{className:"text-xs text-silver space-y-1 mt-3 border-t border-border/50 pt-3",children:[e.jsxs("li",{children:["• ",t("calculator.tier.essentialFeature1")]}),e.jsxs("li",{children:["• ",t("calculator.tier.essentialFeature2")]}),e.jsxs("li",{children:["• ",t("calculator.tier.essentialFeature3")]})]})]})}),e.jsxs(A,{className:`cursor-pointer transition-all relative ${b==="professional"?"border-accent-blue ring-2 ring-accent-blue/20 bg-accent-blue/5":"border-accent-blue/50 hover:border-accent-blue"}`,onClick:()=>y("professional"),children:[e.jsx("div",{className:"absolute -top-3 left-4 px-2 py-0.5 bg-accent-blue text-white text-xs rounded-full",children:t("calculator.tier.recommended")}),e.jsxs(V,{className:"p-4 pt-5",children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",children:t("calculator.tier.professional")}),e.jsx("p",{className:"text-xs text-silver",children:t("calculator.tier.professionalDesc")})]}),e.jsx("div",{className:"text-right",children:i==="monthly"?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xl font-semibold text-accent-blue",children:["$",g.professional.monthly.toLocaleString()]}),e.jsxs("p",{className:"text-xs text-silver",children:["/",t("calculator.month")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xl font-semibold text-accent-blue",children:["$",g.professional.annual.toLocaleString()]}),e.jsxs("p",{className:"text-xs text-silver",children:["/",t("calculator.year")]}),e.jsxs("p",{className:"text-xs text-accent-blue",children:["($",g.professional.annualMonthly.toLocaleString(),"/",t("calculator.month"),")"]})]})})]}),e.jsxs("ul",{className:"text-xs text-silver space-y-1 mt-3 border-t border-border/50 pt-3",children:[e.jsxs("li",{children:["• ",t("calculator.tier.professionalFeature1")]}),e.jsxs("li",{children:["• ",t("calculator.tier.professionalFeature2")]}),e.jsxs("li",{children:["• ",t("calculator.tier.professionalFeature3")]}),e.jsxs("li",{children:["• ",t("calculator.tier.professionalFeature4")]})]})]})]}),e.jsx(A,{className:`cursor-pointer transition-all ${b==="premium"?"border-accent-blue ring-2 ring-accent-blue/20":"border-border hover:border-accent-blue/50"}`,onClick:()=>y("premium"),children:e.jsxs(V,{className:"p-4",children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",children:t("calculator.tier.premium")}),e.jsx("p",{className:"text-xs text-silver",children:t("calculator.tier.premiumDesc")})]}),e.jsx("div",{className:"text-right",children:i==="monthly"?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xl font-semibold text-foreground",children:["$",g.premium.monthly.toLocaleString()]}),e.jsxs("p",{className:"text-xs text-silver",children:["/",t("calculator.month")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-xl font-semibold text-foreground",children:["$",g.premium.annual.toLocaleString()]}),e.jsxs("p",{className:"text-xs text-silver",children:["/",t("calculator.year")]}),e.jsxs("p",{className:"text-xs text-accent-blue",children:["($",g.premium.annualMonthly.toLocaleString(),"/",t("calculator.month"),")"]})]})})]}),e.jsxs("ul",{className:"text-xs text-silver space-y-1 mt-3 border-t border-border/50 pt-3",children:[e.jsxs("li",{children:["• ",t("calculator.tier.premiumFeature1")]}),e.jsxs("li",{children:["• ",t("calculator.tier.premiumFeature2")]}),e.jsxs("li",{children:["• ",t("calculator.tier.premiumFeature3")]}),e.jsxs("li",{children:["• ",t("calculator.tier.premiumFeature4")]}),e.jsxs("li",{children:["• ",t("calculator.tier.premiumFeature5")]})]})]})})]}):e.jsx(A,{className:"border-border",children:e.jsx(V,{className:"p-6",children:e.jsx("div",{className:"text-center py-4 text-silver",children:e.jsx("p",{children:t("calculator.selectOptions")})})})})}),g&&a.city&&e.jsx(mt,{to:`/pricing-guide/${a.city}`,children:e.jsxs(H,{variant:"outline",className:"w-full border-foreground hover:bg-foreground hover:text-background",children:[e.jsx(at,{className:"w-4 h-4 mr-2"}),t("calculator.learnMorePricing")]})}),e.jsxs(A,{children:[e.jsx(ce,{children:e.jsx(ue,{className:"text-xl font-light",children:t("calculator.getAccurateQuote")})}),e.jsx(V,{children:e.jsxs("form",{onSubmit:M,className:"space-y-4",children:[e.jsx(st,{ref:u}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"name",children:[t("calculator.name")," *"]}),e.jsx(Y,{id:"name",value:a.name,onChange:s=>m(d=>({...d,name:s.target.value})),placeholder:t("calculator.namePlaceholder"),maxLength:100})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"email",children:[t("calculator.email")," *"]}),e.jsx(Y,{id:"email",type:"email",value:a.email,onChange:s=>m(d=>({...d,email:s.target.value})),placeholder:t("calculator.emailPlaceholder"),maxLength:255})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(E,{htmlFor:"company",children:[t("calculator.company")," *"]}),e.jsx(Y,{id:"company",value:a.company,onChange:s=>m(d=>({...d,company:s.target.value})),placeholder:t("calculator.companyPlaceholder"),maxLength:100})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(E,{htmlFor:"city",children:t("calculator.city")}),e.jsxs(G,{value:a.city,onValueChange:s=>m(d=>({...d,city:s,customCity:s!=="other"?"":d.customCity})),children:[e.jsx(W,{children:e.jsx(Q,{placeholder:t("calculator.selectCity")})}),e.jsx(X,{children:O.map(s=>e.jsx(Z,{value:s.value,children:t(s.labelKey)},s.value))})]}),a.city==="other"&&e.jsx(Y,{id:"customCity",value:a.customCity,onChange:s=>m(d=>({...d,customCity:s.target.value})),placeholder:t("calculator.customCityPlaceholder"),className:"mt-2",maxLength:100})]}),e.jsx(H,{type:"submit",className:"w-full bg-accent-blue hover:bg-accent-blue/90 text-white rounded-full py-6",disabled:n||!g,children:n?e.jsxs(e.Fragment,{children:[e.jsx(rt,{className:"mr-2 h-4 w-4 animate-spin"}),t("calculator.submitting")]}):e.jsxs(e.Fragment,{children:[e.jsx(nt,{className:"mr-2 h-4 w-4"}),t("calculator.submitEstimate")]})}),e.jsx("p",{className:"text-xs text-center text-silver",children:t("calculator.privacyNote")})]})})]})]})]})})})}function zt(){const{language:t,t:r}=ye(),n=t==="fr";return e.jsxs(e.Fragment,{children:[e.jsx(ot,{title:r("calculator.seoTitle"),description:r("calculator.seoDescription"),path:"/pricing-calculator"}),e.jsx(it,{}),e.jsxs("main",{children:[e.jsx("section",{className:"flex items-center justify-center px-6 pt-32 md:pt-36 pb-6",children:e.jsx("div",{className:"container-custom",children:e.jsxs("div",{className:"flex flex-col items-center text-center max-w-3xl mx-auto",children:[e.jsxs("div",{className:"inline-flex items-center gap-2 mb-6 px-4 py-2 rounded-full bg-accent-blue/10 text-accent-blue text-sm font-medium animate-fade-in",children:[e.jsx(ct,{className:"w-4 h-4"}),r("calculator.badge")]}),e.jsx("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-light tracking-tight mb-6 animate-fade-in",children:r("calculator.title")}),e.jsx("p",{className:"text-lg text-silver max-w-2xl mb-6 animate-fade-in-delay leading-relaxed",children:r("calculator.subtitle")}),e.jsxs("div",{className:"text-left max-w-2xl text-sm text-silver space-y-3 mb-8 animate-fade-in-delay",children:[e.jsx("p",{children:n?"Utilisez notre calculateur gratuit de coûts de nettoyage commercial pour obtenir une estimation instantanée pour votre bureau, entrepôt, commerce de détail, clinique médicale ou espace industriel. Notre outil de tarification tient compte des taux du marché local de votre ville — incluant Toronto, Montréal, Vancouver, Mississauga, Brampton et Vaughan — ainsi que de votre superficie, fréquence de nettoyage et services spécialisés requis.":"Use our free commercial cleaning cost calculator to get an instant price estimate for your office, warehouse, retail store, medical facility, or industrial space. Our pricing tool accounts for your city's local market rates — including Toronto, Montreal, Vancouver, Mississauga, Brampton, and Vaughan — along with your square footage, cleaning frequency, and any specialized services you need."}),e.jsx("p",{children:n?"Choisissez parmi trois niveaux de service — Essentiel, Professionnel et Premium — pour trouver le bon équilibre entre couverture et budget. Ajoutez des services optionnels comme le nettoyage de vitres, le shampouinage de tapis, le décapage de planchers, le lavage haute pression ou le nettoyage post-construction pour voir leur impact sur votre coût mensuel ou annuel. Les contrats annuels incluent un rabais de 12 % automatiquement appliqué à votre estimation.":"Choose between three service tiers — Essential, Professional, and Premium — to find the right balance of coverage and budget. Add optional services like window cleaning, carpet shampooing, floor stripping, pressure washing, or post-construction cleanup to see how they affect your monthly or annual cost. Annual contracts include a 12% discount automatically applied to your estimate."})]}),e.jsx("div",{className:"w-full max-w-2xl bg-amber-500/10 border border-amber-500/30 rounded-xl p-4 animate-fade-in-delay",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(xt,{className:"w-5 h-5 text-amber-500 flex-shrink-0 mt-0.5"}),e.jsxs("div",{className:"text-left",children:[e.jsx("p",{className:"text-sm font-medium text-amber-600 mb-1",children:r("calculator.disclaimerTitle")}),e.jsx("p",{className:"text-sm text-silver",children:r("calculator.disclaimerText")})]})]})})]})})}),e.jsx("section",{className:"container-custom py-12",children:e.jsxs("div",{className:"max-w-lg mx-auto",children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx("h2",{className:"text-2xl md:text-3xl font-light tracking-tight mb-2",children:n?"Quel est votre besoin en nettoyage ?":"What's Your Cleaning Need?"}),e.jsx("p",{className:"text-sm text-muted-foreground max-w-md mx-auto",children:n?"Répondez à 3 questions rapides pour découvrir la fréquence de nettoyage idéale pour votre type d'installation.":"Answer 3 quick questions to discover the ideal cleaning frequency for your facility type."})]}),e.jsx(ut,{})]})}),e.jsx($t,{}),e.jsx("section",{className:"container-custom py-12",children:e.jsxs("div",{className:"max-w-3xl mx-auto space-y-6 text-sm text-silver",children:[e.jsx("h2",{className:"text-2xl font-light tracking-tight text-foreground",children:n?"Comprendre les coûts de nettoyage commercial au Canada":"Understanding Commercial Cleaning Costs in Canada"}),e.jsx("p",{children:n?"Les prix du nettoyage commercial au Canada varient considérablement selon votre emplacement, le type d'installation et vos exigences de service. Dans la région du Grand Toronto, le nettoyage de bureaux coûte généralement entre 0,08 $ et 0,25 $ le pied carré, tandis que les installations industrielles et les entrepôts peuvent coûter entre 0,05 $ et 0,15 $ le pied carré en raison de leurs grandes surfaces ouvertes. Montréal et Vancouver suivent des tendances similaires, avec de légères variations régionales liées au marché du travail et aux réglementations locales.":"Commercial cleaning prices in Canada vary significantly depending on your location, facility type, and service requirements. In the Greater Toronto Area, office cleaning typically ranges from $0.08 to $0.25 per square foot, while industrial facilities and warehouses can cost between $0.05 and $0.15 per square foot due to larger open areas. Montreal and Vancouver follow similar pricing patterns, with slight regional variations based on labour market conditions and local regulations."}),e.jsx("p",{children:n?"Plusieurs facteurs influencent votre coût total de nettoyage : la taille de votre espace, la fréquence de service (quotidien, hebdomadaire ou bimensuel), le type de revêtement de sol et de surfaces, le nombre de toilettes, et si vous avez besoin de services spécialisés comme le lavage de vitres, l'extraction de tapis ou le nettoyage post-construction. Les zones à fort passage comme les halls, les salles de repos et les toilettes communes nécessitent généralement une attention plus fréquente, ce qui influence la tarification globale.":"Several factors influence your total cleaning cost: the size of your space, how often you need service (daily, weekly, or bi-weekly), the type of flooring and surfaces, the number of restrooms, and whether you require specialized services like window washing, carpet extraction, or post-construction cleanup. High-traffic areas such as lobbies, break rooms, and shared restrooms typically require more frequent attention, which impacts overall pricing."}),e.jsx("h3",{className:"text-lg font-medium text-foreground",children:n?"Pourquoi la fréquence de nettoyage est importante":"Why Cleaning Frequency Matters"}),e.jsx("p",{children:n?"Choisir la bonne fréquence de nettoyage est l'une des décisions les plus importantes pour un gestionnaire d'installations. Le nettoyage quotidien est la norme pour les bureaux de plus de 50 employés, les cliniques médicales et les environnements de restauration. Le nettoyage hebdomadaire ou bimensuel convient aux petits bureaux, aux espaces de coworking et aux locaux commerciaux à faible achalandage. Notre calculateur vous permet de comparer les coûts selon toutes les fréquences pour trouver le meilleur équilibre entre budget et standards de propreté.":"Choosing the right cleaning frequency is one of the most important decisions a facility manager can make. Daily cleaning is standard for offices with more than 50 employees, medical clinics, and food-service environments. Weekly or bi-weekly cleaning works well for smaller offices, co-working spaces, and low-traffic commercial units. Our calculator lets you compare costs across all frequencies so you can find the best fit for your budget and cleanliness standards."}),e.jsx("h3",{className:"text-lg font-medium text-foreground",children:n?"Explication des niveaux de service":"Service Tiers Explained"}),e.jsx("p",{children:n?"Notre niveau Essentiel couvre les besoins de base en conciergerie — aspiration, lavage de planchers, essuyage des surfaces, enlèvement des déchets et assainissement des toilettes. Le niveau Professionnel ajoute des tâches périodiques de nettoyage en profondeur comme l'essuyage des plinthes, le dépoussiérage des luminaires et la désinfection des appareils de cuisine. Notre niveau Premium inclut tout du Professionnel plus des services spécialisés comme le décapage et cirage de planchers, le dépoussiérage en hauteur et des protocoles de désinfection détaillés — idéal pour les établissements de santé, les écoles et les environnements de transformation alimentaire.":"Our Essential tier covers core janitorial needs — vacuuming, mopping, surface wiping, trash removal, and restroom sanitation. The Professional tier adds periodic deep-cleaning tasks like baseboard wiping, light fixture dusting, and kitchen appliance sanitization. Our Premium tier includes everything in Professional plus specialty services such as floor stripping and waxing, high-dusting, and detailed disinfection protocols — ideal for healthcare facilities, schools, and food-processing environments."}),e.jsx("h3",{className:"text-lg font-medium text-foreground",children:n?"Obtenez une estimation précise pour votre installation":"Get an Accurate Estimate for Your Facility"}),e.jsx("p",{children:n?"Notre calculateur gratuit de nettoyage commercial est conçu pour les gestionnaires d'installations, les propriétaires et les administrateurs de bureaux à travers le Canada. Entrez simplement votre superficie, sélectionnez votre type de bâtiment, choisissez votre fréquence de nettoyage préférée et choisissez un niveau de service pour recevoir une estimation instantanée des coûts. Le calculateur prend en charge les bureaux, entrepôts, commerces de détail, cliniques médicales, gymnases, restaurants, écoles et installations à usage mixte. La tarification est basée sur les taux actuels du marché à Toronto, Montréal, Vancouver, Mississauga, Brampton, Vaughan, Laval, Burnaby, Surrey et les villes environnantes. Pour un devis détaillé et personnalisé, contactez directement notre équipe — nous offrons des évaluations gratuites sur place pour les espaces de plus de 5 000 pieds carrés.":"Our free commercial cleaning calculator is designed for facility managers, property owners, and office administrators across Canada. Simply enter your square footage, select your building type, choose your preferred cleaning frequency, and pick a service tier to receive an instant cost estimate. The calculator supports offices, warehouses, retail spaces, medical clinics, gyms, restaurants, schools, and mixed-use facilities. Pricing is based on current market rates in Toronto, Montreal, Vancouver, Mississauga, Brampton, Vaughan, Laval, Burnaby, Surrey, and surrounding cities. For a detailed, customized quote, contact our team directly — we offer free on-site assessments for spaces over 5,000 square feet."})]})})]}),e.jsx(dt,{})]})}function ra(){return e.jsx("div",{className:"min-h-screen",children:e.jsx(zt,{})})}export{ra as default};