const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GallerySection-D0ZVa_4n.js","assets/vendor-radix-DNxwLykc.js","assets/vendor-react-BsBmf7g_.js","assets/gallery-cleaning-team-rYJoxxu9.js","assets/vendor-supabase-DZNfQC5M.js","assets/vendor-charts-CaDQ2cwY.js","assets/vendor-data-D4F9-7cQ.js","assets/vendor-router-CYowL1Ry.js","assets/Blog-Bdn-8Jv2.js","assets/useBlogPosts-CY-W8YUX.js","assets/useBlogCategories-BCg1DU9Q.js","assets/badge-QCQuxjG4.js","assets/user-DJoWLxvh.js","assets/BlogPost-Cjbt2wQg.js","assets/MarkdownRenderer-BZrQ9VC_.js","assets/blog-utils-Dc9wQR4q.js","assets/vendor-markdown-BMcpNBDG.js","assets/BlogCostCalculator-6zoDI-zm.js","assets/AdminLogin-Cwvb4PEF.js","assets/label-BpCQ9mKn.js","assets/AdminBlogPosts-CCep-VOU.js","assets/select-DoeRsXHR.js","assets/table-B3wIAXv5.js","assets/plus-BeLLse9x.js","assets/search-CP-sQve6.js","assets/eye-ScZQFwv4.js","assets/trash-2-DhvcVeTp.js","assets/AdminPostForm-DCgOxohm.js","assets/switch-u2sLiItp.js","assets/arrow-left-DwoOL4Ck.js","assets/refresh-cw-DtIAbixb.js","assets/AdminAuthors-C_MmTnof.js","assets/dialog-Dv4ME6gn.js","assets/AdminCategories-D24klFEx.js","assets/Toronto-BhvzM0c4.js","assets/LocationHero-BwxuD5AD.js","assets/LocationBenefits-Dy60Nci4.js","assets/circle-check-big-DAycFGPt.js","assets/leaf-CryU0AUl.js","assets/LocationCTA-D5NZ3vsD.js","assets/NorthYork-DZlOIjAg.js","assets/Scarborough-CV-xCH0u.js","assets/Etobicoke-DNhE6f4m.js","assets/EastYork-BIUC2kpn.js","assets/York-DINfXb6j.js","assets/Vaughan-DeHQXa2b.js","assets/Mississauga-P8J2D7wX.js","assets/Brampton-C5Teec2c.js","assets/Vancouver-C_6mumdF.js","assets/Burnaby-BR1Atozy.js","assets/Richmond-yWLi4T6n.js","assets/Surrey-Bjth-gtC.js","assets/NorthVancouver-DMVRyQye.js","assets/Coquitlam-BwznB3NJ.js","assets/Montreal-fy5ik5BI.js","assets/Laval-QnubYm9a.js","assets/Longueuil-dSphCdVV.js","assets/Brossard-CHK8_jDU.js","assets/Terrebonne-_rT1DmDh.js","assets/NeighborhoodPage-dTgqUIgf.js","assets/IndustrialCleaning-BIjoMdxt.js","assets/ServiceSEO-Lp0kHWJV.js","assets/warehouse-BUfatYYd.js","assets/hard-hat-DNPXzpw2.js","assets/OfficeCleaning-DrbwOnKV.js","assets/CommercialCleaning-BTT-pwu7.js","assets/utensils-crossed-xeqvbGIy.js","assets/EventsCleaning-DJ7LI6mY.js","assets/presentation-CxkPjIFb.js","assets/SpecializedCleaning-DWyq9lNy.js","assets/droplets-B7udy7BO.js","assets/wind-DSUcIylm.js","assets/zap-DXy4E7bE.js","assets/NettoyageCommercial-BSnd0t03.js","assets/FrenchServicePage-Z3wb-c_v.js","assets/cog-D6XIMtnY.js","assets/NettoyageBureaux-CdjnwsG0.js","assets/NettoyageIndustriel-DL854S75.js","assets/NettoyageSpecialise-Q0NFOqJ-.js","assets/NettoyageEvenements-Iv1sg8zJ.js","assets/About-ChbAmW01.js","assets/Contact-2j4Dnqh6.js","assets/ThankYou-EUoTtW-C.js","assets/OfficeCleaningToronto-BJ5Ve8gw.js","assets/CityServicePage-DXmSQTuf.js","assets/CommercialCleaningToronto-DnzWM7MG.js","assets/IndustrialCleaningToronto-BL40tUjG.js","assets/EventCleaningToronto-DwNY6smn.js","assets/SpecializedCleaningToronto-D6N5eKXH.js","assets/OfficeCleaningVancouver-BJGpkENa.js","assets/CommercialCleaningVancouver-DMSZU72n.js","assets/IndustrialCleaningVancouver-DPm_GcFF.js","assets/EventCleaningVancouver-BfmKdfy1.js","assets/SpecializedCleaningVancouver-CnpEFzQR.js","assets/OfficeCleaningMontreal-_MuS6w_Q.js","assets/CommercialCleaningMontreal-_S6zy8Tp.js","assets/IndustrialCleaningMontreal-Bk-siFAt.js","assets/EventCleaningMontreal-CFdOWNIE.js","assets/SpecializedCleaningMontreal-6pjqUVQr.js","assets/OfficeCleaningMississauga-CZixjBhS.js","assets/CommercialCleaningMississauga-BOulHlDV.js","assets/IndustrialCleaningMississauga-DKeXxxAc.js","assets/EventCleaningMississauga-C_begcJr.js","assets/SpecializedCleaningMississauga-DXcF_5mg.js","assets/OfficeCleaningBrampton-W8wnoWdy.js","assets/CommercialCleaningBrampton-D_ObZp-q.js","assets/IndustrialCleaningBrampton-BGrHhOgC.js","assets/EventCleaningBrampton-CmwYymjl.js","assets/SpecializedCleaningBrampton-CJf3htLV.js","assets/OfficeCleaningVaughan-CiJDgMVR.js","assets/CommercialCleaningVaughan-DmY-cxP4.js","assets/IndustrialCleaningVaughan-DttNw9ld.js","assets/EventCleaningVaughan-CiPxZqoh.js","assets/SpecializedCleaningVaughan-BkI7TDkO.js","assets/OfficeCleaningLaval-e8-fFKlt.js","assets/CommercialCleaningLaval-COosOchC.js","assets/IndustrialCleaningLaval-DPa58XEO.js","assets/EventCleaningLaval-Cr_UuaP5.js","assets/SpecializedCleaningLaval-D7npuLIi.js","assets/OfficeCleaningLongueuil-f1Qs7UXK.js","assets/CommercialCleaningLongueuil-YMkGoHDp.js","assets/IndustrialCleaningLongueuil-C1wbL5aU.js","assets/EventCleaningLongueuil-D9Prg0vG.js","assets/SpecializedCleaningLongueuil-i4yrF6Mz.js","assets/OfficeCleaningBrossard-LT6EvQUX.js","assets/CommercialCleaningBrossard-DYk6DrlO.js","assets/IndustrialCleaningBrossard-NaI1XySF.js","assets/EventCleaningBrossard-DjtGY1Uu.js","assets/SpecializedCleaningBrossard-CPOWG-L6.js","assets/OfficeCleaningTerrebonne-DYtTIFdB.js","assets/CommercialCleaningTerrebonne-DeGYNCN2.js","assets/IndustrialCleaningTerrebonne-C4Ozyios.js","assets/EventCleaningTerrebonne-D6qkPPtV.js","assets/SpecializedCleaningTerrebonne-BVpvbptT.js","assets/OfficeCleaningNorthYork-BzhumAI-.js","assets/CommercialCleaningNorthYork-BzNdVZEq.js","assets/IndustrialCleaningNorthYork-Dah6apfZ.js","assets/EventCleaningNorthYork-BEJTG23B.js","assets/SpecializedCleaningNorthYork-DNBNSaZP.js","assets/OfficeCleaningScarborough-CKeXjI50.js","assets/CommercialCleaningScarborough-BvpkTEVU.js","assets/IndustrialCleaningScarborough-BX7fWNff.js","assets/EventCleaningScarborough-Bo9FLaAD.js","assets/SpecializedCleaningScarborough-DcJS3zYK.js","assets/OfficeCleaningEtobicoke-BDDaEIV2.js","assets/CommercialCleaningEtobicoke-CI09AQRg.js","assets/IndustrialCleaningEtobicoke-BoNRmpNK.js","assets/EventCleaningEtobicoke-DmjQe2kN.js","assets/SpecializedCleaningEtobicoke-B1LymGdy.js","assets/OfficeCleaningEastYork-BB8465s1.js","assets/CommercialCleaningEastYork-CXXSFXTh.js","assets/IndustrialCleaningEastYork-BBb3KgE2.js","assets/EventCleaningEastYork-B4UwcNVx.js","assets/SpecializedCleaningEastYork-BwDVwGDI.js","assets/OfficeCleaningYork-CCzdoIvG.js","assets/CommercialCleaningYork-DbcOm1C6.js","assets/IndustrialCleaningYork-CR65jG3v.js","assets/EventCleaningYork-YzUN4bNN.js","assets/SpecializedCleaningYork-B1ntk4SS.js","assets/OfficeCleaningBurnaby-_8dDY8bE.js","assets/CommercialCleaningBurnaby-DRDxBsAH.js","assets/IndustrialCleaningBurnaby-IJ6BzvjI.js","assets/EventCleaningBurnaby-BgWsFx8s.js","assets/SpecializedCleaningBurnaby-Ce9xEvls.js","assets/OfficeCleaningRichmond-D8ViN5LU.js","assets/CommercialCleaningRichmond-Cm4XVaFk.js","assets/IndustrialCleaningRichmond-CpGpoGy7.js","assets/EventCleaningRichmond-DiKjTVEQ.js","assets/SpecializedCleaningRichmond-CcHot0m-.js","assets/OfficeCleaningSurrey-apS6zlWG.js","assets/CommercialCleaningSurrey-C6Y0pF2i.js","assets/IndustrialCleaningSurrey-ClPgKOfa.js","assets/EventCleaningSurrey-DkjY2rt7.js","assets/SpecializedCleaningSurrey-C6qLg5zk.js","assets/OfficeCleaningNorthVancouver-DrPYllTi.js","assets/CommercialCleaningNorthVancouver-BLPfOGgt.js","assets/IndustrialCleaningNorthVancouver-75gjtpGy.js","assets/EventCleaningNorthVancouver-CmzpyTgV.js","assets/SpecializedCleaningNorthVancouver-dp9gEZC7.js","assets/OfficeCleaningCoquitlam-D0fJndpX.js","assets/CommercialCleaningCoquitlam-B6qOt10u.js","assets/IndustrialCleaningCoquitlam-DuH32h_F.js","assets/EventCleaningCoquitlam-BHb1p6VZ.js","assets/SpecializedCleaningCoquitlam-CocR7hSB.js","assets/PricingEducationToronto-BW8F4NA_.js","assets/PricingEducationCTA-BMO7SeOG.js","assets/trending-up-ljnkqF1R.js","assets/triangle-alert-dM4tsUfu.js","assets/heart-CLBgFLEw.js","assets/PricingEducationMontreal-Cv4RU0Jz.js","assets/PricingEducationVancouver-CTc2AUxY.js","assets/PricingEducationVaughan-bR7GITc4.js","assets/PricingEducationBrampton-CyZuGx5V.js","assets/PricingEducationMississauga-BOsjhLSO.js","assets/PricingEducationNorthYork-BJ0O7aHX.js","assets/PricingEducationScarborough-DQrrK--g.js","assets/PricingEducationEtobicoke-DYFNNAAW.js","assets/PricingEducationEastYork-DsCLYi7j.js","assets/PricingEducationYork-2bcJxgwG.js","assets/PricingEducationBurnaby-BtbFf_40.js","assets/PricingEducationRichmond-CDXJKnQA.js","assets/PricingEducationSurrey-D6rZ8Eio.js","assets/PricingEducationNorthVancouver-CrsiocsW.js","assets/PricingEducationCoquitlam-EuNJlSuZ.js","assets/PricingEducationLaval-BWoeZ9zy.js","assets/PricingEducationLongueuil-C_rYDhDP.js","assets/PricingEducationBrossard-B3tW5HUJ.js","assets/PricingEducationTerrebonne-CRVLyksB.js","assets/PricingCalculator-C_t_avfI.js","assets/HowWeOperate-CXjGJ3IQ.js","assets/ServiceStructure-C1lA2Chm.js","assets/EscalationProcess-BKYTPEIz.js","assets/InsuranceRisk-CPxweT49.js","assets/ProofOfProcess-BYjzpmtH.js","assets/square-check-big-5NiCgafK.js","assets/TransitionSupport-8Q41Ya6v.js","assets/ResponsibleCleaning-XSb3UxO-.js","assets/PrivacyPolicy-dMDhqKjm.js","assets/Careers-K417E3ey.js","assets/AdminApplications-iVpnEBUE.js"])))=>i.map(i=>d[i]); var kr=Object.defineProperty;var zr=(t,a,s)=>a in t?kr(t,a,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[a]=s;var pe=(t,a,s)=>zr(t,typeof a!="symbol"?a+"":a,s);import{j as e,c as Pr,a as Ar,u as Oa,B as Lr,P as Le,V as Ia,b as Or,d as Ir,e as ut,f as me,R as Rr,g as Mr,h as Fr,i as Dr,C as Ra,k as Vr,l as Br,T as Wr,S as Hr,O as Ma,m as Fa,n as $r,o as Da,D as Va,p as Gr,q as Yr,r as Qr,s as Ba,t as Wa,v as Ha,w as $a,I as Ga,x as Ya,y as Qa,z as Ka,L as Ua,A as Ja,E as Kr,F as Ur,G as Jr,H as Zr,J as Xr,K as Za,M as Xa,N as en}from"./vendor-radix-DNxwLykc.js";import{b as es,r as n,d as $t,a as y,v as tn}from"./vendor-react-BsBmf7g_.js";import{c as an,_ as d}from"./vendor-supabase-DZNfQC5M.js";import{c as ts}from"./vendor-charts-CaDQ2cwY.js";import{o as sn,s as De,Z as rn,Q as nn,a as on}from"./vendor-data-D4F9-7cQ.js";import{u as Je,a as as,L as w,O as ln,B as cn,R as un,b as c,N as jt}from"./vendor-router-CYowL1Ry.js";(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const f of o.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&r(f)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();var ss,ga=es;ss=ga.createRoot,ga.hydrateRoot;const dn={QC:{en:"Quebec",fr:"Québec"},ON:{en:"Ontario",fr:"Ontario"},BC:{en:"British Columbia",fr:"Colombie-Britannique"},OTHER:{en:"Canada",fr:"Canada"}},rs=n.createContext(void 0),mn=async()=>{var t;try{const s=await(await fetch("https://ipapi.co/json/",{signal:AbortSignal.timeout(3e3)})).json(),r=s.region_code;if(r==="QC")return"QC";if(r==="ON")return"ON";if(r==="BC")return"BC";const i=(t=s.region)==null?void 0:t.toLowerCase();return i!=null&&i.includes("quebec")||i!=null&&i.includes("québec")?"QC":i!=null&&i.includes("ontario")?"ON":i!=null&&i.includes("british columbia")?"BC":"OTHER"}catch{return"OTHER"}},pn=({children:t})=>{const[a,s]=n.useState("OTHER"),[r,i]=n.useState(!0);return n.useEffect(()=>{const o=localStorage.getItem("detected-province");if(o&&["QC","ON","BC","OTHER"].includes(o)){s(o),i(!1);return}mn().then(f=>{s(f),localStorage.setItem("detected-province",f),i(!1)})},[]),e.jsx(rs.Provider,{value:{province:a,provinceName:dn[a],isLoading:r},children:t})},ns=()=>{const t=n.useContext(rs);if(t===void 0)throw new Error("useProvince must be used within a ProvinceProvider");return t};var fn=typeof Element<"u",gn=typeof Map=="function",hn=typeof Set=="function",vn=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function nt(t,a){if(t===a)return!0;if(t&&a&&typeof t=="object"&&typeof a=="object"){if(t.constructor!==a.constructor)return!1;var s,r,i;if(Array.isArray(t)){if(s=t.length,s!=a.length)return!1;for(r=s;r--!==0;)if(!nt(t[r],a[r]))return!1;return!0}var o;if(gn&&t instanceof Map&&a instanceof Map){if(t.size!==a.size)return!1;for(o=t.entries();!(r=o.next()).done;)if(!a.has(r.value[0]))return!1;for(o=t.entries();!(r=o.next()).done;)if(!nt(r.value[1],a.get(r.value[0])))return!1;return!0}if(hn&&t instanceof Set&&a instanceof Set){if(t.size!==a.size)return!1;for(o=t.entries();!(r=o.next()).done;)if(!a.has(r.value[0]))return!1;return!0}if(vn&&ArrayBuffer.isView(t)&&ArrayBuffer.isView(a)){if(s=t.length,s!=a.length)return!1;for(r=s;r--!==0;)if(t[r]!==a[r])return!1;return!0}if(t.constructor===RegExp)return t.source===a.source&&t.flags===a.flags;if(t.valueOf!==Object.prototype.valueOf&&typeof t.valueOf=="function"&&typeof a.valueOf=="function")return t.valueOf()===a.valueOf();if(t.toString!==Object.prototype.toString&&typeof t.toString=="function"&&typeof a.toString=="function")return t.toString()===a.toString();if(i=Object.keys(t),s=i.length,s!==Object.keys(a).length)return!1;for(r=s;r--!==0;)if(!Object.prototype.hasOwnProperty.call(a,i[r]))return!1;if(fn&&t instanceof Element)return!1;for(r=s;r--!==0;)if(!((i[r]==="_owner"||i[r]==="__v"||i[r]==="__o")&&t.$$typeof)&&!nt(t[i[r]],a[i[r]]))return!1;return!0}return t!==t&&a!==a}var yn=function(a,s){try{return nt(a,s)}catch(r){if((r.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw r}};const xn=$t(yn);var bn=function(t,a,s,r,i,o,f,l){if(!t){var p;if(a===void 0)p=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[s,r,i,o,f,l],g=0;p=new Error(a.replace(/%s/g,function(){return u[g++]})),p.name="Invariant Violation"}throw p.framesToPop=1,p}},wn=bn;const ha=$t(wn);var jn=function(a,s,r,i){var o=r?r.call(i,a,s):void 0;if(o!==void 0)return!!o;if(a===s)return!0;if(typeof a!="object"||!a||typeof s!="object"||!s)return!1;var f=Object.keys(a),l=Object.keys(s);if(f.length!==l.length)return!1;for(var p=Object.prototype.hasOwnProperty.bind(s),u=0;u(t.BASE="base",t.BODY="body",t.HEAD="head",t.HTML="html",t.LINK="link",t.META="meta",t.NOSCRIPT="noscript",t.SCRIPT="script",t.STYLE="style",t.TITLE="title",t.FRAGMENT="Symbol(react.fragment)",t))(is||{}),Et={link:{rel:["amphtml","canonical","alternate"]},script:{type:["application/ld+json"]},meta:{charset:"",name:["generator","robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]}},va=Object.values(is),Gt={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},Cn=Object.entries(Gt).reduce((t,[a,s])=>(t[s]=a,t),{}),de="data-rh",ze={DEFAULT_TITLE:"defaultTitle",DEFER:"defer",ENCODE_SPECIAL_CHARACTERS:"encodeSpecialCharacters",ON_CHANGE_CLIENT_STATE:"onChangeClientState",TITLE_TEMPLATE:"titleTemplate",PRIORITIZE_SEO_TAGS:"prioritizeSeoTags"},Pe=(t,a)=>{for(let s=t.length-1;s>=0;s-=1){const r=t[s];if(Object.prototype.hasOwnProperty.call(r,a))return r[a]}return null},Sn=t=>{let a=Pe(t,"title");const s=Pe(t,ze.TITLE_TEMPLATE);if(Array.isArray(a)&&(a=a.join("")),s&&a)return s.replace(/%s/g,()=>a);const r=Pe(t,ze.DEFAULT_TITLE);return a||r||void 0},qn=t=>Pe(t,ze.ON_CHANGE_CLIENT_STATE)||(()=>{}),Ct=(t,a)=>a.filter(s=>typeof s[t]<"u").map(s=>s[t]).reduce((s,r)=>({...s,...r}),{}),Nn=(t,a)=>a.filter(s=>typeof s.base<"u").map(s=>s.base).reverse().reduce((s,r)=>{if(!s.length){const i=Object.keys(r);for(let o=0;oconsole&&typeof console.warn=="function"&&console.warn(t),Ve=(t,a,s)=>{const r={};return s.filter(i=>Array.isArray(i[t])?!0:(typeof i[t]<"u"&&_n(`Helmet: ${t} should be of type "Array". Instead found type "${typeof i[t]}"`),!1)).map(i=>i[t]).reverse().reduce((i,o)=>{const f={};o.filter(p=>{let u;const g=Object.keys(p);for(let b=0;bi.push(p));const l=Object.keys(f);for(let p=0;p{if(Array.isArray(t)&&t.length){for(let s=0;s({baseTag:Nn(["href"],t),bodyAttributes:Ct("bodyAttributes",t),defer:Pe(t,ze.DEFER),encode:Pe(t,ze.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:Ct("htmlAttributes",t),linkTags:Ve("link",["rel","href"],t),metaTags:Ve("meta",["name","charset","http-equiv","property","itemprop"],t),noscriptTags:Ve("noscript",["innerHTML"],t),onChangeClientState:qn(t),scriptTags:Ve("script",["src","innerHTML"],t),styleTags:Ve("style",["cssText"],t),title:Sn(t),titleAttributes:Ct("titleAttributes",t),prioritizeSeoTags:Tn(t,ze.PRIORITIZE_SEO_TAGS)}),os=t=>Array.isArray(t)?t.join(""):t,zn=(t,a)=>{const s=Object.keys(t);for(let r=0;rArray.isArray(t)?t.reduce((s,r)=>(zn(r,a)?s.priority.push(r):s.default.push(r),s),{priority:[],default:[]}):{default:t,priority:[]},ya=(t,a)=>({...t,[a]:void 0}),Pn=["noscript","script","style"],Pt=(t,a=!0)=>a===!1?String(t):String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),ls=t=>Object.keys(t).reduce((a,s)=>{const r=typeof t[s]<"u"?`${s}="${t[s]}"`:`${s}`;return a?`${a} ${r}`:r},""),An=(t,a,s,r)=>{const i=ls(s),o=os(a);return i?`<${t} ${de}="true" ${i}>${Pt(o,r)}`:`<${t} ${de}="true">${Pt(o,r)}`},Ln=(t,a,s=!0)=>a.reduce((r,i)=>{const o=i,f=Object.keys(o).filter(u=>!(u==="innerHTML"||u==="cssText")).reduce((u,g)=>{const x=typeof o[g]>"u"?g:`${g}="${Pt(o[g],s)}"`;return u?`${u} ${x}`:x},""),l=o.innerHTML||o.cssText||"",p=Pn.indexOf(t)===-1;return`${r}<${t} ${de}="true" ${f}${p?"/>":`>${l}`}`},""),cs=(t,a={})=>Object.keys(t).reduce((s,r)=>{const i=Gt[r];return s[i||r]=t[r],s},a),On=(t,a,s)=>{const r={key:a,[de]:!0},i=cs(s,r);return[y.createElement("title",i,a)]},it=(t,a)=>a.map((s,r)=>{const i={key:r,[de]:!0};return Object.keys(s).forEach(o=>{const l=Gt[o]||o;if(l==="innerHTML"||l==="cssText"){const p=s.innerHTML||s.cssText;i.dangerouslySetInnerHTML={__html:p}}else i[l]=s[o]}),y.createElement(t,i)}),ne=(t,a,s=!0)=>{switch(t){case"title":return{toComponent:()=>On(t,a.title,a.titleAttributes),toString:()=>An(t,a.title,a.titleAttributes,s)};case"bodyAttributes":case"htmlAttributes":return{toComponent:()=>cs(a),toString:()=>ls(a)};default:return{toComponent:()=>it(t,a),toString:()=>Ln(t,a,s)}}},In=({metaTags:t,linkTags:a,scriptTags:s,encode:r})=>{const i=St(t,Et.meta),o=St(a,Et.link),f=St(s,Et.script);return{priorityMethods:{toComponent:()=>[...it("meta",i.priority),...it("link",o.priority),...it("script",f.priority)],toString:()=>`${ne("meta",i.priority,r)} ${ne("link",o.priority,r)} ${ne("script",f.priority,r)}`},metaTags:i.default,linkTags:o.default,scriptTags:f.default}},Rn=t=>{const{baseTag:a,bodyAttributes:s,encode:r=!0,htmlAttributes:i,noscriptTags:o,styleTags:f,title:l="",titleAttributes:p,prioritizeSeoTags:u}=t;let{linkTags:g,metaTags:x,scriptTags:b}=t,m={toComponent:()=>{},toString:()=>""};return u&&({priorityMethods:m,linkTags:g,metaTags:x,scriptTags:b}=In(t)),{priority:m,base:ne("base",a,r),bodyAttributes:ne("bodyAttributes",s,r),htmlAttributes:ne("htmlAttributes",i,r),link:ne("link",g,r),meta:ne("meta",x,r),noscript:ne("noscript",o,r),script:ne("script",b,r),style:ne("style",f,r),title:ne("title",{title:l,titleAttributes:p},r)}},At=Rn,at=[],us=!!(typeof window<"u"&&window.document&&window.document.createElement),Lt=class{constructor(t,a){pe(this,"instances",[]);pe(this,"canUseDOM",us);pe(this,"context");pe(this,"value",{setHelmet:t=>{this.context.helmet=t},helmetInstances:{get:()=>this.canUseDOM?at:this.instances,add:t=>{(this.canUseDOM?at:this.instances).push(t)},remove:t=>{const a=(this.canUseDOM?at:this.instances).indexOf(t);(this.canUseDOM?at:this.instances).splice(a,1)}}});this.context=t,this.canUseDOM=a||!1,a||(t.helmet=At({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))}},Mn={},ds=y.createContext(Mn),je,ms=(je=class extends n.Component{constructor(s){super(s);pe(this,"helmetData");this.helmetData=new Lt(this.props.context||{},je.canUseDOM)}render(){return y.createElement(ds.Provider,{value:this.helmetData.value},this.props.children)}},pe(je,"canUseDOM",us),je),_e=(t,a)=>{const s=document.head||document.querySelector("head"),r=s.querySelectorAll(`${t}[${de}]`),i=[].slice.call(r),o=[];let f;return a&&a.length&&a.forEach(l=>{const p=document.createElement(t);for(const u in l)if(Object.prototype.hasOwnProperty.call(l,u))if(u==="innerHTML")p.innerHTML=l.innerHTML;else if(u==="cssText")p.styleSheet?p.styleSheet.cssText=l.cssText:p.appendChild(document.createTextNode(l.cssText));else{const g=u,x=typeof l[g]>"u"?"":l[g];p.setAttribute(u,x)}p.setAttribute(de,"true"),i.some((u,g)=>(f=g,p.isEqualNode(u)))?i.splice(f,1):o.push(p)}),i.forEach(l=>{var p;return(p=l.parentNode)==null?void 0:p.removeChild(l)}),o.forEach(l=>s.appendChild(l)),{oldTags:i,newTags:o}},Ot=(t,a)=>{const s=document.getElementsByTagName(t)[0];if(!s)return;const r=s.getAttribute(de),i=r?r.split(","):[],o=[...i],f=Object.keys(a);for(const l of f){const p=a[l]||"";s.getAttribute(l)!==p&&s.setAttribute(l,p),i.indexOf(l)===-1&&i.push(l);const u=o.indexOf(l);u!==-1&&o.splice(u,1)}for(let l=o.length-1;l>=0;l-=1)s.removeAttribute(o[l]);i.length===o.length?s.removeAttribute(de):s.getAttribute(de)!==f.join(",")&&s.setAttribute(de,f.join(","))},Fn=(t,a)=>{typeof t<"u"&&document.title!==t&&(document.title=os(t)),Ot("title",a)},xa=(t,a)=>{const{baseTag:s,bodyAttributes:r,htmlAttributes:i,linkTags:o,metaTags:f,noscriptTags:l,onChangeClientState:p,scriptTags:u,styleTags:g,title:x,titleAttributes:b}=t;Ot("body",r),Ot("html",i),Fn(x,b);const m={baseTag:_e("base",s),linkTags:_e("link",o),metaTags:_e("meta",f),noscriptTags:_e("noscript",l),scriptTags:_e("script",u),styleTags:_e("style",g)},T={},v={};Object.keys(m).forEach(h=>{const{newTags:k,oldTags:q}=m[h];k.length&&(T[h]=k),q.length&&(v[h]=m[h].oldTags)}),a&&a(),p(t,T,v)},Be=null,Dn=t=>{Be&&cancelAnimationFrame(Be),t.defer?Be=requestAnimationFrame(()=>{xa(t,()=>{Be=null})}):(xa(t),Be=null)},Vn=Dn,ba=class extends n.Component{constructor(){super(...arguments);pe(this,"rendered",!1)}shouldComponentUpdate(a){return!En(a,this.props)}componentDidUpdate(){this.emitChange()}componentWillUnmount(){const{helmetInstances:a}=this.props.context;a.remove(this),this.emitChange()}emitChange(){const{helmetInstances:a,setHelmet:s}=this.props.context;let r=null;const i=kn(a.get().map(o=>{const f={...o.props};return delete f.context,f}));ms.canUseDOM?Vn(i):At&&(r=At(i)),s(r)}init(){if(this.rendered)return;this.rendered=!0;const{helmetInstances:a}=this.props.context;a.add(this),this.emitChange()}render(){return this.init(),null}},zt,Yt=(zt=class extends n.Component{shouldComponentUpdate(t){return!xn(ya(this.props,"helmetData"),ya(t,"helmetData"))}mapNestedChildrenToProps(t,a){if(!a)return null;switch(t.type){case"script":case"noscript":return{innerHTML:a};case"style":return{cssText:a};default:throw new Error(`<${t.type} /> elements are self-closing and can not contain children. Refer to our API for more information.`)}}flattenArrayTypeChildren(t,a,s,r){return{...a,[t.type]:[...a[t.type]||[],{...s,...this.mapNestedChildrenToProps(t,r)}]}}mapObjectTypeChildren(t,a,s,r){switch(t.type){case"title":return{...a,[t.type]:r,titleAttributes:{...s}};case"body":return{...a,bodyAttributes:{...s}};case"html":return{...a,htmlAttributes:{...s}};default:return{...a,[t.type]:{...s}}}}mapArrayTypeChildrenToProps(t,a){let s={...a};return Object.keys(t).forEach(r=>{s={...s,[r]:t[r]}}),s}warnOnInvalidChildren(t,a){return ha(va.some(s=>t.type===s),typeof t.type=="function"?"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.":`Only elements types ${va.join(", ")} are allowed. Helmet does not support rendering <${t.type}> elements. Refer to our API for more information.`),ha(!a||typeof a=="string"||Array.isArray(a)&&!a.some(s=>typeof s!="string"),`Helmet expects a string as a child of <${t.type}>. Did you forget to wrap your children in braces? ( <${t.type}>{\`\`} ) Refer to our API for more information.`),!0}mapChildrenToProps(t,a){let s={};return y.Children.forEach(t,r=>{if(!r||!r.props)return;const{children:i,...o}=r.props,f=Object.keys(o).reduce((p,u)=>(p[Cn[u]||u]=o[u],p),{});let{type:l}=r;switch(typeof l=="symbol"?l=l.toString():this.warnOnInvalidChildren(r,i),l){case"Symbol(react.fragment)":a=this.mapChildrenToProps(i,a);break;case"link":case"meta":case"noscript":case"script":case"style":s=this.flattenArrayTypeChildren(r,s,f,i);break;default:a=this.mapObjectTypeChildren(r,a,f,i);break}}),this.mapArrayTypeChildrenToProps(s,a)}render(){const{children:t,...a}=this.props;let s={...a},{helmetData:r}=a;if(t&&(s=this.mapChildrenToProps(t,s)),r&&!(r instanceof Lt)){const i=r;r=new Lt(i.context,!0),delete s.helmetData}return r?y.createElement(ba,{...s,context:r.value}):y.createElement(ds.Consumer,null,i=>y.createElement(ba,{...s,context:i}))}},pe(zt,"defaultProps",{defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1}),zt);const Bn=()=>{const a=new URLSearchParams(window.location.search).get("lang");return a==="fr"||a==="en"?a:null},Wn=()=>{const t=navigator.languages||[navigator.language];for(const a of t){const s=a.toLowerCase();if(s.startsWith("fr"))return"fr";if(s.startsWith("en"))return"en"}return null},Hn=async()=>{const t=Bn();if(t)return t;const a=localStorage.getItem("preferred-language");if(a==="fr"||a==="en")return a;const s=Wn();if(s)return s;try{const i=await(await fetch("https://ipapi.co/json/",{signal:AbortSignal.timeout(3e3)})).json();return i.region_code==="QC"||i.region==="Quebec"?"fr":"en"}catch{return"en"}},$n={fr:{"nav.home":"Accueil","nav.services":"Services","nav.about":"À propos","nav.contact":"Contact","hero.headline":"Nettoyage commercial & industriel simplifié.","hero.subheadline":"Simple Service — Entreprise canadienne spécialisée en nettoyage commercial et industriel pour bureaux, usines, entrepôts et commerces.","hero.cta":"Demandez une soumission gratuite","hero.pricingCalculator":"Calculateur de prix","trust.official":"La confiance de clients d'envergure","trust.subtitle":"Des clients d'envergure nous font confiance pour la qualité, la constance et la discrétion.","trust.years":"Années d'expérience","trust.clients":"Clients satisfaits","trust.satisfaction":"Note moyenne Google","services.title":"Nos Services","services.offices":"Bureaux","services.offices.desc":"Le nettoyage de bureaux inclut le dépoussiérage quotidien, l'aspiration, la désinfection, l'entretien des cuisines et sanitaires, et le soin des planchers — avec soumission personnalisée selon la taille et l'horaire.","services.commercial":"Commerces","services.commercial.desc":"Le nettoyage commercial couvre la désinfection de vitrines, le dépoussiérage des espaces d'étalage, les protocoles sanitaires et l'entretien des sols pour commerces de détail, restaurants et espaces publics.","services.industrial":"Industriel","services.industrial.desc":"Le nettoyage industriel inclut le dégraissage de planchers d'usine, le balayage d'entrepôts, le lavage haute pression et le nettoyage conforme CNESST (régulateur santé-sécurité du Québec) / OHSA (Loi sur la santé et la sécurité au travail de l'Ontario) pour installations de fabrication et distribution.","services.events":"Événements","services.events.desc":"Le nettoyage événementiel offre la désinfection pré-événement, le nettoyage en profondeur post-événement et un service le jour même pour conférences, galas, salons et fonctions corporatives.","services.specialized":"Entretien Spécialisé","services.specialized.desc":"L'entretien spécialisé offre l'extraction de tapis en profondeur, le dépoussiérage en hauteur, le lavage de vitres, le nettoyage post-construction et la désinfection de grade hospitalier.","about.title":"Nettoyage commercial & industriel, simplifié.","about.text":"Nous avons simplifié le nettoyage commercial et industriel au Canada. Notre système de gestion numérique — listes de vérification, photos horodatées et rapports détaillés après chaque visite — garantit un service fiable, transparent et sans tracas avec une qualité constante.","contact.title":"Obtenez votre estimation gratuite","contact.name":"Nom","contact.company":"Entreprise","contact.phone":"Téléphone","contact.email":"Courriel","contact.message":"Message","contact.submit":"Envoyer","contact.success":"Message envoyé avec succès! Nous vous contacterons bientôt.","faq.title":"Questions Fréquentes","faq.q1":"À quelle fréquence recommandez-vous le nettoyage commercial?","faq.a1":"Cela dépend de votre type d'entreprise et de l'achalandage. La plupart des bureaux optent pour un nettoyage quotidien ou hebdomadaire, tandis que les commerces de détail préfèrent souvent un service quotidien.","faq.q2":"Utilisez-vous des produits écologiques?","faq.a2":"Oui, nous offrons des options de nettoyage écologiques avec des produits certifiés conformes aux directives de Santé Canada en matière de nettoyage et désinfection. Nous pouvons adapter nos méthodes selon vos préférences.","faq.q3":"Êtes-vous assurés et cautionnés?","faq.a3":"Absolument. Nous détenons une couverture de responsabilité de 5M$ et respectons pleinement les programmes provinciaux de sécurité au travail, incluant la CNESST (Commission des normes, de l'équité, de la santé et de la sécurité du travail — Québec), la WSIB (Workplace Safety and Insurance Board — Ontario) et WorkSafeBC (Colombie-Britannique).","faq.q4":"Puis-je personnaliser mon plan de nettoyage?","faq.a4":"Certainement! Nous créons des plans de nettoyage sur mesure adaptés à vos besoins spécifiques, votre budget et votre horaire.","faq.q5":"Comment obtenez-vous une soumission?","faq.a5":"Contactez-nous via le formulaire ci-dessus, par téléphone ou courriel. Nous planifierons une évaluation gratuite de vos locaux pour vous fournir une soumission détaillée.","faq.q6":"Offrez-vous des services d'urgence?","faq.a6":"Oui, nous offrons des services de nettoyage d'urgence pour les situations imprévues comme les dégâts, les préparations d'événements de dernière minute, etc.","faq.q7":"Comment assurez-vous la qualité de chaque visite?","faq.a7":"Chaque visite est documentée avec des listes de vérification numériques et des photos horodatées. Votre gestionnaire de compte effectue des inspections régulières et vous recevez des rapports de service détaillés.","faq.q8":"Quel est votre processus de transition si je change de fournisseur?","faq.a8":"Nous offrons un programme d'intégration structuré de 5 semaines : évaluation du site, planification détaillée, formation de l'équipe attitrée, période de rodage supervisée, puis passage au service régulier — sans interruption pour vos opérations.","faq.q9":"Quelle couverture d'assurance détenez-vous?","faq.a9":"Nous détenons une assurance responsabilité civile de 5M$, un cautionnement de fidélité (assurance contre le vol et les dommages par les employés) et une conformité complète aux programmes provinciaux : CNESST (Québec), WSIB (Ontario) et WorkSafeBC (C.-B.).","faq.q10":"Quelle est la meilleure fréquence de nettoyage pour un bureau à Laval ou Montréal?","faq.a10":"Pour la plupart des bureaux à Montréal et Laval, nous recommandons un nettoyage quotidien des zones à fort achalandage (halls, cuisines, sanitaires) et un nettoyage en profondeur hebdomadaire des postes de travail et salles de réunion. Les bureaux de 50+ employés bénéficient d'un service 5 jours par semaine.","faq.q11":"Comment la conformité CNESST affecte-t-elle le nettoyage commercial au Québec?","faq.a11":"La CNESST exige que toutes les entreprises de nettoyage au Québec maintiennent des normes de sécurité au travail, une formation SIMDUT pour les produits chimiques et une assurance appropriée. Nos protocoles s'alignent également sur la norme ISO 45001 en santé et sécurité au travail. Simple Service est pleinement conforme à la CNESST avec des équipes certifiées et des produits approuvés.","faq.q12":"Combien coûte le nettoyage commercial au pied carré au Canada?","faq.a12":"Le nettoyage commercial au Canada varie généralement de 0,08 $ à 0,25 $ le pied carré selon la fréquence, le type d'installation et l'emplacement. Bureaux : 0,08–0,15 $/pi², commerces : 0,10–0,18 $/pi², industriel : 0,12–0,25 $/pi².","faq.q13":"Desservez-vous les entreprises à Toronto, Vancouver et Montréal?","faq.a13":"Oui, Simple Service opère dans trois grandes régions métropolitaines canadiennes : Grand Montréal (Montréal, Laval, Longueuil, Brossard, Terrebonne), GTA (Toronto, Mississauga, Brampton, Vaughan, North York, Scarborough, Etobicoke) et Grand Vancouver (Vancouver, Burnaby, Surrey, Richmond, North Vancouver, Coquitlam).","faq.q14":"Que se passe-t-il si je ne suis pas satisfait d'une visite de nettoyage?","faq.a14":"Nous garantissons la satisfaction à chaque visite. Si un secteur ne répond pas à vos attentes, contactez votre gestionnaire de compte dédié et nous enverrons une équipe dans les 24 heures sans frais supplémentaires. Notre système de listes de vérification numériques avec photos horodatées assure la responsabilisation.","faq.q15":"Comment vérifiez-vous que chaque visite est complétée?","faq.a15":"Chaque quart est documenté par photo — nos équipes prennent des images horodatées avant et après des zones clés, vérifiées par un superviseur. Vous recevez des rapports réguliers confirmant que le travail a été effectué.","faq.q16":"Comment documentez-vous chaque visite de service?","faq.a16":"Nos techniciens suivent des listes de vérification numériques avec horodatage et signature électronique. Les photos avant/après sont archivées et des rapports détaillés vous sont envoyés régulièrement.","faq.q17":"Que couvre exactement votre assurance de 5M$?","faq.a17":"Notre police d'assurance responsabilité civile de 5M$ couvre les dommages matériels, les blessures corporelles à des tiers et les erreurs professionnelles. Nous détenons aussi un cautionnement de fidélité couvrant le vol ou dommage par un employé, plus une assurance parapluie de 10M$.","faq.q18":"Comment garantissez-vous la résolution des problèmes en moins de 24 heures?","faq.a18":"Notre processus d'escalade à 4 niveaux assure qu'aucun problème ne reste sans suite : votre superviseur de site est alerté immédiatement, puis votre gestionnaire de compte intervient dans les 4 heures si nécessaire. En dernier recours, la direction est impliquée pour garantir une résolution dans les 24 heures.","faq.q19":"Comment accéder à nos rapports de service?","faq.a19":"Vos rapports de service incluent les photos avant/après, métriques de performance et historique des communications. Ils sont envoyés par courriel selon la fréquence de votre choix (quotidien, hebdomadaire ou mensuel).","benefits.title":"Notre Garantie","benefits.subtitle":"Six engagements concrets qui protègent votre investissement","benefits.consistency.title":"Assurance Qualité","benefits.consistency.desc":"Inspections régulières et listes de vérification standardisées pour des résultats constants, visite après visite.","benefits.flexible.title":"Horaires Sur Mesure","benefits.flexible.desc":"Nettoyage de jour, de soir ou de nuit — planifié autour de vos opérations, jamais l'inverse.","benefits.insured.title":"Couverture Complète","benefits.insured.desc":"Responsabilité civile de 5M$, cautionnement des employés (assurés contre le vol ou les dommages) et conformité CNESST (Québec) / WSIB (Ontario) pour une protection totale.","benefits.trained.title":"Équipes Certifiées","benefits.trained.desc":"Vérification des antécédents, formation SIMDUT (Système d'information sur les matières dangereuses utilisées au travail) et perfectionnement continu pour chaque membre du personnel.","benefits.eco.title":"Nettoyage Responsable","benefits.eco.desc":"Produits certifiés EcoLogo et pratiques durables qui protègent la santé de vos occupants.","benefits.support.title":"Accompagnement Local","benefits.support.desc":"Un gestionnaire de compte dédié dans votre région, joignable directement pour toute demande.","certifications.title":"Certifications & Affiliations","certifications.subtitle":"Reconnus par les plus grandes associations de l'industrie du nettoyage","certifications.issa":"Association Internationale de l'Industrie du Nettoyage","certifications.bscai":"Association des Entrepreneurs en Entretien des Bâtiments","certifications.cnesst":"Commission des Normes, de l'Équité, de la Santé et de la Sécurité du Travail","certifications.cpeep":"Comité Paritaire de l'Entretien d'Édifices Publics","testimonials.title":"Ce que disent nos clients","testimonials.subtitle":"Des retours authentiques de clients satisfaits","testimonials.client1.name":"Marie Dubois","testimonials.client1.company":"Directrice, Tech Solutions Inc.","testimonials.client1.text":"Service fiable depuis 3 ans. L'équipe est professionnelle, ponctuelle et nos bureaux n'ont jamais été aussi propres.","testimonials.client2.name":"Jean Tremblay","testimonials.client2.company":"Propriétaire, Boutique Élégance","testimonials.client2.text":"Simple Service a transformé l'entretien de notre commerce. Leur système numérique — listes de vérification, photos et rapports — nous garde toujours informés.","testimonials.client3.name":"Sophie Martin","testimonials.client3.company":"Gestionnaire d'Événements","testimonials.client3.text":"Ils ont sauvé notre gala! Service d'urgence rapide et efficace. Je les recommande sans hésitation.","caseStudies.title":"Études de Cas","caseStudies.subtitle":"Résultats concrets pour nos clients","caseStudies.problemLabel":"Problème","caseStudies.solutionLabel":"Solution","caseStudies.challengeLabel":"Défi","caseStudies.resultLabel":"Résultat","caseStudies.improvement":"Amélioration","caseStudies.case1.title":"Tour de Bureaux - Centre-Ville","caseStudies.case1.challenge":"Immeuble de 15 étages nécessitant un nettoyage quotidien avec des standards élevés","caseStudies.case1.result":"Système numérique (listes de vérification, photos, rapports) assurant la qualité constante et réduction des plaintes","caseStudies.case1.metricLabel":"satisfaction des occupants","caseStudies.case2.title":"Centre Commercial","caseStudies.case2.challenge":"Coordination de nettoyage pour 50+ boutiques avec horaires variables","caseStudies.case2.result":"Planification optimisée et satisfaction client maximale","caseStudies.case2.metricLabel":"efficacité de planification","caseStudies.case3.title":"Campus Corporatif","caseStudies.case3.challenge":"Transition vers des produits écologiques sans compromettre la qualité","caseStudies.case3.result":"Certification verte obtenue avec réduction des coûts d'approvisionnement","caseStudies.case3.metricLabel":"réduction des coûts","gallery.badge":"L'une des entreprises de nettoyage les mieux notées au Canada","gallery.title":"Notre Travail en Action","gallery.subtitle":"Découvrez notre expertise à travers nos réalisations","footer.tagline":"Simple. Propre. Professionnel.","footer.location":"Montréal, Québec","footer.rights":"Tous droits réservés.","service.getQuote":"Demandez une soumission gratuite","service.call":"Appelez","service.faqTitle":"Questions Fréquentes","service.faqSubtitle":"Questions courantes sur nos services de","service.ctaTitle":"Prêt pour un nettoyage professionnel","service.ctaSubtitle":"Obtenez une soumission gratuite et sans engagement. Nous personnaliserons un plan de nettoyage adapté à votre entreprise et votre budget.","service.ctaButton":"Obtenez votre soumission gratuite","service.responseGuarantee":"Réponse le jour même garantie","service.professional":"Services professionnels","service.starsOnGoogle":"étoiles sur Google","service.trustedCanada":"Confiance à travers le Canada","industrial.title":"Nettoyage","industrial.highlight":"Industriel","industrial.subtitle":"Gardez votre usine, entrepôt ou installation de fabrication en ordre avec nos services de nettoyage industriel spécialisés. Conformes aux normes de sécurité, efficaces et adaptés à vos opérations.","industrial.featuresTitle":"Solutions de Nettoyage Industriel","industrial.featuresSubtitle":"Services de nettoyage complets conçus pour les exigences uniques des environnements industriels.","industrial.feature1.title":"Nettoyage d'Usines","industrial.feature1.desc":"Solutions de nettoyage complètes pour installations de fabrication, planchers de production et zones d'assemblage.","industrial.feature2.title":"Nettoyage d'Entrepôts","industrial.feature2.desc":"Nettoyage à grande échelle pour entrepôts, centres de distribution et installations logistiques.","industrial.feature3.title":"Zones d'Équipement Lourd","industrial.feature3.desc":"Nettoyage spécialisé autour des machines lourdes et équipements industriels avec protocoles de sécurité.","industrial.feature4.title":"Nettoyage d'Ateliers","industrial.feature4.desc":"Dégraissage, récurage de sols et nettoyage d'entretien pour ateliers de machines et workshops.","industrial.feature5.title":"Conformité Sécurité","industrial.feature5.desc":"Services de nettoyage conformes aux normes OSHA et aux exigences de sécurité spécifiques à l'industrie.","industrial.feature6.title":"Nettoyage Haute Pression","industrial.feature6.desc":"Lavage sous pression de qualité industrielle pour sols, murs et surfaces extérieures.","industrial.faq1.q":"Quels types d'installations industrielles nettoyez-vous?","industrial.faq1.a":"Nous nettoyons tous types d'installations industrielles incluant usines, entrepôts, centres de distribution, usines de fabrication, ateliers de machines, installations de transformation alimentaire, et plus.","industrial.faq2.q":"Offrez-vous des services de nettoyage industriel 24/7?","industrial.faq2.a":"Oui, nous offrons des horaires flexibles incluant les quarts de nuit et de fin de semaine pour minimiser les perturbations de vos opérations. Nous pouvons travailler autour de vos horaires de production.","industrial.faq3.q":"Vos méthodes sont-elles sécuritaires pour les installations de transformation alimentaire?","industrial.faq3.a":"Absolument. Nous utilisons des produits de nettoyage alimentaires, conformes à l'ACIA et suivons des protocoles stricts pour les installations de transformation alimentaire et pharmaceutiques.","industrial.faq4.q":"Pouvez-vous gérer le nettoyage de matières dangereuses?","industrial.faq4.a":"Nous offrons un nettoyage spécialisé pour les installations avec matières dangereuses, en suivant tous les protocoles et réglementations de sécurité. Notre équipe est formée aux procédures de manipulation appropriées.","industrial.faq5.q":"Quel équipement de nettoyage industriel utilisez-vous?","industrial.faq5.a":"Nous utilisons des équipements de qualité industrielle incluant auto-laveuses, nettoyeurs haute pression, aspirateurs industriels et équipements de dégraissage spécialisés.","office.title":"Nettoyage","office.highlight":"de Bureaux","office.subtitle":"Créez un milieu de travail plus sain et plus productif avec nos services complets de nettoyage de bureaux. De l'entretien quotidien au nettoyage en profondeur, nous maintenons votre bureau propre et professionnel.","office.featuresTitle":"Solutions de Nettoyage de Bureaux","office.featuresSubtitle":"Services de nettoyage adaptés pour garder votre espace de travail propre, sain et professionnel.","office.feature1.title":"Nettoyage Quotidien","office.feature1.desc":"Nettoyage quotidien complet incluant dépoussiérage, aspiration et désinfection pour maintenir un espace propre et sain.","office.feature2.title":"Nettoyage de Postes","office.feature2.desc":"Nettoyage minutieux des bureaux, écrans, claviers et espaces de travail personnels avec attention aux détails.","office.feature3.title":"Salle de Repos & Cuisine","office.feature3.desc":"Nettoyage en profondeur des cuisines, salles de repos et aires communes incluant le nettoyage des appareils.","office.feature4.title":"Gestion des Déchets","office.feature4.desc":"Services efficaces d'enlèvement des ordures et de recyclage pour garder votre bureau propre et durable.","office.feature5.title":"Assainissement Sanitaires","office.feature5.desc":"Nettoyage professionnel et désinfection des toilettes avec désinfectants de qualité hospitalière.","office.feature6.title":"Entretien des Sols","office.feature6.desc":"Nettoyage de tapis, entretien des planchers durs et traitements spécialisés pour une brillance durable.","office.faq1.q":"À quelle fréquence les bureaux doivent-ils être nettoyés professionnellement?","office.faq1.a":"La plupart des bureaux bénéficient d'un nettoyage quotidien pour les zones à fort passage et d'un nettoyage en profondeur hebdomadaire. Nous personnalisons les horaires selon la taille de votre bureau, l'achalandage et les besoins spécifiques.","office.faq2.q":"Nettoyez-vous pendant ou après les heures de bureau?","office.faq2.a":"Nous offrons des horaires flexibles incluant le nettoyage tôt le matin, en soirée et le week-end pour minimiser les perturbations de votre équipe. La plupart des clients préfèrent le service après les heures.","office.faq3.q":"Quels produits de nettoyage utilisez-vous dans les bureaux?","office.faq3.a":"Nous utilisons des produits écologiques, à faible COV, sûrs pour les environnements de bureau. Nous pouvons accommoder les allergies et sensibilités avec des options hypoallergéniques.","office.faq4.q":"Pouvez-vous gérer des immeubles de bureaux à plusieurs étages?","office.faq4.a":"Absolument. Nous desservons des bureaux individuels jusqu'aux tours de bureaux entières. Nos équipes sont équipées pour gérer efficacement toute taille d'installation.","office.faq5.q":"Fournissez-vous les produits de nettoyage ou devons-nous les fournir?","office.faq5.a":"Nous apportons tous les produits, équipements et fournitures de nettoyage nécessaires. Tout est inclus dans nos forfaits de service.","commercial.title":"Nettoyage","commercial.highlight":"Commercial","commercial.subtitle":"Des commerces de détail aux établissements de santé, nous offrons des services complets de nettoyage commercial qui gardent votre entreprise à son meilleur et fidélisent vos clients.","commercial.featuresTitle":"Solutions de Nettoyage Commercial","commercial.featuresSubtitle":"Services de nettoyage spécifiques à l'industrie adaptés aux besoins de votre entreprise.","commercial.feature1.title":"Nettoyage de Commerces","commercial.feature1.desc":"Gardez votre espace commercial accueillant avec nettoyage quotidien, entretien des sols et nettoyage de vitrines.","commercial.feature2.title":"Nettoyage de Restaurants","commercial.feature2.desc":"Nettoyage en profondeur de cuisines, désinfection de salles à manger et nettoyage conforme aux codes de santé pour la restauration.","commercial.feature3.title":"Nettoyage Hôtelier","commercial.feature3.desc":"Halls d'hôtels, aires communes et nettoyage d'installations pour maintenir des expériences client exceptionnelles.","commercial.feature4.title":"Établissements de Santé","commercial.feature4.desc":"Nettoyage de qualité médicale pour cliniques, cabinets dentaires et établissements de santé avec protocoles stricts.","commercial.feature5.title":"Établissements Scolaires","commercial.feature5.desc":"Écoles, garderies et centres de formation nettoyés aux plus hauts standards d'hygiène.","commercial.feature6.title":"Centres Commerciaux","commercial.feature6.desc":"Nettoyage à grande échelle pour centres commerciaux, plazas et complexes commerciaux à fort achalandage.","commercial.faq1.q":"Quels types d'espaces commerciaux nettoyez-vous?","commercial.faq1.a":"Nous nettoyons tous les espaces commerciaux incluant commerces de détail, restaurants, hôtels, établissements de santé, écoles, centres commerciaux, gymnases et plus.","commercial.faq2.q":"Offrez-vous un nettoyage spécialisé pour les établissements de santé?","commercial.faq2.a":"Oui, nous offrons des services de nettoyage de qualité médicale suivant des protocoles stricts de contrôle des infections. Notre équipe est formée aux normes de nettoyage des établissements de santé.","commercial.faq3.q":"Pouvez-vous nettoyer pendant les heures d'ouverture?","commercial.faq3.a":"Nous offrons des services de nettoyage discrets pendant les heures d'ouverture ainsi que des options après les heures. Notre équipe travaille efficacement pour minimiser les perturbations pour vos clients.","commercial.faq4.q":"Gérez-vous les zones commerciales à fort achalandage?","commercial.faq4.a":"Absolument. Nous nous spécialisons dans les zones à fort passage comme les centres commerciaux, aéroports et commerces achalandés. Nous pouvons fournir plusieurs nettoyages quotidiens selon les besoins.","commercial.faq5.q":"Êtes-vous assurés pour les propriétés commerciales?","commercial.faq5.a":"Oui, nous détenons une assurance commerciale complète incluant responsabilité civile et dommages matériels pour tous les services de nettoyage commercial.","events.title":"Nettoyage","events.highlight":"d'Événements","events.subtitle":"Faites briller votre événement du début à la fin. Nos services de nettoyage d'événements assurent que votre lieu est propre et accueillant avant, pendant et après votre occasion spéciale.","events.featuresTitle":"Solutions de Nettoyage d'Événements","events.featuresSubtitle":"Services de nettoyage complets pour événements de toutes tailles et types.","events.feature1.title":"Nettoyage Pré-Événement","events.feature1.desc":"Nettoyage complet du lieu avant votre événement pour assurer une première impression soignée à vos invités.","events.feature2.title":"Service Pendant l'Événement","events.feature2.desc":"Personnel de nettoyage discret disponible pendant votre événement pour maintenir la propreté tout au long.","events.feature3.title":"Nettoyage Post-Événement","events.feature3.desc":"Restauration complète du lieu après votre événement, incluant enlèvement des déchets et nettoyage en profondeur.","events.feature4.title":"Conférences & Salons","events.feature4.desc":"Nettoyage spécialisé pour conférences, expositions et salons professionnels de toute envergure.","events.feature5.title":"Nettoyage Concerts & Festivals","events.feature5.desc":"Services de nettoyage à grande échelle pour concerts, festivals et événements extérieurs.","events.feature6.title":"Service le Jour Même","events.feature6.desc":"Services de nettoyage d'urgence et le jour même quand vous en avez le plus besoin.","events.faq1.q":"Combien de temps à l'avance dois-je réserver le nettoyage d'événement?","events.faq1.a":"Nous recommandons de réserver au moins 1-2 semaines à l'avance pour les événements réguliers. Cependant, nous offrons des services le jour même et d'urgence pour les besoins de dernière minute.","events.faq2.q":"Fournissez-vous du personnel de nettoyage pendant les événements?","events.faq2.a":"Oui, nous pouvons poster du personnel de nettoyage tout au long de votre événement pour entretenir les toilettes, gérer les déchets et traiter tout déversement ou dégât discrètement.","events.faq3.q":"Quels types d'événements gérez-vous?","events.faq3.a":"Nous nettoyons pour tous types d'événements incluant mariages, galas corporatifs, conférences, salons professionnels, concerts, festivals, fêtes privées et plus.","events.faq4.q":"Pouvez-vous gérer le nettoyage d'événements extérieurs?","events.faq4.a":"Absolument. Nous avons de l'expérience avec les événements extérieurs de toutes tailles, incluant festivals, événements sportifs et mariages en plein air.","events.faq5.q":"À quelle vitesse pouvez-vous remettre un lieu en état entre deux événements?","events.faq5.a":"Nous nous spécialisons dans les rotations rapides. Selon la taille du lieu, nous pouvons avoir un espace prêt pour l'événement en quelques heures après la fin de l'événement précédent.","specialized.title":"Nettoyage","specialized.highlight":"Spécialisé","specialized.subtitle":"Du nettoyage en profondeur à la remédiation de matières dangereuses, nos services de nettoyage spécialisés s'attaquent aux situations de nettoyage les plus exigeantes.","specialized.featuresTitle":"Solutions de Nettoyage Spécialisé","specialized.featuresSubtitle":"Services professionnels pour les situations qui vont au-delà du nettoyage régulier.","specialized.feature1.title":"Nettoyage en Profondeur","specialized.feature1.desc":"Services de nettoyage intensif pour les installations nécessitant une désinfection approfondie au-delà du nettoyage régulier.","specialized.feature2.title":"Restauration Dégâts d'Eau","specialized.feature2.desc":"Extraction d'eau d'urgence et nettoyage de restauration pour les situations d'inondation et dégâts d'eau.","specialized.feature3.title":"Nettoyage de Conduits","specialized.feature3.desc":"Nettoyage professionnel de CVC et conduits d'air pour améliorer la qualité de l'air intérieur.","specialized.feature4.title":"Services de Désinfection","specialized.feature4.desc":"Désinfection de qualité hospitalière utilisant des pulvérisateurs électrostatiques et produits approuvés.","specialized.feature5.title":"Nettoyage Post-Construction","specialized.feature5.desc":"Nettoyage détaillé post-construction pour éliminer poussière, débris et résidus de construction.","specialized.feature6.title":"Nettoyage Matières Dangereuses","specialized.feature6.desc":"Services certifiés de remédiation et nettoyage de matières dangereuses selon des protocoles de sécurité stricts.","specialized.faq1.q":"Qu'est-ce que le nettoyage spécialisé?","specialized.faq1.a":"Le nettoyage spécialisé comprend le nettoyage en profondeur, la désinfection, le nettoyage de matières dangereuses, le nettoyage post-construction et autres services au-delà du travail de conciergerie régulier.","specialized.faq2.q":"Quand ai-je besoin de services de nettoyage spécialisé?","specialized.faq2.a":"Vous pourriez avoir besoin de nettoyage spécialisé après une construction, pour des situations de matières dangereuses, en cas de moisissure ou dégâts d'eau, pour un nettoyage de tapis en profondeur, ou pour préparer des inspections.","specialized.faq3.q":"Offrez-vous le nettoyage spécialisé d'urgence?","specialized.faq3.a":"Oui, nous offrons une réponse d'urgence 24/7 pour les besoins urgents de nettoyage spécialisé incluant matières dangereuses, dégâts d'eau et autres situations sensibles au temps.","specialized.faq4.q":"Quel équipement utilisez-vous pour le nettoyage spécialisé?","specialized.faq4.a":"Nous utilisons des équipements professionnels incluant extracteurs industriels, systèmes de filtration HEPA, générateurs d'ozone, pulvérisateurs électrostatiques et produits chimiques spécialisés.","specialized.faq5.q":"Les services de nettoyage spécialisé sont-ils sûrs pour les bâtiments occupés?","specialized.faq5.a":"De nombreux services peuvent être effectués dans des bâtiments occupés avec des produits à faible COV. Pour les travaux intensifs, nous recommandons la planification hors des heures de bureau.","cityService.professionalServicesIn":"Services professionnels à","cityService.in":"à","cityService.getQuote":"Demandez une soumission gratuite","cityService.starsOnGoogle":"5 étoiles sur Google","cityService.trustedBy":"La confiance des entreprises de","cityService.ourServicesIn":"Nos services de","cityService.comprehensiveSolutions":"Solutions complètes de","cityService.forBusinesses":"pour les entreprises de","cityService.andSurrounding":"et des environs.","cityService.faqTitle":"Questions Fréquentes","cityService.faqSubtitle":"Questions courantes sur nos services de","cityService.readyFor":"Prêt pour un","cityService.professional":"professionnel à","cityService.ctaSubtitle":"Obtenez une soumission gratuite et sans engagement. Nous personnaliserons un plan adapté à votre entreprise et votre budget.","cityService.ctaButton":"Obtenez votre soumission gratuite","cityService.sameDayResponse":"Réponse le jour même garantie","locationTrust.title":"La confiance des entreprises de","locationTrust.subtitle":"Rejoignez des centaines d'entreprises de","locationTrust.subtitleEnd":"qui font confiance à Simple Service pour leurs besoins de nettoyage commercial et industriel.","locationTrust.yearsServing":"Années de service à","locationTrust.localClients":"Clients locaux","locationTrust.satisfactionRate":"Taux de satisfaction","locationTrust.googleRating":"Note Google","locationBenefits.title":"Pourquoi choisir Simple à","locationBenefits.subtitle":"Découvrez la différence de travailler avec un partenaire de nettoyage professionnel","city.toronto":"Toronto (GTA)","city.vancouver":"Vancouver","city.montreal":"Montréal","city.mississauga":"Mississauga","city.brampton":"Brampton","city.vaughan":"Vaughan","city.northYork":"North York","city.scarborough":"Scarborough","city.etobicoke":"Etobicoke","city.eastYork":"East York","city.york":"York","city.laval":"Laval","city.longueuil":"Longueuil","city.brossard":"Brossard","city.terrebonne":"Terrebonne","city.burnaby":"Burnaby","city.richmond":"Richmond","city.surrey":"Surrey","city.northVancouver":"North Vancouver","city.coquitlam":"Coquitlam","city.other":"Autre","calculator.customCityPlaceholder":"Entrez le nom de votre ville","cityOffice.feature1.title":"Entretien quotidien de bureau","cityOffice.feature1.desc":"Services complets de nettoyage quotidien pour garder votre bureau propre et professionnel.","cityOffice.feature2.title":"Services de nettoyage en profondeur","cityOffice.feature2.desc":"Nettoyage périodique approfondi pour tapis, mobilier et zones difficiles d'accès.","cityOffice.feature3.title":"Horaires flexibles","cityOffice.feature3.desc":"Options de nettoyage après les heures et les fins de semaine pour minimiser les perturbations.","cityOffice.feature4.title":"Services de désinfection","cityOffice.feature4.desc":"Protocoles de désinfection de qualité hospitalière pour maintenir un environnement de travail sain.","cityOffice.feature5.title":"Équipes dédiées","cityOffice.feature5.desc":"Équipes de nettoyage constantes qui comprennent vos exigences spécifiques.","cityOffice.feature6.title":"Produits écologiques","cityOffice.feature6.desc":"Solutions de nettoyage vertes sûres pour vos employés et l'environnement.","cityCommercial.feature1.title":"Nettoyage de commerces","cityCommercial.feature1.desc":"Gardez votre espace commercial accueillant avec nettoyage quotidien et entretien des sols.","cityCommercial.feature2.title":"Nettoyage de restaurants","cityCommercial.feature2.desc":"Nettoyage en profondeur de cuisines et salles à manger conforme aux codes de santé.","cityCommercial.feature3.title":"Nettoyage hôtelier","cityCommercial.feature3.desc":"Halls d'hôtels et aires communes pour des expériences client exceptionnelles.","cityCommercial.feature4.title":"Établissements de santé","cityCommercial.feature4.desc":"Nettoyage de qualité médicale pour cliniques et cabinets avec protocoles stricts.","cityCommercial.feature5.title":"Établissements scolaires","cityCommercial.feature5.desc":"Écoles et garderies nettoyées aux plus hauts standards d'hygiène.","cityCommercial.feature6.title":"Centres commerciaux","cityCommercial.feature6.desc":"Nettoyage à grande échelle pour centres commerciaux à fort achalandage.","cityIndustrial.feature1.title":"Nettoyage d'usines","cityIndustrial.feature1.desc":"Solutions complètes pour installations de fabrication et zones de production.","cityIndustrial.feature2.title":"Nettoyage d'entrepôts","cityIndustrial.feature2.desc":"Nettoyage à grande échelle pour entrepôts et centres de distribution.","cityIndustrial.feature3.title":"Zones d'équipement lourd","cityIndustrial.feature3.desc":"Nettoyage spécialisé autour des machines lourdes avec protocoles de sécurité.","cityIndustrial.feature4.title":"Nettoyage d'ateliers","cityIndustrial.feature4.desc":"Dégraissage et récurage de sols pour ateliers de machines.","cityIndustrial.feature5.title":"Conformité sécurité","cityIndustrial.feature5.desc":"Services conformes aux normes de sécurité industrielles.","cityIndustrial.feature6.title":"Nettoyage haute pression","cityIndustrial.feature6.desc":"Lavage sous pression pour sols, murs et surfaces extérieures.","cityEvent.feature1.title":"Nettoyage pré-événement","cityEvent.feature1.desc":"Nettoyage complet du lieu avant votre événement pour une première impression soignée.","cityEvent.feature2.title":"Service pendant l'événement","cityEvent.feature2.desc":"Personnel de nettoyage discret disponible pendant votre événement.","cityEvent.feature3.title":"Nettoyage post-événement","cityEvent.feature3.desc":"Restauration complète du lieu après votre événement.","cityEvent.feature4.title":"Conférences & salons","cityEvent.feature4.desc":"Nettoyage spécialisé pour conférences et expositions professionnelles.","cityEvent.feature5.title":"Concerts & festivals","cityEvent.feature5.desc":"Services de nettoyage à grande échelle pour événements extérieurs.","cityEvent.feature6.title":"Service le jour même","cityEvent.feature6.desc":"Services de nettoyage d'urgence quand vous en avez le plus besoin.","citySpecialized.feature1.title":"Nettoyage en profondeur","citySpecialized.feature1.desc":"Services intensifs pour installations nécessitant une désinfection approfondie.","citySpecialized.feature2.title":"Restauration dégâts d'eau","citySpecialized.feature2.desc":"Extraction d'eau d'urgence et nettoyage de restauration.","citySpecialized.feature3.title":"Nettoyage de conduits","citySpecialized.feature3.desc":"Nettoyage professionnel de CVC pour améliorer la qualité de l'air.","citySpecialized.feature4.title":"Services de désinfection","citySpecialized.feature4.desc":"Désinfection de qualité hospitalière avec pulvérisateurs électrostatiques.","citySpecialized.feature5.title":"Nettoyage post-construction","citySpecialized.feature5.desc":"Nettoyage détaillé pour éliminer poussière et débris de construction.","citySpecialized.feature6.title":"Nettoyage matières dangereuses","citySpecialized.feature6.desc":"Remédiation certifiée selon des protocoles de sécurité stricts.","cityOffice.faq1.q":"Quels secteurs couvrez-vous pour le nettoyage de bureaux?","cityOffice.faq1.a":"Nous offrons des services de nettoyage de bureaux dans toute la région métropolitaine et les zones environnantes.","cityOffice.faq2.q":"Offrez-vous le nettoyage de bureaux après les heures?","cityOffice.faq2.a":"Oui, nous offrons des horaires flexibles incluant les soirées, nuits et fins de semaine pour minimiser les perturbations.","cityOffice.faq3.q":"Avez-vous du personnel bilingue?","cityOffice.faq3.a":"Oui, notre équipe comprend du personnel bilingue pouvant communiquer en français et en anglais.","cityOffice.faq4.q":"Qu'est-ce qui est inclus dans vos services de nettoyage de bureaux?","cityOffice.faq4.a":"Nos services incluent le dépoussiérage, l'aspiration, le lavage, la désinfection des sanitaires, le nettoyage de cuisine et le nettoyage des vitres.","cityOffice.faq5.q":"Comment assurez-vous la qualité du nettoyage?","cityOffice.faq5.a":"Nous effectuons des inspections régulières, utilisons des listes de contrôle détaillées et maintenons une communication ouverte avec nos clients.","cityOffice.faq6.q":"Pouvez-vous gérer de grands immeubles de bureaux?","cityOffice.faq6.a":"Absolument. Nous avons l'équipe et l'équipement pour desservir des bureaux de toutes tailles.","cityCommercial.faq1.q":"Quels types d'espaces commerciaux nettoyez-vous?","cityCommercial.faq1.a":"Nous nettoyons tous les espaces commerciaux incluant commerces de détail, restaurants, hôtels, établissements de santé, écoles et centres commerciaux.","cityCommercial.faq2.q":"Offrez-vous un nettoyage spécialisé pour les établissements de santé?","cityCommercial.faq2.a":"Oui, nous offrons des services de nettoyage de qualité médicale suivant des protocoles stricts de contrôle des infections.","cityCommercial.faq3.q":"Pouvez-vous nettoyer pendant les heures d'ouverture?","cityCommercial.faq3.a":"Nous offrons des services de nettoyage discrets pendant les heures d'ouverture ainsi que des options après les heures.","cityCommercial.faq4.q":"Gérez-vous les zones commerciales à fort achalandage?","cityCommercial.faq4.a":"Absolument. Nous nous spécialisons dans les zones à fort passage et pouvons fournir plusieurs nettoyages quotidiens.","cityCommercial.faq5.q":"Êtes-vous assurés pour les propriétés commerciales?","cityCommercial.faq5.a":"Oui, nous détenons une assurance commerciale complète incluant responsabilité civile et dommages matériels.","cityCommercial.faq6.q":"Comment assurez-vous la qualité du nettoyage commercial?","cityCommercial.faq6.a":"Nous utilisons des systèmes de contrôle de qualité numériques, des inspections régulières et des superviseurs formés.","cityIndustrial.faq1.q":"Quels types d'installations industrielles nettoyez-vous?","cityIndustrial.faq1.a":"Nous nettoyons tous types d'installations industrielles incluant usines, entrepôts, centres de distribution et ateliers.","cityIndustrial.faq2.q":"Offrez-vous des services de nettoyage industriel 24/7?","cityIndustrial.faq2.a":"Oui, nous offrons des horaires flexibles incluant les quarts de nuit et de fin de semaine.","cityIndustrial.faq3.q":"Vos méthodes sont-elles sécuritaires pour les installations alimentaires?","cityIndustrial.faq3.a":"Absolument. Nous utilisons des produits alimentaires conformes et suivons des protocoles stricts.","cityIndustrial.faq4.q":"Pouvez-vous gérer le nettoyage de matières dangereuses?","cityIndustrial.faq4.a":"Nous offrons un nettoyage spécialisé pour les installations avec matières dangereuses.","cityIndustrial.faq5.q":"Quel équipement de nettoyage industriel utilisez-vous?","cityIndustrial.faq5.a":"Nous utilisons des équipements de qualité industrielle incluant auto-laveuses et nettoyeurs haute pression.","cityIndustrial.faq6.q":"Comment assurez-vous la sécurité lors du nettoyage industriel?","cityIndustrial.faq6.a":"Notre équipe suit des protocoles de sécurité stricts, porte l'EPI approprié et coordonne avec votre équipe de sécurité.","cityEvent.faq1.q":"Combien de temps à l'avance dois-je réserver?","cityEvent.faq1.a":"Nous recommandons de réserver 1-2 semaines à l'avance, mais offrons aussi des services d'urgence.","cityEvent.faq2.q":"Fournissez-vous du personnel pendant les événements?","cityEvent.faq2.a":"Oui, nous pouvons poster du personnel de nettoyage tout au long de votre événement.","cityEvent.faq3.q":"Quels types d'événements gérez-vous?","cityEvent.faq3.a":"Nous nettoyons pour tous types d'événements incluant mariages, galas, conférences et festivals.","cityEvent.faq4.q":"Pouvez-vous gérer les événements extérieurs?","cityEvent.faq4.a":"Absolument. Nous avons de l'expérience avec les événements extérieurs de toutes tailles.","cityEvent.faq5.q":"À quelle vitesse pouvez-vous remettre un lieu en état?","cityEvent.faq5.a":"Nous nous spécialisons dans les rotations rapides selon la taille du lieu.","citySpecialized.faq1.q":"Qu'est-ce que le nettoyage spécialisé?","citySpecialized.faq1.a":"Le nettoyage spécialisé comprend le nettoyage en profondeur, la désinfection, le nettoyage post-construction et plus.","citySpecialized.faq2.q":"Quand ai-je besoin de nettoyage spécialisé?","citySpecialized.faq2.a":"Après une construction, pour des dégâts d'eau, pour un nettoyage en profondeur ou pour préparer des inspections.","citySpecialized.faq3.q":"Offrez-vous le nettoyage spécialisé d'urgence?","citySpecialized.faq3.a":"Oui, nous offrons une réponse d'urgence 24/7 pour les besoins urgents.","citySpecialized.faq4.q":"Quel équipement utilisez-vous?","citySpecialized.faq4.a":"Nous utilisons des équipements professionnels incluant extracteurs industriels et systèmes de filtration HEPA.","citySpecialized.faq5.q":"Les services sont-ils sûrs pour les bâtiments occupés?","citySpecialized.faq5.a":"De nombreux services peuvent être effectués dans des bâtiments occupés avec des produits à faible COV.","citySpecialized.faq6.q":"Pouvez-vous fournir de la documentation pour les réclamations d'assurance?","citySpecialized.faq6.a":"Oui, nous fournissons une documentation détaillée, des photos et des rapports pour les réclamations d'assurance.","service.officeCleaning":"Nettoyage de bureaux","service.commercialCleaning":"Nettoyage commercial","service.industrialCleaning":"Nettoyage industriel","service.eventCleaning":"Nettoyage d'événements","service.specializedCleaning":"Nettoyage spécialisé","cityOffice.subtitle":"Gardez votre bureau impeccable avec nos services professionnels de nettoyage. De l'entretien quotidien au nettoyage en profondeur, nous assurons un espace de travail sain et productif.","cityCommercial.subtitle":"Des commerces de détail aux établissements de santé, nous offrons des services complets de nettoyage commercial qui gardent votre entreprise à son meilleur.","cityIndustrial.subtitle":"Gardez votre usine, entrepôt ou installation de fabrication impeccable avec nos services de nettoyage industriel spécialisés et conformes aux normes de sécurité.","cityEvent.subtitle":"Faites briller votre événement du début à la fin. Nos services assurent que votre lieu est impeccable avant, pendant et après votre occasion spéciale.","citySpecialized.subtitle":"Du nettoyage en profondeur à la remédiation, nos services spécialisés s'attaquent aux situations de nettoyage les plus exigeantes.","pricingEducation.badge":"Guide des prix pour","pricingEducation.heroTitle":"Comment fonctionne vraiment la tarification du nettoyage commercial à","pricingEducation.heroSubtitle":"La vérité sur les coûts de nettoyage que la plupart des entreprises ne vous diront pas. Découvrez pourquoi le devis le moins cher est souvent l'erreur la plus coûteuse.","pricingEducation.getHonestQuote":"Obtenez un devis honnête","pricingEducation.breakdownTitle":"Ce qui compose les prix du nettoyage professionnel","pricingEducation.breakdownSubtitle":"Comprendre les coûts réels vous aide à repérer les devis non viables à","pricingEducation.labor.percent":"50-60%","pricingEducation.labor.title":"Coûts de main-d'œuvre","pricingEducation.labor.desc":"Nettoyeurs formés, vérifiés et assurés gagnant un salaire décent. Les entreprises bon marché coupent ici en premier—et la qualité en souffre.","pricingEducation.supplies.percent":"10-15%","pricingEducation.supplies.title":"Fournitures et équipements","pricingEducation.supplies.desc":"Produits de qualité commerciale et équipements professionnels. Les nettoyeurs à rabais utilisent des solutions diluées.","pricingEducation.insurance.percent":"8-12%","pricingEducation.insurance.title":"Assurance et conformité","pricingEducation.insurance.desc":"Couverture complète de responsabilité, CNESST et conformité réglementaire. Beaucoup d'opérateurs bon marché sautent cela entièrement.","pricingEducation.training.percent":"5-8%","pricingEducation.training.title":"Formation et contrôle qualité","pricingEducation.training.desc":"Formation continue, inspections et assurance qualité. Les entreprises à bas prix n'en ont aucune.","pricingEducation.overhead.percent":"8-10%","pricingEducation.overhead.title":"Opérations et support","pricingEducation.overhead.desc":"Gestion, planification, service client et personnel de secours. Essentiel pour la fiabilité.","pricingEducation.margin.percent":"5-10%","pricingEducation.margin.title":"Profit durable","pricingEducation.margin.desc":"Une marge raisonnable assure que l'entreprise sera là le mois prochain. Des marges très minces mènent à des coins coupés.","pricingEducation.warningBadge":"Signes d'alerte","pricingEducation.whyCheapFailsTitle":"Pourquoi le prix le plus bas échoue généralement","pricingEducation.whyCheapFailsSubtitle":"Conséquences réelles que nous avons vues du nettoyage à bas prix à","pricingEducation.fail1.title":"Roulement élevé","pricingEducation.fail1.desc":"Les travailleurs sous-payés partent constamment. Vous avez des nettoyeurs différents à chaque visite qui ne connaissent pas votre espace.","pricingEducation.fail2.title":"Résultats inconstants","pricingEducation.fail2.desc":"Sans formation et supervision adéquates, la qualité varie énormément d'une visite à l'autre.","pricingEducation.fail3.title":"Travail bâclé","pricingEducation.fail3.desc":"Pour faire du profit à bas prix, les nettoyeurs doivent se dépêcher. Votre espace reçoit un coup de chiffon, pas un vrai nettoyage.","pricingEducation.fail4.title":"Aucune protection d'assurance","pricingEducation.fail4.desc":"Beaucoup d'opérateurs bon marché ne sont pas assurés. Si quelque chose casse ou quelqu'un se blesse, vous êtes responsable.","pricingEducation.fail5.title":"Entreprises fantômes","pricingEducation.fail5.desc":"Les opérateurs à bas prix disparaissent souvent en cours de contrat, vous laissant chercher une couverture.","pricingEducation.fail6.title":"Frais cachés","pricingEducation.fail6.desc":'Les devis bas excluent souvent les essentiels. Vous finissez par payer plus pour des "extras" qui devraient être standards.',"pricingEducation.differenceBadge":"L'approche Simple","pricingEducation.differenceTitle":"Pourquoi Simple est l'anti-opérateur bon marché","pricingEducation.differenceSubtitle":"Comment nous livrons des résultats constants et professionnels à","pricingEducation.diff1.title":"Tarification transparente","pricingEducation.diff1.desc":"Nous vous montrons exactement ce qui est inclus. Pas de frais cachés, pas de surprises après signature.","pricingEducation.diff2.title":"Engagement salaire décent","pricingEducation.diff2.desc":"Nos nettoyeurs gagnent des salaires équitables. Des employés heureux font un meilleur travail et restent plus longtemps—votre espace en bénéficie.","pricingEducation.diff3.title":"Équipes constantes","pricingEducation.diff3.desc":"La même équipe formée dessert votre emplacement. Ils connaissent votre espace et vos standards.","pricingEducation.diff4.title":"Couverture complète","pricingEducation.diff4.desc":"Assurance complète, conformité CNESST et employés cautionnés (assurés contre le vol ou les dommages). Votre protection est garantie.","pricingEducation.diff5.title":"Inspections qualité","pricingEducation.diff5.desc":"Inspections régulières par superviseurs et listes de contrôle numériques assurent des résultats constants à chaque visite.","pricingEducation.diff6.title":"Partenaire à long terme","pricingEducation.diff6.desc":"Nous servons les entreprises canadiennes depuis plus d'une décennie. Nous serons là l'an prochain, et l'année suivante.","pricingEducation.ctaTitle":"Obtenez un prix honnête pour","pricingEducation.ctaSubtitle":"Sans pression, sans trucs. Nous fournirons un devis détaillé en qui vous pouvez vraiment avoir confiance—et nous expliquerons exactement ce qu'il contient.","pricingEducation.ctaButton":"Demandez votre devis","pricingEducation.callUs":"Appelez-nous","calculator.seoTitle":"Calculateur de prix de nettoyage commercial | Simple","calculator.seoDescription":"Estimez le coût de vos services de nettoyage commercial. Obtenez une estimation instantanée basée sur votre type d'espace, sa taille et la fréquence.","calculator.badge":"Estimation instantanée","calculator.title":"Calculateur de prix de nettoyage","calculator.subtitle":"Obtenez une estimation rapide pour vos besoins de nettoyage commercial. Personnalisez les options ci-dessous et soumettez pour recevoir un devis précis de notre équipe.","calculator.disclaimerTitle":"Avertissement important","calculator.disclaimerText":"Ce calculateur fournit uniquement une estimation approximative basée sur les informations limitées fournies. Les prix réels peuvent varier considérablement en fonction de l'état actuel de votre espace, des besoins de nettoyage spécifiques, de l'accessibilité et d'autres facteurs. Un devis final précis nécessite une évaluation approfondie par notre équipe.","calculator.buildEstimate":"Construisez votre estimation","calculator.buildingsLabel":"Bâtiments","calculator.building":"Bâtiment","calculator.addBuilding":"Ajouter un bâtiment","calculator.totalSqFt":"Total","calculator.spaceTypeLabel":"Type d'espace","calculator.selectSpaceType":"Sélectionnez le type d'espace","calculator.spaceType.office":"Bureau","calculator.spaceType.retail":"Commerce de détail","calculator.spaceType.industrial":"Industriel / Entrepôt","calculator.spaceType.warehouse":"Entrepôt / Distribution","calculator.spaceType.restaurant":"Restaurant / Cuisine commerciale","calculator.spaceType.medical":"Médical / Clinique","calculator.spaceType.school":"École / Établissement scolaire","calculator.squareFootageLabel":"Superficie","calculator.frequencyLabel":"Fréquence de nettoyage","calculator.selectFrequency":"Sélectionnez la fréquence","calculator.frequency.daily":"Quotidien (5 jours/semaine)","calculator.frequency.3xWeek":"3 fois par semaine","calculator.frequency.2xWeek":"2 fois par semaine","calculator.frequency.weekly":"Hebdomadaire","calculator.frequency.biweekly":"Aux 2 semaines","calculator.frequency.monthly":"Mensuel","calculator.cityLabel":"Ville","calculator.additionalServicesLabel":"Services additionnels (optionnel)","calculator.service.windows":"Nettoyage de vitres","calculator.service.carpet":"Nettoyage de tapis","calculator.service.floor":"Entretien des planchers","calculator.service.disinfection":"Désinfection approfondie","calculator.service.pressure":"Lavage haute pression","calculator.service.postConstruction":"Post-construction","calculator.yourEstimate":"Votre estimation","calculator.estimatedMonthly":"Coût mensuel estimé","calculator.month":"mois","calculator.year":"an","calculator.paymentMonthly":"Mensuel","calculator.paymentAnnual":"Annuel","calculator.save12":"-12%","calculator.perVisit":"Par visite","calculator.visitsPerMonth":"Visites par mois","calculator.selectOptions":"Sélectionnez le type d'espace et la fréquence pour voir votre estimation","calculator.learnMorePricing":"En savoir plus sur les prix dans votre ville","calculator.getAccurateQuote":"Obtenez un devis précis","calculator.name":"Nom","calculator.namePlaceholder":"Votre nom complet","calculator.email":"Courriel","calculator.emailPlaceholder":"vous@entreprise.com","calculator.company":"Entreprise","calculator.companyPlaceholder":"Nom de votre entreprise","calculator.city":"Ville","calculator.selectCity":"Sélectionnez votre ville","calculator.submitEstimate":"Soumettre mon estimation","calculator.submitting":"Envoi en cours...","calculator.error":"Erreur","calculator.fillRequired":"Veuillez remplir tous les champs requis.","calculator.successTitle":"Estimation soumise!","calculator.successMessage":"Merci! Notre équipe examinera votre estimation et vous contactera sous peu.","calculator.thankYouTitle":"Merci!","calculator.thankYouMessage":"Nous avons bien reçu votre demande d'estimation. Un membre de notre équipe vous contactera dans les 24 heures pour discuter de vos besoins et confirmer un prix exact.","calculator.contactSoon":"Nous vous contacterons dans les 24 heures ouvrables.","calculator.privacyNote":"Nous respectons votre vie privée. Vos informations ne seront jamais partagées.","calculator.tier.essential":"Essentiel","calculator.tier.essentialDesc":"Nettoyage de base pour les besoins standards","calculator.tier.essentialFeature1":"Nettoyage de surface des espaces communs","calculator.tier.essentialFeature2":"Vidage des poubelles et remplacement des sacs","calculator.tier.essentialFeature3":"Nettoyage de base des toilettes","calculator.tier.professional":"Professionnel","calculator.tier.professionalDesc":"Notre service le plus populaire","calculator.tier.professionalFeature1":"Tout inclus dans Essentiel","calculator.tier.professionalFeature2":"Nettoyage approfondi de toutes les surfaces","calculator.tier.professionalFeature3":"Désinfection des points de contact fréquents","calculator.tier.professionalFeature4":"Rapports de qualité réguliers","calculator.tier.premium":"Premium","calculator.tier.premiumDesc":"Service complet sans compromis","calculator.tier.premiumFeature1":"Tout inclus dans Professionnel","calculator.tier.premiumFeature2":"Gestionnaire de compte dédié","calculator.tier.premiumFeature3":"Inspections qualité hebdomadaires","calculator.tier.premiumFeature4":"Services d'urgence prioritaires","calculator.tier.premiumFeature5":"Produits écologiques premium","calculator.tier.recommended":"Recommandé","blog.title":"Notre Blogue","blog.subtitle":"Conseils d'experts sur le nettoyage commercial, la gestion d'installations et l'hygiène au travail à travers le Canada.","blog.pageTitle":"Blogue | Simple Service - Conseils en nettoyage commercial","blog.pageDescription":"Conseils d'experts, guides et articles sur le nettoyage commercial, l'entretien de bureaux et la gestion d'installations à travers le Canada.","blog.all":"Tous","blog.noPosts":"Aucun article pour le moment. Revenez bientôt!","blog.page":"Page","blog.of":"de","blog.backToBlog":"← Retour au blogue","blog.minRead":"min de lecture","blog.share":"Partager:","blog.readyToSimplify":"Prêt à simplifier votre nettoyage?","blog.readyToSimplifyDesc":"Obtenez une soumission gratuite et découvrez comment nous pouvons entretenir vos espaces.","blog.bookDemo":"Réserver une démo","blog.moreFromSimple":"Plus de Simple Service","blog.browseAll":"Voir tous les articles →","blog.readMore":"Lire la suite →","blog.postNotFound":"Article introuvable"},en:{"nav.home":"Home","nav.services":"Services","nav.about":"About","nav.contact":"Contact","hero.headline":"Commercial & industrial cleaning, simplified.","hero.subheadline":"Simple Service — Canadian company specializing in commercial and industrial cleaning for offices, factories, warehouses and businesses.","hero.cta":"Get a free quote","hero.pricingCalculator":"Pricing Calculator","trust.official":"Trusted by major clients","trust.subtitle":"Major clients trust us for quality, consistency and discretion.","trust.years":"Years of experience","trust.clients":"Satisfied clients","trust.satisfaction":"Avg. Google rating","services.title":"Our Services","services.offices":"Offices","services.offices.desc":"Office cleaning includes daily dusting, vacuuming, sanitization, kitchen and restroom care, and floor maintenance — starting with custom quotes based on your office size and schedule.","services.commercial":"Commercial","services.commercial.desc":"Commercial cleaning covers storefront sanitization, display area dusting, restroom protocols, and floor care for retail stores, restaurants, and public spaces — with flexible daily or weekly schedules.","services.industrial":"Industrial","services.industrial.desc":"Industrial cleaning includes factory floor degreasing, warehouse sweeping, high-pressure washing, and OHSA (Occupational Health and Safety Act, Ontario) / CNESST (Québec worker safety regulator)-compliant equipment area cleaning for manufacturing and distribution facilities.","services.events":"Events","services.events.desc":"Event cleaning provides pre-event setup sanitization, post-event deep cleaning, and same-day turnaround for conferences, galas, trade shows, and corporate functions across Canada.","services.specialized":"Specialized Maintenance","services.specialized.desc":"Specialized cleaning delivers deep carpet extraction, high-dusting, window washing, post-construction cleanup, and hospital-grade disinfection for sensitive environments.","about.title":"Commercial & industrial cleaning, simplified.","about.text":"We simplified commercial and industrial cleaning across Canada. Our digital management system — checklists, timestamped photos, and detailed reports after every visit — ensures reliable, transparent, and hassle-free service with consistent quality.","contact.title":"Get your free estimate","contact.name":"Name","contact.company":"Company","contact.phone":"Phone","contact.email":"Email","contact.message":"Message","contact.submit":"Submit","contact.success":"Message sent successfully! We will contact you soon.","faq.title":"Frequently Asked Questions","faq.q1":"How often do you recommend commercial cleaning?","faq.a1":"It depends on your business type and foot traffic. Most offices opt for daily or weekly cleaning, while retail spaces often prefer daily service.","faq.q2":"Do you use eco-friendly products?","faq.a2":"Yes, we offer green cleaning options with certified environmentally-friendly products aligned with Health Canada cleaning and disinfection guidance. We can tailor our methods to your preferences.","faq.q3":"Are you insured and bonded?","faq.a3":"Absolutely. We carry $5M in liability coverage and maintain full compliance with provincial workplace safety programs including WSIB (Workplace Safety and Insurance Board — Ontario), CNESST (Quebec's workplace standards commission), and WorkSafeBC (British Columbia).","faq.q4":"Can I customize my cleaning plan?","faq.a4":"Certainly! We create custom cleaning plans tailored to your specific needs, budget, and schedule.","faq.q5":"How do I get a quote?","faq.a5":"Contact us via the form above, by phone, or email. We'll schedule a free assessment of your premises to provide you with a detailed quote.","faq.q6":"Do you offer emergency services?","faq.a6":"Yes, we offer emergency cleaning services for unexpected situations like spills, last-minute event preparations, etc.","faq.q7":"How do you ensure quality on every visit?","faq.a7":"Every visit is documented with digital checklists and timestamped photos. Your account manager conducts regular inspections and you receive detailed service reports.","faq.q8":"What is your transition process if I switch providers?","faq.a8":"We run a structured 5-week onboarding program: site assessment, detailed planning, dedicated crew training, a supervised break-in period, then handoff to regular service — with zero disruption to your operations.","faq.q9":"What insurance coverage do you carry?","faq.a9":"We carry $5M in general liability insurance, fidelity bonding (employee theft and damage insurance), and full compliance with provincial workplace safety programs: WSIB (Ontario), CNESST (Quebec), and WorkSafeBC (B.C.).","faq.q10":"What is the best cleaning frequency for a Laval or Montreal office?","faq.a10":"For most offices in Montreal and Laval, we recommend daily cleaning for high-traffic areas (lobbies, kitchens, restrooms) and weekly deep cleaning for workstations and meeting rooms. Offices with 50+ employees typically benefit from 5-day-a-week service, while smaller offices may only need 2-3 visits per week.","faq.q11":"How does CNESST compliance affect commercial cleaning in Quebec?","faq.a11":"CNESST (Commission des normes, de l'équité, de la santé et de la sécurité du travail) requires all cleaning companies in Quebec to maintain workplace safety standards, WHMIS training for chemicals, and proper insurance. Our protocols also align with ISO 45001 occupational health and safety standards. Simple Service is fully CNESST-compliant with certified teams and approved products.","faq.q12":"How much does commercial cleaning cost per square foot in Canada?","faq.a12":"Commercial cleaning in Canada typically ranges from $0.08 to $0.25 per square foot depending on service frequency, facility type, and location. Office cleaning averages $0.08–$0.15/sq ft, commercial spaces $0.10–$0.18/sq ft, and industrial facilities $0.12–$0.25/sq ft.","faq.q13":"Do you serve businesses in Toronto, Vancouver, and Montreal?","faq.a13":"Yes, Simple Service operates across three major Canadian metro areas: Greater Montreal (Montreal, Laval, Longueuil, Brossard, Terrebonne), GTA (Toronto, Mississauga, Brampton, Vaughan, North York, Scarborough, Etobicoke), and Metro Vancouver (Vancouver, Burnaby, Surrey, Richmond, North Vancouver, Coquitlam).","faq.q14":"What happens if I'm not satisfied with a cleaning visit?","faq.a14":"We guarantee satisfaction on every visit. If any area doesn't meet expectations, contact your dedicated account manager and we'll send a crew back within 24 hours at no additional cost. Our digital checklist system with timestamped photos ensures accountability.","faq.q15":"How do you verify that every visit is completed?","faq.a15":"Every shift is documented with timestamped before-and-after photos of key areas, reviewed by a supervisor. You receive regular reports confirming the work was completed as scheduled.","faq.q16":"How do you document each service visit?","faq.a16":"Our technicians follow digital checklists with timestamps and electronic signatures. Before/after photos are archived and detailed reports are sent to you on a regular basis.","faq.q17":"What exactly does your $5M insurance cover?","faq.a17":"Our $5M general liability policy covers property damage, bodily injury to third parties, and professional errors. We also carry fidelity bonding (employee theft and damage insurance) plus a $10M umbrella policy for additional protection.","faq.q18":"How do you guarantee issue resolution in under 24 hours?","faq.a18":"Our 4-level escalation process ensures nothing goes unaddressed: your site supervisor is alerted immediately, then your account manager steps in within 4 hours if needed. As a last resort, senior management gets involved to guarantee resolution within 24 hours.","faq.q19":"How do I access service reports?","faq.a19":"Your service reports include before/after photos, performance metrics, and communication history. They are sent via email at your preferred frequency (daily, weekly, or monthly).","benefits.title":"Our Guarantee","benefits.subtitle":"Six concrete commitments that protect your investment","benefits.consistency.title":"Quality Assurance","benefits.consistency.desc":"Regular inspections and standardized checklists deliver consistent results, visit after visit.","benefits.flexible.title":"Scheduling Around You","benefits.flexible.desc":"Day, evening, or overnight cleaning — planned around your operations, never the other way around.","benefits.insured.title":"Comprehensive Coverage","benefits.insured.desc":"$5M liability protection, bonded employees (insured against theft or damage), and full WSIB (Ontario) / CNESST (Quebec) compliance for total peace of mind.","benefits.trained.title":"Certified Teams","benefits.trained.desc":"Background-verified, WHMIS-trained (Workplace Hazardous Materials Information System) staff with ongoing skills development for every crew member.","benefits.eco.title":"Responsible Cleaning","benefits.eco.desc":"EcoLogo-certified products and sustainable practices that safeguard occupant health.","benefits.support.title":"Local Account Manager","benefits.support.desc":"A dedicated manager in your region, directly reachable for any request or concern.","certifications.title":"Certifications & Affiliations","certifications.subtitle":"Recognized by the industry's leading cleaning associations","certifications.issa":"International Sanitary Supply Association","certifications.bscai":"Building Service Contractors Association International","certifications.cnesst":"Quebec Workers' Compensation Board","certifications.cpeep":"Joint Committee for Public Building Maintenance","testimonials.title":"What Our Clients Say","testimonials.subtitle":"Authentic feedback from satisfied clients","testimonials.client1.name":"Marie Dubois","testimonials.client1.company":"Director, Tech Solutions Inc.","testimonials.client1.text":"Impeccable service for 3 years. The team is professional, punctual and our offices have never been cleaner.","testimonials.client2.name":"Jean Tremblay","testimonials.client2.company":"Owner, Boutique Élégance","testimonials.client2.text":"Simple Service transformed our store's maintenance. The digital management system keeps us always informed.","testimonials.client3.name":"Sophie Martin","testimonials.client3.company":"Event Manager","testimonials.client3.text":"They saved our gala! Fast and efficient emergency service. I recommend them without hesitation.","caseStudies.title":"Case Studies","caseStudies.subtitle":"Real results for our clients","caseStudies.problemLabel":"Problem","caseStudies.solutionLabel":"Solution","caseStudies.challengeLabel":"Challenge","caseStudies.resultLabel":"Result","caseStudies.improvement":"Improvement","caseStudies.case1.title":"Downtown Office Tower","caseStudies.case1.challenge":"15-story building requiring daily cleaning with high standards","caseStudies.case1.result":"Digital checklists, photos, and reporting ensuring consistent quality and reduced complaints","caseStudies.case1.metricLabel":"occupant satisfaction","caseStudies.case2.title":"Shopping Center","caseStudies.case2.challenge":"Coordinating cleaning for 50+ stores with variable schedules","caseStudies.case2.result":"Optimized scheduling and maximum client satisfaction","caseStudies.case2.metricLabel":"scheduling efficiency","caseStudies.case3.title":"Corporate Campus","caseStudies.case3.challenge":"Transition to eco-friendly products without compromising quality","caseStudies.case3.result":"Green certification achieved with reduced supply costs","caseStudies.case3.metricLabel":"cost reduction","gallery.badge":"One of the top-rated cleaning companies in Canada","gallery.title":"Our Work in Action","gallery.subtitle":"See our expertise through our completed projects","footer.tagline":"Simple. Clean. Professional.","footer.location":"Montreal, Quebec","footer.rights":"All rights reserved.","service.getQuote":"Get a Free Quote","service.call":"Call","service.faqTitle":"Frequently Asked Questions","service.faqSubtitle":"Common questions about our","service.ctaTitle":"Ready for Professional","service.ctaSubtitle":"Get a free, no-obligation quote. We'll customize a cleaning plan that fits your business and budget.","service.ctaButton":"Get Your Free Quote","service.responseGuarantee":"Same-day response guaranteed","service.professional":"Professional","service.starsOnGoogle":"Stars on Google","service.trustedCanada":"Trusted Across Canada","industrial.title":"Professional","industrial.highlight":"Industrial Cleaning","industrial.subtitle":"Keep your factory, warehouse, or manufacturing facility spotless with our specialized industrial cleaning services. Safety-compliant, efficient, and tailored to your operations.","industrial.featuresTitle":"Industrial Cleaning Solutions","industrial.featuresSubtitle":"Comprehensive cleaning services designed for the unique demands of industrial environments.","industrial.feature1.title":"Factory Cleaning","industrial.feature1.desc":"Comprehensive cleaning solutions for manufacturing facilities, production floors, and assembly areas.","industrial.feature2.title":"Warehouse Cleaning","industrial.feature2.desc":"Large-scale cleaning for warehouses, distribution centers, and logistics facilities.","industrial.feature3.title":"Heavy Equipment Areas","industrial.feature3.desc":"Specialized cleaning around heavy machinery and industrial equipment with safety protocols.","industrial.feature4.title":"Machine Shop Cleaning","industrial.feature4.desc":"Degreasing, floor scrubbing, and maintenance cleaning for machine shops and workshops.","industrial.feature5.title":"Safety Compliance","industrial.feature5.desc":"Cleaning services that meet OSHA standards and industry-specific safety requirements.","industrial.feature6.title":"High-Pressure Cleaning","industrial.feature6.desc":"Industrial-grade pressure washing for floors, walls, and exterior surfaces.","industrial.faq1.q":"What types of industrial facilities do you clean?","industrial.faq1.a":"We clean all types of industrial facilities including factories, warehouses, distribution centers, manufacturing plants, machine shops, food processing facilities, and more.","industrial.faq2.q":"Do you offer 24/7 industrial cleaning services?","industrial.faq2.a":"Yes, we offer flexible scheduling including overnight and weekend shifts to minimize disruption to your operations. We can work around your production schedules.","industrial.faq3.q":"Are your cleaning methods safe for food processing facilities?","industrial.faq3.a":"Absolutely. We use food-safe, CFIA-compliant cleaning products and follow strict protocols for food processing and pharmaceutical facilities.","industrial.faq4.q":"Can you handle hazardous material cleanup?","industrial.faq4.a":"We provide specialized cleaning for facilities with hazardous materials, following all safety protocols and regulations. Our team is trained in proper handling procedures.","industrial.faq5.q":"What industrial cleaning equipment do you use?","industrial.faq5.a":"We use industrial-grade equipment including ride-on scrubbers, high-pressure washers, industrial vacuums, and specialized degreasing equipment.","office.title":"Professional","office.highlight":"Office Cleaning","office.subtitle":"Create a healthier, more productive workplace with our comprehensive office cleaning services. From daily maintenance to deep cleaning, we keep your office spotless.","office.featuresTitle":"Office Cleaning Solutions","office.featuresSubtitle":"Tailored cleaning services to keep your workspace clean, healthy, and professional.","office.feature1.title":"Daily Office Cleaning","office.feature1.desc":"Comprehensive daily cleaning including dusting, vacuuming, and sanitization to maintain a pristine workspace.","office.feature2.title":"Workstation Cleaning","office.feature2.desc":"Thorough cleaning of desks, monitors, keyboards, and personal workspaces with attention to detail.","office.feature3.title":"Break Room & Kitchen","office.feature3.desc":"Deep cleaning of kitchens, break rooms, and common areas including appliance cleaning.","office.feature4.title":"Waste Management","office.feature4.desc":"Efficient trash removal and recycling services to keep your office clean and sustainable.","office.feature5.title":"Restroom Sanitation","office.feature5.desc":"Professional restroom cleaning and sanitization with hospital-grade disinfectants.","office.feature6.title":"Floor Care","office.feature6.desc":"Carpet cleaning, hard floor maintenance, and specialized floor treatments for lasting shine.","office.faq1.q":"How often should offices be professionally cleaned?","office.faq1.a":"Most offices benefit from daily cleaning for high-traffic areas and weekly deep cleaning. We customize schedules based on your office size, foot traffic, and specific needs.","office.faq2.q":"Do you clean during or after business hours?","office.faq2.a":"We offer flexible scheduling including early morning, evening, and weekend cleaning to minimize disruption to your team. Most clients prefer after-hours service.","office.faq3.q":"What cleaning products do you use in offices?","office.faq3.a":"We use eco-friendly, low-VOC products that are safe for office environments. We can accommodate allergies and sensitivities with hypoallergenic options.","office.faq4.q":"Can you handle multi-floor office buildings?","office.faq4.a":"Absolutely. We service single offices to entire office towers. Our teams are equipped to handle any size facility efficiently.","office.faq5.q":"Do you provide cleaning supplies or should we provide them?","office.faq5.a":"We bring all necessary cleaning supplies, equipment, and products. Everything is included in our service packages.","commercial.title":"Professional","commercial.highlight":"Commercial Cleaning","commercial.subtitle":"From retail stores to healthcare facilities, we provide comprehensive commercial cleaning services that keep your business looking its best and customers coming back.","commercial.featuresTitle":"Commercial Cleaning Solutions","commercial.featuresSubtitle":"Industry-specific cleaning services tailored to your business needs.","commercial.feature1.title":"Retail Store Cleaning","commercial.feature1.desc":"Keep your retail space inviting with daily cleaning, floor maintenance, and window cleaning services.","commercial.feature2.title":"Restaurant Cleaning","commercial.feature2.desc":"Kitchen deep cleaning, dining area sanitization, and health code compliant cleaning for food service.","commercial.feature3.title":"Hospitality Cleaning","commercial.feature3.desc":"Hotel lobbies, common areas, and facility cleaning to maintain exceptional guest experiences.","commercial.feature4.title":"Healthcare Facilities","commercial.feature4.desc":"Medical-grade cleaning for clinics, dental offices, and healthcare facilities with strict protocols.","commercial.feature5.title":"Educational Facilities","commercial.feature5.desc":"Schools, daycares, and training centers cleaned to the highest standards of hygiene.","commercial.feature6.title":"Shopping Centers","commercial.feature6.desc":"Large-scale cleaning for malls, plazas, and commercial complexes with high foot traffic.","commercial.faq1.q":"What types of commercial spaces do you clean?","commercial.faq1.a":"We clean all commercial spaces including retail stores, restaurants, hotels, healthcare facilities, schools, shopping centers, gyms, and more.","commercial.faq2.q":"Do you offer specialized cleaning for healthcare facilities?","commercial.faq2.a":"Yes, we provide medical-grade cleaning services following strict infection control protocols. Our team is trained in healthcare cleaning standards.","commercial.faq3.q":"Can you clean during business hours?","commercial.faq3.a":"We offer discreet cleaning services during business hours as well as after-hours options. Our team works efficiently to minimize disruption to your customers.","commercial.faq4.q":"Do you handle high-traffic commercial areas?","commercial.faq4.a":"Absolutely. We specialize in high-traffic areas like malls, airports, and busy retail locations. We can provide multiple daily cleanings as needed.","commercial.faq5.q":"Are you insured for commercial properties?","commercial.faq5.a":"Yes, we carry comprehensive commercial insurance including general liability and property damage coverage for all commercial cleaning services.","events.title":"Professional","events.highlight":"Event Cleaning","events.subtitle":"Make your event shine from start to finish. Our event cleaning services ensure your venue is pristine before, during, and after your special occasion.","events.featuresTitle":"Event Cleaning Solutions","events.featuresSubtitle":"Comprehensive cleaning services for events of all sizes and types.","events.feature1.title":"Pre-Event Setup Cleaning","events.feature1.desc":"Thorough venue cleaning before your event to ensure a spotless first impression for your guests.","events.feature2.title":"During-Event Service","events.feature2.desc":"Discreet cleaning staff available during your event to maintain cleanliness throughout.","events.feature3.title":"Post-Event Cleanup","events.feature3.desc":"Complete venue restoration after your event, including waste removal and deep cleaning.","events.feature4.title":"Conference & Trade Shows","events.feature4.desc":"Specialized cleaning for conferences, exhibitions, and trade shows of any scale.","events.feature5.title":"Concert & Festival Cleaning","events.feature5.desc":"Large-scale cleaning services for concerts, festivals, and outdoor events.","events.feature6.title":"Same-Day Service","events.feature6.desc":"Emergency and same-day event cleaning services when you need us most.","events.faq1.q":"How far in advance should I book event cleaning?","events.faq1.a":"We recommend booking at least 1-2 weeks in advance for regular events. However, we do offer same-day and emergency services for last-minute needs.","events.faq2.q":"Do you provide cleaning staff during events?","events.faq2.a":"Yes, we can station cleaning staff throughout your event to maintain restrooms, manage waste, and handle any spills or messes discretely.","events.faq3.q":"What types of events do you handle?","events.faq3.a":"We clean for all event types including weddings, corporate galas, conferences, trade shows, concerts, festivals, private parties, and more.","events.faq4.q":"Can you handle outdoor event cleanup?","events.faq4.a":"Absolutely. We have experience with outdoor events of all sizes, including festivals, sporting events, and outdoor weddings.","events.faq5.q":"How quickly can you turn around a venue between events?","events.faq5.a":"We specialize in quick turnarounds. Depending on venue size, we can have a space event-ready within hours of the previous event ending.","specialized.title":"Professional","specialized.highlight":"Specialized Cleaning","specialized.subtitle":"From deep cleaning to biohazard remediation, our specialized cleaning services tackle the most challenging cleaning situations your facility may face.","specialized.featuresTitle":"Specialized Cleaning Solutions","specialized.featuresSubtitle":"Professional services for situations that go beyond regular cleaning.","specialized.feature1.title":"Deep Cleaning","specialized.feature1.desc":"Intensive deep cleaning services for facilities requiring thorough sanitization beyond regular cleaning.","specialized.feature2.title":"Water Damage Restoration","specialized.feature2.desc":"Emergency water extraction and restoration cleaning for flood and water damage situations.","specialized.feature3.title":"Air Duct Cleaning","specialized.feature3.desc":"Professional HVAC and air duct cleaning to improve indoor air quality.","specialized.feature4.title":"Disinfection Services","specialized.feature4.desc":"Hospital-grade disinfection using electrostatic sprayers and EPA-approved products.","specialized.feature5.title":"Post-Construction Cleaning","specialized.feature5.desc":"Detailed post-construction cleaning to remove dust, debris, and construction residue.","specialized.feature6.title":"Biohazard Cleanup","specialized.feature6.desc":"Certified biohazard remediation and cleanup services following strict safety protocols.","specialized.faq1.q":"What is specialized cleaning?","specialized.faq1.a":"Specialized cleaning includes deep cleaning, disinfection, biohazard cleanup, post-construction cleaning, and other services that go beyond regular janitorial work.","specialized.faq2.q":"When do I need specialized cleaning services?","specialized.faq2.a":"You may need specialized cleaning after construction, for biohazard situations, when dealing with mold or water damage, for deep carpet cleaning, or when preparing for inspections.","specialized.faq3.q":"Do you offer emergency specialized cleaning?","specialized.faq3.a":"Yes, we provide 24/7 emergency response for urgent specialized cleaning needs including biohazard cleanup, water damage, and other time-sensitive situations.","specialized.faq4.q":"What equipment do you use for specialized cleaning?","specialized.faq4.a":"We use professional-grade equipment including industrial extractors, HEPA filtration systems, ozone generators, electrostatic sprayers, and specialized chemicals.","specialized.faq5.q":"Are specialized cleaning services safe for occupied buildings?","specialized.faq5.a":"Many services can be performed in occupied buildings with low-VOC products. For intensive work, we recommend scheduling during off-hours.","cityService.professionalServicesIn":"Professional Services in","cityService.in":"in","cityService.getQuote":"Get a Free Quote","cityService.starsOnGoogle":"5 Stars on Google","cityService.trustedBy":"Trusted by","cityService.ourServicesIn":"Our","cityService.comprehensiveSolutions":"Comprehensive","cityService.forBusinesses":"solutions for businesses throughout","cityService.andSurrounding":"and surrounding areas.","cityService.faqTitle":"Frequently Asked Questions","cityService.faqSubtitle":"Common questions about our","cityService.readyFor":"Ready for Professional","cityService.professional":"in","cityService.ctaSubtitle":"Get a free, no-obligation quote. We'll customize a cleaning plan that fits your business and budget.","cityService.ctaButton":"Get Your Free Quote","cityService.sameDayResponse":"Same-day response guaranteed","locationTrust.title":"Trusted by","locationTrust.subtitle":"Join hundreds of businesses in","locationTrust.subtitleEnd":"who trust Simple Service for their commercial and industrial cleaning needs.","locationTrust.yearsServing":"Years Serving","locationTrust.localClients":"Local Clients","locationTrust.satisfactionRate":"Satisfaction Rate","locationTrust.googleRating":"Google Rating","locationBenefits.title":"Why Choose Simple in","locationBenefits.subtitle":"Experience the difference of working with a professional cleaning partner","city.toronto":"Toronto (GTA)","city.vancouver":"Vancouver","city.montreal":"Montreal","city.mississauga":"Mississauga","city.brampton":"Brampton","city.vaughan":"Vaughan","city.northYork":"North York","city.scarborough":"Scarborough","city.etobicoke":"Etobicoke","city.eastYork":"East York","city.york":"York","city.laval":"Laval","city.longueuil":"Longueuil","city.brossard":"Brossard","city.terrebonne":"Terrebonne","city.burnaby":"Burnaby","city.richmond":"Richmond","city.surrey":"Surrey","city.northVancouver":"North Vancouver","city.coquitlam":"Coquitlam","city.other":"Other","calculator.customCityPlaceholder":"Enter your city name","cityOffice.feature1.title":"Daily Office Maintenance","cityOffice.feature1.desc":"Comprehensive daily cleaning services to keep your office spotless and professional.","cityOffice.feature2.title":"Deep Cleaning Services","cityOffice.feature2.desc":"Thorough periodic deep cleaning for carpets, upholstery, and hard-to-reach areas.","cityOffice.feature3.title":"Flexible Scheduling","cityOffice.feature3.desc":"After-hours and weekend cleaning options to minimize disruption to your business.","cityOffice.feature4.title":"Sanitization Services","cityOffice.feature4.desc":"Hospital-grade disinfection protocols to maintain a healthy workplace environment.","cityOffice.feature5.title":"Dedicated Teams","cityOffice.feature5.desc":"Consistent cleaning teams who understand your specific office requirements.","cityOffice.feature6.title":"Eco-Friendly Products","cityOffice.feature6.desc":"Green cleaning solutions that are safe for your employees and the environment.","cityCommercial.feature1.title":"Retail Store Cleaning","cityCommercial.feature1.desc":"Keep your retail space inviting with daily cleaning and floor maintenance.","cityCommercial.feature2.title":"Restaurant Cleaning","cityCommercial.feature2.desc":"Kitchen deep cleaning and dining area sanitization meeting health codes.","cityCommercial.feature3.title":"Hospitality Cleaning","cityCommercial.feature3.desc":"Hotel lobbies and common areas for exceptional guest experiences.","cityCommercial.feature4.title":"Healthcare Facilities","cityCommercial.feature4.desc":"Medical-grade cleaning for clinics and offices with strict protocols.","cityCommercial.feature5.title":"Educational Facilities","cityCommercial.feature5.desc":"Schools and daycares cleaned to the highest standards of hygiene.","cityCommercial.feature6.title":"Shopping Centers","cityCommercial.feature6.desc":"Large-scale cleaning for malls and commercial complexes with high traffic.","cityIndustrial.feature1.title":"Factory Cleaning","cityIndustrial.feature1.desc":"Comprehensive solutions for manufacturing facilities and production areas.","cityIndustrial.feature2.title":"Warehouse Cleaning","cityIndustrial.feature2.desc":"Large-scale cleaning for warehouses and distribution centers.","cityIndustrial.feature3.title":"Heavy Equipment Areas","cityIndustrial.feature3.desc":"Specialized cleaning around heavy machinery with safety protocols.","cityIndustrial.feature4.title":"Machine Shop Cleaning","cityIndustrial.feature4.desc":"Degreasing and floor scrubbing for machine shops.","cityIndustrial.feature5.title":"Safety Compliance","cityIndustrial.feature5.desc":"Services meeting industrial safety standards and requirements.","cityIndustrial.feature6.title":"High-Pressure Cleaning","cityIndustrial.feature6.desc":"Pressure washing for floors, walls, and exterior surfaces.","cityEvent.feature1.title":"Pre-Event Cleaning","cityEvent.feature1.desc":"Thorough venue cleaning before your event for a spotless first impression.","cityEvent.feature2.title":"During-Event Service","cityEvent.feature2.desc":"Discreet cleaning staff available throughout your event.","cityEvent.feature3.title":"Post-Event Cleanup","cityEvent.feature3.desc":"Complete venue restoration after your event.","cityEvent.feature4.title":"Conferences & Trade Shows","cityEvent.feature4.desc":"Specialized cleaning for conferences and professional exhibitions.","cityEvent.feature5.title":"Concerts & Festivals","cityEvent.feature5.desc":"Large-scale cleaning services for outdoor events.","cityEvent.feature6.title":"Same-Day Service","cityEvent.feature6.desc":"Emergency cleaning services when you need them most.","citySpecialized.feature1.title":"Deep Cleaning","citySpecialized.feature1.desc":"Intensive services for facilities requiring thorough sanitization.","citySpecialized.feature2.title":"Water Damage Restoration","citySpecialized.feature2.desc":"Emergency water extraction and restoration cleaning.","citySpecialized.feature3.title":"Air Duct Cleaning","citySpecialized.feature3.desc":"Professional HVAC cleaning to improve indoor air quality.","citySpecialized.feature4.title":"Disinfection Services","citySpecialized.feature4.desc":"Hospital-grade disinfection with electrostatic sprayers.","citySpecialized.feature5.title":"Post-Construction Cleaning","citySpecialized.feature5.desc":"Detailed cleaning to remove dust and construction debris.","citySpecialized.feature6.title":"Biohazard Cleanup","citySpecialized.feature6.desc":"Certified remediation following strict safety protocols.","cityOffice.faq1.q":"What areas do you cover for office cleaning?","cityOffice.faq1.a":"We provide office cleaning services throughout the metropolitan area and surrounding regions.","cityOffice.faq2.q":"Do you offer after-hours office cleaning?","cityOffice.faq2.a":"Yes, we offer flexible scheduling including evenings, nights, and weekends to minimize disruption.","cityOffice.faq3.q":"Do you have bilingual staff?","cityOffice.faq3.a":"Yes, our team includes bilingual staff who can communicate in both French and English.","cityOffice.faq4.q":"What is included in your office cleaning services?","cityOffice.faq4.a":"Our services include dusting, vacuuming, mopping, restroom sanitization, kitchen cleaning, and window cleaning.","cityOffice.faq5.q":"How do you ensure quality in your cleaning?","cityOffice.faq5.a":"We conduct regular quality inspections, use detailed checklists, and maintain open communication with clients.","cityOffice.faq6.q":"Can you handle large office buildings?","cityOffice.faq6.a":"Absolutely. We have the team and equipment to service offices of all sizes.","cityCommercial.faq1.q":"What types of commercial spaces do you clean?","cityCommercial.faq1.a":"We clean all commercial spaces including retail stores, restaurants, hotels, healthcare facilities, schools, and shopping centers.","cityCommercial.faq2.q":"Do you offer specialized cleaning for healthcare facilities?","cityCommercial.faq2.a":"Yes, we provide medical-grade cleaning services following strict infection control protocols.","cityCommercial.faq3.q":"Can you clean during business hours?","cityCommercial.faq3.a":"We offer discreet cleaning services during business hours as well as after-hours options.","cityCommercial.faq4.q":"Do you handle high-traffic commercial areas?","cityCommercial.faq4.a":"Absolutely. We specialize in high-traffic areas and can provide multiple daily cleanings.","cityCommercial.faq5.q":"Are you insured for commercial properties?","cityCommercial.faq5.a":"Yes, we carry comprehensive commercial insurance including general liability and property damage coverage.","cityCommercial.faq6.q":"How do you ensure quality in commercial cleaning?","cityCommercial.faq6.a":"We use digital quality control systems, regular inspections, and trained supervisors.","cityIndustrial.faq1.q":"What types of industrial facilities do you clean?","cityIndustrial.faq1.a":"We clean all types of industrial facilities including factories, warehouses, distribution centers, and machine shops.","cityIndustrial.faq2.q":"Do you offer 24/7 industrial cleaning services?","cityIndustrial.faq2.a":"Yes, we offer flexible scheduling including overnight and weekend shifts.","cityIndustrial.faq3.q":"Are your cleaning methods safe for food processing facilities?","cityIndustrial.faq3.a":"Absolutely. We use food-safe, compliant cleaning products and follow strict protocols.","cityIndustrial.faq4.q":"Can you handle hazardous material cleanup?","cityIndustrial.faq4.a":"We provide specialized cleaning for facilities with hazardous materials.","cityIndustrial.faq5.q":"What industrial cleaning equipment do you use?","cityIndustrial.faq5.a":"We use industrial-grade equipment including ride-on scrubbers and high-pressure washers.","cityIndustrial.faq6.q":"How do you ensure safety during industrial cleaning?","cityIndustrial.faq6.a":"Our team follows strict safety protocols, wears appropriate PPE, and coordinates with your safety team.","cityEvent.faq1.q":"How far in advance should I book?","cityEvent.faq1.a":"We recommend booking 1-2 weeks in advance, but we also offer emergency services.","cityEvent.faq2.q":"Do you provide cleaning staff during events?","cityEvent.faq2.a":"Yes, we can station cleaning staff throughout your event.","cityEvent.faq3.q":"What types of events do you handle?","cityEvent.faq3.a":"We clean for all event types including weddings, galas, conferences, and festivals.","cityEvent.faq4.q":"Can you handle outdoor event cleanup?","cityEvent.faq4.a":"Absolutely. We have experience with outdoor events of all sizes.","cityEvent.faq5.q":"How quickly can you turn around a venue?","cityEvent.faq5.a":"We specialize in quick turnarounds depending on venue size.","citySpecialized.faq1.q":"What is specialized cleaning?","citySpecialized.faq1.a":"Specialized cleaning includes deep cleaning, disinfection, post-construction cleaning, and more.","citySpecialized.faq2.q":"When do I need specialized cleaning?","citySpecialized.faq2.a":"After construction, for water damage, for deep cleaning, or when preparing for inspections.","citySpecialized.faq3.q":"Do you offer emergency specialized cleaning?","citySpecialized.faq3.a":"Yes, we provide 24/7 emergency response for urgent needs.","citySpecialized.faq4.q":"What equipment do you use?","citySpecialized.faq4.a":"We use professional-grade equipment including industrial extractors and HEPA filtration systems.","citySpecialized.faq5.q":"Are services safe for occupied buildings?","citySpecialized.faq5.a":"Many services can be performed in occupied buildings with low-VOC products.","citySpecialized.faq6.q":"Can you provide documentation for insurance claims?","citySpecialized.faq6.a":"Yes, we provide detailed documentation, photos, and reports for insurance claims.","service.officeCleaning":"Office Cleaning","service.commercialCleaning":"Commercial Cleaning","service.industrialCleaning":"Industrial Cleaning","service.eventCleaning":"Event Cleaning","service.specializedCleaning":"Specialized Cleaning","cityOffice.subtitle":"Keep your office pristine with our professional cleaning services. From daily maintenance to deep cleaning, we ensure a healthy and productive workspace.","cityCommercial.subtitle":"From retail stores to healthcare facilities, we provide comprehensive commercial cleaning services that keep your business looking its best.","cityIndustrial.subtitle":"Keep your factory, warehouse, or manufacturing facility spotless with our specialized industrial cleaning services that meet safety standards.","cityEvent.subtitle":"Make your event shine from start to finish. Our services ensure your venue is pristine before, during, and after your special occasion.","citySpecialized.subtitle":"From deep cleaning to remediation, our specialized services tackle the most challenging cleaning situations.","pricingEducation.badge":"Pricing Guide for","pricingEducation.heroTitle":"How Commercial Cleaning Pricing Really Works in","pricingEducation.heroSubtitle":"The truth about cleaning costs that most companies won't tell you. Learn why the cheapest quote is often the most expensive mistake.","pricingEducation.getHonestQuote":"Get an Honest Quote","pricingEducation.breakdownTitle":"What Goes Into Professional Cleaning Prices","pricingEducation.breakdownSubtitle":"Understanding real costs helps you spot unsustainable quotes in","pricingEducation.labor.percent":"50-60%","pricingEducation.labor.title":"Labor Costs","pricingEducation.labor.desc":"Trained, vetted, insured cleaners earning living wages. Cheap companies cut this first—and quality suffers.","pricingEducation.supplies.percent":"10-15%","pricingEducation.supplies.title":"Supplies & Equipment","pricingEducation.supplies.desc":"Commercial-grade products and professional equipment. Bargain cleaners use watered-down solutions.","pricingEducation.insurance.percent":"8-12%","pricingEducation.insurance.title":"Insurance & Compliance","pricingEducation.insurance.desc":"Full liability coverage, WSIB, and regulatory compliance. Many cheap operators skip this entirely.","pricingEducation.training.percent":"5-8%","pricingEducation.training.title":"Training & Quality Control","pricingEducation.training.desc":"Ongoing training, inspections, and quality assurance. Cut-rate companies have none.","pricingEducation.overhead.percent":"8-10%","pricingEducation.overhead.title":"Operations & Support","pricingEducation.overhead.desc":"Management, scheduling, customer service, and backup staff. Essential for reliability.","pricingEducation.margin.percent":"5-10%","pricingEducation.margin.title":"Sustainable Profit","pricingEducation.margin.desc":"A reasonable margin ensures the company will be around next month. Razor-thin margins lead to corners cut.","pricingEducation.warningBadge":"Warning Signs","pricingEducation.whyCheapFailsTitle":"Why the Lowest Price Usually Fails","pricingEducation.whyCheapFailsSubtitle":"Real consequences we've seen from cut-rate cleaning in","pricingEducation.fail1.title":"High Turnover","pricingEducation.fail1.desc":"Underpaid workers leave constantly. You get different cleaners every visit who don't know your space.","pricingEducation.fail2.title":"Inconsistent Results","pricingEducation.fail2.desc":"Without proper training and supervision, quality varies wildly from visit to visit.","pricingEducation.fail3.title":"Rushed Work","pricingEducation.fail3.desc":"To make any profit at low rates, cleaners must rush through. Your space gets a surface wipe, not a real clean.","pricingEducation.fail4.title":"No Insurance Protection","pricingEducation.fail4.desc":"Many cheap operators are uninsured. If something breaks or someone gets hurt, you're liable.","pricingEducation.fail5.title":"Ghost Companies","pricingEducation.fail5.desc":"Low-price operators frequently disappear mid-contract, leaving you scrambling for coverage.","pricingEducation.fail6.title":"Hidden Upcharges","pricingEducation.fail6.desc":'Low quotes often exclude essentials. You end up paying more for "extras" that should be standard.',"pricingEducation.differenceBadge":"The Simple Approach","pricingEducation.differenceTitle":"Why Simple Is the Anti-Cheap Operator","pricingEducation.differenceSubtitle":"How we deliver consistent, professional results in","pricingEducation.diff1.title":"Transparent Pricing","pricingEducation.diff1.desc":"We show you exactly what's included. No hidden fees, no surprise upcharges after you sign.","pricingEducation.diff2.title":"Living Wage Commitment","pricingEducation.diff2.desc":"Our cleaners earn fair wages. Happy employees do better work and stay longer—your space benefits.","pricingEducation.diff3.title":"Consistent Teams","pricingEducation.diff3.desc":"The same trained team services your location. They know your space and your standards.","pricingEducation.diff4.title":"Full Coverage","pricingEducation.diff4.desc":"Comprehensive insurance, WSIB compliance, and bonded employees (insured against theft or damage). Your protection is guaranteed.","pricingEducation.diff5.title":"Quality Inspections","pricingEducation.diff5.desc":"Regular supervisor inspections and digital checklists ensure consistent results every visit.","pricingEducation.diff6.title":"Long-Term Partner","pricingEducation.diff6.desc":"We've been serving Canadian businesses for over a decade. We'll be here next year, and the year after.","pricingEducation.ctaTitle":"Get Honest Pricing for","pricingEducation.ctaSubtitle":"No pressure, no tricks. We'll provide a detailed quote you can actually trust—and explain exactly what goes into it.","pricingEducation.ctaButton":"Request Your Quote","pricingEducation.callUs":"Call Us","calculator.seoTitle":"Commercial Cleaning Price Calculator | Simple","calculator.seoDescription":"Estimate the cost of your commercial cleaning services. Get an instant estimate based on your space type, size, and frequency.","calculator.badge":"Instant Estimate","calculator.title":"Cleaning Price Calculator","calculator.subtitle":"Get a quick estimate for your commercial cleaning needs. Customize the options below and submit to receive an accurate quote from our team.","calculator.disclaimerTitle":"Important Disclaimer","calculator.disclaimerText":"This calculator provides only a rough estimate based on the limited information provided. Actual prices may vary significantly depending on the current condition of your space, specific cleaning requirements, accessibility, and other factors. An accurate final quote requires a thorough assessment by our team.","calculator.buildEstimate":"Build Your Estimate","calculator.buildingsLabel":"Buildings","calculator.building":"Building","calculator.addBuilding":"Add Another Building","calculator.totalSqFt":"Total","calculator.spaceTypeLabel":"Space Type","calculator.selectSpaceType":"Select space type","calculator.spaceType.office":"Office","calculator.spaceType.retail":"Retail Store","calculator.spaceType.industrial":"Industrial / Factory","calculator.spaceType.warehouse":"Warehouse / Distribution","calculator.spaceType.restaurant":"Restaurant / Commercial Kitchen","calculator.spaceType.medical":"Medical / Clinic","calculator.spaceType.school":"School / Educational","calculator.squareFootageLabel":"Square Footage","calculator.frequencyLabel":"Cleaning Frequency","calculator.selectFrequency":"Select frequency","calculator.frequency.daily":"Daily (5 days/week)","calculator.frequency.3xWeek":"3 times per week","calculator.frequency.2xWeek":"2 times per week","calculator.frequency.weekly":"Weekly","calculator.frequency.biweekly":"Bi-weekly","calculator.frequency.monthly":"Monthly","calculator.cityLabel":"City","calculator.additionalServicesLabel":"Additional Services (optional)","calculator.service.windows":"Window Cleaning","calculator.service.carpet":"Carpet Cleaning","calculator.service.floor":"Floor Care","calculator.service.disinfection":"Deep Disinfection","calculator.service.pressure":"Pressure Washing","calculator.service.postConstruction":"Post-Construction","calculator.yourEstimate":"Your Estimate","calculator.estimatedMonthly":"Estimated Monthly Cost","calculator.month":"month","calculator.year":"year","calculator.paymentMonthly":"Monthly","calculator.paymentAnnual":"Annual","calculator.save12":"-12%","calculator.perVisit":"Per Visit","calculator.visitsPerMonth":"Visits per Month","calculator.selectOptions":"Select space type and frequency to see your estimate","calculator.learnMorePricing":"Learn more about pricing in your city","calculator.getAccurateQuote":"Get an Accurate Quote","calculator.name":"Name","calculator.namePlaceholder":"Your full name","calculator.email":"Email","calculator.emailPlaceholder":"you@company.com","calculator.company":"Company","calculator.companyPlaceholder":"Your company name","calculator.city":"City","calculator.selectCity":"Select your city","calculator.submitEstimate":"Submit My Estimate","calculator.submitting":"Submitting...","calculator.error":"Error","calculator.fillRequired":"Please fill in all required fields.","calculator.successTitle":"Estimate Submitted!","calculator.successMessage":"Thank you! Our team will review your estimate and contact you shortly.","calculator.thankYouTitle":"Thank You!","calculator.thankYouMessage":"We've received your estimate request. A member of our team will contact you within 24 hours to discuss your needs and confirm exact pricing.","calculator.contactSoon":"We'll contact you within 24 business hours.","calculator.privacyNote":"We respect your privacy. Your information will never be shared.","calculator.tier.essential":"Essential","calculator.tier.essentialDesc":"Basic cleaning for standard needs","calculator.tier.essentialFeature1":"Surface cleaning of common areas","calculator.tier.essentialFeature2":"Trash removal and liner replacement","calculator.tier.essentialFeature3":"Basic restroom cleaning","calculator.tier.professional":"Professional","calculator.tier.professionalDesc":"Our most popular service","calculator.tier.professionalFeature1":"Everything in Essential","calculator.tier.professionalFeature2":"Deep cleaning of all surfaces","calculator.tier.professionalFeature3":"High-touch point disinfection","calculator.tier.professionalFeature4":"Regular quality reports","calculator.tier.premium":"Premium","calculator.tier.premiumDesc":"Comprehensive service with no compromises","calculator.tier.premiumFeature1":"Everything in Professional","calculator.tier.premiumFeature2":"Dedicated account manager","calculator.tier.premiumFeature3":"Weekly quality inspections","calculator.tier.premiumFeature4":"Priority emergency services","calculator.tier.premiumFeature5":"Premium eco-friendly products","calculator.tier.recommended":"Recommended","blog.title":"Our Blog","blog.subtitle":"Expert insights on commercial cleaning, facility management, and workplace hygiene across Canada.","blog.pageTitle":"Blog | Simple Service - Commercial Cleaning Insights","blog.pageDescription":"Expert tips, guides, and insights about commercial cleaning, office maintenance, and facility management across Canada.","blog.all":"All","blog.noPosts":"No blog posts yet. Check back soon!","blog.page":"Page","blog.of":"of","blog.backToBlog":"← Back to Blog","blog.minRead":"min read","blog.share":"Share:","blog.readyToSimplify":"Ready to simplify your cleaning?","blog.readyToSimplifyDesc":"Get a free quote and see how we can help maintain your space.","blog.bookDemo":"Book a Demo","blog.moreFromSimple":"More from Simple Service","blog.browseAll":"Browse All Articles →","blog.readMore":"Read more →","blog.postNotFound":"Post not found"}},ps=n.createContext(void 0),Gn=({children:t})=>{const[a,s]=n.useState("en"),[r,i]=n.useState(!0);n.useEffect(()=>{Hn().then(l=>{s(l),i(!1)})},[]);const o=l=>{localStorage.setItem("preferred-language",l),s(l)},f=l=>$n[a][l]||l;return r?null:e.jsx(ps.Provider,{value:{language:a,setLanguage:o,t:f},children:t})},F=()=>{const t=n.useContext(ps);if(!t)throw new Error("useLanguage must be used within a LanguageProvider");return t},Yn=1,Qn=1e6;let qt=0;function Kn(){return qt=(qt+1)%Number.MAX_SAFE_INTEGER,qt.toString()}const Nt=new Map,wa=t=>{if(Nt.has(t))return;const a=setTimeout(()=>{Nt.delete(t),Qe({type:"REMOVE_TOAST",toastId:t})},Qn);Nt.set(t,a)},Un=(t,a)=>{switch(a.type){case"ADD_TOAST":return{...t,toasts:[a.toast,...t.toasts].slice(0,Yn)};case"UPDATE_TOAST":return{...t,toasts:t.toasts.map(s=>s.id===a.toast.id?{...s,...a.toast}:s)};case"DISMISS_TOAST":{const{toastId:s}=a;return s?wa(s):t.toasts.forEach(r=>{wa(r.id)}),{...t,toasts:t.toasts.map(r=>r.id===s||s===void 0?{...r,open:!1}:r)}}case"REMOVE_TOAST":return a.toastId===void 0?{...t,toasts:[]}:{...t,toasts:t.toasts.filter(s=>s.id!==a.toastId)}}},ot=[];let lt={toasts:[]};function Qe(t){lt=Un(lt,t),ot.forEach(a=>{a(lt)})}function Jn({...t}){const a=Kn(),s=i=>Qe({type:"UPDATE_TOAST",toast:{...i,id:a}}),r=()=>Qe({type:"DISMISS_TOAST",toastId:a});return Qe({type:"ADD_TOAST",toast:{...t,id:a,open:!0,onOpenChange:i=>{i||r()}}}),{id:a,dismiss:r,update:s}}function fs(){const[t,a]=n.useState(lt);return n.useEffect(()=>(ot.push(a),()=>{const s=ot.indexOf(a);s>-1&&ot.splice(s,1)}),[t]),{...t,toast:Jn,dismiss:s=>Qe({type:"DISMISS_TOAST",toastId:s})}}var Qt="ToastProvider",[Kt,Zn,Xn]=Pr("Toast"),[gs,Xm]=Ar("Toast",[Xn]),[ei,ft]=gs(Qt),hs=t=>{const{__scopeToast:a,label:s="Notification",duration:r=5e3,swipeDirection:i="right",swipeThreshold:o=50,children:f}=t,[l,p]=n.useState(null),[u,g]=n.useState(0),x=n.useRef(!1),b=n.useRef(!1);return s.trim()||console.error(`Invalid prop \`label\` supplied to \`${Qt}\`. Expected non-empty \`string\`.`),e.jsx(Kt.Provider,{scope:a,children:e.jsx(ei,{scope:a,label:s,duration:r,swipeDirection:i,swipeThreshold:o,toastCount:u,viewport:l,onViewportChange:p,onToastAdd:n.useCallback(()=>g(m=>m+1),[]),onToastRemove:n.useCallback(()=>g(m=>m-1),[]),isFocusedToastEscapeKeyDownRef:x,isClosePausedRef:b,children:f})})};hs.displayName=Qt;var vs="ToastViewport",ti=["F8"],It="toast.viewportPause",Rt="toast.viewportResume",ys=n.forwardRef((t,a)=>{const{__scopeToast:s,hotkey:r=ti,label:i="Notifications ({hotkey})",...o}=t,f=ft(vs,s),l=Zn(s),p=n.useRef(null),u=n.useRef(null),g=n.useRef(null),x=n.useRef(null),b=Oa(a,x,f.onViewportChange),m=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),T=f.toastCount>0;n.useEffect(()=>{const h=k=>{var z;r.length!==0&&r.every(I=>k[I]||k.code===I)&&((z=x.current)==null||z.focus())};return document.addEventListener("keydown",h),()=>document.removeEventListener("keydown",h)},[r]),n.useEffect(()=>{const h=p.current,k=x.current;if(T&&h&&k){const q=()=>{if(!f.isClosePausedRef.current){const R=new CustomEvent(It);k.dispatchEvent(R),f.isClosePausedRef.current=!0}},z=()=>{if(f.isClosePausedRef.current){const R=new CustomEvent(Rt);k.dispatchEvent(R),f.isClosePausedRef.current=!1}},I=R=>{!h.contains(R.relatedTarget)&&z()},V=()=>{h.contains(document.activeElement)||z()};return h.addEventListener("focusin",q),h.addEventListener("focusout",I),h.addEventListener("pointermove",q),h.addEventListener("pointerleave",V),window.addEventListener("blur",q),window.addEventListener("focus",z),()=>{h.removeEventListener("focusin",q),h.removeEventListener("focusout",I),h.removeEventListener("pointermove",q),h.removeEventListener("pointerleave",V),window.removeEventListener("blur",q),window.removeEventListener("focus",z)}}},[T,f.isClosePausedRef]);const v=n.useCallback(({tabbingDirection:h})=>{const q=l().map(z=>{const I=z.ref.current,V=[I,...fi(I)];return h==="forwards"?V:V.reverse()});return(h==="forwards"?q.reverse():q).flat()},[l]);return n.useEffect(()=>{const h=x.current;if(h){const k=q=>{var V,R,Q;const z=q.altKey||q.ctrlKey||q.metaKey;if(q.key==="Tab"&&!z){const ae=document.activeElement,K=q.shiftKey;if(q.target===h&&K){(V=u.current)==null||V.focus();return}const N=v({tabbingDirection:K?"backwards":"forwards"}),se=N.findIndex(E=>E===ae);_t(N.slice(se+1))?q.preventDefault():K?(R=u.current)==null||R.focus():(Q=g.current)==null||Q.focus()}};return h.addEventListener("keydown",k),()=>h.removeEventListener("keydown",k)}},[l,v]),e.jsxs(Lr,{ref:p,role:"region","aria-label":i.replace("{hotkey}",m),tabIndex:-1,style:{pointerEvents:T?void 0:"none"},children:[T&&e.jsx(Mt,{ref:u,onFocusFromOutsideViewport:()=>{const h=v({tabbingDirection:"forwards"});_t(h)}}),e.jsx(Kt.Slot,{scope:s,children:e.jsx(Le.ol,{tabIndex:-1,...o,ref:b})}),T&&e.jsx(Mt,{ref:g,onFocusFromOutsideViewport:()=>{const h=v({tabbingDirection:"backwards"});_t(h)}})]})});ys.displayName=vs;var xs="ToastFocusProxy",Mt=n.forwardRef((t,a)=>{const{__scopeToast:s,onFocusFromOutsideViewport:r,...i}=t,o=ft(xs,s);return e.jsx(Ia,{"aria-hidden":!0,tabIndex:0,...i,ref:a,style:{position:"fixed"},onFocus:f=>{var u;const l=f.relatedTarget;!((u=o.viewport)!=null&&u.contains(l))&&r()}})});Mt.displayName=xs;var Ze="Toast",ai="toast.swipeStart",si="toast.swipeMove",ri="toast.swipeCancel",ni="toast.swipeEnd",bs=n.forwardRef((t,a)=>{const{forceMount:s,open:r,defaultOpen:i,onOpenChange:o,...f}=t,[l,p]=Or({prop:r,defaultProp:i??!0,onChange:o,caller:Ze});return e.jsx(Ir,{present:s||l,children:e.jsx(li,{open:l,...f,ref:a,onClose:()=>p(!1),onPause:ut(t.onPause),onResume:ut(t.onResume),onSwipeStart:me(t.onSwipeStart,u=>{u.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:me(t.onSwipeMove,u=>{const{x:g,y:x}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","move"),u.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${g}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${x}px`)}),onSwipeCancel:me(t.onSwipeCancel,u=>{u.currentTarget.setAttribute("data-swipe","cancel"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:me(t.onSwipeEnd,u=>{const{x:g,y:x}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","end"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${g}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${x}px`),p(!1)})})})});bs.displayName=Ze;var[ii,oi]=gs(Ze,{onClose(){}}),li=n.forwardRef((t,a)=>{const{__scopeToast:s,type:r="foreground",duration:i,open:o,onClose:f,onEscapeKeyDown:l,onPause:p,onResume:u,onSwipeStart:g,onSwipeMove:x,onSwipeCancel:b,onSwipeEnd:m,...T}=t,v=ft(Ze,s),[h,k]=n.useState(null),q=Oa(a,E=>k(E)),z=n.useRef(null),I=n.useRef(null),V=i||v.duration,R=n.useRef(0),Q=n.useRef(V),ae=n.useRef(0),{onToastAdd:K,onToastRemove:ie}=v,U=ut(()=>{var $;(h==null?void 0:h.contains(document.activeElement))&&(($=v.viewport)==null||$.focus()),f()}),N=n.useCallback(E=>{!E||E===1/0||(window.clearTimeout(ae.current),R.current=new Date().getTime(),ae.current=window.setTimeout(U,E))},[U]);n.useEffect(()=>{const E=v.viewport;if(E){const $=()=>{N(Q.current),u==null||u()},H=()=>{const G=new Date().getTime()-R.current;Q.current=Q.current-G,window.clearTimeout(ae.current),p==null||p()};return E.addEventListener(It,H),E.addEventListener(Rt,$),()=>{E.removeEventListener(It,H),E.removeEventListener(Rt,$)}}},[v.viewport,V,p,u,N]),n.useEffect(()=>{o&&!v.isClosePausedRef.current&&N(V)},[o,V,v.isClosePausedRef,N]),n.useEffect(()=>(K(),()=>ie()),[K,ie]);const se=n.useMemo(()=>h?Ns(h):null,[h]);return v.viewport?e.jsxs(e.Fragment,{children:[se&&e.jsx(ci,{__scopeToast:s,role:"status","aria-live":r==="foreground"?"assertive":"polite","aria-atomic":!0,children:se}),e.jsx(ii,{scope:s,onClose:U,children:es.createPortal(e.jsx(Kt.ItemSlot,{scope:s,children:e.jsx(Rr,{asChild:!0,onEscapeKeyDown:me(l,()=>{v.isFocusedToastEscapeKeyDownRef.current||U(),v.isFocusedToastEscapeKeyDownRef.current=!1}),children:e.jsx(Le.li,{role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":v.swipeDirection,...T,ref:q,style:{userSelect:"none",touchAction:"none",...t.style},onKeyDown:me(t.onKeyDown,E=>{E.key==="Escape"&&(l==null||l(E.nativeEvent),E.nativeEvent.defaultPrevented||(v.isFocusedToastEscapeKeyDownRef.current=!0,U()))}),onPointerDown:me(t.onPointerDown,E=>{E.button===0&&(z.current={x:E.clientX,y:E.clientY})}),onPointerMove:me(t.onPointerMove,E=>{if(!z.current)return;const $=E.clientX-z.current.x,H=E.clientY-z.current.y,G=!!I.current,X=["left","right"].includes(v.swipeDirection),C=["left","up"].includes(v.swipeDirection)?Math.min:Math.max,Y=X?C(0,$):0,J=X?0:C(0,H),P=E.pointerType==="touch"?10:2,L={x:Y,y:J},M={originalEvent:E,delta:L};G?(I.current=L,st(si,x,M,{discrete:!1})):ja(L,v.swipeDirection,P)?(I.current=L,st(ai,g,M,{discrete:!1}),E.target.setPointerCapture(E.pointerId)):(Math.abs($)>P||Math.abs(H)>P)&&(z.current=null)}),onPointerUp:me(t.onPointerUp,E=>{const $=I.current,H=E.target;if(H.hasPointerCapture(E.pointerId)&&H.releasePointerCapture(E.pointerId),I.current=null,z.current=null,$){const G=E.currentTarget,X={originalEvent:E,delta:$};ja($,v.swipeDirection,v.swipeThreshold)?st(ni,m,X,{discrete:!0}):st(ri,b,X,{discrete:!0}),G.addEventListener("click",C=>C.preventDefault(),{once:!0})}})})})}),v.viewport)})]}):null}),ci=t=>{const{__scopeToast:a,children:s,...r}=t,i=ft(Ze,a),[o,f]=n.useState(!1),[l,p]=n.useState(!1);return mi(()=>f(!0)),n.useEffect(()=>{const u=window.setTimeout(()=>p(!0),1e3);return()=>window.clearTimeout(u)},[]),l?null:e.jsx(Mr,{asChild:!0,children:e.jsx(Ia,{...r,children:o&&e.jsxs(e.Fragment,{children:[i.label," ",s]})})})},ui="ToastTitle",ws=n.forwardRef((t,a)=>{const{__scopeToast:s,...r}=t;return e.jsx(Le.div,{...r,ref:a})});ws.displayName=ui;var di="ToastDescription",js=n.forwardRef((t,a)=>{const{__scopeToast:s,...r}=t;return e.jsx(Le.div,{...r,ref:a})});js.displayName=di;var Es="ToastAction",Cs=n.forwardRef((t,a)=>{const{altText:s,...r}=t;return s.trim()?e.jsx(qs,{altText:s,asChild:!0,children:e.jsx(Ut,{...r,ref:a})}):(console.error(`Invalid prop \`altText\` supplied to \`${Es}\`. Expected non-empty \`string\`.`),null)});Cs.displayName=Es;var Ss="ToastClose",Ut=n.forwardRef((t,a)=>{const{__scopeToast:s,...r}=t,i=oi(Ss,s);return e.jsx(qs,{asChild:!0,children:e.jsx(Le.button,{type:"button",...r,ref:a,onClick:me(t.onClick,i.onClose)})})});Ut.displayName=Ss;var qs=n.forwardRef((t,a)=>{const{__scopeToast:s,altText:r,...i}=t;return e.jsx(Le.div,{"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0,...i,ref:a})});function Ns(t){const a=[];return Array.from(t.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&a.push(r.textContent),pi(r)){const i=r.ariaHidden||r.hidden||r.style.display==="none",o=r.dataset.radixToastAnnounceExclude==="";if(!i)if(o){const f=r.dataset.radixToastAnnounceAlt;f&&a.push(f)}else a.push(...Ns(r))}}),a}function st(t,a,s,{discrete:r}){const i=s.originalEvent.currentTarget,o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:s});a&&i.addEventListener(t,a,{once:!0}),r?Dr(i,o):i.dispatchEvent(o)}var ja=(t,a,s=0)=>{const r=Math.abs(t.x),i=Math.abs(t.y),o=r>i;return a==="left"||a==="right"?o&&r>s:!o&&i>s};function mi(t=()=>{}){const a=ut(t);Fr(()=>{let s=0,r=0;return s=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(a)),()=>{window.cancelAnimationFrame(s),window.cancelAnimationFrame(r)}},[a])}function pi(t){return t.nodeType===t.ELEMENT_NODE}function fi(t){const a=[],s=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const i=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||i?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;s.nextNode();)a.push(s.currentNode);return a}function _t(t){const a=document.activeElement;return t.some(s=>s===a?!0:(s.focus(),document.activeElement!==a))}var gi=hs,_s=ys,Ts=bs,ks=ws,zs=js,Ps=Cs,As=Ut;const Ea=t=>typeof t=="boolean"?`${t}`:t===0?"0":t,Ca=ts,Jt=(t,a)=>s=>{var r;if((a==null?void 0:a.variants)==null)return Ca(t,s==null?void 0:s.class,s==null?void 0:s.className);const{variants:i,defaultVariants:o}=a,f=Object.keys(i).map(u=>{const g=s==null?void 0:s[u],x=o==null?void 0:o[u];if(g===null)return null;const b=Ea(g)||Ea(x);return i[u][b]}),l=s&&Object.entries(s).reduce((u,g)=>{let[x,b]=g;return b===void 0||(u[x]=b),u},{}),p=a==null||(r=a.compoundVariants)===null||r===void 0?void 0:r.reduce((u,g)=>{let{class:x,className:b,...m}=g;return Object.entries(m).every(T=>{let[v,h]=T;return Array.isArray(h)?h.includes({...o,...l}[v]):{...o,...l}[v]===h})?[...u,x,b]:u},[]);return Ca(t,f,p,s==null?void 0:s.class,s==null?void 0:s.className)};/** * @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 hi=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Ls=(...t)=>t.filter((a,s,r)=>!!a&&a.trim()!==""&&r.indexOf(a)===s).join(" ").trim();/** * @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. */var vi={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** * @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 yi=n.forwardRef(({color:t="currentColor",size:a=24,strokeWidth:s=2,absoluteStrokeWidth:r,className:i="",children:o,iconNode:f,...l},p)=>n.createElement("svg",{ref:p,...vi,width:a,height:a,stroke:t,strokeWidth:r?Number(s)*24/Number(a):s,className:Ls("lucide",i),...l},[...f.map(([u,g])=>n.createElement(u,g)),...Array.isArray(o)?o:[o]]));/** * @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 j=(t,a)=>{const s=n.forwardRef(({className:r,...i},o)=>n.createElement(yi,{ref:o,iconNode:a,className:Ls(`lucide-${hi(t)}`,r),...i}));return s.displayName=`${t}`,s};/** * @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 xi=j("ArrowDown",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]);/** * @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 Oe=j("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** * @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 bi=j("ArrowUp",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);/** * @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 Os=j("Award",[["path",{d:"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526",key:"1yiouv"}],["circle",{cx:"12",cy:"8",r:"6",key:"1vp47v"}]]);/** * @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 wi=j("Beaker",[["path",{d:"M4.5 3h15",key:"c7n0jr"}],["path",{d:"M6 3v16a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V3",key:"m1uhx7"}],["path",{d:"M6 14h12",key:"4cwo0f"}]]);/** * @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 Tt=j("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** * @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 Is=j("Briefcase",[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]]);/** * @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 Zt=j("Building2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/** * @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 dt=j("Calculator",[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["line",{x1:"8",x2:"16",y1:"6",y2:"6",key:"x4nwl0"}],["line",{x1:"16",x2:"16",y1:"14",y2:"18",key:"wjye3r"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M8 18h.01",key:"lrp35t"}]]);/** * @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 ji=j("CalendarCheck",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"m9 16 2 2 4-4",key:"19s6y9"}]]);/** * @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 Ei=j("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);/** * @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 Xe=j("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** * @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 Ci=j("ChartColumn",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]]);/** * @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=j("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** * @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 Rs=j("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** * @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 Ms=j("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** * @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 Si=j("CircleArrowUp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16 12-4-4-4 4",key:"177agl"}],["path",{d:"M12 16V8",key:"1sbj14"}]]);/** * @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 mt=j("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** * @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 Fs=j("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** * @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 Ds=j("ClipboardCheck",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"m9 14 2 2 4-4",key:"df797q"}]]);/** * @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 Ke=j("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** * @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 qi=j("DollarSign",[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]]);/** * @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 Xt=j("Factory",[["path",{d:"M2 20a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8l-7 5V8l-7 5V4a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z",key:"159hny"}],["path",{d:"M17 18h1",key:"uldtlt"}],["path",{d:"M12 18h1",key:"s9uhes"}],["path",{d:"M7 18h1",key:"1neino"}]]);/** * @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 Vs=j("FileCheck",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m9 15 2 2 4-4",key:"1grp1n"}]]);/** * @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 Ni=j("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/** * @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 _i=j("GraduationCap",[["path",{d:"M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z",key:"j76jl0"}],["path",{d:"M22 10v6",key:"1lu8f3"}],["path",{d:"M6 12.5V16a6 3 0 0 0 12 0v-3.5",key:"1r8lef"}]]);/** * @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 gt=j("Headphones",[["path",{d:"M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3",key:"1xhozi"}]]);/** * @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 Ti=j("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** * @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 ea=j("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** * @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 ki=j("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);/** * @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 zi=j("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);/** * @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 ht=j("MapPin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);/** * @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 Pi=j("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** * @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 Ai=j("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/** * @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 Li=j("PartyPopper",[["path",{d:"M5.8 11.3 2 22l10.7-3.79",key:"gwxi1d"}],["path",{d:"M4 3h.01",key:"1vcuye"}],["path",{d:"M22 8h.01",key:"1mrtc2"}],["path",{d:"M15 2h.01",key:"1cjtqr"}],["path",{d:"M22 20h.01",key:"1mrys2"}],["path",{d:"m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10",key:"hbicv8"}],["path",{d:"m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17",key:"1i94pl"}],["path",{d:"m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7",key:"1cofks"}],["path",{d:"M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z",key:"4kbmks"}]]);/** * @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 ta=j("Phone",[["path",{d:"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z",key:"foiqr5"}]]);/** * @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 Oi=j("Quote",[["path",{d:"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"rib7q0"}],["path",{d:"M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"1ymkrd"}]]);/** * @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 Ii=j("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** * @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 Ri=j("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** * @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 Ue=j("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** * @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 Mi=j("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** * @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 Fi=j("ShoppingBag",[["path",{d:"M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z",key:"hou9p0"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M16 10a4 4 0 0 1-8 0",key:"1ltviw"}]]);/** * @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 Bs=j("Sparkle",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}]]);/** * @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 Di=j("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** * @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 pt=j("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** * @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 Vi=j("UserPlus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);/** * @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 aa=j("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** * @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 Bi=j("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** * @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 Ws=j("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),sa="-",Wi=t=>{const a=$i(t),{conflictingClassGroups:s,conflictingClassGroupModifiers:r}=t;return{getClassGroupId:f=>{const l=f.split(sa);return l[0]===""&&l.length!==1&&l.shift(),Hs(l,a)||Hi(f)},getConflictingClassGroupIds:(f,l)=>{const p=s[f]||[];return l&&r[f]?[...p,...r[f]]:p}}},Hs=(t,a)=>{var f;if(t.length===0)return a.classGroupId;const s=t[0],r=a.nextPart.get(s),i=r?Hs(t.slice(1),r):void 0;if(i)return i;if(a.validators.length===0)return;const o=t.join(sa);return(f=a.validators.find(({validator:l})=>l(o)))==null?void 0:f.classGroupId},Sa=/^\[(.+)\]$/,Hi=t=>{if(Sa.test(t)){const a=Sa.exec(t)[1],s=a==null?void 0:a.substring(0,a.indexOf(":"));if(s)return"arbitrary.."+s}},$i=t=>{const{theme:a,prefix:s}=t,r={nextPart:new Map,validators:[]};return Yi(Object.entries(t.classGroups),s).forEach(([o,f])=>{Dt(f,r,o,a)}),r},Dt=(t,a,s,r)=>{t.forEach(i=>{if(typeof i=="string"){const o=i===""?a:qa(a,i);o.classGroupId=s;return}if(typeof i=="function"){if(Gi(i)){Dt(i(r),a,s,r);return}a.validators.push({validator:i,classGroupId:s});return}Object.entries(i).forEach(([o,f])=>{Dt(f,qa(a,o),s,r)})})},qa=(t,a)=>{let s=t;return a.split(sa).forEach(r=>{s.nextPart.has(r)||s.nextPart.set(r,{nextPart:new Map,validators:[]}),s=s.nextPart.get(r)}),s},Gi=t=>t.isThemeGetter,Yi=(t,a)=>a?t.map(([s,r])=>{const i=r.map(o=>typeof o=="string"?a+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([f,l])=>[a+f,l])):o);return[s,i]}):t,Qi=t=>{if(t<1)return{get:()=>{},set:()=>{}};let a=0,s=new Map,r=new Map;const i=(o,f)=>{s.set(o,f),a++,a>t&&(a=0,r=s,s=new Map)};return{get(o){let f=s.get(o);if(f!==void 0)return f;if((f=r.get(o))!==void 0)return i(o,f),f},set(o,f){s.has(o)?s.set(o,f):i(o,f)}}},$s="!",Ki=t=>{const{separator:a,experimentalParseClassName:s}=t,r=a.length===1,i=a[0],o=a.length,f=l=>{const p=[];let u=0,g=0,x;for(let h=0;hg?x-g:void 0;return{modifiers:p,hasImportantModifier:m,baseClassName:T,maybePostfixModifierPosition:v}};return s?l=>s({className:l,parseClassName:f}):f},Ui=t=>{if(t.length<=1)return t;const a=[];let s=[];return t.forEach(r=>{r[0]==="["?(a.push(...s.sort(),r),s=[]):s.push(r)}),a.push(...s.sort()),a},Ji=t=>({cache:Qi(t.cacheSize),parseClassName:Ki(t),...Wi(t)}),Zi=/\s+/,Xi=(t,a)=>{const{parseClassName:s,getClassGroupId:r,getConflictingClassGroupIds:i}=a,o=[],f=t.trim().split(Zi);let l="";for(let p=f.length-1;p>=0;p-=1){const u=f[p],{modifiers:g,hasImportantModifier:x,baseClassName:b,maybePostfixModifierPosition:m}=s(u);let T=!!m,v=r(T?b.substring(0,m):b);if(!v){if(!T){l=u+(l.length>0?" "+l:l);continue}if(v=r(b),!v){l=u+(l.length>0?" "+l:l);continue}T=!1}const h=Ui(g).join(":"),k=x?h+$s:h,q=k+v;if(o.includes(q))continue;o.push(q);const z=i(v,T);for(let I=0;I0?" "+l:l)}return l};function eo(){let t=0,a,s,r="";for(;t{if(typeof t=="string")return t;let a,s="";for(let r=0;rx(g),t());return s=Ji(u),r=s.cache.get,i=s.cache.set,o=l,l(p)}function l(p){const u=r(p);if(u)return u;const g=Xi(p,s);return i(p,g),g}return function(){return o(eo.apply(null,arguments))}}const D=t=>{const a=s=>s[t]||[];return a.isThemeGetter=!0,a},Ys=/^\[(?:([a-z-]+):)?(.+)\]$/i,ao=/^\d+\/\d+$/,so=new Set(["px","full","screen"]),ro=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,no=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,io=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,oo=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,lo=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,fe=t=>Ae(t)||so.has(t)||ao.test(t),ye=t=>Ie(t,"length",vo),Ae=t=>!!t&&!Number.isNaN(Number(t)),kt=t=>Ie(t,"number",Ae),We=t=>!!t&&Number.isInteger(Number(t)),co=t=>t.endsWith("%")&&Ae(t.slice(0,-1)),_=t=>Ys.test(t),xe=t=>ro.test(t),uo=new Set(["length","size","percentage"]),mo=t=>Ie(t,uo,Qs),po=t=>Ie(t,"position",Qs),fo=new Set(["image","url"]),go=t=>Ie(t,fo,xo),ho=t=>Ie(t,"",yo),He=()=>!0,Ie=(t,a,s)=>{const r=Ys.exec(t);return r?r[1]?typeof a=="string"?r[1]===a:a.has(r[1]):s(r[2]):!1},vo=t=>no.test(t)&&!io.test(t),Qs=()=>!1,yo=t=>oo.test(t),xo=t=>lo.test(t),bo=()=>{const t=D("colors"),a=D("spacing"),s=D("blur"),r=D("brightness"),i=D("borderColor"),o=D("borderRadius"),f=D("borderSpacing"),l=D("borderWidth"),p=D("contrast"),u=D("grayscale"),g=D("hueRotate"),x=D("invert"),b=D("gap"),m=D("gradientColorStops"),T=D("gradientColorStopPositions"),v=D("inset"),h=D("margin"),k=D("opacity"),q=D("padding"),z=D("saturate"),I=D("scale"),V=D("sepia"),R=D("skew"),Q=D("space"),ae=D("translate"),K=()=>["auto","contain","none"],ie=()=>["auto","hidden","clip","visible","scroll"],U=()=>["auto",_,a],N=()=>[_,a],se=()=>["",fe,ye],E=()=>["auto",Ae,_],$=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],H=()=>["solid","dashed","dotted","double","none"],G=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],C=()=>["","0",_],Y=()=>["auto","avoid","all","avoid-page","page","left","right","column"],J=()=>[Ae,_];return{cacheSize:500,separator:":",theme:{colors:[He],spacing:[fe,ye],blur:["none","",xe,_],brightness:J(),borderColor:[t],borderRadius:["none","","full",xe,_],borderSpacing:N(),borderWidth:se(),contrast:J(),grayscale:C(),hueRotate:J(),invert:C(),gap:N(),gradientColorStops:[t],gradientColorStopPositions:[co,ye],inset:U(),margin:U(),opacity:J(),padding:N(),saturate:J(),scale:J(),sepia:C(),skew:J(),space:N(),translate:N()},classGroups:{aspect:[{aspect:["auto","square","video",_]}],container:["container"],columns:[{columns:[xe]}],"break-after":[{"break-after":Y()}],"break-before":[{"break-before":Y()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...$(),_]}],overflow:[{overflow:ie()}],"overflow-x":[{"overflow-x":ie()}],"overflow-y":[{"overflow-y":ie()}],overscroll:[{overscroll:K()}],"overscroll-x":[{"overscroll-x":K()}],"overscroll-y":[{"overscroll-y":K()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[v]}],"inset-x":[{"inset-x":[v]}],"inset-y":[{"inset-y":[v]}],start:[{start:[v]}],end:[{end:[v]}],top:[{top:[v]}],right:[{right:[v]}],bottom:[{bottom:[v]}],left:[{left:[v]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",We,_]}],basis:[{basis:U()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",_]}],grow:[{grow:C()}],shrink:[{shrink:C()}],order:[{order:["first","last","none",We,_]}],"grid-cols":[{"grid-cols":[He]}],"col-start-end":[{col:["auto",{span:["full",We,_]},_]}],"col-start":[{"col-start":E()}],"col-end":[{"col-end":E()}],"grid-rows":[{"grid-rows":[He]}],"row-start-end":[{row:["auto",{span:[We,_]},_]}],"row-start":[{"row-start":E()}],"row-end":[{"row-end":E()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",_]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",_]}],gap:[{gap:[b]}],"gap-x":[{"gap-x":[b]}],"gap-y":[{"gap-y":[b]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[q]}],px:[{px:[q]}],py:[{py:[q]}],ps:[{ps:[q]}],pe:[{pe:[q]}],pt:[{pt:[q]}],pr:[{pr:[q]}],pb:[{pb:[q]}],pl:[{pl:[q]}],m:[{m:[h]}],mx:[{mx:[h]}],my:[{my:[h]}],ms:[{ms:[h]}],me:[{me:[h]}],mt:[{mt:[h]}],mr:[{mr:[h]}],mb:[{mb:[h]}],ml:[{ml:[h]}],"space-x":[{"space-x":[Q]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[Q]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",_,a]}],"min-w":[{"min-w":[_,a,"min","max","fit"]}],"max-w":[{"max-w":[_,a,"none","full","min","max","fit","prose",{screen:[xe]},xe]}],h:[{h:[_,a,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[_,a,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[_,a,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[_,a,"auto","min","max","fit"]}],"font-size":[{text:["base",xe,ye]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",kt]}],"font-family":[{font:[He]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",_]}],"line-clamp":[{"line-clamp":["none",Ae,kt]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",fe,_]}],"list-image":[{"list-image":["none",_]}],"list-style-type":[{list:["none","disc","decimal",_]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[t]}],"placeholder-opacity":[{"placeholder-opacity":[k]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[t]}],"text-opacity":[{"text-opacity":[k]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...H(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",fe,ye]}],"underline-offset":[{"underline-offset":["auto",fe,_]}],"text-decoration-color":[{decoration:[t]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:N()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",_]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",_]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[k]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...$(),po]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",mo]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},go]}],"bg-color":[{bg:[t]}],"gradient-from-pos":[{from:[T]}],"gradient-via-pos":[{via:[T]}],"gradient-to-pos":[{to:[T]}],"gradient-from":[{from:[m]}],"gradient-via":[{via:[m]}],"gradient-to":[{to:[m]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[l]}],"border-w-x":[{"border-x":[l]}],"border-w-y":[{"border-y":[l]}],"border-w-s":[{"border-s":[l]}],"border-w-e":[{"border-e":[l]}],"border-w-t":[{"border-t":[l]}],"border-w-r":[{"border-r":[l]}],"border-w-b":[{"border-b":[l]}],"border-w-l":[{"border-l":[l]}],"border-opacity":[{"border-opacity":[k]}],"border-style":[{border:[...H(),"hidden"]}],"divide-x":[{"divide-x":[l]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[l]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[k]}],"divide-style":[{divide:H()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...H()]}],"outline-offset":[{"outline-offset":[fe,_]}],"outline-w":[{outline:[fe,ye]}],"outline-color":[{outline:[t]}],"ring-w":[{ring:se()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[t]}],"ring-opacity":[{"ring-opacity":[k]}],"ring-offset-w":[{"ring-offset":[fe,ye]}],"ring-offset-color":[{"ring-offset":[t]}],shadow:[{shadow:["","inner","none",xe,ho]}],"shadow-color":[{shadow:[He]}],opacity:[{opacity:[k]}],"mix-blend":[{"mix-blend":[...G(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":G()}],filter:[{filter:["","none"]}],blur:[{blur:[s]}],brightness:[{brightness:[r]}],contrast:[{contrast:[p]}],"drop-shadow":[{"drop-shadow":["","none",xe,_]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[g]}],invert:[{invert:[x]}],saturate:[{saturate:[z]}],sepia:[{sepia:[V]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[s]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[p]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[g]}],"backdrop-invert":[{"backdrop-invert":[x]}],"backdrop-opacity":[{"backdrop-opacity":[k]}],"backdrop-saturate":[{"backdrop-saturate":[z]}],"backdrop-sepia":[{"backdrop-sepia":[V]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[f]}],"border-spacing-x":[{"border-spacing-x":[f]}],"border-spacing-y":[{"border-spacing-y":[f]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",_]}],duration:[{duration:J()}],ease:[{ease:["linear","in","out","in-out",_]}],delay:[{delay:J()}],animate:[{animate:["none","spin","ping","pulse","bounce",_]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[I]}],"scale-x":[{"scale-x":[I]}],"scale-y":[{"scale-y":[I]}],rotate:[{rotate:[We,_]}],"translate-x":[{"translate-x":[ae]}],"translate-y":[{"translate-y":[ae]}],"skew-x":[{"skew-x":[R]}],"skew-y":[{"skew-y":[R]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",_]}],accent:[{accent:["auto",t]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",_]}],"caret-color":[{caret:[t]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":N()}],"scroll-mx":[{"scroll-mx":N()}],"scroll-my":[{"scroll-my":N()}],"scroll-ms":[{"scroll-ms":N()}],"scroll-me":[{"scroll-me":N()}],"scroll-mt":[{"scroll-mt":N()}],"scroll-mr":[{"scroll-mr":N()}],"scroll-mb":[{"scroll-mb":N()}],"scroll-ml":[{"scroll-ml":N()}],"scroll-p":[{"scroll-p":N()}],"scroll-px":[{"scroll-px":N()}],"scroll-py":[{"scroll-py":N()}],"scroll-ps":[{"scroll-ps":N()}],"scroll-pe":[{"scroll-pe":N()}],"scroll-pt":[{"scroll-pt":N()}],"scroll-pr":[{"scroll-pr":N()}],"scroll-pb":[{"scroll-pb":N()}],"scroll-pl":[{"scroll-pl":N()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",_]}],fill:[{fill:[t,"none"]}],"stroke-w":[{stroke:[fe,ye,kt]}],stroke:[{stroke:[t,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},wo=to(bo);function A(...t){return wo(ts(t))}const jo=gi,Ks=n.forwardRef(({className:t,...a},s)=>e.jsx(_s,{ref:s,className:A("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",t),...a}));Ks.displayName=_s.displayName;const Eo=Jt("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),Us=n.forwardRef(({className:t,variant:a,...s},r)=>e.jsx(Ts,{ref:r,className:A(Eo({variant:a}),t),...s}));Us.displayName=Ts.displayName;const Co=n.forwardRef(({className:t,...a},s)=>e.jsx(Ps,{ref:s,className:A("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",t),...a}));Co.displayName=Ps.displayName;const Js=n.forwardRef(({className:t,...a},s)=>e.jsx(As,{ref:s,className:A("absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",t),"toast-close":"",...a,children:e.jsx(Ws,{className:"h-4 w-4"})}));Js.displayName=As.displayName;const Zs=n.forwardRef(({className:t,...a},s)=>e.jsx(ks,{ref:s,className:A("text-sm font-semibold",t),...a}));Zs.displayName=ks.displayName;const Xs=n.forwardRef(({className:t,...a},s)=>e.jsx(zs,{ref:s,className:A("text-sm opacity-90",t),...a}));Xs.displayName=zs.displayName;function So(){const{toasts:t}=fs();return e.jsxs(jo,{children:[t.map(function({id:a,title:s,description:r,action:i,...o}){return e.jsxs(Us,{...o,children:[e.jsxs("div",{className:"grid gap-1",children:[s&&e.jsx(Zs,{children:s}),r&&e.jsx(Xs,{children:r})]}),i,e.jsx(Js,{})]},a)}),e.jsx(Ks,{})]})}var qo=t=>{switch(t){case"success":return To;case"info":return zo;case"warning":return ko;case"error":return Po;default:return null}},No=Array(12).fill(0),_o=({visible:t,className:a})=>y.createElement("div",{className:["sonner-loading-wrapper",a].filter(Boolean).join(" "),"data-visible":t},y.createElement("div",{className:"sonner-spinner"},No.map((s,r)=>y.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${r}`})))),To=y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},y.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),ko=y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},y.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),zo=y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},y.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),Po=y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},y.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),Ao=y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},y.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),y.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),Lo=()=>{let[t,a]=y.useState(document.hidden);return y.useEffect(()=>{let s=()=>{a(document.hidden)};return document.addEventListener("visibilitychange",s),()=>window.removeEventListener("visibilitychange",s)},[]),t},Vt=1,Oo=class{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{let a=this.subscribers.indexOf(t);this.subscribers.splice(a,1)}),this.publish=t=>{this.subscribers.forEach(a=>a(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var a;let{message:s,...r}=t,i=typeof(t==null?void 0:t.id)=="number"||((a=t.id)==null?void 0:a.length)>0?t.id:Vt++,o=this.toasts.find(l=>l.id===i),f=t.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(i)&&this.dismissedToasts.delete(i),o?this.toasts=this.toasts.map(l=>l.id===i?(this.publish({...l,...t,id:i,title:s}),{...l,...t,id:i,dismissible:f,title:s}):l):this.addToast({title:s,...r,dismissible:f,id:i}),i},this.dismiss=t=>(this.dismissedToasts.add(t),t||this.toasts.forEach(a=>{this.subscribers.forEach(s=>s({id:a.id,dismiss:!0}))}),this.subscribers.forEach(a=>a({id:t,dismiss:!0})),t),this.message=(t,a)=>this.create({...a,message:t}),this.error=(t,a)=>this.create({...a,message:t,type:"error"}),this.success=(t,a)=>this.create({...a,type:"success",message:t}),this.info=(t,a)=>this.create({...a,type:"info",message:t}),this.warning=(t,a)=>this.create({...a,type:"warning",message:t}),this.loading=(t,a)=>this.create({...a,type:"loading",message:t}),this.promise=(t,a)=>{if(!a)return;let s;a.loading!==void 0&&(s=this.create({...a,promise:t,type:"loading",message:a.loading,description:typeof a.description!="function"?a.description:void 0}));let r=t instanceof Promise?t:t(),i=s!==void 0,o,f=r.then(async p=>{if(o=["resolve",p],y.isValidElement(p))i=!1,this.create({id:s,type:"default",message:p});else if(Ro(p)&&!p.ok){i=!1;let u=typeof a.error=="function"?await a.error(`HTTP error! status: ${p.status}`):a.error,g=typeof a.description=="function"?await a.description(`HTTP error! status: ${p.status}`):a.description;this.create({id:s,type:"error",message:u,description:g})}else if(a.success!==void 0){i=!1;let u=typeof a.success=="function"?await a.success(p):a.success,g=typeof a.description=="function"?await a.description(p):a.description;this.create({id:s,type:"success",message:u,description:g})}}).catch(async p=>{if(o=["reject",p],a.error!==void 0){i=!1;let u=typeof a.error=="function"?await a.error(p):a.error,g=typeof a.description=="function"?await a.description(p):a.description;this.create({id:s,type:"error",message:u,description:g})}}).finally(()=>{var p;i&&(this.dismiss(s),s=void 0),(p=a.finally)==null||p.call(a)}),l=()=>new Promise((p,u)=>f.then(()=>o[0]==="reject"?u(o[1]):p(o[1])).catch(u));return typeof s!="string"&&typeof s!="number"?{unwrap:l}:Object.assign(s,{unwrap:l})},this.custom=(t,a)=>{let s=(a==null?void 0:a.id)||Vt++;return this.create({jsx:t(s),id:s,...a}),s},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},te=new Oo,Io=(t,a)=>{let s=(a==null?void 0:a.id)||Vt++;return te.addToast({title:t,...a,id:s}),s},Ro=t=>t&&typeof t=="object"&&"ok"in t&&typeof t.ok=="boolean"&&"status"in t&&typeof t.status=="number",Mo=Io,Fo=()=>te.toasts,Do=()=>te.getActiveToasts();Object.assign(Mo,{success:te.success,info:te.info,warning:te.warning,error:te.error,custom:te.custom,message:te.message,promise:te.promise,dismiss:te.dismiss,loading:te.loading},{getHistory:Fo,getToasts:Do});function Vo(t,{insertAt:a}={}){if(typeof document>"u")return;let s=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",a==="top"&&s.firstChild?s.insertBefore(r,s.firstChild):s.appendChild(r),r.styleSheet?r.styleSheet.cssText=t:r.appendChild(document.createTextNode(t))}Vo(`:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted="true"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted="true"]){transform:none}}:where([data-sonner-toaster][data-x-position="right"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position="left"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)} `);function rt(t){return t.label!==void 0}var Bo=3,Wo="32px",Ho="16px",Na=4e3,$o=356,Go=14,Yo=20,Qo=200;function ue(...t){return t.filter(Boolean).join(" ")}function Ko(t){let[a,s]=t.split("-"),r=[];return a&&r.push(a),s&&r.push(s),r}var Uo=t=>{var a,s,r,i,o,f,l,p,u,g,x;let{invert:b,toast:m,unstyled:T,interacting:v,setHeights:h,visibleToasts:k,heights:q,index:z,toasts:I,expanded:V,removeToast:R,defaultRichColors:Q,closeButton:ae,style:K,cancelButtonStyle:ie,actionButtonStyle:U,className:N="",descriptionClassName:se="",duration:E,position:$,gap:H,loadingIcon:G,expandByDefault:X,classNames:C,icons:Y,closeButtonAriaLabel:J="Close toast",pauseWhenPageIsHidden:P}=t,[L,M]=y.useState(null),[ee,Ce]=y.useState(null),[W,vt]=y.useState(!1),[Re,et]=y.useState(!1),[Me,yt]=y.useState(!1),[oa,vr]=y.useState(!1),[yr,la]=y.useState(!1),[xr,xt]=y.useState(0),[br,ca]=y.useState(0),Fe=y.useRef(m.duration||E||Na),ua=y.useRef(null),be=y.useRef(null),wr=z===0,jr=z+1<=k,re=m.type,Se=m.dismissible!==!1,Er=m.className||"",Cr=m.descriptionClassName||"",tt=y.useMemo(()=>q.findIndex(S=>S.toastId===m.id)||0,[q,m.id]),Sr=y.useMemo(()=>{var S;return(S=m.closeButton)!=null?S:ae},[m.closeButton,ae]),da=y.useMemo(()=>m.duration||E||Na,[m.duration,E]),bt=y.useRef(0),qe=y.useRef(0),ma=y.useRef(0),Ne=y.useRef(null),[qr,Nr]=$.split("-"),pa=y.useMemo(()=>q.reduce((S,O,B)=>B>=tt?S:S+O.height,0),[q,tt]),fa=Lo(),_r=m.invert||b,wt=re==="loading";qe.current=y.useMemo(()=>tt*H+pa,[tt,pa]),y.useEffect(()=>{Fe.current=da},[da]),y.useEffect(()=>{vt(!0)},[]),y.useEffect(()=>{let S=be.current;if(S){let O=S.getBoundingClientRect().height;return ca(O),h(B=>[{toastId:m.id,height:O,position:m.position},...B]),()=>h(B=>B.filter(oe=>oe.toastId!==m.id))}},[h,m.id]),y.useLayoutEffect(()=>{if(!W)return;let S=be.current,O=S.style.height;S.style.height="auto";let B=S.getBoundingClientRect().height;S.style.height=O,ca(B),h(oe=>oe.find(le=>le.toastId===m.id)?oe.map(le=>le.toastId===m.id?{...le,height:B}:le):[{toastId:m.id,height:B,position:m.position},...oe])},[W,m.title,m.description,h,m.id]);let ge=y.useCallback(()=>{et(!0),xt(qe.current),h(S=>S.filter(O=>O.toastId!==m.id)),setTimeout(()=>{R(m)},Qo)},[m,R,h,qe]);y.useEffect(()=>{if(m.promise&&re==="loading"||m.duration===1/0||m.type==="loading")return;let S;return V||v||P&&fa?(()=>{if(ma.current{var O;(O=m.onAutoClose)==null||O.call(m,m),ge()},Fe.current)),()=>clearTimeout(S)},[V,v,m,re,P,fa,ge]),y.useEffect(()=>{m.delete&&ge()},[ge,m.delete]);function Tr(){var S,O,B;return Y!=null&&Y.loading?y.createElement("div",{className:ue(C==null?void 0:C.loader,(S=m==null?void 0:m.classNames)==null?void 0:S.loader,"sonner-loader"),"data-visible":re==="loading"},Y.loading):G?y.createElement("div",{className:ue(C==null?void 0:C.loader,(O=m==null?void 0:m.classNames)==null?void 0:O.loader,"sonner-loader"),"data-visible":re==="loading"},G):y.createElement(_o,{className:ue(C==null?void 0:C.loader,(B=m==null?void 0:m.classNames)==null?void 0:B.loader),visible:re==="loading"})}return y.createElement("li",{tabIndex:0,ref:be,className:ue(N,Er,C==null?void 0:C.toast,(a=m==null?void 0:m.classNames)==null?void 0:a.toast,C==null?void 0:C.default,C==null?void 0:C[re],(s=m==null?void 0:m.classNames)==null?void 0:s[re]),"data-sonner-toast":"","data-rich-colors":(r=m.richColors)!=null?r:Q,"data-styled":!(m.jsx||m.unstyled||T),"data-mounted":W,"data-promise":!!m.promise,"data-swiped":yr,"data-removed":Re,"data-visible":jr,"data-y-position":qr,"data-x-position":Nr,"data-index":z,"data-front":wr,"data-swiping":Me,"data-dismissible":Se,"data-type":re,"data-invert":_r,"data-swipe-out":oa,"data-swipe-direction":ee,"data-expanded":!!(V||X&&W),style:{"--index":z,"--toasts-before":z,"--z-index":I.length-z,"--offset":`${Re?xr:qe.current}px`,"--initial-height":X?"auto":`${br}px`,...K,...m.style},onDragEnd:()=>{yt(!1),M(null),Ne.current=null},onPointerDown:S=>{wt||!Se||(ua.current=new Date,xt(qe.current),S.target.setPointerCapture(S.pointerId),S.target.tagName!=="BUTTON"&&(yt(!0),Ne.current={x:S.clientX,y:S.clientY}))},onPointerUp:()=>{var S,O,B,oe;if(oa||!Se)return;Ne.current=null;let le=Number(((S=be.current)==null?void 0:S.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),he=Number(((O=be.current)==null?void 0:O.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),we=new Date().getTime()-((B=ua.current)==null?void 0:B.getTime()),ce=L==="x"?le:he,ve=Math.abs(ce)/we;if(Math.abs(ce)>=Yo||ve>.11){xt(qe.current),(oe=m.onDismiss)==null||oe.call(m,m),Ce(L==="x"?le>0?"right":"left":he>0?"down":"up"),ge(),vr(!0),la(!1);return}yt(!1),M(null)},onPointerMove:S=>{var O,B,oe,le;if(!Ne.current||!Se||((O=window.getSelection())==null?void 0:O.toString().length)>0)return;let he=S.clientY-Ne.current.y,we=S.clientX-Ne.current.x,ce=(B=t.swipeDirections)!=null?B:Ko($);!L&&(Math.abs(we)>1||Math.abs(he)>1)&&M(Math.abs(we)>Math.abs(he)?"x":"y");let ve={x:0,y:0};L==="y"?(ce.includes("top")||ce.includes("bottom"))&&(ce.includes("top")&&he<0||ce.includes("bottom")&&he>0)&&(ve.y=he):L==="x"&&(ce.includes("left")||ce.includes("right"))&&(ce.includes("left")&&we<0||ce.includes("right")&&we>0)&&(ve.x=we),(Math.abs(ve.x)>0||Math.abs(ve.y)>0)&&la(!0),(oe=be.current)==null||oe.style.setProperty("--swipe-amount-x",`${ve.x}px`),(le=be.current)==null||le.style.setProperty("--swipe-amount-y",`${ve.y}px`)}},Sr&&!m.jsx?y.createElement("button",{"aria-label":J,"data-disabled":wt,"data-close-button":!0,onClick:wt||!Se?()=>{}:()=>{var S;ge(),(S=m.onDismiss)==null||S.call(m,m)},className:ue(C==null?void 0:C.closeButton,(i=m==null?void 0:m.classNames)==null?void 0:i.closeButton)},(o=Y==null?void 0:Y.close)!=null?o:Ao):null,m.jsx||n.isValidElement(m.title)?m.jsx?m.jsx:typeof m.title=="function"?m.title():m.title:y.createElement(y.Fragment,null,re||m.icon||m.promise?y.createElement("div",{"data-icon":"",className:ue(C==null?void 0:C.icon,(f=m==null?void 0:m.classNames)==null?void 0:f.icon)},m.promise||m.type==="loading"&&!m.icon?m.icon||Tr():null,m.type!=="loading"?m.icon||(Y==null?void 0:Y[re])||qo(re):null):null,y.createElement("div",{"data-content":"",className:ue(C==null?void 0:C.content,(l=m==null?void 0:m.classNames)==null?void 0:l.content)},y.createElement("div",{"data-title":"",className:ue(C==null?void 0:C.title,(p=m==null?void 0:m.classNames)==null?void 0:p.title)},typeof m.title=="function"?m.title():m.title),m.description?y.createElement("div",{"data-description":"",className:ue(se,Cr,C==null?void 0:C.description,(u=m==null?void 0:m.classNames)==null?void 0:u.description)},typeof m.description=="function"?m.description():m.description):null),n.isValidElement(m.cancel)?m.cancel:m.cancel&&rt(m.cancel)?y.createElement("button",{"data-button":!0,"data-cancel":!0,style:m.cancelButtonStyle||ie,onClick:S=>{var O,B;rt(m.cancel)&&Se&&((B=(O=m.cancel).onClick)==null||B.call(O,S),ge())},className:ue(C==null?void 0:C.cancelButton,(g=m==null?void 0:m.classNames)==null?void 0:g.cancelButton)},m.cancel.label):null,n.isValidElement(m.action)?m.action:m.action&&rt(m.action)?y.createElement("button",{"data-button":!0,"data-action":!0,style:m.actionButtonStyle||U,onClick:S=>{var O,B;rt(m.action)&&((B=(O=m.action).onClick)==null||B.call(O,S),!S.defaultPrevented&&ge())},className:ue(C==null?void 0:C.actionButton,(x=m==null?void 0:m.classNames)==null?void 0:x.actionButton)},m.action.label):null))};function _a(){if(typeof window>"u"||typeof document>"u")return"ltr";let t=document.documentElement.getAttribute("dir");return t==="auto"||!t?window.getComputedStyle(document.documentElement).direction:t}function Jo(t,a){let s={};return[t,a].forEach((r,i)=>{let o=i===1,f=o?"--mobile-offset":"--offset",l=o?Ho:Wo;function p(u){["top","right","bottom","left"].forEach(g=>{s[`${f}-${g}`]=typeof u=="number"?`${u}px`:u})}typeof r=="number"||typeof r=="string"?p(r):typeof r=="object"?["top","right","bottom","left"].forEach(u=>{r[u]===void 0?s[`${f}-${u}`]=l:s[`${f}-${u}`]=typeof r[u]=="number"?`${r[u]}px`:r[u]}):p(l)}),s}var Zo=n.forwardRef(function(t,a){let{invert:s,position:r="bottom-right",hotkey:i=["altKey","KeyT"],expand:o,closeButton:f,className:l,offset:p,mobileOffset:u,theme:g="light",richColors:x,duration:b,style:m,visibleToasts:T=Bo,toastOptions:v,dir:h=_a(),gap:k=Go,loadingIcon:q,icons:z,containerAriaLabel:I="Notifications",pauseWhenPageIsHidden:V}=t,[R,Q]=y.useState([]),ae=y.useMemo(()=>Array.from(new Set([r].concat(R.filter(P=>P.position).map(P=>P.position)))),[R,r]),[K,ie]=y.useState([]),[U,N]=y.useState(!1),[se,E]=y.useState(!1),[$,H]=y.useState(g!=="system"?g:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),G=y.useRef(null),X=i.join("+").replace(/Key/g,"").replace(/Digit/g,""),C=y.useRef(null),Y=y.useRef(!1),J=y.useCallback(P=>{Q(L=>{var M;return(M=L.find(ee=>ee.id===P.id))!=null&&M.delete||te.dismiss(P.id),L.filter(({id:ee})=>ee!==P.id)})},[]);return y.useEffect(()=>te.subscribe(P=>{if(P.dismiss){Q(L=>L.map(M=>M.id===P.id?{...M,delete:!0}:M));return}setTimeout(()=>{tn.flushSync(()=>{Q(L=>{let M=L.findIndex(ee=>ee.id===P.id);return M!==-1?[...L.slice(0,M),{...L[M],...P},...L.slice(M+1)]:[P,...L]})})})}),[]),y.useEffect(()=>{if(g!=="system"){H(g);return}if(g==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?H("dark"):H("light")),typeof window>"u")return;let P=window.matchMedia("(prefers-color-scheme: dark)");try{P.addEventListener("change",({matches:L})=>{H(L?"dark":"light")})}catch{P.addListener(({matches:M})=>{try{H(M?"dark":"light")}catch(ee){console.error(ee)}})}},[g]),y.useEffect(()=>{R.length<=1&&N(!1)},[R]),y.useEffect(()=>{let P=L=>{var M,ee;i.every(Ce=>L[Ce]||L.code===Ce)&&(N(!0),(M=G.current)==null||M.focus()),L.code==="Escape"&&(document.activeElement===G.current||(ee=G.current)!=null&&ee.contains(document.activeElement))&&N(!1)};return document.addEventListener("keydown",P),()=>document.removeEventListener("keydown",P)},[i]),y.useEffect(()=>{if(G.current)return()=>{C.current&&(C.current.focus({preventScroll:!0}),C.current=null,Y.current=!1)}},[G.current]),y.createElement("section",{ref:a,"aria-label":`${I} ${X}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},ae.map((P,L)=>{var M;let[ee,Ce]=P.split("-");return R.length?y.createElement("ol",{key:P,dir:h==="auto"?_a():h,tabIndex:-1,ref:G,className:l,"data-sonner-toaster":!0,"data-theme":$,"data-y-position":ee,"data-lifted":U&&R.length>1&&!o,"data-x-position":Ce,style:{"--front-toast-height":`${((M=K[0])==null?void 0:M.height)||0}px`,"--width":`${$o}px`,"--gap":`${k}px`,...m,...Jo(p,u)},onBlur:W=>{Y.current&&!W.currentTarget.contains(W.relatedTarget)&&(Y.current=!1,C.current&&(C.current.focus({preventScroll:!0}),C.current=null))},onFocus:W=>{W.target instanceof HTMLElement&&W.target.dataset.dismissible==="false"||Y.current||(Y.current=!0,C.current=W.relatedTarget)},onMouseEnter:()=>N(!0),onMouseMove:()=>N(!0),onMouseLeave:()=>{se||N(!1)},onDragEnd:()=>N(!1),onPointerDown:W=>{W.target instanceof HTMLElement&&W.target.dataset.dismissible==="false"||E(!0)},onPointerUp:()=>E(!1)},R.filter(W=>!W.position&&L===0||W.position===P).map((W,vt)=>{var Re,et;return y.createElement(Uo,{key:W.id,icons:z,index:vt,toast:W,defaultRichColors:x,duration:(Re=v==null?void 0:v.duration)!=null?Re:b,className:v==null?void 0:v.className,descriptionClassName:v==null?void 0:v.descriptionClassName,invert:s,visibleToasts:T,closeButton:(et=v==null?void 0:v.closeButton)!=null?et:f,interacting:se,position:P,style:v==null?void 0:v.style,unstyled:v==null?void 0:v.unstyled,classNames:v==null?void 0:v.classNames,cancelButtonStyle:v==null?void 0:v.cancelButtonStyle,actionButtonStyle:v==null?void 0:v.actionButtonStyle,removeToast:J,toasts:R.filter(Me=>Me.position==W.position),heights:K.filter(Me=>Me.position==W.position),setHeights:ie,expandByDefault:o,gap:k,loadingIcon:q,expanded:U,pauseWhenPageIsHidden:V,swipeDirections:t.swipeDirections})})):null}))});const Xo=({...t})=>e.jsx(Zo,{theme:"light",className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...t}),er=Vr,el=Br,tl=Wr,tr=n.forwardRef(({className:t,sideOffset:a=4,...s},r)=>e.jsx(Ra,{ref:r,sideOffset:a,className:A("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",t),...s}));tr.displayName=Ra.displayName;function al(){const{pathname:t}=Je();return n.useEffect(()=>{window.scrollTo(0,0)},[t]),null}function sl(){const[t,a]=n.useState(!1);return n.useEffect(()=>{const s=()=>a(window.scrollY>400);return window.addEventListener("scroll",s,{passive:!0}),()=>window.removeEventListener("scroll",s)},[]),t?e.jsx("button",{onClick:()=>window.scrollTo({top:0,behavior:"smooth"}),className:"fixed bottom-24 right-6 z-50 p-3 rounded-full bg-primary text-primary-foreground shadow-lg hover:bg-primary/90 transition-all duration-300 opacity-90 hover:opacity-100","aria-label":"Back to top",children:e.jsx(bi,{className:"h-5 w-5"})}):null}const rl="AW-17661936303",ra={contact:"dXSHCO7TjcMcEK-F7-VB",quote:"DvpUCJrpwN8cEK-F7-VB",phoneCall:"OjwNCJ3pwN8cEK-F7-VB"};function na(t){typeof window>"u"||window.gtag&&window.gtag("event","conversion",{send_to:`${rl}/${t}`})}function nl(){na(ra.contact)}function ep(){na(ra.quote)}function ia(){typeof window>"u"||!window.matchMedia("(max-width: 767px)").matches||na(ra.phoneCall)}const il=()=>e.jsxs("a",{href:"tel:5142376303",onClick:ia,"aria-label":"Call 514-237-6303",className:"fixed bottom-6 left-6 z-50 group flex items-center justify-center gap-2 bg-foreground text-background rounded-full shadow-lg hover:shadow-xl hover:scale-105 transition-all duration-300 h-12 w-12 sm:w-auto sm:h-auto sm:pl-3 sm:pr-4 sm:py-3 sm:justify-start",children:[e.jsxs("span",{className:"relative flex items-center justify-center",children:[e.jsx("span",{className:"absolute inline-flex h-full w-full rounded-full bg-foreground/40 animate-ping"}),e.jsx(ta,{className:"h-5 w-5 relative"})]}),e.jsx("span",{className:"text-sm font-medium whitespace-nowrap hidden sm:inline",children:"514-237-6303"})]}),ol="https://ssimple.ca",ll=[{path:"/office-cleaning",en:"Office Cleaning",fr:"Nettoyage de bureaux"},{path:"/commercial-cleaning",en:"Commercial Cleaning",fr:"Nettoyage commercial"},{path:"/industrial-cleaning",en:"Industrial Cleaning",fr:"Nettoyage industriel"},{path:"/specialized-cleaning",en:"Specialized Cleaning",fr:"Nettoyage spécialisé"},{path:"/events-cleaning",en:"Event Cleaning",fr:"Nettoyage d'événements"},{path:"/pricing-calculator",en:"Pricing Calculator",fr:"Calculateur de prix"},{path:"/about",en:"About Us",fr:"À propos"},{path:"/contact",en:"Contact Us",fr:"Nous joindre"},{path:"/careers",en:"Careers",fr:"Carrières"},{path:"/blog",en:"Blog",fr:"Blogue"}];function cl(){const{language:t}=F(),a=t==="fr",s={"@context":"https://schema.org","@type":"SiteNavigationElement",name:a?"Navigation principale":"Main Navigation",inLanguage:a?"fr-CA":"en-CA",hasPart:ll.map((r,i)=>({"@type":"SiteNavigationElement",position:i+1,name:a?r.fr:r.en,url:`${ol}${r.path}${a?"?lang=fr":""}`,inLanguage:a?"fr-CA":"en-CA"}))};return e.jsx(Yt,{children:e.jsx("script",{type:"application/ld+json",children:JSON.stringify(s)})})}const ar=[{slug:"chomedey",name:"Chomedey",parent:"Laval",parentFr:"Laval",region:"Chomedey",introEn:"Chomedey is one of the busiest commercial sectors in Laval, stretching along Boulevard Saint-Martin Ouest, Boulevard Curé-Labelle and the Autoroute 13 corridor. We clean the office suites, medical clinics and retail units concentrated around Carrefour Laval and the Notre-Dame commercial strip, with schedules built around business hours.",introFr:"Chomedey est l'un des secteurs commerciaux les plus actifs de Laval, le long du boulevard Saint-Martin Ouest, du boulevard Curé-Labelle et du corridor de l'autoroute 13. Nous entretenons les bureaux, cliniques et commerces concentrés autour du Carrefour Laval et de l'artère Notre-Dame, selon des horaires adaptés à vos heures d'ouverture.",areas:["Boulevard Saint-Martin Ouest","Boulevard Curé-Labelle","Autoroute 13 corridor","Notre-Dame"],lat:45.5478,lng:-73.7593},{slug:"sainte-rose",name:"Sainte-Rose",parent:"Laval",parentFr:"Laval",region:"Sainte-Rose",introEn:"Sainte-Rose sits in north Laval along Boulevard Sainte-Rose and the Rivière des Mille Îles. Our crews service the professional offices, dental and veterinary clinics and boutique retail of the Vieux-Sainte-Rose village core, as well as the commercial plazas near Boulevard Curé-Labelle and Autoroute 440.",introFr:"Sainte-Rose se situe dans le nord de Laval, le long du boulevard Sainte-Rose et de la rivière des Mille Îles. Nos équipes desservent les bureaux professionnels, cliniques dentaires et vétérinaires et commerces du noyau villageois du Vieux-Sainte-Rose, ainsi que les centres commerciaux près du boulevard Curé-Labelle et de l'autoroute 440.",areas:["Vieux-Sainte-Rose","Boulevard Sainte-Rose","Boulevard Curé-Labelle","Autoroute 440"],lat:45.6156,lng:-73.7847},{slug:"vimont",name:"Vimont",parent:"Laval",parentFr:"Laval",region:"Vimont",introEn:"Vimont, in eastern Laval, mixes residential streets with light-industrial and warehouse units near Boulevard des Laurentides and Autoroute 440. We handle warehouse floors, loading areas, service counters and office space for businesses around the Vimont commuter train station and Boulevard Saint-Martin Est.",introFr:"Vimont, dans l'est de Laval, combine rues résidentielles et unités industrielles légères près du boulevard des Laurentides et de l'autoroute 440. Nous entretenons planchers d'entrepôt, aires de chargement, comptoirs de service et bureaux pour les entreprises près de la gare de Vimont et du boulevard Saint-Martin Est.",areas:["Boulevard des Laurentides","Vimont station area","Boulevard Saint-Martin Est","Autoroute 440"],lat:45.6011,lng:-73.7113},{slug:"laval-des-rapides",name:"Laval-des-Rapides",parent:"Laval",parentFr:"Laval",region:"Laval-des-Rapides",introEn:"Laval-des-Rapides is the borough closest to Montreal, anchored by the Cartier and De la Concorde metro stations and Boulevard Le Corbusier. We clean multi-tenant office buildings, clinics and ground-floor retail along Boulevard des Laurentides and Boulevard Cartier Ouest, including early-morning and evening rotations.",introFr:"Laval-des-Rapides est le secteur le plus proche de Montréal, structuré autour des stations de métro Cartier et De la Concorde et du boulevard Le Corbusier. Nous entretenons immeubles de bureaux multi-locataires, cliniques et commerces au rez-de-chaussée le long des boulevards des Laurentides et Cartier Ouest, avec des rotations tôt le matin ou en soirée.",areas:["Cartier metro area","Boulevard Le Corbusier","Boulevard Cartier Ouest","Boulevard des Laurentides"],lat:45.5606,lng:-73.7005},{slug:"duvernay",name:"Duvernay",parent:"Laval",parentFr:"Laval",region:"Duvernay",introEn:"Duvernay covers east Laval between Autoroute 19, Autoroute 440 and the Rivière des Prairies. Our teams support offices, clinics and service businesses along Boulevard Lévesque Est and Boulevard des Laurentides, plus the commercial and light-industrial units near the Autoroute 25 interchange.",introFr:"Duvernay couvre l'est de Laval entre les autoroutes 19 et 440 et la rivière des Prairies. Nos équipes desservent bureaux, cliniques et entreprises de services le long du boulevard Lévesque Est et du boulevard des Laurentides, ainsi que les unités commerciales et industrielles légères près de l'échangeur de l'autoroute 25.",areas:["Boulevard Lévesque Est","Autoroute 19 corridor","Autoroute 25 interchange","Saint-François border"],lat:45.6289,lng:-73.6564},{slug:"fabreville",name:"Fabreville",parent:"Laval",parentFr:"Laval",region:"Fabreville",introEn:"Fabreville stretches across northwest Laval along Boulevard Sainte-Rose and Boulevard Curé-Labelle. We clean neighbourhood commercial plazas, professional offices, daycares and clinics in the sector, coordinating access with property managers so work happens outside customer hours.",introFr:"Fabreville s'étend dans le nord-ouest de Laval, le long du boulevard Sainte-Rose et du boulevard Curé-Labelle. Nous entretenons centres commerciaux de quartier, bureaux professionnels, garderies et cliniques du secteur, en coordonnant les accès avec les gestionnaires d'immeubles hors des heures d'affluence.",areas:["Boulevard Curé-Labelle","Boulevard Sainte-Rose","Sainte-Rose border","Sainte-Dorothée border"],lat:45.6094,lng:-73.8321},{slug:"sainte-dorothee",name:"Sainte-Dorothée",parent:"Laval",parentFr:"Laval",region:"Sainte-Dorothée",introEn:"Sainte-Dorothée occupies southwest Laval near the Autoroute 13 and Autoroute 20 crossings toward Île Bizard and the West Island. We clean greenhouses, garden centres, offices and light-industrial units along Boulevard Saint-Martin Ouest and Chemin du Bord-de-l'Eau, including seasonal deep-clean cycles.",introFr:"Sainte-Dorothée occupe le sud-ouest de Laval, près des liens des autoroutes 13 et 20 vers l'Île Bizard et l'Ouest-de-l'Île. Nous entretenons serres, centres de jardin, bureaux et unités industrielles légères le long du boulevard Saint-Martin Ouest et du chemin du Bord-de-l'Eau, incluant des cycles de grand nettoyage saisonniers.",areas:["Boulevard Saint-Martin Ouest","Chemin du Bord-de-l'Eau","Autoroute 13 corridor","Laval-sur-le-Lac"],lat:45.5297,lng:-73.8156},{slug:"auteuil",name:"Auteuil",parent:"Laval",parentFr:"Laval",region:"Auteuil",introEn:"Auteuil sits in northern Laval between Boulevard des Laurentides and Boulevard des Mille-Îles. Our crews cover local commercial strips, professional suites, schools and clinics in the sector, with flexible frequencies from daily janitorial to weekly maintenance.",introFr:"Auteuil se situe dans le nord de Laval, entre le boulevard des Laurentides et le boulevard des Mille-Îles. Nos équipes couvrent les artères commerciales locales, bureaux professionnels, écoles et cliniques du secteur, avec des fréquences flexibles, du quotidien à l'hebdomadaire.",areas:["Boulevard des Laurentides","Boulevard des Mille-Îles","Vimont border","Sainte-Rose border"],lat:45.6389,lng:-73.7419},{slug:"pont-viau",name:"Pont-Viau",parent:"Laval",parentFr:"Laval",region:"Pont-Viau",introEn:"Pont-Viau is the dense southern edge of Laval facing Montreal across the Rivière des Prairies, near Cartier metro and the Pont Viau and Pont Papineau-Leblanc crossings. We service street-front retail, clinics, restaurants and small offices along Boulevard des Laurentides and Boulevard Lévesque Est.",introFr:"Pont-Viau constitue la pointe sud dense de Laval, face à Montréal de l'autre côté de la rivière des Prairies, près du métro Cartier et des ponts Viau et Papineau-Leblanc. Nous desservons commerces sur rue, cliniques, restaurants et petits bureaux le long du boulevard des Laurentides et du boulevard Lévesque Est.",areas:["Boulevard des Laurentides","Boulevard Lévesque Est","Cartier metro area","Pont Viau"],lat:45.5719,lng:-73.6836},{slug:"vieux-longueuil",name:"Vieux-Longueuil",parent:"Longueuil",parentFr:"Longueuil",region:"Vieux-Longueuil",introEn:"Vieux-Longueuil is the historic core of Longueuil around Chemin de Chambly, Rue Saint-Charles Ouest and the Longueuil–Université-de-Sherbrooke metro terminus. We clean professional offices, clinics, restaurants and municipal-adjacent buildings, with bilingual supervisors and CNESST-compliant procedures.",introFr:"Le Vieux-Longueuil est le noyau historique de Longueuil, autour du chemin de Chambly, de la rue Saint-Charles Ouest et du terminus de métro Longueuil–Université-de-Sherbrooke. Nous entretenons bureaux professionnels, cliniques, restaurants et immeubles institutionnels, avec superviseurs bilingues et procédures conformes à la CNESST.",areas:["Rue Saint-Charles Ouest","Chemin de Chambly","Longueuil metro terminus","Place Longueuil"],lat:45.5372,lng:-73.5089},{slug:"saint-hubert",name:"Saint-Hubert",parent:"Longueuil",parentFr:"Longueuil",region:"Saint-Hubert",introEn:"Saint-Hubert is the borough built around Montréal Saint-Hubert Airport and the aerospace and light-industrial parks along Boulevard Clairevue and Chemin de la Savane. We handle hangar and warehouse floors, workshop areas and administrative offices, including shutdown and shift-based schedules.",introFr:"Saint-Hubert s'organise autour de l'aéroport Montréal Saint-Hubert et des parcs aérospatiaux et industriels légers du boulevard Clairevue et du chemin de la Savane. Nous entretenons planchers de hangars et d'entrepôts, ateliers et bureaux administratifs, incluant horaires par quarts et arrêts de production.",areas:["Montréal Saint-Hubert Airport","Boulevard Clairevue","Chemin de la Savane","Boulevard Cousineau"],lat:45.4939,lng:-73.4181},{slug:"le-moyne",name:"Le Moyne",parent:"Longueuil",parentFr:"Longueuil",region:"Le Moyne",introEn:"Le Moyne is a compact sector of Longueuil bordered by Greenfield Park and the Route 132 corridor near the Saint Lawrence. We clean small offices, service shops and community facilities here, with predictable routes and supervisor-reviewed checklists on every visit.",introFr:"Le Moyne est un secteur compact de Longueuil bordé par Greenfield Park et le corridor de la route 132, près du fleuve Saint-Laurent. Nous entretenons petits bureaux, commerces de service et installations communautaires, avec des tournées prévisibles et des listes de vérification révisées par un superviseur.",areas:["Route 132 corridor","Greenfield Park border","Saint-Lambert border","Boulevard Taschereau"],lat:45.4989,lng:-73.4931},{slug:"greenfield-park",name:"Greenfield Park",parent:"Longueuil",parentFr:"Longueuil",region:"Greenfield Park",introEn:"Greenfield Park is a historically anglophone borough of Longueuil along Boulevard Taschereau and Boulevard Churchill, close to Charles-Le Moyne Hospital. We service medical and dental clinics, professional offices and retail units, with fully bilingual crews and documented cleaning records.",introFr:"Greenfield Park est un secteur historiquement anglophone de Longueuil, le long des boulevards Taschereau et Churchill, près de l'Hôpital Charles-Le Moyne. Nous desservons cliniques médicales et dentaires, bureaux professionnels et commerces, avec des équipes entièrement bilingues et des registres d'entretien documentés.",areas:["Boulevard Taschereau","Boulevard Churchill","Charles-Le Moyne Hospital area","Saint-Hubert border"],lat:45.4894,lng:-73.4692},{slug:"plateau",name:"Plateau-Mont-Royal",parent:"Montreal",parentFr:"Montréal",region:"Plateau-Mont-Royal",introEn:"Le Plateau-Mont-Royal is one of Montreal's densest commercial boroughs, built around Boulevard Saint-Laurent, Avenue du Mont-Royal and Rue Saint-Denis. We clean creative studios, restaurants, boutiques and upper-floor offices where access is tight and after-hours scheduling matters.",introFr:"Le Plateau-Mont-Royal est l'un des arrondissements commerciaux les plus denses de Montréal, autour du boulevard Saint-Laurent, de l'avenue du Mont-Royal et de la rue Saint-Denis. Nous entretenons studios créatifs, restaurants, boutiques et bureaux à l'étage, où l'accès est restreint et les horaires en soirée essentiels.",areas:["Boulevard Saint-Laurent","Avenue du Mont-Royal","Rue Saint-Denis","Mile End"],lat:45.523,lng:-73.583},{slug:"ville-marie",name:"Ville-Marie (Downtown)",parent:"Montreal",parentFr:"Montréal",region:"Ville-Marie",introEn:"Ville-Marie covers downtown Montreal, from Boulevard René-Lévesque and Rue Sainte-Catherine to Old Montreal and the Quartier des Spectacles. We service multi-tenant office towers, law and finance suites, ground-floor retail and hospitality spaces, with night crews and freight-elevator coordination.",introFr:"Ville-Marie couvre le centre-ville de Montréal, du boulevard René-Lévesque et de la rue Sainte-Catherine jusqu'au Vieux-Montréal et au Quartier des Spectacles. Nous desservons tours de bureaux multi-locataires, cabinets juridiques et financiers, commerces au rez-de-chaussée et hôtellerie, avec équipes de nuit et coordination des ascenseurs de service.",areas:["Boulevard René-Lévesque","Rue Sainte-Catherine","Old Montreal","Quartier des Spectacles"],lat:45.5088,lng:-73.5617},{slug:"sud-ouest",name:"Le Sud-Ouest",parent:"Montreal",parentFr:"Montréal",region:"Le Sud-Ouest",introEn:"Le Sud-Ouest includes Griffintown, Saint-Henri and Pointe-Saint-Charles along the Lachine Canal. We clean converted-loft offices, tech and design studios, cafés and light-industrial conversions in the sector, working around mixed residential-commercial buildings and limited loading access.",introFr:"Le Sud-Ouest comprend Griffintown, Saint-Henri et Pointe-Saint-Charles, le long du canal de Lachine. Nous entretenons bureaux en lofts convertis, studios technos et de design, cafés et anciens bâtiments industriels reconvertis, en tenant compte des immeubles mixtes et des accès de chargement limités.",areas:["Griffintown","Saint-Henri","Pointe-Saint-Charles","Lachine Canal"],lat:45.4772,lng:-73.5789},{slug:"rosemont",name:"Rosemont–La Petite-Patrie",parent:"Montreal",parentFr:"Montréal",region:"Rosemont–La Petite-Patrie",introEn:"Rosemont–La Petite-Patrie runs along Rue Beaubien, Boulevard Saint-Laurent and Rue Masson, with the Jean-Talon Market and Little Italy at its western edge. We clean clinics, professional offices, food-service counters and neighbourhood retail with food-safe products and documented rotations.",introFr:"Rosemont–La Petite-Patrie s'étend le long de la rue Beaubien, du boulevard Saint-Laurent et de la rue Masson, avec le marché Jean-Talon et la Petite Italie à sa limite ouest. Nous entretenons cliniques, bureaux professionnels, comptoirs alimentaires et commerces de quartier avec des produits sécuritaires et des rotations documentées.",areas:["Rue Beaubien","Rue Masson","Jean-Talon Market","Little Italy"],lat:45.545,lng:-73.58},{slug:"villeray",name:"Villeray–Saint-Michel–Parc-Extension",parent:"Montreal",parentFr:"Montréal",region:"Villeray–Saint-Michel–Parc-Extension",introEn:"This borough spans Rue Jean-Talon, Rue Jarry and Boulevard Saint-Michel, including the Parc-Extension commercial strips and the industrial blocks near the Saint-Michel Environmental Complex. We handle offices, community centres, clinics and warehouse-type units across the sector.",introFr:"Cet arrondissement s'étend le long de la rue Jean-Talon, de la rue Jarry et du boulevard Saint-Michel, incluant les artères commerciales de Parc-Extension et les îlots industriels près du Complexe environnemental de Saint-Michel. Nous entretenons bureaux, centres communautaires, cliniques et entrepôts du secteur.",areas:["Rue Jean-Talon","Rue Jarry","Parc-Extension","Boulevard Saint-Michel"],lat:45.5406,lng:-73.6231},{slug:"verdun",name:"Verdun",parent:"Montreal",parentFr:"Montréal",region:"Verdun",introEn:"Verdun runs along Rue Wellington and Boulevard LaSalle beside the Saint Lawrence, and includes Île-des-Sœurs. We service clinics, professional offices, retail on Wellington and office buildings on Île-des-Sœurs, with bilingual crews and access coordination through building management.",introFr:"Verdun s'étend le long de la rue Wellington et du boulevard LaSalle, au bord du fleuve Saint-Laurent, et comprend l'Île-des-Sœurs. Nous desservons cliniques, bureaux professionnels, commerces de la rue Wellington et immeubles de bureaux de l'Île-des-Sœurs, avec équipes bilingues et accès coordonné avec la gestion d'immeuble.",areas:["Rue Wellington","Île-des-Sœurs","Boulevard LaSalle","De l'Église metro area"],lat:45.4581,lng:-73.5673},{slug:"saint-laurent",name:"Saint-Laurent",parent:"Montreal",parentFr:"Montréal",region:"Saint-Laurent",introEn:"Saint-Laurent holds one of the largest industrial and aerospace employment zones in Quebec, along Boulevard Thimens, Chemin Saint-François and the Autoroute 40 corridor near Technoparc Montréal. We clean production floors, warehouses, labs and corporate offices on shift-friendly schedules.",introFr:"Saint-Laurent abrite l'une des plus grandes zones industrielles et aérospatiales du Québec, le long du boulevard Thimens, du chemin Saint-François et du corridor de l'autoroute 40, près du Technoparc Montréal. Nous entretenons planchers de production, entrepôts, laboratoires et bureaux corporatifs selon vos quarts de travail.",areas:["Technoparc Montréal","Boulevard Thimens","Chemin Saint-François","Autoroute 40 corridor"],lat:45.5039,lng:-73.6764},{slug:"anjou",name:"Anjou",parent:"Montreal",parentFr:"Montréal",region:"Anjou",introEn:"Anjou combines the Galeries d'Anjou retail hub with a large industrial park bounded by Autoroute 40 and Autoroute 25. We service warehouses, distribution units, showrooms and administrative offices, including loading docks and high-traffic entrances through winter.",introFr:"Anjou combine le pôle commercial des Galeries d'Anjou et un vaste parc industriel délimité par les autoroutes 40 et 25. Nous desservons entrepôts, centres de distribution, salles de montre et bureaux administratifs, incluant quais de chargement et entrées à fort achalandage en hiver.",areas:["Galeries d'Anjou","Anjou industrial park","Autoroute 40","Autoroute 25"],lat:45.6142,lng:-73.5539},{slug:"lachine",name:"Lachine",parent:"Montreal",parentFr:"Montréal",region:"Lachine",introEn:"Lachine sits at the west end of the Lachine Canal next to Montréal-Trudeau Airport and the Autoroute 20 corridor. We clean manufacturing floors, warehouses, transport and logistics offices, plus the retail and clinics along Rue Notre-Dame and Boulevard Saint-Joseph.",introFr:"Lachine se trouve à l'extrémité ouest du canal de Lachine, près de l'aéroport Montréal-Trudeau et du corridor de l'autoroute 20. Nous entretenons planchers de fabrication, entrepôts, bureaux de transport et logistique, ainsi que commerces et cliniques des rues Notre-Dame et Saint-Joseph.",areas:["Lachine industrial sector","Rue Notre-Dame","Boulevard Saint-Joseph","Autoroute 20 corridor"],lat:45.4394,lng:-73.6764},{slug:"lasalle",name:"LaSalle",parent:"Montreal",parentFr:"Montréal",region:"LaSalle",introEn:"LaSalle stretches along Boulevard Newman and Rue Airlie in southwest Montreal, with commercial plazas, light-industrial units and riverside offices near Boulevard LaSalle. We provide janitorial routes, floor care and washroom programs suited to steady daily foot traffic.",introFr:"LaSalle s'étend le long du boulevard Newman et de la rue Airlie, dans le sud-ouest de Montréal, avec centres commerciaux, unités industrielles légères et bureaux riverains près du boulevard LaSalle. Nous offrons tournées d'entretien, soin des planchers et programmes de salles de bain adaptés à un achalandage quotidien constant.",areas:["Boulevard Newman","Rue Airlie","Boulevard LaSalle","Angrignon sector"],lat:45.4269,lng:-73.6403},{slug:"ahuntsic",name:"Ahuntsic-Cartierville",parent:"Montreal",parentFr:"Montréal",region:"Ahuntsic-Cartierville",introEn:"Ahuntsic-Cartierville runs from Boulevard Henri-Bourassa and Rue Fleury to the Marché Central retail area and the Autoroute 15 corridor. We clean medical clinics, professional suites, schools and retail spaces, with bilingual staff and timestamped photo documentation.",introFr:"Ahuntsic-Cartierville s'étend du boulevard Henri-Bourassa et de la rue Fleury jusqu'au secteur commercial du Marché Central et au corridor de l'autoroute 15. Nous entretenons cliniques médicales, bureaux professionnels, écoles et commerces, avec personnel bilingue et photos horodatées.",areas:["Rue Fleury","Boulevard Henri-Bourassa","Marché Central","Autoroute 15 corridor"],lat:45.5539,lng:-73.6597},{slug:"mercier",name:"Mercier–Hochelaga-Maisonneuve",parent:"Montreal",parentFr:"Montréal",region:"Mercier–Hochelaga-Maisonneuve",introEn:"Mercier–Hochelaga-Maisonneuve spans Rue Ontario Est, Rue Sainte-Catherine Est and the Olympic Park district, with industrial blocks toward the Port of Montreal. We service offices, workshops, community facilities and food-service spaces, scheduling around production and public hours.",introFr:"Mercier–Hochelaga-Maisonneuve s'étend le long des rues Ontario Est et Sainte-Catherine Est et du secteur du Parc olympique, avec des îlots industriels vers le port de Montréal. Nous desservons bureaux, ateliers, installations communautaires et espaces de restauration, en planifiant selon vos heures de production et d'ouverture.",areas:["Rue Ontario Est","Olympic Park district","Rue Sainte-Catherine Est","Port of Montreal sector"],lat:45.5589,lng:-73.5286}],tp=ar.reduce((t,a)=>(t[a.slug]=a,t),{}),ul=Jt("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium 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 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),Z=n.forwardRef(({className:t,variant:a,size:s,asChild:r=!1,...i},o)=>{const f=r?Hr:"button";return e.jsx(f,{className:A(ul({variant:a,size:s,className:t})),ref:o,...i})});Z.displayName="Button";const dl=()=>{const{language:t,setLanguage:a}=F();return e.jsxs("div",{className:"flex gap-0.5 lg:gap-2 items-center",children:[e.jsx(Z,{variant:"ghost",size:"sm",onClick:()=>a("fr"),className:`text-[10px] lg:text-sm px-1.5 lg:px-3 h-6 lg:h-8 min-w-0 transition-colors ${t==="fr"?"text-foreground font-medium":"text-silver-muted hover:text-silver"}`,children:"FR"}),e.jsx("span",{className:"text-silver-muted text-[10px] lg:text-sm",children:"|"}),e.jsx(Z,{variant:"ghost",size:"sm",onClick:()=>a("en"),className:`text-[10px] lg:text-sm px-1.5 lg:px-3 h-6 lg:h-8 min-w-0 transition-colors ${t==="en"?"text-foreground font-medium":"text-silver-muted hover:text-silver"}`,children:"EN"})]})},ml=Yr,pl=Qr,fl=Gr,sr=n.forwardRef(({className:t,...a},s)=>e.jsx(Ma,{className:A("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",t),...a,ref:s}));sr.displayName=Ma.displayName;const gl=Jt("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),rr=n.forwardRef(({side:t="right",className:a,children:s,...r},i)=>e.jsxs(fl,{children:[e.jsx(sr,{}),e.jsxs(Fa,{ref:i,className:A(gl({side:t}),a),...r,children:[s,e.jsxs($r,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-secondary hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",children:[e.jsx(Ws,{className:"h-4 w-4"}),e.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));rr.displayName=Fa.displayName;const hl=n.forwardRef(({className:t,...a},s)=>e.jsx(Da,{ref:s,className:A("text-lg font-semibold text-foreground",t),...a}));hl.displayName=Da.displayName;const vl=n.forwardRef(({className:t,...a},s)=>e.jsx(Va,{ref:s,className:A("text-sm text-muted-foreground",t),...a}));vl.displayName=Va.displayName;const yl=Kr,xl=Ur,bl=Ha,wl=Jr,nr=n.forwardRef(({className:t,inset:a,children:s,...r},i)=>e.jsxs(Ba,{ref:i,className:A("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent",a&&"pl-8",t),...r,children:[s,e.jsx(Ms,{className:"ml-auto h-4 w-4"})]}));nr.displayName=Ba.displayName;const ir=n.forwardRef(({className:t,...a},s)=>e.jsx(Wa,{ref:s,className:A("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",t),...a}));ir.displayName=Wa.displayName;const or=n.forwardRef(({className:t,sideOffset:a=4,...s},r)=>e.jsx(Ha,{children:e.jsx($a,{ref:r,sideOffset:a,className:A("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",t),...s})}));or.displayName=$a.displayName;const Te=n.forwardRef(({className:t,inset:a,...s},r)=>e.jsx(Ga,{ref:r,className:A("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",a&&"pl-8",t),...s}));Te.displayName=Ga.displayName;const jl=n.forwardRef(({className:t,children:a,checked:s,...r},i)=>e.jsxs(Ya,{ref:i,className:A("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",t),checked:s,...r,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(Qa,{children:e.jsx(Ft,{className:"h-4 w-4"})})}),a]}));jl.displayName=Ya.displayName;const El=n.forwardRef(({className:t,children:a,...s},r)=>e.jsxs(Ka,{ref:r,className:A("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",t),...s,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(Qa,{children:e.jsx(Fs,{className:"h-2 w-2 fill-current"})})}),a]}));El.displayName=Ka.displayName;const Cl=n.forwardRef(({className:t,inset:a,...s},r)=>e.jsx(Ua,{ref:r,className:A("px-2 py-1.5 text-sm font-semibold",a&&"pl-8",t),...s}));Cl.displayName=Ua.displayName;const Sl=n.forwardRef(({className:t,...a},s)=>e.jsx(Ja,{ref:s,className:A("-mx-1 my-1 h-px bg-muted",t),...a}));Sl.displayName=Ja.displayName;const Ta=[{slug:"office-cleaning",label:"Office Cleaning",labelFr:"Nettoyage de bureaux",icon:Zt,mainPage:"/office-cleaning"},{slug:"commercial-cleaning",label:"Commercial Cleaning",labelFr:"Nettoyage commercial",icon:Fi,mainPage:"/commercial-cleaning"},{slug:"industrial-cleaning",label:"Industrial Cleaning",labelFr:"Nettoyage industriel",icon:Xt,mainPage:"/industrial-cleaning"},{slug:"event-cleaning",label:"Event Cleaning",labelFr:"Nettoyage d'événements",icon:Ei,mainPage:"/events-cleaning"},{slug:"specialized-cleaning",label:"Specialized Cleaning",labelFr:"Nettoyage spécialisé",icon:wi,mainPage:"/specialized-cleaning"}],ct=[{province:"Ontario",provinceFr:"Ontario",cities:[{slug:"toronto",label:"Toronto (GTA)",labelFr:"Toronto (GTA)"},{slug:"north-york",label:"North York",labelFr:"North York"},{slug:"scarborough",label:"Scarborough",labelFr:"Scarborough"},{slug:"etobicoke",label:"Etobicoke",labelFr:"Etobicoke"},{slug:"east-york",label:"East York",labelFr:"East York"},{slug:"york",label:"York",labelFr:"York"},{slug:"mississauga",label:"Mississauga",labelFr:"Mississauga"},{slug:"brampton",label:"Brampton",labelFr:"Brampton"},{slug:"vaughan",label:"Vaughan",labelFr:"Vaughan"}]},{province:"British Columbia",provinceFr:"Colombie-Britannique",cities:[{slug:"vancouver",label:"Vancouver",labelFr:"Vancouver"},{slug:"burnaby",label:"Burnaby",labelFr:"Burnaby"},{slug:"richmond",label:"Richmond",labelFr:"Richmond"},{slug:"surrey",label:"Surrey",labelFr:"Surrey"},{slug:"north-vancouver",label:"North Vancouver",labelFr:"North Vancouver"},{slug:"coquitlam",label:"Coquitlam",labelFr:"Coquitlam"}]},{province:"Quebec",provinceFr:"Québec",cities:[{slug:"montreal",label:"Montreal",labelFr:"Montréal"},{slug:"laval",label:"Laval",labelFr:"Laval"},{slug:"longueuil",label:"Longueuil",labelFr:"Longueuil"},{slug:"brossard",label:"Brossard",labelFr:"Brossard"},{slug:"terrebonne",label:"Terrebonne",labelFr:"Terrebonne"}]}];ct.flatMap(t=>t.cities);const lr=()=>{const{t,language:a}=F(),s=Je(),r=as(),i=[{id:"services",en:"Services",fr:"Services"},{id:"why-choose-us",en:"Why Us",fr:"Pourquoi nous"},{id:"faq",en:"FAQ",fr:"FAQ"},{id:"contact",en:"Contact",fr:"Contact"}],o=l=>{var p;s.pathname==="/"?(p=document.getElementById(l))==null||p.scrollIntoView({behavior:"smooth"}):r(`/#${l}`)},f=l=>{s.pathname===l&&window.scrollTo({top:0,behavior:"smooth"})};return e.jsx("nav",{className:"fixed top-4 left-1/2 -translate-x-1/2 z-50 w-[calc(100%-2rem)] max-w-6xl",children:e.jsx("div",{className:"bg-background/80 backdrop-blur-lg border border-border rounded-2xl px-6 shadow-lg",children:e.jsxs("div",{className:"flex items-center justify-between h-14",children:[e.jsxs(w,{to:"/",onClick:()=>f("/"),className:"text-xl sm:text-2xl font-light tracking-tight hover:text-silver transition-colors flex items-center gap-2 whitespace-nowrap",children:[e.jsx(Bs,{className:"w-5 h-5 fill-foreground text-foreground shrink-0"}),e.jsx("span",{children:"Simple Service"})]}),e.jsxs("div",{className:"hidden lg:flex items-center gap-5",children:[e.jsx(w,{to:"/",onClick:()=>f("/"),className:"text-sm text-silver-muted hover:text-foreground transition-colors",children:t("nav.home")}),i.map(l=>e.jsx("button",{onClick:()=>o(l.id),className:"text-sm text-silver-muted hover:text-foreground transition-colors",children:a==="fr"?l.fr:l.en},l.id)),e.jsx(w,{to:"/about",className:"text-sm text-silver-muted hover:text-foreground transition-colors",children:t("nav.about")}),e.jsxs(yl,{children:[e.jsxs(xl,{className:"text-sm text-silver-muted hover:text-foreground transition-colors flex items-center gap-1",children:[a==="fr"?"Plus":"More",e.jsx(Rs,{className:"h-4 w-4"})]}),e.jsxs(or,{align:"center",className:"w-64",children:[Ta.map(l=>e.jsxs(wl,{children:[e.jsxs(nr,{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx(l.icon,{className:"h-4 w-4"}),a==="fr"?l.labelFr:l.label]}),e.jsx(bl,{children:e.jsxs(ir,{className:"w-52 max-h-[400px] overflow-y-auto",children:[e.jsx(Te,{asChild:!0,children:e.jsx(w,{to:l.mainPage,className:"cursor-pointer font-medium",children:a==="fr"?"Tous les emplacements":"All Locations"})}),ct.map(p=>e.jsxs("div",{children:[e.jsx("div",{className:"px-2 py-1.5 text-xs font-semibold text-silver-muted bg-muted/50 mt-1",children:a==="fr"?p.provinceFr:p.province}),p.cities.map(u=>e.jsx(Te,{asChild:!0,children:e.jsx(w,{to:`/services/${l.slug}/${u.slug}`,className:"cursor-pointer",children:a==="fr"?u.labelFr:u.label})},u.slug))]},p.province))]})})]},l.slug)),e.jsx("div",{className:"h-px bg-border my-1"}),e.jsx(Te,{asChild:!0,children:e.jsxs(w,{to:"/pricing-calculator",className:"cursor-pointer flex items-center gap-2",children:[e.jsx(dt,{className:"h-4 w-4"}),a==="fr"?"Calculateur de prix":"Price Calculator"]})}),e.jsx(Te,{asChild:!0,children:e.jsx(w,{to:"/blog",className:"cursor-pointer",children:"Blog"})}),e.jsx(Te,{asChild:!0,children:e.jsx(w,{to:"/careers",className:"cursor-pointer",children:a==="fr"?"Carrières":"Careers"})})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2 ml-auto lg:ml-0 lg:gap-2",children:[e.jsx(dl,{}),e.jsxs(ml,{children:[e.jsx(pl,{asChild:!0,children:e.jsxs(Z,{variant:"ghost",size:"icon",className:"lg:hidden",children:[e.jsx(Pi,{className:"h-5 w-5"}),e.jsx("span",{className:"sr-only",children:"Toggle menu"})]})}),e.jsx(rr,{side:"right",className:"w-[300px] sm:w-[400px] overflow-y-auto",children:e.jsxs("nav",{className:"flex flex-col gap-6 mt-8",children:[e.jsxs("a",{href:"tel:5142376303",onClick:ia,className:"flex items-center gap-2 text-lg text-foreground font-medium hover:text-silver transition-colors",children:[e.jsx(ta,{className:"h-5 w-5"}),"514-237-6303"]}),e.jsx(w,{to:"/",className:"text-lg text-silver-muted hover:text-foreground transition-colors text-left",onClick:()=>{var l;(l=document.querySelector('[data-state="open"]'))==null||l.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:t("nav.home")}),i.map(l=>e.jsx("button",{onClick:()=>{var p;(p=document.querySelector('[data-state="open"]'))==null||p.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"})),o(l.id)},className:"text-lg text-silver-muted hover:text-foreground transition-colors text-left",children:a==="fr"?l.fr:l.en},l.id)),e.jsxs("div",{className:"space-y-4",children:[e.jsx("span",{className:"text-lg text-foreground font-medium",children:t("nav.services")}),Ta.map(l=>e.jsxs("div",{className:"pl-4 space-y-2",children:[e.jsxs(w,{to:l.mainPage,className:"flex items-center gap-2 text-foreground font-medium hover:text-silver transition-colors",onClick:()=>{var p;(p=document.querySelector('[data-state="open"]'))==null||p.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:[e.jsx(l.icon,{className:"h-4 w-4"}),a==="fr"?l.labelFr:l.label]}),e.jsx("div",{className:"pl-6 space-y-2",children:ct.map(p=>e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-semibold text-silver-muted mb-1",children:a==="fr"?p.provinceFr:p.province}),e.jsx("div",{className:"grid grid-cols-2 gap-1",children:p.cities.map(u=>e.jsx(w,{to:`/services/${l.slug}/${u.slug}`,className:"text-sm text-silver-muted hover:text-foreground transition-colors",onClick:()=>{var g;(g=document.querySelector('[data-state="open"]'))==null||g.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:a==="fr"?u.labelFr:u.label},u.slug))})]},p.province))})]},l.slug))]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("span",{className:"text-lg text-foreground font-medium",children:a==="fr"?"Tarification":"Pricing"}),e.jsxs("div",{className:"pl-4 space-y-2",children:[e.jsxs(w,{to:"/pricing-calculator",className:"flex items-center gap-2 text-silver-muted hover:text-foreground transition-colors",onClick:()=>{var l;(l=document.querySelector('[data-state="open"]'))==null||l.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:[e.jsx(dt,{className:"h-4 w-4"}),a==="fr"?"Calculateur de prix":"Price Calculator"]}),e.jsx("div",{className:"text-sm text-silver-muted mt-2 mb-1",children:a==="fr"?"Guides par ville":"City Guides"}),e.jsx("div",{className:"pl-2 space-y-2",children:ct.map(l=>e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-semibold text-silver-muted mb-1",children:a==="fr"?l.provinceFr:l.province}),e.jsx("div",{className:"grid grid-cols-2 gap-1",children:l.cities.map(p=>e.jsx(w,{to:`/pricing-guide/${p.slug}`,className:"text-sm text-silver-muted hover:text-foreground transition-colors",onClick:()=>{var u;(u=document.querySelector('[data-state="open"]'))==null||u.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:a==="fr"?p.labelFr:p.label},p.slug))})]},l.province))})]})]}),e.jsx(w,{to:"/about",className:"text-lg text-silver-muted hover:text-foreground transition-colors text-left",onClick:()=>{var l;(l=document.querySelector('[data-state="open"]'))==null||l.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:t("nav.about")}),e.jsx(w,{to:"/blog",className:"text-lg text-silver-muted hover:text-foreground transition-colors text-left",onClick:()=>{var l;(l=document.querySelector('[data-state="open"]'))==null||l.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:"Blog"}),e.jsx(w,{to:"/careers",className:"text-lg text-silver-muted hover:text-foreground transition-colors text-left",onClick:()=>{var l;(l=document.querySelector('[data-state="open"]'))==null||l.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:a==="fr"?"Carrières":"Careers"}),e.jsx(w,{to:"/contact",className:"text-lg text-silver-muted hover:text-foreground transition-colors text-left",onClick:()=>{var l;(l=document.querySelector('[data-state="open"]'))==null||l.dispatchEvent(new KeyboardEvent("keydown",{key:"Escape"}))},children:t("nav.contact")})]})})]})]})]})})})},Ee=()=>e.jsxs("div",{className:"absolute inset-0 z-0 overflow-hidden pointer-events-none",children:[e.jsx("div",{className:"absolute top-[10%] -left-[20%] w-[30%] h-[45%] rounded-full bg-[hsl(240,80%,65%,0.25)] md:bg-[hsl(240,80%,65%,0.30)] blur-[60px] md:blur-[100px] animate-[glow-drift-1_8s_ease-in-out_infinite]"}),e.jsx("div",{className:"absolute top-[5%] -right-[20%] w-[30%] h-[55%] rounded-full bg-[hsl(250,75%,60%,0.20)] md:bg-[hsl(250,75%,60%,0.25)] blur-[60px] md:blur-[100px] animate-[glow-drift-3_12s_ease-in-out_infinite]"}),e.jsx("div",{className:"absolute -bottom-[10%] left-[35%] w-[35%] h-[35%] rounded-full bg-[hsl(230,70%,70%,0.12)] md:bg-[hsl(230,70%,70%,0.16)] blur-[70px] md:blur-[120px] animate-[glow-drift-2_10s_ease-in-out_infinite]"}),e.jsx("div",{className:"absolute inset-0 md:hidden bg-[radial-gradient(ellipse_60%_50%_at_50%_50%,_hsl(0,0%,100%,0.85)_0%,_hsl(0,0%,100%,0)_100%)]"})]}),ql={QC:{en:{badge:"Serving the Greater Montreal Area",headline:e.jsxs(e.Fragment,{children:["Commercial & industrial",e.jsx("br",{}),"cleaning in ",e.jsx("span",{className:"text-accent-blue",children:"Quebec"}),",",e.jsx("br",{}),"simplified."]}),subheadline:"Every shift documented with timestamped photos. Every issue resolved in under 24 hours. $5M insured. Simple Service replaces guesswork with accountable, inspection-grade cleaning across the Greater Montreal Area."},fr:{badge:"Au service du Grand Montréal",headline:e.jsxs(e.Fragment,{children:["Nettoyage commercial",e.jsx("br",{}),"& industriel au ",e.jsx("span",{className:"text-accent-blue",children:"Québec"}),",",e.jsx("br",{}),"simplifié."]}),subheadline:"Chaque quart vérifié par photo. Chaque problème résolu en moins de 24 h. Assurance de 5 M$. Simple Service remplace l'improvisation par un nettoyage rigoureux et redevable dans le Grand Montréal."}},ON:{en:{badge:"Serving the Greater Toronto Area",headline:e.jsxs(e.Fragment,{children:["Commercial & industrial",e.jsx("br",{}),"cleaning in ",e.jsx("span",{className:"text-accent-blue",children:"Ontario"}),",",e.jsx("br",{}),"simplified."]}),subheadline:"Every shift documented with timestamped photos. Every issue resolved in under 24 hours. $5M insured. Simple Service replaces guesswork with accountable, inspection-grade cleaning across the GTA."},fr:{badge:"Au service du Grand Toronto",headline:e.jsxs(e.Fragment,{children:["Nettoyage commercial",e.jsx("br",{}),"& industriel en ",e.jsx("span",{className:"text-accent-blue",children:"Ontario"}),",",e.jsx("br",{}),"simplifié."]}),subheadline:"Chaque quart vérifié par photo. Chaque problème résolu en moins de 24 h. Assurance de 5 M$. Simple Service remplace l'improvisation par un nettoyage rigoureux et redevable dans le GTA."}},BC:{en:{badge:"Serving Greater Vancouver",headline:e.jsxs(e.Fragment,{children:["Commercial & industrial",e.jsx("br",{}),"cleaning in ",e.jsx("span",{className:"text-accent-blue",children:"British Columbia"}),",",e.jsx("br",{}),"simplified."]}),subheadline:"Every shift documented with timestamped photos. Every issue resolved in under 24 hours. $5M insured. Simple Service replaces guesswork with accountable, inspection-grade cleaning across the Lower Mainland."},fr:{badge:"Au service du Grand Vancouver",headline:e.jsxs(e.Fragment,{children:["Nettoyage commercial",e.jsx("br",{}),"& industriel en ",e.jsx("span",{className:"text-accent-blue",children:"C.-B."}),",",e.jsx("br",{}),"simplifié."]}),subheadline:"Chaque quart vérifié par photo. Chaque problème résolu en moins de 24 h. Assurance de 5 M$. Simple Service remplace l'improvisation par un nettoyage rigoureux et redevable dans le Lower Mainland."}},OTHER:{en:{badge:"Commercial & Industrial Cleaning Specialists",headline:e.jsxs(e.Fragment,{children:["Commercial & industrial",e.jsx("br",{}),"cleaning, ",e.jsx("span",{className:"text-accent-blue",children:"simplified"}),"."]}),subheadline:"Every shift documented with timestamped photos. Every issue resolved in under 24 hours. $5M insured. Simple Service replaces guesswork with accountable, inspection-grade cleaning across Canada."},fr:{badge:"Spécialistes en nettoyage commercial & industriel",headline:e.jsxs(e.Fragment,{children:["Nettoyage commercial",e.jsx("br",{}),"& industriel ",e.jsx("span",{className:"text-accent-blue",children:"simplifié"}),"."]}),subheadline:"Chaque quart vérifié par photo. Chaque problème résolu en moins de 24 h. Assurance de 5 M$. Simple Service remplace l'improvisation par un nettoyage rigoureux et redevable au Canada."}}},Nl=()=>{const{t,language:a}=F(),{province:s,isLoading:r}=ns(),i=ql[s][a],o=()=>{var f;(f=document.getElementById("contact"))==null||f.scrollIntoView({behavior:"smooth"})};return e.jsxs("header",{className:"relative min-h-screen flex items-center justify-center pt-28 pb-12 md:pt-32 md:pb-20",role:"banner",children:[e.jsx(Ee,{}),e.jsx("div",{className:"container-custom relative z-10",children:e.jsxs("div",{className:"flex flex-col items-center text-center",children:[e.jsx("div",{className:`inline-block mb-6 px-4 py-2 rounded-full bg-accent-blue/10 text-accent-blue text-sm font-medium animate-fade-in transition-opacity ${r?"opacity-0":"opacity-100"}`,children:i.badge}),e.jsx("h1",{className:"text-4xl md:text-5xl lg:text-6xl font-light tracking-tight mb-8 text-foreground",children:i.headline}),e.jsx("p",{className:"text-lg md:text-xl text-silver max-w-3xl mx-auto mb-12 animate-fade-in-delay leading-relaxed",children:i.subheadline}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-4 animate-slide-up",children:[e.jsxs(Z,{onClick:o,size:"lg",className:"bg-foreground text-background hover:bg-foreground/90 transition-all duration-300 text-base px-8 py-6 rounded-full group",children:[t("hero.cta"),e.jsx(Oe,{className:"ml-2 h-5 w-5 group-hover:translate-x-1 transition-transform"})]}),e.jsx(Z,{asChild:!0,size:"lg",variant:"outline",className:"border-foreground hover:bg-foreground hover:text-background transition-all duration-300 text-base px-8 py-6 rounded-full group",children:e.jsxs(w,{to:"/pricing-calculator",children:[e.jsx(dt,{className:"mr-2 h-5 w-5"}),t("hero.pricingCalculator")]})})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-3 mt-8 animate-fade-in",children:[e.jsxs("div",{className:"inline-flex items-center gap-2.5 px-5 py-3 rounded-full bg-background border border-border shadow-md min-w-[160px]",children:[e.jsx("div",{className:"w-7 h-7 rounded-full bg-white flex items-center justify-center flex-shrink-0",children:e.jsxs("svg",{viewBox:"0 0 24 24",className:"w-4 h-4","aria-label":"Google",children:[e.jsx("path",{d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z",fill:"#4285F4"}),e.jsx("path",{d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z",fill:"#34A853"}),e.jsx("path",{d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18A10.96 10.96 0 0 0 1 12c0 1.77.42 3.45 1.18 4.93l3.66-2.84z",fill:"#FBBC05"}),e.jsx("path",{d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z",fill:"#EA4335"})]})}),e.jsxs("div",{className:"flex flex-col items-start leading-tight",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-base font-semibold text-foreground",children:"5.0"}),e.jsx("div",{className:"flex gap-0.5",children:[...Array(5)].map((f,l)=>e.jsx(pt,{className:"w-3.5 h-3.5 fill-yellow-400 text-yellow-400"},l))})]}),e.jsx("span",{className:"text-[11px] text-muted-foreground",children:a==="fr"?"Avis Google":"Google Reviews"})]})]}),e.jsxs("div",{className:"inline-flex items-center gap-2.5 px-5 py-3 rounded-full bg-background border border-border shadow-md min-w-[160px]",children:[e.jsx("div",{className:"w-7 h-7 rounded-full bg-accent-blue/10 flex items-center justify-center flex-shrink-0",children:e.jsx(Ke,{className:"w-4 h-4 text-accent-blue"})}),e.jsxs("div",{className:"flex flex-col items-start leading-tight",children:[e.jsx("span",{className:"text-base font-semibold text-foreground",children:"10+"}),e.jsx("span",{className:"text-[11px] text-muted-foreground",children:a==="fr"?"Ans d'expérience":"Years Experience"})]})]}),e.jsxs("div",{className:"inline-flex items-center gap-2.5 px-5 py-3 rounded-full bg-background border border-border shadow-md min-w-[160px]",children:[e.jsx("div",{className:"w-7 h-7 rounded-full bg-accent-blue/10 flex items-center justify-center flex-shrink-0",children:e.jsx(Ue,{className:"w-4 h-4 text-accent-blue"})}),e.jsxs("div",{className:"flex flex-col items-start leading-tight",children:[e.jsx("span",{className:"text-base font-semibold text-foreground",children:"500+"}),e.jsx("span",{className:"text-[11px] text-muted-foreground",children:a==="fr"?"Clients satisfaits":"Happy Clients"})]})]})]}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 mt-12 w-full max-w-4xl animate-fade-in-delay",children:[{icon:Xe,en:"Timestamped photos every shift",fr:"Photos horodatées à chaque quart"},{icon:Ke,en:"Issues resolved in <24h",fr:"Problèmes résolus en <24 h"},{icon:Ue,en:"$5M liability insured",fr:"Assurance responsabilité 5 M$"},{icon:gt,en:"4-level escalation system",fr:"Système d'escalade à 4 niveaux"}].map((f,l)=>{const p=f.icon;return e.jsxs("div",{className:"flex flex-col items-center gap-3 px-4 py-5 rounded-2xl bg-background border border-border shadow-sm backdrop-blur-sm hover:shadow-md transition-all duration-300",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-accent-blue/10 flex items-center justify-center",children:e.jsx(p,{className:"w-5 h-5 text-accent-blue"})}),e.jsx("span",{className:"text-xs md:text-sm font-medium text-foreground text-center leading-tight",children:a==="fr"?f.fr:f.en})]},l)})})]})})]})},_l=[{icon:ht,en:"20+ cities across Ontario, Quebec & B.C. — offices, retail, warehouses, factories, and event venues.",fr:"20+ villes en Ontario, Québec et C.-B. — bureaux, commerces, entrepôts, usines et salles d'événements."},{icon:Xe,en:"Every visit documented with timestamped before/after photos, supervisor-reviewed checklists, and backed by $5M liability insurance.",fr:"Chaque visite documentée par photos horodatées avant/après, listes de vérification supervisées, et couverture d'assurance de 5 M$."},{icon:gt,en:"4-level escalation system with guaranteed response times — issues resolved in under 24 hours.",fr:"Système d'escalade à 4 niveaux avec délais de réponse garantis — problèmes résolus en moins de 24 h."},{icon:qi,en:"Transparent pricing from $0.08/sq ft — free custom quote in 24 hours, no hidden fees.",fr:"Tarification transparente dès 0,08$/pi² — soumission gratuite en 24 h, aucuns frais cachés."}],Tl=()=>{const{language:t}=F();return e.jsx("aside",{className:"py-10 md:py-14 border-b border-border","aria-label":t==="fr"?"Points clés":"Key Takeaways",children:e.jsxs("div",{className:"container-custom",children:[e.jsx("h2",{className:"sr-only",children:t==="fr"?"Points clés":"Key Takeaways"}),e.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-4 gap-6",children:_l.map((a,s)=>{const r=a.icon;return e.jsxs("div",{className:"flex gap-4 items-start",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-accent-blue/10 flex items-center justify-center shrink-0",children:e.jsx(r,{className:"w-5 h-5 text-accent-blue"})}),e.jsx("p",{className:"text-sm leading-relaxed text-silver",children:t==="fr"?a.fr:a.en})]},s)})})]})})},kl=()=>{const{language:t}=F(),a=t==="fr";return e.jsx("section",{className:"py-12 md:py-16 bg-background border-y border-border/40",children:e.jsx("div",{className:"container-custom max-w-4xl",children:e.jsxs("div",{className:"grid md:grid-cols-2 gap-10 md:gap-16 items-start",children:[e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("span",{className:"text-xs font-semibold tracking-widest uppercase text-destructive/70",children:a?"Le problème":"The Problem"}),e.jsx("h2",{className:"text-2xl md:text-3xl font-light tracking-tight text-foreground leading-snug",children:a?"Vous payez pour du nettoyage. Mais personne ne vérifie si c'est fait.":"You're paying for cleaning. But nobody checks if it's done."}),e.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:a?"Plaintes des locataires. Toilettes négligées. Aucune trace de passage. La plupart des entreprises de nettoyage fonctionnent sans preuve — et c'est votre réputation qui en souffre.":"Tenant complaints. Missed restrooms. No proof of service. Most cleaning companies operate without accountability — and it's your reputation on the line."})]}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("span",{className:"text-xs font-semibold tracking-widest uppercase text-accent-blue",children:a?"Notre approche":"Our Approach"}),e.jsx("h2",{className:"text-2xl md:text-3xl font-light tracking-tight text-foreground leading-snug",children:a?"Chaque visite documentée. Chaque problème résolu en 2 heures.":"Every visit documented. Every issue resolved within 2 hours."}),e.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:a?"Photos horodatées, rapports de supervision et un processus d'escalade clair — pour que vous n'ayez jamais à deviner si le travail est bien fait.":"Timestamped photos, supervisor reports, and a clear escalation process — so you never have to guess whether the job got done."}),e.jsxs(w,{to:"/proof-of-process",className:"inline-flex items-center gap-1.5 text-sm font-medium text-accent-blue hover:underline underline-offset-4 transition-colors group mt-1",children:[a?"Voir comment ça fonctionne":"See how it works",e.jsx(Oe,{className:"w-3.5 h-3.5 group-hover:translate-x-0.5 transition-transform"})]})]})]})})})},zl="/assets/gallery-office-desk-BFRDWV6W.webp",Pl="/assets/gallery-factory-floor-buffer-C8r0hePn.jpeg",Al="/assets/gallery-school-hallway-Cq9f1pU-.webp",Ll="/assets/gallery-classroom-BEs9VrEn.jpg",Ol="/assets/gallery-hospital-Bru3zPDn.png",Il="/assets/gallery-kitchen-sz5yNw5j.jpg",Rl=()=>{const{language:t}=F(),a=[{src:zl,alt:"Professional office desk cleaning by Simple Service"},{src:Pl,alt:"Industrial floor buffing in a factory facility"},{src:Al,alt:"School hallway floor cleaning and maintenance"},{src:Ll,alt:"Classroom desk sanitization service"},{src:Ol,alt:"Medical facility deep cleaning"},{src:Il,alt:"Commercial kitchen cleaning"}],s=()=>{var r;(r=document.getElementById("gallery"))==null||r.scrollIntoView({behavior:"smooth"})};return e.jsx("section",{className:"section-padding bg-muted/20",children:e.jsxs("div",{className:"container-custom",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light text-center mb-8 text-foreground",children:t==="fr"?"Notre travail en action":"Our Work in Action"}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 gap-3 md:gap-4",children:a.map((r,i)=>e.jsx("div",{className:"overflow-hidden rounded-lg aspect-[4/3]",children:e.jsx("img",{src:r.src,alt:r.alt,loading:"lazy",className:"w-full h-full object-cover hover:scale-105 transition-transform duration-500"})},i))}),e.jsx("div",{className:"flex justify-center mt-8",children:e.jsxs(Z,{onClick:s,variant:"outline",className:"gap-2",children:[t==="fr"?"Voir plus":"See More",e.jsx(xi,{className:"w-4 h-4"})]})})]})})},ka="https://ssimple.ca",Ml="Simple Service",Fl="https://storage.googleapis.com/gpt-engineer-file-uploads/OcpedkW9vZOyvNLG2mie1pS97mV2/social-images/social-1771696212130-Simple_Service_(5).webp";function cr({title:t,description:a,path:s="/",ogType:r="website",ogImage:i,locale:o="en_CA",localeAlternate:f,children:l,noDefaultImage:p}){const u=s==="/"?`${ka}/`:`${ka}${s.replace(/\/+$/,"")}`,g=i||(p?void 0:Fl);return e.jsxs(Yt,{children:[e.jsx("title",{children:t}),e.jsx("meta",{name:"description",content:a}),e.jsx("link",{rel:"canonical",href:u}),e.jsx("meta",{property:"og:title",content:t}),e.jsx("meta",{property:"og:description",content:a}),e.jsx("meta",{property:"og:url",content:u}),e.jsx("meta",{property:"og:type",content:r}),e.jsx("meta",{property:"og:site_name",content:Ml}),e.jsx("meta",{property:"og:locale",content:o}),f&&e.jsx("meta",{property:"og:locale:alternate",content:f}),g&&e.jsx("meta",{property:"og:image",content:g}),e.jsx("meta",{name:"twitter:card",content:"summary_large_image"}),e.jsx("meta",{name:"twitter:title",content:t}),e.jsx("meta",{name:"twitter:description",content:a}),g&&e.jsx("meta",{name:"twitter:image",content:g}),l]})}const Dl={QC:{en:{title:"Commercial & Industrial Cleaning Services Canada | Simple Service",description:"Professional commercial, office & industrial cleaning in Montréal, Toronto & Vancouver. Insured Canadian janitorial services with verified quality — free quote.",keywords:"commercial cleaning Montreal, industrial cleaning Quebec, office cleaning Laval, janitorial services Greater Montreal, nettoyage commercial"},fr:{title:"Nettoyage Commercial & Industriel au Canada | Simple Service",description:"Nettoyage commercial, de bureaux et industriel à Montréal, Toronto et Vancouver. Services de conciergerie canadiens assurés — soumission gratuite.",keywords:"nettoyage commercial Montréal, nettoyage industriel Québec, nettoyage de bureaux Laval, services de conciergerie Grand Montréal"}},ON:{en:{title:"Commercial & Industrial Cleaning Services Canada | Simple Service",description:"Professional commercial, office & industrial cleaning in Toronto, Mississauga, Brampton & the GTA. Insured janitorial services — free quote.",keywords:"commercial cleaning Toronto, industrial cleaning Ontario, office cleaning GTA, janitorial services Mississauga, cleaning company Brampton"},fr:{title:"Nettoyage Commercial & Industriel au Canada | Simple Service",description:"Nettoyage commercial, de bureaux et industriel à Toronto, Mississauga, Brampton et le GTA. Services de conciergerie assurés — soumission gratuite.",keywords:"nettoyage commercial Toronto, nettoyage industriel Ontario, nettoyage de bureaux GTA, services de conciergerie Mississauga"}},BC:{en:{title:"Commercial & Industrial Cleaning Services Canada | Simple Service",description:"Professional commercial, office & industrial cleaning in Vancouver, Burnaby, Surrey & the Lower Mainland. Insured janitorial services — free quote.",keywords:"commercial cleaning Vancouver, industrial cleaning BC, office cleaning Burnaby, janitorial services Surrey, cleaning company Lower Mainland"},fr:{title:"Nettoyage Commercial & Industriel au Canada | Simple Service",description:"Nettoyage commercial, de bureaux et industriel à Vancouver, Burnaby, Surrey et le Lower Mainland. Services de conciergerie assurés — soumission gratuite.",keywords:"nettoyage commercial Vancouver, nettoyage industriel Colombie-Britannique, nettoyage de bureaux Burnaby, services de conciergerie Surrey"}},OTHER:{en:{title:"Commercial & Industrial Cleaning Services Canada | Simple Service",description:"Professional commercial, office & industrial cleaning in Montréal, Toronto & Vancouver. Insured Canadian janitorial services with verified quality — free quote.",keywords:"commercial cleaning, industrial cleaning, office cleaning, janitorial services, GTA, Greater Montreal Area, Vancouver, Toronto, Montreal, Canada"},fr:{title:"Nettoyage Commercial & Industriel au Canada | Simple Service",description:"Nettoyage commercial, de bureaux et industriel à Montréal, Toronto et Vancouver. Services de conciergerie canadiens assurés — soumission gratuite.",keywords:"nettoyage commercial, nettoyage industriel, nettoyage de bureaux, services de conciergerie, Grand Montréal, GTA, Vancouver, Toronto, Montréal, Canada"}}},Vl=()=>{const{language:t}=F(),{province:a}=ns(),s=Dl[a][t],r="https://ssimple.ca",i={"@context":"https://schema.org","@type":"Organization",name:"Simple Service",alternateName:"Simple",url:r,logo:`${r}/og-image.png`,email:"info@ssimple.ca",description:t==="fr"?"Entreprise canadienne de nettoyage commercial et industriel desservant Montréal, Toronto et Vancouver.":"Canadian commercial and industrial cleaning company serving Montreal, Toronto, and Vancouver.",areaServed:[{"@type":"City",name:"Montreal"},{"@type":"City",name:"Toronto"},{"@type":"City",name:"Vancouver"},{"@type":"City",name:"Laval"},{"@type":"City",name:"Mississauga"},{"@type":"City",name:"Brampton"},{"@type":"City",name:"Burnaby"},{"@type":"City",name:"Surrey"},{"@type":"City",name:"Longueuil"},{"@type":"City",name:"Vaughan"}],sameAs:[],contactPoint:{"@type":"ContactPoint",contactType:"customer service",email:"info@ssimple.ca",availableLanguage:["English","French"]}},o={"@context":"https://schema.org","@type":"LocalBusiness",name:"Simple Service",url:r,image:`${r}/og-image.png`,email:"info@ssimple.ca",priceRange:"$$",description:s.description,areaServed:[{"@type":"City",name:"Montreal"},{"@type":"City",name:"Toronto"},{"@type":"City",name:"Vancouver"},{"@type":"City",name:"Laval"},{"@type":"City",name:"Mississauga"},{"@type":"City",name:"Vaughan"},{"@type":"City",name:"Brampton"},{"@type":"City",name:"Burnaby"},{"@type":"City",name:"Surrey"},{"@type":"City",name:"Richmond"},{"@type":"City",name:"Longueuil"},{"@type":"City",name:"Brossard"},{"@type":"City",name:"Terrebonne"},{"@type":"City",name:"North Vancouver"},{"@type":"City",name:"Coquitlam"}],serviceType:["Office Cleaning","Commercial Cleaning","Industrial Cleaning","Event Cleaning","Specialized Cleaning","Janitorial Services"],aggregateRating:{"@type":"AggregateRating",ratingValue:"5",bestRating:"5",reviewCount:"500"},hasOfferCatalog:{"@type":"OfferCatalog",name:"Commercial Cleaning Services",itemListElement:[{"@type":"Offer",itemOffered:{"@type":"Service",name:"Office Cleaning"},description:"Daily, weekly, or monthly professional office cleaning including dusting, vacuuming, sanitization, and floor care.",priceSpecification:{"@type":"PriceSpecification",priceCurrency:"CAD",price:"From $0.08/sq ft"}},{"@type":"Offer",itemOffered:{"@type":"Service",name:"Commercial Cleaning"},description:"Retail, restaurant, and public space cleaning with flexible scheduling and quality assurance.",priceSpecification:{"@type":"PriceSpecification",priceCurrency:"CAD",price:"From $0.10/sq ft"}},{"@type":"Offer",itemOffered:{"@type":"Service",name:"Industrial Cleaning"},description:"Factory, warehouse, and manufacturing facility cleaning compliant with OHSA, CNESST, and WorkSafeBC standards.",priceSpecification:{"@type":"PriceSpecification",priceCurrency:"CAD",price:"From $0.12/sq ft"}}]}};return e.jsxs(cr,{title:s.title,description:s.description,path:"/",locale:t==="fr"?"fr_CA":"en_CA",localeAlternate:t==="fr"?"en_CA":"fr_CA",children:[e.jsx("html",{lang:t}),e.jsx("meta",{name:"keywords",content:s.keywords}),e.jsx("meta",{httpEquiv:"content-language",content:t==="fr"?"fr-CA":"en-CA"}),e.jsx("meta",{name:"geo.region",content:"CA"}),e.jsx("meta",{name:"geo.placename",content:t==="fr"?"Grand Montréal, GTA, Vancouver":"GTA, Greater Montreal Area, Vancouver"}),e.jsx("script",{type:"application/ld+json",children:JSON.stringify(i)}),e.jsx("script",{type:"application/ld+json",children:JSON.stringify(o)})]})},Bl=[{icon:Zt,titleKey:"services.offices",descKey:"services.offices.desc",href:"/office-cleaning"},{icon:Is,titleKey:"services.commercial",descKey:"services.commercial.desc",href:"/commercial-cleaning"},{icon:Xt,titleKey:"services.industrial",descKey:"services.industrial.desc",href:"/industrial-cleaning"},{icon:Li,titleKey:"services.events",descKey:"services.events.desc",href:"/events-cleaning"},{icon:Di,titleKey:"services.specialized",descKey:"services.specialized.desc",href:"/specialized-cleaning"}],Wl=()=>{const{t,language:a}=F();return e.jsxs("section",{className:"section-padding relative overflow-hidden",id:"services",children:[e.jsx(Ee,{}),e.jsxs("div",{className:"container-custom",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light text-center mb-16 text-foreground",children:t("services.title")}),e.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-8",children:Bl.map((s,r)=>{const i=s.icon;return e.jsxs(w,{to:s.href,className:"group p-6 rounded-lg border border-border bg-background shadow-sm hover:shadow-md transition-all duration-300 flex flex-col relative z-10",children:[e.jsx(i,{className:"h-10 w-10 text-accent-blue mb-4"}),e.jsx("h3",{className:"text-xl font-medium mb-3 text-foreground",children:t(s.titleKey)}),e.jsx("p",{className:"text-muted-foreground text-sm leading-relaxed mb-5 flex-1",children:t(s.descKey)}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-sm text-accent-blue group-hover:text-accent-blue/80 transition-colors",children:[a==="fr"?"En savoir plus":"Learn more",e.jsx(Oe,{className:"h-4 w-4 group-hover:translate-x-1 transition-transform"})]})]},r)})})]})]})},Hl=[{en:"Daily floor care",fr:"Entretien des sols quotidien",offices:{en:"Vacuum & mop",fr:"Aspiration & lavage"},commercial:{en:"Sweep & polish",fr:"Balayage & polissage"},industrial:{en:"Scrub & degrease",fr:"Récurage & dégraissage"},events:!1,specialized:!1},{en:"Restroom sanitization",fr:"Désinfection des sanitaires",offices:{en:"Daily disinfect",fr:"Désinfection quotidienne"},commercial:{en:"High-traffic protocol",fr:"Protocole fort achalandage"},industrial:{en:"Industrial-grade",fr:"Grade industriel"},events:{en:"Pre & post-event",fr:"Pré & post-événement"},specialized:!1},{en:"Trash & recycling",fr:"Déchets & recyclage",offices:{en:"Desk-level pickup",fr:"Collecte par poste"},commercial:{en:"Bin rotation",fr:"Rotation des bacs"},industrial:{en:"Bulk waste removal",fr:"Enlèvement en vrac"},events:{en:"Same-day haul",fr:"Enlèvement le jour même"},specialized:!1},{en:"Kitchen / break room",fr:"Cuisine / salle de pause",offices:{en:"Appliance & counter",fr:"Électros & comptoirs"},commercial:{en:"Food-safe sanitize",fr:"Désinfection alimentaire"},industrial:!1,events:!1,specialized:!1},{en:"Window cleaning",fr:"Nettoyage de vitres",offices:!1,commercial:{en:"Storefront glass",fr:"Vitrine commerciale"},industrial:!1,events:!1,specialized:{en:"Interior & exterior",fr:"Intérieur & extérieur"}},{en:"Carpet extraction",fr:"Extraction de tapis",offices:!1,commercial:!1,industrial:!1,events:!1,specialized:{en:"Hot-water deep clean",fr:"Nettoyage eau chaude"}},{en:"Industrial degreasing",fr:"Dégraissage industriel",offices:!1,commercial:!1,industrial:{en:"Machine & floor",fr:"Machines & planchers"},events:!1,specialized:{en:"Heavy-duty solvent",fr:"Solvant industriel"}},{en:"High-pressure washing",fr:"Lavage haute pression",offices:!1,commercial:!1,industrial:{en:"Docks & yards",fr:"Quais & cours"},events:!1,specialized:{en:"Concrete & surfaces",fr:"Béton & surfaces"}},{en:"Pre/post-event turnover",fr:"Rotation pré/post-événement",offices:!1,commercial:!1,industrial:!1,events:{en:"Setup & teardown",fr:"Montage & démontage"},specialized:!1},{en:"Post-construction cleanup",fr:"Nettoyage post-construction",offices:!1,commercial:!1,industrial:!1,events:!1,specialized:{en:"Dust & debris removal",fr:"Poussière & débris"}}],$e=[{key:"offices",en:"Office",fr:"Bureau",href:"/services/office-cleaning",freqEn:"Daily–Weekly",freqFr:"Quotidien–Hebdo",clientEn:"Corporate & coworking",clientFr:"Corporatif & coworking",priceEn:"From $0.08/sq ft",priceFr:"Dès 0,08$/pi²"},{key:"commercial",en:"Commercial",fr:"Commercial",href:"/services/commercial-cleaning",freqEn:"Daily",freqFr:"Quotidien",clientEn:"Retail & hospitality",clientFr:"Commerce & hôtellerie",priceEn:"From $0.10/sq ft",priceFr:"Dès 0,10$/pi²"},{key:"industrial",en:"Industrial",fr:"Industriel",href:"/services/industrial-cleaning",freqEn:"Weekly–Monthly",freqFr:"Hebdo–Mensuel",clientEn:"Warehouses & plants",clientFr:"Entrepôts & usines",priceEn:"From $0.12/sq ft",priceFr:"Dès 0,12$/pi²"},{key:"events",en:"Events",fr:"Événements",href:"/services/events-cleaning",freqEn:"On-demand",freqFr:"Sur demande",clientEn:"Venues & organizers",clientFr:"Salles & organisateurs",priceEn:"Custom quote",priceFr:"Soumission sur mesure"},{key:"specialized",en:"Specialized",fr:"Spécialisé",href:"/services/specialized-cleaning",freqEn:"As needed",freqFr:"Au besoin",clientEn:"All sectors",clientFr:"Tous secteurs",priceEn:"Custom quote",priceFr:"Soumission sur mesure"}],$l=()=>{const{language:t}=F(),a=s=>s===!1?e.jsx(Ai,{className:"h-4 w-4 text-border mx-auto"}):s===!0?e.jsx(Ft,{className:"h-4 w-4 text-accent-blue mx-auto"}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs",children:[e.jsx(Ft,{className:"h-3.5 w-3.5 text-accent-blue shrink-0"}),e.jsx("span",{className:"text-silver",children:t==="fr"?s.fr:s.en})]});return e.jsx("section",{className:"section-padding",children:e.jsxs("div",{className:"container-custom",children:[e.jsxs("div",{className:"text-center mb-12",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light mb-4",children:t==="fr"?"Comparaison des services":"Service Comparison"}),e.jsx("p",{className:"text-silver-muted max-w-2xl mx-auto",children:t==="fr"?"Un aperçu rapide de ce qui est inclus dans chaque catégorie de service.":"A quick overview of what's included in each service category."})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm border-collapse",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border",children:[e.jsx("th",{className:"text-left py-3 pr-4 font-medium text-silver-muted",children:t==="fr"?"Tâche":"Task"}),$e.map(s=>e.jsx("th",{className:"py-3 px-2 text-center font-medium",children:e.jsx(w,{to:s.href,className:"hover:text-accent-blue transition-colors",children:t==="fr"?s.fr:s.en})},s.key))]})}),e.jsxs("tbody",{children:[Hl.map((s,r)=>e.jsxs("tr",{className:"border-b border-border/50 hover:bg-muted/30 transition-colors",children:[e.jsx("td",{className:"py-3 pr-4 text-silver",children:t==="fr"?s.fr:s.en}),$e.map(i=>e.jsx("td",{className:"py-3 px-2 text-center",children:a(s[i.key])},i.key))]},r)),e.jsxs("tr",{className:"border-b border-border bg-muted/20",children:[e.jsx("td",{className:"py-3 pr-4 text-xs uppercase tracking-wider text-silver-muted font-medium",children:t==="fr"?"Fréquence":"Frequency"}),$e.map(s=>e.jsx("td",{className:"py-3 px-2 text-center text-xs text-silver",children:t==="fr"?s.freqFr:s.freqEn},s.key))]}),e.jsxs("tr",{className:"border-b border-border bg-muted/20",children:[e.jsx("td",{className:"py-3 pr-4 text-xs uppercase tracking-wider text-silver-muted font-medium",children:t==="fr"?"Client idéal":"Ideal Client"}),$e.map(s=>e.jsx("td",{className:"py-3 px-2 text-center text-xs text-silver",children:t==="fr"?s.clientFr:s.clientEn},s.key))]}),e.jsxs("tr",{className:"bg-muted/20",children:[e.jsx("td",{className:"py-3 pr-4 text-xs uppercase tracking-wider text-silver-muted font-medium",children:t==="fr"?"Tarif de départ":"Starting Price"}),$e.map(s=>e.jsx("td",{className:"py-3 px-2 text-center text-xs font-medium text-accent-blue",children:t==="fr"?s.priceFr:s.priceEn},s.key))]})]})]})})]})})},Gl=()=>{const{t,language:a}=F();return e.jsxs("section",{className:"section-padding bg-background relative overflow-hidden",id:"about",children:[e.jsx(Ee,{}),e.jsxs("div",{className:"container-custom max-w-4xl text-center relative z-10",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light mb-4 text-foreground",children:t("about.title")}),e.jsx("p",{className:"text-muted-foreground leading-relaxed mb-6",children:t("about.text")}),e.jsxs("div",{className:"flex flex-wrap justify-center gap-3 text-sm",children:[e.jsx(w,{to:"/office-cleaning",className:"px-4 py-2 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground/40 transition-colors",children:a==="fr"?"Nettoyage de bureaux":"Office Cleaning"}),e.jsx(w,{to:"/commercial-cleaning",className:"px-4 py-2 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground/40 transition-colors",children:a==="fr"?"Nettoyage commercial":"Commercial Cleaning"}),e.jsx(w,{to:"/industrial-cleaning",className:"px-4 py-2 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground/40 transition-colors",children:a==="fr"?"Nettoyage industriel":"Industrial Cleaning"}),e.jsx(w,{to:"/commercial-cleaning-toronto",className:"px-4 py-2 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground/40 transition-colors",children:"Toronto"}),e.jsx(w,{to:"/commercial-cleaning-montreal",className:"px-4 py-2 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground/40 transition-colors",children:a==="fr"?"Montréal":"Montreal"}),e.jsx(w,{to:"/commercial-cleaning-vancouver",className:"px-4 py-2 rounded-full border border-border text-muted-foreground hover:text-foreground hover:border-foreground/40 transition-colors",children:"Vancouver"})]})]})]})},Yl=[{icon:Ke,titleKey:"benefits.consistency.title",descKey:"benefits.consistency.desc",href:"/commercial-cleaning"},{icon:Ue,titleKey:"benefits.insured.title",descKey:"benefits.insured.desc",href:"/office-cleaning"},{icon:Vs,titleKey:"benefits.flexible.title",descKey:"benefits.flexible.desc"},{icon:Xe,titleKey:"benefits.trained.title",descKey:"benefits.trained.desc"},{icon:aa,titleKey:"benefits.eco.title",descKey:"benefits.eco.desc"},{icon:gt,titleKey:"benefits.support.title",descKey:"benefits.support.desc"}],Ql=()=>{const{t,language:a}=F();return e.jsxs("section",{className:"section-padding bg-background relative overflow-hidden",id:"benefits",children:[e.jsx(Ee,{}),e.jsxs("div",{className:"container-custom relative z-10",children:[e.jsxs("div",{className:"text-center mb-16",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light mb-4 text-foreground",children:t("benefits.title")}),e.jsx("p",{className:"text-muted-foreground max-w-2xl mx-auto",children:t("benefits.subtitle")})]}),e.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-8",children:Yl.map((s,r)=>{const i=e.jsxs(e.Fragment,{children:[e.jsx(s.icon,{className:"w-10 h-10 mb-4 text-accent-blue",strokeWidth:1.5}),e.jsx("h3",{className:"text-xl font-medium mb-2 text-foreground",children:t(s.titleKey)}),e.jsx("p",{className:"text-muted-foreground leading-relaxed",children:t(s.descKey)}),s.href&&e.jsx("span",{className:"inline-flex items-center text-sm text-muted-foreground group-hover:text-foreground transition-colors mt-3",children:a==="fr"?"En savoir plus →":"Learn more →"})]});return s.href?e.jsx(w,{to:s.href,className:"group bg-background p-8 rounded-lg border border-border shadow-sm hover:shadow-md transition-all block",children:i},r):e.jsx("div",{className:"bg-background p-8 rounded-lg border border-border shadow-sm hover:shadow-md transition-all",children:i},r)})})]})]})},Kl=en,ur=n.forwardRef(({className:t,...a},s)=>e.jsx(Zr,{ref:s,className:A("border-b",t),...a}));ur.displayName="AccordionItem";const dr=n.forwardRef(({className:t,children:a,...s},r)=>e.jsx(Xr,{className:"flex",children:e.jsxs(Za,{ref:r,className:A("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",t),...s,children:[a,e.jsx(Rs,{className:"h-4 w-4 shrink-0 transition-transform duration-200"})]})}));dr.displayName=Za.displayName;const mr=n.forwardRef(({className:t,children:a,...s},r)=>e.jsx(Xa,{ref:r,className:"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...s,children:e.jsx("div",{className:A("pb-4 pt-0",t),children:a})}));mr.displayName=Xa.displayName;const Ul=()=>{const{t,language:a}=F(),s=[{question:t("faq.q15"),answer:t("faq.a15")},{question:t("faq.q16"),answer:t("faq.a16")},{question:t("faq.q17"),answer:t("faq.a17")},{question:t("faq.q18"),answer:t("faq.a18")},{question:t("faq.q19"),answer:t("faq.a19")},{question:t("faq.q1"),answer:t("faq.a1")},{question:t("faq.q2"),answer:t("faq.a2"),linkKey:"healthCanada"},{question:t("faq.q3"),answer:t("faq.a3"),linkKey:"wsib"},{question:t("faq.q4"),answer:t("faq.a4")},{question:t("faq.q5"),answer:t("faq.a5")},{question:t("faq.q6"),answer:t("faq.a6")},{question:t("faq.q7"),answer:t("faq.a7")},{question:t("faq.q8"),answer:t("faq.a8")},{question:t("faq.q9"),answer:t("faq.a9")},{question:t("faq.q10"),answer:t("faq.a10")},{question:t("faq.q11"),answer:t("faq.a11"),linkKey:"cnesstIso"},{question:t("faq.q12"),answer:t("faq.a12")},{question:t("faq.q13"),answer:t("faq.a13")},{question:t("faq.q14"),answer:t("faq.a14")}],r=s.length>0?{"@context":"https://schema.org","@type":"FAQPage",mainEntity:s.map(o=>({"@type":"Question",name:o.question,acceptedAnswer:{"@type":"Answer",text:o.answer}}))}:null,i=o=>o.linkKey==="healthCanada"?e.jsxs(e.Fragment,{children:[o.answer," ",e.jsx("a",{href:"https://www.canada.ca/en/public-health/services/publications/diseases-conditions/cleaning-disinfecting-public-spaces.html",target:"_blank",rel:"noopener noreferrer",className:"text-accent-blue hover:underline",children:a==="fr"?"Directives de nettoyage et désinfection (Santé Canada)":"Cleaning & disinfection guidance (Health Canada)"}),"."]}):o.linkKey==="wsib"?e.jsxs(e.Fragment,{children:[o.answer," ",e.jsx("a",{href:"https://www.wsib.ca/en",target:"_blank",rel:"noopener noreferrer",className:"text-accent-blue hover:underline",children:a==="fr"?"Assurance sécurité au travail (WSIB)":"Workplace safety insurance (WSIB)"}),"."]}):o.linkKey==="cnesstIso"?e.jsxs(e.Fragment,{children:[o.answer," ",e.jsx("a",{href:"https://www.cnesst.gouv.qc.ca/",target:"_blank",rel:"noopener noreferrer",className:"text-accent-blue hover:underline",children:a==="fr"?"CNESST (sécurité au travail du Québec)":"CNESST (Québec workplace safety)"})," · ",e.jsx("a",{href:"https://www.iso.org/iso-45001-occupational-health-and-safety.html",target:"_blank",rel:"noopener noreferrer",className:"text-accent-blue hover:underline",children:a==="fr"?"Norme ISO 45001 (santé et sécurité au travail)":"Occupational health & safety standard (ISO 45001)"}),"."]}):o.answer;return e.jsxs("section",{className:"section-padding bg-background relative overflow-hidden",id:"faq",children:[r&&e.jsx(Yt,{children:e.jsx("script",{type:"application/ld+json",children:JSON.stringify(r)})}),e.jsx(Ee,{}),e.jsxs("div",{className:"container-custom relative z-10",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light text-center mb-16 text-foreground",children:t("faq.title")}),e.jsx("div",{className:"max-w-3xl mx-auto",children:e.jsx(Kl,{type:"multiple",defaultValue:["faq-0","faq-1","faq-2"],children:s.map((o,f)=>e.jsxs(ur,{value:`faq-${f}`,className:"border-border",children:[e.jsx(dr,{className:"text-left text-base font-medium text-foreground hover:text-foreground/80",children:o.question}),e.jsx(mr,{children:e.jsx("div",{className:"text-muted-foreground leading-relaxed",children:i(o)})})]},f))})}),e.jsx("div",{"aria-hidden":"true",style:{position:"absolute",left:"-9999px",width:"1px",height:"1px",overflow:"hidden"},children:s.map((o,f)=>e.jsxs("div",{children:[e.jsx("h3",{children:o.question}),e.jsx("p",{children:o.answer})]},`seo-${f}`))})]})]})},za=[{icon:Vi,en:"Onboarding",fr:"Intégration",descEn:"Site walk, scope, crew assignment",descFr:"Visite, portée, affectation d'équipe"},{icon:ji,en:"Scheduling",fr:"Planification",descEn:"Custom calendar & frequency",descFr:"Calendrier et fréquence sur mesure"},{icon:ht,en:"Service Visits",fr:"Visites de service",descEn:"Supervisor-verified, checklist-driven",descFr:"Vérifiées par superviseur, guidées par liste"},{icon:Ds,en:"Quality Assurance",fr:"Assurance qualité",descEn:"Photo-verified inspections (timestamped before/after images)",descFr:"Inspections vérifiées par photo (images horodatées avant/après)"},{icon:Si,en:"Escalation",fr:"Escalade",descEn:"4-level resolution framework",descFr:"Cadre de résolution à 4 niveaux"}],Jl=()=>{const{language:t}=F();return e.jsxs("div",{className:"mt-16",children:[e.jsx("h3",{className:"text-xl font-light text-center mb-10",children:t==="fr"?"Notre processus de bout en bout":"Our End-to-End Process"}),e.jsx("div",{className:"flex flex-col md:flex-row items-center md:items-start justify-center gap-2 md:gap-0",children:za.map((a,s)=>e.jsxs("div",{className:"flex flex-col md:flex-row items-center",children:[e.jsxs("div",{className:"flex flex-col items-center text-center w-36",children:[e.jsx("div",{className:"w-14 h-14 rounded-full bg-accent-blue/10 border border-accent-blue/30 flex items-center justify-center mb-3",children:e.jsx(a.icon,{className:"h-6 w-6 text-accent-blue"})}),e.jsx("span",{className:"text-sm font-medium mb-1",children:t==="fr"?a.fr:a.en}),e.jsx("span",{className:"text-xs text-silver-muted leading-tight",children:t==="fr"?a.descFr:a.descEn})]}),s{const{language:t}=F();return e.jsxs("div",{className:"mt-16",children:[e.jsx("h3",{className:"text-xl font-light text-center mb-10",children:t==="fr"?"Cadre d'escalade à 4 niveaux":"4-Level Escalation Framework"}),e.jsx("div",{className:"max-w-2xl mx-auto space-y-4",children:Pa.map((a,s)=>e.jsxs("div",{className:"relative",children:[e.jsxs("div",{className:`flex items-center gap-4 p-4 rounded-lg border ${a.color}`,children:[e.jsx("div",{className:`w-10 h-10 rounded-full ${a.dot} text-white flex items-center justify-center text-sm font-semibold shrink-0`,children:a.level}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-1",children:[e.jsx("span",{className:"font-medium text-sm",children:t==="fr"?a.fr:a.en}),e.jsxs("span",{className:"text-xs font-mono px-2 py-0.5 rounded bg-background border border-border",children:[t==="fr"?"Délai de réponse":"Response time",": ",t==="fr"?a.slaFr:a.slaEn]})]}),e.jsx("p",{className:"text-xs text-silver-muted mt-1",children:t==="fr"?a.descFr:a.descEn})]})]}),s{const{language:t}=F();return e.jsxs("div",{className:"mt-16",children:[e.jsx("h3",{className:"text-xl font-light text-center mb-10",children:t==="fr"?"Système de gestion numérique — listes de vérification, photos et rapports":"Digital Management System — Checklists, Photos & Reporting"}),e.jsxs("div",{className:"max-w-3xl mx-auto grid md:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("span",{className:"text-sm font-medium",children:t==="fr"?"Liste de vérification":"Service Checklist"}),e.jsx("span",{className:"text-xs text-silver-muted font-mono",children:"3/5"})]}),e.jsx("div",{className:"space-y-3",children:ec.map((a,s)=>e.jsxs("div",{className:"flex items-center gap-3",children:[a.done?e.jsx(mt,{className:"h-5 w-5 text-accent-blue shrink-0"}):e.jsx(Fs,{className:"h-5 w-5 text-border shrink-0"}),e.jsx("span",{className:`text-sm ${a.done?"text-silver line-through":"text-foreground"}`,children:t==="fr"?a.fr:a.en})]},s))})]}),e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("span",{className:"text-sm font-medium",children:t==="fr"?"Vérification photo":"Photo Verification"}),e.jsx(Xe,{className:"h-4 w-4 text-silver-muted"})]}),e.jsx("div",{className:"aspect-[4/3] rounded-lg border border-border overflow-hidden mb-4",children:e.jsx("img",{src:Xl,alt:t==="fr"?"Photo horodatée d'un nettoyage industriel":"Timestamped photo of industrial cleaning",className:"w-full h-full object-cover"})}),e.jsxs("div",{className:"space-y-2 text-xs text-silver-muted",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ke,{className:"h-3.5 w-3.5 shrink-0"}),e.jsx("span",{children:"2025-02-07 — 08:42 PM"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ht,{className:"h-3.5 w-3.5 shrink-0"}),e.jsx("span",{children:"Toronto, ON — Site verified"})]})]})]})]})]})},ac=[{slug:"how-we-operate",icon:Ue,titleEn:"Quality Assurance",titleFr:"Assurance Qualité",descEn:"We maintain the highest standards through rigorous quality checks, continuous training, and transparent communication.",descFr:"Nous maintenons les normes les plus élevées grâce à des contrôles de qualité rigoureux, une formation continue et une communication transparente."},{slug:"responsible-cleaning",icon:Xe,titleEn:"Eco-Friendly Practices",titleFr:"Pratiques Écologiques",descEn:"Our commitment to the environment means using sustainable products and methods that minimize our ecological footprint.",descFr:"Notre engagement envers l'environnement signifie l'utilisation de produits et de méthodes durables qui minimisent notre empreinte écologique."},{slug:"proof-of-process",icon:Ci,titleEn:"Advanced Technology",titleFr:"Technologie Avancée",descEn:"We leverage the latest technology for efficient service delivery, real-time monitoring, and detailed reporting.",descFr:"Nous tirons parti des dernières technologies pour une prestation de services efficace, une surveillance en temps réel et des rapports détaillés."},{slug:"escalation-process",icon:Ke,titleEn:"24/7 Support",titleFr:"Support 24/7",descEn:"Our dedicated support team is available around the clock to address any concerns and ensure seamless service continuity.",descFr:"Notre équipe de support dédiée est disponible 24 heures sur 24 pour répondre à toute préoccupation et assurer une continuité de service sans faille."},{slug:"service-structure",icon:gt,titleEn:"Digital System",titleFr:"Système Numérique",descEn:"Our custom digital platform enhances communication, scheduling, and service tracking for superior management and transparency.",descFr:"Notre plateforme numérique personnalisée améliore la communication, la planification et le suivi des services pour une gestion et une transparence supérieures."},{slug:"transition-support",icon:Vs,titleEn:"Certified & Trained Staff",titleFr:"Personnel Certifié et Formé",descEn:"Our certified professionals undergo continuous training to deliver expert cleaning services with precision and care.",descFr:"Nos professionnels certifiés suivent une formation continue pour fournir des services de nettoyage experts avec précision et soin."}],sc=()=>{const{language:t}=F();return e.jsxs(e.Fragment,{children:[e.jsxs("section",{id:"why-choose-us",className:"section-padding bg-background relative overflow-hidden",children:[e.jsx(Ee,{}),e.jsxs("div",{className:"container-custom relative z-10",children:[e.jsxs("div",{className:"text-center mb-16",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light mb-4 text-foreground",children:t==="fr"?"Comment nous nous distinguons":"How We're Different"}),e.jsx("p",{className:"text-muted-foreground max-w-2xl mx-auto",children:t==="fr"?"Six piliers opérationnels qui définissent notre approche du nettoyage commercial.":"Six operational pillars that define our approach to commercial cleaning."})]}),e.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-8",children:ac.map(a=>e.jsxs("div",{className:"group p-6 rounded-lg border border-border bg-background shadow-sm hover:shadow-md transition-all duration-300 flex flex-col",children:[e.jsx(a.icon,{className:"h-10 w-10 text-accent-blue mb-4"}),e.jsx("h3",{className:"text-xl font-medium mb-3 text-foreground",children:t==="fr"?a.titleFr:a.titleEn}),e.jsx("p",{className:"text-muted-foreground text-sm mb-6 flex-1",children:t==="fr"?a.descFr:a.descEn}),e.jsx(Z,{variant:"ghost",size:"sm",asChild:!0,className:"text-muted-foreground hover:text-foreground hover:bg-accent transition-colors self-start mt-auto",children:e.jsxs(w,{to:`/${a.slug}`,className:"flex items-center gap-2",children:[t==="fr"?"En savoir plus":"Read More",e.jsx(Oe,{className:"h-4 w-4 group-hover:translate-x-1 transition-transform"})]})})]},a.slug))})]})]}),e.jsx("section",{className:"section-padding bg-background",children:e.jsxs("div",{className:"container-custom",children:[e.jsx(Jl,{}),e.jsx(Zl,{}),e.jsx(tc,{})]})})]})},Ge=({label:t,titleEn:a,titleFr:s,href:r})=>{const{language:i}=F(),o=i==="fr"?s:a,f=r?e.jsx("a",{href:r,target:"_blank",rel:"noopener noreferrer",className:"hover:text-accent-blue transition-colors border-b border-dotted border-current/40",children:t}):e.jsx("span",{className:"border-b border-dotted border-current/40 cursor-help",children:t});return e.jsxs(el,{children:[e.jsx(tl,{asChild:!0,children:f}),e.jsx(tr,{side:"bottom",className:"text-xs max-w-48",children:e.jsx("p",{children:o})})]})},rc=[{icon:Mi,labelEn:"$5M Liability Coverage",labelFr:"Couverture de 5M$"},{icon:mt,labelKey:"workers-comp"},{icon:Os,labelKey:"affiliations"},{icon:mt,labelEn:"Bonded Employees",labelFr:"Employés cautionnés"}],nc=()=>{const{language:t}=F(),a=s=>s.labelKey==="workers-comp"?e.jsxs("span",{className:"text-sm font-medium leading-tight",children:[e.jsx(Ge,{label:"WSIB",titleEn:"Workplace Safety & Insurance Board (Ontario)",titleFr:"Commission de la sécurité professionnelle et de l'assurance contre les accidents du travail (Ontario)",href:"https://www.wsib.ca/en"})," · ",e.jsx(Ge,{label:"CNESST",titleEn:"Commission for Standards, Equity, Health and Safety at Work (Québec)",titleFr:"Commission des normes, de l'équité, de la santé et de la sécurité du travail (Québec)",href:"https://www.cnesst.gouv.qc.ca/"})," · ",e.jsx(Ge,{label:"WorkSafeBC",titleEn:"Workers' Compensation Board (British Columbia)",titleFr:"Commission des accidents du travail (Colombie-Britannique)",href:"https://www.worksafebc.com/"})]}):s.labelKey==="affiliations"?e.jsxs("span",{className:"text-sm font-medium leading-tight",children:[e.jsx(Ge,{label:"ISSA",titleEn:"International Sanitary Supply Association",titleFr:"Association internationale des fournisseurs de produits sanitaires"})," & ",e.jsx(Ge,{label:"BSCAI",titleEn:"Building Service Contractors Association International",titleFr:"Association internationale des entrepreneurs en services d'entretien"})," ",t==="fr"?"Affilié":"Affiliated"]}):e.jsx("span",{className:"text-sm font-medium leading-tight",children:t==="fr"?s.labelFr:s.labelEn});return e.jsx(er,{delayDuration:200,children:e.jsx("section",{className:"section-padding",children:e.jsx("div",{className:"container-custom",children:e.jsx("div",{className:"max-w-4xl mx-auto rounded-2xl border border-border bg-card p-8 md:p-12",children:e.jsxs("div",{className:"flex flex-col md:flex-row md:items-center md:justify-between gap-8",children:[e.jsxs("div",{className:"md:max-w-sm",children:[e.jsx("h2",{className:"text-2xl md:text-3xl font-light mb-3",children:t==="fr"?"Assurance & Conformité":"Insurance & Compliance"}),e.jsxs("p",{className:"text-silver-muted text-sm mb-4",children:[t==="fr"?"Protection complète pour votre entreprise, couvrant toutes les provinces où nous opérons. Nos protocoles respectent les ":"Complete protection for your business, covering every province we operate in. Our protocols align with ",e.jsx("a",{href:"https://www.canada.ca/en/public-health/services/publications/diseases-conditions/cleaning-disinfecting-public-spaces.html",target:"_blank",rel:"noopener noreferrer",className:"text-accent-blue hover:underline",children:t==="fr"?"directives de nettoyage et désinfection de Santé Canada":"Health Canada cleaning and disinfection guidance"}),"."]}),e.jsx(w,{to:"/insurance-risk",className:"text-sm text-silver-muted hover:text-foreground transition-colors inline-flex items-center gap-1",children:t==="fr"?"Voir les détails →":"View details →"})]}),e.jsx("div",{className:"grid grid-cols-2 gap-4 flex-1 md:max-w-md",children:rc.map((s,r)=>e.jsxs("div",{className:"flex flex-col items-center text-center gap-2 p-4 rounded-lg bg-muted/50",children:[e.jsx(s.icon,{className:"h-6 w-6 text-accent-blue shrink-0"}),a(s)]},s.labelKey||s.labelEn||r))})]})})})})})},ic=[{nameEn:"Marie Dubois",nameFr:"Marie Dubois",companyEn:"Director, Tech Solutions Inc.",companyFr:"Directrice, Tech Solutions Inc.",textEn:"Impeccable service for 3 years. The team is professional, punctual and our offices have never been cleaner.",textFr:"Service fiable depuis 3 ans. L'équipe est professionnelle, ponctuelle et nos bureaux n'ont jamais été aussi propres.",rating:5,location:"Toronto, ON"},{nameEn:"Jean Tremblay",nameFr:"Jean Tremblay",companyEn:"Owner, Boutique Élégance",companyFr:"Propriétaire, Boutique Élégance",textEn:"Simple Service transformed our store's maintenance. The digital management system keeps us always informed.",textFr:"Simple Service a transformé l'entretien de notre commerce. Leur système numérique nous garde toujours informés.",rating:5,location:"Montréal, QC"},{nameEn:"Sophie Martin",nameFr:"Sophie Martin",companyEn:"Event Manager",companyFr:"Gestionnaire d'Événements",textEn:"They saved our gala! Fast and efficient emergency service. I recommend them without hesitation.",textFr:"Ils ont sauvé notre gala! Service d'urgence rapide et efficace. Je les recommande sans hésitation.",rating:5,location:"Laval, QC"},{nameEn:"David Chen",nameFr:"David Chen",companyEn:"Operations Manager, Pacific Logistics",companyFr:"Directeur des opérations, Pacific Logistics",textEn:"Our 50,000 sq ft warehouse has never looked better. The crew is consistent and their photo-verified checklists give us full accountability.",textFr:"Notre entrepôt de 50 000 pi² n'a jamais été aussi propre. L'équipe est constante et leurs listes de vérification avec photos nous donnent une traçabilité complète.",rating:5,location:"Vancouver, BC"},{nameEn:"Fatima Al-Hassan",nameFr:"Fatima Al-Hassan",companyEn:"Clinic Administrator, MediCare Plus",companyFr:"Administratrice de clinique, MediCare Plus",textEn:"Healthcare cleaning requires strict standards. Simple Service meets every compliance requirement and their timestamped photo checklists give us peace of mind.",textFr:"Le nettoyage en santé exige des normes strictes. Simple Service respecte chaque exigence de conformité et leurs listes avec photos horodatées nous rassurent.",rating:5,location:"Mississauga, ON"},{nameEn:"Robert Gagnon",nameFr:"Robert Gagnon",companyEn:"Building Manager, Centre-Ville Properties",companyFr:"Gestionnaire d'immeuble, Propriétés Centre-Ville",textEn:"We switched from our previous provider and the transition was seamless. The 5-week onboarding program made all the difference.",textFr:"Nous avons changé de fournisseur et la transition a été transparente. Le programme d'intégration de 5 semaines a fait toute la différence.",rating:5,location:"Longueuil, QC"},{nameEn:"Karen Mitchell",nameFr:"Karen Mitchell",companyEn:"VP Facilities, NorthStar Financial",companyFr:"VP des installations, NorthStar Financial",textEn:"Managing 3 office locations across the GTA — Simple Service handles them all with the same high standard. Their account manager is incredibly responsive.",textFr:"Gestion de 3 bureaux dans le Grand Toronto — Simple Service les gère tous au même standard élevé. Leur gestionnaire de compte est extrêmement réactif.",rating:5,location:"North York, ON"},{nameEn:"Marco Bianchi",nameFr:"Marco Bianchi",companyEn:"Owner, Ristorante Bella",companyFr:"Propriétaire, Ristorante Bella",textEn:"A clean restaurant is everything. Daily deep cleaning of our kitchen and dining area — never a missed visit in 2 years.",textFr:"Un restaurant propre, c'est essentiel. Nettoyage quotidien en profondeur de notre cuisine et salle à manger — jamais une visite manquée en 2 ans.",rating:5,location:"Etobicoke, ON"},{nameEn:"Priya Sharma",nameFr:"Priya Sharma",companyEn:"School Principal, Bright Futures Academy",companyFr:"Directrice d'école, Académie Bright Futures",textEn:"The safety of our students is paramount. Simple Service uses eco-friendly products and their WHMIS compliance gives parents confidence.",textFr:"La sécurité de nos élèves est primordiale. Simple Service utilise des produits écologiques et leur conformité SIMDUT rassure les parents.",rating:5,location:"Brampton, ON"},{nameEn:"Alexandre Côté",nameFr:"Alexandre Côté",companyEn:"Plant Supervisor, QuébecTech Manufacturing",companyFr:"Superviseur d'usine, QuébecTech Manufacturing",textEn:"Industrial cleaning done right. Their team handles our production floor, loading docks, and break rooms — all CNESST compliant.",textFr:"Nettoyage industriel bien fait. Leur équipe s'occupe de notre plancher de production, quais de chargement et salles de pause — le tout conforme à la CNESST.",rating:5,location:"Terrebonne, QC"},{nameEn:"Linda Park",nameFr:"Linda Park",companyEn:"Property Manager, Skyline Realty",companyFr:"Gestionnaire immobilière, Skyline Realty",textEn:"We manage 12 commercial buildings and Simple Service cleans 8 of them. Consistent quality, fair pricing, and genuine accountability.",textFr:"Nous gérons 12 immeubles commerciaux et Simple Service en nettoie 8. Qualité constante, prix juste et responsabilité réelle.",rating:5,location:"Surrey, BC"},{nameEn:"James Wilson",nameFr:"James Wilson",companyEn:"Co-founder, HubSpace Coworking",companyFr:"Co-fondateur, HubSpace Coworking",textEn:"Our members expect a spotless workspace every morning. Simple Service delivers — 7 days a week, no exceptions.",textFr:"Nos membres s'attendent à un espace impeccable chaque matin. Simple Service livre — 7 jours sur 7, sans exception.",rating:5,location:"Burnaby, BC"}],oc=[{icon:Ue,valueEn:"$5M+ Insured",valueFr:"5M$+ Assuré",labelEn:"Liability coverage",labelFr:"Couverture responsabilité"},{icon:pt,valueEn:"4.9 / 5",valueFr:"4,9 / 5",labelEn:"Average client rating",labelFr:"Évaluation moyenne"},{icon:aa,valueEn:"500+",valueFr:"500+",labelEn:"Active clients",labelFr:"Clients actifs"},{icon:Os,valueEn:"98%",valueFr:"98%",labelEn:"Client retention rate",labelFr:"Taux de rétention"}],lc=()=>{const{language:t}=F();return e.jsx("section",{className:"section-padding bg-background",id:"testimonials",children:e.jsxs("div",{className:"container-custom",children:[e.jsxs("div",{className:"text-center mb-12",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light mb-4",children:t==="fr"?"Ce que disent nos clients":"What Our Clients Say"}),e.jsx("p",{className:"text-silver-muted max-w-2xl mx-auto",children:t==="fr"?"Des retours authentiques de clients satisfaits à travers le Canada":"Authentic feedback from satisfied clients across Canada"})]}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 max-w-4xl mx-auto mb-14",children:oc.map(a=>e.jsxs("div",{className:"flex items-center gap-3 bg-muted/50 border border-border rounded-xl p-4",children:[e.jsx(a.icon,{className:"h-6 w-6 text-accent-blue shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-lg font-semibold leading-tight",children:t==="fr"?a.valueFr:a.valueEn}),e.jsx("p",{className:"text-xs text-silver-muted",children:t==="fr"?a.labelFr:a.labelEn})]})]},a.valueEn))}),e.jsx("div",{className:"columns-1 md:columns-2 lg:columns-3 gap-6 max-w-6xl mx-auto space-y-6",children:ic.map((a,s)=>e.jsxs("article",{className:"break-inside-avoid p-6 bg-card border border-border rounded-lg hover:border-accent-blue/30 transition-all",children:[e.jsx("div",{className:"flex gap-1 mb-3",children:[...Array(a.rating)].map((r,i)=>e.jsx(pt,{className:"h-3.5 w-3.5 fill-yellow-400 text-yellow-400"},i))}),e.jsx(Oi,{className:"h-5 w-5 text-accent-blue/30 mb-2"}),e.jsxs("blockquote",{className:"text-silver text-sm leading-relaxed mb-4 italic",children:['"',t==="fr"?a.textFr:a.textEn,'"']}),e.jsxs("div",{className:"border-t border-border pt-3 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-semibold text-sm",children:t==="fr"?a.nameFr:a.nameEn}),e.jsx("p",{className:"text-silver-muted text-xs",children:t==="fr"?a.companyFr:a.companyEn})]}),e.jsx("span",{className:"text-[10px] text-silver-muted uppercase tracking-wider",children:a.location})]})]},s))}),e.jsx("div",{className:"text-center mt-12",children:e.jsxs("div",{className:"inline-flex items-center gap-2 bg-muted/50 border border-border rounded-full px-5 py-2.5",children:[e.jsx("div",{className:"flex gap-0.5",children:[...Array(5)].map((a,s)=>e.jsx(pt,{className:"h-4 w-4 fill-yellow-400 text-yellow-400"},s))}),e.jsx("span",{className:"text-sm font-medium",children:t==="fr"?"4,9 étoiles sur 500+ avis":"4.9 stars from 500+ reviews"})]})})]})})},cc=()=>{const{t,language:a}=F(),s=[{icon:Zt,title:t("caseStudies.case1.title"),problem:t("caseStudies.case1.challenge"),solution:t("caseStudies.case1.result"),metricLabel:t("caseStudies.case1.metricLabel"),baselineValue:"62%",resultValue:"95%",changeLabel:"+33 pts"},{icon:Xt,title:t("caseStudies.case2.title"),problem:t("caseStudies.case2.challenge"),solution:t("caseStudies.case2.result"),metricLabel:t("caseStudies.case2.metricLabel"),baselineValue:"1×",resultValue:"3×",changeLabel:"+200%"},{icon:_i,title:t("caseStudies.case3.title"),problem:t("caseStudies.case3.challenge"),solution:t("caseStudies.case3.result"),metricLabel:t("caseStudies.case3.metricLabel"),baselineValue:"100%",resultValue:"60%",changeLabel:"−40%"}];return e.jsxs("section",{className:"section-padding bg-background relative overflow-hidden",children:[e.jsx(Ee,{}),e.jsxs("div",{className:"container-custom relative z-10",children:[e.jsxs("div",{className:"text-center mb-16",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light mb-4 text-foreground",children:t("caseStudies.title")}),e.jsx("p",{className:"text-muted-foreground max-w-2xl mx-auto",children:t("caseStudies.subtitle")})]}),e.jsx("div",{className:"grid md:grid-cols-3 gap-8 max-w-6xl mx-auto",children:s.map((r,i)=>e.jsxs("article",{className:"bg-background border border-border rounded-xl overflow-hidden group hover:shadow-md transition-all",children:[e.jsxs("div",{className:"bg-muted/50 px-6 py-4 border-b border-border",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-xs uppercase tracking-wider text-muted-foreground",children:a==="fr"?"Avant":"Before"}),e.jsx("span",{className:"text-xs uppercase tracking-wider text-muted-foreground",children:a==="fr"?"Après":"After"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-lg text-muted-foreground font-light",children:r.baselineValue}),e.jsx("div",{className:"flex-1 h-2 rounded-full bg-border overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full bg-accent-blue transition-all duration-700",style:{width:i===1?"100%":i===2?"60%":"95%"}})}),e.jsx("span",{className:"text-lg font-medium text-foreground",children:r.resultValue})]}),e.jsxs("div",{className:"text-right mt-1",children:[e.jsx("span",{className:"text-xs font-mono text-foreground",children:r.changeLabel}),e.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:r.metricLabel})]})]}),e.jsxs("div",{className:"p-6 space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(r.icon,{className:"h-5 w-5 text-accent-blue"}),e.jsx("h3",{className:"text-lg font-medium text-foreground",children:r.title})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs uppercase tracking-wider text-muted-foreground mb-1",children:t("caseStudies.problemLabel")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:r.problem})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs uppercase tracking-wider text-muted-foreground mb-1",children:t("caseStudies.solutionLabel")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:r.solution})]})]})]},i))})]})]})},uc=[{nameEn:"Essential",nameFr:"Essentiel",rangeEn:"$0.08 – $0.14 /sq ft",rangeFr:"0,08 $ – 0,14 $ /pi²",descEn:"Core daily tasks — sweeping, mopping, trash, restrooms.",descFr:"Tâches quotidiennes de base — balayage, vadrouille, poubelles, salles de bain."},{nameEn:"Professional",nameFr:"Professionnel",rangeEn:"$0.14 – $0.22 /sq ft",rangeFr:"0,14 $ – 0,22 $ /pi²",descEn:"Enhanced coverage with deep cleaning, inspections & priority scheduling.",descFr:"Couverture élargie avec nettoyage en profondeur, inspections et planification prioritaire.",popular:!0},{nameEn:"Premium",nameFr:"Premium",rangeEn:"$0.22 – $0.35 /sq ft",rangeFr:"0,22 $ – 0,35 $ /pi²",descEn:"Full-service program — dedicated manager, 24/7 support, specialized treatments.",descFr:"Programme complet — gestionnaire dédié, support 24/7, traitements spécialisés."}],dc=()=>{const{language:t}=F();return e.jsx("section",{className:"section-padding bg-muted/30",children:e.jsxs("div",{className:"container-custom",children:[e.jsxs("div",{className:"text-center mb-12",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light mb-4",children:t==="fr"?"Aperçu tarifaire":"Pricing at a Glance"}),e.jsx("p",{className:"text-silver-muted max-w-2xl mx-auto",children:t==="fr"?"Fourchettes de prix indicatives pour le nettoyage commercial au Canada. Les tarifs varient selon la ville, la superficie et la fréquence.":"Indicative price ranges for commercial cleaning across Canada. Rates vary by city, square footage, and frequency."})]}),e.jsx("div",{className:"grid md:grid-cols-3 gap-6 max-w-4xl mx-auto mb-10",children:uc.map(a=>e.jsxs("div",{className:`relative p-6 rounded-xl border ${a.popular?"border-accent-blue bg-accent-blue/5":"border-border bg-card"}`,children:[a.popular&&e.jsx("span",{className:"absolute -top-3 left-1/2 -translate-x-1/2 text-xs font-medium bg-accent-blue text-white px-3 py-1 rounded-full",children:t==="fr"?"Populaire":"Popular"}),e.jsx("h3",{className:"text-lg font-medium mb-1",children:t==="fr"?a.nameFr:a.nameEn}),e.jsx("p",{className:"text-2xl font-light mb-3",children:t==="fr"?a.rangeFr:a.rangeEn}),e.jsx("p",{className:"text-sm text-silver-muted",children:t==="fr"?a.descFr:a.descEn})]},a.nameEn))}),e.jsx("div",{className:"text-center",children:e.jsx(Z,{variant:"outline",className:"border-foreground hover:bg-foreground hover:text-background",asChild:!0,children:e.jsxs(w,{to:"/pricing-calculator",className:"inline-flex items-center gap-2",children:[t==="fr"?"Calculer votre estimation":"Get your estimate",e.jsx(Oe,{className:"h-4 w-4"})]})})})]})})},pr=n.forwardRef((t,a)=>e.jsx("div",{"aria-hidden":"true",style:{position:"absolute",left:"-9999px",top:"auto",width:"1px",height:"1px",overflow:"hidden"},children:e.jsxs("label",{children:["Leave this field empty",e.jsx("input",{ref:a,type:"text",name:"website_url",tabIndex:-1,autoComplete:"off"})]})}));pr.displayName="HoneypotField";const Ye=n.forwardRef(({className:t,type:a,...s},r)=>e.jsx("input",{type:a,className:A("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-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 md:text-sm",t),ref:r,...s}));Ye.displayName="Input";const fr=n.forwardRef(({className:t,...a},s)=>e.jsx("textarea",{className:A("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-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),ref:s,...a}));fr.displayName="Textarea";const mc="https://ufahhldsmoiwtfsspfun.supabase.co",pc="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InVmYWhobGRzbW9pd3Rmc3NwZnVuIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjU3NjA0MzQsImV4cCI6MjA4MTMzNjQzNH0.VYLwLB2DT-H4UhJxlltQBgHD0myhVh_-MRPX7vPvT38",ke=an(mc,pc,{auth:{storage:localStorage,persistSession:!0,autoRefreshToken:!0}}),gr=n.forwardRef(({className:t,...a},s)=>e.jsx("div",{ref:s,className:A("rounded-lg border bg-card text-card-foreground shadow-sm",t),...a}));gr.displayName="Card";const fc=n.forwardRef(({className:t,...a},s)=>e.jsx("div",{ref:s,className:A("flex flex-col space-y-1.5 p-6",t),...a}));fc.displayName="CardHeader";const gc=n.forwardRef(({className:t,...a},s)=>e.jsx("h3",{ref:s,className:A("text-2xl font-semibold leading-none tracking-tight",t),...a}));gc.displayName="CardTitle";const hc=n.forwardRef(({className:t,...a},s)=>e.jsx("p",{ref:s,className:A("text-sm text-muted-foreground",t),...a}));hc.displayName="CardDescription";const vc=n.forwardRef(({className:t,...a},s)=>e.jsx("div",{ref:s,className:A("p-6 pt-0",t),...a}));vc.displayName="CardContent";const yc=n.forwardRef(({className:t,...a},s)=>e.jsx("div",{ref:s,className:A("flex items-center p-6 pt-0",t),...a}));yc.displayName="CardFooter";const xc=[{key:"office",en:"Office / Coworking",fr:"Bureau / Coworking"},{key:"warehouse",en:"Warehouse / Industrial",fr:"Entrepôt / Industriel"},{key:"retail",en:"Retail / Showroom",fr:"Commerce / Salle d'exposition"},{key:"medical",en:"Medical / Dental",fr:"Médical / Dentaire"},{key:"school",en:"School / Daycare",fr:"École / Garderie"},{key:"restaurant",en:"Restaurant / Kitchen",fr:"Restaurant / Cuisine"}],bc=[{key:"small",en:"Under 3,000 sq ft",fr:"Moins de 3 000 pi²"},{key:"medium",en:"3,000 – 10,000 sq ft",fr:"3 000 – 10 000 pi²"},{key:"large",en:"10,000 – 50,000 sq ft",fr:"10 000 – 50 000 pi²"},{key:"xlarge",en:"Over 50,000 sq ft",fr:"Plus de 50 000 pi²"}],wc=[{key:"general",en:"General Business",fr:"Entreprise générale"},{key:"healthcare",en:"Healthcare / Pharma",fr:"Santé / Pharma"},{key:"food",en:"Food Processing / Service",fr:"Agroalimentaire / Service"},{key:"tech",en:"Tech / Creative",fr:"Tech / Créatif"},{key:"logistics",en:"Logistics / Distribution",fr:"Logistique / Distribution"}];function jc(t,a,s,r){const i=["medical","restaurant","school"],o=["healthcare","food"];return i.includes(t)||o.includes(s)?{frequency:r==="fr"?"5–7 fois par semaine":"5–7 times per week",reason:r==="fr"?"Votre type d'installation nécessite un nettoyage quotidien pour la conformité sanitaire et la sécurité.":"Your facility type requires daily cleaning for health compliance and safety."}:a==="xlarge"||a==="large"?{frequency:r==="fr"?"3–5 fois par semaine":"3–5 times per week",reason:r==="fr"?"Les grands espaces accumulent rapidement poussière et débris — un nettoyage fréquent maintient les standards.":"Large spaces accumulate dust and debris quickly — frequent cleaning maintains standards."}:t==="warehouse"?{frequency:r==="fr"?"2–3 fois par semaine":"2–3 times per week",reason:r==="fr"?"Les entrepôts bénéficient d'un entretien régulier axé sur les planchers et les aires communes.":"Warehouses benefit from regular maintenance focused on floors and common areas."}:a==="small"&&(s==="tech"||s==="general")?{frequency:r==="fr"?"1–2 fois par semaine":"1–2 times per week",reason:r==="fr"?"Les petits bureaux à faible achalandage restent propres plus longtemps entre les nettoyages.":"Smaller offices with low foot traffic stay clean longer between cleanings."}:{frequency:r==="fr"?"2–3 fois par semaine":"2–3 times per week",reason:r==="fr"?"Un nettoyage bihebdomadaire ou trihebdomadaire garde votre espace professionnel et sain.":"Bi-weekly or tri-weekly cleaning keeps your space professional and healthy."}}function Ec(){const{language:t}=F(),[a,s]=n.useState("facility"),[r,i]=n.useState(""),[o,f]=n.useState(""),[l,p]=n.useState(""),[u,g]=n.useState(!1),x=h=>{a==="facility"?(i(h),s("size")):a==="size"?(f(h),s("industry")):(p(h),g(!0))},b=()=>{s("facility"),i(""),f(""),p(""),g(!1)},m=u?jc(r,o,l,t):null,T=a==="facility"?t==="fr"?"1/3 — Type d'installation":"1/3 — Facility Type":a==="size"?t==="fr"?"2/3 — Superficie":"2/3 — Size":t==="fr"?"3/3 — Industrie":"3/3 — Industry",v=a==="facility"?xc:a==="size"?bc:wc;return e.jsxs(gr,{className:"p-6 border-border bg-muted text-foreground",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[e.jsx(Ds,{className:"w-5 h-5 text-foreground shrink-0"}),e.jsx("h3",{className:"text-lg font-bold text-foreground",children:t==="fr"?"Quiz : À quelle fréquence nettoyer?":"Quiz: What Cleaning Frequency Do You Need?"})]}),u?m?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"bg-background border border-border rounded-lg p-4 text-center",children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-1",children:t==="fr"?"Fréquence recommandée":"Recommended Frequency"}),e.jsx("p",{className:"text-2xl font-bold text-foreground",children:m.frequency})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:m.reason}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(Z,{variant:"outline",size:"sm",onClick:b,children:[e.jsx(Ii,{className:"w-4 h-4 mr-1"}),t==="fr"?"Recommencer":"Retake"]}),e.jsx(Z,{size:"sm",asChild:!0,children:e.jsxs(w,{to:"/#contact",children:[t==="fr"?"Obtenir une soumission personnalisée":"Get a Custom Quote",e.jsx(Oe,{className:"w-4 h-4 ml-1"})]})})]})]}):null:e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:T}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-2",children:v.map(h=>e.jsx("button",{onClick:()=>x(h.key),className:"text-left px-3 py-2.5 rounded-lg border border-border text-sm text-foreground hover:bg-accent transition-colors",children:t==="fr"?h.fr:h.en},h.key))})]})]})}const Cc=sn({name:De().trim().min(1,"Name is required").max(100,"Name must be less than 100 characters"),company:De().trim().max(100,"Company must be less than 100 characters").optional(),phone:De().trim().max(20,"Phone must be less than 20 characters").optional(),email:De().trim().email("Invalid email address").max(255,"Email must be less than 255 characters"),message:De().trim().min(1,"Message is required").max(1e3,"Message must be less than 1000 characters")}),Sc=()=>{const{t,language:a}=F(),s=a==="fr",{toast:r}=fs(),[i,o]=n.useState(!1),[f,l]=n.useState(!1),p=n.useRef(null),[u,g]=n.useState({name:"",company:"",phone:"",email:"",message:""}),x=async m=>{var T;if(m.preventDefault(),!((T=p.current)!=null&&T.value)){try{Cc.parse(u)}catch(v){v instanceof rn&&r({title:"Validation Error",description:v.errors[0].message,variant:"destructive"});return}o(!0);try{const{data:v,error:h}=await ke.functions.invoke("send-contact-email",{body:{type:"contact",name:u.name,email:u.email,company:u.company||void 0,phone:u.phone||void 0,message:u.message}});if(h)throw new Error(h.message||"Failed to send message");if(!(v!=null&&v.success))throw new Error((v==null?void 0:v.error)||"Failed to send message");r({title:t("contact.success"),description:t("contact.successMessage")||"We'll get back to you soon!",duration:5e3}),nl(),g({name:"",company:"",phone:"",email:"",message:""}),l(!0)}catch(v){console.error("Error sending contact form:",v),r({title:"Error",description:v instanceof Error?v.message:"Failed to send message. Please try again.",variant:"destructive"})}finally{o(!1)}}},b=m=>{g({...u,[m.target.name]:m.target.value})};return e.jsx("section",{className:"section-padding",id:"contact",children:e.jsxs("div",{className:"container-custom max-w-5xl",children:[e.jsx("h2",{className:"text-3xl md:text-4xl font-light text-center mb-12",children:t("contact.title")}),e.jsxs("div",{className:"grid md:grid-cols-2 gap-8 items-stretch",children:[e.jsx("div",{className:"flex flex-col",children:f?e.jsxs("div",{className:"flex flex-col items-center justify-center text-center flex-1 border border-border rounded-lg bg-card p-8",children:[e.jsx("div",{className:"w-16 h-16 rounded-full bg-accent-blue/10 flex items-center justify-center mb-6",children:e.jsx(mt,{className:"w-8 h-8 text-accent-blue"})}),e.jsx("h3",{className:"text-xl font-light tracking-tight mb-2",children:s?"Merci pour votre demande":"Thank You for Your Request"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-6 max-w-sm",children:s?"Notre équipe a bien reçu votre message et vous contactera sous peu pour la suite.":"Our team has received your message and will reach out soon with next steps."}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3",children:[e.jsx(Z,{asChild:!0,variant:"outline",children:e.jsxs("a",{href:"tel:+15142376303",onClick:ia,children:[e.jsx(ta,{className:"mr-2 h-4 w-4"}),s?"Nous appeler":"Call Us"]})}),e.jsx(Z,{variant:"ghost",onClick:()=>l(!1),children:s?"Envoyer un autre message":"Send Another Message"})]}),e.jsx(w,{to:"/pricing-calculator",className:"mt-6 text-sm text-accent-blue hover:underline",children:s?"Calculer un prix":"Calculate a price"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-center mb-4",children:[e.jsx("h3",{className:"text-xl font-light tracking-tight mb-1",children:s?"Envoyez-nous un message":"Send Us a Message"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s?"Remplissez le formulaire et nous vous répondrons rapidement.":"Fill out the form and we'll get back to you shortly."})]}),e.jsxs("form",{onSubmit:x,className:"space-y-4 flex flex-col flex-1",children:[e.jsx(pr,{ref:p}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Ye,{name:"name",placeholder:t("contact.name"),value:u.name,onChange:b,required:!0,disabled:i,className:"bg-card border-border focus:border-silver transition-colors"}),e.jsx(Ye,{name:"company",placeholder:t("contact.company"),value:u.company,onChange:b,disabled:i,className:"bg-card border-border focus:border-silver transition-colors"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsx(Ye,{name:"phone",type:"tel",placeholder:t("contact.phone"),value:u.phone,onChange:b,disabled:i,className:"bg-card border-border focus:border-silver transition-colors"}),e.jsx(Ye,{name:"email",type:"email",placeholder:t("contact.email"),value:u.email,onChange:b,required:!0,disabled:i,className:"bg-card border-border focus:border-silver transition-colors"})]}),e.jsx(fr,{name:"message",placeholder:t("contact.message"),value:u.message,onChange:b,required:!0,disabled:i,rows:5,className:"bg-card border-border focus:border-silver transition-colors resize-none flex-1"}),e.jsx(Z,{type:"submit",size:"lg",disabled:i,className:"w-full bg-foreground text-background hover:bg-foreground/90 transition-all duration-300 group",children:i?e.jsxs(e.Fragment,{children:[e.jsx(ea,{className:"mr-2 h-4 w-4 animate-spin"}),t("contact.sending")||"Sending..."]}):e.jsxs(e.Fragment,{children:[t("contact.submit"),e.jsx(Ri,{className:"ml-2 h-4 w-4 group-hover:translate-x-1 transition-transform"})]})})]})]})}),e.jsxs("div",{className:"flex flex-col",children:[e.jsxs("div",{className:"text-center mb-4",children:[e.jsx("h3",{className:"text-xl font-light tracking-tight mb-1",children:s?"Quel est votre besoin en nettoyage ?":"What's Your Cleaning Need?"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s?"Répondez à 3 questions rapides pour une recommandation personnalisée.":"Answer 3 quick questions for a personalized recommendation."})]}),e.jsx(Ec,{})]})]})]})})},qc=n.lazy(()=>d(()=>import("./GallerySection-D0ZVa_4n.js"),__vite__mapDeps([0,1,2,3,4,5,6,7])).then(t=>({default:t.GallerySection}))),Nc=n.lazy(()=>d(()=>Promise.resolve().then(()=>kc),void 0).then(t=>({default:t.Footer}))),_c=()=>{const{hash:t}=Je();return n.useEffect(()=>{if(t){const a=t.replace("#","");setTimeout(()=>{var s;(s=document.getElementById(a))==null||s.scrollIntoView({behavior:"smooth"})},100)}},[t]),e.jsxs(e.Fragment,{children:[e.jsx(Vl,{}),e.jsxs("div",{className:"min-h-screen",children:[e.jsx(lr,{}),e.jsxs("main",{children:[e.jsx(Nl,{}),e.jsx(kl,{}),e.jsx(Rl,{}),e.jsx(Wl,{}),e.jsx($l,{}),e.jsx(sc,{}),e.jsx(Tl,{}),e.jsx(Ql,{}),e.jsx(nc,{}),e.jsx(Gl,{}),e.jsx(dc,{}),e.jsx(cc,{}),e.jsx(lc,{}),e.jsx(n.Suspense,{fallback:e.jsx("div",{className:"section-padding"}),children:e.jsx(qc,{})}),e.jsx(Ul,{}),e.jsx(Sc,{}),e.jsx("section",{className:"container-custom py-12",children:e.jsxs("div",{className:"max-w-4xl mx-auto space-y-6 text-sm text-muted-foreground",children:[e.jsx("h2",{className:"text-2xl font-light tracking-tight text-foreground",children:"Professional Commercial Cleaning Services Across Canada"}),e.jsx("p",{children:"Simple Service is a trusted Canadian commercial cleaning company providing professional janitorial, office, industrial, and specialized cleaning services across the Greater Toronto Area, Greater Montreal Area, and Metro Vancouver. We serve businesses of every size — from small offices and retail stores to large warehouses, factories, healthcare facilities, and educational institutions."}),e.jsx("h3",{className:"text-lg font-medium text-foreground",children:"Our Services Include"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1",children:[e.jsx("li",{children:"Daily office cleaning & floor care"}),e.jsx("li",{children:"Carpet shampooing & hot-water extraction"}),e.jsx("li",{children:"Interior & exterior window washing"}),e.jsx("li",{children:"Post-construction cleanup & debris removal"}),e.jsx("li",{children:"Event venue setup & teardown cleaning"}),e.jsx("li",{children:"Industrial degreasing & high-pressure washing"}),e.jsx("li",{children:"Restroom sanitation & high-touch disinfection"})]}),e.jsx("h3",{className:"text-lg font-medium text-foreground",children:"How It Works"}),e.jsxs("ol",{className:"list-decimal list-inside space-y-1",children:[e.jsx("li",{children:"Request a free, no-obligation quote online or by phone."}),e.jsx("li",{children:"We conduct an on-site walkthrough and customise a cleaning plan."}),e.jsx("li",{children:"A dedicated crew is assigned to your facility with a set schedule."}),e.jsx("li",{children:"Every visit is documented with timestamped before/after photos reviewed by a supervisor."}),e.jsx("li",{children:"Ongoing quality inspections ensure consistent results."})]}),e.jsx("blockquote",{className:"border-l-4 border-accent-blue pl-4 italic",children:`"We don't just clean — we build systems that keep your facility consistently maintained, fully documented, and always audit-ready."`}),e.jsx("p",{children:"We proudly serve Toronto, North York, Scarborough, Etobicoke, East York, York, Mississauga, Brampton, Vaughan, Montreal, Laval, Longueuil, Brossard, Terrebonne, Vancouver, Burnaby, Surrey, Richmond, North Vancouver, and Coquitlam. Each location benefits from dedicated local teams, regular quality inspections, and customizable cleaning schedules tailored to your facility's unique needs."}),e.jsx("p",{children:"Whether you need a one-time deep clean, ongoing daily janitorial service, or a fully managed cleaning program for a multi-site portfolio, Simple Service delivers reliable, professional results backed by liability insurance, CNESST compliance, and transparent pricing. Contact us today for a free, no-obligation commercial cleaning quote for your business."})]})})]}),e.jsx(n.Suspense,{fallback:null,children:e.jsx(Nc,{})})]})]})},Aa=[{slug:"office-cleaning",label:"Office Cleaning",labelFr:"Nettoyage de bureaux",mainPage:"/office-cleaning"},{slug:"commercial-cleaning",label:"Commercial Cleaning",labelFr:"Nettoyage commercial",mainPage:"/commercial-cleaning"},{slug:"industrial-cleaning",label:"Industrial Cleaning",labelFr:"Nettoyage industriel",mainPage:"/industrial-cleaning"},{slug:"event-cleaning",label:"Event Cleaning",labelFr:"Nettoyage d'événements",mainPage:"/events-cleaning"},{slug:"specialized-cleaning",label:"Specialized Cleaning",labelFr:"Nettoyage spécialisé",mainPage:"/specialized-cleaning"}],Bt=[{slug:"toronto",label:"Toronto (GTA)",labelFr:"Toronto (GTA)",generalPage:"/commercial-cleaning-toronto"},{slug:"north-york",label:"North York",labelFr:"North York",generalPage:"/commercial-cleaning-north-york"},{slug:"scarborough",label:"Scarborough",labelFr:"Scarborough",generalPage:"/commercial-cleaning-scarborough"},{slug:"etobicoke",label:"Etobicoke",labelFr:"Etobicoke",generalPage:"/commercial-cleaning-etobicoke"},{slug:"east-york",label:"East York",labelFr:"East York",generalPage:"/commercial-cleaning-east-york"},{slug:"york",label:"York",labelFr:"York",generalPage:"/commercial-cleaning-york"},{slug:"mississauga",label:"Mississauga",labelFr:"Mississauga",generalPage:"/commercial-cleaning-mississauga"},{slug:"brampton",label:"Brampton",labelFr:"Brampton",generalPage:"/commercial-cleaning-brampton"},{slug:"vaughan",label:"Vaughan",labelFr:"Vaughan",generalPage:"/commercial-cleaning-vaughan"}],Wt=[{slug:"vancouver",label:"Vancouver",labelFr:"Vancouver",generalPage:"/commercial-cleaning-vancouver"},{slug:"burnaby",label:"Burnaby",labelFr:"Burnaby",generalPage:"/commercial-cleaning-burnaby"},{slug:"richmond",label:"Richmond",labelFr:"Richmond",generalPage:"/commercial-cleaning-richmond"},{slug:"surrey",label:"Surrey",labelFr:"Surrey",generalPage:"/commercial-cleaning-surrey"},{slug:"north-vancouver",label:"North Vancouver",labelFr:"North Vancouver",generalPage:"/commercial-cleaning-north-vancouver"},{slug:"coquitlam",label:"Coquitlam",labelFr:"Coquitlam",generalPage:"/commercial-cleaning-coquitlam"}],Ht=[{slug:"montreal",label:"Montreal",labelFr:"Montréal",generalPage:"/commercial-cleaning-montreal"},{slug:"laval",label:"Laval",labelFr:"Laval",generalPage:"/commercial-cleaning-laval"},{slug:"longueuil",label:"Longueuil",labelFr:"Longueuil",generalPage:"/commercial-cleaning-longueuil"},{slug:"brossard",label:"Brossard",labelFr:"Brossard",generalPage:"/commercial-cleaning-brossard"},{slug:"terrebonne",label:"Terrebonne",labelFr:"Terrebonne",generalPage:"/commercial-cleaning-terrebonne"}],Tc=[...Bt,...Wt,...Ht],hr=()=>{const{t,language:a}=F(),s=new Date().getFullYear();return e.jsx("footer",{className:"border-t border-border section-padding bg-card",children:e.jsxs("div",{className:"container-custom",children:[e.jsxs("div",{className:"grid md:grid-cols-2 lg:grid-cols-4 gap-12 mb-12",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-2xl font-light mb-4",children:"Simple Service"}),e.jsx("p",{className:"text-silver-muted italic mb-6",children:t("footer.tagline")}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(zi,{className:"h-5 w-5 text-silver"}),e.jsx("a",{href:"/contact",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Nous contacter":"Contact Us"})]})]}),e.jsxs("div",{children:[e.jsxs("h4",{className:"text-lg font-medium mb-4 flex items-center gap-2",children:[e.jsx(Bi,{className:"h-5 w-5 text-silver"}),"Services"]}),e.jsx("div",{className:"flex flex-col gap-2",children:Aa.map(r=>e.jsx(w,{to:r.mainPage,className:"text-silver hover:text-foreground transition-colors text-sm",children:a==="fr"?r.labelFr:r.label},r.slug))})]}),e.jsxs("div",{children:[e.jsxs("h4",{className:"text-lg font-medium mb-4 flex items-center gap-2",children:[e.jsx(ht,{className:"h-5 w-5 text-silver"}),a==="fr"?"Zones de service":"Service Areas"]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-silver-muted",children:"GTA"}),e.jsx("div",{className:"grid grid-cols-2 gap-1",children:Bt.map(r=>e.jsx(w,{to:r.generalPage,className:"text-silver hover:text-foreground transition-colors text-sm",children:a==="fr"?r.labelFr:r.label},r.slug))})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-silver-muted",children:"Vancouver"}),e.jsx("div",{className:"grid grid-cols-2 gap-1",children:Wt.map(r=>e.jsx(w,{to:r.generalPage,className:"text-silver hover:text-foreground transition-colors text-sm",children:a==="fr"?r.labelFr:r.label},r.slug))})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-silver-muted",children:a==="fr"?"Montréal":"Montreal"}),e.jsx("div",{className:"grid grid-cols-2 gap-1",children:Ht.map(r=>e.jsx(w,{to:r.generalPage,className:"text-silver hover:text-foreground transition-colors text-sm",children:a==="fr"?r.labelFr:r.label},r.slug))})]})]})]}),e.jsxs("div",{children:[e.jsxs("h4",{className:"text-lg font-medium mb-4 flex items-center gap-2",children:[e.jsx(dt,{className:"h-5 w-5 text-silver"}),a==="fr"?"Tarification":"Pricing"]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(w,{to:"/pricing-calculator",className:"text-silver hover:text-foreground transition-colors text-sm",children:a==="fr"?"Calculateur de prix":"Price Calculator"}),e.jsxs("span",{className:"text-xs text-silver-muted mt-2 flex items-center gap-1",children:[e.jsx(Tt,{className:"h-3 w-3"}),"Guides — GTA"]}),Bt.map(r=>e.jsx(w,{to:`/pricing-guide/${r.slug}`,className:"text-silver hover:text-foreground transition-colors text-sm pl-2",children:a==="fr"?r.labelFr:r.label},`pricing-${r.slug}`)),e.jsxs("span",{className:"text-xs text-silver-muted mt-2 flex items-center gap-1",children:[e.jsx(Tt,{className:"h-3 w-3"}),"Guides — Vancouver"]}),Wt.map(r=>e.jsx(w,{to:`/pricing-guide/${r.slug}`,className:"text-silver hover:text-foreground transition-colors text-sm pl-2",children:a==="fr"?r.labelFr:r.label},`pricing-${r.slug}`)),e.jsxs("span",{className:"text-xs text-silver-muted mt-2 flex items-center gap-1",children:[e.jsx(Tt,{className:"h-3 w-3"}),a==="fr"?"Guides — Montréal":"Guides — Montreal"]}),Ht.map(r=>e.jsx(w,{to:`/pricing-guide/${r.slug}`,className:"text-silver hover:text-foreground transition-colors text-sm pl-2",children:a==="fr"?r.labelFr:r.label},`pricing-${r.slug}`))]})]})]}),e.jsxs("div",{className:"border-t border-border pt-8 mb-8",children:[e.jsx("h4",{className:"text-lg font-medium mb-6 text-center",children:a==="fr"?"Services par ville":"Services by City"}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-6",children:Tc.map(r=>e.jsxs("div",{children:[e.jsx("h5",{className:"font-medium text-foreground mb-2",children:a==="fr"?r.labelFr:r.label}),e.jsx("div",{className:"flex flex-col gap-1",children:Aa.map(i=>e.jsx(w,{to:`/services/${i.slug}/${r.slug}`,className:"text-xs text-silver-muted hover:text-foreground transition-colors",children:a==="fr"?i.labelFr:i.label},`${r.slug}-${i.slug}`))})]},r.slug))})]}),e.jsx("div",{className:"border-t border-border pt-8 mb-8",children:e.jsxs("div",{className:"flex flex-wrap justify-center gap-6 text-sm",children:[e.jsx(w,{to:"/",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Accueil":"Home"}),e.jsx(w,{to:"/about",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"À propos":"About"}),e.jsx(w,{to:"/contact",className:"text-silver hover:text-foreground transition-colors",children:"Contact"}),e.jsx(w,{to:"/blog",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Blogue":"Blog"}),e.jsx(w,{to:"/careers",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Carrières":"Careers"}),e.jsx(w,{to:"/how-we-operate",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Comment nous opérons":"How We Operate"}),e.jsx(w,{to:"/service-structure",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Structure de service":"Service Structure"}),e.jsx(w,{to:"/insurance-risk",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Assurance et risques":"Insurance & Risk"}),e.jsx(w,{to:"/escalation-process",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Processus d'escalade":"Escalation Process"}),e.jsx(w,{to:"/proof-of-process",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Preuve de processus":"Proof of Process"}),e.jsx(w,{to:"/transition-support",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Support de transition":"Transition Support"}),e.jsx(w,{to:"/privacy-policy",className:"text-silver hover:text-foreground transition-colors",children:a==="fr"?"Politique de confidentialité":"Privacy Policy"})]})}),e.jsx("div",{className:"pt-8 border-t border-border text-center",children:e.jsxs("p",{className:"text-silver-muted text-sm",children:["© ",s," Simple Cleaning. ",t("footer.rights")]})})]})})},kc=Object.freeze(Object.defineProperty({__proto__:null,Footer:hr},Symbol.toStringTag,{value:"Module"})),zc=()=>{const t=Je(),{language:a}=F();return n.useEffect(()=>{console.error("404 Error: User attempted to access non-existent route:",t.pathname)},[t.pathname]),e.jsxs("div",{className:"min-h-screen",children:[e.jsx(cr,{title:a==="fr"?"Page introuvable | Simple Service":"Page Not Found | Simple Service",description:a==="fr"?"La page demandée est introuvable. Retournez à l'accueil de Simple Service.":"The requested page could not be found. Return to Simple Service homepage.",path:t.pathname}),e.jsx(lr,{}),e.jsx("div",{className:"flex min-h-[70vh] items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-4 text-6xl font-light text-foreground",children:"404"}),e.jsx("p",{className:"mb-6 text-xl text-silver-muted",children:a==="fr"?"Page introuvable":"Oops! Page not found"}),e.jsx("a",{href:"/",className:"text-accent-blue hover:underline",children:a==="fr"?"Retour à l'accueil":"Return to Home"})]})}),e.jsx(hr,{})]})};function Pc(){const[t,a]=n.useState(null),[s,r]=n.useState(null),[i,o]=n.useState(!0),[f,l]=n.useState(!1);n.useEffect(()=>{const{data:{subscription:x}}=ke.auth.onAuthStateChange((b,m)=>{r(m),a((m==null?void 0:m.user)??null),m!=null&&m.user?setTimeout(()=>{p()},0):(l(!1),o(!1))});return ke.auth.getSession().then(({data:{session:b}})=>{r(b),a((b==null?void 0:b.user)??null),b!=null&&b.user?p():o(!1)}),()=>x.unsubscribe()},[]);const p=async()=>{try{const{data:x,error:b}=await ke.from("admin_users").select("id").limit(1);l(b?!1:x!==null&&x.length>=0)}catch{l(!1)}finally{o(!1)}};return{user:t,session:s,loading:i,isAdmin:f,signIn:async(x,b)=>{const{error:m}=await ke.auth.signInWithPassword({email:x,password:b});return{error:m}},signOut:async()=>{const{error:x}=await ke.auth.signOut();return{error:x}}}}function Ac(){const{user:t,isAdmin:a,loading:s,signOut:r}=Pc(),i=as(),o=Je();n.useEffect(()=>{!s&&(!t||!a)&&i("/admin/login")},[t,a,s,i]);const f=async()=>{await r(),i("/admin/login")};if(s)return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background",children:e.jsx(ea,{className:"h-8 w-8 animate-spin text-muted-foreground"})});if(!t||!a)return null;const l=[{href:"/admin/blog",label:"Posts",icon:Ti},{href:"/admin/blog/authors",label:"Authors",icon:aa},{href:"/admin/blog/categories",label:"Categories",icon:Ni},{href:"/admin/applications",label:"Applications",icon:Is}];return e.jsxs("div",{className:"min-h-screen bg-background",children:[e.jsx("header",{className:"border-b border-border bg-card",children:e.jsxs("div",{className:"container-custom flex items-center justify-between h-16",children:[e.jsxs(w,{to:"/",className:"flex items-center gap-2",children:[e.jsx(Bs,{className:"h-6 w-6 text-foreground",strokeWidth:1.5}),e.jsx("span",{className:"font-medium",children:"Simple."}),e.jsx("span",{className:"text-muted-foreground",children:"Admin"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:t.email}),e.jsxs(Z,{variant:"ghost",size:"sm",onClick:f,children:[e.jsx(ki,{className:"h-4 w-4 mr-2"}),"Sign out"]})]})]})}),e.jsx("nav",{className:"border-b border-border bg-card/50",children:e.jsx("div",{className:"container-custom",children:e.jsx("div",{className:"flex gap-1",children:l.map(p=>{const u=o.pathname===p.href||p.href==="/admin/blog"&&o.pathname.startsWith("/admin/blog")&&!o.pathname.includes("/authors")&&!o.pathname.includes("/categories")&&!o.pathname.includes("/applications");return e.jsxs(w,{to:p.href,className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-[1px] ${u?"border-foreground text-foreground":"border-transparent text-muted-foreground hover:text-foreground"}`,children:[e.jsx(p.icon,{className:"h-4 w-4"}),p.label]},p.href)})})})}),e.jsx("main",{className:"container-custom py-8",children:e.jsx(ln,{})})]})}const Lc=n.lazy(()=>d(()=>import("./Blog-Bdn-8Jv2.js"),__vite__mapDeps([8,1,2,7,9,6,10,11,12,4,5]))),Oc=n.lazy(()=>d(()=>import("./BlogPost-Cjbt2wQg.js"),__vite__mapDeps([13,1,2,7,9,6,14,15,16,17,11,12,4,5]))),Ic=n.lazy(()=>d(()=>import("./AdminLogin-Cwvb4PEF.js"),__vite__mapDeps([18,1,2,19,7,4,5,6]))),Rc=n.lazy(()=>d(()=>import("./AdminBlogPosts-CCep-VOU.js"),__vite__mapDeps([20,1,2,7,9,6,10,21,22,11,15,23,24,25,26,4,5]))),La=n.lazy(()=>d(()=>import("./AdminPostForm-DCgOxohm.js"),__vite__mapDeps([27,1,2,7,9,6,28,10,14,15,16,19,21,29,30,12,4,5]))),Mc=n.lazy(()=>d(()=>import("./AdminAuthors-C_MmTnof.js"),__vite__mapDeps([31,1,2,7,28,6,19,22,32,15,29,23,24,12,26,4,5]))),Fc=n.lazy(()=>d(()=>import("./AdminCategories-D24klFEx.js"),__vite__mapDeps([33,1,2,7,10,6,19,22,32,15,29,23,26,30,4,5]))),Dc=n.lazy(()=>d(()=>import("./Toronto-BhvzM0c4.js"),__vite__mapDeps([34,1,2,35,7,36,37,38,39,17,4,5,6]))),Vc=n.lazy(()=>d(()=>import("./NorthYork-DZlOIjAg.js"),__vite__mapDeps([40,1,2,35,7,36,37,38,39,17,4,5,6]))),Bc=n.lazy(()=>d(()=>import("./Scarborough-CV-xCH0u.js"),__vite__mapDeps([41,1,2,35,7,36,37,38,39,17,4,5,6]))),Wc=n.lazy(()=>d(()=>import("./Etobicoke-DNhE6f4m.js"),__vite__mapDeps([42,1,2,35,7,36,37,38,39,17,4,5,6]))),Hc=n.lazy(()=>d(()=>import("./EastYork-BIUC2kpn.js"),__vite__mapDeps([43,1,2,35,7,36,37,38,39,17,4,5,6]))),$c=n.lazy(()=>d(()=>import("./York-DINfXb6j.js"),__vite__mapDeps([44,1,2,35,7,36,37,38,39,17,4,5,6]))),Gc=n.lazy(()=>d(()=>import("./Vaughan-DeHQXa2b.js"),__vite__mapDeps([45,1,2,35,7,36,37,38,39,17,4,5,6]))),Yc=n.lazy(()=>d(()=>import("./Mississauga-P8J2D7wX.js"),__vite__mapDeps([46,1,2,35,7,36,37,38,39,17,4,5,6]))),Qc=n.lazy(()=>d(()=>import("./Brampton-C5Teec2c.js"),__vite__mapDeps([47,1,2,35,7,36,37,38,39,17,4,5,6]))),Kc=n.lazy(()=>d(()=>import("./Vancouver-C_6mumdF.js"),__vite__mapDeps([48,1,2,35,7,36,37,38,39,17,4,5,6]))),Uc=n.lazy(()=>d(()=>import("./Burnaby-BR1Atozy.js"),__vite__mapDeps([49,1,2,35,7,36,37,38,39,17,4,5,6]))),Jc=n.lazy(()=>d(()=>import("./Richmond-yWLi4T6n.js"),__vite__mapDeps([50,1,2,35,7,36,37,38,39,17,4,5,6]))),Zc=n.lazy(()=>d(()=>import("./Surrey-Bjth-gtC.js"),__vite__mapDeps([51,1,2,35,7,36,37,38,39,17,4,5,6]))),Xc=n.lazy(()=>d(()=>import("./NorthVancouver-DMVRyQye.js"),__vite__mapDeps([52,1,2,35,7,36,37,38,39,17,4,5,6]))),eu=n.lazy(()=>d(()=>import("./Coquitlam-BwznB3NJ.js"),__vite__mapDeps([53,1,2,35,7,36,37,38,39,17,4,5,6]))),tu=n.lazy(()=>d(()=>import("./Montreal-fy5ik5BI.js"),__vite__mapDeps([54,1,2,35,7,36,37,38,39,17,4,5,6]))),au=n.lazy(()=>d(()=>import("./Laval-QnubYm9a.js"),__vite__mapDeps([55,1,2,35,7,36,37,38,39,17,4,5,6]))),su=n.lazy(()=>d(()=>import("./Longueuil-dSphCdVV.js"),__vite__mapDeps([56,1,2,35,7,36,37,38,39,17,4,5,6]))),ru=n.lazy(()=>d(()=>import("./Brossard-CHK8_jDU.js"),__vite__mapDeps([57,1,2,35,7,36,37,38,39,17,4,5,6]))),nu=n.lazy(()=>d(()=>import("./Terrebonne-_rT1DmDh.js"),__vite__mapDeps([58,1,2,35,7,36,37,38,39,17,4,5,6]))),iu=n.lazy(()=>d(()=>import("./NeighborhoodPage-dTgqUIgf.js"),__vite__mapDeps([59,1,2,7,36,37,38,39,17,4,5,6]))),ou=n.lazy(()=>d(()=>import("./IndustrialCleaning-BIjoMdxt.js"),__vite__mapDeps([60,1,2,61,7,36,37,38,17,62,63,4,5,6]))),lu=n.lazy(()=>d(()=>import("./OfficeCleaning-DrbwOnKV.js"),__vite__mapDeps([64,1,2,61,7,36,37,38,17,26,4,5,6]))),cu=n.lazy(()=>d(()=>import("./CommercialCleaning-BTT-pwu7.js"),__vite__mapDeps([65,1,2,61,7,36,37,38,17,66,4,5,6]))),uu=n.lazy(()=>d(()=>import("./EventsCleaning-DJ7LI6mY.js"),__vite__mapDeps([67,1,2,61,7,36,37,38,17,68,4,5,6]))),du=n.lazy(()=>d(()=>import("./SpecializedCleaning-DWyq9lNy.js"),__vite__mapDeps([69,1,2,61,7,36,37,38,17,70,71,72,4,5,6]))),mu=n.lazy(()=>d(()=>import("./NettoyageCommercial-BSnd0t03.js"),__vite__mapDeps([73,1,2,74,7,66,70,62,75,63,71,68,4,5,6]))),pu=n.lazy(()=>d(()=>import("./NettoyageBureaux-CdjnwsG0.js"),__vite__mapDeps([76,1,2,74,7,66,70,62,75,63,71,68,4,5,6]))),fu=n.lazy(()=>d(()=>import("./NettoyageIndustriel-DL854S75.js"),__vite__mapDeps([77,1,2,74,7,66,70,62,75,63,71,68,4,5,6]))),gu=n.lazy(()=>d(()=>import("./NettoyageSpecialise-Q0NFOqJ-.js"),__vite__mapDeps([78,1,2,74,7,66,70,62,75,63,71,68,4,5,6]))),hu=n.lazy(()=>d(()=>import("./NettoyageEvenements-Iv1sg8zJ.js"),__vite__mapDeps([79,1,2,74,7,66,70,62,75,63,71,68,4,5,6]))),vu=n.lazy(()=>d(()=>import("./About-ChbAmW01.js"),__vite__mapDeps([80,1,2,7,38,4,5,6]))),yu=n.lazy(()=>d(()=>import("./Contact-2j4Dnqh6.js"),__vite__mapDeps([81,1,2,7,4,5,6]))),xu=n.lazy(()=>d(()=>import("./ThankYou-EUoTtW-C.js"),__vite__mapDeps([82,1,2,7,29,4,5,6]))),bu=n.lazy(()=>d(()=>import("./OfficeCleaningToronto-BJ5Ve8gw.js"),__vite__mapDeps([83,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),wu=n.lazy(()=>d(()=>import("./CommercialCleaningToronto-DnzWM7MG.js"),__vite__mapDeps([85,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),ju=n.lazy(()=>d(()=>import("./IndustrialCleaningToronto-BL40tUjG.js"),__vite__mapDeps([86,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Eu=n.lazy(()=>d(()=>import("./EventCleaningToronto-DwNY6smn.js"),__vite__mapDeps([87,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Cu=n.lazy(()=>d(()=>import("./SpecializedCleaningToronto-D6N5eKXH.js"),__vite__mapDeps([88,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Su=n.lazy(()=>d(()=>import("./OfficeCleaningVancouver-BJGpkENa.js"),__vite__mapDeps([89,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),qu=n.lazy(()=>d(()=>import("./CommercialCleaningVancouver-DMSZU72n.js"),__vite__mapDeps([90,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Nu=n.lazy(()=>d(()=>import("./IndustrialCleaningVancouver-DPm_GcFF.js"),__vite__mapDeps([91,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),_u=n.lazy(()=>d(()=>import("./EventCleaningVancouver-BfmKdfy1.js"),__vite__mapDeps([92,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Tu=n.lazy(()=>d(()=>import("./SpecializedCleaningVancouver-CnpEFzQR.js"),__vite__mapDeps([93,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),ku=n.lazy(()=>d(()=>import("./OfficeCleaningMontreal-_MuS6w_Q.js"),__vite__mapDeps([94,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),zu=n.lazy(()=>d(()=>import("./CommercialCleaningMontreal-_S6zy8Tp.js"),__vite__mapDeps([95,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Pu=n.lazy(()=>d(()=>import("./IndustrialCleaningMontreal-Bk-siFAt.js"),__vite__mapDeps([96,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Au=n.lazy(()=>d(()=>import("./EventCleaningMontreal-CFdOWNIE.js"),__vite__mapDeps([97,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Lu=n.lazy(()=>d(()=>import("./SpecializedCleaningMontreal-6pjqUVQr.js"),__vite__mapDeps([98,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ou=n.lazy(()=>d(()=>import("./OfficeCleaningMississauga-CZixjBhS.js"),__vite__mapDeps([99,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Iu=n.lazy(()=>d(()=>import("./CommercialCleaningMississauga-BOulHlDV.js"),__vite__mapDeps([100,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ru=n.lazy(()=>d(()=>import("./IndustrialCleaningMississauga-DKeXxxAc.js"),__vite__mapDeps([101,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Mu=n.lazy(()=>d(()=>import("./EventCleaningMississauga-C_begcJr.js"),__vite__mapDeps([102,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Fu=n.lazy(()=>d(()=>import("./SpecializedCleaningMississauga-DXcF_5mg.js"),__vite__mapDeps([103,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Du=n.lazy(()=>d(()=>import("./OfficeCleaningBrampton-W8wnoWdy.js"),__vite__mapDeps([104,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Vu=n.lazy(()=>d(()=>import("./CommercialCleaningBrampton-D_ObZp-q.js"),__vite__mapDeps([105,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Bu=n.lazy(()=>d(()=>import("./IndustrialCleaningBrampton-BGrHhOgC.js"),__vite__mapDeps([106,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Wu=n.lazy(()=>d(()=>import("./EventCleaningBrampton-CmwYymjl.js"),__vite__mapDeps([107,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Hu=n.lazy(()=>d(()=>import("./SpecializedCleaningBrampton-CJf3htLV.js"),__vite__mapDeps([108,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),$u=n.lazy(()=>d(()=>import("./OfficeCleaningVaughan-CiJDgMVR.js"),__vite__mapDeps([109,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Gu=n.lazy(()=>d(()=>import("./CommercialCleaningVaughan-DmY-cxP4.js"),__vite__mapDeps([110,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Yu=n.lazy(()=>d(()=>import("./IndustrialCleaningVaughan-DttNw9ld.js"),__vite__mapDeps([111,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Qu=n.lazy(()=>d(()=>import("./EventCleaningVaughan-CiPxZqoh.js"),__vite__mapDeps([112,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ku=n.lazy(()=>d(()=>import("./SpecializedCleaningVaughan-BkI7TDkO.js"),__vite__mapDeps([113,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Uu=n.lazy(()=>d(()=>import("./OfficeCleaningLaval-e8-fFKlt.js"),__vite__mapDeps([114,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ju=n.lazy(()=>d(()=>import("./CommercialCleaningLaval-COosOchC.js"),__vite__mapDeps([115,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Zu=n.lazy(()=>d(()=>import("./IndustrialCleaningLaval-DPa58XEO.js"),__vite__mapDeps([116,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Xu=n.lazy(()=>d(()=>import("./EventCleaningLaval-Cr_UuaP5.js"),__vite__mapDeps([117,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),ed=n.lazy(()=>d(()=>import("./SpecializedCleaningLaval-D7npuLIi.js"),__vite__mapDeps([118,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),td=n.lazy(()=>d(()=>import("./OfficeCleaningLongueuil-f1Qs7UXK.js"),__vite__mapDeps([119,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),ad=n.lazy(()=>d(()=>import("./CommercialCleaningLongueuil-YMkGoHDp.js"),__vite__mapDeps([120,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),sd=n.lazy(()=>d(()=>import("./IndustrialCleaningLongueuil-C1wbL5aU.js"),__vite__mapDeps([121,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),rd=n.lazy(()=>d(()=>import("./EventCleaningLongueuil-D9Prg0vG.js"),__vite__mapDeps([122,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),nd=n.lazy(()=>d(()=>import("./SpecializedCleaningLongueuil-i4yrF6Mz.js"),__vite__mapDeps([123,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),id=n.lazy(()=>d(()=>import("./OfficeCleaningBrossard-LT6EvQUX.js"),__vite__mapDeps([124,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),od=n.lazy(()=>d(()=>import("./CommercialCleaningBrossard-DYk6DrlO.js"),__vite__mapDeps([125,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),ld=n.lazy(()=>d(()=>import("./IndustrialCleaningBrossard-NaI1XySF.js"),__vite__mapDeps([126,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),cd=n.lazy(()=>d(()=>import("./EventCleaningBrossard-DjtGY1Uu.js"),__vite__mapDeps([127,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),ud=n.lazy(()=>d(()=>import("./SpecializedCleaningBrossard-CPOWG-L6.js"),__vite__mapDeps([128,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),dd=n.lazy(()=>d(()=>import("./OfficeCleaningTerrebonne-DYtTIFdB.js"),__vite__mapDeps([129,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),md=n.lazy(()=>d(()=>import("./CommercialCleaningTerrebonne-DeGYNCN2.js"),__vite__mapDeps([130,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),pd=n.lazy(()=>d(()=>import("./IndustrialCleaningTerrebonne-C4Ozyios.js"),__vite__mapDeps([131,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),fd=n.lazy(()=>d(()=>import("./EventCleaningTerrebonne-D6qkPPtV.js"),__vite__mapDeps([132,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),gd=n.lazy(()=>d(()=>import("./SpecializedCleaningTerrebonne-BVpvbptT.js"),__vite__mapDeps([133,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),hd=n.lazy(()=>d(()=>import("./OfficeCleaningNorthYork-BzhumAI-.js"),__vite__mapDeps([134,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),vd=n.lazy(()=>d(()=>import("./CommercialCleaningNorthYork-BzNdVZEq.js"),__vite__mapDeps([135,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),yd=n.lazy(()=>d(()=>import("./IndustrialCleaningNorthYork-Dah6apfZ.js"),__vite__mapDeps([136,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),xd=n.lazy(()=>d(()=>import("./EventCleaningNorthYork-BEJTG23B.js"),__vite__mapDeps([137,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),bd=n.lazy(()=>d(()=>import("./SpecializedCleaningNorthYork-DNBNSaZP.js"),__vite__mapDeps([138,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),wd=n.lazy(()=>d(()=>import("./OfficeCleaningScarborough-CKeXjI50.js"),__vite__mapDeps([139,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),jd=n.lazy(()=>d(()=>import("./CommercialCleaningScarborough-BvpkTEVU.js"),__vite__mapDeps([140,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ed=n.lazy(()=>d(()=>import("./IndustrialCleaningScarborough-BX7fWNff.js"),__vite__mapDeps([141,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Cd=n.lazy(()=>d(()=>import("./EventCleaningScarborough-Bo9FLaAD.js"),__vite__mapDeps([142,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Sd=n.lazy(()=>d(()=>import("./SpecializedCleaningScarborough-DcJS3zYK.js"),__vite__mapDeps([143,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),qd=n.lazy(()=>d(()=>import("./OfficeCleaningEtobicoke-BDDaEIV2.js"),__vite__mapDeps([144,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Nd=n.lazy(()=>d(()=>import("./CommercialCleaningEtobicoke-CI09AQRg.js"),__vite__mapDeps([145,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),_d=n.lazy(()=>d(()=>import("./IndustrialCleaningEtobicoke-BoNRmpNK.js"),__vite__mapDeps([146,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Td=n.lazy(()=>d(()=>import("./EventCleaningEtobicoke-DmjQe2kN.js"),__vite__mapDeps([147,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),kd=n.lazy(()=>d(()=>import("./SpecializedCleaningEtobicoke-B1LymGdy.js"),__vite__mapDeps([148,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),zd=n.lazy(()=>d(()=>import("./OfficeCleaningEastYork-BB8465s1.js"),__vite__mapDeps([149,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Pd=n.lazy(()=>d(()=>import("./CommercialCleaningEastYork-CXXSFXTh.js"),__vite__mapDeps([150,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ad=n.lazy(()=>d(()=>import("./IndustrialCleaningEastYork-BBb3KgE2.js"),__vite__mapDeps([151,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ld=n.lazy(()=>d(()=>import("./EventCleaningEastYork-B4UwcNVx.js"),__vite__mapDeps([152,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Od=n.lazy(()=>d(()=>import("./SpecializedCleaningEastYork-BwDVwGDI.js"),__vite__mapDeps([153,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Id=n.lazy(()=>d(()=>import("./OfficeCleaningYork-CCzdoIvG.js"),__vite__mapDeps([154,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Rd=n.lazy(()=>d(()=>import("./CommercialCleaningYork-DbcOm1C6.js"),__vite__mapDeps([155,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Md=n.lazy(()=>d(()=>import("./IndustrialCleaningYork-CR65jG3v.js"),__vite__mapDeps([156,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Fd=n.lazy(()=>d(()=>import("./EventCleaningYork-YzUN4bNN.js"),__vite__mapDeps([157,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Dd=n.lazy(()=>d(()=>import("./SpecializedCleaningYork-B1ntk4SS.js"),__vite__mapDeps([158,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Vd=n.lazy(()=>d(()=>import("./OfficeCleaningBurnaby-_8dDY8bE.js"),__vite__mapDeps([159,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Bd=n.lazy(()=>d(()=>import("./CommercialCleaningBurnaby-DRDxBsAH.js"),__vite__mapDeps([160,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Wd=n.lazy(()=>d(()=>import("./IndustrialCleaningBurnaby-IJ6BzvjI.js"),__vite__mapDeps([161,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Hd=n.lazy(()=>d(()=>import("./EventCleaningBurnaby-BgWsFx8s.js"),__vite__mapDeps([162,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),$d=n.lazy(()=>d(()=>import("./SpecializedCleaningBurnaby-Ce9xEvls.js"),__vite__mapDeps([163,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Gd=n.lazy(()=>d(()=>import("./OfficeCleaningRichmond-D8ViN5LU.js"),__vite__mapDeps([164,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Yd=n.lazy(()=>d(()=>import("./CommercialCleaningRichmond-Cm4XVaFk.js"),__vite__mapDeps([165,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Qd=n.lazy(()=>d(()=>import("./IndustrialCleaningRichmond-CpGpoGy7.js"),__vite__mapDeps([166,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Kd=n.lazy(()=>d(()=>import("./EventCleaningRichmond-DiKjTVEQ.js"),__vite__mapDeps([167,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Ud=n.lazy(()=>d(()=>import("./SpecializedCleaningRichmond-CcHot0m-.js"),__vite__mapDeps([168,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Jd=n.lazy(()=>d(()=>import("./OfficeCleaningSurrey-apS6zlWG.js"),__vite__mapDeps([169,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Zd=n.lazy(()=>d(()=>import("./CommercialCleaningSurrey-C6Y0pF2i.js"),__vite__mapDeps([170,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),Xd=n.lazy(()=>d(()=>import("./IndustrialCleaningSurrey-ClPgKOfa.js"),__vite__mapDeps([171,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),em=n.lazy(()=>d(()=>import("./EventCleaningSurrey-DkjY2rt7.js"),__vite__mapDeps([172,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),tm=n.lazy(()=>d(()=>import("./SpecializedCleaningSurrey-C6qLg5zk.js"),__vite__mapDeps([173,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),am=n.lazy(()=>d(()=>import("./OfficeCleaningNorthVancouver-DrPYllTi.js"),__vite__mapDeps([174,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),sm=n.lazy(()=>d(()=>import("./CommercialCleaningNorthVancouver-BLPfOGgt.js"),__vite__mapDeps([175,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),rm=n.lazy(()=>d(()=>import("./IndustrialCleaningNorthVancouver-75gjtpGy.js"),__vite__mapDeps([176,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),nm=n.lazy(()=>d(()=>import("./EventCleaningNorthVancouver-CmzpyTgV.js"),__vite__mapDeps([177,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),im=n.lazy(()=>d(()=>import("./SpecializedCleaningNorthVancouver-dp9gEZC7.js"),__vite__mapDeps([178,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),om=n.lazy(()=>d(()=>import("./OfficeCleaningCoquitlam-D0fJndpX.js"),__vite__mapDeps([179,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),lm=n.lazy(()=>d(()=>import("./CommercialCleaningCoquitlam-B6qOt10u.js"),__vite__mapDeps([180,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),cm=n.lazy(()=>d(()=>import("./IndustrialCleaningCoquitlam-DuH32h_F.js"),__vite__mapDeps([181,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),um=n.lazy(()=>d(()=>import("./EventCleaningCoquitlam-BHb1p6VZ.js"),__vite__mapDeps([182,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),dm=n.lazy(()=>d(()=>import("./SpecializedCleaningCoquitlam-CocR7hSB.js"),__vite__mapDeps([183,1,2,84,7,36,37,38,17,66,62,75,70,68,71,72,4,5,6]))),mm=n.lazy(()=>d(()=>import("./PricingEducationToronto-BW8F4NA_.js"),__vite__mapDeps([184,1,2,185,7,186,187,25,188,4,5,6]))),pm=n.lazy(()=>d(()=>import("./PricingEducationMontreal-Cv4RU0Jz.js"),__vite__mapDeps([189,1,2,185,7,186,187,25,188,4,5,6]))),fm=n.lazy(()=>d(()=>import("./PricingEducationVancouver-CTc2AUxY.js"),__vite__mapDeps([190,1,2,185,7,186,187,25,188,4,5,6]))),gm=n.lazy(()=>d(()=>import("./PricingEducationVaughan-bR7GITc4.js"),__vite__mapDeps([191,1,2,185,7,186,187,25,188,4,5,6]))),hm=n.lazy(()=>d(()=>import("./PricingEducationBrampton-CyZuGx5V.js"),__vite__mapDeps([192,1,2,185,7,186,187,25,188,4,5,6]))),vm=n.lazy(()=>d(()=>import("./PricingEducationMississauga-BOsjhLSO.js"),__vite__mapDeps([193,1,2,185,7,186,187,25,188,4,5,6]))),ym=n.lazy(()=>d(()=>import("./PricingEducationNorthYork-BJ0O7aHX.js"),__vite__mapDeps([194,1,2,185,7,186,187,25,188,4,5,6]))),xm=n.lazy(()=>d(()=>import("./PricingEducationScarborough-DQrrK--g.js"),__vite__mapDeps([195,1,2,185,7,186,187,25,188,4,5,6]))),bm=n.lazy(()=>d(()=>import("./PricingEducationEtobicoke-DYFNNAAW.js"),__vite__mapDeps([196,1,2,185,7,186,187,25,188,4,5,6]))),wm=n.lazy(()=>d(()=>import("./PricingEducationEastYork-DsCLYi7j.js"),__vite__mapDeps([197,1,2,185,7,186,187,25,188,4,5,6]))),jm=n.lazy(()=>d(()=>import("./PricingEducationYork-2bcJxgwG.js"),__vite__mapDeps([198,1,2,185,7,186,187,25,188,4,5,6]))),Em=n.lazy(()=>d(()=>import("./PricingEducationBurnaby-BtbFf_40.js"),__vite__mapDeps([199,1,2,185,7,186,187,25,188,4,5,6]))),Cm=n.lazy(()=>d(()=>import("./PricingEducationRichmond-CDXJKnQA.js"),__vite__mapDeps([200,1,2,185,7,186,187,25,188,4,5,6]))),Sm=n.lazy(()=>d(()=>import("./PricingEducationSurrey-D6rZ8Eio.js"),__vite__mapDeps([201,1,2,185,7,186,187,25,188,4,5,6]))),qm=n.lazy(()=>d(()=>import("./PricingEducationNorthVancouver-CrsiocsW.js"),__vite__mapDeps([202,1,2,185,7,186,187,25,188,4,5,6]))),Nm=n.lazy(()=>d(()=>import("./PricingEducationCoquitlam-EuNJlSuZ.js"),__vite__mapDeps([203,1,2,185,7,186,187,25,188,4,5,6]))),_m=n.lazy(()=>d(()=>import("./PricingEducationLaval-BWoeZ9zy.js"),__vite__mapDeps([204,1,2,185,7,186,187,25,188,4,5,6]))),Tm=n.lazy(()=>d(()=>import("./PricingEducationLongueuil-C_rYDhDP.js"),__vite__mapDeps([205,1,2,185,7,186,187,25,188,4,5,6]))),km=n.lazy(()=>d(()=>import("./PricingEducationBrossard-B3tW5HUJ.js"),__vite__mapDeps([206,1,2,185,7,186,187,25,188,4,5,6]))),zm=n.lazy(()=>d(()=>import("./PricingEducationTerrebonne-CRVLyksB.js"),__vite__mapDeps([207,1,2,185,7,186,187,25,188,4,5,6]))),Pm=n.lazy(()=>d(()=>import("./PricingCalculator-C_t_avfI.js"),__vite__mapDeps([208,1,2,7,19,21,26,23,187,4,5,6]))),Am=n.lazy(()=>d(()=>import("./HowWeOperate-CXjGJ3IQ.js"),__vite__mapDeps([209,1,2,37,72,4,5,6,7]))),Lm=n.lazy(()=>d(()=>import("./ServiceStructure-C1lA2Chm.js"),__vite__mapDeps([210,1,2,4,5,6,7]))),Om=n.lazy(()=>d(()=>import("./EscalationProcess-BKYTPEIz.js"),__vite__mapDeps([211,1,2,187,4,5,6,7]))),Im=n.lazy(()=>d(()=>import("./InsuranceRisk-CPxweT49.js"),__vite__mapDeps([212,1,2,4,5,6,7]))),Rm=n.lazy(()=>d(()=>import("./ProofOfProcess-BYjzpmtH.js"),__vite__mapDeps([213,1,2,214,4,5,6,7]))),Mm=n.lazy(()=>d(()=>import("./TransitionSupport-8Q41Ya6v.js"),__vite__mapDeps([215,1,2,4,5,6,7]))),Fm=n.lazy(()=>d(()=>import("./ResponsibleCleaning-XSb3UxO-.js"),__vite__mapDeps([216,1,2,7,38,214,70,188,4,5,6]))),Dm=n.lazy(()=>d(()=>import("./PrivacyPolicy-dMDhqKjm.js"),__vite__mapDeps([217,1,2,4,5,6,7]))),Vm=n.lazy(()=>d(()=>import("./Careers-K417E3ey.js"),__vite__mapDeps([218,1,2,3,186,188,6,4,5,7]))),Bm=n.lazy(()=>d(()=>import("./AdminApplications-iVpnEBUE.js"),__vite__mapDeps([219,1,2,6,11,26,4,5,7]))),Wm=new nn,Hm=()=>e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background",children:e.jsx(ea,{className:"h-8 w-8 animate-spin text-muted-foreground"})}),$m=()=>e.jsx(ms,{children:e.jsx(Gn,{children:e.jsx(on,{client:Wm,children:e.jsxs(er,{children:[e.jsx(So,{}),e.jsx(Xo,{}),e.jsxs(cn,{future:{v7_startTransition:!0,v7_relativeSplatPath:!0},children:[e.jsx(al,{}),e.jsx(sl,{}),e.jsx(il,{}),e.jsx(cl,{}),e.jsx(n.Suspense,{fallback:e.jsx(Hm,{}),children:e.jsxs(un,{children:[e.jsx(c,{path:"/",element:e.jsx(_c,{})}),e.jsx(c,{path:"/home",element:e.jsx(jt,{to:"/",replace:!0})}),e.jsx(c,{path:"/fr",element:e.jsx(jt,{to:"/?lang=fr",replace:!0})}),e.jsx(c,{path:"/terms-and-conditions",element:e.jsx(jt,{to:"/privacy-policy",replace:!0})}),e.jsx(c,{path:"/privacy-policy",element:e.jsx(Dm,{})}),e.jsx(c,{path:"/about",element:e.jsx(vu,{})}),e.jsx(c,{path:"/contact",element:e.jsx(yu,{})}),e.jsx(c,{path:"/thank-you",element:e.jsx(xu,{})}),e.jsx(c,{path:"/blog",element:e.jsx(Lc,{})}),e.jsx(c,{path:"/blog/:slug",element:e.jsx(Oc,{})}),e.jsx(c,{path:"/commercial-cleaning-toronto",element:e.jsx(Dc,{})}),e.jsx(c,{path:"/commercial-cleaning-north-york",element:e.jsx(Vc,{})}),e.jsx(c,{path:"/commercial-cleaning-scarborough",element:e.jsx(Bc,{})}),e.jsx(c,{path:"/commercial-cleaning-etobicoke",element:e.jsx(Wc,{})}),e.jsx(c,{path:"/commercial-cleaning-east-york",element:e.jsx(Hc,{})}),e.jsx(c,{path:"/commercial-cleaning-york",element:e.jsx($c,{})}),e.jsx(c,{path:"/commercial-cleaning-vaughan",element:e.jsx(Gc,{})}),e.jsx(c,{path:"/commercial-cleaning-mississauga",element:e.jsx(Yc,{})}),e.jsx(c,{path:"/commercial-cleaning-brampton",element:e.jsx(Qc,{})}),e.jsx(c,{path:"/commercial-cleaning-vancouver",element:e.jsx(Kc,{})}),e.jsx(c,{path:"/commercial-cleaning-burnaby",element:e.jsx(Uc,{})}),e.jsx(c,{path:"/commercial-cleaning-richmond",element:e.jsx(Jc,{})}),e.jsx(c,{path:"/commercial-cleaning-surrey",element:e.jsx(Zc,{})}),e.jsx(c,{path:"/commercial-cleaning-north-vancouver",element:e.jsx(Xc,{})}),e.jsx(c,{path:"/commercial-cleaning-coquitlam",element:e.jsx(eu,{})}),e.jsx(c,{path:"/commercial-cleaning-montreal",element:e.jsx(tu,{})}),e.jsx(c,{path:"/commercial-cleaning-laval",element:e.jsx(au,{})}),e.jsx(c,{path:"/commercial-cleaning-longueuil",element:e.jsx(su,{})}),e.jsx(c,{path:"/commercial-cleaning-brossard",element:e.jsx(ru,{})}),e.jsx(c,{path:"/commercial-cleaning-terrebonne",element:e.jsx(nu,{})}),ar.map(t=>e.jsx(c,{path:`/commercial-cleaning-${t.slug}`,element:e.jsx(iu,{slug:t.slug})},t.slug)),e.jsx(c,{path:"/industrial-cleaning",element:e.jsx(ou,{})}),e.jsx(c,{path:"/office-cleaning",element:e.jsx(lu,{})}),e.jsx(c,{path:"/commercial-cleaning",element:e.jsx(cu,{})}),e.jsx(c,{path:"/events-cleaning",element:e.jsx(uu,{})}),e.jsx(c,{path:"/specialized-cleaning",element:e.jsx(du,{})}),e.jsx(c,{path:"/fr/nettoyage-commercial",element:e.jsx(mu,{})}),e.jsx(c,{path:"/fr/nettoyage-bureaux",element:e.jsx(pu,{})}),e.jsx(c,{path:"/fr/nettoyage-industriel",element:e.jsx(fu,{})}),e.jsx(c,{path:"/fr/nettoyage-specialise",element:e.jsx(gu,{})}),e.jsx(c,{path:"/fr/nettoyage-evenements",element:e.jsx(hu,{})}),e.jsx(c,{path:"/services/office-cleaning/toronto",element:e.jsx(bu,{})}),e.jsx(c,{path:"/services/commercial-cleaning/toronto",element:e.jsx(wu,{})}),e.jsx(c,{path:"/services/industrial-cleaning/toronto",element:e.jsx(ju,{})}),e.jsx(c,{path:"/services/event-cleaning/toronto",element:e.jsx(Eu,{})}),e.jsx(c,{path:"/services/specialized-cleaning/toronto",element:e.jsx(Cu,{})}),e.jsx(c,{path:"/services/office-cleaning/vancouver",element:e.jsx(Su,{})}),e.jsx(c,{path:"/services/commercial-cleaning/vancouver",element:e.jsx(qu,{})}),e.jsx(c,{path:"/services/industrial-cleaning/vancouver",element:e.jsx(Nu,{})}),e.jsx(c,{path:"/services/event-cleaning/vancouver",element:e.jsx(_u,{})}),e.jsx(c,{path:"/services/specialized-cleaning/vancouver",element:e.jsx(Tu,{})}),e.jsx(c,{path:"/services/office-cleaning/montreal",element:e.jsx(ku,{})}),e.jsx(c,{path:"/services/commercial-cleaning/montreal",element:e.jsx(zu,{})}),e.jsx(c,{path:"/services/industrial-cleaning/montreal",element:e.jsx(Pu,{})}),e.jsx(c,{path:"/services/event-cleaning/montreal",element:e.jsx(Au,{})}),e.jsx(c,{path:"/services/specialized-cleaning/montreal",element:e.jsx(Lu,{})}),e.jsx(c,{path:"/services/office-cleaning/mississauga",element:e.jsx(Ou,{})}),e.jsx(c,{path:"/services/commercial-cleaning/mississauga",element:e.jsx(Iu,{})}),e.jsx(c,{path:"/services/industrial-cleaning/mississauga",element:e.jsx(Ru,{})}),e.jsx(c,{path:"/services/event-cleaning/mississauga",element:e.jsx(Mu,{})}),e.jsx(c,{path:"/services/specialized-cleaning/mississauga",element:e.jsx(Fu,{})}),e.jsx(c,{path:"/services/office-cleaning/brampton",element:e.jsx(Du,{})}),e.jsx(c,{path:"/services/commercial-cleaning/brampton",element:e.jsx(Vu,{})}),e.jsx(c,{path:"/services/industrial-cleaning/brampton",element:e.jsx(Bu,{})}),e.jsx(c,{path:"/services/event-cleaning/brampton",element:e.jsx(Wu,{})}),e.jsx(c,{path:"/services/specialized-cleaning/brampton",element:e.jsx(Hu,{})}),e.jsx(c,{path:"/services/office-cleaning/vaughan",element:e.jsx($u,{})}),e.jsx(c,{path:"/services/commercial-cleaning/vaughan",element:e.jsx(Gu,{})}),e.jsx(c,{path:"/services/industrial-cleaning/vaughan",element:e.jsx(Yu,{})}),e.jsx(c,{path:"/services/event-cleaning/vaughan",element:e.jsx(Qu,{})}),e.jsx(c,{path:"/services/specialized-cleaning/vaughan",element:e.jsx(Ku,{})}),e.jsx(c,{path:"/services/office-cleaning/laval",element:e.jsx(Uu,{})}),e.jsx(c,{path:"/services/commercial-cleaning/laval",element:e.jsx(Ju,{})}),e.jsx(c,{path:"/services/industrial-cleaning/laval",element:e.jsx(Zu,{})}),e.jsx(c,{path:"/services/event-cleaning/laval",element:e.jsx(Xu,{})}),e.jsx(c,{path:"/services/specialized-cleaning/laval",element:e.jsx(ed,{})}),e.jsx(c,{path:"/services/office-cleaning/longueuil",element:e.jsx(td,{})}),e.jsx(c,{path:"/services/commercial-cleaning/longueuil",element:e.jsx(ad,{})}),e.jsx(c,{path:"/services/industrial-cleaning/longueuil",element:e.jsx(sd,{})}),e.jsx(c,{path:"/services/event-cleaning/longueuil",element:e.jsx(rd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/longueuil",element:e.jsx(nd,{})}),e.jsx(c,{path:"/services/office-cleaning/brossard",element:e.jsx(id,{})}),e.jsx(c,{path:"/services/commercial-cleaning/brossard",element:e.jsx(od,{})}),e.jsx(c,{path:"/services/industrial-cleaning/brossard",element:e.jsx(ld,{})}),e.jsx(c,{path:"/services/event-cleaning/brossard",element:e.jsx(cd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/brossard",element:e.jsx(ud,{})}),e.jsx(c,{path:"/services/office-cleaning/terrebonne",element:e.jsx(dd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/terrebonne",element:e.jsx(md,{})}),e.jsx(c,{path:"/services/industrial-cleaning/terrebonne",element:e.jsx(pd,{})}),e.jsx(c,{path:"/services/event-cleaning/terrebonne",element:e.jsx(fd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/terrebonne",element:e.jsx(gd,{})}),e.jsx(c,{path:"/services/office-cleaning/north-york",element:e.jsx(hd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/north-york",element:e.jsx(vd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/north-york",element:e.jsx(yd,{})}),e.jsx(c,{path:"/services/event-cleaning/north-york",element:e.jsx(xd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/north-york",element:e.jsx(bd,{})}),e.jsx(c,{path:"/services/office-cleaning/scarborough",element:e.jsx(wd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/scarborough",element:e.jsx(jd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/scarborough",element:e.jsx(Ed,{})}),e.jsx(c,{path:"/services/event-cleaning/scarborough",element:e.jsx(Cd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/scarborough",element:e.jsx(Sd,{})}),e.jsx(c,{path:"/services/office-cleaning/etobicoke",element:e.jsx(qd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/etobicoke",element:e.jsx(Nd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/etobicoke",element:e.jsx(_d,{})}),e.jsx(c,{path:"/services/event-cleaning/etobicoke",element:e.jsx(Td,{})}),e.jsx(c,{path:"/services/specialized-cleaning/etobicoke",element:e.jsx(kd,{})}),e.jsx(c,{path:"/services/office-cleaning/east-york",element:e.jsx(zd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/east-york",element:e.jsx(Pd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/east-york",element:e.jsx(Ad,{})}),e.jsx(c,{path:"/services/event-cleaning/east-york",element:e.jsx(Ld,{})}),e.jsx(c,{path:"/services/specialized-cleaning/east-york",element:e.jsx(Od,{})}),e.jsx(c,{path:"/services/office-cleaning/york",element:e.jsx(Id,{})}),e.jsx(c,{path:"/services/commercial-cleaning/york",element:e.jsx(Rd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/york",element:e.jsx(Md,{})}),e.jsx(c,{path:"/services/event-cleaning/york",element:e.jsx(Fd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/york",element:e.jsx(Dd,{})}),e.jsx(c,{path:"/services/office-cleaning/burnaby",element:e.jsx(Vd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/burnaby",element:e.jsx(Bd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/burnaby",element:e.jsx(Wd,{})}),e.jsx(c,{path:"/services/event-cleaning/burnaby",element:e.jsx(Hd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/burnaby",element:e.jsx($d,{})}),e.jsx(c,{path:"/services/office-cleaning/richmond",element:e.jsx(Gd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/richmond",element:e.jsx(Yd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/richmond",element:e.jsx(Qd,{})}),e.jsx(c,{path:"/services/event-cleaning/richmond",element:e.jsx(Kd,{})}),e.jsx(c,{path:"/services/specialized-cleaning/richmond",element:e.jsx(Ud,{})}),e.jsx(c,{path:"/services/office-cleaning/surrey",element:e.jsx(Jd,{})}),e.jsx(c,{path:"/services/commercial-cleaning/surrey",element:e.jsx(Zd,{})}),e.jsx(c,{path:"/services/industrial-cleaning/surrey",element:e.jsx(Xd,{})}),e.jsx(c,{path:"/services/event-cleaning/surrey",element:e.jsx(em,{})}),e.jsx(c,{path:"/services/specialized-cleaning/surrey",element:e.jsx(tm,{})}),e.jsx(c,{path:"/services/office-cleaning/north-vancouver",element:e.jsx(am,{})}),e.jsx(c,{path:"/services/commercial-cleaning/north-vancouver",element:e.jsx(sm,{})}),e.jsx(c,{path:"/services/industrial-cleaning/north-vancouver",element:e.jsx(rm,{})}),e.jsx(c,{path:"/services/event-cleaning/north-vancouver",element:e.jsx(nm,{})}),e.jsx(c,{path:"/services/specialized-cleaning/north-vancouver",element:e.jsx(im,{})}),e.jsx(c,{path:"/services/office-cleaning/coquitlam",element:e.jsx(om,{})}),e.jsx(c,{path:"/services/commercial-cleaning/coquitlam",element:e.jsx(lm,{})}),e.jsx(c,{path:"/services/industrial-cleaning/coquitlam",element:e.jsx(cm,{})}),e.jsx(c,{path:"/services/event-cleaning/coquitlam",element:e.jsx(um,{})}),e.jsx(c,{path:"/services/specialized-cleaning/coquitlam",element:e.jsx(dm,{})}),e.jsx(c,{path:"/pricing-guide/toronto",element:e.jsx(mm,{})}),e.jsx(c,{path:"/pricing-guide/montreal",element:e.jsx(pm,{})}),e.jsx(c,{path:"/pricing-guide/vancouver",element:e.jsx(fm,{})}),e.jsx(c,{path:"/pricing-guide/vaughan",element:e.jsx(gm,{})}),e.jsx(c,{path:"/pricing-guide/brampton",element:e.jsx(hm,{})}),e.jsx(c,{path:"/pricing-guide/mississauga",element:e.jsx(vm,{})}),e.jsx(c,{path:"/pricing-guide/north-york",element:e.jsx(ym,{})}),e.jsx(c,{path:"/pricing-guide/scarborough",element:e.jsx(xm,{})}),e.jsx(c,{path:"/pricing-guide/etobicoke",element:e.jsx(bm,{})}),e.jsx(c,{path:"/pricing-guide/east-york",element:e.jsx(wm,{})}),e.jsx(c,{path:"/pricing-guide/york",element:e.jsx(jm,{})}),e.jsx(c,{path:"/pricing-guide/burnaby",element:e.jsx(Em,{})}),e.jsx(c,{path:"/pricing-guide/richmond",element:e.jsx(Cm,{})}),e.jsx(c,{path:"/pricing-guide/surrey",element:e.jsx(Sm,{})}),e.jsx(c,{path:"/pricing-guide/north-vancouver",element:e.jsx(qm,{})}),e.jsx(c,{path:"/pricing-guide/coquitlam",element:e.jsx(Nm,{})}),e.jsx(c,{path:"/pricing-guide/laval",element:e.jsx(_m,{})}),e.jsx(c,{path:"/pricing-guide/longueuil",element:e.jsx(Tm,{})}),e.jsx(c,{path:"/pricing-guide/brossard",element:e.jsx(km,{})}),e.jsx(c,{path:"/pricing-guide/terrebonne",element:e.jsx(zm,{})}),e.jsx(c,{path:"/pricing-calculator",element:e.jsx(Pm,{})}),e.jsx(c,{path:"/how-we-operate",element:e.jsx(Am,{})}),e.jsx(c,{path:"/service-structure",element:e.jsx(Lm,{})}),e.jsx(c,{path:"/escalation-process",element:e.jsx(Om,{})}),e.jsx(c,{path:"/insurance-risk",element:e.jsx(Im,{})}),e.jsx(c,{path:"/proof-of-process",element:e.jsx(Rm,{})}),e.jsx(c,{path:"/transition-support",element:e.jsx(Mm,{})}),e.jsx(c,{path:"/responsible-cleaning",element:e.jsx(Fm,{})}),e.jsx(c,{path:"/careers",element:e.jsx(Vm,{})}),e.jsx(c,{path:"/admin/login",element:e.jsx(Ic,{})}),e.jsxs(c,{path:"/admin",element:e.jsx(Ac,{}),children:[e.jsx(c,{path:"blog",element:e.jsx(Rc,{})}),e.jsx(c,{path:"blog/new",element:e.jsx(La,{})}),e.jsx(c,{path:"blog/edit/:id",element:e.jsx(La,{})}),e.jsx(c,{path:"blog/authors",element:e.jsx(Mc,{})}),e.jsx(c,{path:"blog/categories",element:e.jsx(Fc,{})}),e.jsx(c,{path:"applications",element:e.jsx(Bm,{})})]}),e.jsx(c,{path:"*",element:e.jsx(zc,{})})]})})]})]})})})});ss(document.getElementById("root")).render(e.jsx(pn,{children:e.jsx($m,{})}));export{ia as $,Oe as A,Z as B,Ei as C,ur as D,dr as E,hr as F,mr as G,Yt as H,Ye as I,Mi as J,_i as K,ea as L,ht as M,lr as N,Jt as O,Rs as P,Oi as Q,Ft as R,cr as S,fr as T,pt as U,Ue as V,Bi as W,Ws as X,aa as Y,gt as Z,Li as _,Is as a,ta as a0,Ds as a1,Sc as a2,mt as a3,Tt as a4,qi as a5,Ii as a6,ep as a7,pr as a8,Ri as a9,Vs as aa,Xe as ab,Ci as ac,ji as ad,nl as ae,zl as af,Pl as ag,Al as ah,Ll as ai,Ol as aj,Il as ak,Ms as b,j as c,A as d,Bs as e,Ke as f,Os as g,zi as h,Ec as i,bi as j,Pc as k,fs as l,gr as m,fc as n,gc as o,hc as p,vc as q,dt as r,ke as s,tp as t,F as u,Zt as v,Fi as w,Xt as x,Di as y,Kl as z};